From c4aa2ab642419e6751400a6aabaf5df611a4ea37 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 12 Jun 2024 16:38:57 +0200 Subject: [PATCH 001/130] Hide `tuplex` dependency and re-export by macro (#4774) Addressing comment: https://github.com/paritytech/polkadot-sdk/pull/4102/files#r1635502496 --------- Co-authored-by: Oliver Tale-Yazdi --- Cargo.lock | 2 -- .../src/extensions/check_obsolete_extension.rs | 10 ++++++++-- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 -- .../runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml | 2 -- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fba768c653c..13d658b5135 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2101,7 +2101,6 @@ dependencies = [ "static_assertions", "substrate-wasm-builder", "testnet-parachains-constants", - "tuplex", "xcm-fee-payment-runtime-api", ] @@ -2261,7 +2260,6 @@ dependencies = [ "static_assertions", "substrate-wasm-builder", "testnet-parachains-constants", - "tuplex", "westend-runtime-constants", "xcm-fee-payment-runtime-api", ] diff --git a/bridges/bin/runtime-common/src/extensions/check_obsolete_extension.rs b/bridges/bin/runtime-common/src/extensions/check_obsolete_extension.rs index 2c152aef682..df75092af6e 100644 --- a/bridges/bin/runtime-common/src/extensions/check_obsolete_extension.rs +++ b/bridges/bin/runtime-common/src/extensions/check_obsolete_extension.rs @@ -36,6 +36,12 @@ use sp_runtime::{ transaction_validity::{TransactionPriority, TransactionValidity, ValidTransactionBuilder}, }; +// Re-export to avoid include tuplex dependency everywhere. +#[doc(hidden)] +pub mod __private { + pub use tuplex; +} + /// A duplication of the `FilterCall` trait. /// /// We need this trait in order to be able to implement it for the messages pallet, @@ -313,7 +319,7 @@ macro_rules! generate_bridge_reject_obsolete_headers_and_messages { info: &sp_runtime::traits::DispatchInfoOf, len: usize, ) -> Result { - use tuplex::PushBack; + use $crate::extensions::check_obsolete_extension::__private::tuplex::PushBack; let to_post_dispatch = (); $( let (from_validate, call_filter_validity) = < @@ -336,7 +342,7 @@ macro_rules! generate_bridge_reject_obsolete_headers_and_messages { len: usize, result: &sp_runtime::DispatchResult, ) -> Result<(), sp_runtime::transaction_validity::TransactionValidityError> { - use tuplex::PopFront; + use $crate::extensions::check_obsolete_extension::__private::tuplex::PopFront; let Some((relayer, to_post_dispatch)) = to_post_dispatch else { return Ok(()) }; let has_failed = result.is_err(); $( diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 253a21f5d0b..5e8639eed36 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -22,7 +22,6 @@ scale-info = { version = "2.11.1", default-features = false, features = [ "derive", ] } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } -tuplex = { version = "0.1", default-features = false } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -218,7 +217,6 @@ std = [ "sp-version/std", "substrate-wasm-builder", "testnet-parachains-constants/std", - "tuplex/std", "xcm-builder/std", "xcm-executor/std", "xcm-fee-payment-runtime-api/std", diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml index 0f16d629fc2..ba8e4cdc814 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml @@ -18,7 +18,6 @@ hex-literal = { version = "0.4.1" } log = { workspace = true } scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } -tuplex = { version = "0.1", default-features = false } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -182,7 +181,6 @@ std = [ "sp-version/std", "substrate-wasm-builder", "testnet-parachains-constants/std", - "tuplex/std", "westend-runtime-constants/std", "xcm-builder/std", "xcm-executor/std", -- GitLab From eca1052ea1eddeede91da8f9f7452ea8b57e7942 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:36:22 +0800 Subject: [PATCH 002/130] Update the pallet guide in `sdk-docs` (#4735) After using this tutorial in PBA, there was a few areas to improve it. Moreover, I have: - Improve `your_first_pallet`, link it in README, improve the parent `guide` section. - Updated the templates page, in light of recent efforts related to in https://github.com/paritytech/polkadot-sdk/issues/3155 - Added small ref docs about metadata, completed the one about native runtime, added one about host functions. - Remove a lot of unfinished stuff from sdk-docs - update diagram for `Hooks` --- Cargo.lock | 5 + README.md | 11 +- docs/mermaid/IA.mmd | 4 +- docs/sdk/Cargo.toml | 16 ++- docs/sdk/src/guides/mod.rs | 25 ++-- docs/sdk/src/guides/your_first_pallet/mod.rs | 109 +++++++++++------- docs/sdk/src/guides/your_first_runtime.rs | 2 + docs/sdk/src/polkadot_sdk/templates.rs | 70 ++++++----- .../reference_docs/blockchain_scalibility.rs | 0 .../src/reference_docs/consensus_swapping.rs | 6 - .../reference_docs/custom_host_functions.rs | 27 +++++ .../src/reference_docs/fee_less_runtime.rs | 1 + .../reference_docs/frame_offchain_workers.rs | 1 - .../reference_docs/frame_system_accounts.rs | 2 + docs/sdk/src/reference_docs/light_nodes.rs | 7 -- docs/sdk/src/reference_docs/metadata.rs | 24 ++++ docs/sdk/src/reference_docs/mod.rs | 19 +-- docs/sdk/src/reference_docs/wasm_memory.rs | 7 -- .../src/reference_docs/wasm_meta_protocol.rs | 79 ++++++++++--- substrate/frame/support/src/traits/hooks.rs | 33 +++--- substrate/primitives/io/Cargo.toml | 11 +- substrate/primitives/io/src/lib.rs | 1 + templates/minimal/node/src/service.rs | 2 + 23 files changed, 302 insertions(+), 160 deletions(-) delete mode 100644 docs/sdk/src/reference_docs/blockchain_scalibility.rs delete mode 100644 docs/sdk/src/reference_docs/consensus_swapping.rs create mode 100644 docs/sdk/src/reference_docs/custom_host_functions.rs delete mode 100644 docs/sdk/src/reference_docs/light_nodes.rs delete mode 100644 docs/sdk/src/reference_docs/wasm_memory.rs diff --git a/Cargo.lock b/Cargo.lock index 13d658b5135..a8b08d28015 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14328,6 +14328,7 @@ dependencies = [ "frame-support", "frame-system", "kitchensink-runtime", + "minimal-template-runtime", "pallet-assets", "pallet-aura", "pallet-authorship", @@ -14350,6 +14351,7 @@ dependencies = [ "pallet-transaction-payment", "pallet-uniques", "pallet-utility", + "parachain-template-runtime", "parity-scale-codec", "polkadot-sdk", "polkadot-sdk-frame", @@ -14369,6 +14371,7 @@ dependencies = [ "sc-service", "scale-info", "simple-mermaid 0.1.1", + "solochain-template-runtime", "sp-api", "sp-arithmetic", "sp-core", @@ -14377,6 +14380,7 @@ dependencies = [ "sp-keyring", "sp-offchain", "sp-runtime", + "sp-runtime-interface 24.0.0", "sp-version", "staging-chain-spec-builder", "staging-node-cli", @@ -20007,6 +20011,7 @@ name = "sp-io" version = "30.0.0" dependencies = [ "bytes", + "docify", "ed25519-dalek 2.1.1", "libsecp256k1", "log", diff --git a/README.md b/README.md index 0b027b2958c..92901d070db 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,12 @@ forks](https://img.shields.io/github/forks/paritytech/polkadot-sdk) ## 📚 Documentation * [🦀 rust-docs](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/index.html) - * [Introduction](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/index.html) - to each component of the Polkadot SDK: Substrate, FRAME, Cumulus, and XCM + * [Introduction](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/index.html) + to each component of the Polkadot SDK: Substrate, FRAME, Cumulus, and XCM + * [Guides](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/guides/index.html), + namely how to build your first FRAME pallet. + * [Templates](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/templates/index.html) + for starting a new project. * Other Resources: * [Polkadot Wiki -> Build](https://wiki.polkadot.network/docs/build-guide) @@ -39,6 +43,9 @@ The Polkadot-SDK has two release channels: `stable` and `nightly`. Production so only use `stable`. `nightly` is meant for tinkerers to try out the latest features. The detailed release process is described in [RELEASE.md](docs/RELEASE.md). +You can use [`psvm`](https://github.com/paritytech/psvm) to manage your Polkadot-SDK dependency +versions in downstream projects. + ### 😌 Stable `stable` releases have a support duration of **three months**. In this period, the release will not diff --git a/docs/mermaid/IA.mmd b/docs/mermaid/IA.mmd index fe9a96bcafc..37417497e1f 100644 --- a/docs/mermaid/IA.mmd +++ b/docs/mermaid/IA.mmd @@ -1,6 +1,6 @@ flowchart parity[paritytech.github.io] --> devhub[polkadot_sdk_docs] - polkadot[polkadot.network] --> devhub[polkadot_sdk_docs] + polkadot_network[polkadot.network] --> devhub[polkadot_sdk_docs] devhub --> polkadot_sdk devhub --> reference_docs @@ -9,5 +9,5 @@ flowchart polkadot_sdk --> substrate polkadot_sdk --> frame polkadot_sdk --> cumulus - polkadot_sdk --> polkadot + polkadot_sdk --> polkadot[polkadot node] polkadot_sdk --> xcm diff --git a/docs/sdk/Cargo.toml b/docs/sdk/Cargo.toml index b0671623f48..10c09121167 100644 --- a/docs/sdk/Cargo.toml +++ b/docs/sdk/Cargo.toml @@ -83,27 +83,31 @@ pallet-democracy = { path = "../../substrate/frame/democracy" } pallet-uniques = { path = "../../substrate/frame/uniques" } pallet-nfts = { path = "../../substrate/frame/nfts" } pallet-scheduler = { path = "../../substrate/frame/scheduler" } +pallet-referenda = { path = "../../substrate/frame/referenda" } +pallet-broker = { path = "../../substrate/frame/broker" } +pallet-babe = { path = "../../substrate/frame/babe" } # Primitives sp-io = { path = "../../substrate/primitives/io" } +sp-runtime-interface = { path = "../../substrate/primitives/runtime-interface" } sp-api = { path = "../../substrate/primitives/api" } sp-core = { path = "../../substrate/primitives/core" } sp-keyring = { path = "../../substrate/primitives/keyring" } sp-runtime = { path = "../../substrate/primitives/runtime" } sp-arithmetic = { path = "../../substrate/primitives/arithmetic" } sp-genesis-builder = { path = "../../substrate/primitives/genesis-builder" } - -# Misc pallet dependencies -pallet-referenda = { path = "../../substrate/frame/referenda" } -pallet-broker = { path = "../../substrate/frame/broker" } -pallet-babe = { path = "../../substrate/frame/babe" } - sp-offchain = { path = "../../substrate/primitives/offchain" } sp-version = { path = "../../substrate/primitives/version" } + # XCM xcm = { package = "staging-xcm", path = "../../polkadot/xcm" } xcm-docs = { path = "../../polkadot/xcm/docs" } # runtime guides chain-spec-guide-runtime = { path = "./src/reference_docs/chain_spec_runtime" } + +# Templates +minimal-template-runtime = { path = "../../templates/minimal/runtime" } +solochain-template-runtime = { path = "../../templates/solochain/runtime" } +parachain-template-runtime = { path = "../../templates/parachain/runtime" } diff --git a/docs/sdk/src/guides/mod.rs b/docs/sdk/src/guides/mod.rs index f5f6d2b5e0c..485cdc30636 100644 --- a/docs/sdk/src/guides/mod.rs +++ b/docs/sdk/src/guides/mod.rs @@ -1,7 +1,16 @@ //! # Polkadot SDK Docs Guides //! -//! This crate contains a collection of guides that are foundational to the developers of -//! Polkadot SDK. They are common user-journeys that are traversed in the Polkadot ecosystem. +//! This crate contains a collection of guides that are foundational to the developers of Polkadot +//! SDK. They are common user-journeys that are traversed in the Polkadot ecosystem. +//! +//! 1. [`crate::guides::your_first_pallet`] is your starting point with Polkadot SDK. It contains +//! the basics of +//! building a simple crypto currency with FRAME. +//! 2. [`crate::guides::your_first_runtime`] is the next step in your journey. It contains the +//! basics of building a runtime that contains this pallet, plus a few common pallets from FRAME. +//! +//! +//! Other guides are related to other miscellaneous topics and are listed as modules below. /// Write your first simple pallet, learning the most most basic features of FRAME along the way. pub mod your_first_pallet; @@ -11,18 +20,18 @@ pub mod your_first_pallet; pub mod your_first_runtime; /// Running the given runtime with a node. No specific consensus mechanism is used at this stage. -pub mod your_first_node; - -/// How to change the consensus engine of both the node and the runtime. -pub mod changing_consensus; +// TODO +// pub mod your_first_node; /// How to enhance a given runtime and node to be cumulus-enabled, run it as a parachain and connect /// it to a relay-chain. -pub mod cumulus_enabled_parachain; +// TODO +// pub mod cumulus_enabled_parachain; /// How to make a given runtime XCM-enabled, capable of sending messages (`Transact`) between itself /// and the relay chain to which it is connected. -pub mod xcm_enabled_parachain; +// TODO +// pub mod xcm_enabled_parachain; /// How to enable storage weight reclaiming in a parachain node and runtime. pub mod enable_pov_reclaim; diff --git a/docs/sdk/src/guides/your_first_pallet/mod.rs b/docs/sdk/src/guides/your_first_pallet/mod.rs index c6e0dd0edf8..0a22b13df81 100644 --- a/docs/sdk/src/guides/your_first_pallet/mod.rs +++ b/docs/sdk/src/guides/your_first_pallet/mod.rs @@ -14,18 +14,14 @@ //! > FRAME-based runtimes use various techniques to re-use a currency pallet instead of writing //! > one. Further advanced FRAME related topics are discussed in [`crate::reference_docs`]. //! -//! ## Topics Covered +//! ## Writing Your First Pallet //! -//! The following FRAME topics are covered in this guide: +//! To get started, use one of the templates mentioned in [`crate::polkadot_sdk::templates`]. We +//! recommend using the `polkadot-sdk-minimal-template`. You might need to change small parts of +//! this guide, namely the crate/package names, based on which tutorial you use. //! -//! - [Storage](frame::pallet_macros::storage) -//! - [Call](frame::pallet_macros::call) -//! - [Event](frame::pallet_macros::event) -//! - [Error](frame::pallet_macros::error) -//! - Basics of testing a pallet -//! - [Constructing a runtime](frame::runtime::prelude::construct_runtime) -//! -//! ## Writing Your First Pallet +//! > Be aware that you can read the entire source code backing this tutorial by clicking on the +//! > [`source`](./mod.rs.html) button at the top right of the page. //! //! You should have studied the following modules as a prelude to this guide: //! @@ -33,16 +29,28 @@ //! - [`crate::reference_docs::trait_based_programming`] //! - [`crate::polkadot_sdk::frame_runtime`] //! +//! ## Topics Covered +//! +//! The following FRAME topics are covered in this guide: +//! +//! - [`pallet::storage`] +//! - [`pallet::call`] +//! - [`pallet::event`] +//! - [`pallet::error`] +//! - Basics of testing a pallet +//! - [Constructing a runtime](frame::runtime::prelude::construct_runtime) +//! //! ### Shell Pallet //! //! Consider the following as a "shell pallet". We continue building the rest of this pallet based //! on this template. //! -//! [`pallet::config`](frame::pallet_macros::config) and -//! [`pallet::pallet`](frame::pallet_macros::pallet) are both mandatory parts of any pallet. Refer -//! to the documentation of each to get an overview of what they do. +//! [`pallet::config`] and [`pallet::pallet`] are both mandatory parts of any pallet. Refer to the +//! documentation of each to get an overview of what they do. #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", shell_pallet)] //! +//! All of the code that follows in this guide should live inside of the `mod pallet`. +//! //! ### Storage //! //! First, we will need to create two onchain storage declarations. @@ -55,15 +63,14 @@ //! > generic bounded type in the `Config` trait, and then specify it in the implementation. #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", Balance)] //! -//! The definition of these two storage items, based on [`frame::pallet_macros::storage`] details, -//! is as follows: +//! The definition of these two storage items, based on [`pallet::storage`] details, is as follows: #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", TotalIssuance)] #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", Balances)] //! //! ### Dispatchables //! -//! Next, we will define the dispatchable functions. As per [`frame::pallet_macros::call`], these -//! will be defined as normal `fn`s attached to `struct Pallet`. +//! Next, we will define the dispatchable functions. As per [`pallet::call`], these will be defined +//! as normal `fn`s attached to `struct Pallet`. #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", impl_pallet)] //! //! The logic of the functions is self-explanatory. Instead, we will focus on the FRAME-related @@ -79,7 +86,6 @@ //! was signed by `who`. #![doc = docify::embed!("../../substrate/frame/system/src/lib.rs", ensure_signed)] //! -//! //! - Where does `mutate`, `get` and `insert` and other storage APIs come from? All of them are //! explained in the corresponding `type`, for example, for `Balances::::insert`, you can look //! into [`frame::prelude::StorageMap::insert`]. @@ -95,8 +101,7 @@ //! //! - Why are all `get` and `mutate` functions returning an `Option`? This is the default behavior //! of FRAME storage APIs. You can learn more about how to override this by looking into -//! [`frame::pallet_macros::storage`], and -//! [`frame::prelude::ValueQuery`]/[`frame::prelude::OptionQuery`] +//! [`pallet::storage`], and [`frame::prelude::ValueQuery`]/[`frame::prelude::OptionQuery`] //! //! ### Improving Errors //! @@ -116,6 +121,25 @@ //! //! ### Your First (Test) Runtime //! +//! The typical testing code of a pallet lives in a module that imports some preludes useful for +//! testing, similar to: +//! +//! ``` +//! pub mod pallet { +//! // snip -- actually pallet code. +//! } +//! +//! #[cfg(test)] +//! mod tests { +//! // bring in the testing prelude of frame +//! use frame::testing_prelude::*; +//! // bring in all pallet items +//! use super::pallet::*; +//! +//! // snip -- rest of the testing code. +//! } +//! ``` +//! //! Next, we create a "test runtime" in order to test our pallet. Recall from //! [`crate::polkadot_sdk::frame_runtime`] that a runtime is a collection of pallets, expressed //! through [`frame::runtime::prelude::construct_runtime`]. All runtimes also have to include @@ -166,7 +190,6 @@ //! As noted above, the `T::AccountId` is now `u64`. Moreover, `Runtime` is replacing ``. //! This is why for example you see `Balances::::get(..)`. Finally, notice that the //! dispatchables are simply functions that can be called on top of the `Pallet` struct. -// TODO: hard to explain exactly `RuntimeOrigin::signed(ALICE)` at this point. //! //! Congratulations! You have written your first pallet and tested it! Next, we learn a few optional //! steps to improve our pallet. @@ -236,8 +259,7 @@ //! by one character. FRAME errors are exactly a solution to maintain readability, whilst fixing //! the drawbacks mentioned. In short, we use an enum to represent different variants of our //! error. These variants are then mapped in an efficient way (using only `u8` indices) to -//! [`sp_runtime::DispatchError::Module`]. Read more about this in -//! [`frame::pallet_macros::error`]. +//! [`sp_runtime::DispatchError::Module`]. Read more about this in [`pallet::error`]. //! //! - **Event**: Events are akin to the return type of dispatchables. They are mostly data blobs //! emitted by the runtime to let outside world know what is happening inside the pallet. Since @@ -246,20 +268,16 @@ //! use passive tense for event names (eg. `SomethingHappened`). This allows other sub-systems or //! external parties (eg. a light-node, a DApp) to listen to particular events happening, without //! needing to re-execute the whole state transition function. -// TODO: both need to be improved a lot at the pallet-macro rust-doc level. Also my explanation -// of event is probably not the best. //! //! With the explanation out of the way, let's see how these components can be added. Both follow a -//! fairly familiar syntax: normal Rust enums, with extra -//! [`#[frame::event]`](frame::pallet_macros::event) and -//! [`#[frame::error]`](frame::pallet_macros::error) attributes attached. +//! fairly familiar syntax: normal Rust enums, with extra [`pallet::event`] and [`pallet::error`] +//! attributes attached. #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", Event)] #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", Error)] //! -//! One slightly custom part of this is the [`#[pallet::generate_deposit(pub(super) fn -//! deposit_event)]`](frame::pallet_macros::generate_deposit) part. Without going into too -//! much detail, in order for a pallet to emit events to the rest of the system, it needs to do two -//! things: +//! One slightly custom part of this is the [`pallet::generate_deposit`] part. Without going into +//! too much detail, in order for a pallet to emit events to the rest of the system, it needs to do +//! two things: //! //! 1. Declare a type in its `Config` that refers to the overarching event type of the runtime. In //! short, by doing this, the pallet is expressing an important bound: `type RuntimeEvent: @@ -268,8 +286,8 @@ //! store it where needed. //! //! 2. But, doing this conversion and storing is too much to expect each pallet to define. FRAME -//! provides a default way of storing events, and this is what -//! [`pallet::generate_deposit`](frame::pallet_macros::generate_deposit) is doing. +//! provides a default way of storing events, and this is what [`pallet::generate_deposit`] is +//! doing. #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", config_v2)] //! //! > These `Runtime*` types are better explained in @@ -297,10 +315,17 @@ //! - [`crate::reference_docs::defensive_programming`]. //! - [`crate::reference_docs::frame_origin`]. //! - [`crate::reference_docs::frame_runtime_types`]. -//! - The pallet we wrote in this guide was using `dev_mode`, learn more in -//! [`frame::pallet_macros::config`]. +//! - The pallet we wrote in this guide was using `dev_mode`, learn more in [`pallet::config`]. //! - Learn more about the individual pallet items/macros, such as event and errors and call, in //! [`frame::pallet_macros`]. +//! +//! [`pallet::storage`]: ../../../frame_support/pallet_macros/attr.config.html +//! [`pallet::call`]: ../../../frame_support/pallet_macros/attr.call.html +//! [`pallet::event`]: ../../../frame_support/pallet_macros/attr.event.html +//! [`pallet::error`]: ../../../frame_support/pallet_macros/attr.error.html +//! [`pallet::pallet`]: ../../../frame_support/pallet_macros/attr.pallet.html +//! [`pallet::config`]: ../../../frame_support/pallet_macros/attr.config.html +//! [`pallet::generate_deposit`]: ../../../frame_support/pallet_macros/attr.generate_deposit.html #[docify::export] #[frame::pallet(dev_mode)] @@ -418,16 +443,22 @@ pub mod pallet { #[cfg(any(test, doc))] pub(crate) mod tests { use crate::guides::your_first_pallet::pallet::*; + + #[docify::export(testing_prelude)] use frame::testing_prelude::*; - const ALICE: u64 = 1; - const BOB: u64 = 2; - const CHARLIE: u64 = 3; + + pub(crate) const ALICE: u64 = 1; + pub(crate) const BOB: u64 = 2; + pub(crate) const CHARLIE: u64 = 3; #[docify::export] + // This runtime is only used for testing, so it should be somewhere like `#[cfg(test)] mod + // tests { .. }` mod runtime { use super::*; // we need to reference our `mod pallet` as an identifier to pass to // `construct_runtime`. + // YOU HAVE TO CHANGE THIS LINE BASED ON YOUR TEMPLATE use crate::guides::your_first_pallet::pallet as pallet_currency; construct_runtime!( diff --git a/docs/sdk/src/guides/your_first_runtime.rs b/docs/sdk/src/guides/your_first_runtime.rs index 3e02ef1b1b2..c58abc1120c 100644 --- a/docs/sdk/src/guides/your_first_runtime.rs +++ b/docs/sdk/src/guides/your_first_runtime.rs @@ -1 +1,3 @@ //! # Your first Runtime +//! +//! 🚧 diff --git a/docs/sdk/src/polkadot_sdk/templates.rs b/docs/sdk/src/polkadot_sdk/templates.rs index 4bf0e839c79..e87eb9c2bc8 100644 --- a/docs/sdk/src/polkadot_sdk/templates.rs +++ b/docs/sdk/src/polkadot_sdk/templates.rs @@ -1,19 +1,33 @@ //! # Templates //! -//! ### Internal +//! This document enumerates a non-exhaustive list of templates that one can use to get started with +//! polkadot-sdk. //! -//! The following templates are maintained as a part of the `polkadot-sdk` repository: +//! > Know more tools/templates that are not listed here? please contribute them by opening a PR. //! -//! - classic [`substrate-node-template`]: is a white-labeled substrate-based blockchain with a -//! moderate amount of features. It can act as a great starting point for those who want to learn -//! Substrate/FRAME and want to have a template that is already doing something. -//! - [`substrate-minimal-template`]: Same as the above, but it contains the least amount of code in -//! both the node and runtime. It is a great starting point for those who want to deeply learn -//! Substrate and FRAME. -//! - classic [`cumulus-parachain-template`], which is the de-facto parachain template shipped with -//! Cumulus. It is the parachain-enabled version of [`substrate-node-template`]. +//! ## Internal //! -//! ### External Templates +//! The following [templates](https://github.com/paritytech/polkadot-sdk/blob/master/templates) are +//! maintained as a part of the `polkadot-sdk` repository: +//! +//! - `minimal_template_node`/[`minimal_template_runtime`]: A minimal template that contains the +//! least amount of features to be a functioning blockchain. Suitable for learning, development +//! and testing. This template is not meant to be used in production. +//! - `solochain_template_node`/[`solochain_template_runtime`]: Formerly known as +//! "substrate-node-template", is a white-labeled substrate-based blockchain (aka. solochain) that +//! contains moderate features, such as a basic consensus engine and some FRAME pallets. This +//! template can act as a good starting point for those who want to launch a solochain. +//! - `parachain_template_node`/[`parachain_template_runtime`]: A parachain template ready to be +//! connected to a test relay-chain. +//! +//! These templates are always kept up to date, and are mirrored to external repositories for easy +//! forking: +//! +//! - +//! - +//! - +//! +//! ## External Templates //! //! Noteworthy templates outside of this repository. //! @@ -22,23 +36,17 @@ //! - [`frontier-parachain-template`](https://github.com/paritytech/frontier-parachain-template): A //! parachain template for launching EVM-compatible parachains. //! -//! [`minimal-template`]: https://github.com/paritytech/polkadot-sdk/blob/master/templates/minimal/ -//! [`parachain-template`]: https://github.com/paritytech/polkadot-sdk/blob/master/templates/parachain/ - -// TODO: in general, we need to make a deliberate choice here of moving a few key templates to this -// repo (nothing stays in `substrate-developer-hub`) and the everything else should be community -// maintained. https://github.com/paritytech/polkadot-sdk-docs/issues/67 - -// TODO: we should rename `substrate-node-template` to `substrate-basic-template`, -// `substrate-blockchain-template`. `node` is confusing in the name. -// `substrate-blockchain-template` and `cumulus-parachain-template` go well together 🤝. https://github.com/paritytech/polkadot-sdk-docs/issues/67 - -// NOTE: a super important detail that I am looking forward to here is -// and -// . Meaning that I would not spend time on -// teaching someone too much detail about the ugly thing we call "node" nowadays. In the future, I -// am sure we will either have a better "node-builder" code that can actually be tested, or an -// "omni-node" that can run (almost) any wasm file. We should already build tutorials in this -// direction IMO. This also affects all the templates. If we have a good neat runtime file, which we -// are moving toward, and a good node-builder, we don't need all of these damn templates. These -// templates are only there because the boilerplate is super horrible atm. +//! ## OpenZeppelin +//! +//! In June 2023, OpenZeppelin was awarded a grant from the [Polkadot +//! treasury](https://polkadot.polkassembly.io/treasury/406) for building a number of Polkadot-sdk +//! based templates. These templates are expected to be a great starting point for developers. +//! +//! - +//! +//! ## POP-CLI +//! +//! Is a CLI tool capable of scaffolding a new polkadot-sdk-based project, possibly removing the +//! need for templates. +//! +//! - diff --git a/docs/sdk/src/reference_docs/blockchain_scalibility.rs b/docs/sdk/src/reference_docs/blockchain_scalibility.rs deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/docs/sdk/src/reference_docs/consensus_swapping.rs b/docs/sdk/src/reference_docs/consensus_swapping.rs deleted file mode 100644 index e639761ee97..00000000000 --- a/docs/sdk/src/reference_docs/consensus_swapping.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! Consensus Swapping -//! -//! Notes: -//! -//! - The typical workshop done by Joshy in some places where he swaps out the consensus to be PoW. -//! - This could also be a tutorial rather than a ref doc, depending on the size. diff --git a/docs/sdk/src/reference_docs/custom_host_functions.rs b/docs/sdk/src/reference_docs/custom_host_functions.rs new file mode 100644 index 00000000000..719b208a2bf --- /dev/null +++ b/docs/sdk/src/reference_docs/custom_host_functions.rs @@ -0,0 +1,27 @@ +//! # Custom Host Functions +//! +//! Host functions are functions that the wasm instance can use to communicate with the node. Learn +//! more about this in [`crate::reference_docs::wasm_meta_protocol`]. +//! +//! ## Finding Host Functions +//! +//! To declare a set of functions as host functions, you need to use the `#[runtime_interface]` +//! ([`sp_runtime_interface`]) attribute macro. The most notable set of host functions are those +//! that allow the runtime to access the chain state, namely [`sp_io::storage`]. Some other notable +//! host functions are also defined in [`sp_io`]. +//! +//! ## Adding New Host Functions +//! +//! > Adding a new host function is a big commitment and should be done with care. Namely, the nodes +//! > in the network need to support all host functions forever in order to be able to sync +//! > historical blocks. +//! +//! Adding host functions is only possible when you are using a node-template, so that you have +//! access to the boilerplate of building your node. +//! +//! A group of host functions can always be grouped to gether as a tuple: +#![doc = docify::embed!("../../substrate/primitives/io/src/lib.rs", SubstrateHostFunctions)] +//! +//! The host functions are attached to the node side's [`sc_executor::WasmExecutor`]. For example in +//! the minimal template, the setup looks as follows: +#![doc = docify::embed!("../../templates/minimal/node/src/service.rs", FullClient)] diff --git a/docs/sdk/src/reference_docs/fee_less_runtime.rs b/docs/sdk/src/reference_docs/fee_less_runtime.rs index 1213c262825..9146b30ec57 100644 --- a/docs/sdk/src/reference_docs/fee_less_runtime.rs +++ b/docs/sdk/src/reference_docs/fee_less_runtime.rs @@ -1,5 +1,6 @@ //! # Fee-Less Runtime //! +//! 🚧 Work In Progress 🚧 //! //! Notes: //! diff --git a/docs/sdk/src/reference_docs/frame_offchain_workers.rs b/docs/sdk/src/reference_docs/frame_offchain_workers.rs index 7999707e5ee..1ec9212e230 100644 --- a/docs/sdk/src/reference_docs/frame_offchain_workers.rs +++ b/docs/sdk/src/reference_docs/frame_offchain_workers.rs @@ -58,7 +58,6 @@ //! [`frame::pallet_macros::hooks`]. //! //! ``` -//! //! #[frame::pallet] //! pub mod pallet { //! use frame::prelude::*; diff --git a/docs/sdk/src/reference_docs/frame_system_accounts.rs b/docs/sdk/src/reference_docs/frame_system_accounts.rs index ae9d2c9e0cb..523fe704308 100644 --- a/docs/sdk/src/reference_docs/frame_system_accounts.rs +++ b/docs/sdk/src/reference_docs/frame_system_accounts.rs @@ -1,5 +1,7 @@ //! # FRAME Accounts //! +//! //! 🚧 Work In Progress 🚧 +//! //! How `frame_system` handles accountIds. Nonce. Consumers and Providers, reference counting. // - poorly understood topics, needs one great article to rul them all. diff --git a/docs/sdk/src/reference_docs/light_nodes.rs b/docs/sdk/src/reference_docs/light_nodes.rs deleted file mode 100644 index d6670bf03ab..00000000000 --- a/docs/sdk/src/reference_docs/light_nodes.rs +++ /dev/null @@ -1,7 +0,0 @@ -//! # Light Clients -//! -//! -//! Notes: should contain only high level information about light clients, then link to how to set -//! it up in PAPI and SubXT -//! -//! diff --git a/docs/sdk/src/reference_docs/metadata.rs b/docs/sdk/src/reference_docs/metadata.rs index 702c1c30fd9..96f92ac0c41 100644 --- a/docs/sdk/src/reference_docs/metadata.rs +++ b/docs/sdk/src/reference_docs/metadata.rs @@ -1 +1,25 @@ //! # Metadata +//! +//! The existence of metadata in polkadot-sdk goes back to the (forkless) upgrade-ability of all +//! Substrate-based blockchains, which is achieved through +//! [`crate::reference_docs::wasm_meta_protocol`]. You can learn more about the details of how to +//! deal with these upgrades in [`crate::reference_docs::frame_runtime_upgrades_and_migrations`]. +//! +//! Another consequence of upgrade-ability is that as a UI, wallet, or generally an offchain entity, +//! it is hard to know the types internal to the runtime, specifically in light of the fact that +//! they can change at any point in time. +//! +//! This is why all Substrate-based runtimes must expose a [`sp_api::Metadata`] api, which mandates +//! the runtime to return a description of itself. The return type of this api is `Vec`, meaning +//! that it is up to the runtime developer to decide on the format of this. +//! +//! All [`crate::polkadot_sdk::frame_runtime`] based runtimes expose a specific metadata language, +//! maintained in which is adopted in the Polkadot +//! ecosystem. +//! +//! ## Metadata Explorers: +//! +//! A few noteworthy tools that inspect the (FRAME-based) metadata of a chain: +//! +//! +//! diff --git a/docs/sdk/src/reference_docs/mod.rs b/docs/sdk/src/reference_docs/mod.rs index 8e0431c48b6..51150a55837 100644 --- a/docs/sdk/src/reference_docs/mod.rs +++ b/docs/sdk/src/reference_docs/mod.rs @@ -40,7 +40,6 @@ pub mod runtime_vs_smart_contract; pub mod extrinsic_encoding; /// Learn about the signed extensions that form a part of extrinsics. -// TODO: @jsdw https://github.com/paritytech/polkadot-sdk-docs/issues/42 pub mod signed_extensions; /// Learn about *Origins*, a topic in FRAME that enables complex account abstractions to be built. @@ -59,9 +58,11 @@ pub mod fee_less_runtime; /// Learn about metadata, the main means through which an upgradeable runtime communicates its /// properties to the outside world. -// TODO: @jsdw https://github.com/paritytech/polkadot-sdk-docs/issues/47 pub mod metadata; +/// Learn about how to add custom host functions to the node. +pub mod custom_host_functions; + /// Learn about how frame-system handles `account-ids`, nonces, consumers and providers. pub mod frame_system_accounts; @@ -78,26 +79,12 @@ pub mod frame_tokens; /// Learn about chain specification file and the genesis state of the blockchain. pub mod chain_spec_genesis; -/// Learn about all the memory limitations of the WASM runtime when it comes to memory usage. -// TODO: @kianenigma https://github.com/paritytech/polkadot-sdk-docs/issues/52 -pub mod wasm_memory; - /// Learn about Substrate's CLI, and how it can be extended. -// TODO: @kianenigma https://github.com/paritytech/polkadot-sdk-docs/issues/53 pub mod cli; -/// Learn about Substrate's consensus algorithms, and how you can switch between two. -// TODO: @JoshOrndorff @kianenigma https://github.com/paritytech/polkadot-sdk-docs/issues/54 -pub mod consensus_swapping; - /// Learn about Runtime Upgrades and best practices for writing Migrations. pub mod frame_runtime_upgrades_and_migrations; -/// Learn about light nodes, how they function, and how Substrate-based chains come -/// light-node-first out of the box. -// TODO: @jsdw @josepot https://github.com/paritytech/polkadot-sdk-docs/issues/68 -pub mod light_nodes; - /// Learn about the offchain workers, how they function, and how to use them, as provided by the /// [`frame`] APIs. pub mod frame_offchain_workers; diff --git a/docs/sdk/src/reference_docs/wasm_memory.rs b/docs/sdk/src/reference_docs/wasm_memory.rs deleted file mode 100644 index 4f4cda31094..00000000000 --- a/docs/sdk/src/reference_docs/wasm_memory.rs +++ /dev/null @@ -1,7 +0,0 @@ -//! # WASM Memory Limitations. -//! -//! Notes: -//! -//! - Stack: Need to use `Box<_>` -//! - Heap: Substrate imposes a limit. PvF execution has its own limits -//! - Heap: There is also a maximum amount that a single allocation can have. diff --git a/docs/sdk/src/reference_docs/wasm_meta_protocol.rs b/docs/sdk/src/reference_docs/wasm_meta_protocol.rs index 37d1460f0e1..0e91e65c55e 100644 --- a/docs/sdk/src/reference_docs/wasm_meta_protocol.rs +++ b/docs/sdk/src/reference_docs/wasm_meta_protocol.rs @@ -1,11 +1,13 @@ //! # WASM Meta Protocol //! //! All Substrate based chains adhere to a unique architectural design novel to the Polkadot -//! ecosystem. We refer to this design as the "WASM Meta Protocol". +//! ecosystem. We refer to this design as the "**WASM Meta Protocol**". //! //! Consider the fact that a traditional blockchain software is usually a monolithic artifact. -//! Upgrading any part of the system implies upgrading the entire system. This has historically led -//! to cumbersome forkful upgrades to be the status quo in the blockchain ecosystem. +//! **Upgrading any part of the system implies upgrading the entire system**. This has historically +//! led to cumbersome forkful upgrades to be the status quo in blockchain ecosystems. In other +//! words, the entire node software is the specification of the blockchain's [`state transition +//! function`](crate::reference_docs::blockchain_state_machines). //! //! Moreover, the idea of "storing code in the state" is explored in the context of smart contracts //! platforms, but has not been expanded further. @@ -15,17 +17,16 @@ //! that a smart contract platform stores the code of individual contracts in its state. As noted in //! [`crate::reference_docs::blockchain_state_machines`], this state transition function is called //! the **Runtime**, and WASM is chosen as the bytecode. The Runtime is stored under a special key -//! in the state (see -//! [`sp_core::storage::well_known_keys`](../../../sp_core/index.html)) and can be -//! updated as a part of the state transition function's execution, just like a user's account -//! balance can be updated. +//! in the state (see [`sp_core::storage::well_known_keys`]) and can be updated as a part of the +//! state transition function's execution, just like a user's account balance can be updated. //! //! > Note that while we drew an analogy between smart contracts and runtimes in the above, there //! > are fundamental differences between the two, explained in //! > [`crate::reference_docs::runtime_vs_smart_contract`]. //! -//! The rest of the system that is NOT the state transition function is called the **node**, and -//! is a normal binary that is compiled from Rust to different hardware targets. +//! The rest of the system that is NOT the state transition function is called the +//! [**Node**](crate::reference_docs::glossary#node), and is a normal binary that is compiled from +//! Rust to different hardware targets. //! //! This design enables all Substrate-based chains to be fork-less-ly upgradeable, because the //! Runtime can be updates on the fly, within the execution of a block, and the node is (for the @@ -47,15 +48,18 @@ #![doc = simple_mermaid::mermaid!("../../../mermaid/substrate_client_runtime.mmd")] //! //! A runtime must have a set of runtime APIs in order to have any meaningful blockchain -//! functionality, but it can also expose more APIs. See TODO as an example of how to add custom -//! runtime APIs to your FRAME-based runtime. +//! functionality, but it can also expose more APIs. See +//! [`crate::reference_docs::custom_runtime_api_rpc`] as an example of how to add custom runtime +//! APIs to your FRAME-based runtime. //! //! Similarly, for a runtime to be "compatible" with a node, the node must implement the full set of //! host functions that the runtime at any point in time requires. Given the fact that a runtime can //! evolve in time, and a blockchain node (typically) wishes to be capable of re-executing all the //! previous blocks, this means that a node must always maintain support for the old host functions. -//! This also implies that adding a new host function is a big commitment and should be done with -//! care. This is why, for example, adding a new host function to Polkadot always requires an RFC. +//! **This implies that adding a new host function is a big commitment and should be done with +//! care**. This is why, for example, adding a new host function to Polkadot always requires an RFC. +//! Learn how to add a new host function to your runtime in +//! [`crate::reference_docs::custom_host_functions`]. //! //! ## Node vs. Runtime //! @@ -90,11 +94,11 @@ //! //! In fact, [`sp_core::storage::well_known_keys`] are the only state keys that the node side is //! aware of. The rest of the state, including what logic the runtime has, what balance each user -//! has and such are all only comprehensible to the runtime. +//! has and such, are all only comprehensible to the runtime. #![doc = simple_mermaid::mermaid!("../../../mermaid/state.mmd")] //! //! In the above diagram, all of the state keys and values are opaque bytes to the node. The node -//! does not know what they mean, and it does not now what is the type of the corresponding value +//! does not know what they mean, and it does not know what is the type of the corresponding value //! (e.g. if it is a number of a vector). Contrary, the runtime knows both the meaning of their //! keys, and the type of the values. //! @@ -105,9 +109,50 @@ //! //! ## Native Runtime //! -//! TODO +//! Historically, the node software also kept a native copy of the runtime at the time of +//! compilation within it. This used to be called the "Native Runtime". The main purpose of the +//! native runtime used to be leveraging the faster execution time and better debugging +//! infrastructure of native code. However, neither of the two arguments strongly hold and the +//! native runtime is being fully removed from the node-sdk. //! +//! See: +//! +//! > Also, note that the flags [`sc_cli::ExecutionStrategy::Native`] is already a noop and all +//! > chains built with Substrate only use WASM execution. +//! +//! ### Runtime Versions +//! +//! An important detail of the native execution worth learning about is that the node software, +//! obviously, only uses the native runtime if it is the same code as with the wasm blob stored +//! onchain. Else, nodes who run the native runtime will come to a different state transition. How +//! do nodes determine if two runtimes are the same? Through the very important +//! [`sp_version::RuntimeVersion`]. All runtimes expose their version via a runtime api +//! ([`sp_api::Core::version`]) that returns this struct. The node software, or other applications, +//! inspect this struct to examine the identity of a runtime, and to determine if two runtimes are +//! the same. Namely, [`sp_version::RuntimeVersion::spec_version`] is the main key that implies two +//! runtimes are the same. +//! +//! Therefore, it is utmost important to make sure before any runtime upgrade, the spec version is +//! updated. //! //! ## Example: Block Execution. //! -//! TODO +//! As a final example to recap, let's look at how Substrate-based nodes execute blocks. Blocks are +//! received in the node side software as opaque blobs and in the networking layer. +//! +//! At some point, based on the consensus algorithm's rules, the node decides to import (aka. +//! *validate*) a block. +//! +//! * First, the node will then fetch the state of the parent hash of the block that wishes to be +//! imported. +//! * The runtime is fetched from this state, and placed into a WASM execution environment. +//! * The [`sp_api::Core::execute_block`] runtime API is called and the blocked is passed in as an +//! argument. +//! * The runtime will then execute the block, and update the state accordingly. Any state update is +//! issues via the [`sp_io::storage`] host functions. +//! * Both the runtime and node will check the state-root of the state after the block execution to +//! match the one claimed in the block header. +//! +//! > Example taken from [this +//! > lecture](https://polkadot-blockchain-academy.github.io/pba-book/substrate/wasm/page.html#example-2-block-import-9) +//! > of the Polkadot Blockchain Academy. diff --git a/substrate/frame/support/src/traits/hooks.rs b/substrate/frame/support/src/traits/hooks.rs index ccccc506328..1a687cade79 100644 --- a/substrate/frame/support/src/traits/hooks.rs +++ b/substrate/frame/support/src/traits/hooks.rs @@ -351,6 +351,7 @@ pub trait IntegrityTest { /// - [`crate::traits::misc::OffchainWorker`] /// - [`OnIdle`] /// - [`IntegrityTest`] +/// - [`OnPoll`] /// /// ## Ordering /// @@ -363,34 +364,32 @@ pub trait IntegrityTest { /// /// ```mermaid /// graph LR -/// Optional --> BeforeExtrinsics -/// BeforeExtrinsics --> Extrinsics -/// Extrinsics --> AfterExtrinsics -/// subgraph Optional +/// Optional --> Mandatory +/// Mandatory --> ExtrinsicsMandatory +/// ExtrinsicsMandatory --> Poll +/// Poll --> Extrinsics +/// Extrinsics --> AfterMandatory +/// AfterMandatory --> onIdle +/// +/// subgraph Optional /// OnRuntimeUpgrade /// end /// -/// subgraph BeforeExtrinsics +/// subgraph Mandatory /// OnInitialize /// end /// +/// subgraph ExtrinsicsMandatory +/// Inherent1 --> Inherent2 +/// end +/// /// subgraph Extrinsics /// direction TB -/// Inherent1 -/// Inherent2 -/// Extrinsic1 -/// Extrinsic2 -/// -/// Inherent1 --> Inherent2 -/// Inherent2 --> Extrinsic1 /// Extrinsic1 --> Extrinsic2 /// end /// -/// subgraph AfterExtrinsics -/// OnIdle +/// subgraph AfterMandatory /// OnFinalize -/// -/// OnIdle --> OnFinalize /// end /// ``` /// @@ -466,6 +465,8 @@ pub trait Hooks { /// /// Is not guaranteed to execute in a block and should therefore only be used in no-deadline /// scenarios. + /// + /// This is the non-mandatory version of [`Hooks::on_initialize`]. fn on_poll(_n: BlockNumber, _weight: &mut WeightMeter) {} /// Hook executed when a code change (aka. a "runtime upgrade") is detected by the FRAME diff --git a/substrate/primitives/io/Cargo.toml b/substrate/primitives/io/Cargo.toml index abb16d163da..f6e157680f9 100644 --- a/substrate/primitives/io/Cargo.toml +++ b/substrate/primitives/io/Cargo.toml @@ -19,7 +19,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] bytes = { version = "1.1.0", default-features = false } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["bytes"] } +codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ + "bytes", +] } sp-core = { path = "../core", default-features = false } sp-crypto-hashing = { path = "../crypto/hashing", default-features = false } sp-keystore = { path = "../keystore", default-features = false, optional = true } @@ -31,13 +33,18 @@ sp-trie = { path = "../trie", default-features = false, optional = true } sp-externalities = { path = "../externalities", default-features = false } sp-tracing = { path = "../tracing", default-features = false } log = { optional = true, workspace = true, default-features = true } -secp256k1 = { version = "0.28.0", features = ["global-context", "recovery"], optional = true } +secp256k1 = { version = "0.28.0", features = [ + "global-context", + "recovery", +], optional = true } tracing = { version = "0.1.29", default-features = false } tracing-core = { version = "0.1.32", default-features = false } # Required for backwards compatibility reason, but only used for verifying when `UseDalekExt` is set. ed25519-dalek = { version = "2.1", default-features = false, optional = true } +docify = { version = "0.2.8" } + [target.'cfg(all(any(target_arch = "riscv32", target_arch = "riscv64"), substrate_runtime))'.dependencies] polkavm-derive = { workspace = true } diff --git a/substrate/primitives/io/src/lib.rs b/substrate/primitives/io/src/lib.rs index 8ef1f41ce01..67e822ba7e2 100644 --- a/substrate/primitives/io/src/lib.rs +++ b/substrate/primitives/io/src/lib.rs @@ -1805,6 +1805,7 @@ pub type TestExternalities = sp_state_machine::TestExternalities>; + type FullBackend = sc_service::TFullBackend; type FullSelectChain = sc_consensus::LongestChain; -- GitLab From 988103d7578ad515b13c69578da1237b28fa9f36 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 13 Jun 2024 10:44:05 +0200 Subject: [PATCH 003/130] Use aggregated types for `RuntimeFreezeReason` and better examples of `MaxFreezes` (#4615) This PR aligns the settings for `MaxFreezes`, `RuntimeFreezeReason`, and `FreezeIdentifier`. #### Future work and improvements https://github.com/paritytech/polkadot-sdk/issues/2997 (remove `MaxFreezes` and `FreezeIdentifier`) --- bridges/modules/messages/src/mock.rs | 1 - .../pallets/inbound-queue/src/mock.rs | 11 +------- bridges/snowbridge/pallets/system/src/mock.rs | 11 +------- .../pallets/collator-selection/src/mock.rs | 13 +--------- cumulus/pallets/xcmp-queue/src/mock.rs | 13 +--------- cumulus/parachains/common/src/impls.rs | 16 ++---------- .../runtime/common/src/assigned_slots/mod.rs | 17 +----------- polkadot/runtime/common/src/auctions.rs | 26 +++++-------------- polkadot/runtime/common/src/claims.rs | 19 ++------------ polkadot/runtime/common/src/crowdloan/mod.rs | 24 ++++------------- polkadot/runtime/common/src/impls.rs | 15 ++--------- .../runtime/common/src/integration_tests.rs | 13 +--------- .../runtime/common/src/paras_registrar/mod.rs | 15 +++-------- polkadot/runtime/common/src/purchase.rs | 17 +----------- polkadot/runtime/common/src/slots/mod.rs | 17 +----------- polkadot/runtime/parachains/src/mock.rs | 11 +------- polkadot/runtime/westend/src/lib.rs | 4 +-- .../relay_token_transactor/parachain/mod.rs | 5 ++-- .../relay_token_transactor/relay_chain/mod.rs | 4 +-- polkadot/xcm/pallet-xcm/src/mock.rs | 13 +--------- polkadot/xcm/xcm-builder/tests/mock/mod.rs | 14 ++-------- .../xcm/xcm-simulator/fuzzer/src/parachain.rs | 14 +--------- .../xcm-simulator/fuzzer/src/relay_chain.rs | 13 +--------- substrate/bin/node/runtime/src/lib.rs | 4 +-- substrate/frame/alliance/src/mock.rs | 17 +----------- .../frame/asset-conversion/ops/src/mock.rs | 3 +-- substrate/frame/asset-conversion/src/mock.rs | 11 +------- substrate/frame/asset-rate/src/mock.rs | 15 ++--------- substrate/frame/assets/src/mock.rs | 15 ++--------- substrate/frame/atomic-swap/src/tests.rs | 18 ++----------- substrate/frame/babe/src/mock.rs | 11 +------- substrate/frame/balances/src/lib.rs | 4 +-- .../balances/src/tests/dispatchable_tests.rs | 2 +- substrate/frame/balances/src/tests/mod.rs | 13 +++------- substrate/frame/beefy/src/mock.rs | 11 +------- substrate/frame/bounties/src/tests.rs | 13 +--------- substrate/frame/child-bounties/src/tests.rs | 13 +--------- substrate/frame/contracts/src/lib.rs | 2 +- .../frame/conviction-voting/src/tests.rs | 13 +--------- substrate/frame/delegated-staking/src/mock.rs | 15 ++++------- substrate/frame/democracy/src/tests.rs | 13 +--------- .../election-provider-multi-phase/src/mock.rs | 14 +--------- .../test-staking-e2e/src/mock.rs | 12 +++------ substrate/frame/elections-phragmen/src/lib.rs | 15 ++--------- substrate/frame/examples/basic/src/tests.rs | 13 +--------- .../frame/examples/dev-mode/src/tests.rs | 15 ++--------- .../frame/examples/kitchensink/src/tests.rs | 18 +++++-------- .../single-block-migrations/src/mock.rs | 15 ++--------- substrate/frame/executive/src/tests.rs | 22 +++++++++++++--- substrate/frame/fast-unstake/src/mock.rs | 11 +------- substrate/frame/grandpa/src/mock.rs | 11 +------- substrate/frame/identity/src/tests.rs | 13 +--------- substrate/frame/indices/src/mock.rs | 13 +--------- substrate/frame/lottery/src/mock.rs | 15 ++--------- .../frame/nft-fractionalization/src/mock.rs | 13 +--------- substrate/frame/nfts/src/mock.rs | 13 +--------- .../nomination-pools/benchmarking/src/mock.rs | 20 +++++++------- substrate/frame/nomination-pools/src/mock.rs | 15 ++++------- .../test-delegate-stake/src/mock.rs | 13 +++------- .../test-transfer-stake/src/mock.rs | 14 +++------- .../frame/offences/benchmarking/src/mock.rs | 12 +-------- substrate/frame/parameters/src/tests/mock.rs | 1 - .../parameters/src/tests/test_renamed.rs | 1 - substrate/frame/preimage/src/mock.rs | 14 ++-------- substrate/frame/recovery/src/mock.rs | 11 +------- substrate/frame/referenda/src/mock.rs | 13 +--------- substrate/frame/root-offences/src/mock.rs | 13 +--------- substrate/frame/safe-mode/src/mock.rs | 12 +-------- substrate/frame/scored-pool/src/mock.rs | 13 +--------- .../frame/session/benchmarking/src/mock.rs | 12 +-------- substrate/frame/staking/src/mock.rs | 10 +------ substrate/frame/statement/src/mock.rs | 12 +-------- .../test/tests/runtime_legacy_ordering.rs | 2 +- substrate/frame/tips/src/tests.rs | 13 +--------- .../asset-conversion-tx-payment/src/mock.rs | 12 +-------- .../asset-tx-payment/src/mock.rs | 12 +-------- .../frame/transaction-payment/src/mock.rs | 15 ++--------- substrate/frame/treasury/src/tests.rs | 14 ++-------- substrate/frame/tx-pause/src/mock.rs | 17 +----------- substrate/frame/uniques/src/mock.rs | 13 +--------- substrate/frame/utility/src/tests.rs | 13 +--------- substrate/frame/vesting/src/mock.rs | 17 ++---------- substrate/frame/whitelist/src/mock.rs | 15 ++--------- .../parachain/runtime/src/configs/mod.rs | 8 +++--- templates/solochain/runtime/src/lib.rs | 13 ++++++---- 85 files changed, 177 insertions(+), 885 deletions(-) diff --git a/bridges/modules/messages/src/mock.rs b/bridges/modules/messages/src/mock.rs index ec63f15b94b..3a1e0063d53 100644 --- a/bridges/modules/messages/src/mock.rs +++ b/bridges/modules/messages/src/mock.rs @@ -86,7 +86,6 @@ impl frame_system::Config for TestRuntime { #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for TestRuntime { - type ReserveIdentifier = [u8; 8]; type AccountStore = System; } diff --git a/bridges/snowbridge/pallets/inbound-queue/src/mock.rs b/bridges/snowbridge/pallets/inbound-queue/src/mock.rs index a842f9aa60c..a031676c607 100644 --- a/bridges/snowbridge/pallets/inbound-queue/src/mock.rs +++ b/bridges/snowbridge/pallets/inbound-queue/src/mock.rs @@ -53,20 +53,11 @@ parameter_types! { pub const ExistentialDeposit: u128 = 1; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { diff --git a/bridges/snowbridge/pallets/system/src/mock.rs b/bridges/snowbridge/pallets/system/src/mock.rs index d7fc4152b37..98bd3da9ab2 100644 --- a/bridges/snowbridge/pallets/system/src/mock.rs +++ b/bridges/snowbridge/pallets/system/src/mock.rs @@ -112,20 +112,11 @@ impl frame_system::Config for Test { type Block = Block; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ConstU128<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl pallet_xcm_origin::Config for Test { diff --git a/cumulus/pallets/collator-selection/src/mock.rs b/cumulus/pallets/collator-selection/src/mock.rs index 6521c954eac..459b1cb5fdf 100644 --- a/cumulus/pallets/collator-selection/src/mock.rs +++ b/cumulus/pallets/collator-selection/src/mock.rs @@ -53,23 +53,12 @@ impl system::Config for Test { parameter_types! { pub const ExistentialDeposit: u64 = 5; - pub const MaxReserves: u32 = 50; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; } pub struct Author4; diff --git a/cumulus/pallets/xcmp-queue/src/mock.rs b/cumulus/pallets/xcmp-queue/src/mock.rs index e166a78ee82..7fb96de7a4e 100644 --- a/cumulus/pallets/xcmp-queue/src/mock.rs +++ b/cumulus/pallets/xcmp-queue/src/mock.rs @@ -85,25 +85,14 @@ impl frame_system::Config for Test { parameter_types! { pub const ExistentialDeposit: u64 = 5; - pub const MaxReserves: u32 = 50; } pub type Balance = u64; +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; } impl cumulus_pallet_parachain_system::Config for Test { diff --git a/cumulus/parachains/common/src/impls.rs b/cumulus/parachains/common/src/impls.rs index ed9c5c483fa..16cda1a4ed8 100644 --- a/cumulus/parachains/common/src/impls.rs +++ b/cumulus/parachains/common/src/impls.rs @@ -202,7 +202,7 @@ mod tests { use frame_system::{limits, EnsureRoot}; use pallet_collator_selection::IdentityCollator; use polkadot_primitives::AccountId; - use sp_core::{ConstU64, H256}; + use sp_core::H256; use sp_runtime::{ traits::{BlakeTwo256, IdentityLookup}, BuildStorage, Perbill, @@ -224,7 +224,6 @@ mod tests { parameter_types! { pub BlockLength: limits::BlockLength = limits::BlockLength::max(2 * 1024); pub const AvailableBlockRatio: Perbill = Perbill::one(); - pub const MaxReserves: u32 = 50; } #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] @@ -253,20 +252,9 @@ mod tests { type MaxConsumers = frame_support::traits::ConstU32<16>; } + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type MaxLocks = (); - type WeightInfo = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; } pub struct OneAuthor; diff --git a/polkadot/runtime/common/src/assigned_slots/mod.rs b/polkadot/runtime/common/src/assigned_slots/mod.rs index 368708f2564..d0a531b8b6c 100644 --- a/polkadot/runtime/common/src/assigned_slots/mod.rs +++ b/polkadot/runtime/common/src/assigned_slots/mod.rs @@ -698,24 +698,9 @@ mod tests { type MaxConsumers = frame_support::traits::ConstU32<16>; } - parameter_types! { - pub const ExistentialDeposit: u64 = 1; - } - + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; } impl parachains_configuration::Config for Test { diff --git a/polkadot/runtime/common/src/auctions.rs b/polkadot/runtime/common/src/auctions.rs index 199b18fba51..19d82ae85d0 100644 --- a/polkadot/runtime/common/src/auctions.rs +++ b/polkadot/runtime/common/src/auctions.rs @@ -674,7 +674,7 @@ mod tests { use frame_support::{ assert_noop, assert_ok, assert_storage_noop, derive_impl, ord_parameter_types, parameter_types, - traits::{ConstU32, EitherOfDiverse, OnFinalize, OnInitialize}, + traits::{EitherOfDiverse, OnFinalize, OnInitialize}, }; use frame_system::{EnsureRoot, EnsureSignedBy}; use pallet_balances; @@ -725,25 +725,9 @@ mod tests { type MaxConsumers = frame_support::traits::ConstU32<16>; } - parameter_types! { - pub const ExistentialDeposit: u64 = 1; - pub const MaxReserves: u32 = 50; - } - + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; } #[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug)] @@ -1426,7 +1410,8 @@ mod tests { #[test] fn initialize_winners_in_ending_period_works() { new_test_ext().execute_with(|| { - assert_eq!(::ExistentialDeposit::get(), 1); + let ed: u64 = ::ExistentialDeposit::get(); + assert_eq!(ed, 1); run_to_block(1); assert_ok!(Auctions::new_auction(RuntimeOrigin::signed(6), 9, 1)); let para_1 = ParaId::from(1_u32); @@ -1539,7 +1524,8 @@ mod tests { #[test] fn less_winning_samples_work() { new_test_ext().execute_with(|| { - assert_eq!(::ExistentialDeposit::get(), 1); + let ed: u64 = ::ExistentialDeposit::get(); + assert_eq!(ed, 1); EndingPeriod::set(30); SampleLength::set(10); diff --git a/polkadot/runtime/common/src/claims.rs b/polkadot/runtime/common/src/claims.rs index 54208e7fd13..c12af215a04 100644 --- a/polkadot/runtime/common/src/claims.rs +++ b/polkadot/runtime/common/src/claims.rs @@ -708,7 +708,7 @@ mod tests { assert_err, assert_noop, assert_ok, derive_impl, dispatch::{GetDispatchInfo, Pays}, ord_parameter_types, parameter_types, - traits::{ConstU32, ExistenceRequirement, WithdrawReasons}, + traits::{ExistenceRequirement, WithdrawReasons}, }; use pallet_balances; use sp_runtime::{ @@ -738,24 +738,9 @@ mod tests { type MaxConsumers = frame_support::traits::ConstU32<16>; } - parameter_types! { - pub const ExistentialDeposit: u64 = 1; - } - + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; } parameter_types! { diff --git a/polkadot/runtime/common/src/crowdloan/mod.rs b/polkadot/runtime/common/src/crowdloan/mod.rs index 1dbba363de5..61d406aa681 100644 --- a/polkadot/runtime/common/src/crowdloan/mod.rs +++ b/polkadot/runtime/common/src/crowdloan/mod.rs @@ -860,7 +860,7 @@ mod tests { use frame_support::{ assert_noop, assert_ok, derive_impl, parameter_types, - traits::{ConstU32, OnFinalize, OnInitialize}, + traits::{OnFinalize, OnInitialize}, }; use polkadot_primitives::Id as ParaId; use sp_core::H256; @@ -918,24 +918,9 @@ mod tests { type MaxConsumers = frame_support::traits::ConstU32<16>; } - parameter_types! { - pub const ExistentialDeposit: u64 = 1; - } - + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; } #[derive(Copy, Clone, Eq, PartialEq, Debug)] @@ -980,7 +965,7 @@ mod tests { let fund = Funds::::get(para).unwrap(); let account_id = Crowdloan::fund_account_id(fund.fund_index); if winner { - let ed = ::ExistentialDeposit::get(); + let ed: u64 = ::ExistentialDeposit::get(); let free_balance = Balances::free_balance(&account_id); Balances::reserve(&account_id, free_balance - ed) .expect("should be able to reserve free balance minus ED"); @@ -1815,7 +1800,8 @@ mod tests { #[test] fn withdraw_from_finished_works() { new_test_ext().execute_with(|| { - assert_eq!(::ExistentialDeposit::get(), 1); + let ed: u64 = ::ExistentialDeposit::get(); + assert_eq!(ed, 1); let para = new_para(); let index = NextFundIndex::::get(); let account_id = Crowdloan::fund_account_id(index); diff --git a/polkadot/runtime/common/src/impls.rs b/polkadot/runtime/common/src/impls.rs index ac2288c906a..c913b90b153 100644 --- a/polkadot/runtime/common/src/impls.rs +++ b/polkadot/runtime/common/src/impls.rs @@ -249,7 +249,7 @@ mod tests { parameter_types, traits::{ tokens::{PayFromAccount, UnityAssetBalanceConversion}, - ConstU32, FindAuthor, + FindAuthor, }, weights::Weight, PalletId, @@ -315,20 +315,9 @@ mod tests { type MaxConsumers = frame_support::traits::ConstU32<16>; } + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; } parameter_types! { diff --git a/polkadot/runtime/common/src/integration_tests.rs b/polkadot/runtime/common/src/integration_tests.rs index e77035b3f6b..052fb0389db 100644 --- a/polkadot/runtime/common/src/integration_tests.rs +++ b/polkadot/runtime/common/src/integration_tests.rs @@ -173,23 +173,12 @@ impl pallet_timestamp::Config for Test { parameter_types! { pub static ExistentialDeposit: Balance = 1; - pub const MaxReserves: u32 = 50; } - +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; } impl configuration::Config for Test { diff --git a/polkadot/runtime/common/src/paras_registrar/mod.rs b/polkadot/runtime/common/src/paras_registrar/mod.rs index 9bbb152f855..6b9191f7c6f 100644 --- a/polkadot/runtime/common/src/paras_registrar/mod.rs +++ b/polkadot/runtime/common/src/paras_registrar/mod.rs @@ -721,7 +721,7 @@ mod tests { assert_noop, assert_ok, derive_impl, error::BadOrigin, parameter_types, - traits::{ConstU32, OnFinalize, OnInitialize}, + traits::{OnFinalize, OnInitialize}, }; use frame_system::limits; use pallet_balances::Error as BalancesError; @@ -799,20 +799,11 @@ mod tests { pub const ExistentialDeposit: Balance = 1; } + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u128; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; + type Balance = Balance; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; } impl shared::Config for Test { diff --git a/polkadot/runtime/common/src/purchase.rs b/polkadot/runtime/common/src/purchase.rs index 5ae6b422618..eb480e4efe1 100644 --- a/polkadot/runtime/common/src/purchase.rs +++ b/polkadot/runtime/common/src/purchase.rs @@ -534,24 +534,9 @@ mod tests { type MaxConsumers = frame_support::traits::ConstU32<16>; } - parameter_types! { - pub const ExistentialDeposit: u64 = 1; - } - + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; } parameter_types! { diff --git a/polkadot/runtime/common/src/slots/mod.rs b/polkadot/runtime/common/src/slots/mod.rs index 900e04eaff1..747b7b5ca63 100644 --- a/polkadot/runtime/common/src/slots/mod.rs +++ b/polkadot/runtime/common/src/slots/mod.rs @@ -551,24 +551,9 @@ mod tests { type MaxConsumers = frame_support::traits::ConstU32<16>; } - parameter_types! { - pub const ExistentialDeposit: u64 = 1; - } - + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; } parameter_types! { diff --git a/polkadot/runtime/parachains/src/mock.rs b/polkadot/runtime/parachains/src/mock.rs index 0a0be8432b2..18722ff463c 100644 --- a/polkadot/runtime/parachains/src/mock.rs +++ b/polkadot/runtime/parachains/src/mock.rs @@ -139,20 +139,11 @@ parameter_types! { pub static ExistentialDeposit: u64 = 1; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; } parameter_types! { diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 77262a98a94..511b502fea4 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -29,7 +29,7 @@ use frame_support::{ traits::{ fungible::HoldConsideration, tokens::UnityOrOuterConversion, ConstU32, Contains, EitherOf, EitherOfDiverse, EverythingBut, FromContains, InstanceFilter, KeyOwnerProofSystem, - LinearStoragePrice, ProcessMessage, ProcessMessageError, WithdrawReasons, + LinearStoragePrice, ProcessMessage, ProcessMessageError, VariantCountOf, WithdrawReasons, }, weights::{ConstantMultiplier, WeightMeter, WeightToFee as _}, PalletId, @@ -310,7 +310,7 @@ impl pallet_balances::Config for Runtime { type RuntimeHoldReason = RuntimeHoldReason; type RuntimeFreezeReason = RuntimeFreezeReason; type FreezeIdentifier = RuntimeFreezeReason; - type MaxFreezes = ConstU32<1>; + type MaxFreezes = VariantCountOf; } parameter_types! { diff --git a/polkadot/xcm/docs/src/cookbook/relay_token_transactor/parachain/mod.rs b/polkadot/xcm/docs/src/cookbook/relay_token_transactor/parachain/mod.rs index e3fdda2e733..e7d00ac7103 100644 --- a/polkadot/xcm/docs/src/cookbook/relay_token_transactor/parachain/mod.rs +++ b/polkadot/xcm/docs/src/cookbook/relay_token_transactor/parachain/mod.rs @@ -36,7 +36,7 @@ construct_runtime! { } } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; type AccountId = AccountId; @@ -49,8 +49,7 @@ impl mock_message_queue::Config for Runtime { type XcmExecutor = XcmExecutor; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type Balance = Balance; type AccountStore = System; } diff --git a/polkadot/xcm/docs/src/cookbook/relay_token_transactor/relay_chain/mod.rs b/polkadot/xcm/docs/src/cookbook/relay_token_transactor/relay_chain/mod.rs index 25c35dd4aaa..686f86b37b7 100644 --- a/polkadot/xcm/docs/src/cookbook/relay_token_transactor/relay_chain/mod.rs +++ b/polkadot/xcm/docs/src/cookbook/relay_token_transactor/relay_chain/mod.rs @@ -36,7 +36,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type AccountId = AccountId; type Lookup = IdentityLookup; @@ -44,7 +44,7 @@ impl frame_system::Config for Runtime { type AccountData = pallet_balances::AccountData; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { type AccountStore = System; } diff --git a/polkadot/xcm/pallet-xcm/src/mock.rs b/polkadot/xcm/pallet-xcm/src/mock.rs index ead98e1d046..2be6f301f85 100644 --- a/polkadot/xcm/pallet-xcm/src/mock.rs +++ b/polkadot/xcm/pallet-xcm/src/mock.rs @@ -266,24 +266,13 @@ impl frame_system::Config for Test { parameter_types! { pub ExistentialDeposit: Balance = 1; - pub const MaxLocks: u32 = 50; - pub const MaxReserves: u32 = 50; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = MaxLocks; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; } #[cfg(feature = "runtime-benchmarks")] diff --git a/polkadot/xcm/xcm-builder/tests/mock/mod.rs b/polkadot/xcm/xcm-builder/tests/mock/mod.rs index 62b448a9f43..582d596b78f 100644 --- a/polkadot/xcm/xcm-builder/tests/mock/mod.rs +++ b/polkadot/xcm/xcm-builder/tests/mock/mod.rs @@ -17,7 +17,7 @@ use codec::Encode; use frame_support::{ construct_runtime, derive_impl, parameter_types, - traits::{ConstU32, Everything, Nothing}, + traits::{Everything, Nothing}, weights::Weight, }; use frame_system::EnsureRoot; @@ -102,24 +102,14 @@ impl frame_system::Config for Runtime { parameter_types! { pub ExistentialDeposit: Balance = 1 * CENTS; - pub const MaxLocks: u32 = 50; - pub const MaxReserves: u32 = 50; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = MaxLocks; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxReserves = MaxReserves; type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; } impl shared::Config for Runtime { diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs index 502bcca2d44..11435868d46 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs @@ -24,7 +24,6 @@ use frame_support::{ }; use frame_system::EnsureRoot; -use sp_core::ConstU32; use sp_runtime::{ generic, traits::{AccountIdLookup, BlakeTwo256, Hash, IdentifyAccount, Verify}, @@ -73,24 +72,13 @@ impl frame_system::Config for Runtime { parameter_types! { pub ExistentialDeposit: Balance = 1; - pub const MaxLocks: u32 = 50; - pub const MaxReserves: u32 = 50; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = MaxLocks; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; } parameter_types! { diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs index 4740aee83d8..459d2640b6d 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs @@ -72,24 +72,13 @@ impl frame_system::Config for Runtime { parameter_types! { pub ExistentialDeposit: Balance = 1; - pub const MaxLocks: u32 = 50; - pub const MaxReserves: u32 = 50; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = MaxLocks; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; } impl shared::Config for Runtime { diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 8fb59a9d847..2bddb3a1ade 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -49,7 +49,7 @@ use frame_support::{ AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU16, ConstU32, Contains, Currency, EitherOfDiverse, EnsureOriginWithArg, EqualPrivilegeOnly, Imbalance, InsideBoth, InstanceFilter, KeyOwnerProofSystem, LinearStoragePrice, LockIdentifier, Nothing, - OnUnbalanced, WithdrawReasons, + OnUnbalanced, VariantCountOf, WithdrawReasons, }, weights::{ constants::{ @@ -542,7 +542,7 @@ impl pallet_balances::Config for Runtime { type AccountStore = frame_system::Pallet; type WeightInfo = pallet_balances::weights::SubstrateWeight; type FreezeIdentifier = RuntimeFreezeReason; - type MaxFreezes = ConstU32<1>; + type MaxFreezes = VariantCountOf; } parameter_types! { diff --git a/substrate/frame/alliance/src/mock.rs b/substrate/frame/alliance/src/mock.rs index a9cfd6d0fde..1a0a899bccc 100644 --- a/substrate/frame/alliance/src/mock.rs +++ b/substrate/frame/alliance/src/mock.rs @@ -52,24 +52,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } -parameter_types! { - pub const ExistentialDeposit: u64 = 1; - pub const MaxLocks: u32 = 10; -} +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = MaxLocks; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } const MOTION_DURATION_IN_BLOCKS: BlockNumber = 3; diff --git a/substrate/frame/asset-conversion/ops/src/mock.rs b/substrate/frame/asset-conversion/ops/src/mock.rs index 9454b3a9ad4..91c18b2e794 100644 --- a/substrate/frame/asset-conversion/ops/src/mock.rs +++ b/substrate/frame/asset-conversion/ops/src/mock.rs @@ -52,7 +52,7 @@ construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type AccountData = pallet_balances::AccountData; @@ -60,7 +60,6 @@ impl frame_system::Config for Test { #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type ReserveIdentifier = [u8; 8]; type AccountStore = System; } diff --git a/substrate/frame/asset-conversion/src/mock.rs b/substrate/frame/asset-conversion/src/mock.rs index 477866e0051..d8832d70488 100644 --- a/substrate/frame/asset-conversion/src/mock.rs +++ b/substrate/frame/asset-conversion/src/mock.rs @@ -61,20 +61,11 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { type Balance = u128; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ConstU128<100>; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl pallet_assets::Config for Test { diff --git a/substrate/frame/asset-rate/src/mock.rs b/substrate/frame/asset-rate/src/mock.rs index d01996dab19..c829d78afa8 100644 --- a/substrate/frame/asset-rate/src/mock.rs +++ b/substrate/frame/asset-rate/src/mock.rs @@ -18,7 +18,7 @@ //! The crate's mock. use crate as pallet_asset_rate; -use frame_support::{derive_impl, traits::ConstU64}; +use frame_support::derive_impl; use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -38,20 +38,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = (); } impl pallet_asset_rate::Config for Test { diff --git a/substrate/frame/assets/src/mock.rs b/substrate/frame/assets/src/mock.rs index f6173a451ff..694ef234dff 100644 --- a/substrate/frame/assets/src/mock.rs +++ b/substrate/frame/assets/src/mock.rs @@ -23,7 +23,7 @@ use crate as pallet_assets; use codec::Encode; use frame_support::{ construct_runtime, derive_impl, parameter_types, - traits::{AsEnsureOriginWithArg, ConstU32, ConstU64}, + traits::{AsEnsureOriginWithArg, ConstU32}, }; use sp_io::storage; use sp_runtime::BuildStorage; @@ -49,20 +49,9 @@ impl frame_system::Config for Test { type MaxConsumers = ConstU32<3>; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); - type FreezeIdentifier = (); - type MaxFreezes = (); } pub struct AssetsCallbackHandle; diff --git a/substrate/frame/atomic-swap/src/tests.rs b/substrate/frame/atomic-swap/src/tests.rs index 9f51f04208a..47ebe6a8f0a 100644 --- a/substrate/frame/atomic-swap/src/tests.rs +++ b/substrate/frame/atomic-swap/src/tests.rs @@ -20,10 +20,7 @@ use super::*; use crate as pallet_atomic_swap; -use frame_support::{ - derive_impl, - traits::{ConstU32, ConstU64}, -}; +use frame_support::{derive_impl, traits::ConstU32}; use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -43,20 +40,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl Config for Test { diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs index 395a86e6528..16db40e3cb3 100644 --- a/substrate/frame/babe/src/mock.rs +++ b/substrate/frame/babe/src/mock.rs @@ -112,20 +112,11 @@ impl pallet_timestamp::Config for Test { type WeightInfo = (); } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = u128; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ConstU128<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } pallet_staking_reward_curve::build! { diff --git a/substrate/frame/balances/src/lib.rs b/substrate/frame/balances/src/lib.rs index 56eb81b49e2..4935323b3aa 100644 --- a/substrate/frame/balances/src/lib.rs +++ b/substrate/frame/balances/src/lib.rs @@ -222,13 +222,13 @@ pub mod pallet { type ExistentialDeposit = ConstU64<1>; type ReserveIdentifier = (); - type FreezeIdentifier = (); + type FreezeIdentifier = Self::RuntimeFreezeReason; type DustRemoval = (); type MaxLocks = ConstU32<100>; type MaxReserves = ConstU32<100>; - type MaxFreezes = ConstU32<100>; + type MaxFreezes = VariantCountOf; type WeightInfo = (); } diff --git a/substrate/frame/balances/src/tests/dispatchable_tests.rs b/substrate/frame/balances/src/tests/dispatchable_tests.rs index 4bc96f6b43d..ebc9f1b1a36 100644 --- a/substrate/frame/balances/src/tests/dispatchable_tests.rs +++ b/substrate/frame/balances/src/tests/dispatchable_tests.rs @@ -281,7 +281,7 @@ fn force_adjust_total_issuance_saturates() { ExtBuilder::default().build_and_execute_with(|| { assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), 1337, 64)); let ti = Balances::total_issuance(); - let max = Balance::max_value(); + let max = ::Balance::max_value(); assert_eq!(ti, 64); // Increment saturates: diff --git a/substrate/frame/balances/src/tests/mod.rs b/substrate/frame/balances/src/tests/mod.rs index 0abf2251290..5ed37170407 100644 --- a/substrate/frame/balances/src/tests/mod.rs +++ b/substrate/frame/balances/src/tests/mod.rs @@ -27,7 +27,7 @@ use frame_support::{ parameter_types, traits::{ fungible, ConstU32, ConstU8, Imbalance as ImbalanceT, OnUnbalanced, StorageMapShim, - StoredMap, VariantCount, WhitelistedStorageKeys, + StoredMap, VariantCount, VariantCountOf, WhitelistedStorageKeys, }, weights::{IdentityFee, Weight}, }; @@ -107,22 +107,17 @@ impl pallet_transaction_payment::Config for Test { type FeeMultiplierUpdate = (); } -pub(crate) type Balance = u64; - +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl Config for Test { - type Balance = Balance; type DustRemoval = DustTrap; - type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ExistentialDeposit; type AccountStore = TestAccountStore; - type MaxLocks = ConstU32<50>; type MaxReserves = ConstU32<2>; type ReserveIdentifier = TestId; - type WeightInfo = (); type RuntimeHoldReason = TestId; - type RuntimeFreezeReason = RuntimeFreezeReason; + type RuntimeFreezeReason = TestId; type FreezeIdentifier = TestId; - type MaxFreezes = ConstU32<2>; + type MaxFreezes = VariantCountOf; } #[derive(Clone)] diff --git a/substrate/frame/beefy/src/mock.rs b/substrate/frame/beefy/src/mock.rs index 0b87de6bf5d..ceca0fd07b7 100644 --- a/substrate/frame/beefy/src/mock.rs +++ b/substrate/frame/beefy/src/mock.rs @@ -120,20 +120,11 @@ impl pallet_authorship::Config for Test { type EventHandler = (); } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = u128; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ConstU128<1>; type AccountStore = System; - type WeightInfo = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); - type FreezeIdentifier = (); - type MaxFreezes = (); } impl pallet_timestamp::Config for Test { diff --git a/substrate/frame/bounties/src/tests.rs b/substrate/frame/bounties/src/tests.rs index a89f4ff9fbf..212f0bd2959 100644 --- a/substrate/frame/bounties/src/tests.rs +++ b/substrate/frame/bounties/src/tests.rs @@ -66,20 +66,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); diff --git a/substrate/frame/child-bounties/src/tests.rs b/substrate/frame/child-bounties/src/tests.rs index d9405d3d289..38e86c528e5 100644 --- a/substrate/frame/child-bounties/src/tests.rs +++ b/substrate/frame/child-bounties/src/tests.rs @@ -69,20 +69,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); diff --git a/substrate/frame/contracts/src/lib.rs b/substrate/frame/contracts/src/lib.rs index e9cf28a6691..47772e0a5a0 100644 --- a/substrate/frame/contracts/src/lib.rs +++ b/substrate/frame/contracts/src/lib.rs @@ -529,7 +529,7 @@ pub mod pallet { } } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] impl frame_system::DefaultConfig for TestDefaultConfig {} #[frame_support::register_default_impl(TestDefaultConfig)] diff --git a/substrate/frame/conviction-voting/src/tests.rs b/substrate/frame/conviction-voting/src/tests.rs index 0e985e25290..78569fb3c9f 100644 --- a/substrate/frame/conviction-voting/src/tests.rs +++ b/substrate/frame/conviction-voting/src/tests.rs @@ -54,20 +54,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type MaxLocks = ConstU32<10>; - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } #[derive(Clone, PartialEq, Eq, Debug)] diff --git a/substrate/frame/delegated-staking/src/mock.rs b/substrate/frame/delegated-staking/src/mock.rs index c1875055f2f..0991833f865 100644 --- a/substrate/frame/delegated-staking/src/mock.rs +++ b/substrate/frame/delegated-staking/src/mock.rs @@ -20,7 +20,7 @@ use frame_support::{ assert_ok, derive_impl, pallet_prelude::*, parameter_types, - traits::{ConstU64, Currency}, + traits::{ConstU64, Currency, VariantCountOf}, PalletId, }; @@ -44,7 +44,7 @@ pub const GENESIS_VALIDATOR: AccountId = 1; pub const GENESIS_NOMINATOR_ONE: AccountId = 101; pub const GENESIS_NOMINATOR_TWO: AccountId = 102; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; type AccountData = pallet_balances::AccountData; @@ -64,19 +64,14 @@ pub type Balance = u128; parameter_types! { pub static ExistentialDeposit: Balance = 1; } + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<128>; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); type FreezeIdentifier = RuntimeFreezeReason; - type MaxFreezes = ConstU32<1>; - type RuntimeHoldReason = RuntimeHoldReason; + type MaxFreezes = VariantCountOf; type RuntimeFreezeReason = RuntimeFreezeReason; } diff --git a/substrate/frame/democracy/src/tests.rs b/substrate/frame/democracy/src/tests.rs index 9303c0da504..7d7066c8af6 100644 --- a/substrate/frame/democracy/src/tests.rs +++ b/substrate/frame/democracy/src/tests.rs @@ -108,20 +108,9 @@ impl pallet_scheduler::Config for Test { type Preimages = (); } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type MaxLocks = ConstU32<10>; - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { pub static PreimageByteDeposit: u64 = 0; diff --git a/substrate/frame/election-provider-multi-phase/src/mock.rs b/substrate/frame/election-provider-multi-phase/src/mock.rs index 92b87d92e99..4532185b959 100644 --- a/substrate/frame/election-provider-multi-phase/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/src/mock.rs @@ -237,7 +237,6 @@ impl frame_system::Config for Runtime { const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); parameter_types! { - pub const ExistentialDeposit: u64 = 1; pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights ::with_sensible_defaults( Weight::from_parts(2u64 * constants::WEIGHT_REF_TIME_PER_SECOND, u64::MAX), @@ -245,20 +244,9 @@ parameter_types! { ); } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } #[derive(Default, Eq, PartialEq, Debug, Clone, Copy)] diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs index e5987ec33f0..9c499151363 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs @@ -19,7 +19,7 @@ use frame_support::{ assert_ok, parameter_types, traits, - traits::{Hooks, UnfilteredDispatchable}, + traits::{Hooks, UnfilteredDispatchable, VariantCountOf}, weights::constants, }; use frame_system::EnsureRoot; @@ -102,20 +102,14 @@ parameter_types! { ); } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = traits::ConstU32<1024>; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type MaxFreezes = traits::ConstU32<1>; + type MaxFreezes = VariantCountOf; type RuntimeHoldReason = RuntimeHoldReason; type RuntimeFreezeReason = RuntimeFreezeReason; type FreezeIdentifier = RuntimeFreezeReason; - type WeightInfo = (); } impl pallet_timestamp::Config for Runtime { diff --git a/substrate/frame/elections-phragmen/src/lib.rs b/substrate/frame/elections-phragmen/src/lib.rs index b4be07030ef..a5b6fca0a8a 100644 --- a/substrate/frame/elections-phragmen/src/lib.rs +++ b/substrate/frame/elections-phragmen/src/lib.rs @@ -1310,7 +1310,7 @@ mod tests { assert_noop, assert_ok, derive_impl, dispatch::DispatchResultWithPostInfo, parameter_types, - traits::{ConstU32, ConstU64, OnInitialize}, + traits::{ConstU32, OnInitialize}, }; use frame_system::ensure_signed; use sp_runtime::{testing::Header, BuildStorage}; @@ -1322,20 +1322,9 @@ mod tests { type AccountData = pallet_balances::AccountData; } + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = frame_system::Pallet; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } frame_support::parameter_types! { diff --git a/substrate/frame/examples/basic/src/tests.rs b/substrate/frame/examples/basic/src/tests.rs index d351b27eecd..505cd6f906d 100644 --- a/substrate/frame/examples/basic/src/tests.rs +++ b/substrate/frame/examples/basic/src/tests.rs @@ -71,20 +71,9 @@ impl frame_system::Config for Test { type MaxConsumers = frame_support::traits::ConstU32<16>; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl Config for Test { diff --git a/substrate/frame/examples/dev-mode/src/tests.rs b/substrate/frame/examples/dev-mode/src/tests.rs index e8a18ec13fe..637864b87bc 100644 --- a/substrate/frame/examples/dev-mode/src/tests.rs +++ b/substrate/frame/examples/dev-mode/src/tests.rs @@ -18,7 +18,7 @@ //! Tests for pallet-dev-mode. use crate::*; -use frame_support::{assert_ok, derive_impl, traits::ConstU64}; +use frame_support::{assert_ok, derive_impl}; use sp_core::H256; use sp_runtime::{ traits::{BlakeTwo256, IdentityLookup}, @@ -65,20 +65,9 @@ impl frame_system::Config for Test { type MaxConsumers = frame_support::traits::ConstU32<16>; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; } impl Config for Test { diff --git a/substrate/frame/examples/kitchensink/src/tests.rs b/substrate/frame/examples/kitchensink/src/tests.rs index 1205fefc422..7cf95497bf0 100644 --- a/substrate/frame/examples/kitchensink/src/tests.rs +++ b/substrate/frame/examples/kitchensink/src/tests.rs @@ -18,7 +18,7 @@ //! Tests for pallet-example-kitchensink. use crate::*; -use frame_support::{assert_ok, derive_impl, parameter_types, traits::ConstU64}; +use frame_support::{assert_ok, derive_impl, parameter_types, traits::VariantCountOf}; use sp_runtime::BuildStorage; // Reexport crate as its pallet name for construct_runtime. use crate as pallet_example_kitchensink; @@ -43,20 +43,14 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); + type FreezeIdentifier = RuntimeFreezeReason; + type MaxFreezes = VariantCountOf; + type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; } parameter_types! { diff --git a/substrate/frame/examples/single-block-migrations/src/mock.rs b/substrate/frame/examples/single-block-migrations/src/mock.rs index 68594cc4ad7..f4cf81ea647 100644 --- a/substrate/frame/examples/single-block-migrations/src/mock.rs +++ b/substrate/frame/examples/single-block-migrations/src/mock.rs @@ -18,7 +18,7 @@ #![cfg(any(all(feature = "try-runtime", test), doc))] use crate::*; -use frame_support::{derive_impl, traits::ConstU64, weights::constants::ParityDbWeight}; +use frame_support::{derive_impl, weights::constants::ParityDbWeight}; // Re-export crate as its pallet name for construct_runtime. use crate as pallet_example_storage_migration; @@ -41,20 +41,9 @@ impl frame_system::Config for MockRuntime { type DbWeight = ParityDbWeight; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for MockRuntime { - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); } impl Config for MockRuntime {} diff --git a/substrate/frame/executive/src/tests.rs b/substrate/frame/executive/src/tests.rs index e3721f7b6dc..71cb54d1fab 100644 --- a/substrate/frame/executive/src/tests.rs +++ b/substrate/frame/executive/src/tests.rs @@ -36,7 +36,7 @@ use frame_support::{ migrations::MultiStepMigrator, pallet_prelude::*, parameter_types, - traits::{fungible, ConstU8, Currency, IsInherent}, + traits::{fungible, ConstU8, Currency, IsInherent, VariantCount, VariantCountOf}, weights::{ConstantMultiplier, IdentityFee, RuntimeDbWeight, Weight, WeightMeter, WeightToFee}, }; use frame_system::{pallet_prelude::*, ChainContext, LastRuntimeUpgrade, LastRuntimeUpgradeInfo}; @@ -325,12 +325,24 @@ impl frame_system::Config for Runtime { type MultiBlockMigrator = MockedModeGetter; } +#[derive(Encode, Decode, Copy, Clone, Eq, PartialEq, MaxEncodedLen, TypeInfo, RuntimeDebug)] +pub enum FreezeReasonId { + Foo, +} + +impl VariantCount for FreezeReasonId { + const VARIANT_COUNT: u32 = 1; +} + type Balance = u64; #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { type Balance = Balance; type AccountStore = System; + type RuntimeFreezeReason = FreezeReasonId; + type FreezeIdentifier = FreezeReasonId; + type MaxFreezes = VariantCountOf; } parameter_types! { @@ -743,8 +755,12 @@ fn validate_unsigned() { fn can_not_pay_for_tx_fee_on_full_lock() { let mut t = new_test_ext(1); t.execute_with(|| { - as fungible::MutateFreeze>::set_freeze(&(), &1, 110) - .unwrap(); + as fungible::MutateFreeze>::set_freeze( + &FreezeReasonId::Foo, + &1, + 110, + ) + .unwrap(); let xt = TestXt::new( RuntimeCall::System(frame_system::Call::remark { remark: vec![1u8] }), sign_extra(1, 0, 0), diff --git a/substrate/frame/fast-unstake/src/mock.rs b/substrate/frame/fast-unstake/src/mock.rs index 9238a085141..63bf533d8ee 100644 --- a/substrate/frame/fast-unstake/src/mock.rs +++ b/substrate/frame/fast-unstake/src/mock.rs @@ -60,20 +60,11 @@ parameter_types! { pub static ExistentialDeposit: Balance = 1; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<128>; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } pallet_staking_reward_curve::build! { diff --git a/substrate/frame/grandpa/src/mock.rs b/substrate/frame/grandpa/src/mock.rs index 38b5536bc59..5642ffe8998 100644 --- a/substrate/frame/grandpa/src/mock.rs +++ b/substrate/frame/grandpa/src/mock.rs @@ -108,20 +108,11 @@ impl pallet_authorship::Config for Test { type EventHandler = (); } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = u128; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ConstU128<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl pallet_timestamp::Config for Test { diff --git a/substrate/frame/identity/src/tests.rs b/substrate/frame/identity/src/tests.rs index b1a953d487c..09edd5de79b 100644 --- a/substrate/frame/identity/src/tests.rs +++ b/substrate/frame/identity/src/tests.rs @@ -61,20 +61,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { diff --git a/substrate/frame/indices/src/mock.rs b/substrate/frame/indices/src/mock.rs index 7a8ff98f6d4..72bbc6dab4a 100644 --- a/substrate/frame/indices/src/mock.rs +++ b/substrate/frame/indices/src/mock.rs @@ -42,20 +42,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl Config for Test { diff --git a/substrate/frame/lottery/src/mock.rs b/substrate/frame/lottery/src/mock.rs index 596e1a9d837..d2c442e2ac6 100644 --- a/substrate/frame/lottery/src/mock.rs +++ b/substrate/frame/lottery/src/mock.rs @@ -22,7 +22,7 @@ use crate as pallet_lottery; use frame_support::{ derive_impl, parameter_types, - traits::{ConstU32, ConstU64, OnFinalize, OnInitialize}, + traits::{ConstU32, OnFinalize, OnInitialize}, }; use frame_support_test::TestRandomness; use frame_system::EnsureRoot; @@ -49,20 +49,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { diff --git a/substrate/frame/nft-fractionalization/src/mock.rs b/substrate/frame/nft-fractionalization/src/mock.rs index 82a60881626..50b41b5fc64 100644 --- a/substrate/frame/nft-fractionalization/src/mock.rs +++ b/substrate/frame/nft-fractionalization/src/mock.rs @@ -57,20 +57,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = (); } impl pallet_assets::Config for Test { diff --git a/substrate/frame/nfts/src/mock.rs b/substrate/frame/nfts/src/mock.rs index 51cfd5f244b..5b589f591ca 100644 --- a/substrate/frame/nfts/src/mock.rs +++ b/substrate/frame/nfts/src/mock.rs @@ -53,20 +53,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { diff --git a/substrate/frame/nomination-pools/benchmarking/src/mock.rs b/substrate/frame/nomination-pools/benchmarking/src/mock.rs index 7cbb61e00a3..b9cff796071 100644 --- a/substrate/frame/nomination-pools/benchmarking/src/mock.rs +++ b/substrate/frame/nomination-pools/benchmarking/src/mock.rs @@ -17,7 +17,13 @@ use crate::VoterBagsListInstance; use frame_election_provider_support::VoteWeight; -use frame_support::{derive_impl, pallet_prelude::*, parameter_types, traits::ConstU64, PalletId}; +use frame_support::{ + derive_impl, + pallet_prelude::*, + parameter_types, + traits::{ConstU64, VariantCountOf}, + PalletId, +}; use sp_runtime::{ traits::{Convert, IdentityLookup}, BuildStorage, FixedU128, Perbill, @@ -45,20 +51,16 @@ impl pallet_timestamp::Config for Runtime { parameter_types! { pub const ExistentialDeposit: Balance = 10; } + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); type FreezeIdentifier = RuntimeFreezeReason; - type MaxFreezes = ConstU32<1>; + type MaxFreezes = VariantCountOf; type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = (); + type RuntimeFreezeReason = RuntimeFreezeReason; } pallet_staking_reward_curve::build! { diff --git a/substrate/frame/nomination-pools/src/mock.rs b/substrate/frame/nomination-pools/src/mock.rs index 93fe6aa5605..6c0082073f6 100644 --- a/substrate/frame/nomination-pools/src/mock.rs +++ b/substrate/frame/nomination-pools/src/mock.rs @@ -18,7 +18,8 @@ use super::*; use crate::{self as pools}; use frame_support::{ - assert_ok, derive_impl, ord_parameter_types, parameter_types, traits::fungible::Mutate, + assert_ok, derive_impl, ord_parameter_types, parameter_types, + traits::{fungible::Mutate, VariantCountOf}, PalletId, }; use frame_system::{EnsureSignedBy, RawOrigin}; @@ -251,20 +252,14 @@ parameter_types! { pub static ExistentialDeposit: Balance = 5; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = frame_support::traits::ConstU32<1024>; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); type FreezeIdentifier = RuntimeFreezeReason; - type MaxFreezes = ConstU32<1>; - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); + type MaxFreezes = VariantCountOf; + type RuntimeFreezeReason = RuntimeFreezeReason; } pub struct BalanceToU256; diff --git a/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs b/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs index 820f2b7718c..0a456503ad8 100644 --- a/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs +++ b/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs @@ -20,7 +20,7 @@ use frame_support::{ assert_ok, derive_impl, pallet_prelude::*, parameter_types, - traits::{ConstU64, ConstU8}, + traits::{ConstU64, ConstU8, VariantCountOf}, PalletId, }; use frame_system::EnsureRoot; @@ -63,20 +63,15 @@ parameter_types! { pub static ExistentialDeposit: Balance = 5; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); type FreezeIdentifier = RuntimeFreezeReason; - type MaxFreezes = ConstU32<1>; + type MaxFreezes = VariantCountOf; type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = (); + type RuntimeFreezeReason = RuntimeFreezeReason; } pallet_staking_reward_curve::build! { diff --git a/substrate/frame/nomination-pools/test-transfer-stake/src/mock.rs b/substrate/frame/nomination-pools/test-transfer-stake/src/mock.rs index eb9d463424c..570cdea9046 100644 --- a/substrate/frame/nomination-pools/test-transfer-stake/src/mock.rs +++ b/substrate/frame/nomination-pools/test-transfer-stake/src/mock.rs @@ -20,7 +20,7 @@ use frame_support::{ assert_ok, derive_impl, pallet_prelude::*, parameter_types, - traits::{ConstU64, ConstU8}, + traits::{ConstU64, ConstU8, VariantCountOf}, PalletId, }; use sp_runtime::{ @@ -56,20 +56,14 @@ parameter_types! { pub static ExistentialDeposit: Balance = 5; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); type FreezeIdentifier = RuntimeFreezeReason; - type MaxFreezes = ConstU32<1>; - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); + type MaxFreezes = VariantCountOf; + type RuntimeFreezeReason = RuntimeFreezeReason; } pallet_staking_reward_curve::build! { diff --git a/substrate/frame/offences/benchmarking/src/mock.rs b/substrate/frame/offences/benchmarking/src/mock.rs index 6cbdde57852..e45d280ba52 100644 --- a/substrate/frame/offences/benchmarking/src/mock.rs +++ b/substrate/frame/offences/benchmarking/src/mock.rs @@ -41,20 +41,10 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = ConstU32<128>; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ConstU64<10>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl pallet_timestamp::Config for Test { diff --git a/substrate/frame/parameters/src/tests/mock.rs b/substrate/frame/parameters/src/tests/mock.rs index 6cfd7c8f30b..53a3b3e394c 100644 --- a/substrate/frame/parameters/src/tests/mock.rs +++ b/substrate/frame/parameters/src/tests/mock.rs @@ -37,7 +37,6 @@ impl frame_system::Config for Runtime { #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type ReserveIdentifier = [u8; 8]; type AccountStore = System; } diff --git a/substrate/frame/parameters/src/tests/test_renamed.rs b/substrate/frame/parameters/src/tests/test_renamed.rs index cfc870fbe10..7c371c5e55f 100644 --- a/substrate/frame/parameters/src/tests/test_renamed.rs +++ b/substrate/frame/parameters/src/tests/test_renamed.rs @@ -39,7 +39,6 @@ impl frame_system::Config for Runtime { #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type ReserveIdentifier = [u8; 8]; type AccountStore = System; } diff --git a/substrate/frame/preimage/src/mock.rs b/substrate/frame/preimage/src/mock.rs index 903c34596ae..9c72d09cae1 100644 --- a/substrate/frame/preimage/src/mock.rs +++ b/substrate/frame/preimage/src/mock.rs @@ -22,7 +22,7 @@ use super::*; use crate as pallet_preimage; use frame_support::{ derive_impl, ord_parameter_types, parameter_types, - traits::{fungible::HoldConsideration, ConstU32, ConstU64}, + traits::{fungible::HoldConsideration, ConstU64}, }; use frame_system::EnsureSignedBy; use sp_core::H256; @@ -48,20 +48,10 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ConstU64<5>; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = (); } ord_parameter_types! { diff --git a/substrate/frame/recovery/src/mock.rs b/substrate/frame/recovery/src/mock.rs index bec7e02c128..8e30cbe997e 100644 --- a/substrate/frame/recovery/src/mock.rs +++ b/substrate/frame/recovery/src/mock.rs @@ -47,20 +47,11 @@ parameter_types! { pub const ExistentialDeposit: u64 = 1; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = u128; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { diff --git a/substrate/frame/referenda/src/mock.rs b/substrate/frame/referenda/src/mock.rs index 135476d7cb1..d47da455811 100644 --- a/substrate/frame/referenda/src/mock.rs +++ b/substrate/frame/referenda/src/mock.rs @@ -83,20 +83,9 @@ impl pallet_scheduler::Config for Test { type OriginPrivilegeCmp = EqualPrivilegeOnly; type Preimages = Preimage; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type MaxLocks = ConstU32<10>; - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { pub static AlarmInterval: u64 = 1; diff --git a/substrate/frame/root-offences/src/mock.rs b/substrate/frame/root-offences/src/mock.rs index 7e7332c3f7e..ea7044fb6a3 100644 --- a/substrate/frame/root-offences/src/mock.rs +++ b/substrate/frame/root-offences/src/mock.rs @@ -84,20 +84,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } pallet_staking_reward_curve::build! { diff --git a/substrate/frame/safe-mode/src/mock.rs b/substrate/frame/safe-mode/src/mock.rs index 0beb911267d..ec1ad824951 100644 --- a/substrate/frame/safe-mode/src/mock.rs +++ b/substrate/frame/safe-mode/src/mock.rs @@ -68,20 +68,10 @@ pub enum HoldReason { SafeMode, } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ConstU64<2>; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = ConstU32<10>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; } impl pallet_utility::Config for Test { diff --git a/substrate/frame/scored-pool/src/mock.rs b/substrate/frame/scored-pool/src/mock.rs index 9d2f5eb1099..7708c06e56b 100644 --- a/substrate/frame/scored-pool/src/mock.rs +++ b/substrate/frame/scored-pool/src/mock.rs @@ -52,20 +52,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { diff --git a/substrate/frame/session/benchmarking/src/mock.rs b/substrate/frame/session/benchmarking/src/mock.rs index 5cba79ef5b9..b79bae73270 100644 --- a/substrate/frame/session/benchmarking/src/mock.rs +++ b/substrate/frame/session/benchmarking/src/mock.rs @@ -54,20 +54,10 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ConstU64<10>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl pallet_timestamp::Config for Test { diff --git a/substrate/frame/staking/src/mock.rs b/substrate/frame/staking/src/mock.rs index 8c60dec65a8..6d65500ef90 100644 --- a/substrate/frame/staking/src/mock.rs +++ b/substrate/frame/staking/src/mock.rs @@ -124,20 +124,12 @@ impl frame_system::Config for Test { type Block = Block; type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { type MaxLocks = frame_support::traits::ConstU32<1024>; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } sp_runtime::impl_opaque_keys! { diff --git a/substrate/frame/statement/src/mock.rs b/substrate/frame/statement/src/mock.rs index 35d51e7a27b..34afd332c08 100644 --- a/substrate/frame/statement/src/mock.rs +++ b/substrate/frame/statement/src/mock.rs @@ -51,20 +51,10 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ConstU64<5>; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; } ord_parameter_types! { diff --git a/substrate/frame/support/test/tests/runtime_legacy_ordering.rs b/substrate/frame/support/test/tests/runtime_legacy_ordering.rs index 5b74cc172c6..6330a138e2f 100644 --- a/substrate/frame/support/test/tests/runtime_legacy_ordering.rs +++ b/substrate/frame/support/test/tests/runtime_legacy_ordering.rs @@ -340,7 +340,7 @@ mod runtime { pub type Module1_9 = module1; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type AccountId = AccountId; type Lookup = sp_runtime::traits::IdentityLookup; diff --git a/substrate/frame/tips/src/tests.rs b/substrate/frame/tips/src/tests.rs index 78df3736815..32a31b7fa13 100644 --- a/substrate/frame/tips/src/tests.rs +++ b/substrate/frame/tips/src/tests.rs @@ -65,20 +65,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { static TenToFourteenTestValue: Vec = vec![10,11,12,13,14]; diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs index cc43cffd7de..3f8c7bc0ea3 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs @@ -98,20 +98,10 @@ parameter_types! { pub const ExistentialDeposit: u64 = 10; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ConstU64<10>; type AccountStore = System; - type MaxLocks = (); - type WeightInfo = (); - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl WeightToFeeT for WeightToFee { diff --git a/substrate/frame/transaction-payment/asset-tx-payment/src/mock.rs b/substrate/frame/transaction-payment/asset-tx-payment/src/mock.rs index fce712c3eba..e84df1e4eb9 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/asset-tx-payment/src/mock.rs @@ -81,20 +81,10 @@ parameter_types! { pub const ExistentialDeposit: u64 = 10; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); type ExistentialDeposit = ConstU64<10>; type AccountStore = System; - type MaxLocks = (); - type WeightInfo = (); - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl WeightToFeeT for WeightToFee { diff --git a/substrate/frame/transaction-payment/src/mock.rs b/substrate/frame/transaction-payment/src/mock.rs index 7b731eeb825..fa61572e983 100644 --- a/substrate/frame/transaction-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/src/mock.rs @@ -21,7 +21,7 @@ use frame_support::{ derive_impl, dispatch::DispatchClass, parameter_types, - traits::{fungible, ConstU64, Imbalance, OnUnbalanced}, + traits::{fungible, Imbalance, OnUnbalanced}, weights::{Weight, WeightToFee as WeightToFeeT}, }; use frame_system as system; @@ -73,20 +73,9 @@ impl frame_system::Config for Runtime { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl WeightToFeeT for WeightToFee { diff --git a/substrate/frame/treasury/src/tests.rs b/substrate/frame/treasury/src/tests.rs index 67d81cb5c30..e8b9270cd96 100644 --- a/substrate/frame/treasury/src/tests.rs +++ b/substrate/frame/treasury/src/tests.rs @@ -60,20 +60,10 @@ impl frame_system::Config for Test { type Block = Block; type AccountData = pallet_balances::AccountData; } + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl pallet_utility::Config for Test { diff --git a/substrate/frame/tx-pause/src/mock.rs b/substrate/frame/tx-pause/src/mock.rs index f42d4cb58a2..84ce45e8352 100644 --- a/substrate/frame/tx-pause/src/mock.rs +++ b/substrate/frame/tx-pause/src/mock.rs @@ -36,24 +36,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } -parameter_types! { - pub const ExistentialDeposit: u64 = 1; - pub const MaxLocks: u32 = 10; -} +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = MaxLocks; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type FreezeIdentifier = (); - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type MaxFreezes = ConstU32<0>; } impl pallet_utility::Config for Test { diff --git a/substrate/frame/uniques/src/mock.rs b/substrate/frame/uniques/src/mock.rs index 9fd7f87e159..c3b74eb8c25 100644 --- a/substrate/frame/uniques/src/mock.rs +++ b/substrate/frame/uniques/src/mock.rs @@ -43,20 +43,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl Config for Test { diff --git a/substrate/frame/utility/src/tests.rs b/substrate/frame/utility/src/tests.rs index 9bcbec99f3b..eb2047aac28 100644 --- a/substrate/frame/utility/src/tests.rs +++ b/substrate/frame/utility/src/tests.rs @@ -151,20 +151,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl pallet_root_testing::Config for Test { diff --git a/substrate/frame/vesting/src/mock.rs b/substrate/frame/vesting/src/mock.rs index 674a6f6e2a8..f0954a5b989 100644 --- a/substrate/frame/vesting/src/mock.rs +++ b/substrate/frame/vesting/src/mock.rs @@ -15,10 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use frame_support::{ - derive_impl, parameter_types, - traits::{ConstU32, WithdrawReasons}, -}; +use frame_support::{derive_impl, parameter_types, traits::WithdrawReasons}; use sp_runtime::{traits::Identity, BuildStorage}; use super::*; @@ -41,20 +38,10 @@ impl frame_system::Config for Test { type Block = Block; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { type AccountStore = System; - type Balance = u64; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; type ExistentialDeposit = ExistentialDeposit; - type MaxLocks = ConstU32<10>; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } parameter_types! { pub const MinVestedTransfer: u64 = 256 * 2; diff --git a/substrate/frame/whitelist/src/mock.rs b/substrate/frame/whitelist/src/mock.rs index 6fb8711057e..0a97d1c2df5 100644 --- a/substrate/frame/whitelist/src/mock.rs +++ b/substrate/frame/whitelist/src/mock.rs @@ -21,7 +21,7 @@ use crate as pallet_whitelist; -use frame_support::{construct_runtime, derive_impl, traits::ConstU64}; +use frame_support::{construct_runtime, derive_impl}; use frame_system::EnsureRoot; use sp_runtime::BuildStorage; @@ -43,20 +43,9 @@ impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; } +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; type AccountStore = System; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); } impl pallet_preimage::Config for Test { diff --git a/templates/parachain/runtime/src/configs/mod.rs b/templates/parachain/runtime/src/configs/mod.rs index 63e6a67a906..8a410a27e4a 100644 --- a/templates/parachain/runtime/src/configs/mod.rs +++ b/templates/parachain/runtime/src/configs/mod.rs @@ -32,7 +32,9 @@ use frame_support::{ derive_impl, dispatch::DispatchClass, parameter_types, - traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, TransformOrigin}, + traits::{ + ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, TransformOrigin, VariantCountOf, + }, weights::{ConstantMultiplier, Weight}, PalletId, }; @@ -154,8 +156,8 @@ impl pallet_balances::Config for Runtime { type ReserveIdentifier = [u8; 8]; type RuntimeHoldReason = RuntimeHoldReason; type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; + type FreezeIdentifier = RuntimeFreezeReason; + type MaxFreezes = VariantCountOf; } parameter_types! { diff --git a/templates/solochain/runtime/src/lib.rs b/templates/solochain/runtime/src/lib.rs index 93a56fb0ad7..c147845fe2f 100644 --- a/templates/solochain/runtime/src/lib.rs +++ b/templates/solochain/runtime/src/lib.rs @@ -18,7 +18,6 @@ use sp_std::prelude::*; use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use frame_support::genesis_builder_helper::{build_state, get_preset}; pub use frame_support::{ construct_runtime, derive_impl, parameter_types, traits::{ @@ -33,6 +32,10 @@ pub use frame_support::{ }, StorageValue, }; +use frame_support::{ + genesis_builder_helper::{build_state, get_preset}, + traits::VariantCountOf, +}; pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; pub use pallet_timestamp::Call as TimestampCall; @@ -218,10 +221,10 @@ impl pallet_balances::Config for Runtime { type ExistentialDeposit = ConstU128; type AccountStore = System; type WeightInfo = pallet_balances::weights::SubstrateWeight; - type FreezeIdentifier = (); - type MaxFreezes = (); - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); + type FreezeIdentifier = RuntimeFreezeReason; + type MaxFreezes = VariantCountOf; + type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeHoldReason; } parameter_types! { -- GitLab From 935c7f461ae8b4e607f1db16322ea952b438650e Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 13 Jun 2024 13:53:07 +0200 Subject: [PATCH 004/130] Add `--version` to the `ChainSpecBuilder` command for `staging-chain-spec-builder` (#4752) ## TODO - [x] test/confirm that the release script is ok --------- Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> Co-authored-by: Egor_P --- .../release-30_publish_release_draft.yml | 20 ++++++++----------- .../bin/utils/chain-spec-builder/src/lib.rs | 2 +- substrate/utils/frame/omni-bencher/Cargo.toml | 2 +- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/.github/workflows/release-30_publish_release_draft.yml b/.github/workflows/release-30_publish_release_draft.yml index f39eb4c1716..20492f2d3a9 100644 --- a/.github/workflows/release-30_publish_release_draft.yml +++ b/.github/workflows/release-30_publish_release_draft.yml @@ -31,7 +31,8 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - binary: [ frame-omni-bencher, chain-spec-builder ] + # Tuples of [package, binary-name] + binary: [ [frame-omni-bencher, frame-omni-bencher], [staging-chain-spec-builder, chain-spec-builder] ] steps: - name: Checkout sources uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 @@ -41,21 +42,16 @@ jobs: sudo apt update sudo apt install -y protobuf-compiler - - name: Build ${{ matrix.binary }} binary + - name: Build ${{ matrix.binary[1] }} binary run: | - if [[ ${{ matrix.binary }} =~ chain-spec-builder ]]; then - cargo build --locked --profile=production -p staging-${{ matrix.binary }} --bin ${{ matrix.binary }} - target/production/${{ matrix.binary }} -h - else - cargo build --locked --profile=production -p ${{ matrix.binary }} - target/production/${{ matrix.binary }} --version - fi + cargo build --locked --profile=production -p ${{ matrix.binary[0] }} --bin ${{ matrix.binary[1] }} + target/production/${{ matrix.binary[1] }} --version - - name: Upload ${{ matrix.binary }} binary + - name: Upload ${{ matrix.binary[1] }} binary uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: - name: ${{ matrix.binary }} - path: target/production/${{ matrix.binary }} + name: ${{ matrix.binary[1] }} + path: target/production/${{ matrix.binary[1] }} publish-release-draft: diff --git a/substrate/bin/utils/chain-spec-builder/src/lib.rs b/substrate/bin/utils/chain-spec-builder/src/lib.rs index 0f7c003fc8c..4c00bb3551b 100644 --- a/substrate/bin/utils/chain-spec-builder/src/lib.rs +++ b/substrate/bin/utils/chain-spec-builder/src/lib.rs @@ -125,7 +125,7 @@ use serde_json::Value; /// A utility to easily create a chain spec definition. #[derive(Debug, Parser)] -#[command(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case", version, about)] pub struct ChainSpecBuilder { #[command(subcommand)] pub command: ChainSpecBuilderCmd, diff --git a/substrate/utils/frame/omni-bencher/Cargo.toml b/substrate/utils/frame/omni-bencher/Cargo.toml index 0c2d1a1b32b..41e3882c9d7 100644 --- a/substrate/utils/frame/omni-bencher/Cargo.toml +++ b/substrate/utils/frame/omni-bencher/Cargo.toml @@ -11,7 +11,7 @@ license.workspace = true workspace = true [dependencies] -clap = { version = "4.5.2", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } cumulus-primitives-proof-size-hostfunction = { path = "../../../../cumulus/primitives/proof-size-hostfunction" } frame-benchmarking-cli = { path = "../benchmarking-cli", default-features = false } sc-cli = { path = "../../../client/cli" } -- GitLab From 7b6b783cd1a3953ef5fa6e53f3965b1454e3efc8 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Thu, 13 Jun 2024 18:27:51 +0200 Subject: [PATCH 005/130] [Backport] Version bumps and prdoc reorg from 1.13.0 (#4784) This PR backports regular version bumps and prdocs reordering from the release branch back to master --- cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs | 2 +- cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs | 2 +- .../runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs | 2 +- .../runtimes/collectives/collectives-westend/src/lib.rs | 2 +- .../parachains/runtimes/contracts/contracts-rococo/src/lib.rs | 2 +- cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs | 2 +- .../parachains/runtimes/coretime/coretime-westend/src/lib.rs | 2 +- cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs | 2 +- cumulus/parachains/runtimes/people/people-rococo/src/lib.rs | 2 +- cumulus/parachains/runtimes/people/people-westend/src/lib.rs | 2 +- cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs | 2 +- polkadot/node/primitives/src/lib.rs | 2 +- polkadot/runtime/rococo/src/lib.rs | 2 +- polkadot/runtime/westend/src/lib.rs | 2 +- prdoc/{ => 1.13.0}/pr_1223.prdoc | 0 prdoc/{ => 1.13.0}/pr_1644.prdoc | 0 prdoc/{ => 1.13.0}/pr_3393.prdoc | 0 prdoc/{ => 1.13.0}/pr_3905.prdoc | 0 prdoc/{ => 1.13.0}/pr_3935.prdoc | 0 prdoc/{ => 1.13.0}/pr_3952.prdoc | 0 prdoc/{ => 1.13.0}/pr_4131.prdoc | 0 prdoc/{ => 1.13.0}/pr_4198.prdoc | 0 prdoc/{ => 1.13.0}/pr_4233.prdoc | 0 prdoc/{ => 1.13.0}/pr_4249.prdoc | 0 prdoc/{ => 1.13.0}/pr_4274.prdoc | 0 prdoc/{ => 1.13.0}/pr_4339.prdoc | 0 prdoc/{ => 1.13.0}/pr_4380.prdoc | 0 prdoc/{ => 1.13.0}/pr_4392.prdoc | 0 prdoc/{ => 1.13.0}/pr_4410.prdoc | 0 prdoc/{ => 1.13.0}/pr_4418.prdoc | 0 prdoc/{ => 1.13.0}/pr_4431.prdoc | 0 prdoc/{ => 1.13.0}/pr_4444.prdoc | 0 prdoc/{ => 1.13.0}/pr_4465.prdoc | 0 prdoc/{ => 1.13.0}/pr_4471.prdoc | 0 prdoc/{ => 1.13.0}/pr_4472.prdoc | 0 prdoc/{ => 1.13.0}/pr_4475.prdoc | 0 prdoc/{ => 1.13.0}/pr_4478.prdoc | 0 prdoc/{ => 1.13.0}/pr_4503.prdoc | 0 prdoc/{ => 1.13.0}/pr_4510.prdoc | 0 prdoc/{ => 1.13.0}/pr_4514.prdoc | 0 prdoc/{ => 1.13.0}/pr_4521.prdoc | 0 prdoc/{ => 1.13.0}/pr_4533.prdoc | 0 prdoc/{ => 1.13.0}/pr_4534.prdoc | 0 prdoc/{ => 1.13.0}/pr_4537.prdoc | 0 prdoc/{ => 1.13.0}/pr_4541.prdoc | 0 prdoc/{ => 1.13.0}/pr_4542.prdoc | 0 prdoc/{ => 1.13.0}/pr_4555.prdoc | 0 prdoc/{ => 1.13.0}/pr_4571.prdoc | 0 prdoc/{ => 1.13.0}/pr_4595.prdoc | 0 prdoc/{ => 1.13.0}/pr_4621.prdoc | 0 prdoc/{ => 1.13.0}/pr_4633.prdoc | 0 prdoc/{ => 1.13.0}/pr_4634.prdoc | 0 prdoc/{ => 1.13.0}/pr_4645.prdoc | 0 prdoc/{ => 1.13.0}/pr_4646.prdoc | 0 prdoc/{ => 1.13.0}/pr_4721.prdoc | 0 56 files changed, 15 insertions(+), 15 deletions(-) rename prdoc/{ => 1.13.0}/pr_1223.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_1644.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_3393.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_3905.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_3935.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_3952.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4131.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4198.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4233.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4249.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4274.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4339.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4380.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4392.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4410.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4418.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4431.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4444.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4465.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4471.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4472.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4475.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4478.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4503.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4510.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4514.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4521.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4533.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4534.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4537.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4541.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4542.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4555.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4571.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4595.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4621.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4633.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4634.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4645.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4646.prdoc (100%) rename prdoc/{ => 1.13.0}/pr_4721.prdoc (100%) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index d75b07bd2b9..5bba1b568d9 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -118,7 +118,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 16, diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index e9c2b10f719..dcf9565f330 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -117,7 +117,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 16, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index e7868bcbc78..12707d78550 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -214,7 +214,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-rococo"), impl_name: create_runtime_str!("bridge-hub-rococo"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index e26d490f9ac..6b2d67e29c4 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -189,7 +189,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-westend"), impl_name: create_runtime_str!("bridge-hub-westend"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index 5fce8e50954..1d3b8c4581a 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -122,7 +122,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("collectives-westend"), impl_name: create_runtime_str!("collectives-westend"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 2d346e66c6c..59aae99d6a1 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -142,7 +142,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("contracts-rococo"), impl_name: create_runtime_str!("contracts-rococo"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 7, diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index b3eaf3d127a..522ee574176 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -142,7 +142,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-rococo"), impl_name: create_runtime_str!("coretime-rococo"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs index 6c22702ce87..8830f1a42a2 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -141,7 +141,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-westend"), impl_name: create_runtime_str!("coretime-westend"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs index 4092fb78594..910f7569bf9 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs @@ -100,7 +100,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("glutton-westend"), impl_name: create_runtime_str!("glutton-westend"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs index c80f6879fb3..bd189c31114 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -132,7 +132,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-rococo"), impl_name: create_runtime_str!("people-rococo"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs index 06c938b8a40..f071a5f0c9b 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs @@ -132,7 +132,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-westend"), impl_name: create_runtime_str!("people-westend"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index fd4716ab972..bf45b437f8b 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -107,7 +107,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("test-parachain"), impl_name: create_runtime_str!("test-parachain"), authoring_version: 1, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/polkadot/node/primitives/src/lib.rs b/polkadot/node/primitives/src/lib.rs index aded1b8fe73..ecf79eac288 100644 --- a/polkadot/node/primitives/src/lib.rs +++ b/polkadot/node/primitives/src/lib.rs @@ -59,7 +59,7 @@ pub use disputes::{ /// relatively rare. /// /// The associated worker binaries should use the same version as the node that spawns them. -pub const NODE_VERSION: &'static str = "1.12.0"; +pub const NODE_VERSION: &'static str = "1.13.0"; // For a 16-ary Merkle Prefix Trie, we can expect at most 16 32-byte hashes per node // plus some overhead: diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 91ca5eb5e31..ebdcdd0cbed 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -162,7 +162,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("rococo"), impl_name: create_runtime_str!("parity-rococo-v2.0"), authoring_version: 0, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 26, diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 511b502fea4..c8b1826b476 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -154,7 +154,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 1_012_000, + spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 26, diff --git a/prdoc/pr_1223.prdoc b/prdoc/1.13.0/pr_1223.prdoc similarity index 100% rename from prdoc/pr_1223.prdoc rename to prdoc/1.13.0/pr_1223.prdoc diff --git a/prdoc/pr_1644.prdoc b/prdoc/1.13.0/pr_1644.prdoc similarity index 100% rename from prdoc/pr_1644.prdoc rename to prdoc/1.13.0/pr_1644.prdoc diff --git a/prdoc/pr_3393.prdoc b/prdoc/1.13.0/pr_3393.prdoc similarity index 100% rename from prdoc/pr_3393.prdoc rename to prdoc/1.13.0/pr_3393.prdoc diff --git a/prdoc/pr_3905.prdoc b/prdoc/1.13.0/pr_3905.prdoc similarity index 100% rename from prdoc/pr_3905.prdoc rename to prdoc/1.13.0/pr_3905.prdoc diff --git a/prdoc/pr_3935.prdoc b/prdoc/1.13.0/pr_3935.prdoc similarity index 100% rename from prdoc/pr_3935.prdoc rename to prdoc/1.13.0/pr_3935.prdoc diff --git a/prdoc/pr_3952.prdoc b/prdoc/1.13.0/pr_3952.prdoc similarity index 100% rename from prdoc/pr_3952.prdoc rename to prdoc/1.13.0/pr_3952.prdoc diff --git a/prdoc/pr_4131.prdoc b/prdoc/1.13.0/pr_4131.prdoc similarity index 100% rename from prdoc/pr_4131.prdoc rename to prdoc/1.13.0/pr_4131.prdoc diff --git a/prdoc/pr_4198.prdoc b/prdoc/1.13.0/pr_4198.prdoc similarity index 100% rename from prdoc/pr_4198.prdoc rename to prdoc/1.13.0/pr_4198.prdoc diff --git a/prdoc/pr_4233.prdoc b/prdoc/1.13.0/pr_4233.prdoc similarity index 100% rename from prdoc/pr_4233.prdoc rename to prdoc/1.13.0/pr_4233.prdoc diff --git a/prdoc/pr_4249.prdoc b/prdoc/1.13.0/pr_4249.prdoc similarity index 100% rename from prdoc/pr_4249.prdoc rename to prdoc/1.13.0/pr_4249.prdoc diff --git a/prdoc/pr_4274.prdoc b/prdoc/1.13.0/pr_4274.prdoc similarity index 100% rename from prdoc/pr_4274.prdoc rename to prdoc/1.13.0/pr_4274.prdoc diff --git a/prdoc/pr_4339.prdoc b/prdoc/1.13.0/pr_4339.prdoc similarity index 100% rename from prdoc/pr_4339.prdoc rename to prdoc/1.13.0/pr_4339.prdoc diff --git a/prdoc/pr_4380.prdoc b/prdoc/1.13.0/pr_4380.prdoc similarity index 100% rename from prdoc/pr_4380.prdoc rename to prdoc/1.13.0/pr_4380.prdoc diff --git a/prdoc/pr_4392.prdoc b/prdoc/1.13.0/pr_4392.prdoc similarity index 100% rename from prdoc/pr_4392.prdoc rename to prdoc/1.13.0/pr_4392.prdoc diff --git a/prdoc/pr_4410.prdoc b/prdoc/1.13.0/pr_4410.prdoc similarity index 100% rename from prdoc/pr_4410.prdoc rename to prdoc/1.13.0/pr_4410.prdoc diff --git a/prdoc/pr_4418.prdoc b/prdoc/1.13.0/pr_4418.prdoc similarity index 100% rename from prdoc/pr_4418.prdoc rename to prdoc/1.13.0/pr_4418.prdoc diff --git a/prdoc/pr_4431.prdoc b/prdoc/1.13.0/pr_4431.prdoc similarity index 100% rename from prdoc/pr_4431.prdoc rename to prdoc/1.13.0/pr_4431.prdoc diff --git a/prdoc/pr_4444.prdoc b/prdoc/1.13.0/pr_4444.prdoc similarity index 100% rename from prdoc/pr_4444.prdoc rename to prdoc/1.13.0/pr_4444.prdoc diff --git a/prdoc/pr_4465.prdoc b/prdoc/1.13.0/pr_4465.prdoc similarity index 100% rename from prdoc/pr_4465.prdoc rename to prdoc/1.13.0/pr_4465.prdoc diff --git a/prdoc/pr_4471.prdoc b/prdoc/1.13.0/pr_4471.prdoc similarity index 100% rename from prdoc/pr_4471.prdoc rename to prdoc/1.13.0/pr_4471.prdoc diff --git a/prdoc/pr_4472.prdoc b/prdoc/1.13.0/pr_4472.prdoc similarity index 100% rename from prdoc/pr_4472.prdoc rename to prdoc/1.13.0/pr_4472.prdoc diff --git a/prdoc/pr_4475.prdoc b/prdoc/1.13.0/pr_4475.prdoc similarity index 100% rename from prdoc/pr_4475.prdoc rename to prdoc/1.13.0/pr_4475.prdoc diff --git a/prdoc/pr_4478.prdoc b/prdoc/1.13.0/pr_4478.prdoc similarity index 100% rename from prdoc/pr_4478.prdoc rename to prdoc/1.13.0/pr_4478.prdoc diff --git a/prdoc/pr_4503.prdoc b/prdoc/1.13.0/pr_4503.prdoc similarity index 100% rename from prdoc/pr_4503.prdoc rename to prdoc/1.13.0/pr_4503.prdoc diff --git a/prdoc/pr_4510.prdoc b/prdoc/1.13.0/pr_4510.prdoc similarity index 100% rename from prdoc/pr_4510.prdoc rename to prdoc/1.13.0/pr_4510.prdoc diff --git a/prdoc/pr_4514.prdoc b/prdoc/1.13.0/pr_4514.prdoc similarity index 100% rename from prdoc/pr_4514.prdoc rename to prdoc/1.13.0/pr_4514.prdoc diff --git a/prdoc/pr_4521.prdoc b/prdoc/1.13.0/pr_4521.prdoc similarity index 100% rename from prdoc/pr_4521.prdoc rename to prdoc/1.13.0/pr_4521.prdoc diff --git a/prdoc/pr_4533.prdoc b/prdoc/1.13.0/pr_4533.prdoc similarity index 100% rename from prdoc/pr_4533.prdoc rename to prdoc/1.13.0/pr_4533.prdoc diff --git a/prdoc/pr_4534.prdoc b/prdoc/1.13.0/pr_4534.prdoc similarity index 100% rename from prdoc/pr_4534.prdoc rename to prdoc/1.13.0/pr_4534.prdoc diff --git a/prdoc/pr_4537.prdoc b/prdoc/1.13.0/pr_4537.prdoc similarity index 100% rename from prdoc/pr_4537.prdoc rename to prdoc/1.13.0/pr_4537.prdoc diff --git a/prdoc/pr_4541.prdoc b/prdoc/1.13.0/pr_4541.prdoc similarity index 100% rename from prdoc/pr_4541.prdoc rename to prdoc/1.13.0/pr_4541.prdoc diff --git a/prdoc/pr_4542.prdoc b/prdoc/1.13.0/pr_4542.prdoc similarity index 100% rename from prdoc/pr_4542.prdoc rename to prdoc/1.13.0/pr_4542.prdoc diff --git a/prdoc/pr_4555.prdoc b/prdoc/1.13.0/pr_4555.prdoc similarity index 100% rename from prdoc/pr_4555.prdoc rename to prdoc/1.13.0/pr_4555.prdoc diff --git a/prdoc/pr_4571.prdoc b/prdoc/1.13.0/pr_4571.prdoc similarity index 100% rename from prdoc/pr_4571.prdoc rename to prdoc/1.13.0/pr_4571.prdoc diff --git a/prdoc/pr_4595.prdoc b/prdoc/1.13.0/pr_4595.prdoc similarity index 100% rename from prdoc/pr_4595.prdoc rename to prdoc/1.13.0/pr_4595.prdoc diff --git a/prdoc/pr_4621.prdoc b/prdoc/1.13.0/pr_4621.prdoc similarity index 100% rename from prdoc/pr_4621.prdoc rename to prdoc/1.13.0/pr_4621.prdoc diff --git a/prdoc/pr_4633.prdoc b/prdoc/1.13.0/pr_4633.prdoc similarity index 100% rename from prdoc/pr_4633.prdoc rename to prdoc/1.13.0/pr_4633.prdoc diff --git a/prdoc/pr_4634.prdoc b/prdoc/1.13.0/pr_4634.prdoc similarity index 100% rename from prdoc/pr_4634.prdoc rename to prdoc/1.13.0/pr_4634.prdoc diff --git a/prdoc/pr_4645.prdoc b/prdoc/1.13.0/pr_4645.prdoc similarity index 100% rename from prdoc/pr_4645.prdoc rename to prdoc/1.13.0/pr_4645.prdoc diff --git a/prdoc/pr_4646.prdoc b/prdoc/1.13.0/pr_4646.prdoc similarity index 100% rename from prdoc/pr_4646.prdoc rename to prdoc/1.13.0/pr_4646.prdoc diff --git a/prdoc/pr_4721.prdoc b/prdoc/1.13.0/pr_4721.prdoc similarity index 100% rename from prdoc/pr_4721.prdoc rename to prdoc/1.13.0/pr_4721.prdoc -- GitLab From 7f7f5fa857502b6e3649081abb6b53c3512bfedb Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Fri, 14 Jun 2024 09:29:04 +0300 Subject: [PATCH 006/130] `polkadot-parachain-bin`: small cosmetics and improvements (#4666) Related to: https://github.com/paritytech/polkadot-sdk/issues/5 A couple of cosmetics and improvements related to `polkadot-parachain-bin`: - Adding some convenience traits in order to avoid declaring long duplicate bounds - Specifically check if the runtime exposes `AuraApi` when executing `start_lookahead_aura_consensus()` - Some fixes for the `RelayChainCli`. Details in the commits description --- cumulus/polkadot-parachain/Cargo.toml | 2 +- cumulus/polkadot-parachain/src/cli.rs | 14 +- cumulus/polkadot-parachain/src/command.rs | 14 +- cumulus/polkadot-parachain/src/common/aura.rs | 68 +++++++ cumulus/polkadot-parachain/src/common/mod.rs | 67 +++++++ .../asset_hub_polkadot_aura.rs | 6 - .../src/fake_runtime_api/aura.rs | 6 - cumulus/polkadot-parachain/src/main.rs | 1 + cumulus/polkadot-parachain/src/service.rs | 177 +++++------------- substrate/client/service/src/config.rs | 2 +- 10 files changed, 192 insertions(+), 165 deletions(-) create mode 100644 cumulus/polkadot-parachain/src/common/aura.rs create mode 100644 cumulus/polkadot-parachain/src/common/mod.rs diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 639b8b3d4dc..890cf519916 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -18,6 +18,7 @@ path = "src/main.rs" async-trait = "0.1.79" clap = { version = "4.5.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.12" } +color-print = "0.3.4" futures = "0.3.28" hex-literal = "0.4.1" log = { workspace = true, default-features = true } @@ -111,7 +112,6 @@ cumulus-client-service = { path = "../client/service" } cumulus-primitives-aura = { path = "../primitives/aura" } cumulus-primitives-core = { path = "../primitives/core" } cumulus-relay-chain-interface = { path = "../client/relay-chain-interface" } -color-print = "0.3.4" [build-dependencies] substrate-build-script-utils = { path = "../../substrate/utils/build-script-utils" } diff --git a/cumulus/polkadot-parachain/src/cli.rs b/cumulus/polkadot-parachain/src/cli.rs index f7d2fd0f0be..fa4b4da1ba9 100644 --- a/cumulus/polkadot-parachain/src/cli.rs +++ b/cumulus/polkadot-parachain/src/cli.rs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . +use clap::{CommandFactory, FromArgMatches}; use std::path::PathBuf; /// Sub-commands supported by the collator. @@ -108,18 +109,19 @@ pub struct RelayChainCli { } impl RelayChainCli { - /// Parse the relay chain CLI parameters using the para chain `Configuration`. + /// Parse the relay chain CLI parameters using the parachain `Configuration`. pub fn new<'a>( para_config: &sc_service::Configuration, relay_chain_args: impl Iterator, ) -> Self { + let polkadot_cmd = polkadot_cli::RunCmd::command().no_binary_name(true); + let matches = polkadot_cmd.get_matches_from(relay_chain_args); + let base = FromArgMatches::from_arg_matches(&matches).unwrap_or_else(|e| e.exit()); + let extension = crate::chain_spec::Extensions::try_get(&*para_config.chain_spec); let chain_id = extension.map(|e| e.relay_chain.clone()); + let base_path = para_config.base_path.path().join("polkadot"); - Self { - base_path: Some(base_path), - chain_id, - base: clap::Parser::parse_from(relay_chain_args), - } + Self { base, chain_id, base_path: Some(base_path) } } } diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index 653ea3281f0..6b3f4b4cd0a 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -530,13 +530,9 @@ pub fn run() -> Result<()> { }), Some(Subcommand::PurgeChain(cmd)) => { let runner = cli.create_runner(cmd)?; + let polkadot_cli = RelayChainCli::new(runner.config(), cli.relaychain_args.iter()); runner.sync_run(|config| { - let polkadot_cli = RelayChainCli::new( - &config, - [RelayChainCli::executable_name()].iter().chain(cli.relaychain_args.iter()), - ); - let polkadot_config = SubstrateCli::create_configuration( &polkadot_cli, &polkadot_cli, @@ -603,6 +599,7 @@ pub fn run() -> Result<()> { Some(Subcommand::Key(cmd)) => Ok(cmd.run(&cli)?), None => { let runner = cli.create_runner(&cli.run.normalize())?; + let polkadot_cli = RelayChainCli::new(runner.config(), cli.relaychain_args.iter()); let collator_options = cli.run.collator_options(); runner.run_node_until_exit(|config| async move { @@ -648,11 +645,6 @@ pub fn run() -> Result<()> { .map(|e| e.para_id) .ok_or("Could not find parachain extension in chain-spec.")?; - let polkadot_cli = RelayChainCli::new( - &config, - [RelayChainCli::executable_name()].iter().chain(cli.relaychain_args.iter()), - ); - let id = ParaId::from(para_id); let parachain_account = @@ -667,7 +659,7 @@ pub fn run() -> Result<()> { info!("Parachain Account: {}", parachain_account); info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); - match polkadot_config.network.network_backend { + match config.network.network_backend { sc_network::config::NetworkBackendType::Libp2p => start_node::>( config, diff --git a/cumulus/polkadot-parachain/src/common/aura.rs b/cumulus/polkadot-parachain/src/common/aura.rs new file mode 100644 index 00000000000..9f72d847926 --- /dev/null +++ b/cumulus/polkadot-parachain/src/common/aura.rs @@ -0,0 +1,68 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Aura-related primitives for cumulus parachain collators. + +use codec::Codec; +use cumulus_primitives_aura::AuraUnincludedSegmentApi; +use cumulus_primitives_core::BlockT; +use sp_consensus_aura::AuraApi; +use sp_runtime::app_crypto::{AppCrypto, AppPair, AppSignature, Pair}; + +/// Convenience trait for defining the basic bounds of an `AuraId`. +pub trait AuraIdT: AppCrypto + Codec + Send { + /// Extra bounds for the `Pair`. + type BoundedPair: AppPair + AppCrypto; + + /// Extra bounds for the `Signature`. + type BoundedSignature: AppSignature + + TryFrom> + + std::hash::Hash + + sp_runtime::traits::Member + + Codec; +} + +impl AuraIdT for T +where + T: AppCrypto + Codec + Send + Sync, + <::Pair as AppCrypto>::Signature: + TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, +{ + type BoundedPair = ::Pair; + type BoundedSignature = <::Pair as AppCrypto>::Signature; +} + +/// Convenience trait for defining the basic bounds of a parachain runtime that supports +/// the Aura consensus. +pub trait AuraRuntimeApi: + sp_api::ApiExt + + AuraApi::Public> + + AuraUnincludedSegmentApi + + Sized +{ + /// Check if the runtime has the Aura API. + fn has_aura_api(&self, at: Block::Hash) -> bool { + self.has_api::::Public>>(at) + .unwrap_or(false) + } +} + +impl AuraRuntimeApi for T where + T: sp_api::ApiExt + + AuraApi::Public> + + AuraUnincludedSegmentApi +{ +} diff --git a/cumulus/polkadot-parachain/src/common/mod.rs b/cumulus/polkadot-parachain/src/common/mod.rs new file mode 100644 index 00000000000..5adbb4137cd --- /dev/null +++ b/cumulus/polkadot-parachain/src/common/mod.rs @@ -0,0 +1,67 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Cumulus parachain collator primitives. + +#![warn(missing_docs)] + +pub mod aura; + +use cumulus_primitives_core::CollectCollationInfo; +use sp_api::{ApiExt, CallApiAt, ConstructRuntimeApi, Metadata}; +use sp_block_builder::BlockBuilder; +use sp_runtime::traits::Block as BlockT; +use sp_session::SessionKeys; +use sp_transaction_pool::runtime_api::TaggedTransactionQueue; + +/// Convenience trait that defines the basic bounds for the `RuntimeApi` of a parachain node. +pub trait NodeRuntimeApi: + ApiExt + + Metadata + + SessionKeys + + BlockBuilder + + TaggedTransactionQueue + + CollectCollationInfo + + Sized +{ +} + +impl NodeRuntimeApi for T where + T: ApiExt + + Metadata + + SessionKeys + + BlockBuilder + + TaggedTransactionQueue + + CollectCollationInfo +{ +} + +/// Convenience trait that defines the basic bounds for the `ConstructRuntimeApi` of a parachain +/// node. +pub trait ConstructNodeRuntimeApi>: + ConstructRuntimeApi + Send + Sync + 'static +{ + /// Basic bounds for the `RuntimeApi` of a parachain node. + type BoundedRuntimeApi: NodeRuntimeApi; +} + +impl> ConstructNodeRuntimeApi for T +where + T: ConstructRuntimeApi + Send + Sync + 'static, + T::RuntimeApi: NodeRuntimeApi, +{ + type BoundedRuntimeApi = T::RuntimeApi; +} diff --git a/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs b/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs index 82c02943c5f..0b79d338c16 100644 --- a/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs +++ b/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs @@ -105,12 +105,6 @@ sp_api::impl_runtime_apis! { } } - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(_: &::Header) { - unimplemented!() - } - } - impl sp_session::SessionKeys for Runtime { fn generate_session_keys(_: Option>) -> Vec { unimplemented!() diff --git a/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs b/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs index 6b718e91216..823eb9ab584 100644 --- a/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs +++ b/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs @@ -105,12 +105,6 @@ sp_api::impl_runtime_apis! { } } - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(_: &::Header) { - unimplemented!() - } - } - impl sp_session::SessionKeys for Runtime { fn generate_session_keys(_: Option>) -> Vec { unimplemented!() diff --git a/cumulus/polkadot-parachain/src/main.rs b/cumulus/polkadot-parachain/src/main.rs index 0757bea84aa..2bf659228bc 100644 --- a/cumulus/polkadot-parachain/src/main.rs +++ b/cumulus/polkadot-parachain/src/main.rs @@ -22,6 +22,7 @@ mod chain_spec; mod cli; mod command; +mod common; mod fake_runtime_api; mod rpc; mod service; diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index 19ad75e384c..9cd3a003722 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -14,13 +14,11 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use codec::{Codec, Decode}; +use codec::Decode; use cumulus_client_cli::CollatorOptions; use cumulus_client_collator::service::CollatorService; use cumulus_client_consensus_aura::collators::lookahead::{self as aura, Params as AuraParams}; -use cumulus_client_consensus_common::{ - ParachainBlockImport as TParachainBlockImport, ParachainCandidate, ParachainConsensus, -}; +use cumulus_client_consensus_common::ParachainBlockImport as TParachainBlockImport; use cumulus_client_consensus_proposer::Proposer; #[allow(deprecated)] use cumulus_client_service::old_consensus; @@ -28,22 +26,26 @@ use cumulus_client_service::{ build_network, build_relay_chain_interface, prepare_node_config, start_relay_chain_tasks, BuildNetworkParams, CollatorSybilResistance, DARecoveryProfile, StartRelayChainTasksParams, }; -use cumulus_primitives_core::{ - relay_chain::{Hash as PHash, PersistedValidationData, ValidationCode}, - ParaId, -}; +use cumulus_primitives_core::{relay_chain::ValidationCode, ParaId}; use cumulus_relay_chain_interface::{OverseerHandle, RelayChainInterface}; use sc_rpc::DenyUnsafe; -use sp_core::Pair; use jsonrpsee::RpcModule; -use crate::{fake_runtime_api::aura::RuntimeApi as FakeRuntimeApi, rpc}; -pub use parachains_common::{AccountId, AuraId, Balance, Block, Hash, Header, Nonce}; +use crate::{ + common::{ + aura::{AuraIdT, AuraRuntimeApi}, + ConstructNodeRuntimeApi, + }, + fake_runtime_api::aura::RuntimeApi as FakeRuntimeApi, + rpc, +}; +pub use parachains_common::{AccountId, AuraId, Balance, Block, Hash, Nonce}; use cumulus_client_consensus_relay_chain::Verifier as RelayChainVerifier; -use futures::{lock::Mutex, prelude::*}; +use futures::prelude::*; use prometheus_endpoint::Registry; +use sc_client_api::Backend as ClientApiBackend; use sc_consensus::{ import_queue::{BasicQueue, Verifier as VerifierT}, BlockImportParams, ImportQueue, @@ -53,8 +55,8 @@ use sc_network::{config::FullNetworkConfiguration, service::traits::NetworkBacke use sc_network_sync::SyncingService; use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; -use sp_api::{ApiExt, ConstructRuntimeApi, ProvideRuntimeApi}; -use sp_consensus_aura::AuraApi; +use sp_api::{ConstructRuntimeApi, ProvideRuntimeApi}; +use sp_blockchain::HeaderBackend; use sp_core::traits::SpawnEssentialNamed; use sp_keystore::KeystorePtr; use sp_runtime::{ @@ -100,13 +102,7 @@ pub fn new_partial( build_import_queue: BIQ, ) -> Result, sc_service::Error> where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder, + RuntimeApi: ConstructNodeRuntimeApi>, BIQ: FnOnce( Arc>, ParachainBlockImport, @@ -200,16 +196,7 @@ async fn start_node_impl( hwbench: Option, ) -> sc_service::error::Result<(TaskManager, Arc>)> where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + substrate_frame_rpc_system::AccountNonceApi, + RuntimeApi: ConstructNodeRuntimeApi>, RB: Fn( DenyUnsafe, Arc>, @@ -529,61 +516,6 @@ impl BuildOnAccess { } } -/// Special [`ParachainConsensus`] implementation that waits for the upgrade from -/// shell to a parachain runtime that implements Aura. -struct WaitForAuraConsensus { - client: Arc, - aura_consensus: Arc>>>>, - relay_chain_consensus: Arc>>>, - _phantom: PhantomData, -} - -impl Clone for WaitForAuraConsensus { - fn clone(&self) -> Self { - Self { - client: self.client.clone(), - aura_consensus: self.aura_consensus.clone(), - relay_chain_consensus: self.relay_chain_consensus.clone(), - _phantom: PhantomData, - } - } -} - -#[async_trait::async_trait] -impl ParachainConsensus for WaitForAuraConsensus -where - Client: sp_api::ProvideRuntimeApi + Send + Sync, - Client::Api: AuraApi, - AuraId: Send + Codec + Sync, -{ - async fn produce_candidate( - &mut self, - parent: &Header, - relay_parent: PHash, - validation_data: &PersistedValidationData, - ) -> Option> { - if self - .client - .runtime_api() - .has_api::>(parent.hash()) - .unwrap_or(false) - { - self.aura_consensus - .lock() - .await - .get_mut() - .produce_candidate(parent, relay_parent, validation_data) - .await - } else { - self.relay_chain_consensus - .lock() - .await - .produce_candidate(parent, relay_parent, validation_data) - .await - } - } -} - struct Verifier { client: Arc, aura_verifier: BuildOnAccess>>, @@ -592,22 +524,16 @@ struct Verifier { } #[async_trait::async_trait] -impl VerifierT for Verifier +impl VerifierT for Verifier where Client: sp_api::ProvideRuntimeApi + Send + Sync, - Client::Api: AuraApi, - AuraId: Send + Sync + Codec, + Client::Api: AuraRuntimeApi, { async fn verify( &mut self, block_import: BlockImportParams, ) -> Result, String> { - if self - .client - .runtime_api() - .has_api::>(*block_import.header.parent_hash()) - .unwrap_or(false) - { + if self.client.runtime_api().has_aura_api(*block_import.header.parent_hash()) { self.aura_verifier.get_mut().verify(block_import).await } else { self.relay_chain_verifier.verify(block_import).await @@ -617,7 +543,7 @@ where /// Build the import queue for parachain runtimes that started with relay chain consensus and /// switched to aura. -pub fn build_relay_to_aura_import_queue( +pub fn build_relay_to_aura_import_queue( client: Arc>, block_import: ParachainBlockImport, config: &Configuration, @@ -625,16 +551,8 @@ pub fn build_relay_to_aura_import_queue( task_manager: &TaskManager, ) -> Result, sc_service::Error> where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + sp_consensus_aura::AuraApi::Pair as Pair>::Public>, - <::Pair as Pair>::Signature: - TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, + RuntimeApi: ConstructNodeRuntimeApi>, + RuntimeApi::RuntimeApi: AuraRuntimeApi, { let verifier_client = client.clone(); @@ -714,11 +632,7 @@ pub async fn start_generic_aura_lookahead_node> /// /// Uses the lookahead collator to support async backing. #[sc_tracing::logging::prefix_logs_with("Parachain")] -pub async fn start_asset_hub_lookahead_node< - RuntimeApi, - AuraId: AppCrypto + Send + Codec + Sync, - Net, ->( +pub async fn start_asset_hub_lookahead_node( parachain_config: Configuration, polkadot_config: Configuration, collator_options: CollatorOptions, @@ -726,20 +640,10 @@ pub async fn start_asset_hub_lookahead_node< hwbench: Option, ) -> sc_service::error::Result<(TaskManager, Arc>)> where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + sp_consensus_aura::AuraApi::Pair as Pair>::Public> + RuntimeApi: ConstructNodeRuntimeApi>, + RuntimeApi::RuntimeApi: AuraRuntimeApi + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + substrate_frame_rpc_system::AccountNonceApi - + cumulus_primitives_aura::AuraUnincludedSegmentApi, - <::Pair as Pair>::Signature: - TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, + + substrate_frame_rpc_system::AccountNonceApi, Net: NetworkBackend, { start_node_impl::( @@ -807,11 +711,7 @@ where // Check if we have upgraded to an Aura compatible runtime and transition if // necessary. - if client - .runtime_api() - .has_api::>(last_head_hash) - .unwrap_or(false) - { + if client.runtime_api().has_aura_api(last_head_hash) { // Respond to this request before transitioning to Aura. request.complete(None); break @@ -930,14 +830,14 @@ fn start_relay_chain_consensus( } /// Start consensus using the lookahead aura collator. -fn start_lookahead_aura_consensus( - client: Arc>, - block_import: ParachainBlockImport, +fn start_lookahead_aura_consensus( + client: Arc>, + block_import: ParachainBlockImport, prometheus_registry: Option<&Registry>, telemetry: Option, task_manager: &TaskManager, relay_chain_interface: Arc, - transaction_pool: Arc>>, + transaction_pool: Arc>>, sync_oracle: Arc>, keystore: KeystorePtr, relay_chain_slot_duration: Duration, @@ -946,7 +846,16 @@ fn start_lookahead_aura_consensus( overseer_handle: OverseerHandle, announce_block: Arc>) + Send + Sync>, backend: Arc, -) -> Result<(), sc_service::Error> { +) -> Result<(), sc_service::Error> +where + RuntimeApi: ConstructNodeRuntimeApi>, + RuntimeApi::RuntimeApi: AuraRuntimeApi, +{ + let info = backend.blockchain().info(); + if !client.runtime_api().has_aura_api(info.finalized_hash) { + return Err(sc_service::error::Error::Other("Missing aura runtime APIs".to_string())); + } + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( task_manager.spawn_handle(), client.clone(), diff --git a/substrate/client/service/src/config.rs b/substrate/client/service/src/config.rs index 187e18aa3ca..e4788f1f337 100644 --- a/substrate/client/service/src/config.rs +++ b/substrate/client/service/src/config.rs @@ -280,7 +280,7 @@ impl Default for RpcMethods { static mut BASE_PATH_TEMP: Option = None; /// The base path that is used for everything that needs to be written on disk to run a node. -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct BasePath { path: PathBuf, } -- GitLab From 977254ccb1afca975780987ff9f19f356e99378f Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 14 Jun 2024 13:30:08 +0200 Subject: [PATCH 007/130] Bridges - changes for Bridges V2 - relay client part (#4494) Contains mainly changes/nits/refactors related to the relayer code (`client-substrate` and `lib-substrate-relay`) migrated from the Bridges V2 [branch](https://github.com/paritytech/polkadot-sdk/pull/4427). Relates to: https://github.com/paritytech/parity-bridges-common/issues/2976 Companion: https://github.com/paritytech/parity-bridges-common/pull/2988 ## TODO - [x] fix comments ## Questions - [x] Do we need more testing for client V2 stuff? If so, how/what is the ultimate test? @svyatonik - [x] check [comment](https://github.com/paritytech/polkadot-sdk/pull/4494#issuecomment-2117181144) for more testing --------- Co-authored-by: Svyatoslav Nikolsky Co-authored-by: Serban Iorga --- Cargo.lock | 12 + bridges/modules/relayers/src/lib.rs | 2 +- bridges/primitives/relayers/src/lib.rs | 4 +- bridges/primitives/runtime/src/lib.rs | 10 +- bridges/relays/client-substrate/Cargo.toml | 1 + bridges/relays/client-substrate/src/chain.rs | 3 + bridges/relays/client-substrate/src/client.rs | 1032 ----------------- .../client-substrate/src/client/caching.rs | 468 ++++++++ .../relays/client-substrate/src/client/mod.rs | 91 ++ .../relays/client-substrate/src/client/rpc.rs | 743 ++++++++++++ .../src/{rpc.rs => client/rpc_api.rs} | 54 +- .../src/client/subscription.rs | 239 ++++ .../client-substrate/src/client/traits.rs | 230 ++++ bridges/relays/client-substrate/src/error.rs | 315 ++++- bridges/relays/client-substrate/src/guard.rs | 2 +- bridges/relays/client-substrate/src/lib.rs | 10 +- .../src/metrics/float_storage_value.rs | 45 +- .../src/transaction_tracker.rs | 52 +- .../src/cli/chain_schema.rs | 4 +- .../src/cli/detect_equivocations.rs | 2 +- .../relays/lib-substrate-relay/src/cli/mod.rs | 5 + .../src/cli/relay_headers.rs | 1 + .../src/cli/relay_headers_and_messages/mod.rs | 50 +- .../parachain_to_parachain.rs | 47 +- .../relay_to_parachain.rs | 26 +- .../relay_to_relay.rs | 6 +- .../src/cli/relay_messages.rs | 5 +- .../src/cli/relay_parachains.rs | 21 +- .../src/equivocation/mod.rs | 10 +- .../src/equivocation/source.rs | 30 +- .../src/equivocation/target.rs | 23 +- .../src/finality/initialize.rs | 8 +- .../lib-substrate-relay/src/finality/mod.rs | 18 +- .../src/finality/source.rs | 34 +- .../src/finality/target.rs | 35 +- .../src/finality_base/engine.rs | 74 +- .../src/finality_base/mod.rs | 11 +- .../lib-substrate-relay/src/messages_lane.rs | 55 +- .../src/messages_metrics.rs | 2 +- .../src/messages_source.rs | 114 +- .../src/messages_target.rs | 48 +- .../src/on_demand/headers.rs | 77 +- .../src/on_demand/parachains.rs | 59 +- .../src/parachains/source.rs | 30 +- .../src/parachains/target.rs | 55 +- .../test-utils/src/test_data/mod.rs | 4 +- 46 files changed, 2688 insertions(+), 1479 deletions(-) delete mode 100644 bridges/relays/client-substrate/src/client.rs create mode 100644 bridges/relays/client-substrate/src/client/caching.rs create mode 100644 bridges/relays/client-substrate/src/client/mod.rs create mode 100644 bridges/relays/client-substrate/src/client/rpc.rs rename bridges/relays/client-substrate/src/{rpc.rs => client/rpc_api.rs} (80%) create mode 100644 bridges/relays/client-substrate/src/client/subscription.rs create mode 100644 bridges/relays/client-substrate/src/client/traits.rs diff --git a/Cargo.lock b/Cargo.lock index a8b08d28015..71b98d2cd5c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15481,6 +15481,17 @@ dependencies = [ "unsigned-varint", ] +[[package]] +name = "quick_cache" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5253a3a0d56548d5b0be25414171dc780cc6870727746d05bd2bde352eee96c5" +dependencies = [ + "ahash 0.8.11", + "hashbrown 0.13.2", + "parking_lot 0.12.1", +] + [[package]] name = "quickcheck" version = "1.0.3" @@ -15916,6 +15927,7 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api", "pallet-utility", "parity-scale-codec", + "quick_cache", "rand 0.8.5", "relay-utils", "sc-chain-spec", diff --git a/bridges/modules/relayers/src/lib.rs b/bridges/modules/relayers/src/lib.rs index 7a3a0f9ea94..2c86ec01f5b 100644 --- a/bridges/modules/relayers/src/lib.rs +++ b/bridges/modules/relayers/src/lib.rs @@ -63,7 +63,7 @@ pub mod pallet { /// The overarching event type. type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Type of relayer reward. - type Reward: AtLeast32BitUnsigned + Copy + Parameter + MaxEncodedLen; + type Reward: AtLeast32BitUnsigned + Copy + Member + Parameter + MaxEncodedLen; /// Pay rewards scheme. type PaymentProcedure: PaymentProcedure; /// Stake and slash scheme. diff --git a/bridges/primitives/relayers/src/lib.rs b/bridges/primitives/relayers/src/lib.rs index 2a9ef6a8e1e..436f33db400 100644 --- a/bridges/primitives/relayers/src/lib.rs +++ b/bridges/primitives/relayers/src/lib.rs @@ -140,8 +140,8 @@ pub struct RelayerRewardsKeyProvider(PhantomData<(AccountId, impl StorageDoubleMapKeyProvider for RelayerRewardsKeyProvider where - AccountId: Codec + EncodeLike, - Reward: Codec + EncodeLike, + AccountId: 'static + Codec + EncodeLike + Send + Sync, + Reward: 'static + Codec + EncodeLike + Send + Sync, { const MAP_NAME: &'static str = "RelayerRewards"; diff --git a/bridges/primitives/runtime/src/lib.rs b/bridges/primitives/runtime/src/lib.rs index 5daba0351ad..d13c9b40efa 100644 --- a/bridges/primitives/runtime/src/lib.rs +++ b/bridges/primitives/runtime/src/lib.rs @@ -255,9 +255,9 @@ pub trait StorageMapKeyProvider { /// The same as `StorageMap::Hasher1`. type Hasher: StorageHasher; /// The same as `StorageMap::Key1`. - type Key: FullCodec; + type Key: FullCodec + Send + Sync; /// The same as `StorageMap::Value`. - type Value: FullCodec; + type Value: 'static + FullCodec; /// This is a copy of the /// `frame_support::storage::generator::StorageMap::storage_map_final_key`. @@ -277,13 +277,13 @@ pub trait StorageDoubleMapKeyProvider { /// The same as `StorageDoubleMap::Hasher1`. type Hasher1: StorageHasher; /// The same as `StorageDoubleMap::Key1`. - type Key1: FullCodec; + type Key1: FullCodec + Send + Sync; /// The same as `StorageDoubleMap::Hasher2`. type Hasher2: StorageHasher; /// The same as `StorageDoubleMap::Key2`. - type Key2: FullCodec; + type Key2: FullCodec + Send + Sync; /// The same as `StorageDoubleMap::Value`. - type Value: FullCodec; + type Value: 'static + FullCodec; /// This is a copy of the /// `frame_support::storage::generator::StorageDoubleMap::storage_double_map_final_key`. diff --git a/bridges/relays/client-substrate/Cargo.toml b/bridges/relays/client-substrate/Cargo.toml index cb7eae4f340..ea267ea5e30 100644 --- a/bridges/relays/client-substrate/Cargo.toml +++ b/bridges/relays/client-substrate/Cargo.toml @@ -22,6 +22,7 @@ rand = "0.8.5" scale-info = { version = "2.11.1", features = ["derive"] } tokio = { version = "1.37", features = ["rt-multi-thread"] } thiserror = { workspace = true } +quick_cache = "0.3" # Bridge dependencies diff --git a/bridges/relays/client-substrate/src/chain.rs b/bridges/relays/client-substrate/src/chain.rs index 40269fe64c8..227e9c31c5b 100644 --- a/bridges/relays/client-substrate/src/chain.rs +++ b/bridges/relays/client-substrate/src/chain.rs @@ -36,6 +36,9 @@ use sp_runtime::{ }; use std::{fmt::Debug, time::Duration}; +/// Signed block type of given chain. +pub type SignedBlockOf = ::SignedBlock; + /// Substrate-based chain from minimal relay-client point of view. pub trait Chain: ChainBase + Clone { /// Chain name. diff --git a/bridges/relays/client-substrate/src/client.rs b/bridges/relays/client-substrate/src/client.rs deleted file mode 100644 index 2e7cb7455f7..00000000000 --- a/bridges/relays/client-substrate/src/client.rs +++ /dev/null @@ -1,1032 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Substrate node client. - -use crate::{ - chain::{Chain, ChainWithTransactions}, - guard::Environment, - rpc::{ - SubstrateAuthorClient, SubstrateChainClient, SubstrateFinalityClient, - SubstrateFrameSystemClient, SubstrateStateClient, SubstrateSystemClient, - }, - transaction_stall_timeout, AccountKeyPairOf, ChainWithGrandpa, ConnectionParams, Error, HashOf, - HeaderIdOf, Result, SignParam, TransactionTracker, UnsignedTransaction, -}; - -use async_std::sync::{Arc, Mutex, RwLock}; -use async_trait::async_trait; -use bp_runtime::{HeaderIdProvider, StorageDoubleMapKeyProvider, StorageMapKeyProvider}; -use codec::{Decode, Encode}; -use frame_support::weights::Weight; -use futures::{SinkExt, StreamExt}; -use jsonrpsee::{ - core::DeserializeOwned, - ws_client::{WsClient as RpcClient, WsClientBuilder as RpcClientBuilder}, -}; -use num_traits::{Saturating, Zero}; -use pallet_transaction_payment::RuntimeDispatchInfo; -use relay_utils::{relay_loop::RECONNECT_DELAY, STALL_TIMEOUT}; -use sp_core::{ - storage::{StorageData, StorageKey}, - Bytes, Hasher, Pair, -}; -use sp_runtime::{ - traits::Header as HeaderT, - transaction_validity::{TransactionSource, TransactionValidity}, -}; -use sp_trie::StorageProof; -use sp_version::RuntimeVersion; -use std::{cmp::Ordering, future::Future}; - -const SUB_API_GRANDPA_AUTHORITIES: &str = "GrandpaApi_grandpa_authorities"; -const SUB_API_GRANDPA_GENERATE_KEY_OWNERSHIP_PROOF: &str = - "GrandpaApi_generate_key_ownership_proof"; -const SUB_API_TXPOOL_VALIDATE_TRANSACTION: &str = "TaggedTransactionQueue_validate_transaction"; -const SUB_API_TX_PAYMENT_QUERY_INFO: &str = "TransactionPaymentApi_query_info"; -const MAX_SUBSCRIPTION_CAPACITY: usize = 4096; - -/// The difference between best block number and number of its ancestor, that is enough -/// for us to consider that ancestor an "ancient" block with dropped state. -/// -/// The relay does not assume that it is connected to the archive node, so it always tries -/// to use the best available chain state. But sometimes it still may use state of some -/// old block. If the state of that block is already dropped, relay will see errors when -/// e.g. it tries to prove something. -/// -/// By default Substrate-based nodes are storing state for last 256 blocks. We'll use -/// half of this value. -pub const ANCIENT_BLOCK_THRESHOLD: u32 = 128; - -/// Returns `true` if we think that the state is already discarded for given block. -pub fn is_ancient_block + PartialOrd + Saturating>(block: N, best: N) -> bool { - best.saturating_sub(block) >= N::from(ANCIENT_BLOCK_THRESHOLD) -} - -/// Opaque justifications subscription type. -pub struct Subscription( - pub(crate) Mutex>>, - // The following field is not explicitly used by the code. But when it is dropped, - // the bakground task receives a shutdown signal. - #[allow(dead_code)] pub(crate) futures::channel::oneshot::Sender<()>, -); - -/// Opaque GRANDPA authorities set. -pub type OpaqueGrandpaAuthoritiesSet = Vec; - -/// A simple runtime version. It only includes the `spec_version` and `transaction_version`. -#[derive(Copy, Clone, Debug)] -pub struct SimpleRuntimeVersion { - /// Version of the runtime specification. - pub spec_version: u32, - /// All existing dispatches are fully compatible when this number doesn't change. - pub transaction_version: u32, -} - -impl SimpleRuntimeVersion { - /// Create a new instance of `SimpleRuntimeVersion` from a `RuntimeVersion`. - pub const fn from_runtime_version(runtime_version: &RuntimeVersion) -> Self { - Self { - spec_version: runtime_version.spec_version, - transaction_version: runtime_version.transaction_version, - } - } -} - -/// Chain runtime version in client -#[derive(Copy, Clone, Debug)] -pub enum ChainRuntimeVersion { - /// Auto query from chain. - Auto, - /// Custom runtime version, defined by user. - Custom(SimpleRuntimeVersion), -} - -/// Substrate client type. -/// -/// Cloning `Client` is a cheap operation that only clones internal references. Different -/// clones of the same client are guaranteed to use the same references. -pub struct Client { - // Lock order: `submit_signed_extrinsic_lock`, `data` - /// Client connection params. - params: Arc, - /// Saved chain runtime version. - chain_runtime_version: ChainRuntimeVersion, - /// If several tasks are submitting their transactions simultaneously using - /// `submit_signed_extrinsic` method, they may get the same transaction nonce. So one of - /// transactions will be rejected from the pool. This lock is here to prevent situations like - /// that. - submit_signed_extrinsic_lock: Arc>, - /// Genesis block hash. - genesis_hash: HashOf, - /// Shared dynamic data. - data: Arc>, -} - -/// Client data, shared by all `Client` clones. -struct ClientData { - /// Tokio runtime handle. - tokio: Arc, - /// Substrate RPC client. - client: Arc, -} - -/// Already encoded value. -struct PreEncoded(Vec); - -impl Encode for PreEncoded { - fn encode(&self) -> Vec { - self.0.clone() - } -} - -#[async_trait] -impl relay_utils::relay_loop::Client for Client { - type Error = Error; - - async fn reconnect(&mut self) -> Result<()> { - let mut data = self.data.write().await; - let (tokio, client) = Self::build_client(&self.params).await?; - data.tokio = tokio; - data.client = client; - Ok(()) - } -} - -impl Clone for Client { - fn clone(&self) -> Self { - Client { - params: self.params.clone(), - chain_runtime_version: self.chain_runtime_version, - submit_signed_extrinsic_lock: self.submit_signed_extrinsic_lock.clone(), - genesis_hash: self.genesis_hash, - data: self.data.clone(), - } - } -} - -impl std::fmt::Debug for Client { - fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { - fmt.debug_struct("Client").field("genesis_hash", &self.genesis_hash).finish() - } -} - -impl Client { - /// Returns client that is able to call RPCs on Substrate node over websocket connection. - /// - /// This function will keep connecting to given Substrate node until connection is established - /// and is functional. If attempt fail, it will wait for `RECONNECT_DELAY` and retry again. - pub async fn new(params: ConnectionParams) -> Self { - let params = Arc::new(params); - loop { - match Self::try_connect(params.clone()).await { - Ok(client) => return client, - Err(error) => log::error!( - target: "bridge", - "Failed to connect to {} node: {:?}. Going to retry in {}s", - C::NAME, - error, - RECONNECT_DELAY.as_secs(), - ), - } - - async_std::task::sleep(RECONNECT_DELAY).await; - } - } - - /// Try to connect to Substrate node over websocket. Returns Substrate RPC client if connection - /// has been established or error otherwise. - pub async fn try_connect(params: Arc) -> Result { - let (tokio, client) = Self::build_client(¶ms).await?; - - let number: C::BlockNumber = Zero::zero(); - let genesis_hash_client = client.clone(); - let genesis_hash = tokio - .spawn(async move { - SubstrateChainClient::::block_hash(&*genesis_hash_client, Some(number)).await - }) - .await??; - - let chain_runtime_version = params.chain_runtime_version; - let mut client = Self { - params, - chain_runtime_version, - submit_signed_extrinsic_lock: Arc::new(Mutex::new(())), - genesis_hash, - data: Arc::new(RwLock::new(ClientData { tokio, client })), - }; - Self::ensure_correct_runtime_version(&mut client, chain_runtime_version).await?; - Ok(client) - } - - // Check runtime version to understand if we need are connected to expected version, or we - // need to wait for upgrade, we need to abort immediately. - async fn ensure_correct_runtime_version>( - env: &mut E, - expected: ChainRuntimeVersion, - ) -> Result<()> { - // we are only interested if version mode is bundled or passed using CLI - let expected = match expected { - ChainRuntimeVersion::Auto => return Ok(()), - ChainRuntimeVersion::Custom(expected) => expected, - }; - - // we need to wait if actual version is < than expected, we are OK of versions are the - // same and we need to abort if actual version is > than expected - let actual = SimpleRuntimeVersion::from_runtime_version(&env.runtime_version().await?); - match actual.spec_version.cmp(&expected.spec_version) { - Ordering::Less => - Err(Error::WaitingForRuntimeUpgrade { chain: C::NAME.into(), expected, actual }), - Ordering::Equal => Ok(()), - Ordering::Greater => { - log::error!( - target: "bridge", - "The {} client is configured to use runtime version {expected:?} and actual \ - version is {actual:?}. Aborting", - C::NAME, - ); - env.abort().await; - Err(Error::Custom("Aborted".into())) - }, - } - } - - /// Build client to use in connection. - async fn build_client( - params: &ConnectionParams, - ) -> Result<(Arc, Arc)> { - let tokio = tokio::runtime::Runtime::new()?; - - let uri = match params.uri { - Some(ref uri) => uri.clone(), - None => { - format!( - "{}://{}:{}{}", - if params.secure { "wss" } else { "ws" }, - params.host, - params.port, - match params.path { - Some(ref path) => format!("/{}", path), - None => String::new(), - }, - ) - }, - }; - log::info!(target: "bridge", "Connecting to {} node at {}", C::NAME, uri); - - let client = tokio - .spawn(async move { - RpcClientBuilder::default() - .max_buffer_capacity_per_subscription(MAX_SUBSCRIPTION_CAPACITY) - .build(&uri) - .await - }) - .await??; - - Ok((Arc::new(tokio), Arc::new(client))) - } -} - -impl Client { - /// Return simple runtime version, only include `spec_version` and `transaction_version`. - pub async fn simple_runtime_version(&self) -> Result { - Ok(match &self.chain_runtime_version { - ChainRuntimeVersion::Auto => { - let runtime_version = self.runtime_version().await?; - SimpleRuntimeVersion::from_runtime_version(&runtime_version) - }, - ChainRuntimeVersion::Custom(version) => *version, - }) - } - - /// Returns true if client is connected to at least one peer and is in synced state. - pub async fn ensure_synced(&self) -> Result<()> { - self.jsonrpsee_execute(|client| async move { - let health = SubstrateSystemClient::::health(&*client).await?; - let is_synced = !health.is_syncing && (!health.should_have_peers || health.peers > 0); - if is_synced { - Ok(()) - } else { - Err(Error::ClientNotSynced(health)) - } - }) - .await - } - - /// Return hash of the genesis block. - pub fn genesis_hash(&self) -> &C::Hash { - &self.genesis_hash - } - - /// Return hash of the best finalized block. - pub async fn best_finalized_header_hash(&self) -> Result { - self.jsonrpsee_execute(|client| async move { - Ok(SubstrateChainClient::::finalized_head(&*client).await?) - }) - .await - .map_err(|e| Error::FailedToReadBestFinalizedHeaderHash { - chain: C::NAME.into(), - error: e.boxed(), - }) - } - - /// Return number of the best finalized block. - pub async fn best_finalized_header_number(&self) -> Result { - Ok(*self.best_finalized_header().await?.number()) - } - - /// Return header of the best finalized block. - pub async fn best_finalized_header(&self) -> Result { - self.header_by_hash(self.best_finalized_header_hash().await?).await - } - - /// Returns the best Substrate header. - pub async fn best_header(&self) -> Result - where - C::Header: DeserializeOwned, - { - self.jsonrpsee_execute(|client| async move { - Ok(SubstrateChainClient::::header(&*client, None).await?) - }) - .await - .map_err(|e| Error::FailedToReadBestHeader { chain: C::NAME.into(), error: e.boxed() }) - } - - /// Get a Substrate block from its hash. - pub async fn get_block(&self, block_hash: Option) -> Result { - self.jsonrpsee_execute(move |client| async move { - Ok(SubstrateChainClient::::block(&*client, block_hash).await?) - }) - .await - } - - /// Get a Substrate header by its hash. - pub async fn header_by_hash(&self, block_hash: C::Hash) -> Result - where - C::Header: DeserializeOwned, - { - self.jsonrpsee_execute(move |client| async move { - Ok(SubstrateChainClient::::header(&*client, Some(block_hash)).await?) - }) - .await - .map_err(|e| Error::FailedToReadHeaderByHash { - chain: C::NAME.into(), - hash: format!("{block_hash}"), - error: e.boxed(), - }) - } - - /// Get a Substrate block hash by its number. - pub async fn block_hash_by_number(&self, number: C::BlockNumber) -> Result { - self.jsonrpsee_execute(move |client| async move { - Ok(SubstrateChainClient::::block_hash(&*client, Some(number)).await?) - }) - .await - } - - /// Get a Substrate header by its number. - pub async fn header_by_number(&self, block_number: C::BlockNumber) -> Result - where - C::Header: DeserializeOwned, - { - let block_hash = Self::block_hash_by_number(self, block_number).await?; - let header_by_hash = Self::header_by_hash(self, block_hash).await?; - Ok(header_by_hash) - } - - /// Return runtime version. - pub async fn runtime_version(&self) -> Result { - self.jsonrpsee_execute(move |client| async move { - Ok(SubstrateStateClient::::runtime_version(&*client).await?) - }) - .await - } - - /// Read value from runtime storage. - pub async fn storage_value( - &self, - storage_key: StorageKey, - block_hash: Option, - ) -> Result> { - self.raw_storage_value(storage_key, block_hash) - .await? - .map(|encoded_value| { - T::decode(&mut &encoded_value.0[..]).map_err(Error::ResponseParseFailed) - }) - .transpose() - } - - /// Read `MapStorage` value from runtime storage. - pub async fn storage_map_value( - &self, - pallet_prefix: &str, - key: &T::Key, - block_hash: Option, - ) -> Result> { - let storage_key = T::final_key(pallet_prefix, key); - - self.raw_storage_value(storage_key, block_hash) - .await? - .map(|encoded_value| { - T::Value::decode(&mut &encoded_value.0[..]).map_err(Error::ResponseParseFailed) - }) - .transpose() - } - - /// Read `DoubleMapStorage` value from runtime storage. - pub async fn storage_double_map_value( - &self, - pallet_prefix: &str, - key1: &T::Key1, - key2: &T::Key2, - block_hash: Option, - ) -> Result> { - let storage_key = T::final_key(pallet_prefix, key1, key2); - - self.raw_storage_value(storage_key, block_hash) - .await? - .map(|encoded_value| { - T::Value::decode(&mut &encoded_value.0[..]).map_err(Error::ResponseParseFailed) - }) - .transpose() - } - - /// Read raw value from runtime storage. - pub async fn raw_storage_value( - &self, - storage_key: StorageKey, - block_hash: Option, - ) -> Result> { - let cloned_storage_key = storage_key.clone(); - self.jsonrpsee_execute(move |client| async move { - Ok(SubstrateStateClient::::storage(&*client, storage_key.clone(), block_hash) - .await?) - }) - .await - .map_err(|e| Error::FailedToReadRuntimeStorageValue { - chain: C::NAME.into(), - key: cloned_storage_key, - error: e.boxed(), - }) - } - - /// Get the nonce of the given Substrate account. - /// - /// Note: It's the caller's responsibility to make sure `account` is a valid SS58 address. - pub async fn next_account_index(&self, account: C::AccountId) -> Result { - self.jsonrpsee_execute(move |client| async move { - Ok(SubstrateFrameSystemClient::::account_next_index(&*client, account).await?) - }) - .await - } - - /// Submit unsigned extrinsic for inclusion in a block. - /// - /// Note: The given transaction needs to be SCALE encoded beforehand. - pub async fn submit_unsigned_extrinsic(&self, transaction: Bytes) -> Result { - // one last check that the transaction is valid. Most of checks happen in the relay loop and - // it is the "final" check before submission. - let best_header_hash = self.best_header().await?.hash(); - self.validate_transaction(best_header_hash, PreEncoded(transaction.0.clone())) - .await - .map_err(|e| { - log::error!(target: "bridge", "Pre-submit {} transaction validation failed: {:?}", C::NAME, e); - e - })??; - - self.jsonrpsee_execute(move |client| async move { - let tx_hash = SubstrateAuthorClient::::submit_extrinsic(&*client, transaction) - .await - .map_err(|e| { - log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); - e - })?; - log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); - Ok(tx_hash) - }) - .await - } - - async fn build_sign_params(&self, signer: AccountKeyPairOf) -> Result> - where - C: ChainWithTransactions, - { - let runtime_version = self.simple_runtime_version().await?; - Ok(SignParam:: { - spec_version: runtime_version.spec_version, - transaction_version: runtime_version.transaction_version, - genesis_hash: self.genesis_hash, - signer, - }) - } - - /// Submit an extrinsic signed by given account. - /// - /// All calls of this method are synchronized, so there can't be more than one active - /// `submit_signed_extrinsic()` call. This guarantees that no nonces collision may happen - /// if all client instances are clones of the same initial `Client`. - /// - /// Note: The given transaction needs to be SCALE encoded beforehand. - pub async fn submit_signed_extrinsic( - &self, - signer: &AccountKeyPairOf, - prepare_extrinsic: impl FnOnce(HeaderIdOf, C::Nonce) -> Result> - + Send - + 'static, - ) -> Result - where - C: ChainWithTransactions, - C::AccountId: From<::Public>, - { - let _guard = self.submit_signed_extrinsic_lock.lock().await; - let transaction_nonce = self.next_account_index(signer.public().into()).await?; - let best_header = self.best_header().await?; - let signing_data = self.build_sign_params(signer.clone()).await?; - - // By using parent of best block here, we are protecing again best-block reorganizations. - // E.g. transaction may have been submitted when the best block was `A[num=100]`. Then it - // has been changed to `B[num=100]`. Hash of `A` has been included into transaction - // signature payload. So when signature will be checked, the check will fail and transaction - // will be dropped from the pool. - let best_header_id = best_header.parent_id().unwrap_or_else(|| best_header.id()); - - let extrinsic = prepare_extrinsic(best_header_id, transaction_nonce)?; - let signed_extrinsic = C::sign_transaction(signing_data, extrinsic)?.encode(); - - // one last check that the transaction is valid. Most of checks happen in the relay loop and - // it is the "final" check before submission. - self.validate_transaction(best_header_id.1, PreEncoded(signed_extrinsic.clone())) - .await - .map_err(|e| { - log::error!(target: "bridge", "Pre-submit {} transaction validation failed: {:?}", C::NAME, e); - e - })??; - - self.jsonrpsee_execute(move |client| async move { - let tx_hash = - SubstrateAuthorClient::::submit_extrinsic(&*client, Bytes(signed_extrinsic)) - .await - .map_err(|e| { - log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); - e - })?; - log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); - Ok(tx_hash) - }) - .await - } - - /// Does exactly the same as `submit_signed_extrinsic`, but keeps watching for extrinsic status - /// after submission. - pub async fn submit_and_watch_signed_extrinsic( - &self, - signer: &AccountKeyPairOf, - prepare_extrinsic: impl FnOnce(HeaderIdOf, C::Nonce) -> Result> - + Send - + 'static, - ) -> Result> - where - C: ChainWithTransactions, - C::AccountId: From<::Public>, - { - let self_clone = self.clone(); - let signing_data = self.build_sign_params(signer.clone()).await?; - let _guard = self.submit_signed_extrinsic_lock.lock().await; - let transaction_nonce = self.next_account_index(signer.public().into()).await?; - let best_header = self.best_header().await?; - let best_header_id = best_header.id(); - - let extrinsic = prepare_extrinsic(best_header_id, transaction_nonce)?; - let stall_timeout = transaction_stall_timeout( - extrinsic.era.mortality_period(), - C::AVERAGE_BLOCK_INTERVAL, - STALL_TIMEOUT, - ); - let signed_extrinsic = C::sign_transaction(signing_data, extrinsic)?.encode(); - - // one last check that the transaction is valid. Most of checks happen in the relay loop and - // it is the "final" check before submission. - self.validate_transaction(best_header_id.1, PreEncoded(signed_extrinsic.clone())) - .await - .map_err(|e| { - log::error!(target: "bridge", "Pre-submit {} transaction validation failed: {:?}", C::NAME, e); - e - })??; - - let (cancel_sender, cancel_receiver) = futures::channel::oneshot::channel(); - let (sender, receiver) = futures::channel::mpsc::channel(MAX_SUBSCRIPTION_CAPACITY); - let (tracker, subscription) = self - .jsonrpsee_execute(move |client| async move { - let tx_hash = C::Hasher::hash(&signed_extrinsic); - let subscription = SubstrateAuthorClient::::submit_and_watch_extrinsic( - &*client, - Bytes(signed_extrinsic), - ) - .await - .map_err(|e| { - log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); - e - })?; - log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); - let tracker = TransactionTracker::new( - self_clone, - stall_timeout, - tx_hash, - Subscription(Mutex::new(receiver), cancel_sender), - ); - Ok((tracker, subscription)) - }) - .await?; - self.data.read().await.tokio.spawn(Subscription::background_worker( - C::NAME.into(), - "extrinsic".into(), - subscription, - sender, - cancel_receiver, - )); - Ok(tracker) - } - - /// Returns pending extrinsics from transaction pool. - pub async fn pending_extrinsics(&self) -> Result> { - self.jsonrpsee_execute(move |client| async move { - Ok(SubstrateAuthorClient::::pending_extrinsics(&*client).await?) - }) - .await - } - - /// Validate transaction at given block state. - pub async fn validate_transaction( - &self, - at_block: C::Hash, - transaction: SignedTransaction, - ) -> Result { - self.jsonrpsee_execute(move |client| async move { - let call = SUB_API_TXPOOL_VALIDATE_TRANSACTION.to_string(); - let data = Bytes((TransactionSource::External, transaction, at_block).encode()); - - let encoded_response = - SubstrateStateClient::::call(&*client, call, data, Some(at_block)).await?; - let validity = TransactionValidity::decode(&mut &encoded_response.0[..]) - .map_err(Error::ResponseParseFailed)?; - - Ok(validity) - }) - .await - } - - /// Returns weight of the given transaction. - pub async fn extimate_extrinsic_weight( - &self, - transaction: SignedTransaction, - ) -> Result { - self.jsonrpsee_execute(move |client| async move { - let transaction_len = transaction.encoded_size() as u32; - - let call = SUB_API_TX_PAYMENT_QUERY_INFO.to_string(); - let data = Bytes((transaction, transaction_len).encode()); - - let encoded_response = - SubstrateStateClient::::call(&*client, call, data, None).await?; - let dispatch_info = - RuntimeDispatchInfo::::decode(&mut &encoded_response.0[..]) - .map_err(Error::ResponseParseFailed)?; - - Ok(dispatch_info.weight) - }) - .await - } - - /// Get the GRANDPA authority set at given block. - pub async fn grandpa_authorities_set( - &self, - block: C::Hash, - ) -> Result { - self.jsonrpsee_execute(move |client| async move { - let call = SUB_API_GRANDPA_AUTHORITIES.to_string(); - let data = Bytes(Vec::new()); - - let encoded_response = - SubstrateStateClient::::call(&*client, call, data, Some(block)).await?; - let authority_list = encoded_response.0; - - Ok(authority_list) - }) - .await - } - - /// Execute runtime call at given block, provided the input and output types. - /// It also performs the input encode and output decode. - pub async fn typed_state_call( - &self, - method_name: String, - input: Input, - at_block: Option, - ) -> Result { - let encoded_output = self - .state_call(method_name.clone(), Bytes(input.encode()), at_block) - .await - .map_err(|e| Error::ErrorExecutingRuntimeCall { - chain: C::NAME.into(), - method: method_name, - error: e.boxed(), - })?; - Output::decode(&mut &encoded_output.0[..]).map_err(Error::ResponseParseFailed) - } - - /// Execute runtime call at given block. - pub async fn state_call( - &self, - method: String, - data: Bytes, - at_block: Option, - ) -> Result { - self.jsonrpsee_execute(move |client| async move { - SubstrateStateClient::::call(&*client, method, data, at_block) - .await - .map_err(Into::into) - }) - .await - } - - /// Returns storage proof of given storage keys. - pub async fn prove_storage( - &self, - keys: Vec, - at_block: C::Hash, - ) -> Result { - self.jsonrpsee_execute(move |client| async move { - SubstrateStateClient::::prove_storage(&*client, keys, Some(at_block)) - .await - .map(|proof| { - StorageProof::new(proof.proof.into_iter().map(|b| b.0).collect::>()) - }) - .map_err(Into::into) - }) - .await - } - - /// Return `tokenDecimals` property from the set of chain properties. - pub async fn token_decimals(&self) -> Result> { - self.jsonrpsee_execute(move |client| async move { - let system_properties = SubstrateSystemClient::::properties(&*client).await?; - Ok(system_properties.get("tokenDecimals").and_then(|v| v.as_u64())) - }) - .await - } - - /// Return new finality justifications stream. - pub async fn subscribe_finality_justifications>( - &self, - ) -> Result> { - let subscription = self - .jsonrpsee_execute(move |client| async move { - Ok(FC::subscribe_justifications(&client).await?) - }) - .await?; - let (cancel_sender, cancel_receiver) = futures::channel::oneshot::channel(); - let (sender, receiver) = futures::channel::mpsc::channel(MAX_SUBSCRIPTION_CAPACITY); - self.data.read().await.tokio.spawn(Subscription::background_worker( - C::NAME.into(), - "justification".into(), - subscription, - sender, - cancel_receiver, - )); - Ok(Subscription(Mutex::new(receiver), cancel_sender)) - } - - /// Generates a proof of key ownership for the given authority in the given set. - pub async fn generate_grandpa_key_ownership_proof( - &self, - at: HashOf, - set_id: sp_consensus_grandpa::SetId, - authority_id: sp_consensus_grandpa::AuthorityId, - ) -> Result> - where - C: ChainWithGrandpa, - { - self.typed_state_call( - SUB_API_GRANDPA_GENERATE_KEY_OWNERSHIP_PROOF.into(), - (set_id, authority_id), - Some(at), - ) - .await - } - - /// Execute jsonrpsee future in tokio context. - async fn jsonrpsee_execute(&self, make_jsonrpsee_future: MF) -> Result - where - MF: FnOnce(Arc) -> F + Send + 'static, - F: Future> + Send + 'static, - T: Send + 'static, - { - let data = self.data.read().await; - let client = data.client.clone(); - data.tokio.spawn(make_jsonrpsee_future(client)).await? - } - - /// Returns `true` if version guard can be started. - /// - /// There's no reason to run version guard when version mode is set to `Auto`. It can - /// lead to relay shutdown when chain is upgraded, even though we have explicitly - /// said that we don't want to shutdown. - pub fn can_start_version_guard(&self) -> bool { - !matches!(self.chain_runtime_version, ChainRuntimeVersion::Auto) - } -} - -impl Subscription { - /// Consumes subscription and returns future statuses stream. - pub fn into_stream(self) -> impl futures::Stream { - futures::stream::unfold(Some(self), |mut this| async move { - let Some(this) = this.take() else { return None }; - let item = this.0.lock().await.next().await.unwrap_or(None); - match item { - Some(item) => Some((item, Some(this))), - None => { - // let's make it explicit here - let _ = this.1.send(()); - None - }, - } - }) - } - - /// Return next item from the subscription. - pub async fn next(&self) -> Result> { - let mut receiver = self.0.lock().await; - let item = receiver.next().await; - Ok(item.unwrap_or(None)) - } - - /// Background worker that is executed in tokio context as `jsonrpsee` requires. - async fn background_worker( - chain_name: String, - item_type: String, - subscription: jsonrpsee::core::client::Subscription, - mut sender: futures::channel::mpsc::Sender>, - cancel_receiver: futures::channel::oneshot::Receiver<()>, - ) { - log::trace!( - target: "bridge", - "Starting background worker for {} {} subscription stream.", - chain_name, - item_type, - ); - - futures::pin_mut!(subscription, cancel_receiver); - loop { - match futures::future::select(subscription.next(), &mut cancel_receiver).await { - futures::future::Either::Left((Some(Ok(item)), _)) => - if sender.send(Some(item)).await.is_err() { - log::trace!( - target: "bridge", - "{} {} subscription stream: no listener. Stopping background worker.", - chain_name, - item_type, - ); - - break - }, - futures::future::Either::Left((Some(Err(e)), _)) => { - log::trace!( - target: "bridge", - "{} {} subscription stream has returned '{:?}'. Stream needs to be restarted. Stopping background worker.", - chain_name, - item_type, - e, - ); - let _ = sender.send(None).await; - break - }, - futures::future::Either::Left((None, _)) => { - log::trace!( - target: "bridge", - "{} {} subscription stream has returned None. Stream needs to be restarted. Stopping background worker.", - chain_name, - item_type, - ); - let _ = sender.send(None).await; - break - }, - futures::future::Either::Right((_, _)) => { - log::trace!( - target: "bridge", - "{} {} subscription stream: listener has been dropped. Stopping background worker.", - chain_name, - item_type, - ); - break; - }, - } - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{guard::tests::TestEnvironment, test_chain::TestChain}; - use futures::{channel::mpsc::unbounded, FutureExt}; - - async fn run_ensure_correct_runtime_version( - expected: ChainRuntimeVersion, - actual: RuntimeVersion, - ) -> Result<()> { - let ( - (mut runtime_version_tx, runtime_version_rx), - (slept_tx, _slept_rx), - (aborted_tx, mut aborted_rx), - ) = (unbounded(), unbounded(), unbounded()); - runtime_version_tx.send(actual).await.unwrap(); - let mut env = TestEnvironment { runtime_version_rx, slept_tx, aborted_tx }; - - let ensure_correct_runtime_version = - Client::::ensure_correct_runtime_version(&mut env, expected).boxed(); - let aborted = aborted_rx.next().map(|_| Err(Error::Custom("".into()))).boxed(); - futures::pin_mut!(ensure_correct_runtime_version, aborted); - futures::future::select(ensure_correct_runtime_version, aborted) - .await - .into_inner() - .0 - } - - #[async_std::test] - async fn ensure_correct_runtime_version_works() { - // when we are configured to use auto version - assert!(matches!( - run_ensure_correct_runtime_version( - ChainRuntimeVersion::Auto, - RuntimeVersion { - spec_version: 100, - transaction_version: 100, - ..Default::default() - }, - ) - .await, - Ok(()), - )); - // when actual == expected - assert!(matches!( - run_ensure_correct_runtime_version( - ChainRuntimeVersion::Custom(SimpleRuntimeVersion { - spec_version: 100, - transaction_version: 100 - }), - RuntimeVersion { - spec_version: 100, - transaction_version: 100, - ..Default::default() - }, - ) - .await, - Ok(()), - )); - // when actual spec version < expected spec version - assert!(matches!( - run_ensure_correct_runtime_version( - ChainRuntimeVersion::Custom(SimpleRuntimeVersion { - spec_version: 100, - transaction_version: 100 - }), - RuntimeVersion { spec_version: 99, transaction_version: 100, ..Default::default() }, - ) - .await, - Err(Error::WaitingForRuntimeUpgrade { - expected: SimpleRuntimeVersion { spec_version: 100, transaction_version: 100 }, - actual: SimpleRuntimeVersion { spec_version: 99, transaction_version: 100 }, - .. - }), - )); - // when actual spec version > expected spec version - assert!(matches!( - run_ensure_correct_runtime_version( - ChainRuntimeVersion::Custom(SimpleRuntimeVersion { - spec_version: 100, - transaction_version: 100 - }), - RuntimeVersion { - spec_version: 101, - transaction_version: 100, - ..Default::default() - }, - ) - .await, - Err(Error::Custom(_)), - )); - } -} diff --git a/bridges/relays/client-substrate/src/client/caching.rs b/bridges/relays/client-substrate/src/client/caching.rs new file mode 100644 index 00000000000..cb898cf5172 --- /dev/null +++ b/bridges/relays/client-substrate/src/client/caching.rs @@ -0,0 +1,468 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Client implementation that is caching (whenever possible) results of its backend +//! method calls. + +use crate::{ + client::{Client, SubscriptionBroadcaster}, + error::{Error, Result}, + AccountIdOf, AccountKeyPairOf, BlockNumberOf, Chain, ChainWithGrandpa, ChainWithTransactions, + HashOf, HeaderIdOf, HeaderOf, NonceOf, SignedBlockOf, SimpleRuntimeVersion, Subscription, + TransactionTracker, UnsignedTransaction, ANCIENT_BLOCK_THRESHOLD, +}; +use std::{cmp::Ordering, future::Future, task::Poll}; + +use async_std::{ + sync::{Arc, Mutex, RwLock}, + task::JoinHandle, +}; +use async_trait::async_trait; +use codec::Encode; +use frame_support::weights::Weight; +use futures::{FutureExt, StreamExt}; +use quick_cache::unsync::Cache; +use sp_consensus_grandpa::{AuthorityId, OpaqueKeyOwnershipProof, SetId}; +use sp_core::{ + storage::{StorageData, StorageKey}, + Bytes, Pair, +}; +use sp_runtime::{traits::Header as _, transaction_validity::TransactionValidity}; +use sp_trie::StorageProof; +use sp_version::RuntimeVersion; + +/// `quick_cache::unsync::Cache` wrapped in async-aware synchronization primitives. +type SyncCache = Arc>>; + +/// Client implementation that is caching (whenever possible) results of its backend +/// method calls. Apart from caching call results, it also supports some (at the +/// moment: justifications) subscription sharing, meaning that the single server +/// subscription may be shared by multiple subscribers at the client side. +#[derive(Clone)] +pub struct CachingClient> { + backend: B, + data: Arc>, +} + +/// Client data, shared by all `CachingClient` clones. +struct ClientData { + grandpa_justifications: Arc>>>, + beefy_justifications: Arc>>>, + background_task_handle: Arc>>>, + best_header: Arc>>>, + best_finalized_header: Arc>>>, + // `quick_cache::sync::Cache` has the `get_or_insert_async` method, which fits our needs, + // but it uses synchronization primitives that are not aware of async execution. They + // can block the executor threads and cause deadlocks => let's use primitives from + // `async_std` crate around `quick_cache::unsync::Cache` + header_hash_by_number_cache: SyncCache, HashOf>, + header_by_hash_cache: SyncCache, HeaderOf>, + block_by_hash_cache: SyncCache, SignedBlockOf>, + raw_storage_value_cache: SyncCache<(HashOf, StorageKey), Option>, + state_call_cache: SyncCache<(HashOf, String, Bytes), Bytes>, +} + +impl> CachingClient { + /// Creates new `CachingClient` on top of given `backend`. + pub async fn new(backend: B) -> Self { + // most of relayer operations will never touch more than `ANCIENT_BLOCK_THRESHOLD` + // headers, so we'll use this as a cache capacity for all chain-related caches + let chain_state_capacity = ANCIENT_BLOCK_THRESHOLD as usize; + let best_header = Arc::new(RwLock::new(None)); + let best_finalized_header = Arc::new(RwLock::new(None)); + let header_by_hash_cache = Arc::new(RwLock::new(Cache::new(chain_state_capacity))); + let background_task_handle = Self::start_background_task( + backend.clone(), + best_header.clone(), + best_finalized_header.clone(), + header_by_hash_cache.clone(), + ) + .await; + CachingClient { + backend, + data: Arc::new(ClientData { + grandpa_justifications: Arc::new(Mutex::new(None)), + beefy_justifications: Arc::new(Mutex::new(None)), + background_task_handle: Arc::new(Mutex::new(background_task_handle)), + best_header, + best_finalized_header, + header_hash_by_number_cache: Arc::new(RwLock::new(Cache::new( + chain_state_capacity, + ))), + header_by_hash_cache, + block_by_hash_cache: Arc::new(RwLock::new(Cache::new(chain_state_capacity))), + raw_storage_value_cache: Arc::new(RwLock::new(Cache::new(1_024))), + state_call_cache: Arc::new(RwLock::new(Cache::new(1_024))), + }), + } + } + + /// Try to get value from the cache, or compute and insert it using given future. + async fn get_or_insert_async( + &self, + cache: &Arc>>, + key: &K, + with: impl std::future::Future>, + ) -> Result { + // try to get cached value first using read lock + { + let cache = cache.read().await; + if let Some(value) = cache.get(key) { + return Ok(value.clone()) + } + } + + // let's compute the value without holding any locks - it may cause additional misses and + // double insertions, but that's better than holding a lock for a while + let value = with.await?; + + // insert/update the value in the cache + cache.write().await.insert(key.clone(), value.clone()); + Ok(value) + } + + /// Subscribe to finality justifications, trying to reuse existing subscription. + async fn subscribe_finality_justifications<'a>( + &'a self, + maybe_broadcaster: &Mutex>>, + do_subscribe: impl Future>> + 'a, + ) -> Result> { + let mut maybe_broadcaster = maybe_broadcaster.lock().await; + let broadcaster = match maybe_broadcaster.as_ref() { + Some(justifications) => justifications, + None => { + let broadcaster = match SubscriptionBroadcaster::new(do_subscribe.await?) { + Ok(broadcaster) => broadcaster, + Err(subscription) => return Ok(subscription), + }; + maybe_broadcaster.get_or_insert(broadcaster) + }, + }; + + broadcaster.subscribe().await + } + + /// Start background task that reads best (and best finalized) headers from subscriptions. + async fn start_background_task( + backend: B, + best_header: Arc>>>, + best_finalized_header: Arc>>>, + header_by_hash_cache: SyncCache, HeaderOf>, + ) -> JoinHandle> { + async_std::task::spawn(async move { + // initialize by reading headers directly from backend to avoid doing that in the + // high-level code + let mut last_finalized_header = + backend.header_by_hash(backend.best_finalized_header_hash().await?).await?; + *best_header.write().await = Some(backend.best_header().await?); + *best_finalized_header.write().await = Some(last_finalized_header.clone()); + + // ...and then continue with subscriptions + let mut best_headers = backend.subscribe_best_headers().await?; + let mut finalized_headers = backend.subscribe_finalized_headers().await?; + loop { + futures::select! { + new_best_header = best_headers.next().fuse() => { + // we assume that the best header is always the actual best header, even if its + // number is lower than the number of previous-best-header (chain may use its own + // best header selection algorithms) + let new_best_header = new_best_header + .ok_or_else(|| Error::ChannelError(format!("Mandatory best headers subscription for {} has finished", C::NAME)))?; + let new_best_header_hash = new_best_header.hash(); + header_by_hash_cache.write().await.insert(new_best_header_hash, new_best_header.clone()); + *best_header.write().await = Some(new_best_header); + }, + new_finalized_header = finalized_headers.next().fuse() => { + // in theory we'll always get finalized headers in order, but let's double check + let new_finalized_header = new_finalized_header. + ok_or_else(|| Error::ChannelError(format!("Finalized headers subscription for {} has finished", C::NAME)))?; + let new_finalized_header_number = *new_finalized_header.number(); + let last_finalized_header_number = *last_finalized_header.number(); + match new_finalized_header_number.cmp(&last_finalized_header_number) { + Ordering::Greater => { + let new_finalized_header_hash = new_finalized_header.hash(); + header_by_hash_cache.write().await.insert(new_finalized_header_hash, new_finalized_header.clone()); + *best_finalized_header.write().await = Some(new_finalized_header.clone()); + last_finalized_header = new_finalized_header; + }, + Ordering::Less => { + return Err(Error::unordered_finalized_headers::( + new_finalized_header_number, + last_finalized_header_number, + )); + }, + _ => (), + } + }, + } + } + }) + } + + /// Ensure that the background task is active. + async fn ensure_background_task_active(&self) -> Result<()> { + let mut background_task_handle = self.data.background_task_handle.lock().await; + if let Poll::Ready(result) = futures::poll!(&mut *background_task_handle) { + return Err(Error::ChannelError(format!( + "Background task of {} client has exited with result: {:?}", + C::NAME, + result + ))) + } + + Ok(()) + } + + /// Try to get header, read elsewhere by background task through subscription. + async fn read_header_from_background<'a>( + &'a self, + header: &Arc>>>, + read_header_from_backend: impl Future>> + 'a, + ) -> Result> { + // ensure that the background task is active + self.ensure_background_task_active().await?; + + // now we know that the background task is active, so we could trust that the + // `header` has the most recent updates from it + match header.read().await.clone() { + Some(header) => Ok(header), + None => { + // header has not yet been read from the subscription, which means that + // we are just starting - let's read header directly from backend this time + read_header_from_backend.await + }, + } + } +} + +impl> std::fmt::Debug for CachingClient { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.write_fmt(format_args!("CachingClient<{:?}>", self.backend)) + } +} + +#[async_trait] +impl> Client for CachingClient { + async fn ensure_synced(&self) -> Result<()> { + self.backend.ensure_synced().await + } + + async fn reconnect(&self) -> Result<()> { + self.backend.reconnect().await?; + // since we have new underlying client, we need to restart subscriptions too + *self.data.grandpa_justifications.lock().await = None; + *self.data.beefy_justifications.lock().await = None; + // also restart background task too + *self.data.best_header.write().await = None; + *self.data.best_finalized_header.write().await = None; + *self.data.background_task_handle.lock().await = Self::start_background_task( + self.backend.clone(), + self.data.best_header.clone(), + self.data.best_finalized_header.clone(), + self.data.header_by_hash_cache.clone(), + ) + .await; + Ok(()) + } + + fn genesis_hash(&self) -> HashOf { + self.backend.genesis_hash() + } + + async fn header_hash_by_number(&self, number: BlockNumberOf) -> Result> { + self.get_or_insert_async( + &self.data.header_hash_by_number_cache, + &number, + self.backend.header_hash_by_number(number), + ) + .await + } + + async fn header_by_hash(&self, hash: HashOf) -> Result> { + self.get_or_insert_async( + &self.data.header_by_hash_cache, + &hash, + self.backend.header_by_hash(hash), + ) + .await + } + + async fn block_by_hash(&self, hash: HashOf) -> Result> { + self.get_or_insert_async( + &self.data.block_by_hash_cache, + &hash, + self.backend.block_by_hash(hash), + ) + .await + } + + async fn best_finalized_header_hash(&self) -> Result> { + self.read_header_from_background( + &self.data.best_finalized_header, + self.backend.best_finalized_header(), + ) + .await + .map(|h| h.hash()) + } + + async fn best_header(&self) -> Result> { + self.read_header_from_background(&self.data.best_header, self.backend.best_header()) + .await + } + + async fn subscribe_best_headers(&self) -> Result>> { + // we may share the sunbscription here, but atm there's no callers of this method + self.backend.subscribe_best_headers().await + } + + async fn subscribe_finalized_headers(&self) -> Result>> { + // we may share the sunbscription here, but atm there's no callers of this method + self.backend.subscribe_finalized_headers().await + } + + async fn subscribe_grandpa_finality_justifications(&self) -> Result> + where + C: ChainWithGrandpa, + { + self.subscribe_finality_justifications( + &self.data.grandpa_justifications, + self.backend.subscribe_grandpa_finality_justifications(), + ) + .await + } + + async fn generate_grandpa_key_ownership_proof( + &self, + at: HashOf, + set_id: SetId, + authority_id: AuthorityId, + ) -> Result> { + self.backend + .generate_grandpa_key_ownership_proof(at, set_id, authority_id) + .await + } + + async fn subscribe_beefy_finality_justifications(&self) -> Result> { + self.subscribe_finality_justifications( + &self.data.beefy_justifications, + self.backend.subscribe_beefy_finality_justifications(), + ) + .await + } + + async fn token_decimals(&self) -> Result> { + self.backend.token_decimals().await + } + + async fn runtime_version(&self) -> Result { + self.backend.runtime_version().await + } + + async fn simple_runtime_version(&self) -> Result { + self.backend.simple_runtime_version().await + } + + fn can_start_version_guard(&self) -> bool { + self.backend.can_start_version_guard() + } + + async fn raw_storage_value( + &self, + at: HashOf, + storage_key: StorageKey, + ) -> Result> { + self.get_or_insert_async( + &self.data.raw_storage_value_cache, + &(at, storage_key.clone()), + self.backend.raw_storage_value(at, storage_key), + ) + .await + } + + async fn pending_extrinsics(&self) -> Result> { + self.backend.pending_extrinsics().await + } + + async fn submit_unsigned_extrinsic(&self, transaction: Bytes) -> Result> { + self.backend.submit_unsigned_extrinsic(transaction).await + } + + async fn submit_signed_extrinsic( + &self, + signer: &AccountKeyPairOf, + prepare_extrinsic: impl FnOnce(HeaderIdOf, NonceOf) -> Result> + + Send + + 'static, + ) -> Result> + where + C: ChainWithTransactions, + AccountIdOf: From< as Pair>::Public>, + { + self.backend.submit_signed_extrinsic(signer, prepare_extrinsic).await + } + + async fn submit_and_watch_signed_extrinsic( + &self, + signer: &AccountKeyPairOf, + prepare_extrinsic: impl FnOnce(HeaderIdOf, NonceOf) -> Result> + + Send + + 'static, + ) -> Result> + where + C: ChainWithTransactions, + AccountIdOf: From< as Pair>::Public>, + { + self.backend + .submit_and_watch_signed_extrinsic(signer, prepare_extrinsic) + .await + .map(|t| t.switch_environment(self.clone())) + } + + async fn validate_transaction( + &self, + at: HashOf, + transaction: SignedTransaction, + ) -> Result { + self.backend.validate_transaction(at, transaction).await + } + + async fn estimate_extrinsic_weight( + &self, + at: HashOf, + transaction: SignedTransaction, + ) -> Result { + self.backend.estimate_extrinsic_weight(at, transaction).await + } + + async fn raw_state_call( + &self, + at: HashOf, + method: String, + arguments: Args, + ) -> Result { + let encoded_arguments = Bytes(arguments.encode()); + self.get_or_insert_async( + &self.data.state_call_cache, + &(at, method.clone(), encoded_arguments), + self.backend.raw_state_call(at, method, arguments), + ) + .await + } + + async fn prove_storage(&self, at: HashOf, keys: Vec) -> Result { + self.backend.prove_storage(at, keys).await + } +} diff --git a/bridges/relays/client-substrate/src/client/mod.rs b/bridges/relays/client-substrate/src/client/mod.rs new file mode 100644 index 00000000000..62a1119d718 --- /dev/null +++ b/bridges/relays/client-substrate/src/client/mod.rs @@ -0,0 +1,91 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Layered Substrate client implementation. + +use crate::{Chain, ConnectionParams}; + +use caching::CachingClient; +use num_traits::Saturating; +use rpc::RpcClient; +use sp_version::RuntimeVersion; + +pub mod caching; +pub mod rpc; + +mod rpc_api; +mod subscription; +mod traits; + +pub use subscription::{StreamDescription, Subscription, SubscriptionBroadcaster}; +pub use traits::Client; + +/// Type of RPC client with caching support. +pub type RpcWithCachingClient = CachingClient>; + +/// Creates new RPC client with caching support. +pub async fn rpc_with_caching(params: ConnectionParams) -> RpcWithCachingClient { + let rpc = rpc::RpcClient::::new(params).await; + caching::CachingClient::new(rpc).await +} + +/// The difference between best block number and number of its ancestor, that is enough +/// for us to consider that ancestor an "ancient" block with dropped state. +/// +/// The relay does not assume that it is connected to the archive node, so it always tries +/// to use the best available chain state. But sometimes it still may use state of some +/// old block. If the state of that block is already dropped, relay will see errors when +/// e.g. it tries to prove something. +/// +/// By default Substrate-based nodes are storing state for last 256 blocks. We'll use +/// half of this value. +pub const ANCIENT_BLOCK_THRESHOLD: u32 = 128; + +/// Returns `true` if we think that the state is already discarded for given block. +pub fn is_ancient_block + PartialOrd + Saturating>(block: N, best: N) -> bool { + best.saturating_sub(block) >= N::from(ANCIENT_BLOCK_THRESHOLD) +} + +/// Opaque GRANDPA authorities set. +pub type OpaqueGrandpaAuthoritiesSet = Vec; + +/// A simple runtime version. It only includes the `spec_version` and `transaction_version`. +#[derive(Copy, Clone, Debug)] +pub struct SimpleRuntimeVersion { + /// Version of the runtime specification. + pub spec_version: u32, + /// All existing dispatches are fully compatible when this number doesn't change. + pub transaction_version: u32, +} + +impl SimpleRuntimeVersion { + /// Create a new instance of `SimpleRuntimeVersion` from a `RuntimeVersion`. + pub const fn from_runtime_version(runtime_version: &RuntimeVersion) -> Self { + Self { + spec_version: runtime_version.spec_version, + transaction_version: runtime_version.transaction_version, + } + } +} + +/// Chain runtime version in client +#[derive(Copy, Clone, Debug)] +pub enum ChainRuntimeVersion { + /// Auto query from chain. + Auto, + /// Custom runtime version, defined by user. + Custom(SimpleRuntimeVersion), +} diff --git a/bridges/relays/client-substrate/src/client/rpc.rs b/bridges/relays/client-substrate/src/client/rpc.rs new file mode 100644 index 00000000000..bf7442a9514 --- /dev/null +++ b/bridges/relays/client-substrate/src/client/rpc.rs @@ -0,0 +1,743 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Client implementation that connects to the Substrate node over `ws`/`wss` connection +//! and is using RPC methods to get required data and submit transactions. + +use crate::{ + client::{ + rpc_api::{ + SubstrateAuthorClient, SubstrateBeefyClient, SubstrateChainClient, + SubstrateFrameSystemClient, SubstrateGrandpaClient, SubstrateStateClient, + SubstrateSystemClient, + }, + subscription::{StreamDescription, Subscription}, + Client, + }, + error::{Error, Result}, + guard::Environment, + transaction_stall_timeout, AccountIdOf, AccountKeyPairOf, BalanceOf, BlockNumberOf, Chain, + ChainRuntimeVersion, ChainWithGrandpa, ChainWithTransactions, ConnectionParams, HashOf, + HeaderIdOf, HeaderOf, NonceOf, SignParam, SignedBlockOf, SimpleRuntimeVersion, + TransactionTracker, UnsignedTransaction, +}; + +use async_std::sync::{Arc, Mutex, RwLock}; +use async_trait::async_trait; +use bp_runtime::HeaderIdProvider; +use codec::Encode; +use frame_support::weights::Weight; +use futures::TryFutureExt; +use jsonrpsee::{ + core::{client::Subscription as RpcSubscription, ClientError}, + ws_client::{WsClient, WsClientBuilder}, +}; +use num_traits::Zero; +use pallet_transaction_payment::RuntimeDispatchInfo; +use relay_utils::{relay_loop::RECONNECT_DELAY, STALL_TIMEOUT}; +use sp_core::{ + storage::{StorageData, StorageKey}, + Bytes, Hasher, Pair, +}; +use sp_runtime::transaction_validity::{TransactionSource, TransactionValidity}; +use sp_trie::StorageProof; +use sp_version::RuntimeVersion; +use std::{cmp::Ordering, future::Future, marker::PhantomData}; + +const MAX_SUBSCRIPTION_CAPACITY: usize = 4096; + +const SUB_API_TXPOOL_VALIDATE_TRANSACTION: &str = "TaggedTransactionQueue_validate_transaction"; +const SUB_API_TX_PAYMENT_QUERY_INFO: &str = "TransactionPaymentApi_query_info"; +const SUB_API_GRANDPA_GENERATE_KEY_OWNERSHIP_PROOF: &str = + "GrandpaApi_generate_key_ownership_proof"; + +/// Client implementation that connects to the Substrate node over `ws`/`wss` connection +/// and is using RPC methods to get required data and submit transactions. +pub struct RpcClient { + // Lock order: `submit_signed_extrinsic_lock`, `data` + /// Client connection params. + params: Arc, + /// If several tasks are submitting their transactions simultaneously using + /// `submit_signed_extrinsic` method, they may get the same transaction nonce. So one of + /// transactions will be rejected from the pool. This lock is here to prevent situations like + /// that. + submit_signed_extrinsic_lock: Arc>, + /// Genesis block hash. + genesis_hash: HashOf, + /// Shared dynamic data. + data: Arc>, + /// Generic arguments dump. + _phantom: PhantomData, +} + +/// Client data, shared by all `RpcClient` clones. +struct ClientData { + /// Tokio runtime handle. + tokio: Arc, + /// Substrate RPC client. + client: Arc, +} + +/// Already encoded value. +struct PreEncoded(Vec); + +impl Encode for PreEncoded { + fn encode(&self) -> Vec { + self.0.clone() + } +} + +impl std::fmt::Debug for RpcClient { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.write_fmt(format_args!("RpcClient<{}>", C::NAME)) + } +} + +impl RpcClient { + /// Returns client that is able to call RPCs on Substrate node over websocket connection. + /// + /// This function will keep connecting to given Substrate node until connection is established + /// and is functional. If attempt fail, it will wait for `RECONNECT_DELAY` and retry again. + pub async fn new(params: ConnectionParams) -> Self { + let params = Arc::new(params); + loop { + match Self::try_connect(params.clone()).await { + Ok(client) => return client, + Err(error) => log::error!( + target: "bridge", + "Failed to connect to {} node: {:?}. Going to retry in {}s", + C::NAME, + error, + RECONNECT_DELAY.as_secs(), + ), + } + + async_std::task::sleep(RECONNECT_DELAY).await; + } + } + + /// Try to connect to Substrate node over websocket. Returns Substrate RPC client if connection + /// has been established or error otherwise. + async fn try_connect(params: Arc) -> Result { + let (tokio, client) = Self::build_client(¶ms).await?; + + let genesis_hash_client = client.clone(); + let genesis_hash = tokio + .spawn(async move { + SubstrateChainClient::::block_hash(&*genesis_hash_client, Some(Zero::zero())) + .await + }) + .await??; + + let chain_runtime_version = params.chain_runtime_version; + let mut client = Self { + params, + submit_signed_extrinsic_lock: Arc::new(Mutex::new(())), + genesis_hash, + data: Arc::new(RwLock::new(ClientData { tokio, client })), + _phantom: PhantomData, + }; + Self::ensure_correct_runtime_version(&mut client, chain_runtime_version).await?; + Ok(client) + } + + // Check runtime version to understand if we need are connected to expected version, or we + // need to wait for upgrade, we need to abort immediately. + async fn ensure_correct_runtime_version>( + env: &mut E, + expected: ChainRuntimeVersion, + ) -> Result<()> { + // we are only interested if version mode is bundled or passed using CLI + let expected = match expected { + ChainRuntimeVersion::Auto => return Ok(()), + ChainRuntimeVersion::Custom(expected) => expected, + }; + + // we need to wait if actual version is < than expected, we are OK of versions are the + // same and we need to abort if actual version is > than expected + let actual = SimpleRuntimeVersion::from_runtime_version(&env.runtime_version().await?); + match actual.spec_version.cmp(&expected.spec_version) { + Ordering::Less => + Err(Error::WaitingForRuntimeUpgrade { chain: C::NAME.into(), expected, actual }), + Ordering::Equal => Ok(()), + Ordering::Greater => { + log::error!( + target: "bridge", + "The {} client is configured to use runtime version {expected:?} and actual \ + version is {actual:?}. Aborting", + C::NAME, + ); + env.abort().await; + Err(Error::Custom("Aborted".into())) + }, + } + } + + /// Build client to use in connection. + async fn build_client( + params: &ConnectionParams, + ) -> Result<(Arc, Arc)> { + let tokio = tokio::runtime::Runtime::new()?; + let uri = match params.uri { + Some(ref uri) => uri.clone(), + None => { + format!( + "{}://{}:{}{}", + if params.secure { "wss" } else { "ws" }, + params.host, + params.port, + match params.path { + Some(ref path) => format!("/{}", path), + None => String::new(), + }, + ) + }, + }; + log::info!(target: "bridge", "Connecting to {} node at {}", C::NAME, uri); + + let client = tokio + .spawn(async move { + WsClientBuilder::default() + .max_buffer_capacity_per_subscription(MAX_SUBSCRIPTION_CAPACITY) + .build(&uri) + .await + }) + .await??; + + Ok((Arc::new(tokio), Arc::new(client))) + } + + /// Execute jsonrpsee future in tokio context. + async fn jsonrpsee_execute(&self, make_jsonrpsee_future: MF) -> Result + where + MF: FnOnce(Arc) -> F + Send + 'static, + F: Future> + Send + 'static, + T: Send + 'static, + { + let data = self.data.read().await; + let client = data.client.clone(); + data.tokio.spawn(make_jsonrpsee_future(client)).await? + } + + /// Prepare parameters used to sign chain transactions. + async fn build_sign_params(&self, signer: AccountKeyPairOf) -> Result> + where + C: ChainWithTransactions, + { + let runtime_version = self.simple_runtime_version().await?; + Ok(SignParam:: { + spec_version: runtime_version.spec_version, + transaction_version: runtime_version.transaction_version, + genesis_hash: self.genesis_hash, + signer, + }) + } + + /// Get the nonce of the given Substrate account. + pub async fn next_account_index(&self, account: AccountIdOf) -> Result> { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateFrameSystemClient::::account_next_index(&*client, account).await?) + }) + .await + } + + /// Subscribe to finality justifications. + async fn subscribe_finality_justifications( + &self, + gadget_name: &str, + do_subscribe: impl FnOnce(Arc) -> Fut + Send + 'static, + ) -> Result> + where + Fut: Future, ClientError>> + Send, + { + let subscription = self + .jsonrpsee_execute(move |client| async move { Ok(do_subscribe(client).await?) }) + .map_err(|e| Error::failed_to_subscribe_justification::(e)) + .await?; + + Ok(Subscription::new_forwarded( + StreamDescription::new(format!("{} justifications", gadget_name), C::NAME.into()), + subscription, + )) + } + + /// Subscribe to headers stream. + async fn subscribe_headers( + &self, + stream_name: &str, + do_subscribe: impl FnOnce(Arc) -> Fut + Send + 'static, + map_err: impl FnOnce(Error) -> Error, + ) -> Result>> + where + Fut: Future>, ClientError>> + Send, + { + let subscription = self + .jsonrpsee_execute(move |client| async move { Ok(do_subscribe(client).await?) }) + .map_err(map_err) + .await?; + + Ok(Subscription::new_forwarded( + StreamDescription::new(format!("{} headers", stream_name), C::NAME.into()), + subscription, + )) + } +} + +impl Clone for RpcClient { + fn clone(&self) -> Self { + RpcClient { + params: self.params.clone(), + submit_signed_extrinsic_lock: self.submit_signed_extrinsic_lock.clone(), + genesis_hash: self.genesis_hash, + data: self.data.clone(), + _phantom: PhantomData, + } + } +} + +#[async_trait] +impl Client for RpcClient { + async fn ensure_synced(&self) -> Result<()> { + let health = self + .jsonrpsee_execute(|client| async move { + Ok(SubstrateSystemClient::::health(&*client).await?) + }) + .await + .map_err(|e| Error::failed_to_get_system_health::(e))?; + + let is_synced = !health.is_syncing && (!health.should_have_peers || health.peers > 0); + if is_synced { + Ok(()) + } else { + Err(Error::ClientNotSynced(health)) + } + } + + async fn reconnect(&self) -> Result<()> { + let mut data = self.data.write().await; + let (tokio, client) = Self::build_client(&self.params).await?; + data.tokio = tokio; + data.client = client; + Ok(()) + } + + fn genesis_hash(&self) -> HashOf { + self.genesis_hash + } + + async fn header_hash_by_number(&self, number: BlockNumberOf) -> Result> { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateChainClient::::block_hash(&*client, Some(number)).await?) + }) + .await + .map_err(|e| Error::failed_to_read_header_hash_by_number::(number, e)) + } + + async fn header_by_hash(&self, hash: HashOf) -> Result> { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateChainClient::::header(&*client, Some(hash)).await?) + }) + .await + .map_err(|e| Error::failed_to_read_header_by_hash::(hash, e)) + } + + async fn block_by_hash(&self, hash: HashOf) -> Result> { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateChainClient::::block(&*client, Some(hash)).await?) + }) + .await + .map_err(|e| Error::failed_to_read_block_by_hash::(hash, e)) + } + + async fn best_finalized_header_hash(&self) -> Result> { + self.jsonrpsee_execute(|client| async move { + Ok(SubstrateChainClient::::finalized_head(&*client).await?) + }) + .await + .map_err(|e| Error::failed_to_read_best_finalized_header_hash::(e)) + } + + async fn best_header(&self) -> Result> { + self.jsonrpsee_execute(|client| async move { + Ok(SubstrateChainClient::::header(&*client, None).await?) + }) + .await + .map_err(|e| Error::failed_to_read_best_header::(e)) + } + + async fn subscribe_best_headers(&self) -> Result>> { + self.subscribe_headers( + "best headers", + move |client| async move { SubstrateChainClient::::subscribe_new_heads(&*client).await }, + |e| Error::failed_to_subscribe_best_headers::(e), + ) + .await + } + + async fn subscribe_finalized_headers(&self) -> Result>> { + self.subscribe_headers( + "best finalized headers", + move |client| async move { + SubstrateChainClient::::subscribe_finalized_heads(&*client).await + }, + |e| Error::failed_to_subscribe_finalized_headers::(e), + ) + .await + } + + async fn subscribe_grandpa_finality_justifications(&self) -> Result> + where + C: ChainWithGrandpa, + { + self.subscribe_finality_justifications("GRANDPA", move |client| async move { + SubstrateGrandpaClient::::subscribe_justifications(&*client).await + }) + .await + } + + async fn generate_grandpa_key_ownership_proof( + &self, + at: HashOf, + set_id: sp_consensus_grandpa::SetId, + authority_id: sp_consensus_grandpa::AuthorityId, + ) -> Result> { + self.state_call( + at, + SUB_API_GRANDPA_GENERATE_KEY_OWNERSHIP_PROOF.into(), + (set_id, authority_id), + ) + .await + } + + async fn subscribe_beefy_finality_justifications(&self) -> Result> { + self.subscribe_finality_justifications("BEEFY", move |client| async move { + SubstrateBeefyClient::::subscribe_justifications(&*client).await + }) + .await + } + + async fn token_decimals(&self) -> Result> { + self.jsonrpsee_execute(move |client| async move { + let system_properties = SubstrateSystemClient::::properties(&*client).await?; + Ok(system_properties.get("tokenDecimals").and_then(|v| v.as_u64())) + }) + .await + } + + async fn runtime_version(&self) -> Result { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateStateClient::::runtime_version(&*client).await?) + }) + .await + .map_err(|e| Error::failed_to_read_runtime_version::(e)) + } + + async fn simple_runtime_version(&self) -> Result { + Ok(match self.params.chain_runtime_version { + ChainRuntimeVersion::Auto => { + let runtime_version = self.runtime_version().await?; + SimpleRuntimeVersion::from_runtime_version(&runtime_version) + }, + ChainRuntimeVersion::Custom(ref version) => *version, + }) + } + + fn can_start_version_guard(&self) -> bool { + !matches!(self.params.chain_runtime_version, ChainRuntimeVersion::Auto) + } + + async fn raw_storage_value( + &self, + at: HashOf, + storage_key: StorageKey, + ) -> Result> { + let cloned_storage_key = storage_key.clone(); + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateStateClient::::storage(&*client, cloned_storage_key, Some(at)).await?) + }) + .await + .map_err(|e| Error::failed_to_read_storage_value::(at, storage_key, e)) + } + + async fn pending_extrinsics(&self) -> Result> { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateAuthorClient::::pending_extrinsics(&*client).await?) + }) + .await + .map_err(|e| Error::failed_to_get_pending_extrinsics::(e)) + } + + async fn submit_unsigned_extrinsic(&self, transaction: Bytes) -> Result> { + // one last check that the transaction is valid. Most of checks happen in the relay loop and + // it is the "final" check before submission. + let best_header_hash = self.best_header_hash().await?; + self.validate_transaction(best_header_hash, PreEncoded(transaction.0.clone())) + .await + .map_err(|e| Error::failed_to_submit_transaction::(e))? + .map_err(|e| Error::failed_to_submit_transaction::(Error::TransactionInvalid(e)))?; + + self.jsonrpsee_execute(move |client| async move { + let tx_hash = SubstrateAuthorClient::::submit_extrinsic(&*client, transaction) + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; + log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); + Ok(tx_hash) + }) + .await + .map_err(|e| Error::failed_to_submit_transaction::(e)) + } + + async fn submit_signed_extrinsic( + &self, + signer: &AccountKeyPairOf, + prepare_extrinsic: impl FnOnce(HeaderIdOf, NonceOf) -> Result> + + Send + + 'static, + ) -> Result> + where + C: ChainWithTransactions, + AccountIdOf: From< as Pair>::Public>, + { + let _guard = self.submit_signed_extrinsic_lock.lock().await; + let transaction_nonce = self.next_account_index(signer.public().into()).await?; + let best_header = self.best_header().await?; + let signing_data = self.build_sign_params(signer.clone()).await?; + + // By using parent of best block here, we are protecting again best-block reorganizations. + // E.g. transaction may have been submitted when the best block was `A[num=100]`. Then it + // has been changed to `B[num=100]`. Hash of `A` has been included into transaction + // signature payload. So when signature will be checked, the check will fail and transaction + // will be dropped from the pool. + let best_header_id = best_header.parent_id().unwrap_or_else(|| best_header.id()); + + let extrinsic = prepare_extrinsic(best_header_id, transaction_nonce)?; + let signed_extrinsic = C::sign_transaction(signing_data, extrinsic)?.encode(); + self.submit_unsigned_extrinsic(Bytes(signed_extrinsic)).await + } + + async fn submit_and_watch_signed_extrinsic( + &self, + signer: &AccountKeyPairOf, + prepare_extrinsic: impl FnOnce(HeaderIdOf, NonceOf) -> Result> + + Send + + 'static, + ) -> Result> + where + C: ChainWithTransactions, + AccountIdOf: From< as Pair>::Public>, + { + let self_clone = self.clone(); + let signing_data = self.build_sign_params(signer.clone()).await?; + let _guard = self.submit_signed_extrinsic_lock.lock().await; + let transaction_nonce = self.next_account_index(signer.public().into()).await?; + let best_header = self.best_header().await?; + let best_header_id = best_header.id(); + + let extrinsic = prepare_extrinsic(best_header_id, transaction_nonce)?; + let stall_timeout = transaction_stall_timeout( + extrinsic.era.mortality_period(), + C::AVERAGE_BLOCK_INTERVAL, + STALL_TIMEOUT, + ); + let signed_extrinsic = C::sign_transaction(signing_data, extrinsic)?.encode(); + + // one last check that the transaction is valid. Most of checks happen in the relay loop and + // it is the "final" check before submission. + self.validate_transaction(best_header_id.hash(), PreEncoded(signed_extrinsic.clone())) + .await + .map_err(|e| Error::failed_to_submit_transaction::(e))? + .map_err(|e| Error::failed_to_submit_transaction::(Error::TransactionInvalid(e)))?; + + self.jsonrpsee_execute(move |client| async move { + let tx_hash = C::Hasher::hash(&signed_extrinsic); + let subscription: jsonrpsee::core::client::Subscription<_> = + SubstrateAuthorClient::::submit_and_watch_extrinsic( + &*client, + Bytes(signed_extrinsic), + ) + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; + log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); + Ok(TransactionTracker::new( + self_clone, + stall_timeout, + tx_hash, + Subscription::new_forwarded( + StreamDescription::new("transaction events".into(), C::NAME.into()), + subscription, + ), + )) + }) + .await + .map_err(|e| Error::failed_to_submit_transaction::(e)) + } + + async fn validate_transaction( + &self, + at: HashOf, + transaction: SignedTransaction, + ) -> Result { + self.state_call( + at, + SUB_API_TXPOOL_VALIDATE_TRANSACTION.into(), + (TransactionSource::External, transaction, at), + ) + .await + } + + async fn estimate_extrinsic_weight( + &self, + at: HashOf, + transaction: SignedTransaction, + ) -> Result { + let transaction_len = transaction.encoded_size() as u32; + let dispatch_info: RuntimeDispatchInfo> = self + .state_call(at, SUB_API_TX_PAYMENT_QUERY_INFO.into(), (transaction, transaction_len)) + .await?; + + Ok(dispatch_info.weight) + } + + async fn raw_state_call( + &self, + at: HashOf, + method: String, + arguments: Args, + ) -> Result { + let arguments = Bytes(arguments.encode()); + let arguments_clone = arguments.clone(); + let method_clone = method.clone(); + self.jsonrpsee_execute(move |client| async move { + SubstrateStateClient::::call(&*client, method, arguments, Some(at)) + .await + .map_err(Into::into) + }) + .await + .map_err(|e| Error::failed_state_call::(at, method_clone, arguments_clone, e)) + } + + async fn prove_storage(&self, at: HashOf, keys: Vec) -> Result { + let keys_clone = keys.clone(); + self.jsonrpsee_execute(move |client| async move { + SubstrateStateClient::::prove_storage(&*client, keys, Some(at)) + .await + .map(|proof| StorageProof::new(proof.proof.into_iter().map(|b| b.0))) + .map_err(Into::into) + }) + .await + .map_err(|e| Error::failed_to_prove_storage::(at, keys_clone, e)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{guard::tests::TestEnvironment, test_chain::TestChain}; + use futures::{channel::mpsc::unbounded, FutureExt, SinkExt, StreamExt}; + + async fn run_ensure_correct_runtime_version( + expected: ChainRuntimeVersion, + actual: RuntimeVersion, + ) -> Result<()> { + let ( + (mut runtime_version_tx, runtime_version_rx), + (slept_tx, _slept_rx), + (aborted_tx, mut aborted_rx), + ) = (unbounded(), unbounded(), unbounded()); + runtime_version_tx.send(actual).await.unwrap(); + let mut env = TestEnvironment { runtime_version_rx, slept_tx, aborted_tx }; + + let ensure_correct_runtime_version = + RpcClient::::ensure_correct_runtime_version(&mut env, expected).boxed(); + let aborted = aborted_rx.next().map(|_| Err(Error::Custom("".into()))).boxed(); + futures::pin_mut!(ensure_correct_runtime_version, aborted); + futures::future::select(ensure_correct_runtime_version, aborted) + .await + .into_inner() + .0 + } + + #[async_std::test] + async fn ensure_correct_runtime_version_works() { + // when we are configured to use auto version + assert!(matches!( + run_ensure_correct_runtime_version( + ChainRuntimeVersion::Auto, + RuntimeVersion { + spec_version: 100, + transaction_version: 100, + ..Default::default() + }, + ) + .await, + Ok(()), + )); + // when actual == expected + assert!(matches!( + run_ensure_correct_runtime_version( + ChainRuntimeVersion::Custom(SimpleRuntimeVersion { + spec_version: 100, + transaction_version: 100 + }), + RuntimeVersion { + spec_version: 100, + transaction_version: 100, + ..Default::default() + }, + ) + .await, + Ok(()), + )); + // when actual spec version < expected spec version + assert!(matches!( + run_ensure_correct_runtime_version( + ChainRuntimeVersion::Custom(SimpleRuntimeVersion { + spec_version: 100, + transaction_version: 100 + }), + RuntimeVersion { spec_version: 99, transaction_version: 100, ..Default::default() }, + ) + .await, + Err(Error::WaitingForRuntimeUpgrade { + expected: SimpleRuntimeVersion { spec_version: 100, transaction_version: 100 }, + actual: SimpleRuntimeVersion { spec_version: 99, transaction_version: 100 }, + .. + }), + )); + // when actual spec version > expected spec version + assert!(matches!( + run_ensure_correct_runtime_version( + ChainRuntimeVersion::Custom(SimpleRuntimeVersion { + spec_version: 100, + transaction_version: 100 + }), + RuntimeVersion { + spec_version: 101, + transaction_version: 100, + ..Default::default() + }, + ) + .await, + Err(Error::Custom(_)), + )); + } +} diff --git a/bridges/relays/client-substrate/src/rpc.rs b/bridges/relays/client-substrate/src/client/rpc_api.rs similarity index 80% rename from bridges/relays/client-substrate/src/rpc.rs rename to bridges/relays/client-substrate/src/client/rpc_api.rs index 60c29cdeb5c..9cac69f7a13 100644 --- a/bridges/relays/client-substrate/src/rpc.rs +++ b/bridges/relays/client-substrate/src/client/rpc_api.rs @@ -16,15 +16,9 @@ //! The most generic Substrate node RPC interface. -use async_trait::async_trait; - use crate::{Chain, ChainWithGrandpa, TransactionStatusOf}; -use jsonrpsee::{ - core::{client::Subscription, ClientError}, - proc_macros::rpc, - ws_client::WsClient, -}; +use jsonrpsee::proc_macros::rpc; use pallet_transaction_payment_rpc_runtime_api::FeeDetails; use sc_rpc_api::{state::ReadProof, system::Health}; use sp_core::{ @@ -60,6 +54,20 @@ pub(crate) trait SubstrateChain { /// Return signed block (with justifications) by its hash. #[method(name = "getBlock")] async fn block(&self, block_hash: Option) -> RpcResult; + /// Subscribe to best headers. + #[subscription( + name = "subscribeNewHeads" => "newHead", + unsubscribe = "unsubscribeNewHeads", + item = C::Header + )] + async fn subscribe_new_heads(&self); + /// Subscribe to finalized headers. + #[subscription( + name = "subscribeFinalizedHeads" => "finalizedHead", + unsubscribe = "unsubscribeFinalizedHeads", + item = C::Header + )] + async fn subscribe_finalized_heads(&self); } /// RPC methods of Substrate `author` namespace, that we are using. @@ -106,15 +114,6 @@ pub(crate) trait SubstrateState { ) -> RpcResult>; } -/// RPC methods that we are using for a certain finality gadget. -#[async_trait] -pub trait SubstrateFinalityClient { - /// Subscribe to finality justifications. - async fn subscribe_justifications( - client: &WsClient, - ) -> Result, ClientError>; -} - /// RPC methods of Substrate `grandpa` namespace, that we are using. #[rpc(client, client_bounds(C: ChainWithGrandpa), namespace = "grandpa")] pub(crate) trait SubstrateGrandpa { @@ -123,17 +122,6 @@ pub(crate) trait SubstrateGrandpa { async fn subscribe_justifications(&self); } -/// RPC finality methods of Substrate `grandpa` namespace, that we are using. -pub struct SubstrateGrandpaFinalityClient; -#[async_trait] -impl SubstrateFinalityClient for SubstrateGrandpaFinalityClient { - async fn subscribe_justifications( - client: &WsClient, - ) -> Result, ClientError> { - SubstrateGrandpaClient::::subscribe_justifications(client).await - } -} - // TODO: Use `ChainWithBeefy` instead of `Chain` after #1606 is merged /// RPC methods of Substrate `beefy` namespace, that we are using. #[rpc(client, client_bounds(C: Chain), namespace = "beefy")] @@ -143,18 +131,6 @@ pub(crate) trait SubstrateBeefy { async fn subscribe_justifications(&self); } -/// RPC finality methods of Substrate `beefy` namespace, that we are using. -pub struct SubstrateBeefyFinalityClient; -// TODO: Use `ChainWithBeefy` instead of `Chain` after #1606 is merged -#[async_trait] -impl SubstrateFinalityClient for SubstrateBeefyFinalityClient { - async fn subscribe_justifications( - client: &WsClient, - ) -> Result, ClientError> { - SubstrateBeefyClient::::subscribe_justifications(client).await - } -} - /// RPC methods of Substrate `system` frame pallet, that we are using. #[rpc(client, client_bounds(C: Chain), namespace = "system")] pub(crate) trait SubstrateFrameSystem { diff --git a/bridges/relays/client-substrate/src/client/subscription.rs b/bridges/relays/client-substrate/src/client/subscription.rs new file mode 100644 index 00000000000..43a46573f98 --- /dev/null +++ b/bridges/relays/client-substrate/src/client/subscription.rs @@ -0,0 +1,239 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::error::Result as ClientResult; + +use async_std::{ + channel::{bounded, Receiver, Sender}, + stream::StreamExt, +}; +use futures::{FutureExt, Stream}; +use jsonrpsee::core::ClientError; +use sp_runtime::DeserializeOwned; +use std::{ + fmt::Debug, + pin::Pin, + result::Result as StdResult, + task::{Context, Poll}, +}; + +/// Once channel reaches this capacity, the subscription breaks. +const CHANNEL_CAPACITY: usize = 128; + +/// Structure describing a stream. +#[derive(Clone)] +pub struct StreamDescription { + stream_name: String, + chain_name: String, +} + +impl StreamDescription { + /// Create a new instance of `StreamDescription`. + pub fn new(stream_name: String, chain_name: String) -> Self { + Self { stream_name, chain_name } + } + + /// Get a stream description. + fn get(&self) -> String { + format!("{} stream of {}", self.stream_name, self.chain_name) + } +} + +/// Chainable stream that transforms items of type `Result` to items of type `T`. +/// +/// If it encounters an item of type `Err`, it returns `Poll::Ready(None)` +/// and terminates the underlying stream. +struct Unwrap>, T, E> { + desc: StreamDescription, + stream: Option, +} + +impl>, T, E> Unwrap { + /// Create a new instance of `Unwrap`. + pub fn new(desc: StreamDescription, stream: S) -> Self { + Self { desc, stream: Some(stream) } + } +} + +impl> + Unpin, T: DeserializeOwned, E: Debug> Stream + for Unwrap +{ + type Item = T; + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Poll::Ready(match self.stream.as_mut() { + Some(subscription) => match futures::ready!(Pin::new(subscription).poll_next(cx)) { + Some(Ok(item)) => Some(item), + Some(Err(e)) => { + self.stream.take(); + log::debug!( + target: "bridge", + "{} has returned error: {:?}. It may need to be restarted", + self.desc.get(), + e, + ); + None + }, + None => { + self.stream.take(); + log::debug!( + target: "bridge", + "{} has returned `None`. It may need to be restarted", + self.desc.get() + ); + None + }, + }, + None => None, + }) + } +} + +/// Subscription factory that produces subscriptions, sharing the same background thread. +#[derive(Clone)] +pub struct SubscriptionBroadcaster { + desc: StreamDescription, + subscribers_sender: Sender>, +} + +impl SubscriptionBroadcaster { + /// Create new subscription factory. + pub fn new(subscription: Subscription) -> StdResult> { + // It doesn't make sense to further broadcast a broadcasted subscription. + if subscription.is_broadcasted { + return Err(subscription) + } + + let desc = subscription.desc().clone(); + let (subscribers_sender, subscribers_receiver) = bounded(CHANNEL_CAPACITY); + async_std::task::spawn(background_worker(subscription, subscribers_receiver)); + Ok(Self { desc, subscribers_sender }) + } + + /// Produce new subscription. + pub async fn subscribe(&self) -> ClientResult> { + let (items_sender, items_receiver) = bounded(CHANNEL_CAPACITY); + self.subscribers_sender.try_send(items_sender)?; + + Ok(Subscription::new_broadcasted(self.desc.clone(), items_receiver)) + } +} + +/// Subscription to some chain events. +pub struct Subscription { + desc: StreamDescription, + subscription: Box + Unpin + Send>, + is_broadcasted: bool, +} + +impl Subscription { + /// Create new forwarded subscription. + pub fn new_forwarded( + desc: StreamDescription, + subscription: impl Stream> + Unpin + Send + 'static, + ) -> Self { + Self { + desc: desc.clone(), + subscription: Box::new(Unwrap::new(desc, subscription)), + is_broadcasted: false, + } + } + + /// Create new broadcasted subscription. + pub fn new_broadcasted( + desc: StreamDescription, + subscription: impl Stream + Unpin + Send + 'static, + ) -> Self { + Self { desc, subscription: Box::new(subscription), is_broadcasted: true } + } + + /// Get the description of the underlying stream + pub fn desc(&self) -> &StreamDescription { + &self.desc + } +} + +impl Stream for Subscription { + type Item = T; + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Poll::Ready(futures::ready!(Pin::new(&mut self.subscription).poll_next(cx))) + } +} + +/// Background worker that is executed in tokio context as `jsonrpsee` requires. +/// +/// This task may exit under some circumstances. It'll send the correspondent +/// message (`Err` or `None`) to all known listeners. Also, when it stops, all +/// subsequent reads and new subscribers will get the connection error (`ChannelError`). +async fn background_worker( + mut subscription: Subscription, + mut subscribers_receiver: Receiver>, +) { + fn log_task_exit(desc: &StreamDescription, reason: &str) { + log::debug!( + target: "bridge", + "Background task of subscription broadcaster for {} has stopped: {}", + desc.get(), + reason, + ); + } + + // wait for first subscriber until actually starting subscription + let subscriber = match subscribers_receiver.next().await { + Some(subscriber) => subscriber, + None => { + // it means that the last subscriber/factory has been dropped, so we need to + // exit too + return log_task_exit(subscription.desc(), "client has stopped") + }, + }; + + // actually subscribe + let mut subscribers = vec![subscriber]; + + // start listening for new items and receivers + loop { + futures::select! { + subscriber = subscribers_receiver.next().fuse() => { + match subscriber { + Some(subscriber) => subscribers.push(subscriber), + None => { + // it means that the last subscriber/factory has been dropped, so we need to + // exit too + return log_task_exit(subscription.desc(), "client has stopped") + }, + } + }, + maybe_item = subscription.subscription.next().fuse() => { + match maybe_item { + Some(item) => { + // notify subscribers + subscribers.retain(|subscriber| { + let send_result = subscriber.try_send(item.clone()); + send_result.is_ok() + }); + } + None => { + // The underlying client has dropped, so we can't do anything here + // and need to stop the task. + return log_task_exit(subscription.desc(), "stream has finished"); + } + } + }, + } + } +} diff --git a/bridges/relays/client-substrate/src/client/traits.rs b/bridges/relays/client-substrate/src/client/traits.rs new file mode 100644 index 00000000000..49f5c001c3f --- /dev/null +++ b/bridges/relays/client-substrate/src/client/traits.rs @@ -0,0 +1,230 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + error::{Error, Result}, + AccountIdOf, AccountKeyPairOf, BlockNumberOf, Chain, ChainWithGrandpa, ChainWithTransactions, + HashOf, HeaderIdOf, HeaderOf, NonceOf, SignedBlockOf, SimpleRuntimeVersion, Subscription, + TransactionTracker, UnsignedTransaction, +}; + +use async_trait::async_trait; +use bp_runtime::{StorageDoubleMapKeyProvider, StorageMapKeyProvider}; +use codec::{Decode, Encode}; +use frame_support::weights::Weight; +use sp_core::{ + storage::{StorageData, StorageKey}, + Bytes, Pair, +}; +use sp_runtime::{traits::Header as _, transaction_validity::TransactionValidity}; +use sp_trie::StorageProof; +use sp_version::RuntimeVersion; +use std::fmt::Debug; + +/// Relay uses the `Client` to communicate with the node, connected to Substrate +/// chain `C`. +#[async_trait] +pub trait Client: 'static + Send + Sync + Clone + Debug { + /// Returns error if client has no connected peers or it believes it is far + /// behind the chain tip. + async fn ensure_synced(&self) -> Result<()>; + /// Reconnects the client. + async fn reconnect(&self) -> Result<()>; + + /// Return hash of the genesis block. + fn genesis_hash(&self) -> HashOf; + /// Get header hash by number. + async fn header_hash_by_number(&self, number: BlockNumberOf) -> Result>; + /// Get header by hash. + async fn header_by_hash(&self, hash: HashOf) -> Result>; + /// Get header by number. + async fn header_by_number(&self, number: BlockNumberOf) -> Result> { + self.header_by_hash(self.header_hash_by_number(number).await?).await + } + /// Get block by hash. + async fn block_by_hash(&self, hash: HashOf) -> Result>; + + /// Get best finalized header hash. + async fn best_finalized_header_hash(&self) -> Result>; + /// Get best finalized header number. + async fn best_finalized_header_number(&self) -> Result> { + Ok(*self.best_finalized_header().await?.number()) + } + /// Get best finalized header. + async fn best_finalized_header(&self) -> Result> { + self.header_by_hash(self.best_finalized_header_hash().await?).await + } + + /// Get best header. + async fn best_header(&self) -> Result>; + /// Get best header hash. + async fn best_header_hash(&self) -> Result> { + Ok(self.best_header().await?.hash()) + } + + /// Subscribe to new best headers. + async fn subscribe_best_headers(&self) -> Result>>; + /// Subscribe to new finalized headers. + async fn subscribe_finalized_headers(&self) -> Result>>; + + /// Subscribe to GRANDPA finality justifications. + async fn subscribe_grandpa_finality_justifications(&self) -> Result> + where + C: ChainWithGrandpa; + /// Generates a proof of key ownership for the given authority in the given set. + async fn generate_grandpa_key_ownership_proof( + &self, + at: HashOf, + set_id: sp_consensus_grandpa::SetId, + authority_id: sp_consensus_grandpa::AuthorityId, + ) -> Result>; + + /// Subscribe to BEEFY finality justifications. + async fn subscribe_beefy_finality_justifications(&self) -> Result>; + + /// Return `tokenDecimals` property from the set of chain properties. + async fn token_decimals(&self) -> Result>; + /// Get runtime version of the connected chain. + async fn runtime_version(&self) -> Result; + /// Get partial runtime version, to use when signing transactions. + async fn simple_runtime_version(&self) -> Result; + /// Returns `true` if version guard can be started. + /// + /// There's no reason to run version guard when version mode is set to `Auto`. It can + /// lead to relay shutdown when chain is upgraded, even though we have explicitly + /// said that we don't want to shutdown. + fn can_start_version_guard(&self) -> bool; + + /// Read raw value from runtime storage. + async fn raw_storage_value( + &self, + at: HashOf, + storage_key: StorageKey, + ) -> Result>; + /// Read and decode value from runtime storage. + async fn storage_value( + &self, + at: HashOf, + storage_key: StorageKey, + ) -> Result> { + self.raw_storage_value(at, storage_key.clone()) + .await? + .map(|encoded_value| { + T::decode(&mut &encoded_value.0[..]).map_err(|e| { + Error::failed_to_read_storage_value::(at, storage_key, e.into()) + }) + }) + .transpose() + } + /// Read and decode value from runtime storage map. + /// + /// `pallet_prefix` is the name of the pallet (used in `construct_runtime`), which + /// "contains" the storage map. + async fn storage_map_value( + &self, + at: HashOf, + pallet_prefix: &str, + storage_key: &T::Key, + ) -> Result> { + self.storage_value(at, T::final_key(pallet_prefix, storage_key)).await + } + /// Read and decode value from runtime storage double map. + /// + /// `pallet_prefix` is the name of the pallet (used in `construct_runtime`), which + /// "contains" the storage double map. + async fn storage_double_map_value( + &self, + at: HashOf, + pallet_prefix: &str, + key1: &T::Key1, + key2: &T::Key2, + ) -> Result> { + self.storage_value(at, T::final_key(pallet_prefix, key1, key2)).await + } + + /// Returns pending extrinsics from transaction pool. + async fn pending_extrinsics(&self) -> Result>; + /// Submit unsigned extrinsic for inclusion in a block. + /// + /// Note: The given transaction needs to be SCALE encoded beforehand. + async fn submit_unsigned_extrinsic(&self, transaction: Bytes) -> Result>; + /// Submit an extrinsic signed by given account. + /// + /// All calls of this method are synchronized, so there can't be more than one active + /// `submit_signed_extrinsic()` call. This guarantees that no nonces collision may happen + /// if all client instances are clones of the same initial `Client`. + /// + /// Note: The given transaction needs to be SCALE encoded beforehand. + async fn submit_signed_extrinsic( + &self, + signer: &AccountKeyPairOf, + prepare_extrinsic: impl FnOnce(HeaderIdOf, NonceOf) -> Result> + + Send + + 'static, + ) -> Result> + where + C: ChainWithTransactions, + AccountIdOf: From< as Pair>::Public>; + /// Does exactly the same as `submit_signed_extrinsic`, but keeps watching for extrinsic status + /// after submission. + async fn submit_and_watch_signed_extrinsic( + &self, + signer: &AccountKeyPairOf, + prepare_extrinsic: impl FnOnce(HeaderIdOf, NonceOf) -> Result> + + Send + + 'static, + ) -> Result> + where + C: ChainWithTransactions, + AccountIdOf: From< as Pair>::Public>; + /// Validate transaction at given block. + async fn validate_transaction( + &self, + at: HashOf, + transaction: SignedTransaction, + ) -> Result; + /// Returns weight of the given transaction. + async fn estimate_extrinsic_weight( + &self, + at: HashOf, + transaction: SignedTransaction, + ) -> Result; + + /// Execute runtime call at given block. + async fn raw_state_call( + &self, + at: HashOf, + method: String, + arguments: Args, + ) -> Result; + /// Execute runtime call at given block, provided the input and output types. + /// It also performs the input encode and output decode. + async fn state_call( + &self, + at: HashOf, + method: String, + arguments: Args, + ) -> Result { + let encoded_arguments = arguments.encode(); + let encoded_output = self.raw_state_call(at, method.clone(), arguments).await?; + Ret::decode(&mut &encoded_output.0[..]).map_err(|e| { + Error::failed_state_call::(at, method, Bytes(encoded_arguments), e.into()) + }) + } + + /// Returns storage proof of given storage keys. + async fn prove_storage(&self, at: HashOf, keys: Vec) -> Result; +} diff --git a/bridges/relays/client-substrate/src/error.rs b/bridges/relays/client-substrate/src/error.rs index 2133c188878..b09e2c7abdc 100644 --- a/bridges/relays/client-substrate/src/error.rs +++ b/bridges/relays/client-substrate/src/error.rs @@ -16,13 +16,13 @@ //! Substrate node RPC errors. -use crate::SimpleRuntimeVersion; +use crate::{BlockNumberOf, Chain, HashOf, SimpleRuntimeVersion}; use bp_header_chain::SubmitFinalityProofCallExtras; use bp_polkadot_core::parachains::ParaId; use jsonrpsee::core::ClientError as RpcError; use relay_utils::MaybeConnectionError; use sc_rpc_api::system::Health; -use sp_core::storage::StorageKey; +use sp_core::{storage::StorageKey, Bytes}; use sp_runtime::transaction_validity::TransactionValidityError; use thiserror::Error; @@ -43,12 +43,10 @@ pub enum Error { /// The response from the server could not be SCALE decoded. #[error("Response parse failed: {0}")] ResponseParseFailed(#[from] codec::Error), - /// Account does not exist on the chain. - #[error("Account does not exist on the chain.")] - AccountDoesNotExist, - /// Runtime storage is missing some mandatory value. - #[error("Mandatory storage value is missing from the runtime storage.")] - MissingMandatoryStorageValue, + /// Internal channel error - communication channel is either closed, or full. + /// It can be solved with reconnect. + #[error("Internal communication channel error: {0:?}.")] + ChannelError(String), /// Required parachain head is not present at the relay chain. #[error("Parachain {0:?} head {1} is missing from the relay chain storage.")] MissingRequiredParachainHead(ParaId, u64), @@ -58,6 +56,14 @@ pub enum Error { /// The client we're connected to is not synced, so we can't rely on its state. #[error("Substrate client is not synced {0}.")] ClientNotSynced(Health), + /// Failed to get system health. + #[error("Failed to get system health of {chain} node: {error:?}.")] + FailedToGetSystemHealth { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, /// Failed to read best finalized header hash from given chain. #[error("Failed to read best finalized header hash of {chain}: {error:?}.")] FailedToReadBestFinalizedHeaderHash { @@ -74,6 +80,16 @@ pub enum Error { /// Underlying error. error: Box, }, + /// Failed to read header hash by number from given chain. + #[error("Failed to read header hash by number {number} of {chain}: {error:?}.")] + FailedToReadHeaderHashByNumber { + /// Name of the chain where the error has happened. + chain: String, + /// Number of the header we've tried to read. + number: String, + /// Underlying error. + error: Box, + }, /// Failed to read header by hash from given chain. #[error("Failed to read header {hash} of {chain}: {error:?}.")] FailedToReadHeaderByHash { @@ -84,35 +100,119 @@ pub enum Error { /// Underlying error. error: Box, }, - /// Failed to execute runtime call at given chain. - #[error("Failed to execute runtime call {method} at {chain}: {error:?}.")] - ErrorExecutingRuntimeCall { + /// Failed to read block by hash from given chain. + #[error("Failed to read block {hash} of {chain}: {error:?}.")] + FailedToReadBlockByHash { /// Name of the chain where the error has happened. chain: String, - /// Runtime method name. - method: String, + /// Hash of the header we've tried to read. + hash: String, /// Underlying error. error: Box, }, /// Failed to read sotrage value at given chain. #[error("Failed to read storage value {key:?} at {chain}: {error:?}.")] - FailedToReadRuntimeStorageValue { + FailedToReadStorageValue { /// Name of the chain where the error has happened. chain: String, + /// Hash of the block we've tried to read value from. + hash: String, /// Runtime storage key key: StorageKey, /// Underlying error. error: Box, }, + /// Failed to read runtime version of given chain. + #[error("Failed to read runtime version of {chain}: {error:?}.")] + FailedToReadRuntimeVersion { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, + /// Failed to get pending extrinsics. + #[error("Failed to get pending extrinsics of {chain}: {error:?}.")] + FailedToGetPendingExtrinsics { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, + /// Failed to submit transaction. + #[error("Failed to submit {chain} transaction: {error:?}.")] + FailedToSubmitTransaction { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, + /// Runtime call has failed. + #[error("Runtime call {method} with arguments {arguments:?} of chain {chain} at {hash} has failed: {error:?}.")] + FailedStateCall { + /// Name of the chain where the error has happened. + chain: String, + /// Hash of the block we've tried to call at. + hash: String, + /// Runtime API method. + method: String, + /// Encoded method arguments. + arguments: Bytes, + /// Underlying error. + error: Box, + }, + /// Failed to prove storage keys. + #[error("Failed to prove storage keys {storage_keys:?} of {chain} at {hash}: {error:?}.")] + FailedToProveStorage { + /// Name of the chain where the error has happened. + chain: String, + /// Hash of the block we've tried to prove keys at. + hash: String, + /// Storage keys we have tried to prove. + storage_keys: Vec, + /// Underlying error. + error: Box, + }, + /// Failed to subscribe to GRANDPA justifications stream. + #[error("Failed to subscribe to {chain} best headers: {error:?}.")] + FailedToSubscribeBestHeaders { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, + /// Failed to subscribe to GRANDPA justifications stream. + #[error("Failed to subscribe to {chain} finalized headers: {error:?}.")] + FailedToSubscribeFinalizedHeaders { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, + /// Failed to subscribe to GRANDPA justifications stream. + #[error("Failed to subscribe to {chain} justifications: {error:?}.")] + FailedToSubscribeJustifications { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, + /// Headers of the chain are finalized out of order. Maybe chain has been + /// restarted? + #[error("Finalized headers of {chain} are unordered: previously finalized {prev_number} vs new {next_number}")] + UnorderedFinalizedHeaders { + /// Name of the chain where the error has happened. + chain: String, + /// Previously finalized header number. + prev_number: String, + /// New finalized header number. + next_number: String, + }, /// The bridge pallet is halted and all transactions will be rejected. #[error("Bridge pallet is halted.")] BridgePalletIsHalted, /// The bridge pallet is not yet initialized and all transactions will be rejected. #[error("Bridge pallet is not initialized.")] BridgePalletIsNotInitialized, - /// There's no best head of the parachain at the `pallet-bridge-parachains` at the target side. - #[error("No head of the ParaId({0}) at the bridge parachains pallet at {1}.")] - NoParachainHeadAtTarget(u32, String), /// An error has happened when we have tried to parse storage proof. #[error("Error when parsing storage proof: {0:?}.")] StorageProofError(bp_runtime::StorageProofError), @@ -143,7 +243,19 @@ pub enum Error { impl From for Error { fn from(error: tokio::task::JoinError) -> Self { - Error::Custom(format!("Failed to wait tokio task: {error}")) + Error::ChannelError(format!("failed to wait tokio task: {error}")) + } +} + +impl From> for Error { + fn from(error: async_std::channel::TrySendError) -> Self { + Error::ChannelError(format!("`try_send` has failed: {error:?}")) + } +} + +impl From for Error { + fn from(error: async_std::channel::RecvError) -> Self { + Error::ChannelError(format!("`recv` has failed: {error:?}")) } } @@ -152,21 +264,170 @@ impl Error { pub fn boxed(self) -> Box { Box::new(self) } + + /// Returns nested error reference. + pub fn nested(&self) -> Option<&Self> { + match *self { + Self::FailedToReadBestFinalizedHeaderHash { ref error, .. } => Some(&**error), + Self::FailedToReadBestHeader { ref error, .. } => Some(&**error), + Self::FailedToReadHeaderHashByNumber { ref error, .. } => Some(&**error), + Self::FailedToReadHeaderByHash { ref error, .. } => Some(&**error), + Self::FailedToReadBlockByHash { ref error, .. } => Some(&**error), + Self::FailedToReadStorageValue { ref error, .. } => Some(&**error), + Self::FailedToReadRuntimeVersion { ref error, .. } => Some(&**error), + Self::FailedToGetPendingExtrinsics { ref error, .. } => Some(&**error), + Self::FailedToSubmitTransaction { ref error, .. } => Some(&**error), + Self::FailedStateCall { ref error, .. } => Some(&**error), + Self::FailedToProveStorage { ref error, .. } => Some(&**error), + Self::FailedToGetSystemHealth { ref error, .. } => Some(&**error), + Self::FailedToSubscribeBestHeaders { ref error, .. } => Some(&**error), + Self::FailedToSubscribeFinalizedHeaders { ref error, .. } => Some(&**error), + Self::FailedToSubscribeJustifications { ref error, .. } => Some(&**error), + _ => None, + } + } + + /// Constructs `FailedToReadHeaderHashByNumber` variant. + pub fn failed_to_read_header_hash_by_number( + number: BlockNumberOf, + e: Error, + ) -> Self { + Error::FailedToReadHeaderHashByNumber { + chain: C::NAME.into(), + number: format!("{number}"), + error: e.boxed(), + } + } + + /// Constructs `FailedToReadHeaderByHash` variant. + pub fn failed_to_read_header_by_hash(hash: HashOf, e: Error) -> Self { + Error::FailedToReadHeaderByHash { + chain: C::NAME.into(), + hash: format!("{hash}"), + error: e.boxed(), + } + } + + /// Constructs `FailedToReadBlockByHash` variant. + pub fn failed_to_read_block_by_hash(hash: HashOf, e: Error) -> Self { + Error::FailedToReadHeaderByHash { + chain: C::NAME.into(), + hash: format!("{hash}"), + error: e.boxed(), + } + } + + /// Constructs `FailedToReadBestFinalizedHeaderHash` variant. + pub fn failed_to_read_best_finalized_header_hash(e: Error) -> Self { + Error::FailedToReadBestFinalizedHeaderHash { chain: C::NAME.into(), error: e.boxed() } + } + + /// Constructs `FailedToReadBestHeader` variant. + pub fn failed_to_read_best_header(e: Error) -> Self { + Error::FailedToReadBestHeader { chain: C::NAME.into(), error: e.boxed() } + } + + /// Constructs `FailedToReadRuntimeVersion` variant. + pub fn failed_to_read_runtime_version(e: Error) -> Self { + Error::FailedToReadRuntimeVersion { chain: C::NAME.into(), error: e.boxed() } + } + + /// Constructs `FailedToReadStorageValue` variant. + pub fn failed_to_read_storage_value( + at: HashOf, + key: StorageKey, + e: Error, + ) -> Self { + Error::FailedToReadStorageValue { + chain: C::NAME.into(), + hash: format!("{at}"), + key, + error: e.boxed(), + } + } + + /// Constructs `FailedToGetPendingExtrinsics` variant. + pub fn failed_to_get_pending_extrinsics(e: Error) -> Self { + Error::FailedToGetPendingExtrinsics { chain: C::NAME.into(), error: e.boxed() } + } + + /// Constructs `FailedToSubmitTransaction` variant. + pub fn failed_to_submit_transaction(e: Error) -> Self { + Error::FailedToSubmitTransaction { chain: C::NAME.into(), error: e.boxed() } + } + + /// Constructs `FailedStateCall` variant. + pub fn failed_state_call( + at: HashOf, + method: String, + arguments: Bytes, + e: Error, + ) -> Self { + Error::FailedStateCall { + chain: C::NAME.into(), + hash: format!("{at}"), + method, + arguments, + error: e.boxed(), + } + } + + /// Constructs `FailedToProveStorage` variant. + pub fn failed_to_prove_storage( + at: HashOf, + storage_keys: Vec, + e: Error, + ) -> Self { + Error::FailedToProveStorage { + chain: C::NAME.into(), + hash: format!("{at}"), + storage_keys, + error: e.boxed(), + } + } + + /// Constructs `FailedToGetSystemHealth` variant. + pub fn failed_to_get_system_health(e: Error) -> Self { + Error::FailedToGetSystemHealth { chain: C::NAME.into(), error: e.boxed() } + } + + /// Constructs `FailedToSubscribeBestHeaders` variant. + pub fn failed_to_subscribe_best_headers(e: Error) -> Self { + Error::FailedToSubscribeBestHeaders { chain: C::NAME.into(), error: e.boxed() } + } + + /// Constructs `FailedToSubscribeFinalizedHeaders` variant. + pub fn failed_to_subscribe_finalized_headers(e: Error) -> Self { + Error::FailedToSubscribeFinalizedHeaders { chain: C::NAME.into(), error: e.boxed() } + } + + /// Constructs `FailedToSubscribeJustifications` variant. + pub fn failed_to_subscribe_justification(e: Error) -> Self { + Error::FailedToSubscribeJustifications { chain: C::NAME.into(), error: e.boxed() } + } + + /// Constructs `Un` + pub fn unordered_finalized_headers( + prev_number: BlockNumberOf, + next_number: BlockNumberOf, + ) -> Self { + Error::UnorderedFinalizedHeaders { + chain: C::NAME.into(), + prev_number: format!("{}", prev_number), + next_number: format!("{}", next_number), + } + } } impl MaybeConnectionError for Error { fn is_connection_error(&self) -> bool { match *self { - Error::RpcError(RpcError::Transport(_)) | - Error::RpcError(RpcError::RestartNeeded(_)) | + Error::ChannelError(_) => true, + Error::RpcError(ref e) => + matches!(*e, RpcError::Transport(_) | RpcError::RestartNeeded(_),), Error::ClientNotSynced(_) => true, - Error::FailedToReadBestFinalizedHeaderHash { ref error, .. } => - error.is_connection_error(), - Error::FailedToReadBestHeader { ref error, .. } => error.is_connection_error(), - Error::FailedToReadHeaderByHash { ref error, .. } => error.is_connection_error(), - Error::ErrorExecutingRuntimeCall { ref error, .. } => error.is_connection_error(), - Error::FailedToReadRuntimeStorageValue { ref error, .. } => error.is_connection_error(), - _ => false, + Error::UnorderedFinalizedHeaders { .. } => true, + _ => self.nested().map(|e| e.is_connection_error()).unwrap_or(false), } } } diff --git a/bridges/relays/client-substrate/src/guard.rs b/bridges/relays/client-substrate/src/guard.rs index 47454892cd0..3dbf95bff8e 100644 --- a/bridges/relays/client-substrate/src/guard.rs +++ b/bridges/relays/client-substrate/src/guard.rs @@ -98,7 +98,7 @@ fn conditions_check_delay() -> Duration { } #[async_trait] -impl Environment for Client { +impl> Environment for Clnt { type Error = Error; async fn runtime_version(&mut self) -> Result { diff --git a/bridges/relays/client-substrate/src/lib.rs b/bridges/relays/client-substrate/src/lib.rs index d5b8d4dcced..12a1c48c09c 100644 --- a/bridges/relays/client-substrate/src/lib.rs +++ b/bridges/relays/client-substrate/src/lib.rs @@ -21,7 +21,6 @@ mod chain; mod client; mod error; -mod rpc; mod sync_header; mod transaction_tracker; @@ -37,14 +36,15 @@ pub use crate::{ AccountKeyPairOf, BlockWithJustification, CallOf, Chain, ChainWithBalances, ChainWithGrandpa, ChainWithMessages, ChainWithRuntimeVersion, ChainWithTransactions, ChainWithUtilityPallet, FullRuntimeUtilityPallet, MockedRuntimeUtilityPallet, Parachain, - RelayChain, SignParam, TransactionStatusOf, UnsignedTransaction, UtilityPallet, + RelayChain, SignParam, SignedBlockOf, TransactionStatusOf, UnsignedTransaction, + UtilityPallet, }, client::{ - is_ancient_block, ChainRuntimeVersion, Client, OpaqueGrandpaAuthoritiesSet, - SimpleRuntimeVersion, Subscription, ANCIENT_BLOCK_THRESHOLD, + is_ancient_block, rpc_with_caching as new, ChainRuntimeVersion, Client, + OpaqueGrandpaAuthoritiesSet, RpcWithCachingClient, SimpleRuntimeVersion, StreamDescription, + Subscription, ANCIENT_BLOCK_THRESHOLD, }, error::{Error, Result}, - rpc::{SubstrateBeefyFinalityClient, SubstrateFinalityClient, SubstrateGrandpaFinalityClient}, sync_header::SyncHeader, transaction_tracker::TransactionTracker, }; diff --git a/bridges/relays/client-substrate/src/metrics/float_storage_value.rs b/bridges/relays/client-substrate/src/metrics/float_storage_value.rs index 7bb92693b38..27c9d8cd7a8 100644 --- a/bridges/relays/client-substrate/src/metrics/float_storage_value.rs +++ b/bridges/relays/client-substrate/src/metrics/float_storage_value.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity Bridges Common. If not, see . -use crate::{chain::Chain, client::Client, Error as SubstrateError}; +use crate::{Chain, Client, Error as SubstrateError}; use async_std::sync::{Arc, RwLock}; use async_trait::async_trait; @@ -66,20 +66,20 @@ impl FloatStorageValue for FixedU128OrOne { /// Metric that represents fixed-point runtime storage value as float gauge. #[derive(Clone, Debug)] -pub struct FloatStorageValueMetric { +pub struct FloatStorageValueMetric { value_converter: V, - client: Client, + client: Clnt, storage_key: StorageKey, metric: Gauge, shared_value_ref: F64SharedRef, - _phantom: PhantomData, + _phantom: PhantomData<(C, V)>, } -impl FloatStorageValueMetric { +impl FloatStorageValueMetric { /// Create new metric. pub fn new( value_converter: V, - client: Client, + client: Clnt, storage_key: StorageKey, name: String, help: String, @@ -101,32 +101,39 @@ impl FloatStorageValueMetric { } } -impl Metric for FloatStorageValueMetric { +impl, V: FloatStorageValue> Metric + for FloatStorageValueMetric +{ fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { register(self.metric.clone(), registry).map(drop) } } #[async_trait] -impl StandaloneMetric for FloatStorageValueMetric { +impl, V: FloatStorageValue> StandaloneMetric + for FloatStorageValueMetric +{ fn update_interval(&self) -> Duration { C::AVERAGE_BLOCK_INTERVAL * UPDATE_INTERVAL_IN_BLOCKS } async fn update(&self) { - let value = self - .client - .raw_storage_value(self.storage_key.clone(), None) - .await - .and_then(|maybe_storage_value| { - self.value_converter.decode(maybe_storage_value).map(|maybe_fixed_point_value| { - maybe_fixed_point_value.map(|fixed_point_value| { - fixed_point_value.into_inner().unique_saturated_into() as f64 / - V::Value::DIV.unique_saturated_into() as f64 - }) + let value = async move { + let best_header_hash = self.client.best_header_hash().await?; + let maybe_storage_value = self + .client + .raw_storage_value(best_header_hash, self.storage_key.clone()) + .await?; + self.value_converter.decode(maybe_storage_value).map(|maybe_fixed_point_value| { + maybe_fixed_point_value.map(|fixed_point_value| { + fixed_point_value.into_inner().unique_saturated_into() as f64 / + V::Value::DIV.unique_saturated_into() as f64 }) }) - .map_err(|e| e.to_string()); + } + .await + .map_err(|e| e.to_string()); + relay_utils::metrics::set_gauge_value(&self.metric, value.clone()); *self.shared_value_ref.write().await = value.ok().and_then(|x| x); } diff --git a/bridges/relays/client-substrate/src/transaction_tracker.rs b/bridges/relays/client-substrate/src/transaction_tracker.rs index b181a945c2c..b4801c89f51 100644 --- a/bridges/relays/client-substrate/src/transaction_tracker.rs +++ b/bridges/relays/client-substrate/src/transaction_tracker.rs @@ -16,7 +16,7 @@ //! Helper for tracking transaction invalidation events. -use crate::{Chain, Client, Error, HashOf, HeaderIdOf, Subscription, TransactionStatusOf}; +use crate::{Chain, Error, HashOf, HeaderIdOf, Subscription, TransactionStatusOf}; use async_trait::async_trait; use futures::{future::Either, Future, FutureExt, Stream, StreamExt}; @@ -31,8 +31,10 @@ pub trait Environment: Send + Sync { async fn header_id_by_hash(&self, hash: HashOf) -> Result, Error>; } +// TODO (https://github.com/paritytech/parity-bridges-common/issues/2133): remove `Environment` trait +// after test client is implemented #[async_trait] -impl Environment for Client { +impl> Environment for T { async fn header_id_by_hash(&self, hash: HashOf) -> Result, Error> { self.header_by_hash(hash).await.map(|h| HeaderId(*h.number(), hash)) } @@ -76,6 +78,21 @@ impl> TransactionTracker { Self { environment, stall_timeout, transaction_hash, subscription } } + // TODO (https://github.com/paritytech/parity-bridges-common/issues/2133): remove me after + // test client is implemented + /// Converts self into tracker with different environment. + pub fn switch_environment>( + self, + environment: NewE, + ) -> TransactionTracker { + TransactionTracker { + environment, + stall_timeout: self.stall_timeout, + transaction_hash: self.transaction_hash, + subscription: self.subscription, + } + } + /// Wait for final transaction status and return it along with last known internal invalidation /// status. async fn do_wait( @@ -88,7 +105,7 @@ impl> TransactionTracker { let wait_for_invalidation = watch_transaction_status::<_, C, _>( self.environment, self.transaction_hash, - self.subscription.into_stream(), + self.subscription, ); futures::pin_mut!(wait_for_stall_timeout, wait_for_invalidation); @@ -284,7 +301,7 @@ async fn watch_transaction_status< #[cfg(test)] mod tests { use super::*; - use crate::test_chain::TestChain; + use crate::{test_chain::TestChain, StreamDescription}; use futures::{FutureExt, SinkExt}; use sc_transaction_pool_api::TransactionStatus; @@ -306,22 +323,27 @@ mod tests { TrackedTransactionStatus>, InvalidationStatus>, )> { - let (cancel_sender, _cancel_receiver) = futures::channel::oneshot::channel(); let (mut sender, receiver) = futures::channel::mpsc::channel(1); let tx_tracker = TransactionTracker::::new( TestEnvironment(Ok(HeaderId(0, Default::default()))), Duration::from_secs(0), Default::default(), - Subscription(async_std::sync::Mutex::new(receiver), cancel_sender), + Subscription::new_forwarded( + StreamDescription::new("test".into(), "test".into()), + receiver, + ), ); - let wait_for_stall_timeout = futures::future::pending(); + // we can't do `.now_or_never()` on `do_wait()` call, because `Subscription` has its own + // background thread, which may cause additional async task switches => let's leave some + // relatively small timeout here + let wait_for_stall_timeout = async_std::task::sleep(std::time::Duration::from_millis(100)); let wait_for_stall_timeout_rest = futures::future::ready(()); - sender.send(Some(status)).await.unwrap(); - tx_tracker - .do_wait(wait_for_stall_timeout, wait_for_stall_timeout_rest) - .now_or_never() - .map(|(ts, is)| (ts, is.unwrap())) + sender.send(Ok(status)).await.unwrap(); + + let (ts, is) = + tx_tracker.do_wait(wait_for_stall_timeout, wait_for_stall_timeout_rest).await; + is.map(|is| (ts, is)) } #[async_std::test] @@ -429,13 +451,15 @@ mod tests { #[async_std::test] async fn lost_on_timeout_when_waiting_for_invalidation_status() { - let (cancel_sender, _cancel_receiver) = futures::channel::oneshot::channel(); let (_sender, receiver) = futures::channel::mpsc::channel(1); let tx_tracker = TransactionTracker::::new( TestEnvironment(Ok(HeaderId(0, Default::default()))), Duration::from_secs(0), Default::default(), - Subscription(async_std::sync::Mutex::new(receiver), cancel_sender), + Subscription::new_forwarded( + StreamDescription::new("test".into(), "test".into()), + receiver, + ), ); let wait_for_stall_timeout = futures::future::ready(()).shared(); diff --git a/bridges/relays/lib-substrate-relay/src/cli/chain_schema.rs b/bridges/relays/lib-substrate-relay/src/cli/chain_schema.rs index 6246bdbf015..d985d35c9e8 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/chain_schema.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/chain_schema.rs @@ -123,11 +123,11 @@ macro_rules! declare_chain_connection_params_cli_schema { #[allow(dead_code)] pub async fn into_client( self, - ) -> anyhow::Result> { + ) -> anyhow::Result<$crate::cli::DefaultClient> { let chain_runtime_version = self .[<$chain_prefix _runtime_version>] .into_runtime_version(Chain::RUNTIME_VERSION)?; - Ok(relay_substrate_client::Client::new(relay_substrate_client::ConnectionParams { + Ok(relay_substrate_client::new(relay_substrate_client::ConnectionParams { uri: self.[<$chain_prefix _uri>], host: self.[<$chain_prefix _host>], port: self.[<$chain_prefix _port>], diff --git a/bridges/relays/lib-substrate-relay/src/cli/detect_equivocations.rs b/bridges/relays/lib-substrate-relay/src/cli/detect_equivocations.rs index b98e41b2a43..3921685d9e8 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/detect_equivocations.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/detect_equivocations.rs @@ -23,7 +23,7 @@ use crate::{ }; use async_trait::async_trait; -use relay_substrate_client::ChainWithTransactions; +use relay_substrate_client::{ChainWithTransactions, Client}; use structopt::StructOpt; /// Start equivocation detection loop. diff --git a/bridges/relays/lib-substrate-relay/src/cli/mod.rs b/bridges/relays/lib-substrate-relay/src/cli/mod.rs index 270608bf6ed..ddb3e416dc3 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/mod.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/mod.rs @@ -35,6 +35,11 @@ pub mod relay_parachains; /// The target that will be used when publishing logs related to this pallet. pub const LOG_TARGET: &str = "bridge"; +/// Default Substrate client type that we are using. We'll use it all over the glue CLI code +/// to avoid multiple level generic arguments and constraints. We still allow usage of other +/// clients in the **core logic code**. +pub type DefaultClient = relay_substrate_client::RpcWithCachingClient; + /// Lane id. #[derive(Debug, Clone, PartialEq, Eq)] pub struct HexLaneId(pub [u8; 4]); diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs index 093f98ef21e..ea92a0c9acc 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs @@ -29,6 +29,7 @@ use crate::{ finality::SubstrateFinalitySyncPipeline, HeadersToRelay, }; +use relay_substrate_client::Client; /// Chain headers relaying params. #[derive(StructOpt)] diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs index a796df6721b..05a061c2ea6 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs @@ -37,7 +37,7 @@ use structopt::StructOpt; use futures::{FutureExt, TryFutureExt}; use crate::{ - cli::{bridge::MessagesCliBridge, HexLaneId, PrometheusParams}, + cli::{bridge::MessagesCliBridge, DefaultClient, HexLaneId, PrometheusParams}, messages_lane::{MessagesRelayLimits, MessagesRelayParams}, on_demand::OnDemandRelay, HeadersToRelay, TaggedAccount, TransactionParams, @@ -46,7 +46,7 @@ use bp_messages::LaneId; use bp_runtime::BalanceOf; use relay_substrate_client::{ AccountIdOf, AccountKeyPairOf, Chain, ChainWithBalances, ChainWithMessages, - ChainWithRuntimeVersion, ChainWithTransactions, Client, + ChainWithRuntimeVersion, ChainWithTransactions, }; use relay_utils::metrics::MetricsParams; use sp_core::Pair; @@ -118,7 +118,7 @@ impl< /// Parameters that are associated with one side of the bridge. pub struct BridgeEndCommonParams { /// Chain client. - pub client: Client, + pub client: DefaultClient, /// Params used for sending transactions to the chain. pub tx_params: TransactionParams>, /// Accounts, which balances are exposed as metrics by the relay process. @@ -165,7 +165,7 @@ where target_to_source_headers_relay: Arc>, lane_id: LaneId, maybe_limits: Option, - ) -> MessagesRelayParams { + ) -> MessagesRelayParams, DefaultClient> { MessagesRelayParams { source_client: self.source.client.clone(), source_transaction_params: self.source.tx_params.clone(), @@ -317,28 +317,30 @@ where // Need 2x capacity since we consider both directions for each lane let mut message_relays = Vec::with_capacity(lanes.len() * 2); for lane in lanes { - let left_to_right_messages = crate::messages_lane::run::< - ::MessagesLane, - >(self.left_to_right().messages_relay_params( - left_to_right_on_demand_headers.clone(), - right_to_left_on_demand_headers.clone(), - lane, - Self::L2R::maybe_messages_limits(), - )) - .map_err(|e| anyhow::format_err!("{}", e)) - .boxed(); + let left_to_right_messages = + crate::messages_lane::run::<::MessagesLane, _, _>( + self.left_to_right().messages_relay_params( + left_to_right_on_demand_headers.clone(), + right_to_left_on_demand_headers.clone(), + lane, + Self::L2R::maybe_messages_limits(), + ), + ) + .map_err(|e| anyhow::format_err!("{}", e)) + .boxed(); message_relays.push(left_to_right_messages); - let right_to_left_messages = crate::messages_lane::run::< - ::MessagesLane, - >(self.right_to_left().messages_relay_params( - right_to_left_on_demand_headers.clone(), - left_to_right_on_demand_headers.clone(), - lane, - Self::R2L::maybe_messages_limits(), - )) - .map_err(|e| anyhow::format_err!("{}", e)) - .boxed(); + let right_to_left_messages = + crate::messages_lane::run::<::MessagesLane, _, _>( + self.right_to_left().messages_relay_params( + right_to_left_on_demand_headers.clone(), + left_to_right_on_demand_headers.clone(), + lane, + Self::R2L::maybe_messages_limits(), + ), + ) + .map_err(|e| anyhow::format_err!("{}", e)) + .boxed(); message_relays.push(right_to_left_messages); } diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs index 7f6f4077782..8104be7af80 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs @@ -23,6 +23,7 @@ use crate::{ cli::{ bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge}, relay_headers_and_messages::{Full2WayBridgeBase, Full2WayBridgeCommonParams}, + DefaultClient, }, finality::SubstrateFinalitySyncPipeline, on_demand::{ @@ -52,9 +53,9 @@ pub struct ParachainToParachainBridge< pub common: Full2WayBridgeCommonParams<::Target, ::Target>, /// Client of the left relay chain. - pub left_relay: Client<::SourceRelay>, + pub left_relay: DefaultClient<::SourceRelay>, /// Client of the right relay chain. - pub right_relay: Client<::SourceRelay>, + pub right_relay: DefaultClient<::SourceRelay>, } /// Create set of configuration objects specific to parachain-to-parachain relayer. @@ -175,25 +176,33 @@ where ) .await?; - let left_relay_to_right_on_demand_headers = - OnDemandHeadersRelay::<::RelayFinality>::new( - self.left_relay.clone(), - self.common.right.client.clone(), - self.common.right.tx_params.clone(), - self.common.shared.headers_to_relay(), - Some(self.common.metrics_params.clone()), - ); - let right_relay_to_left_on_demand_headers = - OnDemandHeadersRelay::<::RelayFinality>::new( - self.right_relay.clone(), - self.common.left.client.clone(), - self.common.left.tx_params.clone(), - self.common.shared.headers_to_relay(), - Some(self.common.metrics_params.clone()), - ); + let left_relay_to_right_on_demand_headers = OnDemandHeadersRelay::< + ::RelayFinality, + _, + _, + >::new( + self.left_relay.clone(), + self.common.right.client.clone(), + self.common.right.tx_params.clone(), + self.common.shared.headers_to_relay(), + Some(self.common.metrics_params.clone()), + ); + let right_relay_to_left_on_demand_headers = OnDemandHeadersRelay::< + ::RelayFinality, + _, + _, + >::new( + self.right_relay.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + self.common.shared.headers_to_relay(), + Some(self.common.metrics_params.clone()), + ); let left_to_right_on_demand_parachains = OnDemandParachainsRelay::< ::ParachainFinality, + _, + _, >::new( self.left_relay.clone(), self.common.right.client.clone(), @@ -202,6 +211,8 @@ where ); let right_to_left_on_demand_parachains = OnDemandParachainsRelay::< ::ParachainFinality, + _, + _, >::new( self.right_relay.clone(), self.common.left.client.clone(), diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs index 5911fe49df4..6c078973fed 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs @@ -26,6 +26,7 @@ use crate::{ RelayToRelayHeadersCliBridge, }, relay_headers_and_messages::{Full2WayBridgeBase, Full2WayBridgeCommonParams}, + DefaultClient, }, finality::SubstrateFinalitySyncPipeline, on_demand::{ @@ -54,7 +55,7 @@ pub struct RelayToParachainBridge< pub common: Full2WayBridgeCommonParams<::Target, ::Target>, /// Client of the right relay chain. - pub right_relay: Client<::SourceRelay>, + pub right_relay: DefaultClient<::SourceRelay>, } /// Create set of configuration objects specific to relay-to-parachain relayer. @@ -167,23 +168,28 @@ where .await?; let left_to_right_on_demand_headers = - OnDemandHeadersRelay::<::Finality>::new( + OnDemandHeadersRelay::<::Finality, _, _>::new( self.common.left.client.clone(), self.common.right.client.clone(), self.common.right.tx_params.clone(), self.common.shared.headers_to_relay(), None, ); - let right_relay_to_left_on_demand_headers = - OnDemandHeadersRelay::<::RelayFinality>::new( - self.right_relay.clone(), - self.common.left.client.clone(), - self.common.left.tx_params.clone(), - self.common.shared.headers_to_relay(), - Some(self.common.metrics_params.clone()), - ); + let right_relay_to_left_on_demand_headers = OnDemandHeadersRelay::< + ::RelayFinality, + _, + _, + >::new( + self.right_relay.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + self.common.shared.headers_to_relay(), + Some(self.common.metrics_params.clone()), + ); let right_to_left_on_demand_parachains = OnDemandParachainsRelay::< ::ParachainFinality, + _, + _, >::new( self.right_relay.clone(), self.common.left.client.clone(), diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs index 832df4ae400..3f8c8bb40c9 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs @@ -32,7 +32,7 @@ use crate::{ on_demand::{headers::OnDemandHeadersRelay, OnDemandRelay}, }; use relay_substrate_client::{ - AccountIdOf, AccountKeyPairOf, ChainWithRuntimeVersion, ChainWithTransactions, + AccountIdOf, AccountKeyPairOf, ChainWithRuntimeVersion, ChainWithTransactions, Client, }; use sp_core::Pair; @@ -148,7 +148,7 @@ where .await?; let left_to_right_on_demand_headers = - OnDemandHeadersRelay::<::Finality>::new( + OnDemandHeadersRelay::<::Finality, _, _>::new( self.common.left.client.clone(), self.common.right.client.clone(), self.common.right.tx_params.clone(), @@ -156,7 +156,7 @@ where None, ); let right_to_left_on_demand_headers = - OnDemandHeadersRelay::<::Finality>::new( + OnDemandHeadersRelay::<::Finality, _, _>::new( self.common.right.client.clone(), self.common.left.client.clone(), self.common.left.tx_params.clone(), diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs index 943feba072e..a17ae7c0c01 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs @@ -29,7 +29,8 @@ use structopt::StructOpt; use bp_messages::MessageNonce; use bp_runtime::HeaderIdProvider; use relay_substrate_client::{ - AccountIdOf, AccountKeyPairOf, BalanceOf, Chain, ChainWithRuntimeVersion, ChainWithTransactions, + AccountIdOf, AccountKeyPairOf, BalanceOf, Chain, ChainWithRuntimeVersion, + ChainWithTransactions, Client, }; use relay_utils::UniqueSaturatedInto; @@ -116,7 +117,7 @@ where let target_sign = data.target_sign.to_keypair::()?; let target_transactions_mortality = data.target_sign.transactions_mortality()?; - crate::messages_lane::run::(MessagesRelayParams { + crate::messages_lane::run::(MessagesRelayParams { source_client, source_transaction_params: TransactionParams { signer: source_sign, diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs index 00f8cf79ef1..77cd395ff72 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs @@ -21,7 +21,7 @@ use async_trait::async_trait; use bp_polkadot_core::BlockNumber as RelayBlockNumber; use bp_runtime::HeaderIdProvider; use parachains_relay::parachains_loop::{AvailableHeader, SourceClient, TargetClient}; -use relay_substrate_client::Parachain; +use relay_substrate_client::{Client, Parachain}; use relay_utils::metrics::{GlobalMetrics, StandaloneMetric}; use std::sync::Arc; use structopt::StructOpt; @@ -30,7 +30,7 @@ use crate::{ cli::{ bridge::{CliBridgeBase, ParachainToRelayHeadersCliBridge}, chain_schema::*, - PrometheusParams, + DefaultClient, PrometheusParams, }, parachains::{source::ParachainsSource, target::ParachainsTarget, ParachainsPipelineAdapter}, TransactionParams, @@ -72,16 +72,19 @@ pub struct RelayParachainHeadParams { #[async_trait] pub trait ParachainsRelayer: ParachainToRelayHeadersCliBridge where - ParachainsSource: + ParachainsSource>: SourceClient>, - ParachainsTarget: - TargetClient>, + ParachainsTarget< + Self::ParachainFinality, + DefaultClient, + DefaultClient, + >: TargetClient>, ::Source: Parachain, { /// Start relaying parachains finality. async fn relay_parachains(data: RelayParachainsParams) -> anyhow::Result<()> { let source_chain_client = data.source.into_client::().await?; - let source_client = ParachainsSource::::new( + let source_client = ParachainsSource::::new( source_chain_client.clone(), Arc::new(Mutex::new(AvailableHeader::Missing)), ); @@ -91,7 +94,7 @@ where mortality: data.target_sign.target_transactions_mortality, }; let target_chain_client = data.target.into_client::().await?; - let target_client = ParachainsTarget::::new( + let target_client = ParachainsTarget::::new( source_chain_client, target_chain_client, target_transaction_params, @@ -121,7 +124,7 @@ where .map_err(|e| anyhow::format_err!("{}", e))? .id(); - let source_client = ParachainsSource::::new( + let source_client = ParachainsSource::::new( source_chain_client.clone(), Arc::new(Mutex::new(AvailableHeader::Missing)), ); @@ -131,7 +134,7 @@ where mortality: data.target_sign.target_transactions_mortality, }; let target_chain_client = data.target.into_client::().await?; - let target_client = ParachainsTarget::::new( + let target_client = ParachainsTarget::::new( source_chain_client, target_chain_client, target_transaction_params, diff --git a/bridges/relays/lib-substrate-relay/src/equivocation/mod.rs b/bridges/relays/lib-substrate-relay/src/equivocation/mod.rs index f6d58cbaa4a..f8077923b82 100644 --- a/bridges/relays/lib-substrate-relay/src/equivocation/mod.rs +++ b/bridges/relays/lib-substrate-relay/src/equivocation/mod.rs @@ -69,7 +69,7 @@ pub trait SubstrateEquivocationDetectionPipeline: /// Add relay guards if required. async fn start_relay_guards( - source_client: &Client, + source_client: &impl Client, enable_version_guard: bool, ) -> relay_substrate_client::Result<()> { if enable_version_guard { @@ -199,8 +199,8 @@ macro_rules! generate_report_equivocation_call_builder { /// Run Substrate-to-Substrate equivocations detection loop. pub async fn run( - source_client: Client, - target_client: Client, + source_client: impl Client, + target_client: impl Client, source_transaction_params: TransactionParams>, metrics_params: MetricsParams, ) -> anyhow::Result<()> { @@ -212,8 +212,8 @@ pub async fn run( ); equivocation_detector::run( - SubstrateEquivocationSource::

::new(source_client, source_transaction_params), - SubstrateEquivocationTarget::

::new(target_client), + SubstrateEquivocationSource::::new(source_client, source_transaction_params), + SubstrateEquivocationTarget::::new(target_client), P::TargetChain::AVERAGE_BLOCK_INTERVAL, metrics_params, futures::future::pending(), diff --git a/bridges/relays/lib-substrate-relay/src/equivocation/source.rs b/bridges/relays/lib-substrate-relay/src/equivocation/source.rs index a0c7dcf5cbc..66d651600a1 100644 --- a/bridges/relays/lib-substrate-relay/src/equivocation/source.rs +++ b/bridges/relays/lib-substrate-relay/src/equivocation/source.rs @@ -35,29 +35,35 @@ use relay_substrate_client::{ use relay_utils::relay_loop::Client as RelayClient; /// Substrate node as equivocation source. -pub struct SubstrateEquivocationSource { - client: Client, +pub struct SubstrateEquivocationSource { + client: SourceClnt, transaction_params: TransactionParams>, } -impl SubstrateEquivocationSource

{ +impl> + SubstrateEquivocationSource +{ /// Create new instance of `SubstrateEquivocationSource`. pub fn new( - client: Client, + client: SourceClnt, transaction_params: TransactionParams>, ) -> Self { Self { client, transaction_params } } } -impl Clone for SubstrateEquivocationSource

{ +impl> Clone + for SubstrateEquivocationSource +{ fn clone(&self) -> Self { Self { client: self.client.clone(), transaction_params: self.transaction_params.clone() } } } #[async_trait] -impl RelayClient for SubstrateEquivocationSource

{ +impl> RelayClient + for SubstrateEquivocationSource +{ type Error = Error; async fn reconnect(&mut self) -> Result<(), Error> { @@ -66,8 +72,9 @@ impl RelayClient for SubstrateEquivoc } #[async_trait] -impl - SourceClientBase> for SubstrateEquivocationSource

+impl> + SourceClientBase> + for SubstrateEquivocationSource { type FinalityProofsStream = SubstrateFinalityProofsStream

; @@ -77,10 +84,11 @@ impl } #[async_trait] -impl - SourceClient> for SubstrateEquivocationSource

+impl> + SourceClient> + for SubstrateEquivocationSource { - type TransactionTracker = TransactionTracker>; + type TransactionTracker = TransactionTracker; async fn report_equivocation( &self, diff --git a/bridges/relays/lib-substrate-relay/src/equivocation/target.rs b/bridges/relays/lib-substrate-relay/src/equivocation/target.rs index 6eee2ab91d4..7d054e843d0 100644 --- a/bridges/relays/lib-substrate-relay/src/equivocation/target.rs +++ b/bridges/relays/lib-substrate-relay/src/equivocation/target.rs @@ -34,27 +34,33 @@ use sp_runtime::traits::Header; use std::marker::PhantomData; /// Substrate node as equivocation source. -pub struct SubstrateEquivocationTarget { - client: Client, +pub struct SubstrateEquivocationTarget { + client: TargetClnt, _phantom: PhantomData

, } -impl SubstrateEquivocationTarget

{ +impl> + SubstrateEquivocationTarget +{ /// Create new instance of `SubstrateEquivocationTarget`. - pub fn new(client: Client) -> Self { + pub fn new(client: TargetClnt) -> Self { Self { client, _phantom: Default::default() } } } -impl Clone for SubstrateEquivocationTarget

{ +impl> Clone + for SubstrateEquivocationTarget +{ fn clone(&self) -> Self { Self { client: self.client.clone(), _phantom: Default::default() } } } #[async_trait] -impl RelayClient for SubstrateEquivocationTarget

{ +impl> RelayClient + for SubstrateEquivocationTarget +{ type Error = Error; async fn reconnect(&mut self) -> Result<(), Error> { @@ -63,8 +69,9 @@ impl RelayClient for SubstrateEquivoc } #[async_trait] -impl - TargetClient> for SubstrateEquivocationTarget

+impl> + TargetClient> + for SubstrateEquivocationTarget { async fn best_finalized_header_number( &self, diff --git a/bridges/relays/lib-substrate-relay/src/finality/initialize.rs b/bridges/relays/lib-substrate-relay/src/finality/initialize.rs index 5dde46c39dd..a972f743e11 100644 --- a/bridges/relays/lib-substrate-relay/src/finality/initialize.rs +++ b/bridges/relays/lib-substrate-relay/src/finality/initialize.rs @@ -39,8 +39,8 @@ pub async fn initialize< TargetChain: ChainWithTransactions, F, >( - source_client: Client, - target_client: Client, + source_client: impl Client, + target_client: impl Client, target_signer: AccountKeyPairOf, prepare_initialize_transaction: F, dry_run: bool, @@ -101,8 +101,8 @@ async fn do_initialize< TargetChain: ChainWithTransactions, F, >( - source_client: Client, - target_client: Client, + source_client: impl Client, + target_client: impl Client, target_signer: AccountKeyPairOf, prepare_initialize_transaction: F, dry_run: bool, diff --git a/bridges/relays/lib-substrate-relay/src/finality/mod.rs b/bridges/relays/lib-substrate-relay/src/finality/mod.rs index 0293e1da224..a2379eb4812 100644 --- a/bridges/relays/lib-substrate-relay/src/finality/mod.rs +++ b/bridges/relays/lib-substrate-relay/src/finality/mod.rs @@ -77,7 +77,7 @@ pub trait SubstrateFinalitySyncPipeline: BaseSubstrateFinalitySyncPipeline { /// Add relay guards if required. async fn start_relay_guards( - target_client: &Client, + target_client: &impl Client, enable_version_guard: bool, ) -> relay_substrate_client::Result<()> { if enable_version_guard { @@ -240,8 +240,8 @@ macro_rules! generate_submit_finality_proof_ex_call_builder { /// Run Substrate-to-Substrate finality sync loop. pub async fn run( - source_client: Client, - target_client: Client, + source_client: impl Client, + target_client: impl Client, headers_to_relay: HeadersToRelay, transaction_params: TransactionParams>, metrics_params: MetricsParams, @@ -255,8 +255,8 @@ pub async fn run( ); finality_relay::run( - SubstrateFinalitySource::

::new(source_client, None), - SubstrateFinalityTarget::

::new(target_client, transaction_params.clone()), + SubstrateFinalitySource::::new(source_client, None), + SubstrateFinalityTarget::::new(target_client, transaction_params.clone()), finality_relay::FinalitySyncParams { tick: std::cmp::max( P::SourceChain::AVERAGE_BLOCK_INTERVAL, @@ -279,12 +279,12 @@ pub async fn run( /// Relay single header. No checks are made to ensure that transaction will succeed. pub async fn relay_single_header( - source_client: Client, - target_client: Client, + source_client: impl Client, + target_client: impl Client, transaction_params: TransactionParams>, header_number: BlockNumberOf, ) -> anyhow::Result<()> { - let finality_source = SubstrateFinalitySource::

::new(source_client, None); + let finality_source = SubstrateFinalitySource::::new(source_client, None); let (header, proof) = finality_source.header_and_finality_proof(header_number).await?; let Some(proof) = proof else { return Err(anyhow::format_err!( @@ -295,7 +295,7 @@ pub async fn relay_single_header( )); }; - let finality_target = SubstrateFinalityTarget::

::new(target_client, transaction_params); + let finality_target = SubstrateFinalityTarget::::new(target_client, transaction_params); let tx_tracker = finality_target.submit_finality_proof(header, proof, false).await?; match tx_tracker.wait().await { TrackedTransactionStatus::Finalized(_) => Ok(()), diff --git a/bridges/relays/lib-substrate-relay/src/finality/source.rs b/bridges/relays/lib-substrate-relay/src/finality/source.rs index c94af610895..f6fa5c24add 100644 --- a/bridges/relays/lib-substrate-relay/src/finality/source.rs +++ b/bridges/relays/lib-substrate-relay/src/finality/source.rs @@ -40,22 +40,24 @@ use relay_utils::{relay_loop::Client as RelayClient, UniqueSaturatedInto}; pub type RequiredHeaderNumberRef = Arc::BlockNumber>>; /// Substrate node as finality source. -pub struct SubstrateFinalitySource { - client: Client, +pub struct SubstrateFinalitySource { + client: SourceClnt, maximal_header_number: Option>, } -impl SubstrateFinalitySource

{ +impl> + SubstrateFinalitySource +{ /// Create new headers source using given client. pub fn new( - client: Client, + client: SourceClnt, maximal_header_number: Option>, ) -> Self { SubstrateFinalitySource { client, maximal_header_number } } /// Returns reference to the underlying RPC client. - pub fn client(&self) -> &Client { + pub fn client(&self) -> &SourceClnt { &self.client } @@ -174,7 +176,9 @@ impl SubstrateFinalitySource

{ } } -impl Clone for SubstrateFinalitySource

{ +impl Clone + for SubstrateFinalitySource +{ fn clone(&self) -> Self { SubstrateFinalitySource { client: self.client.clone(), @@ -184,7 +188,9 @@ impl Clone for SubstrateFinalitySource

{ } #[async_trait] -impl RelayClient for SubstrateFinalitySource

{ +impl> RelayClient + for SubstrateFinalitySource +{ type Error = Error; async fn reconnect(&mut self) -> Result<(), Error> { @@ -193,8 +199,8 @@ impl RelayClient for SubstrateFinalitySource

SourceClientBase> - for SubstrateFinalitySource

+impl> + SourceClientBase> for SubstrateFinalitySource { type FinalityProofsStream = SubstrateFinalityProofsStream

; @@ -204,8 +210,8 @@ impl SourceClientBase SourceClient> - for SubstrateFinalitySource

+impl> + SourceClient> for SubstrateFinalitySource { async fn best_finalized_block_number(&self) -> Result, Error> { let mut finalized_header_number = self.on_chain_best_finalized_block_number().await?; @@ -235,7 +241,7 @@ impl SourceClient( - client: &Client, + client: &impl Client, number: BlockNumberOf, ) -> Result< ( @@ -244,8 +250,8 @@ async fn header_and_finality_proof( ), Error, > { - let header_hash = client.block_hash_by_number(number).await?; - let signed_block = client.get_block(Some(header_hash)).await?; + let header_hash = client.header_hash_by_number(number).await?; + let signed_block = client.block_by_hash(header_hash).await?; let justification = signed_block .justification(P::FinalityEngine::ID) diff --git a/bridges/relays/lib-substrate-relay/src/finality/target.rs b/bridges/relays/lib-substrate-relay/src/finality/target.rs index 52ab2462c62..18b696685dd 100644 --- a/bridges/relays/lib-substrate-relay/src/finality/target.rs +++ b/bridges/relays/lib-substrate-relay/src/finality/target.rs @@ -28,22 +28,25 @@ use async_trait::async_trait; use bp_runtime::BlockNumberOf; use finality_relay::TargetClient; use relay_substrate_client::{ - AccountKeyPairOf, Chain, Client, Error, HeaderIdOf, HeaderOf, SyncHeader, TransactionEra, - TransactionTracker, UnsignedTransaction, + AccountIdOf, AccountKeyPairOf, Chain, Client, Error, HeaderIdOf, HeaderOf, SyncHeader, + TransactionEra, TransactionTracker, UnsignedTransaction, }; use relay_utils::relay_loop::Client as RelayClient; +use sp_core::Pair; use sp_runtime::traits::Header; /// Substrate client as Substrate finality target. -pub struct SubstrateFinalityTarget { - client: Client, +pub struct SubstrateFinalityTarget { + client: TargetClnt, transaction_params: TransactionParams>, } -impl SubstrateFinalityTarget

{ +impl> + SubstrateFinalityTarget +{ /// Create new Substrate headers target. pub fn new( - client: Client, + client: TargetClnt, transaction_params: TransactionParams>, ) -> Self { SubstrateFinalityTarget { client, transaction_params } @@ -65,7 +68,9 @@ impl SubstrateFinalityTarget

{ } } -impl Clone for SubstrateFinalityTarget

{ +impl Clone + for SubstrateFinalityTarget +{ fn clone(&self) -> Self { SubstrateFinalityTarget { client: self.client.clone(), @@ -75,7 +80,9 @@ impl Clone for SubstrateFinalityTarget

{ } #[async_trait] -impl RelayClient for SubstrateFinalityTarget

{ +impl> RelayClient + for SubstrateFinalityTarget +{ type Error = Error; async fn reconnect(&mut self) -> Result<(), Error> { @@ -84,10 +91,12 @@ impl RelayClient for SubstrateFinalityTarget

TargetClient> - for SubstrateFinalityTarget

+impl> + TargetClient> for SubstrateFinalityTarget +where + AccountIdOf: From< as Pair>::Public>, { - type TransactionTracker = TransactionTracker>; + type TransactionTracker = TransactionTracker; async fn best_finalized_source_block_id(&self) -> Result, Error> { // we can't continue to relay finality if target node is out of sync, because @@ -109,10 +118,10 @@ impl TargetClient Result>, Self::Error> { Ok(self .client - .typed_state_call( + .state_call( + self.client.best_header().await?.hash(), P::SourceChain::FREE_HEADERS_INTERVAL_METHOD.into(), (), - Some(self.client.best_header().await?.hash()), ) .await .unwrap_or_else(|e| { diff --git a/bridges/relays/lib-substrate-relay/src/finality_base/engine.rs b/bridges/relays/lib-substrate-relay/src/finality_base/engine.rs index 5a9ec42fde5..4f15d687719 100644 --- a/bridges/relays/lib-substrate-relay/src/finality_base/engine.rs +++ b/bridges/relays/lib-substrate-relay/src/finality_base/engine.rs @@ -28,10 +28,11 @@ use bp_header_chain::{ }; use bp_runtime::{BasicOperatingMode, HeaderIdProvider, OperatingMode}; use codec::{Decode, Encode}; +use futures::stream::StreamExt; use num_traits::{One, Zero}; use relay_substrate_client::{ BlockNumberOf, Chain, ChainWithGrandpa, Client, Error as SubstrateError, HashOf, HeaderOf, - Subscription, SubstrateFinalityClient, SubstrateGrandpaFinalityClient, + Subscription, }; use sp_consensus_grandpa::{AuthorityList as GrandpaAuthoritiesSet, GRANDPA_ENGINE_ID}; use sp_core::{storage::StorageKey, Bytes}; @@ -45,8 +46,6 @@ pub trait Engine: Send { const ID: ConsensusEngineId; /// A reader that can extract the consensus log from the header digest and interpret it. type ConsensusLogReader: ConsensusLogReader; - /// Type of Finality RPC client used by this engine. - type FinalityClient: SubstrateFinalityClient; /// Type of finality proofs, used by consensus engine. type FinalityProof: FinalityProof, BlockNumberOf> + Decode + Encode; /// The context needed for verifying finality proofs. @@ -74,10 +73,10 @@ pub trait Engine: Send { /// Returns `Ok(true)` if finality pallet at the bridged chain has already been initialized. async fn is_initialized( - target_client: &Client, + target_client: &impl Client, ) -> Result { Ok(target_client - .raw_storage_value(Self::is_initialized_key(), None) + .raw_storage_value(target_client.best_header_hash().await?, Self::is_initialized_key()) .await? .is_some()) } @@ -88,10 +87,13 @@ pub trait Engine: Send { /// Returns `Ok(true)` if finality pallet at the bridged chain is halted. async fn is_halted( - target_client: &Client, + target_client: &impl Client, ) -> Result { Ok(target_client - .storage_value::(Self::pallet_operating_mode_key(), None) + .storage_value::( + target_client.best_header_hash().await?, + Self::pallet_operating_mode_key(), + ) .await? .map(|operating_mode| operating_mode.is_halted()) .unwrap_or(false)) @@ -99,17 +101,15 @@ pub trait Engine: Send { /// A method to subscribe to encoded finality proofs, given source client. async fn source_finality_proofs( - source_client: &Client, - ) -> Result, SubstrateError> { - source_client.subscribe_finality_justifications::().await - } + source_client: &impl Client, + ) -> Result, SubstrateError>; /// Verify and optimize finality proof before sending it to the target node. /// /// Apart from optimization, we expect this method to perform all required checks /// that the `header` and `proof` are valid at the current state of the target chain. async fn verify_and_optimize_proof( - target_client: &Client, + target_client: &impl Client, header: &C::Header, proof: &mut Self::FinalityProof, ) -> Result; @@ -123,19 +123,19 @@ pub trait Engine: Send { /// Prepare initialization data for the finality bridge pallet. async fn prepare_initialization_data( - client: Client, + client: impl Client, ) -> Result, BlockNumberOf>>; /// Get the context needed for validating a finality proof. async fn finality_verification_context( - target_client: &Client, + target_client: &impl Client, at: HashOf, ) -> Result; /// Returns the finality info associated to the source headers synced with the target /// at the provided block. async fn synced_headers_finality_info( - target_client: &Client, + target_client: &impl Client, at: TargetChain::Hash, ) -> Result< Vec>, @@ -144,7 +144,7 @@ pub trait Engine: Send { /// Generate key ownership proof for the provided equivocation. async fn generate_source_key_ownership_proof( - source_client: &Client, + source_client: &impl Client, at: C::Hash, equivocation: &Self::EquivocationProof, ) -> Result; @@ -156,7 +156,7 @@ pub struct Grandpa(PhantomData); impl Grandpa { /// Read header by hash from the source client. async fn source_header( - source_client: &Client, + source_client: &impl Client, header_hash: C::Hash, ) -> Result, BlockNumberOf>> { source_client @@ -167,15 +167,15 @@ impl Grandpa { /// Read GRANDPA authorities set at given header. async fn source_authorities_set( - source_client: &Client, + source_client: &impl Client, header_hash: C::Hash, ) -> Result, BlockNumberOf>> { - let raw_authorities_set = source_client - .grandpa_authorities_set(header_hash) + const SUB_API_GRANDPA_AUTHORITIES: &str = "GrandpaApi_grandpa_authorities"; + + source_client + .state_call(header_hash, SUB_API_GRANDPA_AUTHORITIES.to_string(), ()) .await - .map_err(|err| Error::RetrieveAuthorities(C::NAME, header_hash, err))?; - GrandpaAuthoritiesSet::decode(&mut &raw_authorities_set[..]) - .map_err(|err| Error::DecodeAuthorities(C::NAME, header_hash, err)) + .map_err(|err| Error::RetrieveAuthorities(C::NAME, header_hash, err)) } } @@ -183,7 +183,6 @@ impl Grandpa { impl Engine for Grandpa { const ID: ConsensusEngineId = GRANDPA_ENGINE_ID; type ConsensusLogReader = GrandpaConsensusLogReader<::Number>; - type FinalityClient = SubstrateGrandpaFinalityClient; type FinalityProof = GrandpaJustification>; type FinalityVerificationContext = JustificationVerificationContext; type EquivocationProof = sp_consensus_grandpa::EquivocationProof, BlockNumberOf>; @@ -200,8 +199,14 @@ impl Engine for Grandpa { bp_header_chain::storage_keys::pallet_operating_mode_key(C::WITH_CHAIN_GRANDPA_PALLET_NAME) } + async fn source_finality_proofs( + client: &impl Client, + ) -> Result, SubstrateError> { + client.subscribe_grandpa_finality_justifications().await + } + async fn verify_and_optimize_proof( - target_client: &Client, + target_client: &impl Client, header: &C::Header, proof: &mut Self::FinalityProof, ) -> Result { @@ -239,7 +244,7 @@ impl Engine for Grandpa { /// Prepare initialization data for the GRANDPA verifier pallet. async fn prepare_initialization_data( - source_client: Client, + source_client: impl Client, ) -> Result, BlockNumberOf>> { // In ideal world we just need to get best finalized header and then to read GRANDPA // authorities set (`pallet_grandpa::CurrentSetId` + `GrandpaApi::grandpa_authorities()`) at @@ -248,17 +253,14 @@ impl Engine for Grandpa { // But now there are problems with this approach - `CurrentSetId` may return invalid value. // So here we're waiting for the next justification, read the authorities set and then try // to figure out the set id with bruteforce. - let justifications = Self::source_finality_proofs(&source_client) + let mut justifications = Self::source_finality_proofs(&source_client) .await .map_err(|err| Error::Subscribe(C::NAME, err))?; // Read next justification - the header that it finalizes will be used as initial header. let justification = justifications .next() .await - .map_err(|e| Error::ReadJustification(C::NAME, e)) - .and_then(|justification| { - justification.ok_or(Error::ReadJustificationStreamEnded(C::NAME)) - })?; + .ok_or(Error::ReadJustificationStreamEnded(C::NAME))?; // Read initial header. let justification: GrandpaJustification = @@ -359,14 +361,14 @@ impl Engine for Grandpa { } async fn finality_verification_context( - target_client: &Client, + target_client: &impl Client, at: HashOf, ) -> Result { let current_authority_set_key = bp_header_chain::storage_keys::current_authority_set_key( C::WITH_CHAIN_GRANDPA_PALLET_NAME, ); let authority_set: AuthoritySet = target_client - .storage_value(current_authority_set_key, Some(at)) + .storage_value(at, current_authority_set_key) .await? .map(Ok) .unwrap_or(Err(SubstrateError::Custom(format!( @@ -385,11 +387,11 @@ impl Engine for Grandpa { } async fn synced_headers_finality_info( - target_client: &Client, + target_client: &impl Client, at: TargetChain::Hash, ) -> Result>>, SubstrateError> { let stored_headers_grandpa_info: Vec>> = target_client - .typed_state_call(C::SYNCED_HEADERS_GRANDPA_INFO_METHOD.to_string(), (), Some(at)) + .state_call(at, C::SYNCED_HEADERS_GRANDPA_INFO_METHOD.to_string(), ()) .await?; let mut headers_grandpa_info = vec![]; @@ -407,7 +409,7 @@ impl Engine for Grandpa { } async fn generate_source_key_ownership_proof( - source_client: &Client, + source_client: &impl Client, at: C::Hash, equivocation: &Self::EquivocationProof, ) -> Result { diff --git a/bridges/relays/lib-substrate-relay/src/finality_base/mod.rs b/bridges/relays/lib-substrate-relay/src/finality_base/mod.rs index 825960b1b3e..71d15ca3868 100644 --- a/bridges/relays/lib-substrate-relay/src/finality_base/mod.rs +++ b/bridges/relays/lib-substrate-relay/src/finality_base/mod.rs @@ -50,11 +50,11 @@ pub type SubstrateFinalityProofsStream

= /// Subscribe to new finality proofs. pub async fn finality_proofs( - client: &Client, + client: &impl Client, ) -> Result, Error> { Ok(unfold( P::FinalityEngine::source_finality_proofs(client).await?, - move |subscription| async move { + move |mut subscription| async move { loop { let log_error = |err| { log::error!( @@ -65,8 +65,7 @@ pub async fn finality_proofs( ); }; - let next_justification = - subscription.next().await.map_err(|err| log_error(err.to_string())).ok()??; + let next_justification = subscription.next().await?; let decoded_justification = >::FinalityProof::decode( @@ -93,7 +92,7 @@ pub async fn finality_proofs( /// /// The runtime API method should be `FinalityApi::best_finalized()`. pub async fn best_synced_header_id( - target_client: &Client, + target_client: &impl Client, at: HashOf, ) -> Result>, Error> where @@ -102,6 +101,6 @@ where { // now let's read id of best finalized peer header at our best finalized block target_client - .typed_state_call(SourceChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), (), Some(at)) + .state_call(at, SourceChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), ()) .await } diff --git a/bridges/relays/lib-substrate-relay/src/messages_lane.rs b/bridges/relays/lib-substrate-relay/src/messages_lane.rs index 08550d19bae..e3786dcdc5e 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_lane.rs +++ b/bridges/relays/lib-substrate-relay/src/messages_lane.rs @@ -88,13 +88,13 @@ impl MessageLane for MessageLaneAdapter

{ } /// Substrate <-> Substrate messages relay parameters. -pub struct MessagesRelayParams { +pub struct MessagesRelayParams { /// Messages source client. - pub source_client: Client, + pub source_client: SourceClnt, /// Source transaction params. pub source_transaction_params: TransactionParams>, /// Messages target client. - pub target_client: Client, + pub target_client: TargetClnt, /// Target transaction params. pub target_transaction_params: TransactionParams>, /// Optional on-demand source to target headers relay. @@ -179,8 +179,13 @@ impl>> } /// Run Substrate-to-Substrate messages sync loop. -pub async fn run(params: MessagesRelayParams

) -> anyhow::Result<()> +pub async fn run( + params: MessagesRelayParams, +) -> anyhow::Result<()> where + P: SubstrateMessageLane, + SourceClnt: Client, + TargetClnt: Client, AccountIdOf: From< as Pair>::Public>, AccountIdOf: From< as Pair>::Public>, BalanceOf: TryFrom>, @@ -190,7 +195,7 @@ where let limits = match params.limits { Some(limits) => limits, None => - select_delivery_transaction_limits_rpc::

( + select_delivery_transaction_limits_rpc( ¶ms, P::TargetChain::max_extrinsic_weight(), P::SourceChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, @@ -250,14 +255,14 @@ where max_messages_size_in_single_batch, }, }, - SubstrateMessagesSource::

::new( + SubstrateMessagesSource::::new( source_client.clone(), target_client.clone(), params.lane_id, params.source_transaction_params, params.target_to_source_headers_relay, ), - SubstrateMessagesTarget::

::new( + SubstrateMessagesTarget::::new( target_client, source_client, params.lane_id, @@ -278,8 +283,8 @@ where /// Deliver range of Substrate-to-Substrate messages. No checks are made to ensure that transaction /// will succeed. pub async fn relay_messages_range( - source_client: Client, - target_client: Client, + source_client: impl Client, + target_client: impl Client, source_transaction_params: TransactionParams>, target_transaction_params: TransactionParams>, at_source_block: HeaderIdOf, @@ -295,14 +300,14 @@ where let relayer_id_at_source: AccountIdOf = source_transaction_params.signer.public().into(); messages_relay::relay_messages_range( - SubstrateMessagesSource::

::new( + SubstrateMessagesSource::::new( source_client.clone(), target_client.clone(), lane_id, source_transaction_params, None, ), - SubstrateMessagesTarget::

::new( + SubstrateMessagesTarget::::new( target_client, source_client, lane_id, @@ -321,8 +326,8 @@ where /// Relay messages delivery confirmation of Substrate-to-Substrate messages. /// No checks are made to ensure that transaction will succeed. pub async fn relay_messages_delivery_confirmation( - source_client: Client, - target_client: Client, + source_client: impl Client, + target_client: impl Client, source_transaction_params: TransactionParams>, at_target_block: HeaderIdOf, lane_id: LaneId, @@ -335,14 +340,14 @@ where let relayer_id_at_source: AccountIdOf = source_transaction_params.signer.public().into(); messages_relay::relay_messages_delivery_confirmation( - SubstrateMessagesSource::

::new( + SubstrateMessagesSource::::new( source_client.clone(), target_client.clone(), lane_id, source_transaction_params, None, ), - SubstrateMessagesTarget::

::new( + SubstrateMessagesTarget::::new( target_client, source_client, lane_id, @@ -546,12 +551,15 @@ macro_rules! generate_receive_message_delivery_proof_call_builder { } /// Returns maximal number of messages and their maximal cumulative dispatch weight. -async fn select_delivery_transaction_limits_rpc( - params: &MessagesRelayParams

, +async fn select_delivery_transaction_limits_rpc( + params: &MessagesRelayParams, max_extrinsic_weight: Weight, max_unconfirmed_messages_at_inbound_lane: MessageNonce, ) -> anyhow::Result where + P: SubstrateMessageLane, + SourceClnt: Client, + TargetClnt: Client, AccountIdOf: From< as Pair>::Public>, { // We may try to guess accurate value, based on maximal number of messages and per-message @@ -567,20 +575,21 @@ where let weight_for_messages_dispatch = max_extrinsic_weight - weight_for_delivery_tx; // weight of empty message delivery with outbound lane state - let delivery_tx_with_zero_messages = dummy_messages_delivery_transaction::

(params, 0)?; + let best_target_block_hash = params.target_client.best_header_hash().await?; + let delivery_tx_with_zero_messages = dummy_messages_delivery_transaction::(params, 0)?; let delivery_tx_with_zero_messages_weight = params .target_client - .extimate_extrinsic_weight(delivery_tx_with_zero_messages) + .estimate_extrinsic_weight(best_target_block_hash, delivery_tx_with_zero_messages) .await .map_err(|e| { anyhow::format_err!("Failed to estimate delivery extrinsic weight: {:?}", e) })?; // weight of single message delivery with outbound lane state - let delivery_tx_with_one_message = dummy_messages_delivery_transaction::

(params, 1)?; + let delivery_tx_with_one_message = dummy_messages_delivery_transaction::(params, 1)?; let delivery_tx_with_one_message_weight = params .target_client - .extimate_extrinsic_weight(delivery_tx_with_one_message) + .estimate_extrinsic_weight(best_target_block_hash, delivery_tx_with_one_message) .await .map_err(|e| { anyhow::format_err!("Failed to estimate delivery extrinsic weight: {:?}", e) @@ -615,8 +624,8 @@ where } /// Returns dummy message delivery transaction with zero messages and `1kb` proof. -fn dummy_messages_delivery_transaction( - params: &MessagesRelayParams

, +fn dummy_messages_delivery_transaction( + params: &MessagesRelayParams, messages: u32, ) -> anyhow::Result<::SignedTransaction> where diff --git a/bridges/relays/lib-substrate-relay/src/messages_metrics.rs b/bridges/relays/lib-substrate-relay/src/messages_metrics.rs index b30e75bd8ba..8845f43dcb6 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_metrics.rs +++ b/bridges/relays/lib-substrate-relay/src/messages_metrics.rs @@ -36,7 +36,7 @@ use std::{fmt::Debug, marker::PhantomData}; /// Add relay accounts balance metrics. pub async fn add_relay_balances_metrics( - client: Client, + client: impl Client, metrics: &MetricsParams, relay_accounts: &Vec>>, lanes: &[LaneId], diff --git a/bridges/relays/lib-substrate-relay/src/messages_source.rs b/bridges/relays/lib-substrate-relay/src/messages_source.rs index 49deff046f9..1f597e278da 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_source.rs +++ b/bridges/relays/lib-substrate-relay/src/messages_source.rs @@ -63,19 +63,21 @@ pub type SubstrateMessagesProof = (Weight, FromBridgedChainMessagesProof = Vec<(MessagePayload, &'a mut OutboundMessageDetails)>; /// Substrate client as Substrate messages source. -pub struct SubstrateMessagesSource { - source_client: Client, - target_client: Client, +pub struct SubstrateMessagesSource { + source_client: SourceClnt, + target_client: TargetClnt, lane_id: LaneId, transaction_params: TransactionParams>, target_to_source_headers_relay: Option>>, } -impl SubstrateMessagesSource

{ +impl, TargetClnt> + SubstrateMessagesSource +{ /// Create new Substrate headers source. pub fn new( - source_client: Client, - target_client: Client, + source_client: SourceClnt, + target_client: TargetClnt, lane_id: LaneId, transaction_params: TransactionParams>, target_to_source_headers_relay: Option< @@ -98,22 +100,25 @@ impl SubstrateMessagesSource

{ ) -> Result, SubstrateError> { self.source_client .storage_value( + id.hash(), outbound_lane_data_key( P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, &self.lane_id, ), - Some(id.1), ) .await } /// Ensure that the messages pallet at source chain is active. async fn ensure_pallet_active(&self) -> Result<(), SubstrateError> { - ensure_messages_pallet_active::(&self.source_client).await + ensure_messages_pallet_active::(&self.source_client) + .await } } -impl Clone for SubstrateMessagesSource

{ +impl Clone + for SubstrateMessagesSource +{ fn clone(&self) -> Self { Self { source_client: self.source_client.clone(), @@ -126,7 +131,12 @@ impl Clone for SubstrateMessagesSource

{ } #[async_trait] -impl RelayClient for SubstrateMessagesSource

{ +impl< + P: SubstrateMessageLane, + SourceClnt: Client, + TargetClnt: Client, + > RelayClient for SubstrateMessagesSource +{ type Error = SubstrateError; async fn reconnect(&mut self) -> Result<(), SubstrateError> { @@ -150,13 +160,17 @@ impl RelayClient for SubstrateMessagesSource

{ } #[async_trait] -impl SourceClient> for SubstrateMessagesSource

+impl< + P: SubstrateMessageLane, + SourceClnt: Client, + TargetClnt: Client, + > SourceClient> for SubstrateMessagesSource where AccountIdOf: From< as Pair>::Public>, { type BatchTransaction = BatchProofTransaction; - type TransactionTracker = TransactionTracker>; + type TransactionTracker = TransactionTracker; async fn state(&self) -> Result>, SubstrateError> { // we can't continue to deliver confirmations if source node is out of sync, because @@ -169,7 +183,7 @@ where // we can't relay confirmations if messages pallet at source chain is halted self.ensure_pallet_active().await?; - read_client_state(&self.source_client, Some(&self.target_client)).await + read_client_state_from_both_chains(&self.source_client, &self.target_client).await } async fn latest_generated_nonce( @@ -203,12 +217,12 @@ where id: SourceHeaderIdOf>, nonces: RangeInclusive, ) -> Result>, SubstrateError> { - let mut out_msgs_details = self + let mut out_msgs_details: Vec<_> = self .source_client - .typed_state_call::<_, Vec<_>>( + .state_call::<_, Vec<_>>( + id.hash(), P::TargetChain::TO_CHAIN_MESSAGE_DETAILS_METHOD.into(), (self.lane_id, *nonces.start(), *nonces.end()), - Some(id.1), ) .await?; validate_out_msgs_details::(&out_msgs_details, nonces)?; @@ -226,7 +240,7 @@ where out_msg_details.nonce, ); let msg_payload: MessagePayload = - self.source_client.storage_value(msg_key, Some(id.1)).await?.ok_or_else(|| { + self.source_client.storage_value(id.hash(), msg_key).await?.ok_or_else(|| { SubstrateError::Custom(format!( "Message to {} {:?}/{} is missing from runtime the storage of {} at {:?}", P::TargetChain::NAME, @@ -240,15 +254,16 @@ where msgs_to_refine.push((msg_payload, out_msg_details)); } + let best_target_header_hash = self.target_client.best_header_hash().await?; for mut msgs_to_refine_batch in split_msgs_to_refine::(self.lane_id, msgs_to_refine)? { let in_msgs_details = self .target_client - .typed_state_call::<_, Vec>( + .state_call::<_, Vec>( + best_target_header_hash, P::SourceChain::FROM_CHAIN_MESSAGE_DETAILS_METHOD.into(), (self.lane_id, &msgs_to_refine_batch), - None, ) .await?; if in_msgs_details.len() != msgs_to_refine_batch.len() { @@ -326,7 +341,7 @@ where let proof = self .source_client - .prove_storage(storage_keys, id.1) + .prove_storage(id.1, storage_keys) .await? .into_iter_nodes() .collect(); @@ -387,15 +402,19 @@ where } /// Ensure that the messages pallet at source chain is active. -pub(crate) async fn ensure_messages_pallet_active( - client: &Client, +pub(crate) async fn ensure_messages_pallet_active( + client: &AtChainClient, ) -> Result<(), SubstrateError> where AtChain: ChainWithMessages, WithChain: ChainWithMessages, + AtChainClient: Client, { let operating_mode = client - .storage_value(operating_mode_key(WithChain::WITH_CHAIN_MESSAGES_PALLET_NAME), None) + .storage_value( + client.best_header_hash().await?, + operating_mode_key(WithChain::WITH_CHAIN_MESSAGES_PALLET_NAME), + ) .await?; let is_halted = operating_mode == Some(MessagesOperatingMode::Basic(BasicOperatingMode::Halted)); @@ -412,11 +431,10 @@ where /// bridge GRANDPA pallet deployed and it provides `best_finalized_header_id_method_name` /// runtime API to read the best finalized Bridged chain header. /// -/// If `peer_client` is `None`, the value of `actual_best_finalized_peer_at_best_self` will -/// always match the `best_finalized_peer_at_best_self`. +/// The value of `actual_best_finalized_peer_at_best_self` will always match +/// the `best_finalized_peer_at_best_self`. pub async fn read_client_state( - self_client: &Client, - peer_client: Option<&Client>, + self_client: &impl Client, ) -> Result, HeaderIdOf>, SubstrateError> where SelfChain: Chain, @@ -431,30 +449,42 @@ where let peer_on_self_best_finalized_id = best_synced_header_id::(self_client, self_best_id.hash()).await?; - // read actual header, matching the `peer_on_self_best_finalized_id` from the peer chain - let actual_peer_on_self_best_finalized_id = - match (peer_client, peer_on_self_best_finalized_id.as_ref()) { - (Some(peer_client), Some(peer_on_self_best_finalized_id)) => { - let actual_peer_on_self_best_finalized = - peer_client.header_by_number(peer_on_self_best_finalized_id.number()).await?; - Some(actual_peer_on_self_best_finalized.id()) - }, - _ => peer_on_self_best_finalized_id, - }; - Ok(ClientState { best_self: self_best_id, best_finalized_self: self_best_finalized_id, best_finalized_peer_at_best_self: peer_on_self_best_finalized_id, - actual_best_finalized_peer_at_best_self: actual_peer_on_self_best_finalized_id, + actual_best_finalized_peer_at_best_self: peer_on_self_best_finalized_id, }) } +/// Does the same stuff as `read_client_state`, but properly fills the +/// `actual_best_finalized_peer_at_best_self` field of the result. +pub async fn read_client_state_from_both_chains( + self_client: &impl Client, + peer_client: &impl Client, +) -> Result, HeaderIdOf>, SubstrateError> +where + SelfChain: Chain, + PeerChain: Chain, +{ + let mut client_state = read_client_state::(self_client).await?; + client_state.actual_best_finalized_peer_at_best_self = + match client_state.best_finalized_peer_at_best_self.as_ref() { + Some(peer_on_self_best_finalized_id) => { + let actual_peer_on_self_best_finalized = + peer_client.header_by_number(peer_on_self_best_finalized_id.number()).await?; + Some(actual_peer_on_self_best_finalized.id()) + }, + _ => client_state.best_finalized_peer_at_best_self, + }; + Ok(client_state) +} + /// Reads best `PeerChain` header known to the `SelfChain` using provided runtime API method. /// /// Method is supposed to be the `FinalityApi::best_finalized()` method. pub async fn best_finalized_peer_header_at_self( - self_client: &Client, + self_client: &impl Client, at_self_hash: HashOf, ) -> Result>, SubstrateError> where @@ -463,10 +493,10 @@ where { // now let's read id of best finalized peer header at our best finalized block self_client - .typed_state_call::<_, Option<_>>( + .state_call::<_, Option<_>>( + at_self_hash, PeerChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), (), - Some(at_self_hash), ) .await } diff --git a/bridges/relays/lib-substrate-relay/src/messages_target.rs b/bridges/relays/lib-substrate-relay/src/messages_target.rs index 5ffb2b6c771..e1c7645eac6 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_target.rs +++ b/bridges/relays/lib-substrate-relay/src/messages_target.rs @@ -23,7 +23,9 @@ use crate::{ BatchProofTransaction, MessageLaneAdapter, ReceiveMessagesProofCallBuilder, SubstrateMessageLane, }, - messages_source::{ensure_messages_pallet_active, read_client_state, SubstrateMessagesProof}, + messages_source::{ + ensure_messages_pallet_active, read_client_state_from_both_chains, SubstrateMessagesProof, + }, on_demand::OnDemandRelay, TransactionParams, }; @@ -52,20 +54,24 @@ pub type SubstrateMessagesDeliveryProof = (UnrewardedRelayersState, FromBridgedChainMessagesDeliveryProof>); /// Substrate client as Substrate messages target. -pub struct SubstrateMessagesTarget { - target_client: Client, - source_client: Client, +pub struct SubstrateMessagesTarget { + target_client: TargetClnt, + source_client: SourceClnt, lane_id: LaneId, relayer_id_at_source: AccountIdOf, transaction_params: Option>>, source_to_target_headers_relay: Option>>, } -impl SubstrateMessagesTarget

{ +impl SubstrateMessagesTarget +where + P: SubstrateMessageLane, + TargetClnt: Client, +{ /// Create new Substrate headers target. pub fn new( - target_client: Client, - source_client: Client, + target_client: TargetClnt, + source_client: SourceClnt, lane_id: LaneId, relayer_id_at_source: AccountIdOf, transaction_params: Option>>, @@ -90,22 +96,25 @@ impl SubstrateMessagesTarget

{ ) -> Result>>, SubstrateError> { self.target_client .storage_value( + id.hash(), inbound_lane_data_key( P::SourceChain::WITH_CHAIN_MESSAGES_PALLET_NAME, &self.lane_id, ), - Some(id.1), ) .await } /// Ensure that the messages pallet at target chain is active. async fn ensure_pallet_active(&self) -> Result<(), SubstrateError> { - ensure_messages_pallet_active::(&self.target_client).await + ensure_messages_pallet_active::(&self.target_client) + .await } } -impl Clone for SubstrateMessagesTarget

{ +impl Clone + for SubstrateMessagesTarget +{ fn clone(&self) -> Self { Self { target_client: self.target_client.clone(), @@ -119,7 +128,12 @@ impl Clone for SubstrateMessagesTarget

{ } #[async_trait] -impl RelayClient for SubstrateMessagesTarget

{ +impl< + P: SubstrateMessageLane, + SourceClnt: Client, + TargetClnt: Client, + > RelayClient for SubstrateMessagesTarget +{ type Error = SubstrateError; async fn reconnect(&mut self) -> Result<(), SubstrateError> { @@ -143,14 +157,18 @@ impl RelayClient for SubstrateMessagesTarget

{ } #[async_trait] -impl TargetClient> for SubstrateMessagesTarget

+impl< + P: SubstrateMessageLane, + SourceClnt: Client, + TargetClnt: Client, + > TargetClient> for SubstrateMessagesTarget where AccountIdOf: From< as Pair>::Public>, BalanceOf: TryFrom>, { type BatchTransaction = BatchProofTransaction; - type TransactionTracker = TransactionTracker>; + type TransactionTracker = TransactionTracker; async fn state(&self) -> Result>, SubstrateError> { // we can't continue to deliver confirmations if source node is out of sync, because @@ -163,7 +181,7 @@ where // we can't relay messages if messages pallet at target chain is halted self.ensure_pallet_active().await?; - read_client_state(&self.target_client, Some(&self.source_client)).await + read_client_state_from_both_chains(&self.target_client, &self.source_client).await } async fn latest_received_nonce( @@ -219,7 +237,7 @@ where ); let proof = self .target_client - .prove_storage(vec![inbound_data_key], id.1) + .prove_storage(id.hash(), vec![inbound_data_key]) .await? .into_iter_nodes() .collect(); diff --git a/bridges/relays/lib-substrate-relay/src/on_demand/headers.rs b/bridges/relays/lib-substrate-relay/src/on_demand/headers.rs index 202f53ea4e4..d18c582dfac 100644 --- a/bridges/relays/lib-substrate-relay/src/on_demand/headers.rs +++ b/bridges/relays/lib-substrate-relay/src/on_demand/headers.rs @@ -53,25 +53,30 @@ use crate::{ /// relay) needs it to continue its regular work. When enough headers are relayed, on-demand stops /// syncing headers. #[derive(Clone)] -pub struct OnDemandHeadersRelay { +pub struct OnDemandHeadersRelay { /// Relay task name. relay_task_name: String, /// Shared reference to maximal required finalized header number. required_header_number: RequiredHeaderNumberRef, /// Client of the source chain. - source_client: Client, + source_client: SourceClnt, /// Client of the target chain. - target_client: Client, + target_client: TargetClnt, } -impl OnDemandHeadersRelay

{ +impl< + P: SubstrateFinalitySyncPipeline, + SourceClnt: Client, + TargetClnt: Client, + > OnDemandHeadersRelay +{ /// Create new on-demand headers relay. /// /// If `metrics_params` is `Some(_)`, the metrics of the finality relay are registered. /// Otherwise, all required metrics must be exposed outside of this method. pub fn new( - source_client: Client, - target_client: Client, + source_client: SourceClnt, + target_client: TargetClnt, target_transaction_params: TransactionParams>, headers_to_relay: HeadersToRelay, metrics_params: Option, @@ -104,8 +109,12 @@ impl OnDemandHeadersRelay

{ } #[async_trait] -impl OnDemandRelay - for OnDemandHeadersRelay

+impl< + P: SubstrateFinalitySyncPipeline, + SourceClnt: Client, + TargetClnt: Client, + > OnDemandRelay + for OnDemandHeadersRelay { async fn reconnect(&self) -> Result<(), SubstrateError> { // using clone is fine here (to avoid mut requirement), because clone on Client clones @@ -139,7 +148,7 @@ impl OnDemandRelay::new(self.source_client.clone(), None); + SubstrateFinalitySource::::new(self.source_client.clone(), None); let (header, mut proof) = finality_source.prove_block_finality(current_required_header).await?; let header_id = header.id(); @@ -198,8 +207,8 @@ impl OnDemandRelay( - source_client: Client, - target_client: Client, + source_client: impl Client, + target_client: impl Client, target_transaction_params: TransactionParams>, headers_to_relay: HeadersToRelay, required_header_number: RequiredHeaderNumberRef, @@ -209,7 +218,7 @@ async fn background_task( { let relay_task_name = on_demand_headers_relay_name::(); let target_transactions_mortality = target_transaction_params.mortality; - let mut finality_source = SubstrateFinalitySource::

::new( + let mut finality_source = SubstrateFinalitySource::::new( source_client.clone(), Some(required_header_number.clone()), ); @@ -246,7 +255,8 @@ async fn background_task( // read best finalized source header number from target let best_finalized_source_header_at_target = - best_finalized_source_header_at_target::

(&finality_target, &relay_task_name).await; + best_finalized_source_header_at_target::(&finality_target, &relay_task_name) + .await; if matches!(best_finalized_source_header_at_target, Err(ref e) if e.is_connection_error()) { relay_utils::relay_loop::reconnect_failed_client( FailedClient::Target, @@ -410,13 +420,17 @@ async fn mandatory_headers_scan_range( /// it. /// /// Returns `true` if header was found and (asked to be) relayed and `false` otherwise. -async fn relay_mandatory_header_from_range( - finality_source: &SubstrateFinalitySource

, +async fn relay_mandatory_header_from_range( + finality_source: &SubstrateFinalitySource, required_header_number: &RequiredHeaderNumberRef, best_finalized_source_header_at_target: String, range: (BlockNumberOf, BlockNumberOf), relay_task_name: &str, -) -> Result { +) -> Result +where + P: SubstrateFinalitySyncPipeline, + SourceClnt: Client, +{ // search for mandatory header first let mandatory_source_header_number = find_mandatory_header_in_range(finality_source, range).await?; @@ -451,10 +465,14 @@ async fn relay_mandatory_header_from_range( /// Read best finalized source block number from source client. /// /// Returns `None` if we have failed to read the number. -async fn best_finalized_source_header_at_source( - finality_source: &SubstrateFinalitySource

, +async fn best_finalized_source_header_at_source( + finality_source: &SubstrateFinalitySource, relay_task_name: &str, -) -> Result, relay_substrate_client::Error> { +) -> Result, relay_substrate_client::Error> +where + P: SubstrateFinalitySyncPipeline, + SourceClnt: Client, +{ finality_source.on_chain_best_finalized_block_number().await.map_err(|error| { log::error!( target: "bridge", @@ -470,11 +488,16 @@ async fn best_finalized_source_header_at_source( - finality_target: &SubstrateFinalityTarget

, +async fn best_finalized_source_header_at_target( + finality_target: &SubstrateFinalityTarget, relay_task_name: &str, -) -> Result, as RelayClient>::Error> +) -> Result< + BlockNumberOf, + as RelayClient>::Error, +> where + P: SubstrateFinalitySyncPipeline, + TargetClnt: Client, AccountIdOf: From< as sp_core::Pair>::Public>, { finality_target @@ -496,10 +519,14 @@ where /// Read first mandatory header in given inclusive range. /// /// Returns `Ok(None)` if there were no mandatory headers in the range. -async fn find_mandatory_header_in_range( - finality_source: &SubstrateFinalitySource

, +async fn find_mandatory_header_in_range( + finality_source: &SubstrateFinalitySource, range: (BlockNumberOf, BlockNumberOf), -) -> Result>, relay_substrate_client::Error> { +) -> Result>, relay_substrate_client::Error> +where + P: SubstrateFinalitySyncPipeline, + SourceClnt: Client, +{ let mut current = range.0; while current <= range.1 { let header = finality_source.client().header_by_number(current).await?; diff --git a/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs b/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs index 966bdc31072..654cb6628d5 100644 --- a/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs +++ b/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs @@ -53,29 +53,34 @@ use std::fmt::Debug; /// (e.g. messages relay) needs it to continue its regular work. When enough parachain headers /// are relayed, on-demand stops syncing headers. #[derive(Clone)] -pub struct OnDemandParachainsRelay { +pub struct OnDemandParachainsRelay { /// Relay task name. relay_task_name: String, /// Channel used to communicate with background task and ask for relay of parachain heads. required_header_number_sender: Sender>, /// Source relay chain client. - source_relay_client: Client, + source_relay_client: SourceRelayClnt, /// Target chain client. - target_client: Client, + target_client: TargetClnt, /// On-demand relay chain relay. on_demand_source_relay_to_target_headers: Arc>, } -impl OnDemandParachainsRelay

{ +impl< + P: SubstrateParachainsPipeline, + SourceRelayClnt: Client, + TargetClnt: Client, + > OnDemandParachainsRelay +{ /// Create new on-demand parachains relay. /// /// Note that the argument is the source relay chain client, not the parachain client. /// That's because parachain finality is determined by the relay chain and we don't /// need to connect to the parachain itself here. pub fn new( - source_relay_client: Client, - target_client: Client, + source_relay_client: SourceRelayClnt, + target_client: TargetClnt, target_transaction_params: TransactionParams>, on_demand_source_relay_to_target_headers: Arc< dyn OnDemandRelay, @@ -114,10 +119,13 @@ impl OnDemandParachainsRelay

{ } #[async_trait] -impl OnDemandRelay - for OnDemandParachainsRelay

+impl + OnDemandRelay + for OnDemandParachainsRelay where P::SourceParachain: Chain, + SourceRelayClnt: Client, + TargetClnt: Client, { async fn reconnect(&self) -> Result<(), SubstrateError> { // using clone is fine here (to avoid mut requirement), because clone on Client clones @@ -147,7 +155,7 @@ where required_parachain_header: BlockNumberOf, ) -> Result<(HeaderIdOf, Vec>), SubstrateError> { // select headers to prove - let parachains_source = ParachainsSource::

::new( + let parachains_source = ParachainsSource::::new( self.source_relay_client.clone(), Arc::new(Mutex::new(AvailableHeader::Missing)), ); @@ -231,8 +239,8 @@ where /// Background task that is responsible for starting parachain headers relay. async fn background_task( - source_relay_client: Client, - target_client: Client, + source_relay_client: impl Client, + target_client: impl Client, target_transaction_params: TransactionParams>, on_demand_source_relay_to_target_headers: Arc< dyn OnDemandRelay, @@ -255,9 +263,11 @@ async fn background_task( let parachains_relay_task = futures::future::Fuse::terminated(); futures::pin_mut!(parachains_relay_task); - let mut parachains_source = - ParachainsSource::

::new(source_relay_client.clone(), required_para_header_ref.clone()); - let mut parachains_target = ParachainsTarget::

::new( + let mut parachains_source = ParachainsSource::::new( + source_relay_client.clone(), + required_para_header_ref.clone(), + ); + let mut parachains_target = ParachainsTarget::::new( source_relay_client.clone(), target_client.clone(), target_transaction_params.clone(), @@ -446,9 +456,9 @@ struct RelayData { } /// Read required data from source and target clients. -async fn read_relay_data( - source: &ParachainsSource

, - target: &ParachainsTarget

, +async fn read_relay_data( + source: &ParachainsSource, + target: &ParachainsTarget, required_header_number: BlockNumberOf, ) -> Result< RelayData< @@ -459,7 +469,9 @@ async fn read_relay_data( FailedClient, > where - ParachainsTarget

: + SourceRelayClnt: Client, + TargetClnt: Client, + ParachainsTarget: TargetClient> + RelayClient, { let map_target_err = |e| { @@ -642,13 +654,19 @@ trait SelectHeadersToProveEnvironment { } #[async_trait] -impl<'a, P: SubstrateParachainsPipeline> +impl<'a, P: SubstrateParachainsPipeline, SourceRelayClnt, TargetClnt> SelectHeadersToProveEnvironment< BlockNumberOf, HashOf, BlockNumberOf, HashOf, - > for (&'a OnDemandParachainsRelay

, &'a ParachainsSource

) + > + for ( + &'a OnDemandParachainsRelay, + &'a ParachainsSource, + ) where + SourceRelayClnt: Client, + TargetClnt: Client, { fn parachain_id(&self) -> ParaId { ParaId(P::SourceParachain::PARACHAIN_ID) @@ -665,7 +683,6 @@ impl<'a, P: SubstrateParachainsPipeline> ) -> Result, SubstrateError> { Ok(crate::messages_source::read_client_state::( &self.0.target_client, - None, ) .await? .best_finalized_peer_at_best_self diff --git a/bridges/relays/lib-substrate-relay/src/parachains/source.rs b/bridges/relays/lib-substrate-relay/src/parachains/source.rs index 4cc512b9d9b..11b9d6dbf5b 100644 --- a/bridges/relays/lib-substrate-relay/src/parachains/source.rs +++ b/bridges/relays/lib-substrate-relay/src/parachains/source.rs @@ -37,22 +37,24 @@ pub type RequiredHeaderIdRef = Arc>>>; /// Substrate client as parachain heads source. #[derive(Clone)] -pub struct ParachainsSource { - client: Client, +pub struct ParachainsSource { + client: SourceRelayClnt, max_head_id: RequiredHeaderIdRef, } -impl ParachainsSource

{ +impl> + ParachainsSource +{ /// Creates new parachains source client. pub fn new( - client: Client, + client: SourceRelayClnt, max_head_id: RequiredHeaderIdRef, ) -> Self { ParachainsSource { client, max_head_id } } /// Returns reference to the underlying RPC client. - pub fn client(&self) -> &Client { + pub fn client(&self) -> &SourceRelayClnt { &self.client } @@ -64,8 +66,8 @@ impl ParachainsSource

{ let para_id = ParaId(P::SourceParachain::PARACHAIN_ID); let storage_key = parachain_head_storage_key_at_source(P::SourceRelayChain::PARAS_PALLET_NAME, para_id); - let para_head = self.client.raw_storage_value(storage_key, Some(at_block.1)).await?; - let para_head = para_head.map(|h| ParaHead::decode(&mut &h.0[..])).transpose()?; + let para_head: Option = + self.client.storage_value(at_block.hash(), storage_key).await?; let para_head = match para_head { Some(para_head) => para_head, None => return Ok(None), @@ -76,7 +78,9 @@ impl ParachainsSource

{ } #[async_trait] -impl RelayClient for ParachainsSource

{ +impl> RelayClient + for ParachainsSource +{ type Error = SubstrateError; async fn reconnect(&mut self) -> Result<(), SubstrateError> { @@ -85,8 +89,8 @@ impl RelayClient for ParachainsSource

{ } #[async_trait] -impl SourceClient> - for ParachainsSource

+impl> + SourceClient> for ParachainsSource where P::SourceParachain: Chain, { @@ -151,7 +155,7 @@ where parachain_head_storage_key_at_source(P::SourceRelayChain::PARAS_PALLET_NAME, parachain); let parachain_heads_proof = self .client - .prove_storage(vec![storage_key.clone()], at_block.1) + .prove_storage(at_block.hash(), vec![storage_key.clone()]) .await? .into_iter_nodes() .collect(); @@ -165,10 +169,8 @@ where // rereading actual value here let parachain_head = self .client - .raw_storage_value(storage_key, Some(at_block.1)) + .storage_value::(at_block.hash(), storage_key) .await? - .map(|h| ParaHead::decode(&mut &h.0[..])) - .transpose()? .ok_or_else(|| { SubstrateError::Custom(format!( "Failed to read expected parachain {parachain:?} head at {at_block:?}" diff --git a/bridges/relays/lib-substrate-relay/src/parachains/target.rs b/bridges/relays/lib-substrate-relay/src/parachains/target.rs index 531d55b5322..f66b193340c 100644 --- a/bridges/relays/lib-substrate-relay/src/parachains/target.rs +++ b/bridges/relays/lib-substrate-relay/src/parachains/target.rs @@ -42,31 +42,42 @@ use relay_substrate_client::{ }; use relay_utils::relay_loop::Client as RelayClient; use sp_core::Pair; +use sp_runtime::traits::Header; /// Substrate client as parachain heads source. -pub struct ParachainsTarget { - source_client: Client, - target_client: Client, +pub struct ParachainsTarget { + source_client: SourceClnt, + target_client: TargetClnt, transaction_params: TransactionParams>, } -impl ParachainsTarget

{ +impl< + P: SubstrateParachainsPipeline, + SourceClnt: Client, + TargetClnt: Client, + > ParachainsTarget +{ /// Creates new parachains target client. pub fn new( - source_client: Client, - target_client: Client, + source_client: SourceClnt, + target_client: TargetClnt, transaction_params: TransactionParams>, ) -> Self { ParachainsTarget { source_client, target_client, transaction_params } } /// Returns reference to the underlying RPC client. - pub fn target_client(&self) -> &Client { + pub fn target_client(&self) -> &TargetClnt { &self.target_client } } -impl Clone for ParachainsTarget

{ +impl< + P: SubstrateParachainsPipeline, + SourceClnt: Client, + TargetClnt: Clone, + > Clone for ParachainsTarget +{ fn clone(&self) -> Self { ParachainsTarget { source_client: self.source_client.clone(), @@ -77,7 +88,12 @@ impl Clone for ParachainsTarget

{ } #[async_trait] -impl RelayClient for ParachainsTarget

{ +impl< + P: SubstrateParachainsPipeline, + SourceClnt: Client, + TargetClnt: Client, + > RelayClient for ParachainsTarget +{ type Error = SubstrateError; async fn reconnect(&mut self) -> Result<(), SubstrateError> { @@ -88,14 +104,17 @@ impl RelayClient for ParachainsTarget

{ } #[async_trait] -impl

TargetClient> for ParachainsTarget

+impl TargetClient> + for ParachainsTarget where P: SubstrateParachainsPipeline, + SourceClnt: Client, + TargetClnt: Client, AccountIdOf: From< as Pair>::Public>, P::SourceParachain: ChainBase, P::SourceRelayChain: ChainBase, { - type TransactionTracker = TransactionTracker>; + type TransactionTracker = TransactionTracker; async fn best_block(&self) -> Result, Self::Error> { let best_header = self.target_client.best_header().await?; @@ -109,10 +128,10 @@ where at_block: &HeaderIdOf, ) -> Result, Self::Error> { self.target_client - .typed_state_call::<_, Option>>( + .state_call::<_, Option>>( + at_block.hash(), P::SourceRelayChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), (), - Some(at_block.1), ) .await? .map(Ok) @@ -124,7 +143,11 @@ where ) -> Result>, Self::Error> { Ok(self .target_client - .typed_state_call(P::SourceRelayChain::FREE_HEADERS_INTERVAL_METHOD.into(), (), None) + .state_call( + self.target_client.best_header().await?.hash(), + P::SourceRelayChain::FREE_HEADERS_INTERVAL_METHOD.into(), + (), + ) .await .unwrap_or_else(|e| { log::info!( @@ -151,7 +174,7 @@ where &P::SourceParachain::PARACHAIN_ID.into(), ); let storage_value: Option = - self.target_client.storage_value(storage_key, Some(at_block.hash())).await?; + self.target_client.storage_value(at_block.hash(), storage_key).await?; let para_info = match storage_value { Some(para_info) => para_info, None => return Ok(None), @@ -172,7 +195,7 @@ where ¶_info.best_head_hash.head_hash, ); let storage_value: Option = - self.target_client.storage_value(storage_key, Some(at_block.hash())).await?; + self.target_client.storage_value(at_block.hash(), storage_key).await?; let para_head_number = match storage_value { Some(para_head_data) => para_head_data.decode_parachain_head_data::()?.number, diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs index 9285a1e7ad4..ee3fc1ed2c4 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs @@ -39,8 +39,8 @@ pub fn prepare_inbound_xcm( xcm_message: Xcm, destination: InteriorLocation, ) -> Vec { - let location = xcm::VersionedInteriorLocation::V4(destination); - let xcm = xcm::VersionedXcm::::V4(xcm_message); + let location = xcm::VersionedInteriorLocation::from(destination); + let xcm = xcm::VersionedXcm::::from(xcm_message); // this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor // or public fields, so just tuple // (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed -- GitLab From ae0b3bf6733e7b9e18badb16128a6b25bef1923b Mon Sep 17 00:00:00 2001 From: Andrei Sandu <54316454+sandreim@users.noreply.github.com> Date: Fri, 14 Jun 2024 15:42:46 +0300 Subject: [PATCH 008/130] CheckWeight: account for extrinsic len as proof size (#4765) Fix https://github.com/paritytech/polkadot-sdk/issues/4743 which allows us to remove the defensive limit on pov size in Cumulus after relay chain gets upgraded with these changes. Also add unit test to ensure `CheckWeight` - `StorageWeightReclaim` integration works. TODO: - [x] PRDoc - [x] Add a len to all the other tests in storage weight reclaim and call `CheckWeight::pre_dispatch` --------- Signed-off-by: Andrei Sandu --- .../storage-weight-reclaim/src/lib.rs | 115 ++++++++- prdoc/pr_4765.prdoc | 18 ++ substrate/frame/executive/src/tests.rs | 7 +- .../system/src/extensions/check_weight.rs | 240 ++++++------------ 4 files changed, 205 insertions(+), 175 deletions(-) create mode 100644 prdoc/pr_4765.prdoc diff --git a/cumulus/primitives/storage-weight-reclaim/src/lib.rs b/cumulus/primitives/storage-weight-reclaim/src/lib.rs index c09c12d7a0a..35fa334f51c 100644 --- a/cumulus/primitives/storage-weight-reclaim/src/lib.rs +++ b/cumulus/primitives/storage-weight-reclaim/src/lib.rs @@ -201,7 +201,7 @@ mod tests { use super::*; use frame_support::{ assert_ok, - dispatch::DispatchClass, + dispatch::{DispatchClass, PerDispatchClass}, weights::{Weight, WeightMeter}, }; use frame_system::{BlockWeight, CheckWeight}; @@ -215,7 +215,7 @@ mod tests { pages: 0u64, }); const ALICE: AccountId32 = AccountId32::new([1u8; 32]); - const LEN: usize = 0; + const LEN: usize = 150; pub fn new_test_ext() -> sp_io::TestExternalities { let ext: sp_io::TestExternalities = cumulus_test_runtime::RuntimeGenesisConfig::default() @@ -256,6 +256,10 @@ mod tests { }); } + fn get_storage_weight() -> PerDispatchClass { + BlockWeight::::get() + } + #[test] fn basic_refund() { // The real cost will be 100 bytes of storage size @@ -268,6 +272,9 @@ mod tests { let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() }; let post_info = PostDispatchInfo::default(); + // Should add 500 + 150 (len) to weight. + assert_ok!(CheckWeight::::do_pre_dispatch(&info, LEN)); + let pre = StorageWeightReclaim::(PhantomData) .pre_dispatch(&ALICE, CALL, &info, LEN) .unwrap(); @@ -283,7 +290,7 @@ mod tests { &Ok(()) )); - assert_eq!(BlockWeight::::get().total().proof_size(), 600); + assert_eq!(get_storage_weight().total().proof_size(), 1250); }) } @@ -299,6 +306,9 @@ mod tests { let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() }; let post_info = PostDispatchInfo::default(); + // Adds 500 + 150 (len) weight + assert_ok!(CheckWeight::::do_pre_dispatch(&info, LEN)); + let pre = StorageWeightReclaim::(PhantomData) .pre_dispatch(&ALICE, CALL, &info, LEN) .unwrap(); @@ -313,7 +323,7 @@ mod tests { &Ok(()) )); - assert_eq!(BlockWeight::::get().total().proof_size(), 1000); + assert_eq!(get_storage_weight().total().proof_size(), 1650); }) } @@ -327,6 +337,9 @@ mod tests { let info = DispatchInfo { weight: Weight::from_parts(0, 100), ..Default::default() }; let post_info = PostDispatchInfo::default(); + // Weight added should be 100 + 150 (len) + assert_ok!(CheckWeight::::do_pre_dispatch(&info, LEN)); + let pre = StorageWeightReclaim::(PhantomData) .pre_dispatch(&ALICE, CALL, &info, LEN) .unwrap(); @@ -342,7 +355,10 @@ mod tests { &Ok(()) )); - assert_eq!(BlockWeight::::get().total().proof_size(), 1100); + assert_eq!( + get_storage_weight().total().proof_size(), + 1100 + LEN as u64 + info.weight.proof_size() + ); }) } @@ -354,6 +370,8 @@ mod tests { let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() }; let post_info = PostDispatchInfo::default(); + assert_ok!(CheckWeight::::do_pre_dispatch(&info, LEN)); + let pre = StorageWeightReclaim::(PhantomData) .pre_dispatch(&ALICE, CALL, &info, LEN) .unwrap(); @@ -368,7 +386,8 @@ mod tests { &Ok(()) )); - assert_eq!(BlockWeight::::get().total().proof_size(), 0); + // Proof size should be exactly equal to extrinsic length + assert_eq!(get_storage_weight().total().proof_size(), LEN as u64); }); } @@ -382,12 +401,17 @@ mod tests { let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() }; let post_info = PostDispatchInfo::default(); + // Adds 500 + 150 (len) weight, total weight is 1950 + assert_ok!(CheckWeight::::do_pre_dispatch(&info, LEN)); + let pre = StorageWeightReclaim::(PhantomData) .pre_dispatch(&ALICE, CALL, &info, LEN) .unwrap(); assert_eq!(pre, Some(300)); + // Refund 500 unspent weight according to `post_info`, total weight is now 1650 assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + // Recorded proof size is negative -200, total weight is now 1450 assert_ok!(StorageWeightReclaim::::post_dispatch( Some(pre), &info, @@ -396,7 +420,7 @@ mod tests { &Ok(()) )); - assert_eq!(BlockWeight::::get().total().proof_size(), 800); + assert_eq!(get_storage_weight().total().proof_size(), 1450); }); } @@ -416,6 +440,9 @@ mod tests { pays_fee: Default::default(), }; + // Should add 300 + 150 (len) of weight + assert_ok!(CheckWeight::::do_pre_dispatch(&info, LEN)); + let pre = StorageWeightReclaim::(PhantomData) .pre_dispatch(&ALICE, CALL, &info, LEN) .unwrap(); @@ -432,7 +459,8 @@ mod tests { &Ok(()) )); - assert_eq!(BlockWeight::::get().total().proof_size(), 900); + // Reclaimed 100 + assert_eq!(get_storage_weight().total().proof_size(), 1350); }) } @@ -451,6 +479,9 @@ mod tests { pays_fee: Default::default(), }; + // Adds 50 + 150 (len) weight, total weight 1200 + assert_ok!(CheckWeight::::do_pre_dispatch(&info, LEN)); + let pre = StorageWeightReclaim::(PhantomData) .pre_dispatch(&ALICE, CALL, &info, LEN) .unwrap(); @@ -458,7 +489,56 @@ mod tests { // The `CheckWeight` extension will refund `actual_weight` from `PostDispatchInfo` // we always need to call `post_dispatch` to verify that they interoperate correctly. + + // Refunds unspent 25 weight according to `post_info`, 1175 assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + // Adds 200 - 25 (unspent) == 175 weight, total weight 1350 + assert_ok!(StorageWeightReclaim::::post_dispatch( + Some(pre), + &info, + &post_info, + LEN, + &Ok(()) + )); + + assert_eq!(get_storage_weight().total().proof_size(), 1350); + }) + } + + #[test] + fn test_nothing_relcaimed() { + let mut test_ext = setup_test_externalities(&[100, 200]); + + test_ext.execute_with(|| { + set_current_storage_weight(0); + // Benchmarked storage weight: 100 + let info = DispatchInfo { weight: Weight::from_parts(100, 100), ..Default::default() }; + + // Actual proof size is 100 + let post_info = PostDispatchInfo { + actual_weight: Some(Weight::from_parts(50, 100)), + pays_fee: Default::default(), + }; + + // Adds benchmarked weight 100 + 150 (len), total weight is now 250 + assert_ok!(CheckWeight::::do_pre_dispatch(&info, LEN)); + + // Weight should go up by 150 len + 100 proof size weight, total weight 250 + assert_eq!(get_storage_weight().total().proof_size(), 250); + + let pre = StorageWeightReclaim::(PhantomData) + .pre_dispatch(&ALICE, CALL, &info, LEN) + .unwrap(); + // Should return `setup_test_externalities` proof recorder value: 100. + assert_eq!(pre, Some(100)); + + // The `CheckWeight` extension will refund `actual_weight` from `PostDispatchInfo` + // we always need to call `post_dispatch` to verify that they interoperate correctly. + // Nothing to refund, unspent is 0, total weight 250 + assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, LEN, &Ok(()))); + // `setup_test_externalities` proof recorder value: 200, so this means the extrinsic + // actually used 100 proof size. + // Nothing to refund or add, weight matches proof recorder assert_ok!(StorageWeightReclaim::::post_dispatch( Some(pre), &info, @@ -467,7 +547,9 @@ mod tests { &Ok(()) )); - assert_eq!(BlockWeight::::get().total().proof_size(), 1150); + // Check block len weight was not reclaimed: + // 100 weight + 150 extrinsic len == 250 proof size + assert_eq!(get_storage_weight().total().proof_size(), 250); }) } @@ -487,11 +569,15 @@ mod tests { pays_fee: Default::default(), }; + // Adds 300 + 150 (len) weight, total weight 1450 + assert_ok!(CheckWeight::::do_pre_dispatch(&info, LEN)); + let pre = StorageWeightReclaim::(PhantomData) .pre_dispatch(&ALICE, CALL, &info, LEN) .unwrap(); assert_eq!(pre, Some(100)); + // This refunds 100 - 50(unspent), total weight is now 1400 assert_ok!(StorageWeightReclaim::::post_dispatch( Some(pre), &info, @@ -504,7 +590,8 @@ mod tests { // we always need to call `post_dispatch` to verify that they interoperate correctly. assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); - assert_eq!(BlockWeight::::get().total().proof_size(), 900); + // Above call refunds 50 (unspent), total weight is 1350 now + assert_eq!(get_storage_weight().total().proof_size(), 1350); }) } @@ -523,11 +610,15 @@ mod tests { pays_fee: Default::default(), }; + // Adds 50 + 150 (len) weight, total weight is 1200 + assert_ok!(CheckWeight::::do_pre_dispatch(&info, LEN)); + let pre = StorageWeightReclaim::(PhantomData) .pre_dispatch(&ALICE, CALL, &info, LEN) .unwrap(); assert_eq!(pre, Some(100)); + // Adds additional 150 weight recorded assert_ok!(StorageWeightReclaim::::post_dispatch( Some(pre), &info, @@ -540,7 +631,7 @@ mod tests { // we always need to call `post_dispatch` to verify that they interoperate correctly. assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); - assert_eq!(BlockWeight::::get().total().proof_size(), 1150); + assert_eq!(get_storage_weight().total().proof_size(), 1350); }) } @@ -644,7 +735,7 @@ mod tests { // We reclaimed 3 bytes of storage size! assert_eq!(reclaimed, Some(Weight::from_parts(0, 3))); - assert_eq!(BlockWeight::::get().total().proof_size(), 10); + assert_eq!(get_storage_weight().total().proof_size(), 10); assert_eq!(remaining_weight_meter.remaining(), Weight::from_parts(10, 8)); } } diff --git a/prdoc/pr_4765.prdoc b/prdoc/pr_4765.prdoc new file mode 100644 index 00000000000..f64b2fdc51a --- /dev/null +++ b/prdoc/pr_4765.prdoc @@ -0,0 +1,18 @@ +title: CheckWeight - account for extrinsic len as proof size + +doc: + - audience: Runtime Dev + description: | + This changes how CheckWeight extension works. It will now account for the extrinsic length + as proof size. When `on_idle` is called, the remaining weight parameter reflects this. + +crates: + - name: frame-system + bump: patch + - name: frame-executive + bump: none + - name: cumulus-primitives-storage-weight-reclaim + bump: none + + + diff --git a/substrate/frame/executive/src/tests.rs b/substrate/frame/executive/src/tests.rs index 71cb54d1fab..69a970a89d9 100644 --- a/substrate/frame/executive/src/tests.rs +++ b/substrate/frame/executive/src/tests.rs @@ -649,8 +649,8 @@ fn block_weight_limit_enforced() { assert!(res.is_ok()); assert_eq!( >::block_weight().total(), - //--------------------- on_initialize + block_execution + extrinsic_base weight - Weight::from_parts((encoded_len + 5) * (nonce + 1), 0) + base_block_weight, + //--------------------- on_initialize + block_execution + extrinsic_base weight + extrinsic len + Weight::from_parts((encoded_len + 5) * (nonce + 1), (nonce + 1)* encoded_len) + base_block_weight, ); assert_eq!( >::extrinsic_index(), @@ -698,9 +698,10 @@ fn block_weight_and_size_is_stored_per_tx() { ::BlockWeights::get() .get(DispatchClass::Normal) .base_extrinsic; + // Check we account for all extrinsic weight and their len. assert_eq!( >::block_weight().total(), - base_block_weight + 3u64 * extrinsic_weight, + base_block_weight + 3u64 * extrinsic_weight + 3u64 * Weight::from_parts(0, len as u64), ); assert_eq!(>::all_extrinsics_len(), 3 * len); diff --git a/substrate/frame/system/src/extensions/check_weight.rs b/substrate/frame/system/src/extensions/check_weight.rs index 5d6c68989ed..d4705f200ef 100644 --- a/substrate/frame/system/src/extensions/check_weight.rs +++ b/substrate/frame/system/src/extensions/check_weight.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::{limits::BlockWeights, Config, DispatchClass, Pallet, LOG_TARGET}; +use crate::{limits::BlockWeights, Config, Pallet, LOG_TARGET}; use codec::{Decode, Encode}; use frame_support::{ dispatch::{DispatchInfo, PostDispatchInfo}, @@ -106,8 +106,7 @@ where let all_weight = Pallet::::block_weight(); let maximum_weight = T::BlockWeights::get(); let next_weight = - calculate_consumed_weight::(&maximum_weight, all_weight, info)?; - check_combined_proof_size::(info, &maximum_weight, next_len, &next_weight)?; + calculate_consumed_weight::(&maximum_weight, all_weight, info, len)?; Self::check_extrinsic_weight(info)?; crate::AllExtrinsicsLen::::put(next_len); @@ -130,36 +129,6 @@ where } } -/// Check that the combined extrinsic length and proof size together do not exceed the PoV limit. -pub fn check_combined_proof_size( - info: &DispatchInfoOf, - maximum_weight: &BlockWeights, - next_len: u32, - next_weight: &crate::ConsumedWeight, -) -> Result<(), TransactionValidityError> -where - Call: Dispatchable, -{ - // This extra check ensures that the extrinsic length does not push the - // PoV over the limit. - let total_pov_size = next_weight.total().proof_size().saturating_add(next_len as u64); - if total_pov_size > maximum_weight.max_block.proof_size() { - log::debug!( - target: LOG_TARGET, - "Extrinsic exceeds total pov size. Still including if mandatory. size: {}kb, limit: {}kb, is_mandatory: {}", - total_pov_size as f64/1024.0, - maximum_weight.max_block.proof_size() as f64/1024.0, - info.class == DispatchClass::Mandatory - ); - return match info.class { - // Allow mandatory extrinsics - DispatchClass::Mandatory => Ok(()), - _ => Err(InvalidTransaction::ExhaustsResources.into()), - }; - } - Ok(()) -} - /// Checks if the current extrinsic can fit into the block with respect to block weight limits. /// /// Upon successes, it returns the new block weight as a `Result`. @@ -167,12 +136,16 @@ pub fn calculate_consumed_weight( maximum_weight: &BlockWeights, mut all_weight: crate::ConsumedWeight, info: &DispatchInfoOf, + len: usize, ) -> Result where Call: Dispatchable, { - let extrinsic_weight = - info.weight.saturating_add(maximum_weight.get(info.class).base_extrinsic); + // Also Consider extrinsic length as proof weight. + let extrinsic_weight = info + .weight + .saturating_add(maximum_weight.get(info.class).base_extrinsic) + .saturating_add(Weight::from_parts(0, len as u64)); let limit_per_class = maximum_weight.get(info.class); // add the weight. If class is unlimited, use saturating add instead of checked one. @@ -772,168 +745,115 @@ mod tests { &maximum_weight, all_weight.clone(), &mandatory1, + 0 )); assert_err!( calculate_consumed_weight::<::RuntimeCall>( &maximum_weight, all_weight, &mandatory2, + 0 ), InvalidTransaction::ExhaustsResources ); } #[test] - fn maximum_proof_size_includes_length() { + fn proof_size_includes_length() { let maximum_weight = BlockWeights::builder() .base_block(Weight::zero()) .for_class(DispatchClass::non_mandatory(), |w| { w.base_extrinsic = Weight::zero(); - w.max_total = Some(Weight::from_parts(20, 10)); + w.max_total = Some(Weight::from_parts(20, 1000)); }) .for_class(DispatchClass::Mandatory, |w| { w.base_extrinsic = Weight::zero(); - w.reserved = Some(Weight::from_parts(5, 10)); - w.max_total = None; + w.max_total = Some(Weight::from_parts(20, 1000)); }) .build_or_panic(); + let all_weight = crate::ConsumedWeight::new(|class| match class { + DispatchClass::Normal => Weight::from_parts(5, 0), + DispatchClass::Operational => Weight::from_parts(5, 0), + DispatchClass::Mandatory => Weight::from_parts(0, 0), + }); - assert_eq!(maximum_weight.max_block, Weight::from_parts(20, 10)); + let normal = DispatchInfo { + weight: Weight::from_parts(5, 0), + class: DispatchClass::Normal, + ..Default::default() + }; - let info = DispatchInfo { class: DispatchClass::Normal, ..Default::default() }; - let mandatory = DispatchInfo { class: DispatchClass::Mandatory, ..Default::default() }; - // We have 10 reftime and 5 proof size left over. - let next_weight = crate::ConsumedWeight::new(|class| match class { - DispatchClass::Normal => Weight::from_parts(10, 5), - DispatchClass::Operational => Weight::from_parts(0, 0), - DispatchClass::Mandatory => Weight::zero(), - }); + let mandatory = DispatchInfo { + weight: Weight::from_parts(5, 0), + class: DispatchClass::Mandatory, + ..Default::default() + }; - // Simple checks for the length - assert_ok!(check_combined_proof_size::<::RuntimeCall>( - &info, + // Using 0 length extrinsics. + let consumed = calculate_consumed_weight::<::RuntimeCall>( &maximum_weight, + all_weight.clone(), + &normal, 0, - &next_weight - )); - assert_ok!(check_combined_proof_size::<::RuntimeCall>( - &info, + ) + .unwrap(); + + assert_eq!(consumed.total().saturating_sub(all_weight.total()), normal.weight); + + let consumed = calculate_consumed_weight::<::RuntimeCall>( &maximum_weight, - 5, - &next_weight - )); - assert_err!( - check_combined_proof_size::<::RuntimeCall>( - &info, - &maximum_weight, - 6, - &next_weight - ), - InvalidTransaction::ExhaustsResources - ); - assert_ok!(check_combined_proof_size::<::RuntimeCall>( + all_weight.clone(), &mandatory, - &maximum_weight, - 6, - &next_weight - )); + 0, + ) + .unwrap(); + assert_eq!(consumed.total().saturating_sub(all_weight.total()), mandatory.weight); - // We have 10 reftime and 0 proof size left over. - let next_weight = crate::ConsumedWeight::new(|class| match class { - DispatchClass::Normal => Weight::from_parts(10, 10), - DispatchClass::Operational => Weight::from_parts(0, 0), - DispatchClass::Mandatory => Weight::zero(), - }); - assert_ok!(check_combined_proof_size::<::RuntimeCall>( - &info, + // Using non zero length extrinsics. + let consumed = calculate_consumed_weight::<::RuntimeCall>( &maximum_weight, - 0, - &next_weight - )); - assert_err!( - check_combined_proof_size::<::RuntimeCall>( - &info, - &maximum_weight, - 1, - &next_weight - ), - InvalidTransaction::ExhaustsResources + all_weight.clone(), + &normal, + 100, + ) + .unwrap(); + // Must account for the len in the proof size + assert_eq!( + consumed.total().saturating_sub(all_weight.total()), + normal.weight.add_proof_size(100) ); - assert_ok!(check_combined_proof_size::<::RuntimeCall>( - &mandatory, - &maximum_weight, - 1, - &next_weight - )); - // We have 10 reftime and 2 proof size left over. - // Used weight is spread across dispatch classes this time. - let next_weight = crate::ConsumedWeight::new(|class| match class { - DispatchClass::Normal => Weight::from_parts(10, 5), - DispatchClass::Operational => Weight::from_parts(0, 3), - DispatchClass::Mandatory => Weight::zero(), - }); - assert_ok!(check_combined_proof_size::<::RuntimeCall>( - &info, + let consumed = calculate_consumed_weight::<::RuntimeCall>( &maximum_weight, - 0, - &next_weight - )); - assert_ok!(check_combined_proof_size::<::RuntimeCall>( - &info, - &maximum_weight, - 2, - &next_weight - )); - assert_err!( - check_combined_proof_size::<::RuntimeCall>( - &info, - &maximum_weight, - 3, - &next_weight - ), - InvalidTransaction::ExhaustsResources - ); - assert_ok!(check_combined_proof_size::<::RuntimeCall>( + all_weight.clone(), &mandatory, - &maximum_weight, - 3, - &next_weight - )); + 100, + ) + .unwrap(); + // Must account for the len in the proof size + assert_eq!( + consumed.total().saturating_sub(all_weight.total()), + mandatory.weight.add_proof_size(100) + ); - // Ref time is over the limit. Should not happen, but we should make sure that it is - // ignored. - let next_weight = crate::ConsumedWeight::new(|class| match class { - DispatchClass::Normal => Weight::from_parts(30, 5), - DispatchClass::Operational => Weight::from_parts(0, 0), - DispatchClass::Mandatory => Weight::zero(), - }); - assert_ok!(check_combined_proof_size::<::RuntimeCall>( - &info, + // Using oversized zero length extrinsics. + let consumed = calculate_consumed_weight::<::RuntimeCall>( &maximum_weight, - 0, - &next_weight - )); - assert_ok!(check_combined_proof_size::<::RuntimeCall>( - &info, - &maximum_weight, - 5, - &next_weight - )); - assert_err!( - check_combined_proof_size::<::RuntimeCall>( - &info, - &maximum_weight, - 6, - &next_weight - ), - InvalidTransaction::ExhaustsResources + all_weight.clone(), + &normal, + 2000, ); - assert_ok!(check_combined_proof_size::<::RuntimeCall>( - &mandatory, + // errors out + assert_eq!(consumed, Err(InvalidTransaction::ExhaustsResources.into())); + + // Using oversized zero length extrinsics. + let consumed = calculate_consumed_weight::<::RuntimeCall>( &maximum_weight, - 6, - &next_weight - )); + all_weight.clone(), + &mandatory, + 2000, + ); + // errors out + assert_eq!(consumed, Err(InvalidTransaction::ExhaustsResources.into())); } } -- GitLab From 2f643816d79a76155aec790a35b9b72a5d8bb726 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Mon, 17 Jun 2024 11:31:15 +0800 Subject: [PATCH 009/130] add ref doc for logging practices in FRAME (#4768) --- Cargo.lock | 3 + docs/sdk/Cargo.toml | 2 + docs/sdk/src/reference_docs/frame_logging.rs | 116 ++++++++++++++++++ docs/sdk/src/reference_docs/mod.rs | 3 + docs/sdk/src/reference_docs/umbrella_crate.rs | 5 +- substrate/primitives/api/Cargo.toml | 1 + substrate/primitives/api/src/lib.rs | 1 + 7 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 docs/sdk/src/reference_docs/frame_logging.rs diff --git a/Cargo.lock b/Cargo.lock index 71b98d2cd5c..4f4e0a988ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14381,6 +14381,8 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-runtime-interface 24.0.0", + "sp-std 14.0.0", + "sp-tracing 16.0.0", "sp-version", "staging-chain-spec-builder", "staging-node-cli", @@ -19530,6 +19532,7 @@ dependencies = [ name = "sp-api" version = "26.0.0" dependencies = [ + "docify", "hash-db", "log", "parity-scale-codec", diff --git a/docs/sdk/Cargo.toml b/docs/sdk/Cargo.toml index 10c09121167..ee603f8c494 100644 --- a/docs/sdk/Cargo.toml +++ b/docs/sdk/Cargo.toml @@ -89,6 +89,8 @@ pallet-babe = { path = "../../substrate/frame/babe" } # Primitives sp-io = { path = "../../substrate/primitives/io" } +sp-std = { path = "../../substrate/primitives/std" } +sp-tracing = { path = "../../substrate/primitives/tracing" } sp-runtime-interface = { path = "../../substrate/primitives/runtime-interface" } sp-api = { path = "../../substrate/primitives/api" } sp-core = { path = "../../substrate/primitives/core" } diff --git a/docs/sdk/src/reference_docs/frame_logging.rs b/docs/sdk/src/reference_docs/frame_logging.rs new file mode 100644 index 00000000000..301fa7ef83f --- /dev/null +++ b/docs/sdk/src/reference_docs/frame_logging.rs @@ -0,0 +1,116 @@ +//! # FRAME Logging +//! +//! This reference docs briefly explores how to do logging and printing runtimes, mainly +//! FRAME-based. +//! +//! ## Using `println!` +//! +//! To recap, as with standard Rust, you can use `println!` _in your tests_, but it will only print +//! out if executed with `--nocapture`, or if the test panics. +//! +//! ``` +//! fn it_print() { +//! println!("Hello, world!"); +//! } +//! ``` +//! +//! within the pallet, if you want to use the standard `println!`, it needs to be wrapped in +//! [`sp_std::if_std`]. Of course, this means that this print code is only available to you in the +//! `std` compiler flag, and never present in a wasm build. +//! +//! ``` +//! // somewhere in your pallet. This is not a real pallet code. +//! mod pallet { +//! struct Pallet; +//! impl Pallet { +//! fn print() { +//! sp_std::if_std! { +//! println!("Hello, world!"); +//! } +//! } +//! } +//! } +//! ``` +//! +//! ## Using `log` +//! +//! First, ensure you are familiar with the `log` crate. In short, each log statement has: +//! +//! 1. `log-level`, signifying how important it is +//! 2. `log-target`, signifying to which component it belongs. +//! +//! Add log statements to your pallet as such: +//! +//! You can add the log crate to the `Cargo.toml` of the pallet. +//! +//! ```text +//! #[dependencies] +//! log = { version = "x.y.z", default-features = false } +//! +//! #[features] +//! std = [ +//! // snip -- other pallets +//! "log/std" +//! ] +//! ``` +//! +//! More conveniently, the `frame` umbrella crate re-exports the log crate as [`frame::log`]. +//! +//! Then, the pallet can use this crate to emit log statements. In this statement, we use the info +//! level, and the target is `pallet-example`. +//! +//! ``` +//! mod pallet { +//! struct Pallet; +//! +//! impl Pallet { +//! fn logs() { +//! frame::log::info!(target: "pallet-example", "Hello, world!"); +//! } +//! } +//! } +//! ``` +//! +//! This will in itself just emit the log messages, **but unless if captured by a logger, they will +//! not go anywhere**. [`sp_api`] provides a handy function to enable the runtime logging: +//! +//! ``` +//! // in your test +//! fn it_also_prints() { +//! sp_api::init_runtime_logger(); +//! // call into your pallet, and now it will print `log` statements. +//! } +//! ``` +//! +//! Alternatively, you can use [`sp_tracing::try_init_simple`]. +//! +//! `info`, `error` and `warn` logs are printed by default, but if you want lower level logs to also +//! be printed, you must to add the following compiler flag: +//! +//! ```text +//! RUST_LOG=pallet-example=trace cargo test +//! ``` +//! +//! ## Enabling Logs in Production +//! +//! All logs from the runtime are emitted by default, but there is a feature flag in [`sp_api`], +//! called `disable-logging`, that can be used to disable all logs in the runtime. This is useful +//! for production chains to reduce the size and overhead of the wasm runtime. +#![doc = docify::embed!("../../substrate/primitives/api/src/lib.rs", init_runtime_logger)] +//! +//! Similar to the above, the proper `RUST_LOG` must also be passed to your compiler flag when +//! compiling the runtime. +//! +//! ## Log Target Prefixing +//! +//! Many [`crate::polkadot_sdk::frame_runtime`] pallets emit logs with log target `runtime::`, for example `runtime::system`. This then allows one to run a node with a wasm blob +//! compiled with `LOG_TARGET=runtime=debug`, which enables the log target of all pallets who's log +//! target starts with `runtime`. +//! +//! ## Low Level Primitives +//! +//! Under the hood, logging is another instance of host functions under the hood (as defined in +//! [`crate::reference_docs::wasm_meta_protocol`]). The runtime uses a set of host functions under +//! [`sp_io::logging`] and [`sp_io::misc`] to emit all logs and prints. You typically do not need to +//! use these APIs directly. diff --git a/docs/sdk/src/reference_docs/mod.rs b/docs/sdk/src/reference_docs/mod.rs index 51150a55837..688339b7e38 100644 --- a/docs/sdk/src/reference_docs/mod.rs +++ b/docs/sdk/src/reference_docs/mod.rs @@ -93,6 +93,9 @@ pub mod frame_offchain_workers; /// together. pub mod frame_pallet_coupling; +/// Learn about how to do logging in FRAME-based runtimes. +pub mod frame_logging; + /// Learn about the Polkadot Umbrella crate that re-exports all other crates. pub mod umbrella_crate; diff --git a/docs/sdk/src/reference_docs/umbrella_crate.rs b/docs/sdk/src/reference_docs/umbrella_crate.rs index 9751b0ad5ad..0b3445cfc4b 100644 --- a/docs/sdk/src/reference_docs/umbrella_crate.rs +++ b/docs/sdk/src/reference_docs/umbrella_crate.rs @@ -28,8 +28,9 @@ //! `node` feature. For docs.rs the manifest contains specific configuration to make it show up //! all re-exports. //! -//! There is a specific `zepter` check in place to ensure that the features of the umbrella are -//! correctly configured. This check is run in CI and locally when running `zepter`. +//! There is a specific [`zepter`](https://github.com/ggwpez/zepter) check in place to ensure that +//! the features of the umbrella are correctly configured. This check is run in CI and locally when +//! running `zepter`. //! //! ## Generation //! diff --git a/substrate/primitives/api/Cargo.toml b/substrate/primitives/api/Cargo.toml index f48480f398d..b334880785f 100644 --- a/substrate/primitives/api/Cargo.toml +++ b/substrate/primitives/api/Cargo.toml @@ -33,6 +33,7 @@ scale-info = { version = "2.11.1", default-features = false, features = [ ] } sp-metadata-ir = { path = "../metadata-ir", default-features = false, optional = true } log = { workspace = true } +docify = { version = "0.2.1" } [dev-dependencies] sp-test-primitives = { path = "../test-primitives" } diff --git a/substrate/primitives/api/src/lib.rs b/substrate/primitives/api/src/lib.rs index 20f989c4882..cd8da8ba237 100644 --- a/substrate/primitives/api/src/lib.rs +++ b/substrate/primitives/api/src/lib.rs @@ -532,6 +532,7 @@ pub trait ConstructRuntimeApi> { fn construct_runtime_api(call: &C) -> ApiRef; } +#[docify::export] /// Init the [`RuntimeLogger`](sp_runtime::runtime_logger::RuntimeLogger). pub fn init_runtime_logger() { #[cfg(not(feature = "disable-logging"))] -- GitLab From 796890979e5d7d16a522c304376d78eec120f3cb Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Mon, 17 Jun 2024 13:46:04 +0200 Subject: [PATCH 010/130] CI: Add stable clobber (#4780) Clobbers the `stable` branch with the `audited` tag as described in the [RELEASE.md](https://github.com/paritytech/polkadot-sdk/blob/master/docs/RELEASE.md#clobbering). Example of the `staging_stable` branch now after force-pushing the `staging_audited` tag for a few times. The `staging_` prefix has now been removed and should be ready for normal use. The only trigger is currently manual, but can easily be set to three months. ![Screenshot 2024-06-13 at 00 47 43](https://github.com/paritytech/polkadot-sdk/assets/10380170/97e070ad-ce2d-4504-83a0-ad6717b6e73e) --------- Signed-off-by: Oliver Tale-Yazdi --- .github/workflows/release-clobber-stable.yml | 70 ++++++++++++++++++++ .github/workflows/release-srtool.yml | 2 - 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/release-clobber-stable.yml diff --git a/.github/workflows/release-clobber-stable.yml b/.github/workflows/release-clobber-stable.yml new file mode 100644 index 00000000000..643c14daa15 --- /dev/null +++ b/.github/workflows/release-clobber-stable.yml @@ -0,0 +1,70 @@ +name: Clobber Stable + +# This action implements the +# [Clobbering](https://github.com/paritytech/polkadot-sdk/blob/master/docs/RELEASE.md#clobbering) +# process from the release process. It pushes a new commit to the `stable` branch with all the +# current content of the `audited` tag. It does not use a merge commit, but rather 'clobbers' the +# branch with a single commit that contains all the changes. It has a naming scheme of `Clobber with +# audited ($COMMIT)`. +# Currently, the script is only triggered manually, but can be easily changed to a schedule. + +on: + workflow_dispatch: + +permissions: + contents: write + +jobs: + clobber-stable: + runs-on: ubuntu-latest + timeout-minutes: 5 + env: + STABLE: stable + UNSTABLE: master + AUDITED: audited + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Prechecks + run: | + # Properly fetch + git fetch --prune --unshallow origin tag $AUDITED + git fetch origin $STABLE + + # Sanity checks + git checkout -q tags/$AUDITED || (echo "Could not find the '$AUDITED' tag." && exit 1) + COMMIT=$(git rev-parse tags/$AUDITED) + #$(git branch --contains $COMMIT | grep -q $UNSTABLE) || (echo "The '$AUDITED' tag is not on the '$UNSTABLE' branch." && exit 1) + + git config --global user.email "admin@parity.io" + git config --global user.name "Parity Release Team" + + - name: Prepare commit + run: | + git checkout --quiet origin/$STABLE + + # Delete all tracked files in the working directory + git ls-files -z | xargs -0 rm -f + + # Find and delete any empty directories + find . -type d -empty -delete + + git add . 1>/dev/null 2>/dev/null + git commit -qm "Delete all files" + + # Grab the files from the commit + git checkout --quiet tags/$AUDITED -- . + + # Stage, commit, and push the working directory which now matches 'audited' 1:1 + git status + COMMIT=$(git rev-parse --short=10 tags/$AUDITED) + git add . 1>/dev/null 2>/dev/null + git commit --allow-empty --amend -qm "Clobber with $AUDITED ($COMMIT)" + + - name: Push stable branch + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git log -3 + git push --verbose origin HEAD:$STABLE diff --git a/.github/workflows/release-srtool.yml b/.github/workflows/release-srtool.yml index 95b1846b98e..69a4bdbdda9 100644 --- a/.github/workflows/release-srtool.yml +++ b/.github/workflows/release-srtool.yml @@ -6,8 +6,6 @@ env: on: push: - tags: - - "*" branches: - release-v[0-9]+.[0-9]+.[0-9]+* - release-cumulus-v[0-9]+* -- GitLab From d91cbbd453c1d4553d7e3dc8753a2007fc4c5a67 Mon Sep 17 00:00:00 2001 From: Ankan <10196091+Ank4n@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:35:15 +0200 Subject: [PATCH 011/130] Impl and use default config for pallet-staking in tests (#4797) --- substrate/frame/babe/src/mock.rs | 19 +----- substrate/frame/beefy/src/mock.rs | 18 +---- substrate/frame/delegated-staking/src/mock.rs | 21 +----- .../frame/delegated-staking/src/tests.rs | 26 +++---- .../test-staking-e2e/src/mock.rs | 11 +-- substrate/frame/fast-unstake/src/mock.rs | 20 +----- substrate/frame/grandpa/src/mock.rs | 15 +---- .../nomination-pools/benchmarking/src/mock.rs | 19 +----- .../test-delegate-stake/src/mock.rs | 18 +---- .../test-transfer-stake/src/mock.rs | 18 +---- .../frame/offences/benchmarking/src/mock.rs | 18 +---- substrate/frame/root-offences/src/mock.rs | 15 +---- .../frame/session/benchmarking/src/mock.rs | 18 +---- substrate/frame/staking/src/mock.rs | 8 +-- substrate/frame/staking/src/pallet/mod.rs | 67 ++++++++++++++++++- 15 files changed, 92 insertions(+), 219 deletions(-) diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs index 16db40e3cb3..be38e3e7e5d 100644 --- a/substrate/frame/babe/src/mock.rs +++ b/substrate/frame/babe/src/mock.rs @@ -28,7 +28,6 @@ use frame_support::{ traits::{ConstU128, ConstU32, ConstU64, KeyOwnerProofSystem, OnInitialize}, }; use pallet_session::historical as pallet_session_historical; -use pallet_staking::FixedNominationsQuota; use sp_consensus_babe::{AuthorityId, AuthorityPair, Randomness, Slot, VrfSignature}; use sp_core::{ crypto::{KeyTypeId, Pair, VrfSecret}, @@ -133,7 +132,6 @@ pallet_staking_reward_curve::build! { parameter_types! { pub const SessionsPerEra: SessionIndex = 3; pub const BondingDuration: EraIndex = 3; - pub const SlashDeferDuration: EraIndex = 0; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub static ElectionsBounds: ElectionBounds = ElectionBoundsBuilder::default().build(); } @@ -148,35 +146,20 @@ impl onchain::Config for OnChainSeqPhragmen { type Bounds = ElectionsBounds; } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Test { - type RewardRemainder = (); - type CurrencyToVote = (); - type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type CurrencyBalance = ::Balance; - type Slash = (); - type Reward = (); type SessionsPerEra = SessionsPerEra; type BondingDuration = BondingDuration; - type SlashDeferDuration = SlashDeferDuration; type AdminOrigin = frame_system::EnsureRoot; type SessionInterface = Self; type UnixTime = pallet_timestamp::Pallet; type EraPayout = pallet_staking::ConvertCurve; - type MaxExposurePageSize = ConstU32<64>; type NextNewSession = Session; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type TargetList = pallet_staking::UseValidatorsMap; - type NominationsQuota = FixedNominationsQuota<16>; - type MaxUnlockingChunks = ConstU32<32>; - type MaxControllersInDeprecationBatch = ConstU32<100>; - type HistoryDepth = ConstU32<84>; - type EventListeners = (); - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_offences::Config for Test { diff --git a/substrate/frame/beefy/src/mock.rs b/substrate/frame/beefy/src/mock.rs index ceca0fd07b7..35bf172d606 100644 --- a/substrate/frame/beefy/src/mock.rs +++ b/substrate/frame/beefy/src/mock.rs @@ -162,35 +162,19 @@ impl onchain::Config for OnChainSeqPhragmen { type Bounds = ElectionsBoundsOnChain; } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Test { - type RewardRemainder = (); - type CurrencyToVote = (); type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type CurrencyBalance = ::Balance; - type Slash = (); - type Reward = (); - type SessionsPerEra = SessionsPerEra; - type BondingDuration = BondingDuration; - type SlashDeferDuration = (); type AdminOrigin = frame_system::EnsureRoot; type SessionInterface = Self; type UnixTime = pallet_timestamp::Pallet; type EraPayout = pallet_staking::ConvertCurve; - type MaxExposurePageSize = ConstU32<64>; type NextNewSession = Session; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type TargetList = pallet_staking::UseValidatorsMap; - type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; - type MaxUnlockingChunks = ConstU32<32>; - type MaxControllersInDeprecationBatch = ConstU32<100>; - type HistoryDepth = ConstU32<84>; - type EventListeners = (); - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_offences::Config for Test { diff --git a/substrate/frame/delegated-staking/src/mock.rs b/substrate/frame/delegated-staking/src/mock.rs index 0991833f865..811d5739f4e 100644 --- a/substrate/frame/delegated-staking/src/mock.rs +++ b/substrate/frame/delegated-staking/src/mock.rs @@ -88,7 +88,6 @@ pallet_staking_reward_curve::build! { parameter_types! { pub const RewardCurve: &'static sp_runtime::curve::PiecewiseLinear<'static> = &I_NPOS; - pub static BondingDuration: u32 = 3; pub static ElectionsBoundsOnChain: ElectionBounds = ElectionBoundsBuilder::default().build(); } pub struct OnChainSeqPhragmen; @@ -101,35 +100,17 @@ impl onchain::Config for OnChainSeqPhragmen { type Bounds = ElectionsBoundsOnChain; } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Runtime { type Currency = Balances; - type CurrencyBalance = Balance; type UnixTime = pallet_timestamp::Pallet; - type CurrencyToVote = (); - type RewardRemainder = (); - type RuntimeEvent = RuntimeEvent; - type Slash = (); - type Reward = (); - type SessionsPerEra = ConstU32<1>; - type SlashDeferDuration = (); type AdminOrigin = frame_system::EnsureRoot; - type BondingDuration = BondingDuration; - type SessionInterface = (); type EraPayout = pallet_staking::ConvertCurve; - type NextNewSession = (); - type HistoryDepth = ConstU32<84>; - type MaxExposurePageSize = ConstU32<64>; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type TargetList = pallet_staking::UseValidatorsMap; - type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; - type MaxUnlockingChunks = ConstU32<10>; - type MaxControllersInDeprecationBatch = ConstU32<100>; type EventListeners = (Pools, DelegatedStaking); - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } parameter_types! { diff --git a/substrate/frame/delegated-staking/src/tests.rs b/substrate/frame/delegated-staking/src/tests.rs index d40539d40dd..2295f7d0c87 100644 --- a/substrate/frame/delegated-staking/src/tests.rs +++ b/substrate/frame/delegated-staking/src/tests.rs @@ -501,17 +501,17 @@ mod staking_integration { ExtBuilder::default().build_and_execute(|| { start_era(1); let agent = 200; - setup_delegation_stake(agent, 201, (300..350).collect(), 100, 0); + setup_delegation_stake(agent, 201, (300..350).collect(), 320, 0); // verify withdraw not possible yet assert_noop!( - DelegatedStaking::release_delegation(RawOrigin::Signed(agent).into(), 300, 100, 0), + DelegatedStaking::release_delegation(RawOrigin::Signed(agent).into(), 300, 320, 0), Error::::NotEnoughFunds ); // fill up unlocking chunks in core staking. - // 10 is the max chunks - for i in 2..=11 { + // 32 is the max chunks + for i in 2..=33 { start_era(i); assert_ok!(Staking::unbond(RawOrigin::Signed(agent).into(), 10)); // no withdrawals from core staking yet. @@ -519,35 +519,35 @@ mod staking_integration { } // another unbond would trigger withdrawal - start_era(12); + start_era(34); assert_ok!(Staking::unbond(RawOrigin::Signed(agent).into(), 10)); - // 8 previous unbonds would be withdrawn as they were already unlocked. Unlocking period - // is 3 eras. - assert_eq!(get_agent_ledger(&agent).ledger.unclaimed_withdrawals, 8 * 10); + // 30 previous unbonds would be withdrawn as they were already unlocked. Unlocking + // period is 3 eras. + assert_eq!(get_agent_ledger(&agent).ledger.unclaimed_withdrawals, 30 * 10); // release some delegation now. assert_ok!(DelegatedStaking::release_delegation( RawOrigin::Signed(agent).into(), 300, - 40, + 160, 0 )); - assert_eq!(get_agent_ledger(&agent).ledger.unclaimed_withdrawals, 80 - 40); + assert_eq!(get_agent_ledger(&agent).ledger.unclaimed_withdrawals, 300 - 160); // cannot release more than available assert_noop!( - DelegatedStaking::release_delegation(RawOrigin::Signed(agent).into(), 300, 50, 0), + DelegatedStaking::release_delegation(RawOrigin::Signed(agent).into(), 300, 141, 0), Error::::NotEnoughFunds ); assert_ok!(DelegatedStaking::release_delegation( RawOrigin::Signed(agent).into(), 300, - 40, + 140, 0 )); - assert_eq!(DelegatedStaking::held_balance_of(Delegator::from(300)), 100 - 80); + assert_eq!(DelegatedStaking::held_balance_of(Delegator::from(300)), 320 - 300); }); } diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs index 9c499151363..bb1bdb31420 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs @@ -229,7 +229,6 @@ parameter_types! { pub const SessionsPerEra: sp_staking::SessionIndex = 2; pub static BondingDuration: sp_staking::EraIndex = 28; pub const SlashDeferDuration: sp_staking::EraIndex = 7; // 1/4 the bonding duration. - pub HistoryDepth: u32 = 84; } impl pallet_bags_list::Config for Runtime { @@ -285,15 +284,11 @@ const MAX_QUOTA_NOMINATIONS: u32 = 16; /// Disabling factor set explicitly to byzantine threshold pub(crate) const SLASHING_DISABLING_FACTOR: usize = 3; +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Runtime { type Currency = Balances; type CurrencyBalance = Balance; type UnixTime = Timestamp; - type CurrencyToVote = (); - type RewardRemainder = (); - type RuntimeEvent = RuntimeEvent; - type Slash = (); // burn slashes - type Reward = (); // rewards are minted from the void type SessionsPerEra = SessionsPerEra; type BondingDuration = BondingDuration; type SlashDeferDuration = SlashDeferDuration; @@ -308,12 +303,10 @@ impl pallet_staking::Config for Runtime { type NominationsQuota = pallet_staking::FixedNominationsQuota; type TargetList = pallet_staking::UseValidatorsMap; type MaxUnlockingChunks = MaxUnlockingChunks; - type MaxControllersInDeprecationBatch = ConstU32<100>; - type HistoryDepth = HistoryDepth; type EventListeners = Pools; type WeightInfo = pallet_staking::weights::SubstrateWeight; - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; + type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; } impl frame_system::offchain::SendTransactionTypes for Runtime diff --git a/substrate/frame/fast-unstake/src/mock.rs b/substrate/frame/fast-unstake/src/mock.rs index 63bf533d8ee..7ce7fee1410 100644 --- a/substrate/frame/fast-unstake/src/mock.rs +++ b/substrate/frame/fast-unstake/src/mock.rs @@ -104,35 +104,17 @@ impl frame_election_provider_support::ElectionProvider for MockElection { } } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Runtime { type Currency = Balances; - type CurrencyBalance = Balance; type UnixTime = pallet_timestamp::Pallet; - type CurrencyToVote = (); - type RewardRemainder = (); - type RuntimeEvent = RuntimeEvent; - type Slash = (); - type Reward = (); - type SessionsPerEra = (); - type SlashDeferDuration = (); type AdminOrigin = frame_system::EnsureRoot; type BondingDuration = BondingDuration; - type SessionInterface = (); type EraPayout = pallet_staking::ConvertCurve; - type NextNewSession = (); - type HistoryDepth = ConstU32<84>; - type MaxExposurePageSize = ConstU32<64>; type ElectionProvider = MockElection; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type TargetList = pallet_staking::UseValidatorsMap; - type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; - type MaxUnlockingChunks = ConstU32<32>; - type MaxControllersInDeprecationBatch = ConstU32<100>; - type EventListeners = (); - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } parameter_types! { diff --git a/substrate/frame/grandpa/src/mock.rs b/substrate/frame/grandpa/src/mock.rs index 5642ffe8998..5ba7da7f9fd 100644 --- a/substrate/frame/grandpa/src/mock.rs +++ b/substrate/frame/grandpa/src/mock.rs @@ -150,35 +150,22 @@ impl onchain::Config for OnChainSeqPhragmen { type Bounds = ElectionsBoundsOnChain; } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Test { - type RewardRemainder = (); - type CurrencyToVote = (); - type RuntimeEvent = RuntimeEvent; type Currency = Balances; type CurrencyBalance = ::Balance; - type Slash = (); - type Reward = (); type SessionsPerEra = SessionsPerEra; type BondingDuration = BondingDuration; - type SlashDeferDuration = (); type AdminOrigin = frame_system::EnsureRoot; type SessionInterface = Self; type UnixTime = pallet_timestamp::Pallet; type EraPayout = pallet_staking::ConvertCurve; - type MaxExposurePageSize = ConstU32<64>; type NextNewSession = Session; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type TargetList = pallet_staking::UseValidatorsMap; type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; - type MaxUnlockingChunks = ConstU32<32>; - type MaxControllersInDeprecationBatch = ConstU32<100>; - type HistoryDepth = ConstU32<84>; - type EventListeners = (); - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_offences::Config for Test { diff --git a/substrate/frame/nomination-pools/benchmarking/src/mock.rs b/substrate/frame/nomination-pools/benchmarking/src/mock.rs index b9cff796071..15d9e2c5603 100644 --- a/substrate/frame/nomination-pools/benchmarking/src/mock.rs +++ b/substrate/frame/nomination-pools/benchmarking/src/mock.rs @@ -76,36 +76,19 @@ pallet_staking_reward_curve::build! { parameter_types! { pub const RewardCurve: &'static sp_runtime::curve::PiecewiseLinear<'static> = &I_NPOS; } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Runtime { type Currency = Balances; type CurrencyBalance = Balance; type UnixTime = pallet_timestamp::Pallet; - type CurrencyToVote = (); - type RewardRemainder = (); - type RuntimeEvent = RuntimeEvent; - type Slash = (); - type Reward = (); - type SessionsPerEra = (); - type SlashDeferDuration = (); type AdminOrigin = frame_system::EnsureRoot; - type BondingDuration = ConstU32<3>; - type SessionInterface = (); type EraPayout = pallet_staking::ConvertCurve; - type NextNewSession = (); - type MaxExposurePageSize = ConstU32<64>; type ElectionProvider = frame_election_provider_support::NoElection<(AccountId, BlockNumber, Staking, ())>; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = VoterList; type TargetList = pallet_staking::UseValidatorsMap; - type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; - type MaxControllersInDeprecationBatch = ConstU32<100>; - type MaxUnlockingChunks = ConstU32<32>; - type HistoryDepth = ConstU32<84>; type EventListeners = (Pools, DelegatedStaking); - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } parameter_types! { diff --git a/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs b/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs index 0a456503ad8..ed47932a323 100644 --- a/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs +++ b/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs @@ -90,36 +90,20 @@ parameter_types! { pub static BondingDuration: u32 = 3; } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Runtime { type Currency = Balances; - type CurrencyBalance = Balance; type UnixTime = pallet_timestamp::Pallet; - type CurrencyToVote = (); - type RewardRemainder = (); - type RuntimeEvent = RuntimeEvent; - type Slash = (); - type Reward = (); - type SessionsPerEra = (); - type SlashDeferDuration = (); type AdminOrigin = frame_system::EnsureRoot; type BondingDuration = BondingDuration; - type SessionInterface = (); type EraPayout = pallet_staking::ConvertCurve; - type NextNewSession = (); - type MaxExposurePageSize = ConstU32<64>; type ElectionProvider = frame_election_provider_support::NoElection<(AccountId, BlockNumber, Staking, ())>; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = VoterList; type TargetList = pallet_staking::UseValidatorsMap; - type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; - type MaxUnlockingChunks = ConstU32<32>; - type MaxControllersInDeprecationBatch = ConstU32<100>; - type HistoryDepth = ConstU32<84>; type EventListeners = (Pools, DelegatedStaking); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } parameter_types! { diff --git a/substrate/frame/nomination-pools/test-transfer-stake/src/mock.rs b/substrate/frame/nomination-pools/test-transfer-stake/src/mock.rs index 570cdea9046..d913c5fe694 100644 --- a/substrate/frame/nomination-pools/test-transfer-stake/src/mock.rs +++ b/substrate/frame/nomination-pools/test-transfer-stake/src/mock.rs @@ -82,36 +82,20 @@ parameter_types! { pub static BondingDuration: u32 = 3; } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Runtime { type Currency = Balances; - type CurrencyBalance = Balance; type UnixTime = pallet_timestamp::Pallet; - type CurrencyToVote = (); - type RewardRemainder = (); - type RuntimeEvent = RuntimeEvent; - type Slash = (); - type Reward = (); - type SessionsPerEra = (); - type SlashDeferDuration = (); type AdminOrigin = frame_system::EnsureRoot; type BondingDuration = BondingDuration; - type SessionInterface = (); type EraPayout = pallet_staking::ConvertCurve; - type NextNewSession = (); - type MaxExposurePageSize = ConstU32<64>; type ElectionProvider = frame_election_provider_support::NoElection<(AccountId, BlockNumber, Staking, ())>; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = VoterList; type TargetList = pallet_staking::UseValidatorsMap; - type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; - type MaxUnlockingChunks = ConstU32<32>; - type MaxControllersInDeprecationBatch = ConstU32<100>; - type HistoryDepth = ConstU32<84>; type EventListeners = Pools; type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } parameter_types! { diff --git a/substrate/frame/offences/benchmarking/src/mock.rs b/substrate/frame/offences/benchmarking/src/mock.rs index e45d280ba52..e243ad0e718 100644 --- a/substrate/frame/offences/benchmarking/src/mock.rs +++ b/substrate/frame/offences/benchmarking/src/mock.rs @@ -124,35 +124,19 @@ impl onchain::Config for OnChainSeqPhragmen { type Bounds = ElectionsBounds; } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Test { type Currency = Balances; type CurrencyBalance = ::Balance; type UnixTime = pallet_timestamp::Pallet; - type CurrencyToVote = (); - type RewardRemainder = (); - type RuntimeEvent = RuntimeEvent; - type Slash = (); - type Reward = (); - type SessionsPerEra = (); - type SlashDeferDuration = (); type AdminOrigin = frame_system::EnsureRoot; - type BondingDuration = (); type SessionInterface = Self; type EraPayout = pallet_staking::ConvertCurve; type NextNewSession = Session; - type MaxExposurePageSize = ConstU32<64>; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type TargetList = pallet_staking::UseValidatorsMap; - type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; - type MaxUnlockingChunks = ConstU32<32>; - type MaxControllersInDeprecationBatch = ConstU32<100>; - type HistoryDepth = ConstU32<84>; - type EventListeners = (); - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_im_online::Config for Test { diff --git a/substrate/frame/root-offences/src/mock.rs b/substrate/frame/root-offences/src/mock.rs index ea7044fb6a3..3c758b91d52 100644 --- a/substrate/frame/root-offences/src/mock.rs +++ b/substrate/frame/root-offences/src/mock.rs @@ -124,15 +124,11 @@ parameter_types! { pub static LedgerSlashPerEra: (BalanceOf, BTreeMap>) = (Zero::zero(), BTreeMap::new()); } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Test { type Currency = Balances; type CurrencyBalance = ::Balance; type UnixTime = Timestamp; - type CurrencyToVote = (); - type RewardRemainder = (); - type RuntimeEvent = RuntimeEvent; - type Slash = (); - type Reward = (); type SessionsPerEra = SessionsPerEra; type SlashDeferDuration = SlashDeferDuration; type AdminOrigin = frame_system::EnsureRoot; @@ -140,19 +136,10 @@ impl pallet_staking::Config for Test { type SessionInterface = Self; type EraPayout = pallet_staking::ConvertCurve; type NextNewSession = Session; - type MaxExposurePageSize = ConstU32<64>; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; type TargetList = pallet_staking::UseValidatorsMap; - type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; - type MaxUnlockingChunks = ConstU32<32>; - type HistoryDepth = ConstU32<84>; - type MaxControllersInDeprecationBatch = ConstU32<100>; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; - type EventListeners = (); - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl pallet_session::historical::Config for Test { diff --git a/substrate/frame/session/benchmarking/src/mock.rs b/substrate/frame/session/benchmarking/src/mock.rs index b79bae73270..2aec58ccede 100644 --- a/substrate/frame/session/benchmarking/src/mock.rs +++ b/substrate/frame/session/benchmarking/src/mock.rs @@ -129,35 +129,19 @@ impl onchain::Config for OnChainSeqPhragmen { type Bounds = ElectionsBounds; } +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] impl pallet_staking::Config for Test { type Currency = Balances; type CurrencyBalance = ::Balance; type UnixTime = pallet_timestamp::Pallet; - type CurrencyToVote = (); - type RewardRemainder = (); - type RuntimeEvent = RuntimeEvent; - type Slash = (); - type Reward = (); - type SessionsPerEra = (); - type SlashDeferDuration = (); type AdminOrigin = frame_system::EnsureRoot; - type BondingDuration = (); type SessionInterface = Self; type EraPayout = pallet_staking::ConvertCurve; type NextNewSession = Session; - type MaxExposurePageSize = ConstU32<64>; type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; - type MaxUnlockingChunks = ConstU32<32>; - type MaxControllersInDeprecationBatch = ConstU32<100>; - type HistoryDepth = ConstU32<84>; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type TargetList = pallet_staking::UseValidatorsMap; - type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; - type EventListeners = (); - type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; - type WeightInfo = (); - type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } impl crate::Config for Test {} diff --git a/substrate/frame/staking/src/mock.rs b/substrate/frame/staking/src/mock.rs index 6d65500ef90..7e6a87955b0 100644 --- a/substrate/frame/staking/src/mock.rs +++ b/substrate/frame/staking/src/mock.rs @@ -261,19 +261,15 @@ impl OnStakingUpdate for EventListenerMock { // Disabling threshold for `UpToLimitDisablingStrategy` pub(crate) const DISABLING_LIMIT_FACTOR: usize = 3; +#[derive_impl(crate::config_preludes::TestDefaultConfig)] impl crate::pallet::pallet::Config for Test { type Currency = Balances; - type CurrencyBalance = ::Balance; type UnixTime = Timestamp; - type CurrencyToVote = (); type RewardRemainder = RewardRemainderMock; - type RuntimeEvent = RuntimeEvent; - type Slash = (); type Reward = MockReward; type SessionsPerEra = SessionsPerEra; type SlashDeferDuration = SlashDeferDuration; type AdminOrigin = EnsureOneOrRoot; - type BondingDuration = BondingDuration; type SessionInterface = Self; type EraPayout = ConvertCurve; type NextNewSession = Session; @@ -288,8 +284,6 @@ impl crate::pallet::pallet::Config for Test { type HistoryDepth = HistoryDepth; type MaxControllersInDeprecationBatch = MaxControllersInDeprecationBatch; type EventListeners = EventListenerMock; - type BenchmarkingConfig = TestBenchmarkingConfig; - type WeightInfo = (); type DisablingStrategy = pallet_staking::UpToLimitDisablingStrategy; } diff --git a/substrate/frame/staking/src/pallet/mod.rs b/substrate/frame/staking/src/pallet/mod.rs index 284a801a0f0..a76e47edf38 100644 --- a/substrate/frame/staking/src/pallet/mod.rs +++ b/substrate/frame/staking/src/pallet/mod.rs @@ -86,9 +86,10 @@ pub mod pallet { Remove, } - #[pallet::config] + #[pallet::config(with_default)] pub trait Config: frame_system::Config { /// The staking balance. + #[pallet::no_default] type Currency: LockableCurrency< Self::AccountId, Moment = BlockNumberFor, @@ -109,6 +110,7 @@ pub mod pallet { /// /// It is guaranteed to start being called from the first `on_finalize`. Thus value at /// genesis is not used. + #[pallet::no_default] type UnixTime: UnixTime; /// Convert a balance into a number used for election calculation. This must fit into a @@ -117,9 +119,11 @@ pub mod pallet { /// in 128. /// Consequently, the backward convert is used convert the u128s from sp-elections back to a /// [`BalanceOf`]. + #[pallet::no_default_bounds] type CurrencyToVote: sp_staking::currency_to_vote::CurrencyToVote>; /// Something that provides the election functionality. + #[pallet::no_default] type ElectionProvider: ElectionProvider< AccountId = Self::AccountId, BlockNumber = BlockNumberFor, @@ -127,6 +131,7 @@ pub mod pallet { DataProvider = Pallet, >; /// Something that provides the election functionality at genesis. + #[pallet::no_default] type GenesisElectionProvider: ElectionProvider< AccountId = Self::AccountId, BlockNumber = BlockNumberFor, @@ -134,6 +139,7 @@ pub mod pallet { >; /// Something that defines the maximum number of nominations per nominator. + #[pallet::no_default_bounds] type NominationsQuota: NominationsQuota>; /// Number of eras to keep in history. @@ -161,17 +167,21 @@ pub mod pallet { /// Tokens have been minted and are unused for validator-reward. /// See [Era payout](./index.html#era-payout). + #[pallet::no_default_bounds] type RewardRemainder: OnUnbalanced>; /// The overarching event type. + #[pallet::no_default_bounds] type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Handler for the unbalanced reduction when slashing a staker. + #[pallet::no_default_bounds] type Slash: OnUnbalanced>; /// Handler for the unbalanced increment when rewarding a staker. /// NOTE: in most cases, the implementation of `OnUnbalanced` should modify the total /// issuance. + #[pallet::no_default_bounds] type Reward: OnUnbalanced>; /// Number of sessions per era. @@ -192,6 +202,7 @@ pub mod pallet { /// The origin which can manage less critical staking parameters that does not require root. /// /// Supported actions: (1) cancel deferred slash, (2) set minimum commission. + #[pallet::no_default] type AdminOrigin: EnsureOrigin; /// Interface for interacting with a session pallet. @@ -199,10 +210,12 @@ pub mod pallet { /// The payout for validators and the system for the current era. /// See [Era payout](./index.html#era-payout). + #[pallet::no_default] type EraPayout: EraPayout>; /// Something that can estimate the next session change, accurately or as a best effort /// guess. + #[pallet::no_default_bounds] type NextNewSession: EstimateNextNewSession>; /// The maximum size of each `T::ExposurePage`. @@ -230,6 +243,7 @@ pub mod pallet { /// staker. In case of `bags-list`, this always means using `rebag` and `putInFrontOf`. /// /// Invariant: what comes out of this list will always be a nominator. + #[pallet::no_default] type VoterList: SortedListProvider; /// WIP: This is a noop as of now, the actual business logic that's described below is going @@ -252,6 +266,7 @@ pub mod pallet { /// validators, they can chill at any point, and their approval stakes will still be /// recorded. This implies that what comes out of iterating this list MIGHT NOT BE AN ACTIVE /// VALIDATOR. + #[pallet::no_default] type TargetList: SortedListProvider>; /// The maximum number of `unlocking` chunks a [`StakingLedger`] can @@ -274,18 +289,66 @@ pub mod pallet { /// receives. /// /// WARNING: this only reports slashing and withdraw events for the time being. + #[pallet::no_default_bounds] type EventListeners: sp_staking::OnStakingUpdate>; - // `DisablingStragegy` controls how validators are disabled + /// `DisablingStragegy` controls how validators are disabled + #[pallet::no_default_bounds] type DisablingStrategy: DisablingStrategy; /// Some parameters of the benchmarking. + #[cfg(feature = "std")] + type BenchmarkingConfig: BenchmarkingConfig; + + #[cfg(not(feature = "std"))] + #[pallet::no_default] type BenchmarkingConfig: BenchmarkingConfig; /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; } + /// Default implementations of [`DefaultConfig`], which can be used to implement [`Config`]. + pub mod config_preludes { + use super::*; + use frame_support::{derive_impl, parameter_types, traits::ConstU32}; + pub struct TestDefaultConfig; + + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] + impl frame_system::DefaultConfig for TestDefaultConfig {} + + parameter_types! { + pub const SessionsPerEra: SessionIndex = 3; + pub const BondingDuration: EraIndex = 3; + } + + #[frame_support::register_default_impl(TestDefaultConfig)] + impl DefaultConfig for TestDefaultConfig { + #[inject_runtime_type] + type RuntimeEvent = (); + type CurrencyBalance = u128; + type CurrencyToVote = (); + type NominationsQuota = crate::FixedNominationsQuota<16>; + type HistoryDepth = ConstU32<84>; + type RewardRemainder = (); + type Slash = (); + type Reward = (); + type SessionsPerEra = SessionsPerEra; + type BondingDuration = BondingDuration; + type SlashDeferDuration = (); + type SessionInterface = (); + type NextNewSession = (); + type MaxExposurePageSize = ConstU32<64>; + type MaxUnlockingChunks = ConstU32<32>; + type MaxControllersInDeprecationBatch = ConstU32<100>; + type EventListeners = (); + type DisablingStrategy = crate::UpToLimitDisablingStrategy; + #[cfg(feature = "std")] + type BenchmarkingConfig = crate::TestBenchmarkingConfig; + type WeightInfo = (); + } + } + /// The ideal number of active validators. #[pallet::storage] #[pallet::getter(fn validator_count)] -- GitLab From 2e39e052adfe951a3f2b70833111a8026ce3f992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 17 Jun 2024 15:56:00 +0200 Subject: [PATCH 012/130] Improve pruning CLI documentation (#4810) Closes: https://github.com/paritytech/polkadot-sdk/issues/4801 @andreclaro I hope this makes it more clear from the docs directly. --- .../client/cli/src/params/pruning_params.rs | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/substrate/client/cli/src/params/pruning_params.rs b/substrate/client/cli/src/params/pruning_params.rs index 25b17b53289..88ae006c638 100644 --- a/substrate/client/cli/src/params/pruning_params.rs +++ b/substrate/client/cli/src/params/pruning_params.rs @@ -17,7 +17,7 @@ // along with this program. If not, see . use crate::error; -use clap::Args; +use clap::{builder::PossibleValue, Args, ValueEnum}; use sc_service::{BlocksPruning, PruningMode}; /// Parameters to define the pruning mode @@ -29,29 +29,24 @@ pub struct PruningParams { /// should be pruned (ie, removed) from the database. /// This setting can only be set on the first creation of the database. Every subsequent run /// will load the pruning mode from the database and will error if the stored mode doesn't - /// match this CLI value. It is fine to drop this CLI flag for subsequent runs. - /// Possible values: - /// - archive: Keep the state of all blocks. - /// - 'archive-canonical' Keep only the state of finalized blocks. - /// - number Keep the state of the last number of finalized blocks. + /// match this CLI value. It is fine to drop this CLI flag for subsequent runs. The only + /// exception is that `` can change between subsequent runs (increasing it will not + /// lead to restoring pruned state). + /// /// [default: 256] - #[arg(alias = "pruning", long, value_name = "PRUNING_MODE")] + #[arg(alias = "pruning", long, value_name = "PRUNING_MODE", value_enum)] pub state_pruning: Option, /// Specify the blocks pruning mode. /// /// This mode specifies when the block's body (including justifications) /// should be pruned (ie, removed) from the database. - /// Possible values: - /// - 'archive' Keep all blocks. - /// - 'archive-canonical' Keep only finalized blocks. - /// - number - /// Keep the last `number` of finalized blocks. #[arg( alias = "keep-blocks", long, value_name = "PRUNING_MODE", - default_value = "archive-canonical" + default_value_t = DatabasePruningMode::ArchiveCanonical, + value_enum )] pub blocks_pruning: DatabasePruningMode, } @@ -83,6 +78,26 @@ pub enum DatabasePruningMode { Custom(u32), } +impl ValueEnum for DatabasePruningMode { + fn value_variants<'a>() -> &'a [Self] { + &[Self::Archive, Self::ArchiveCanonical, Self::Custom(0)] + } + + fn to_possible_value(&self) -> Option { + Some(match self { + Self::Archive => PossibleValue::new("archive").help("Keep the data of all blocks."), + Self::ArchiveCanonical => PossibleValue::new("archive-canonical") + .help("Keep only the data of finalized blocks."), + Self::Custom(_) => PossibleValue::new("") + .help("Keep the data of the last of finalized blocks."), + }) + } + + fn from_str(input: &str, _: bool) -> Result { + ::from_str(input) + } +} + impl std::str::FromStr for DatabasePruningMode { type Err = String; -- GitLab From fed508f962f283600b2cc15335a3659efb0ceae9 Mon Sep 17 00:00:00 2001 From: hattizai Date: Mon, 17 Jun 2024 22:13:48 +0800 Subject: [PATCH 013/130] chore: remove unnecessary words (#4796) remove unnecessary words in comments. --- docs/sdk/src/guides/your_first_pallet/mod.rs | 6 +++--- substrate/primitives/trie/src/lib.rs | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/sdk/src/guides/your_first_pallet/mod.rs b/docs/sdk/src/guides/your_first_pallet/mod.rs index 0a22b13df81..da4624f5ac2 100644 --- a/docs/sdk/src/guides/your_first_pallet/mod.rs +++ b/docs/sdk/src/guides/your_first_pallet/mod.rs @@ -626,7 +626,7 @@ pub mod pallet { #[test] fn transfer_works() { StateBuilder::default().build_and_execute(|| { - // given the the initial state, when: + // given the initial state, when: assert_ok!(Pallet::::transfer(RuntimeOrigin::signed(ALICE), BOB, 50)); // then: @@ -648,7 +648,7 @@ pub mod pallet { #[test] fn transfer_from_non_existent_fails() { StateBuilder::default().build_and_execute(|| { - // given the the initial state, when: + // given the initial state, when: assert_err!( Pallet::::transfer(RuntimeOrigin::signed(CHARLIE), ALICE, 10), "NonExistentAccount" @@ -769,7 +769,7 @@ pub mod pallet_v2 { // the final assertion. System::set_block_number(ALICE); - // given the the initial state, when: + // given the initial state, when: assert_ok!(Pallet::::transfer(RuntimeOrigin::signed(ALICE), BOB, 50)); // then: diff --git a/substrate/primitives/trie/src/lib.rs b/substrate/primitives/trie/src/lib.rs index 54f202eda0c..0c14e3af196 100644 --- a/substrate/primitives/trie/src/lib.rs +++ b/substrate/primitives/trie/src/lib.rs @@ -195,11 +195,11 @@ pub type MemoryDB = memory_db::MemoryDB, trie_db::DB /// Reexport from `hash_db`, with genericity set for `Hasher` trait. pub type GenericMemoryDB = memory_db::MemoryDB; -/// Persistent trie database read-access interface for the a given hasher. +/// Persistent trie database read-access interface for a given hasher. pub type TrieDB<'a, 'cache, L> = trie_db::TrieDB<'a, 'cache, L>; /// Builder for creating a [`TrieDB`]. pub type TrieDBBuilder<'a, 'cache, L> = trie_db::TrieDBBuilder<'a, 'cache, L>; -/// Persistent trie database write-access interface for the a given hasher. +/// Persistent trie database write-access interface for a given hasher. pub type TrieDBMut<'a, L> = trie_db::TrieDBMut<'a, L>; /// Builder for creating a [`TrieDBMut`]. pub type TrieDBMutBuilder<'a, L> = trie_db::TrieDBMutBuilder<'a, L>; @@ -212,17 +212,17 @@ pub type TrieHash = <::Hash as Hasher>::Out; pub mod trie_types { use super::*; - /// Persistent trie database read-access interface for the a given hasher. + /// Persistent trie database read-access interface for a given hasher. /// /// Read only V1 and V0 are compatible, thus we always use V1. pub type TrieDB<'a, 'cache, H> = super::TrieDB<'a, 'cache, LayoutV1>; /// Builder for creating a [`TrieDB`]. pub type TrieDBBuilder<'a, 'cache, H> = super::TrieDBBuilder<'a, 'cache, LayoutV1>; - /// Persistent trie database write-access interface for the a given hasher. + /// Persistent trie database write-access interface for a given hasher. pub type TrieDBMutV0<'a, H> = super::TrieDBMut<'a, LayoutV0>; /// Builder for creating a [`TrieDBMutV0`]. pub type TrieDBMutBuilderV0<'a, H> = super::TrieDBMutBuilder<'a, LayoutV0>; - /// Persistent trie database write-access interface for the a given hasher. + /// Persistent trie database write-access interface for a given hasher. pub type TrieDBMutV1<'a, H> = super::TrieDBMut<'a, LayoutV1>; /// Builder for creating a [`TrieDBMutV1`]. pub type TrieDBMutBuilderV1<'a, H> = super::TrieDBMutBuilder<'a, LayoutV1>; -- GitLab From 6cb3bd23910ec48ab37a3c95a6b03286ff2979bf Mon Sep 17 00:00:00 2001 From: Tom Mi Date: Mon, 17 Jun 2024 18:11:21 +0300 Subject: [PATCH 014/130] Ibp bootnodes for Kusama People (#6) (#4741) * fix rotko's pcollectives bootnode * Update people-kusama.json * Add Dwellir People Kusama bootnode * add Gatotech bootnodes to `people-kusama` * Add Dwellir People Kusama bootnode * Update Amforc bootnodes for Kusama and Polkadot (#4668) --------- Co-authored-by: RadiumBlock Co-authored-by: Jonathan Udd Co-authored-by: Milos Kriz Co-authored-by: tugy <33746108+tugytur@users.noreply.github.com> Co-authored-by: Kutsal Kaan Bilgin Co-authored-by: Petr Mensik Co-authored-by: Tommi --- .../chain-specs/collectives-polkadot.json | 5 ++--- .../parachains/chain-specs/people-kusama.json | 20 ++++++++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/cumulus/parachains/chain-specs/collectives-polkadot.json b/cumulus/parachains/chain-specs/collectives-polkadot.json index a0d5ddff6eb..a6ba01ffa39 100644 --- a/cumulus/parachains/chain-specs/collectives-polkadot.json +++ b/cumulus/parachains/chain-specs/collectives-polkadot.json @@ -23,9 +23,8 @@ "/dns/polkadot-collectives-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWDMFYCNRAQcSRNV7xu2xv8319goSEbSHW4TnXRz6EpPKc", "/dns/collectives-polkadot-bootnode.radiumblock.com/tcp/30333/p2p/12D3KooWDumvnNwPbBg5inBEapgjKU7ECdMHHgwfYeGWUkzYUE1c", "/dns/collectives-polkadot-bootnode.radiumblock.com/tcp/30336/wss/p2p/12D3KooWDumvnNwPbBg5inBEapgjKU7ECdMHHgwfYeGWUkzYUE1c", - "/dns/pch13.rotko.net/tcp/33573/p2p/12D3KooWRXudHoazPZ9osMfdY38e8CBxQLD4RhrVeHpRSNNpcDtH", - "/dns/pch13.rotko.net/tcp/34573/ws/p2p/12D3KooWRXudHoazPZ9osMfdY38e8CBxQLD4RhrVeHpRSNNpcDtH", - "/dns/pch13.rotko.net/tcp/35573/wss/p2p/12D3KooWRXudHoazPZ9osMfdY38e8CBxQLD4RhrVeHpRSNNpcDtH", + "/dns/pch16.rotko.net/tcp/33576/p2p/12D3KooWKrm3XmuGzJH17Wcn4HRDGsEjLZGDgN77q3ZhwnnQP7y1", + "/dns/pch16.rotko.net/tcp/35576/wss/p2p/12D3KooWKrm3XmuGzJH17Wcn4HRDGsEjLZGDgN77q3ZhwnnQP7y1", "/dns/collectives-polkadot.bootnodes.polkadotters.com/tcp/30526/p2p/12D3KooWNohUjvJtGKUa8Vhy8C1ZBB5N8JATB6e7rdLVCioeb3ff", "/dns/collectives-polkadot.bootnodes.polkadotters.com/tcp/30528/wss/p2p/12D3KooWNohUjvJtGKUa8Vhy8C1ZBB5N8JATB6e7rdLVCioeb3ff", "/dns/boot-polkadot-collectives.luckyfriday.io/tcp/443/wss/p2p/12D3KooWCzifnPooTt4kvTnXT7FTKTymVL7xn7DURQLsS2AKpf6w" diff --git a/cumulus/parachains/chain-specs/people-kusama.json b/cumulus/parachains/chain-specs/people-kusama.json index 00a38b675de..3352cb25a28 100644 --- a/cumulus/parachains/chain-specs/people-kusama.json +++ b/cumulus/parachains/chain-specs/people-kusama.json @@ -8,7 +8,25 @@ "/dns/kusama-people-connect-0.polkadot.io/tcp/443/wss/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1", "/dns/kusama-people-connect-1.polkadot.io/tcp/443/wss/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm", "/dns/people-kusama.bootnode.amforc.com/tcp/29999/wss/p2p/12D3KooWPjzgKZe5jdG6TY4gwcFq8QxyyhqsYbQo6N29pwGePWLA", - "/dns/people-kusama.bootnode.amforc.com/tcp/30004/p2p/12D3KooWPjzgKZe5jdG6TY4gwcFq8QxyyhqsYbQo6N29pwGePWLA" + "/dns/people-kusama.bootnode.amforc.com/tcp/30004/p2p/12D3KooWPjzgKZe5jdG6TY4gwcFq8QxyyhqsYbQo6N29pwGePWLA", + "/dns/boot.gatotech.network/tcp/33240/p2p/12D3KooWLi9TzaKX4zniJpiM521PnYG4EocpdqjPpJUhXq9QGkRX", + "/dns/boot.gatotech.network/tcp/35240/wss/p2p/12D3KooWLi9TzaKX4zniJpiM521PnYG4EocpdqjPpJUhXq9QGkRX", + "/dns/people-kusama-bootnode.radiumblock.com/tcp/30333/p2p/12D3KooWGP1C9iWTHnZyeaSjYZ7LdK8douXWc1n1dBv25XEASHaj", + "/dns/people-kusama-bootnode.radiumblock.com/tcp/30336/wss/p2p/12D3KooWGP1C9iWTHnZyeaSjYZ7LdK8douXWc1n1dBv25XEASHaj", + "/dns/kppl16.rotko.net/tcp/33756/p2p/12D3KooWSKQwgoydfbN6mNN2aNwdqfkR2ExAnTRs8mmdrPQTtDLo", + "/dns/kppl16.rotko.net/tcp/35756/wss/p2p/12D3KooWSKQwgoydfbN6mNN2aNwdqfkR2ExAnTRs8mmdrPQTtDLo", + "/dns/people-kusama-boot-ng.dwellir.com/tcp/30359/p2p/12D3KooWM6T8MMibxLZhhpq6F612CZ4FgnfDSJSkWDMiVUDe1aGb", + "/dns/people-kusama-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWM6T8MMibxLZhhpq6F612CZ4FgnfDSJSkWDMiVUDe1aGb", + "/dns/people-kusama-bootnode.turboflakes.io/tcp/30645/p2p/12D3KooWCR2Q8J2NFFfuofDak4zSgWkuBq7orP96HFaxLgAoDUBV", + "/dns/people-kusama-bootnode.turboflakes.io/tcp/30745/wss/p2p/12D3KooWCR2Q8J2NFFfuofDak4zSgWkuBq7orP96HFaxLgAoDUBV", + "/dns/boot-node.helikon.io/tcp/7510/p2p/12D3KooWM1X4setrMWjwnV8iDkAtYhqFHNkGozdWdq6sawWh5Yhv", + "/dns/boot-node.helikon.io/tcp/7512/wss/p2p/12D3KooWM1X4setrMWjwnV8iDkAtYhqFHNkGozdWdq6sawWh5Yhv", + "/dns/people-kusama.bootnodes.polkadotters.com/tcp/30377/p2p/12D3KooWHy7TAuK6EoVij2tfaeh3KkaEJxhTmumbEom3HfRnSEsp", + "/dns/people-kusama.bootnodes.polkadotters.com/tcp/30379/wss/p2p/12D3KooWHy7TAuK6EoVij2tfaeh3KkaEJxhTmumbEom3HfRnSEsp", + "/dns/boot.metaspan.io/tcp/25068/p2p/12D3KooWDoDLtLvQi8hhFVyubPZhaYuAwSAJrPFtyGWJ2NSfBiyP", + "/dns/boot.metaspan.io/tcp/25069/wss/p2p/12D3KooWDoDLtLvQi8hhFVyubPZhaYuAwSAJrPFtyGWJ2NSfBiyP", + "/dns/ibp-boot-kusama-people.luckyfriday.io/tcp/30342/p2p/12D3KooWM4bRafMH2StfBEQtyj5cMWfGLYbuikCZmvKv9m1MQVPn", + "/dns/ibp-boot-kusama-people.luckyfriday.io/tcp/443/wss/p2p/12D3KooWM4bRafMH2StfBEQtyj5cMWfGLYbuikCZmvKv9m1MQVPn" ], "telemetryEndpoints": null, "protocolId": null, -- GitLab From 5055294521021c0ffa1c449d6793ec9d264e5bd5 Mon Sep 17 00:00:00 2001 From: Florian Franzen Date: Mon, 17 Jun 2024 20:47:36 +0200 Subject: [PATCH 015/130] node-inspect: do not depend on rocksdb (#4783) The crate `sc-cli` otherwise enables the `rocksdb` feature. --- substrate/bin/node/inspect/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/bin/node/inspect/Cargo.toml b/substrate/bin/node/inspect/Cargo.toml index 5e4488903bf..e23a4c4f37e 100644 --- a/substrate/bin/node/inspect/Cargo.toml +++ b/substrate/bin/node/inspect/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] clap = { version = "4.5.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.12" } thiserror = { workspace = true } -sc-cli = { path = "../../../client/cli" } +sc-cli = { path = "../../../client/cli", default-features = false } sc-client-api = { path = "../../../client/api" } sc-service = { path = "../../../client/service", default-features = false } sp-blockchain = { path = "../../../primitives/blockchain" } -- GitLab From 55a13abcd2f67e7fdfc8843f5c4a54798e26a9df Mon Sep 17 00:00:00 2001 From: Kantapat chankasem Date: Tue, 18 Jun 2024 05:30:13 +0700 Subject: [PATCH 016/130] remove pallet::getter usage from pallet-timestamp (#3374) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit this pr is a part of #3326 --------- Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: Bastian Köcher --- cumulus/test/runtime/src/lib.rs | 4 ++-- polkadot/runtime/test-runtime/src/lib.rs | 3 ++- prdoc/pr_3374.prdoc | 13 +++++++++++++ .../test-staking-e2e/src/lib.rs | 5 +++-- substrate/frame/timestamp/src/benchmarking.rs | 4 ++-- substrate/frame/timestamp/src/lib.rs | 13 ++++++------- substrate/frame/timestamp/src/tests.rs | 2 +- 7 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 prdoc/pr_3374.prdoc diff --git a/cumulus/test/runtime/src/lib.rs b/cumulus/test/runtime/src/lib.rs index 452b3241d0b..26c6635e1ad 100644 --- a/cumulus/test/runtime/src/lib.rs +++ b/cumulus/test/runtime/src/lib.rs @@ -66,7 +66,7 @@ use frame_system::{ pub use pallet_balances::Call as BalancesCall; pub use pallet_glutton::Call as GluttonCall; pub use pallet_sudo::Call as SudoCall; -pub use pallet_timestamp::Call as TimestampCall; +pub use pallet_timestamp::{Call as TimestampCall, Now}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; pub use sp_runtime::{Perbill, Permill}; @@ -499,7 +499,7 @@ impl_runtime_apis! { impl crate::GetLastTimestamp for Runtime { fn get_last_timestamp() -> u64 { - Timestamp::now() + Now::::get() } } diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index 8178639946f..334c6eb733a 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -53,6 +53,7 @@ use frame_support::{ }; use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId}; use pallet_session::historical as session_historical; +use pallet_timestamp::Now; use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo}; use polkadot_primitives::{ slashing, AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CandidateHash, @@ -1186,7 +1187,7 @@ sp_api::impl_runtime_apis! { impl crate::GetLastTimestamp for Runtime { fn get_last_timestamp() -> u64 { - Timestamp::now() + Now::::get() } } diff --git a/prdoc/pr_3374.prdoc b/prdoc/pr_3374.prdoc new file mode 100644 index 00000000000..76744f778db --- /dev/null +++ b/prdoc/pr_3374.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: removed `pallet::getter` from `pallet-timestamp` + +doc: + - audience: Runtime Dev + description: | + This PR removes all the `pallet::getter` usages from `pallet-timestamp`, and updates depdendant runtimes accordingly. + The syntax `StorageItem::::get()` should be used instead. + +crates: + - name: pallet-timestamp \ No newline at end of file diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs index 2b1f1335c6f..aaffbb6681c 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs @@ -22,6 +22,7 @@ pub(crate) const LOG_TARGET: &str = "tests::e2e-epm"; use frame_support::{assert_err, assert_noop, assert_ok}; use mock::*; +use pallet_timestamp::Now; use sp_core::Get; use sp_runtime::Perbill; @@ -46,7 +47,7 @@ fn log_current_time() { Session::current_index(), Staking::current_era(), ElectionProviderMultiPhase::current_phase(), - Timestamp::now() + Now::::get() ); } @@ -209,7 +210,7 @@ fn continuous_slashes_below_offending_threshold() { // failed due to election minimum score. if start_next_active_era(pool_state.clone()).is_err() { assert!(ElectionProviderMultiPhase::current_phase().is_emergency()); - break + break; } active_validator_set = Session::validators(); diff --git a/substrate/frame/timestamp/src/benchmarking.rs b/substrate/frame/timestamp/src/benchmarking.rs index 82dfdfa8b31..d8c27b4967a 100644 --- a/substrate/frame/timestamp/src/benchmarking.rs +++ b/substrate/frame/timestamp/src/benchmarking.rs @@ -25,7 +25,7 @@ use frame_support::{ensure, traits::OnFinalize}; use frame_system::RawOrigin; use sp_storage::TrackedStorageKey; -use crate::Pallet as Timestamp; +use crate::{Now, Pallet as Timestamp}; const MAX_TIME: u32 = 100; @@ -42,7 +42,7 @@ benchmarks! { }); }: _(RawOrigin::None, t.into()) verify { - ensure!(Timestamp::::now() == t.into(), "Time was not set."); + ensure!(Now::::get() == t.into(), "Time was not set."); } on_finalize { diff --git a/substrate/frame/timestamp/src/lib.rs b/substrate/frame/timestamp/src/lib.rs index 5269f17eca6..6a22ab1cd5e 100644 --- a/substrate/frame/timestamp/src/lib.rs +++ b/substrate/frame/timestamp/src/lib.rs @@ -202,7 +202,6 @@ pub mod pallet { /// The current time for the current block. #[pallet::storage] - #[pallet::getter(fn now)] pub type Now = StorageValue<_, T::Moment, ValueQuery>; /// Whether the timestamp has been updated in this block. @@ -261,7 +260,7 @@ pub mod pallet { pub fn set(origin: OriginFor, #[pallet::compact] now: T::Moment) -> DispatchResult { ensure_none(origin)?; assert!(!DidUpdate::::exists(), "Timestamp must be updated only once in the block"); - let prev = Self::now(); + let prev = Now::::get(); assert!( prev.is_zero() || now >= prev + T::MinimumPeriod::get(), "Timestamp must increment by at least between sequential blocks" @@ -296,7 +295,7 @@ pub mod pallet { .expect("Timestamp inherent data must be provided"); let data = (*inherent_data).saturated_into::(); - let next_time = cmp::max(data, Self::now() + T::MinimumPeriod::get()); + let next_time = cmp::max(data, Now::::get() + T::MinimumPeriod::get()); Some(Call::set { now: next_time }) } @@ -317,7 +316,7 @@ pub mod pallet { .expect("Timestamp inherent data not correctly encoded") .expect("Timestamp inherent data must be provided"); - let minimum = (Self::now() + T::MinimumPeriod::get()).saturated_into::(); + let minimum = (Now::::get() + T::MinimumPeriod::get()).saturated_into::(); if t > *(data + MAX_TIMESTAMP_DRIFT_MILLIS) { Err(InherentError::TooFarInFuture) } else if t < minimum { @@ -339,7 +338,7 @@ impl Pallet { /// NOTE: if this function is called prior to setting the timestamp, /// it will return the timestamp of the previous block. pub fn get() -> T::Moment { - Self::now() + Now::::get() } /// Set the timestamp to something in particular. Only used for tests. @@ -356,7 +355,7 @@ impl Time for Pallet { type Moment = T::Moment; fn now() -> Self::Moment { - Self::now() + Now::::get() } } @@ -367,7 +366,7 @@ impl UnixTime for Pallet { fn now() -> core::time::Duration { // now is duration since unix epoch in millisecond as documented in // `sp_timestamp::InherentDataProvider`. - let now = Self::now(); + let now = Now::::get(); sp_std::if_std! { if now == T::Moment::zero() { log::error!( diff --git a/substrate/frame/timestamp/src/tests.rs b/substrate/frame/timestamp/src/tests.rs index cc49d8a3296..a8385556188 100644 --- a/substrate/frame/timestamp/src/tests.rs +++ b/substrate/frame/timestamp/src/tests.rs @@ -25,7 +25,7 @@ fn timestamp_works() { new_test_ext().execute_with(|| { crate::Now::::put(46); assert_ok!(Timestamp::set(RuntimeOrigin::none(), 69)); - assert_eq!(Timestamp::now(), 69); + assert_eq!(crate::Now::::get(), 69); assert_eq!(Some(69), get_captured_moment()); }); } -- GitLab From 7c847f8db6ab9ca9ef990c4cf61275415c78d106 Mon Sep 17 00:00:00 2001 From: Daan van der Plas <93204684+Daanvdplas@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:51:47 +0200 Subject: [PATCH 017/130] refactor: parachain template (#4684) Update parachain template pallet based on polkadot sdk docs @kianenigma --------- Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --- prdoc/pr_4684.prdoc | 13 +++ .../parachain/pallets/template/src/lib.rs | 42 ++++--- .../parachain/pallets/template/src/mock.rs | 45 +++++--- .../parachain/pallets/template/src/weights.rs | 2 +- templates/parachain/runtime/Cargo.toml | 2 +- templates/parachain/runtime/src/lib.rs | 107 +++++++++++------- 6 files changed, 133 insertions(+), 78 deletions(-) create mode 100644 prdoc/pr_4684.prdoc diff --git a/prdoc/pr_4684.prdoc b/prdoc/pr_4684.prdoc new file mode 100644 index 00000000000..b1c429c5782 --- /dev/null +++ b/prdoc/pr_4684.prdoc @@ -0,0 +1,13 @@ +title: "Refactor of the parachain template" + +doc: + - audience: Runtime Dev + description: | + Introduce the construct runtime V2 to the parachain template runtime. In addition, url links in the parachain pallet + template now direct to the polkadot sdk docs. + +crates: + - name: pallet-parachain-template + bump: none + - name: parachain-template-runtime + bump: none diff --git a/templates/parachain/pallets/template/src/lib.rs b/templates/parachain/pallets/template/src/lib.rs index 11587d1df42..0420e2b9082 100644 --- a/templates/parachain/pallets/template/src/lib.rs +++ b/templates/parachain/pallets/template/src/lib.rs @@ -1,8 +1,5 @@ #![cfg_attr(not(feature = "std"), no_std)] -/// Edit this file to define custom logic or remove it if it is not needed. -/// Learn more about FRAME and the core library of Substrate FRAME pallets: -/// pub use pallet::*; #[cfg(test)] @@ -16,6 +13,12 @@ pub mod weights; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; +// +// +// +// To see a full list of `pallet` macros and their use cases, see: +// +// #[frame_support::pallet] pub mod pallet { use frame_support::{dispatch::DispatchResultWithPostInfo, pallet_prelude::*}; @@ -25,7 +28,9 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config { /// Because this pallet emits events, it depends on the runtime's definition of an event. + /// type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// A type representing the weights required by the dispatchables of this pallet. type WeightInfo: crate::weights::WeightInfo; } @@ -33,24 +38,23 @@ pub mod pallet { #[pallet::pallet] pub struct Pallet(_); - // The pallet's runtime storage items. - // https://docs.substrate.io/v3/runtime/storage + /// The pallet's storage items. + /// + /// #[pallet::storage] - // Learn more about declaring storage items: - // https://docs.substrate.io/v3/runtime/storage#declaring-storage-items pub type Something = StorageValue<_, u32>; - // Pallets use events to inform users when important changes are made. - // https://docs.substrate.io/v3/runtime/events-and-errors + /// Pallets use events to inform users when important changes are made. + /// #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { - /// Event documentation should end with an array that provides descriptive names for event - /// parameters. [something, who] - SomethingStored(u32, T::AccountId), + /// We usually use passive tense for events. + SomethingStored { something: u32, who: T::AccountId }, } - // Errors inform users that something went wrong. + /// Errors inform users that something went wrong. + /// #[pallet::error] pub enum Error { /// Error names should be descriptive. @@ -62,9 +66,10 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet {} - // Dispatchable functions allows users to interact with the pallet and invoke state changes. - // These functions materialize as "extrinsics", which are often compared to transactions. - // Dispatchable functions must be annotated with a weight and must return a DispatchResult. + /// Dispatchable functions allows users to interact with the pallet and invoke state changes. + /// These functions materialize as "extrinsics", which are often compared to transactions. + /// Dispatchable functions must be annotated with a weight and must return a DispatchResult. + /// #[pallet::call] impl Pallet { /// An example dispatchable that takes a singles value as a parameter, writes the value to @@ -74,14 +79,15 @@ pub mod pallet { pub fn do_something(origin: OriginFor, something: u32) -> DispatchResultWithPostInfo { // Check that the extrinsic was signed and get the signer. // This function will return an error if the extrinsic is not signed. - // https://docs.substrate.io/v3/runtime/origins + // let who = ensure_signed(origin)?; // Update storage. >::put(something); // Emit an event. - Self::deposit_event(Event::SomethingStored(something, who)); + Self::deposit_event(Event::SomethingStored { something, who }); + // Return a successful DispatchResultWithPostInfo Ok(().into()) } diff --git a/templates/parachain/pallets/template/src/mock.rs b/templates/parachain/pallets/template/src/mock.rs index ebb0598df97..46e3117596f 100644 --- a/templates/parachain/pallets/template/src/mock.rs +++ b/templates/parachain/pallets/template/src/mock.rs @@ -1,25 +1,36 @@ -use frame_support::{derive_impl, parameter_types}; -use frame_system as system; -use sp_runtime::BuildStorage; - -type Block = frame_system::mocking::MockBlock; +use frame_support::{derive_impl, weights::constants::RocksDbWeight}; +use frame_system::{mocking::MockBlock, GenesisConfig}; +use sp_runtime::{traits::ConstU64, BuildStorage}; // Configure a mock runtime to test the pallet. -frame_support::construct_runtime!( - pub enum Test - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - TemplateModule: crate::{Pallet, Call, Storage, Event}, - } -); +#[frame_support::runtime] +mod test_runtime { + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason, + RuntimeLockId, + RuntimeTask + )] + pub struct Test; -parameter_types! { - pub const SS58Prefix: u8 = 42; + #[runtime::pallet_index(0)] + pub type System = frame_system; + #[runtime::pallet_index(1)] + pub type TemplateModule = crate; } #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] -impl system::Config for Test { - type Block = Block; +impl frame_system::Config for Test { + type Nonce = u64; + type Block = MockBlock; + type BlockHashCount = ConstU64<250>; + type DbWeight = RocksDbWeight; } impl crate::Config for Test { @@ -29,5 +40,5 @@ impl crate::Config for Test { // Build genesis storage according to the mock runtime. pub fn new_test_ext() -> sp_io::TestExternalities { - system::GenesisConfig::::default().build_storage().unwrap().into() + GenesisConfig::::default().build_storage().unwrap().into() } diff --git a/templates/parachain/pallets/template/src/weights.rs b/templates/parachain/pallets/template/src/weights.rs index 7c42936e09f..5bfe28e8b71 100644 --- a/templates/parachain/pallets/template/src/weights.rs +++ b/templates/parachain/pallets/template/src/weights.rs @@ -4,7 +4,7 @@ //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev //! DATE: 2023-04-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `Alexs-MacBook-Pro-2.local`, CPU: `` +//! HOSTNAME: `_`, CPU: `` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: diff --git a/templates/parachain/runtime/Cargo.toml b/templates/parachain/runtime/Cargo.toml index 059c7936796..48d9f691289 100644 --- a/templates/parachain/runtime/Cargo.toml +++ b/templates/parachain/runtime/Cargo.toml @@ -35,7 +35,7 @@ pallet-parachain-template = { path = "../pallets/template", default-features = f frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } frame-executive = { path = "../../../substrate/frame/executive", default-features = false } frame-metadata-hash-extension = { path = "../../../substrate/frame/metadata-hash-extension", default-features = false } -frame-support = { path = "../../../substrate/frame/support", default-features = false } +frame-support = { path = "../../../substrate/frame/support", default-features = false, features = ["experimental"] } frame-system = { path = "../../../substrate/frame/system", default-features = false } frame-system-benchmarking = { path = "../../../substrate/frame/system/benchmarking", default-features = false, optional = true } frame-system-rpc-runtime-api = { path = "../../../substrate/frame/system/rpc/runtime-api", default-features = false } diff --git a/templates/parachain/runtime/src/lib.rs b/templates/parachain/runtime/src/lib.rs index 987b88af844..6e6491a19ad 100644 --- a/templates/parachain/runtime/src/lib.rs +++ b/templates/parachain/runtime/src/lib.rs @@ -7,6 +7,8 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); pub mod apis; +#[cfg(feature = "runtime-benchmarks")] +mod benchmarks; mod configs; mod weights; @@ -22,12 +24,9 @@ use sp_std::prelude::*; use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use frame_support::{ - construct_runtime, - weights::{ - constants::WEIGHT_REF_TIME_PER_SECOND, Weight, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, +use frame_support::weights::{ + constants::WEIGHT_REF_TIME_PER_SECOND, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, + WeightToFeePolynomial, }; pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; pub use sp_runtime::{MultiAddress, Perbill, Permill}; @@ -232,43 +231,69 @@ pub fn native_version() -> NativeVersion { } // Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime { - // System support stuff. - System: frame_system = 0, - ParachainSystem: cumulus_pallet_parachain_system = 1, - Timestamp: pallet_timestamp = 2, - ParachainInfo: parachain_info = 3, - - // Monetary stuff. - Balances: pallet_balances = 10, - TransactionPayment: pallet_transaction_payment = 11, - - // Governance - Sudo: pallet_sudo = 15, - - // Collator support. The order of these 4 are important and shall not change. - Authorship: pallet_authorship = 20, - CollatorSelection: pallet_collator_selection = 21, - Session: pallet_session = 22, - Aura: pallet_aura = 23, - AuraExt: cumulus_pallet_aura_ext = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue = 30, - PolkadotXcm: pallet_xcm = 31, - CumulusXcm: cumulus_pallet_xcm = 32, - MessageQueue: pallet_message_queue = 33, - - // Template - TemplatePallet: pallet_parachain_template = 50, - } -); +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason, + RuntimeLockId, + RuntimeTask + )] + pub struct Runtime; + + #[runtime::pallet_index(0)] + pub type System = frame_system; + #[runtime::pallet_index(1)] + pub type ParachainSystem = cumulus_pallet_parachain_system; + #[runtime::pallet_index(2)] + pub type Timestamp = pallet_timestamp; + #[runtime::pallet_index(3)] + pub type ParachainInfo = parachain_info; + + // Monetary stuff. + #[runtime::pallet_index(10)] + pub type Balances = pallet_balances; + #[runtime::pallet_index(11)] + pub type TransactionPayment = pallet_transaction_payment; + + // Governance + #[runtime::pallet_index(15)] + pub type Sudo = pallet_sudo; + + // Collator support. The order of these 4 are important and shall not change. + #[runtime::pallet_index(20)] + pub type Authorship = pallet_authorship; + #[runtime::pallet_index(21)] + pub type CollatorSelection = pallet_collator_selection; + #[runtime::pallet_index(22)] + pub type Session = pallet_session; + #[runtime::pallet_index(23)] + pub type Aura = pallet_aura; + #[runtime::pallet_index(24)] + pub type AuraExt = cumulus_pallet_aura_ext; + + // XCM helpers. + #[runtime::pallet_index(30)] + pub type XcmpQueue = cumulus_pallet_xcmp_queue; + #[runtime::pallet_index(31)] + pub type PolkadotXcm = pallet_xcm; + #[runtime::pallet_index(32)] + pub type CumulusXcm = cumulus_pallet_xcm; + #[runtime::pallet_index(33)] + pub type MessageQueue = pallet_message_queue; + + // Template + #[runtime::pallet_index(50)] + pub type TemplatePallet = pallet_parachain_template; +} cumulus_pallet_parachain_system::register_validate_block! { Runtime = Runtime, BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, } - -#[cfg(feature = "runtime-benchmarks")] -mod benchmarks; -- GitLab From 1dc68de8eec934b3c7f35a330f869d1172943da4 Mon Sep 17 00:00:00 2001 From: Andrei Sandu <54316454+sandreim@users.noreply.github.com> Date: Tue, 18 Jun 2024 11:57:57 +0300 Subject: [PATCH 018/130] glutton: also increase parachain block length (#4728) Glutton currently is useful mostly for stress testing relay chain validators. It is unusable for testing the collator networking and block announcement and import scenarios. This PR resolves that by improving glutton pallet to also buff up the blocks, up to the runtime configured `BlockLength`. ### How it works Includes an additional inherent in each parachain block. The `garbage` argument passed to the inherent is filled with trash data. It's size is computed by applying the newly introduced `block_length` percentage to the maximum block length for mandatory dispatch class. After https://github.com/paritytech/polkadot-sdk/pull/4765 is merged, the length of inherent extrinsic will be added to the total block proof size. The remaining weight is burnt in `on_idle` as configured by the `storage` percentage parameter. TODO: - [x] PRDoc - [x] Readme update - [x] Add tests --------- Signed-off-by: Andrei Sandu --- Cargo.lock | 1 + .../glutton/glutton-westend/src/lib.rs | 1 + prdoc/pr_4728.prdoc | 17 +++++ substrate/bin/node/bench/src/import.rs | 9 ++- .../cli/tests/res/default_genesis_config.json | 1 + substrate/frame/glutton/Cargo.toml | 2 + substrate/frame/glutton/README.md | 7 +- substrate/frame/glutton/src/lib.rs | 76 +++++++++++++++++++ substrate/frame/glutton/src/mock.rs | 8 +- substrate/frame/glutton/src/tests.rs | 45 ++++++++++- 10 files changed, 154 insertions(+), 13 deletions(-) create mode 100644 prdoc/pr_4728.prdoc diff --git a/Cargo.lock b/Cargo.lock index 4f4e0a988ce..113cfa06a84 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10477,6 +10477,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-core", + "sp-inherents", "sp-io", "sp-runtime", "sp-std 14.0.0", diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs index 910f7569bf9..b8a328c3db6 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs @@ -296,6 +296,7 @@ pub type SignedExtra = ( frame_system::CheckGenesis, frame_system::CheckEra, frame_system::CheckNonce, + frame_system::CheckWeight, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = diff --git a/prdoc/pr_4728.prdoc b/prdoc/pr_4728.prdoc new file mode 100644 index 00000000000..1494fbdbb2b --- /dev/null +++ b/prdoc/pr_4728.prdoc @@ -0,0 +1,17 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Glutton - add support for bloating the parachain block length" + +doc: + - audience: [Runtime Dev, Runtime User] + description: | + Introduce a new configuration parameter `block_length` which can be configured via a call to + `set_block_length`. This sets the ration of the block length that is to be filled with trash. + This is implemented by an inherent that takes trash data as a parameter filling the block length. + +crates: + - name: pallet-glutton + bump: major + - name: glutton-westend-runtime + bump: major diff --git a/substrate/bin/node/bench/src/import.rs b/substrate/bin/node/bench/src/import.rs index 78b280076e0..e340869dea0 100644 --- a/substrate/bin/node/bench/src/import.rs +++ b/substrate/bin/node/bench/src/import.rs @@ -122,7 +122,8 @@ impl core::Benchmark for ImportBenchmark { match self.block_type { BlockType::RandomTransfersKeepAlive => { // should be 8 per signed extrinsic + 1 per unsigned - // we have 1 unsigned and the rest are signed in the block + // we have 2 unsigned (timestamp and glutton bloat) while the rest are + // signed in the block. // those 8 events per signed are: // - transaction paid for the transaction payment // - withdraw (Balances::Withdraw) for charging the transaction fee @@ -135,18 +136,18 @@ impl core::Benchmark for ImportBenchmark { // - extrinsic success assert_eq!( kitchensink_runtime::System::events().len(), - (self.block.extrinsics.len() - 1) * 8 + 1, + (self.block.extrinsics.len() - 2) * 8 + 2, ); }, BlockType::Noop => { assert_eq!( kitchensink_runtime::System::events().len(), // should be 2 per signed extrinsic + 1 per unsigned - // we have 1 unsigned and the rest are signed in the block + // we have 2 unsigned and the rest are signed in the block // those 2 events per signed are: // - deposit event for charging transaction fee // - extrinsic success - (self.block.extrinsics.len() - 1) * 2 + 1, + (self.block.extrinsics.len() - 2) * 2 + 2, ); }, _ => {}, diff --git a/substrate/bin/node/cli/tests/res/default_genesis_config.json b/substrate/bin/node/cli/tests/res/default_genesis_config.json index e21fbb47da8..d8713764ab2 100644 --- a/substrate/bin/node/cli/tests/res/default_genesis_config.json +++ b/substrate/bin/node/cli/tests/res/default_genesis_config.json @@ -74,6 +74,7 @@ "glutton": { "compute": "0", "storage": "0", + "blockLength": "0", "trashDataCount": 0 }, "assets": { diff --git a/substrate/frame/glutton/Cargo.toml b/substrate/frame/glutton/Cargo.toml index 730c4e70935..39d2b49b50e 100644 --- a/substrate/frame/glutton/Cargo.toml +++ b/substrate/frame/glutton/Cargo.toml @@ -27,6 +27,7 @@ sp-core = { path = "../../primitives/core", default-features = false } sp-io = { path = "../../primitives/io", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } +sp-inherents = { path = "../../primitives/inherents", default-features = false } [dev-dependencies] pallet-balances = { path = "../balances" } @@ -43,6 +44,7 @@ std = [ "pallet-balances/std", "scale-info/std", "sp-core/std", + "sp-inherents/std", "sp-io/std", "sp-runtime/std", "sp-std/std", diff --git a/substrate/frame/glutton/README.md b/substrate/frame/glutton/README.md index 89dbe26ec7a..43642df1910 100644 --- a/substrate/frame/glutton/README.md +++ b/substrate/frame/glutton/README.md @@ -7,6 +7,7 @@ The `Glutton` pallet gets the name from its property to consume vast amounts of resources. It can be used to push para-chains and their relay-chains to the limits. This is good for testing out theoretical limits in a practical way. -The `Glutton` can be set to consume a fraction of the available unused weight of a chain. It accomplishes this by -utilizing the `on_idle` hook and consuming a specific ration of the remaining weight. The rations can be set via -`set_compute` and `set_storage`. Initially the `Glutton` needs to be initialized once with `initialize_pallet`. +The `Glutton` can be set to consume a fraction of the available block length and unused weight of a chain. It +accomplishes this by filling the block length up to a ration and utilizing the `on_idle` hook to consume a +specific ration of the remaining weight. The rations can be set via `set_compute`, `set_storage` and `set_block_length`. +Initially the `Glutton` needs to be initialized once with `initialize_pallet`. diff --git a/substrate/frame/glutton/src/lib.rs b/substrate/frame/glutton/src/lib.rs index 344a70becae..5427173b486 100644 --- a/substrate/frame/glutton/src/lib.rs +++ b/substrate/frame/glutton/src/lib.rs @@ -89,6 +89,11 @@ pub mod pallet { /// The storage limit. storage: FixedU64, }, + /// The block length limit has been updated. + BlockLengthLimitSet { + /// The block length limit. + block_length: FixedU64, + }, } #[pallet::error] @@ -116,6 +121,13 @@ pub mod pallet { #[pallet::storage] pub(crate) type Storage = StorageValue<_, FixedU64, ValueQuery>; + /// The proportion of the `block length` to consume on each block. + /// + /// `1.0` is mapped to `100%`. Must be at most [`crate::RESOURCE_HARD_LIMIT`]. Setting this to + /// over `1.0` could stall the chain. + #[pallet::storage] + pub(crate) type Length = StorageValue<_, FixedU64, ValueQuery>; + /// Storage map used for wasting proof size. /// /// It contains no meaningful data - hence the name "Trash". The maximal number of entries is @@ -146,6 +158,8 @@ pub mod pallet { pub storage: FixedU64, /// The amount of trash data for wasting proof size. pub trash_data_count: u32, + /// The block length limit. + pub block_length: FixedU64, #[serde(skip)] /// The required configuration field. pub _config: sp_std::marker::PhantomData, @@ -170,6 +184,9 @@ pub mod pallet { assert!(self.storage <= RESOURCE_HARD_LIMIT, "Storage limit is insane"); >::put(self.storage); + + assert!(self.block_length <= RESOURCE_HARD_LIMIT, "Block length limit is insane"); + >::put(self.block_length); } } @@ -208,6 +225,40 @@ pub mod pallet { } } + #[pallet::inherent] + impl ProvideInherent for Pallet { + type Call = Call; + type Error = sp_inherents::MakeFatalError<()>; + + const INHERENT_IDENTIFIER: InherentIdentifier = *b"bloated0"; + + fn create_inherent(_data: &InherentData) -> Option { + let max_block_length = *T::BlockLength::get().max.get(DispatchClass::Mandatory); + let bloat_size = Length::::get().saturating_mul_int(max_block_length) as usize; + let amount_trash = bloat_size / VALUE_SIZE; + let garbage = TrashData::::iter() + .map(|(_k, v)| v) + .collect::>() + .into_iter() + .cycle() + .take(amount_trash) + .collect::>(); + + Some(Call::bloat { garbage }) + } + + fn is_inherent(call: &Self::Call) -> bool { + matches!(call, Call::bloat { .. }) + } + + fn check_inherent(call: &Self::Call, _: &InherentData) -> Result<(), Self::Error> { + match call { + Call::bloat { .. } => Ok(()), + _ => unreachable!("other calls are not inherents"), + } + } + } + #[pallet::call(weight = T::WeightInfo)] impl Pallet { /// Initialize the pallet. Should be called once, if no genesis state was provided. @@ -277,6 +328,31 @@ pub mod pallet { Self::deposit_event(Event::StorageLimitSet { storage }); Ok(()) } + + /// Increase the block size by including the specified garbage bytes. + #[pallet::call_index(3)] + #[pallet::weight((0, DispatchClass::Mandatory))] + pub fn bloat(_origin: OriginFor, _garbage: Vec<[u8; VALUE_SIZE]>) -> DispatchResult { + Ok(()) + } + + /// Set how much of the block length should be filled with trash data on each block. + /// + /// `1.0` means that all block should be filled. If set to `1.0`, storage proof size will + /// be close to zero. + /// + /// Only callable by Root or `AdminOrigin`. + #[pallet::call_index(4)] + #[pallet::weight({1})] + pub fn set_block_length(origin: OriginFor, block_length: FixedU64) -> DispatchResult { + T::AdminOrigin::ensure_origin_or_root(origin)?; + + ensure!(block_length <= RESOURCE_HARD_LIMIT, Error::::InsaneLimit); + Length::::set(block_length); + + Self::deposit_event(Event::BlockLengthLimitSet { block_length }); + Ok(()) + } } impl Pallet { diff --git a/substrate/frame/glutton/src/mock.rs b/substrate/frame/glutton/src/mock.rs index 132ef5cfbcb..7163d7c4678 100644 --- a/substrate/frame/glutton/src/mock.rs +++ b/substrate/frame/glutton/src/mock.rs @@ -50,10 +50,14 @@ pub fn new_test_ext() -> sp_io::TestExternalities { ext } -/// Set the `compute` and `storage` limits. +/// Set the `compute`, `storage` and `block_length` limits. /// /// `1.0` corresponds to `100%`. -pub fn set_limits(compute: f64, storage: f64) { +pub fn set_limits(compute: f64, storage: f64, block_length: f64) { assert_ok!(Glutton::set_compute(RuntimeOrigin::root(), FixedU64::from_float(compute))); assert_ok!(Glutton::set_storage(RuntimeOrigin::root(), FixedU64::from_float(storage))); + assert_ok!(Glutton::set_block_length( + RuntimeOrigin::root(), + FixedU64::from_float(block_length) + )); } diff --git a/substrate/frame/glutton/src/tests.rs b/substrate/frame/glutton/src/tests.rs index b72d5272772..81d228f39a9 100644 --- a/substrate/frame/glutton/src/tests.rs +++ b/substrate/frame/glutton/src/tests.rs @@ -123,6 +123,43 @@ fn setting_compute_respects_limit() { }); } +#[test] +fn setting_block_length_works() { + new_test_ext().execute_with(|| { + assert_eq!(Compute::::get(), Zero::zero()); + + assert_ok!(Glutton::set_block_length(RuntimeOrigin::root(), FixedU64::from_float(0.3))); + assert_eq!(Length::::get(), FixedU64::from_float(0.3)); + System::assert_last_event( + Event::BlockLengthLimitSet { block_length: FixedU64::from_float(0.3) }.into(), + ); + + assert_noop!( + Glutton::set_block_length(RuntimeOrigin::signed(1), FixedU64::from_float(0.5)), + DispatchError::BadOrigin + ); + assert_noop!( + Glutton::set_block_length(RuntimeOrigin::none(), FixedU64::from_float(0.5)), + DispatchError::BadOrigin + ); + }); +} + +#[test] +fn setting_block_length_respects_limit() { + new_test_ext().execute_with(|| { + // < 1000% is fine + assert_ok!(Glutton::set_block_length(RuntimeOrigin::root(), FixedU64::from_float(9.99)),); + // == 1000% is fine + assert_ok!(Glutton::set_block_length(RuntimeOrigin::root(), FixedU64::from_u32(10)),); + // > 1000% is not + assert_noop!( + Glutton::set_block_length(RuntimeOrigin::root(), FixedU64::from_float(10.01)), + Error::::InsaneLimit + ); + }); +} + #[test] fn setting_storage_works() { new_test_ext().execute_with(|| { @@ -163,7 +200,7 @@ fn setting_storage_respects_limit() { #[test] fn on_idle_works() { new_test_ext().execute_with(|| { - set_limits(One::one(), One::one()); + set_limits(One::one(), One::one(), One::one()); Glutton::on_idle(1, Weight::from_parts(20_000_000, 0)); }); @@ -173,7 +210,7 @@ fn on_idle_works() { #[test] fn on_idle_weight_high_proof_is_close_enough_works() { new_test_ext().execute_with(|| { - set_limits(One::one(), One::one()); + set_limits(One::one(), One::one(), One::one()); let should = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND, WEIGHT_PROOF_SIZE_PER_MB * 5); let got = Glutton::on_idle(1, should); @@ -196,7 +233,7 @@ fn on_idle_weight_high_proof_is_close_enough_works() { #[test] fn on_idle_weight_low_proof_is_close_enough_works() { new_test_ext().execute_with(|| { - set_limits(One::one(), One::one()); + set_limits(One::one(), One::one(), One::one()); let should = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND, WEIGHT_PROOF_SIZE_PER_KB * 20); let got = Glutton::on_idle(1, should); @@ -224,7 +261,7 @@ fn on_idle_weight_over_unity_is_close_enough_works() { let max_block = Weight::from_parts(500 * WEIGHT_REF_TIME_PER_MILLIS, 5 * WEIGHT_PROOF_SIZE_PER_MB); // But now we tell it to consume more than that. - set_limits(1.75, 1.5); + set_limits(1.75, 1.5, 0.0); let want = Weight::from_parts( (1.75 * max_block.ref_time() as f64) as u64, (1.5 * max_block.proof_size() as f64) as u64, -- GitLab From 40677b64c5f15f0bdeb30e9d0a2037c0eec2447d Mon Sep 17 00:00:00 2001 From: Tin Chung <56880684+chungquantin@users.noreply.github.com> Date: Tue, 18 Jun 2024 19:16:08 +0800 Subject: [PATCH 019/130] Remove deprecated treasury pallet calls (#3820) # ISSUE - Link to the issue: https://github.com/paritytech/polkadot-sdk/issues/3800 # Deliverables - [x] remove deprecated calls; (https://github.com/paritytech/polkadot-sdk/pull/3820/commits/d579b673672454d0dc7b5049e5cbbe6077da520b) - [x] set explicit coded indexes for Error and Event enums, remove unused variants and keep the same indexes for the rest; (https://github.com/paritytech/polkadot-sdk/pull/3820/commits/d579b673672454d0dc7b5049e5cbbe6077da520b) - [x] remove unused Config's type parameters; (https://github.com/paritytech/polkadot-sdk/pull/3820/commits/d579b673672454d0dc7b5049e5cbbe6077da520b) - [x] remove irrelevant tests and adopt relevant using old api; (https://github.com/paritytech/polkadot-sdk/pull/3820/commits/d579b673672454d0dc7b5049e5cbbe6077da520b) - [x] remove benchmarks for removed calls; (https://github.com/paritytech/polkadot-sdk/pull/3820/commits/1a3d5f1f96756555ddebd1b898c03464ffffdb25) - [x] prdoc (https://github.com/paritytech/polkadot-sdk/pull/3820/commits/d579b673672454d0dc7b5049e5cbbe6077da520b) - [x] remove deprecated methods from the `treasury/README.md` and add up-to-date dispatchable functions documentation (https://github.com/paritytech/polkadot-sdk/pull/3820/commits/d579b673672454d0dc7b5049e5cbbe6077da520b) - [x] remove deprecated weight functions (https://github.com/paritytech/polkadot-sdk/pull/3820/commits/8f74134b82df9a6df2824bbbe1555667223f1a83) > ### Separated to other issues > - [ ] remove storage items like Proposals and ProposalCount, that are not used anymore Adjust all treasury pallet instances within polkadot-sdk - [x] `pallet_bounty`, `tip`, `child_bounties`: https://github.com/openguild-labs/polkadot-sdk/pull/3 - [x] Remove deprecated treasury weight functions used in Westend and Rococo runtime `collective-westend`, `collective-rococo` Add migration for westend and rococo to clean the data from removed storage items - [ ] https://github.com/paritytech/polkadot-sdk/pull/3828 # Test Outcomes Successful tests by running `cargo test --features runtime-benchmarks` ``` running 38 tests test tests::__construct_runtime_integrity_test::runtime_integrity_tests ... ok test benchmarking::benchmarks::bench_check_status ... ok test benchmarking::benchmarks::bench_payout ... ok test benchmarking::benchmarks::bench_spend_local ... ok test tests::accepted_spend_proposal_enacted_on_spend_period ... ok test benchmarking::benchmarks::bench_spend ... ok test tests::accepted_spend_proposal_ignored_outside_spend_period ... ok test benchmarking::benchmarks::bench_void_spend ... ok test benchmarking::benchmarks::bench_remove_approval ... ok test tests::genesis_funding_works ... ok test tests::genesis_config_works ... ok test tests::inexistent_account_works ... ok test tests::minting_works ... ok test tests::check_status_works ... ok test tests::payout_retry_works ... ok test tests::pot_underflow_should_not_diminish ... ok test tests::remove_already_removed_approval_fails ... ok test tests::spend_local_origin_permissioning_works ... ok test tests::spend_valid_from_works ... ok test tests::spend_expires ... ok test tests::spend_works ... ok test tests::test_genesis_config_builds ... ok test tests::spend_payout_works ... ok test tests::spend_local_origin_works ... ok test tests::spend_origin_works ... ok test tests::spending_local_in_batch_respects_max_total ... ok test tests::spending_in_batch_respects_max_total ... ok test tests::try_state_proposals_invariant_2_works ... ok test tests::try_state_proposals_invariant_1_works ... ok test tests::try_state_spends_invariant_2_works ... ok test tests::try_state_spends_invariant_1_works ... ok test tests::treasury_account_doesnt_get_deleted ... ok test tests::try_state_spends_invariant_3_works ... ok test tests::unused_pot_should_diminish ... ok test tests::void_spend_works ... ok test tests::try_state_proposals_invariant_3_works ... ok test tests::max_approvals_limited ... ok test benchmarking::benchmarks::bench_on_initialize_proposals ... ok test result: ok. 38 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s Doc-tests pallet_treasury running 2 tests test substrate/frame/treasury/src/lib.rs - (line 52) ... ignored test substrate/frame/treasury/src/lib.rs - (line 79) ... ignored test result: ok. 0 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` polkadot address: 19nSqFQorfF2HxD3oBzWM3oCh4SaCRKWt1yvmgaPYGCo71J --- .../collectives-westend/src/fellowship/mod.rs | 26 -- .../src/weights/pallet_treasury.rs | 37 --- polkadot/runtime/common/src/impls.rs | 3 - polkadot/runtime/rococo/src/lib.rs | 6 - .../rococo/src/weights/pallet_treasury.rs | 45 --- polkadot/runtime/westend/src/lib.rs | 6 - .../westend/src/weights/pallet_treasury.rs | 45 --- prdoc/pr_3820.prdoc | 32 +++ substrate/bin/node/runtime/src/lib.rs | 5 - substrate/frame/bounties/src/tests.rs | 199 +------------- substrate/frame/child-bounties/src/tests.rs | 4 - substrate/frame/tips/src/tests.rs | 7 - substrate/frame/treasury/README.md | 14 +- substrate/frame/treasury/src/benchmarking.rs | 78 +----- substrate/frame/treasury/src/lib.rs | 147 +--------- substrate/frame/treasury/src/tests.rs | 256 ++---------------- substrate/frame/treasury/src/weights.rs | 95 +------ 17 files changed, 87 insertions(+), 918 deletions(-) create mode 100644 prdoc/pr_3820.prdoc diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs index 6a4a1820796..6f13c3d9d5d 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs @@ -55,8 +55,6 @@ use xcm_builder::{AliasesIntoAccountId32, PayOverXcm}; #[cfg(feature = "runtime-benchmarks")] use crate::impls::benchmarks::{OpenHrmpChannel, PayWithEnsure}; -#[cfg(feature = "runtime-benchmarks")] -use testnet_parachains_constants::westend::currency::DOLLARS; /// The Fellowship members' ranks. pub mod ranks { @@ -270,16 +268,6 @@ parameter_types! { pub SelfParaId: ParaId = ParachainInfo::parachain_id(); } -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - // Benchmark bond. Needed to make `propose_spend` work. - pub const TenPercent: Permill = Permill::from_percent(10); - // Benchmark minimum. Needed to make `propose_spend` work. - pub const BenchmarkProposalBondMinimum: Balance = 1 * DOLLARS; - // Benchmark maximum. Needed to make `propose_spend` work. - pub const BenchmarkProposalBondMaximum: Balance = 10 * DOLLARS; -} - /// [`PayOverXcm`] setup to pay the Fellowship Treasury. pub type FellowshipTreasuryPaymaster = PayOverXcm< FellowshipTreasuryInteriorLocation, @@ -302,20 +290,6 @@ impl pallet_treasury::Config for Runtime { // TODO: replace with `NeverEnsure` once polkadot-sdk 1.5 is released. type ApproveOrigin = NeverEnsureOrigin<()>; type OnSlash = (); - #[cfg(not(feature = "runtime-benchmarks"))] - type ProposalBond = HundredPercent; - #[cfg(not(feature = "runtime-benchmarks"))] - type ProposalBondMinimum = MaxBalance; - #[cfg(not(feature = "runtime-benchmarks"))] - type ProposalBondMaximum = MaxBalance; - - #[cfg(feature = "runtime-benchmarks")] - type ProposalBond = TenPercent; - #[cfg(feature = "runtime-benchmarks")] - type ProposalBondMinimum = BenchmarkProposalBondMinimum; - #[cfg(feature = "runtime-benchmarks")] - type ProposalBondMaximum = BenchmarkProposalBondMaximum; - // end. type WeightInfo = weights::pallet_treasury::WeightInfo; type PalletId = FellowshipTreasuryPalletId; diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_treasury.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_treasury.rs index 58540e646d8..5c513c3754c 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_treasury.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_treasury.rs @@ -62,43 +62,6 @@ impl pallet_treasury::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `FellowshipTreasury::ProposalCount` (r:1 w:1) - /// Proof: `FellowshipTreasury::ProposalCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `FellowshipTreasury::Proposals` (r:0 w:1) - /// Proof: `FellowshipTreasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - fn propose_spend() -> Weight { - // Proof Size summary in bytes: - // Measured: `143` - // Estimated: `1489` - // Minimum execution time: 264_000_000 picoseconds. - Weight::from_parts(277_000_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipTreasury::Proposals` (r:1 w:1) - /// Proof: `FellowshipTreasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn reject_proposal() -> Weight { - // Proof Size summary in bytes: - // Measured: `301` - // Estimated: `3593` - // Minimum execution time: 289_000_000 picoseconds. - Weight::from_parts(312_000_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// The range of component `p` is `[0, 99]`. - fn approve_proposal(_p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 0_000 picoseconds. - Weight::from_parts(0, 0) - .saturating_add(Weight::from_parts(0, 0)) - } /// Storage: `FellowshipTreasury::Approvals` (r:1 w:1) /// Proof: `FellowshipTreasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) fn remove_approval() -> Weight { diff --git a/polkadot/runtime/common/src/impls.rs b/polkadot/runtime/common/src/impls.rs index c913b90b153..72ece79f194 100644 --- a/polkadot/runtime/common/src/impls.rs +++ b/polkadot/runtime/common/src/impls.rs @@ -332,9 +332,6 @@ mod tests { type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; type OnSlash = (); - type ProposalBond = (); - type ProposalBondMinimum = (); - type ProposalBondMaximum = (); type SpendPeriod = (); type Burn = (); type BurnDestination = (); diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index ebdcdd0cbed..abbdca013ae 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -476,9 +476,6 @@ parameter_types! { } parameter_types! { - pub const ProposalBond: Permill = Permill::from_percent(5); - pub const ProposalBondMinimum: Balance = 2000 * CENTS; - pub const ProposalBondMaximum: Balance = 1 * GRAND; pub const SpendPeriod: BlockNumber = 6 * DAYS; pub const Burn: Permill = Permill::from_perthousand(2); pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); @@ -505,9 +502,6 @@ impl pallet_treasury::Config for Runtime { type RejectOrigin = EitherOfDiverse, Treasurer>; type RuntimeEvent = RuntimeEvent; type OnSlash = Treasury; - type ProposalBond = ProposalBond; - type ProposalBondMinimum = ProposalBondMinimum; - type ProposalBondMaximum = ProposalBondMaximum; type SpendPeriod = SpendPeriod; type Burn = Burn; type BurnDestination = Society; diff --git a/polkadot/runtime/rococo/src/weights/pallet_treasury.rs b/polkadot/runtime/rococo/src/weights/pallet_treasury.rs index 144e9d5b872..06246ada72f 100644 --- a/polkadot/runtime/rococo/src/weights/pallet_treasury.rs +++ b/polkadot/runtime/rococo/src/weights/pallet_treasury.rs @@ -63,51 +63,6 @@ impl pallet_treasury::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: Treasury ProposalCount (r:1 w:1) - /// Proof: Treasury ProposalCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Treasury Proposals (r:0 w:1) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - fn propose_spend() -> Weight { - // Proof Size summary in bytes: - // Measured: `143` - // Estimated: `1489` - // Minimum execution time: 354_000_000 picoseconds. - Weight::from_parts(376_000_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: Treasury Proposals (r:1 w:1) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn reject_proposal() -> Weight { - // Proof Size summary in bytes: - // Measured: `301` - // Estimated: `3593` - // Minimum execution time: 547_000_000 picoseconds. - Weight::from_parts(550_000_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: Treasury Proposals (r:1 w:0) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - /// Storage: Treasury Approvals (r:1 w:1) - /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) - /// The range of component `p` is `[0, 99]`. - fn approve_proposal(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `470 + p * (8 ±0)` - // Estimated: `3573` - // Minimum execution time: 104_000_000 picoseconds. - Weight::from_parts(121_184_402, 0) - .saturating_add(Weight::from_parts(0, 3573)) - // Standard Error: 42_854 - .saturating_add(Weight::from_parts(153_112, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } /// Storage: Treasury Approvals (r:1 w:1) /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) fn remove_approval() -> Weight { diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index c8b1826b476..789e023730b 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -661,9 +661,6 @@ impl pallet_fast_unstake::Config for Runtime { } parameter_types! { - pub const ProposalBond: Permill = Permill::from_percent(5); - pub const ProposalBondMinimum: Balance = 2000 * CENTS; - pub const ProposalBondMaximum: Balance = 1 * GRAND; pub const SpendPeriod: BlockNumber = 6 * DAYS; pub const Burn: Permill = Permill::from_perthousand(2); pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); @@ -690,9 +687,6 @@ impl pallet_treasury::Config for Runtime { type RejectOrigin = EitherOfDiverse, Treasurer>; type RuntimeEvent = RuntimeEvent; type OnSlash = Treasury; - type ProposalBond = ProposalBond; - type ProposalBondMinimum = ProposalBondMinimum; - type ProposalBondMaximum = ProposalBondMaximum; type SpendPeriod = SpendPeriod; type Burn = Burn; type BurnDestination = (); diff --git a/polkadot/runtime/westend/src/weights/pallet_treasury.rs b/polkadot/runtime/westend/src/weights/pallet_treasury.rs index 144e9d5b872..06246ada72f 100644 --- a/polkadot/runtime/westend/src/weights/pallet_treasury.rs +++ b/polkadot/runtime/westend/src/weights/pallet_treasury.rs @@ -63,51 +63,6 @@ impl pallet_treasury::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: Treasury ProposalCount (r:1 w:1) - /// Proof: Treasury ProposalCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Treasury Proposals (r:0 w:1) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - fn propose_spend() -> Weight { - // Proof Size summary in bytes: - // Measured: `143` - // Estimated: `1489` - // Minimum execution time: 354_000_000 picoseconds. - Weight::from_parts(376_000_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: Treasury Proposals (r:1 w:1) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn reject_proposal() -> Weight { - // Proof Size summary in bytes: - // Measured: `301` - // Estimated: `3593` - // Minimum execution time: 547_000_000 picoseconds. - Weight::from_parts(550_000_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: Treasury Proposals (r:1 w:0) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - /// Storage: Treasury Approvals (r:1 w:1) - /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) - /// The range of component `p` is `[0, 99]`. - fn approve_proposal(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `470 + p * (8 ±0)` - // Estimated: `3573` - // Minimum execution time: 104_000_000 picoseconds. - Weight::from_parts(121_184_402, 0) - .saturating_add(Weight::from_parts(0, 3573)) - // Standard Error: 42_854 - .saturating_add(Weight::from_parts(153_112, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } /// Storage: Treasury Approvals (r:1 w:1) /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) fn remove_approval() -> Weight { diff --git a/prdoc/pr_3820.prdoc b/prdoc/pr_3820.prdoc new file mode 100644 index 00000000000..33e8129df92 --- /dev/null +++ b/prdoc/pr_3820.prdoc @@ -0,0 +1,32 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Remove deprecated calls from treasury pallet + +doc: + - audience: Runtime User + description: | + This PR remove deprecated calls, relevant tests from `pallet-treasury`. + - Remove deprecated calls `propose_spend`, `reject_proposal`, `approve_proposal`. + - Replace the code flow of `propose_spend` then `approve_proposal` with `spend_local` + - Remove deprecated calls' related weight functions and test cases. + - Remove deprecated parameter types: ProposalBond, ProposalBondMaximum, ProposalBondMinimum + - Remove pallet treasury's relevant deprecated code in pallet-tips, pallet-bounties and pallet-child-bounties + +crates: + - name: pallet-treasury + bump: major + - name: pallet-tips + bump: patch + - name: pallet-child-bounties + bump: patch + - name: pallet-bounties + bump: patch + - name: polkadot-runtime-common + bump: patch + - name: rococo-runtime + bump: patch + - name: westend-runtime + bump: patch + - name: collectives-westend-runtime + bump: patch diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 2bddb3a1ade..d5db82cb1fb 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1212,8 +1212,6 @@ impl pallet_membership::Config for Runtime { } parameter_types! { - pub const ProposalBond: Permill = Permill::from_percent(5); - pub const ProposalBondMinimum: Balance = 1 * DOLLARS; pub const SpendPeriod: BlockNumber = 1 * DAYS; pub const Burn: Permill = Permill::from_percent(50); pub const TipCountdown: BlockNumber = 1 * DAYS; @@ -1240,9 +1238,6 @@ impl pallet_treasury::Config for Runtime { >; type RuntimeEvent = RuntimeEvent; type OnSlash = (); - type ProposalBond = ProposalBond; - type ProposalBondMinimum = ProposalBondMinimum; - type ProposalBondMaximum = (); type SpendPeriod = SpendPeriod; type Burn = Burn; type BurnDestination = (); diff --git a/substrate/frame/bounties/src/tests.rs b/substrate/frame/bounties/src/tests.rs index 212f0bd2959..205765e9286 100644 --- a/substrate/frame/bounties/src/tests.rs +++ b/substrate/frame/bounties/src/tests.rs @@ -71,7 +71,6 @@ impl pallet_balances::Config for Test { type AccountStore = System; } parameter_types! { - pub const ProposalBond: Permill = Permill::from_percent(5); pub static Burn: Permill = Permill::from_percent(50); pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const TreasuryPalletId2: PalletId = PalletId(*b"py/trsr2"); @@ -88,9 +87,6 @@ impl pallet_treasury::Config for Test { type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; type OnSlash = (); - type ProposalBond = ProposalBond; - type ProposalBondMinimum = ConstU64<1>; - type ProposalBondMaximum = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); // Just gets burned. @@ -115,9 +111,6 @@ impl pallet_treasury::Config for Test { type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; type OnSlash = (); - type ProposalBond = ProposalBond; - type ProposalBondMinimum = ConstU64<1>; - type ProposalBondMaximum = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); // Just gets burned. @@ -216,56 +209,12 @@ fn minting_works() { }); } -#[test] -fn spend_proposal_takes_min_deposit() { - new_test_ext().execute_with(|| { - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 1, 3) - }); - assert_eq!(Balances::free_balance(0), 99); - assert_eq!(Balances::reserved_balance(0), 1); - }); -} - -#[test] -fn spend_proposal_takes_proportional_deposit() { - new_test_ext().execute_with(|| { - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_eq!(Balances::free_balance(0), 95); - assert_eq!(Balances::reserved_balance(0), 5); - }); -} - -#[test] -fn spend_proposal_fails_when_proposer_poor() { - new_test_ext().execute_with(|| { - assert_noop!( - { - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(2), 100, 3) - }, - TreasuryError::InsufficientProposersBalance, - ); - }); -} - #[test] fn accepted_spend_proposal_ignored_outside_spend_period() { new_test_ext().execute_with(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); + assert_ok!({ Treasury::spend_local(RuntimeOrigin::root(), 100, 3) }); >::on_initialize(1); assert_eq!(Balances::free_balance(3), 0); @@ -286,112 +235,13 @@ fn unused_pot_should_diminish() { }); } -#[test] -fn rejected_spend_proposal_ignored_on_spend_period() { - new_test_ext().execute_with(|| { - Balances::make_free_balance_be(&Treasury::account_id(), 101); - - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::reject_proposal(RuntimeOrigin::root(), 0) - }); - - >::on_initialize(2); - assert_eq!(Balances::free_balance(3), 0); - assert_eq!(Treasury::pot(), 50); - }); -} - -#[test] -fn reject_already_rejected_spend_proposal_fails() { - new_test_ext().execute_with(|| { - Balances::make_free_balance_be(&Treasury::account_id(), 101); - - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::reject_proposal(RuntimeOrigin::root(), 0) - }); - assert_noop!( - { - #[allow(deprecated)] - Treasury::reject_proposal(RuntimeOrigin::root(), 0) - }, - TreasuryError::InvalidIndex - ); - }); -} - -#[test] -fn reject_non_existent_spend_proposal_fails() { - new_test_ext().execute_with(|| { - assert_noop!( - { - #[allow(deprecated)] - Treasury::reject_proposal(RuntimeOrigin::root(), 0) - }, - pallet_treasury::Error::::InvalidIndex - ); - }); -} - -#[test] -fn accept_non_existent_spend_proposal_fails() { - new_test_ext().execute_with(|| { - assert_noop!( - { - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }, - TreasuryError::InvalidIndex - ); - }); -} - -#[test] -fn accept_already_rejected_spend_proposal_fails() { - new_test_ext().execute_with(|| { - Balances::make_free_balance_be(&Treasury::account_id(), 101); - - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::reject_proposal(RuntimeOrigin::root(), 0) - }); - assert_noop!( - { - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }, - TreasuryError::InvalidIndex - ); - }); -} - #[test] fn accepted_spend_proposal_enacted_on_spend_period() { new_test_ext().execute_with(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_eq!(Treasury::pot(), 100); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); + assert_ok!({ Treasury::spend_local(RuntimeOrigin::root(), 100, 3) }); >::on_initialize(2); assert_eq!(Balances::free_balance(3), 100); @@ -405,14 +255,7 @@ fn pot_underflow_should_not_diminish() { Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_eq!(Treasury::pot(), 100); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 150, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); + assert_ok!({ Treasury::spend_local(RuntimeOrigin::root(), 150, 3) }); >::on_initialize(2); assert_eq!(Treasury::pot(), 100); // Pot hasn't changed @@ -433,26 +276,12 @@ fn treasury_account_doesnt_get_deleted() { assert_eq!(Treasury::pot(), 100); let treasury_balance = Balances::free_balance(&Treasury::account_id()); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), treasury_balance, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); + assert_ok!({ Treasury::spend_local(RuntimeOrigin::root(), treasury_balance, 3) }); >::on_initialize(2); assert_eq!(Treasury::pot(), 100); // Pot hasn't changed - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), Treasury::pot(), 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 1) - }); + assert_ok!({ Treasury::spend_local(RuntimeOrigin::root(), Treasury::pot(), 3) }); >::on_initialize(4); assert_eq!(Treasury::pot(), 0); // Pot is emptied @@ -475,22 +304,8 @@ fn inexistent_account_works() { assert_eq!(Balances::free_balance(Treasury::account_id()), 0); // Account does not exist assert_eq!(Treasury::pot(), 0); // Pot is empty - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 99, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 1, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 1) - }); + assert_ok!({ Treasury::spend_local(RuntimeOrigin::root(), 99, 3) }); + assert_ok!({ Treasury::spend_local(RuntimeOrigin::root(), 1, 3) }); >::on_initialize(2); assert_eq!(Treasury::pot(), 0); // Pot hasn't changed assert_eq!(Balances::free_balance(3), 0); // Balance of `3` hasn't changed diff --git a/substrate/frame/child-bounties/src/tests.rs b/substrate/frame/child-bounties/src/tests.rs index 38e86c528e5..be6fd62bb4c 100644 --- a/substrate/frame/child-bounties/src/tests.rs +++ b/substrate/frame/child-bounties/src/tests.rs @@ -74,7 +74,6 @@ impl pallet_balances::Config for Test { type AccountStore = System; } parameter_types! { - pub const ProposalBond: Permill = Permill::from_percent(5); pub const Burn: Permill = Permill::from_percent(50); pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub TreasuryAccount: u128 = Treasury::account_id(); @@ -88,9 +87,6 @@ impl pallet_treasury::Config for Test { type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; type OnSlash = (); - type ProposalBond = ProposalBond; - type ProposalBondMinimum = ConstU64<1>; - type ProposalBondMaximum = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); diff --git a/substrate/frame/tips/src/tests.rs b/substrate/frame/tips/src/tests.rs index 32a31b7fa13..ad987cc6cd6 100644 --- a/substrate/frame/tips/src/tests.rs +++ b/substrate/frame/tips/src/tests.rs @@ -94,7 +94,6 @@ impl ContainsLengthBound for TenToFourteen { } } parameter_types! { - pub const ProposalBond: Permill = Permill::from_percent(5); pub const Burn: Permill = Permill::from_percent(50); pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const TreasuryPalletId2: PalletId = PalletId(*b"py/trsr2"); @@ -109,9 +108,6 @@ impl pallet_treasury::Config for Test { type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; type OnSlash = (); - type ProposalBond = ProposalBond; - type ProposalBondMinimum = ConstU64<1>; - type ProposalBondMaximum = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); // Just gets burned. @@ -136,9 +132,6 @@ impl pallet_treasury::Config for Test { type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; type OnSlash = (); - type ProposalBond = ProposalBond; - type ProposalBondMinimum = ConstU64<1>; - type ProposalBondMaximum = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); // Just gets burned. diff --git a/substrate/frame/treasury/README.md b/substrate/frame/treasury/README.md index 4945d79d142..2bd58a9817a 100644 --- a/substrate/frame/treasury/README.md +++ b/substrate/frame/treasury/README.md @@ -26,6 +26,14 @@ and use the funds to pay developers. ### Dispatchable Functions General spending/proposal protocol: -- `propose_spend` - Make a spending proposal and stake the required deposit. -- `reject_proposal` - Reject a proposal, slashing the deposit. -- `approve_proposal` - Accept the proposal, returning the deposit. +- `spend_local` - Propose and approve a spend of treasury funds, enables the + creation of spends using the native currency of the chain, utilizing the funds + stored in the pot +- `spend` - Propose and approve a spend of treasury funds, allows spending any + asset kind managed by the treasury +- `remove_approval` - Force a previously approved proposal to be removed from + the approval queue +- `payout` - Claim a spend +- `check_status` - Check the status of the spend and remove it from the storage + if processed +- `void_spend` - Void previously approved spend diff --git a/substrate/frame/treasury/src/benchmarking.rs b/substrate/frame/treasury/src/benchmarking.rs index 0b9999e37fb..63978c94e68 100644 --- a/substrate/frame/treasury/src/benchmarking.rs +++ b/substrate/frame/treasury/src/benchmarking.rs @@ -59,12 +59,12 @@ where const SEED: u32 = 0; -// Create the pre-requisite information needed to create a treasury `propose_spend`. +// Create the pre-requisite information needed to create a treasury `spend_local`. fn setup_proposal, I: 'static>( u: u32, ) -> (T::AccountId, BalanceOf, AccountIdLookupOf) { let caller = account("caller", u, SEED); - let value: BalanceOf = T::ProposalBondMinimum::get().saturating_mul(100u32.into()); + let value: BalanceOf = T::Currency::minimum_balance() * 100u32.into(); let _ = T::Currency::make_free_balance_be(&caller, value); let beneficiary = account("beneficiary", u, SEED); let beneficiary_lookup = T::Lookup::unlookup(beneficiary); @@ -73,12 +73,10 @@ fn setup_proposal, I: 'static>( // Create proposals that are approved for use in `on_initialize`. fn create_approved_proposals, I: 'static>(n: u32) -> Result<(), &'static str> { + let origin = T::SpendOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; for i in 0..n { - let (caller, value, lookup) = setup_proposal::(i); - #[allow(deprecated)] - Treasury::::propose_spend(RawOrigin::Signed(caller).into(), value, lookup)?; - let proposal_id = >::get() - 1; - Approvals::::try_append(proposal_id).unwrap(); + let (_, value, lookup) = setup_proposal::(i); + Treasury::::spend_local(origin.clone(), value, lookup)?; } ensure!(>::get().len() == n as usize, "Not all approved"); Ok(()) @@ -126,71 +124,13 @@ mod benchmarks { Ok(()) } - #[benchmark] - fn propose_spend() -> Result<(), BenchmarkError> { - let (caller, value, beneficiary_lookup) = setup_proposal::(SEED); - // Whitelist caller account from further DB operations. - let caller_key = frame_system::Account::::hashed_key_for(&caller); - frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into()); - - #[extrinsic_call] - _(RawOrigin::Signed(caller), value, beneficiary_lookup); - - Ok(()) - } - - #[benchmark] - fn reject_proposal() -> Result<(), BenchmarkError> { - let (caller, value, beneficiary_lookup) = setup_proposal::(SEED); - #[allow(deprecated)] - Treasury::::propose_spend( - RawOrigin::Signed(caller).into(), - value, - beneficiary_lookup, - )?; - let proposal_id = Treasury::::proposal_count() - 1; - let reject_origin = - T::RejectOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - - #[extrinsic_call] - _(reject_origin as T::RuntimeOrigin, proposal_id); - - Ok(()) - } - - #[benchmark] - fn approve_proposal( - p: Linear<0, { T::MaxApprovals::get() - 1 }>, - ) -> Result<(), BenchmarkError> { - let approve_origin = - T::ApproveOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - create_approved_proposals::(p)?; - let (caller, value, beneficiary_lookup) = setup_proposal::(SEED); - #[allow(deprecated)] - Treasury::::propose_spend( - RawOrigin::Signed(caller).into(), - value, - beneficiary_lookup, - )?; - let proposal_id = Treasury::::proposal_count() - 1; - - #[extrinsic_call] - _(approve_origin as T::RuntimeOrigin, proposal_id); - - Ok(()) - } - #[benchmark] fn remove_approval() -> Result<(), BenchmarkError> { - let (caller, value, beneficiary_lookup) = setup_proposal::(SEED); - #[allow(deprecated)] - Treasury::::propose_spend( - RawOrigin::Signed(caller).into(), - value, - beneficiary_lookup, - )?; + let origin = + T::SpendOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let (_, value, beneficiary_lookup) = setup_proposal::(SEED); + Treasury::::spend_local(origin, value, beneficiary_lookup)?; let proposal_id = Treasury::::proposal_count() - 1; - Approvals::::try_append(proposal_id).unwrap(); let reject_origin = T::RejectOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; diff --git a/substrate/frame/treasury/src/lib.rs b/substrate/frame/treasury/src/lib.rs index 1ccd8456643..4677a0e0335 100644 --- a/substrate/frame/treasury/src/lib.rs +++ b/substrate/frame/treasury/src/lib.rs @@ -218,19 +218,6 @@ pub mod pallet { /// Handler for the unbalanced decrease when slashing for a rejected proposal or bounty. type OnSlash: OnUnbalanced>; - /// Fraction of a proposal's value that should be bonded in order to place the proposal. - /// An accepted proposal gets these back. A rejected proposal does not. - #[pallet::constant] - type ProposalBond: Get; - - /// Minimum amount of funds that should be placed in a deposit for making a proposal. - #[pallet::constant] - type ProposalBondMinimum: Get>; - - /// Maximum amount of funds that should be placed in a deposit for making a proposal. - #[pallet::constant] - type ProposalBondMaximum: Get>>; - /// Period between successive spends. #[pallet::constant] type SpendPeriod: Get>; @@ -363,14 +350,10 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event, I: 'static = ()> { - /// New proposal. - Proposed { proposal_index: ProposalIndex }, /// We have ended a spend period and will now allocate funds. Spending { budget_remaining: BalanceOf }, /// Some funds have been allocated. Awarded { proposal_index: ProposalIndex, award: BalanceOf, account: T::AccountId }, - /// A proposal was rejected; funds were slashed. - Rejected { proposal_index: ProposalIndex, slashed: BalanceOf }, /// Some of our funds have been burnt. Burnt { burnt_funds: BalanceOf }, /// Spending has finished; this is the amount that rolls over until next spend. @@ -408,8 +391,6 @@ pub mod pallet { /// Error for the treasury pallet. #[pallet::error] pub enum Error { - /// Proposer's balance is too low. - InsufficientProposersBalance, /// No proposal, bounty or spend at that index. InvalidIndex, /// Too many approvals in the queue. @@ -476,123 +457,6 @@ pub mod pallet { #[pallet::call] impl, I: 'static> Pallet { - /// Put forward a suggestion for spending. - /// - /// ## Dispatch Origin - /// - /// Must be signed. - /// - /// ## Details - /// A deposit proportional to the value is reserved and slashed if the proposal is rejected. - /// It is returned once the proposal is awarded. - /// - /// ### Complexity - /// - O(1) - /// - /// ## Events - /// - /// Emits [`Event::Proposed`] if successful. - #[pallet::call_index(0)] - #[pallet::weight(T::WeightInfo::propose_spend())] - #[allow(deprecated)] - #[deprecated( - note = "`propose_spend` will be removed in February 2024. Use `spend` instead." - )] - pub fn propose_spend( - origin: OriginFor, - #[pallet::compact] value: BalanceOf, - beneficiary: AccountIdLookupOf, - ) -> DispatchResult { - let proposer = ensure_signed(origin)?; - let beneficiary = T::Lookup::lookup(beneficiary)?; - - let bond = Self::calculate_bond(value); - T::Currency::reserve(&proposer, bond) - .map_err(|_| Error::::InsufficientProposersBalance)?; - - let c = Self::proposal_count(); - >::put(c + 1); - >::insert(c, Proposal { proposer, value, beneficiary, bond }); - - Self::deposit_event(Event::Proposed { proposal_index: c }); - Ok(()) - } - - /// Reject a proposed spend. - /// - /// ## Dispatch Origin - /// - /// Must be [`Config::RejectOrigin`]. - /// - /// ## Details - /// The original deposit will be slashed. - /// - /// ### Complexity - /// - O(1) - /// - /// ## Events - /// - /// Emits [`Event::Rejected`] if successful. - #[pallet::call_index(1)] - #[pallet::weight((T::WeightInfo::reject_proposal(), DispatchClass::Operational))] - #[allow(deprecated)] - #[deprecated( - note = "`reject_proposal` will be removed in February 2024. Use `spend` instead." - )] - pub fn reject_proposal( - origin: OriginFor, - #[pallet::compact] proposal_id: ProposalIndex, - ) -> DispatchResult { - T::RejectOrigin::ensure_origin(origin)?; - - let proposal = - >::take(&proposal_id).ok_or(Error::::InvalidIndex)?; - let value = proposal.bond; - let imbalance = T::Currency::slash_reserved(&proposal.proposer, value).0; - T::OnSlash::on_unbalanced(imbalance); - - Self::deposit_event(Event::::Rejected { - proposal_index: proposal_id, - slashed: value, - }); - Ok(()) - } - - /// Approve a proposal. - /// - /// ## Dispatch Origin - /// - /// Must be [`Config::ApproveOrigin`]. - /// - /// ## Details - /// - /// At a later time, the proposal will be allocated to the beneficiary and the original - /// deposit will be returned. - /// - /// ### Complexity - /// - O(1). - /// - /// ## Events - /// - /// No events are emitted from this dispatch. - #[pallet::call_index(2)] - #[pallet::weight((T::WeightInfo::approve_proposal(T::MaxApprovals::get()), DispatchClass::Operational))] - #[allow(deprecated)] - #[deprecated( - note = "`approve_proposal` will be removed in February 2024. Use `spend` instead." - )] - pub fn approve_proposal( - origin: OriginFor, - #[pallet::compact] proposal_id: ProposalIndex, - ) -> DispatchResult { - T::ApproveOrigin::ensure_origin(origin)?; - - ensure!(>::contains_key(proposal_id), Error::::InvalidIndex); - Approvals::::try_append(proposal_id) - .map_err(|_| Error::::TooManyApprovals)?; - Ok(()) - } - /// Propose and approve a spend of treasury funds. /// /// ## Dispatch Origin @@ -794,7 +658,7 @@ pub mod pallet { /// /// ## Dispatch Origin /// - /// Must be signed. + /// Must be signed /// /// ## Details /// @@ -934,15 +798,6 @@ impl, I: 'static> Pallet { T::PalletId::get().into_account_truncating() } - /// The needed bond for a proposal whose spend is `value`. - fn calculate_bond(value: BalanceOf) -> BalanceOf { - let mut r = T::ProposalBondMinimum::get().max(T::ProposalBond::get() * value); - if let Some(m) = T::ProposalBondMaximum::get() { - r = r.min(m); - } - r - } - /// Spend some money! returns number of approvals before spend. pub fn spend_funds() -> Weight { let mut total_weight = Weight::zero(); diff --git a/substrate/frame/treasury/src/tests.rs b/substrate/frame/treasury/src/tests.rs index e8b9270cd96..94f5e6b7094 100644 --- a/substrate/frame/treasury/src/tests.rs +++ b/substrate/frame/treasury/src/tests.rs @@ -126,7 +126,6 @@ impl Pay for TestPay { } parameter_types! { - pub const ProposalBond: Permill = Permill::from_percent(5); pub const Burn: Permill = Permill::from_percent(50); pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub TreasuryAccount: u128 = Treasury::account_id(); @@ -142,6 +141,7 @@ impl frame_support::traits::EnsureOrigin for TestSpendOrigin { frame_system::RawOrigin::Signed(11) => Ok(10), frame_system::RawOrigin::Signed(12) => Ok(20), frame_system::RawOrigin::Signed(13) => Ok(50), + frame_system::RawOrigin::Signed(14) => Ok(500), r => Err(RuntimeOrigin::from(r)), }) } @@ -168,9 +168,6 @@ impl Config for Test { type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; type OnSlash = (); - type ProposalBond = ProposalBond; - type ProposalBondMinimum = ConstU64<1>; - type ProposalBondMaximum = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); // Just gets burned. @@ -285,56 +282,12 @@ fn minting_works() { }); } -#[test] -fn spend_proposal_takes_min_deposit() { - ExtBuilder::default().build().execute_with(|| { - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 1, 3) - }); - assert_eq!(Balances::free_balance(0), 99); - assert_eq!(Balances::reserved_balance(0), 1); - }); -} - -#[test] -fn spend_proposal_takes_proportional_deposit() { - ExtBuilder::default().build().execute_with(|| { - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_eq!(Balances::free_balance(0), 95); - assert_eq!(Balances::reserved_balance(0), 5); - }); -} - -#[test] -fn spend_proposal_fails_when_proposer_poor() { - ExtBuilder::default().build().execute_with(|| { - assert_noop!( - { - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(2), 100, 3) - }, - Error::::InsufficientProposersBalance, - ); - }); -} - #[test] fn accepted_spend_proposal_ignored_outside_spend_period() { ExtBuilder::default().build().execute_with(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), 100, 3)); >::on_initialize(1); assert_eq!(Balances::free_balance(3), 0); @@ -355,112 +308,13 @@ fn unused_pot_should_diminish() { }); } -#[test] -fn rejected_spend_proposal_ignored_on_spend_period() { - ExtBuilder::default().build().execute_with(|| { - Balances::make_free_balance_be(&Treasury::account_id(), 101); - - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::reject_proposal(RuntimeOrigin::root(), 0) - }); - - >::on_initialize(2); - assert_eq!(Balances::free_balance(3), 0); - assert_eq!(Treasury::pot(), 50); - }); -} - -#[test] -fn reject_already_rejected_spend_proposal_fails() { - ExtBuilder::default().build().execute_with(|| { - Balances::make_free_balance_be(&Treasury::account_id(), 101); - - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::reject_proposal(RuntimeOrigin::root(), 0) - }); - assert_noop!( - { - #[allow(deprecated)] - Treasury::reject_proposal(RuntimeOrigin::root(), 0) - }, - Error::::InvalidIndex - ); - }); -} - -#[test] -fn reject_non_existent_spend_proposal_fails() { - ExtBuilder::default().build().execute_with(|| { - assert_noop!( - { - #[allow(deprecated)] - Treasury::reject_proposal(RuntimeOrigin::root(), 0) - }, - Error::::InvalidIndex - ); - }); -} - -#[test] -fn accept_non_existent_spend_proposal_fails() { - ExtBuilder::default().build().execute_with(|| { - assert_noop!( - { - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }, - Error::::InvalidIndex - ); - }); -} - -#[test] -fn accept_already_rejected_spend_proposal_fails() { - ExtBuilder::default().build().execute_with(|| { - Balances::make_free_balance_be(&Treasury::account_id(), 101); - - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::reject_proposal(RuntimeOrigin::root(), 0) - }); - assert_noop!( - { - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }, - Error::::InvalidIndex - ); - }); -} - #[test] fn accepted_spend_proposal_enacted_on_spend_period() { ExtBuilder::default().build().execute_with(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_eq!(Treasury::pot(), 100); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), 100, 3)); >::on_initialize(2); assert_eq!(Balances::free_balance(3), 100); @@ -474,14 +328,7 @@ fn pot_underflow_should_not_diminish() { Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_eq!(Treasury::pot(), 100); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 150, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), 150, 3)); >::on_initialize(2); assert_eq!(Treasury::pot(), 100); // Pot hasn't changed @@ -502,26 +349,12 @@ fn treasury_account_doesnt_get_deleted() { assert_eq!(Treasury::pot(), 100); let treasury_balance = Balances::free_balance(&Treasury::account_id()); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), treasury_balance, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), treasury_balance, 3)); >::on_initialize(2); assert_eq!(Treasury::pot(), 100); // Pot hasn't changed - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), Treasury::pot(), 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 1) - }); + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), Treasury::pot(), 3)); >::on_initialize(4); assert_eq!(Treasury::pot(), 0); // Pot is emptied @@ -544,22 +377,9 @@ fn inexistent_account_works() { assert_eq!(Balances::free_balance(Treasury::account_id()), 0); // Account does not exist assert_eq!(Treasury::pot(), 0); // Pot is empty - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 99, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 1, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 1) - }); + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), 99, 3)); + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), 1, 3)); + >::on_initialize(2); assert_eq!(Treasury::pot(), 0); // Pot hasn't changed assert_eq!(Balances::free_balance(3), 0); // Balance of `3` hasn't changed @@ -601,26 +421,12 @@ fn max_approvals_limited() { Balances::make_free_balance_be(&0, u64::MAX); for _ in 0..::MaxApprovals::get() { - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), 100, 3)); } // One too many will fail - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); assert_noop!( - { - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }, + Treasury::spend_local(RuntimeOrigin::signed(14), 100, 3), Error::::TooManyApprovals ); }); @@ -631,14 +437,8 @@ fn remove_already_removed_approval_fails() { ExtBuilder::default().build().execute_with(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 100, 3) - }); - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), 100, 3)); + assert_eq!(Treasury::approvals(), vec![0]); assert_ok!(Treasury::remove_approval(RuntimeOrigin::root(), 0)); assert_eq!(Treasury::approvals(), vec![]); @@ -972,11 +772,9 @@ fn check_status_works() { fn try_state_proposals_invariant_1_works() { ExtBuilder::default().build().execute_with(|| { use frame_support::pallet_prelude::DispatchError::Other; - // Add a proposal using `propose_spend` - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 1, 3) - }); + // Add a proposal and approve using `spend_local` + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), 1, 3)); + assert_eq!(Proposals::::iter().count(), 1); assert_eq!(ProposalCount::::get(), 1); // Check invariant 1 holds @@ -995,12 +793,11 @@ fn try_state_proposals_invariant_1_works() { fn try_state_proposals_invariant_2_works() { ExtBuilder::default().build().execute_with(|| { use frame_support::pallet_prelude::DispatchError::Other; - // Add a proposal using `propose_spend` - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 1, 3) - }); + // Add a proposal and approve using `spend_local` + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), 1, 3)); + assert_eq!(Proposals::::iter().count(), 1); + assert_eq!(Approvals::::get().len(), 1); let current_proposal_count = ProposalCount::::get(); assert_eq!(current_proposal_count, 1); // Check invariant 2 holds @@ -1025,17 +822,10 @@ fn try_state_proposals_invariant_2_works() { fn try_state_proposals_invariant_3_works() { ExtBuilder::default().build().execute_with(|| { use frame_support::pallet_prelude::DispatchError::Other; - // Add a proposal using `propose_spend` - assert_ok!({ - #[allow(deprecated)] - Treasury::propose_spend(RuntimeOrigin::signed(0), 10, 3) - }); + // Add a proposal and approve using `spend_local` + assert_ok!(Treasury::spend_local(RuntimeOrigin::signed(14), 10, 3)); + assert_eq!(Proposals::::iter().count(), 1); - // Approve the proposal - assert_ok!({ - #[allow(deprecated)] - Treasury::approve_proposal(RuntimeOrigin::root(), 0) - }); assert_eq!(Approvals::::get().len(), 1); // Check invariant 3 holds assert!(Approvals::::get() diff --git a/substrate/frame/treasury/src/weights.rs b/substrate/frame/treasury/src/weights.rs index 82277e2d28f..8c9c6eb1d0f 100644 --- a/substrate/frame/treasury/src/weights.rs +++ b/substrate/frame/treasury/src/weights.rs @@ -52,9 +52,6 @@ use core::marker::PhantomData; /// Weight functions needed for `pallet_treasury`. pub trait WeightInfo { fn spend_local() -> Weight; - fn propose_spend() -> Weight; - fn reject_proposal() -> Weight; - fn approve_proposal(p: u32, ) -> Weight; fn remove_approval() -> Weight; fn on_initialize_proposals(p: u32, ) -> Weight; fn spend() -> Weight; @@ -81,50 +78,8 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: `Treasury::ProposalCount` (r:1 w:1) - /// Proof: `Treasury::ProposalCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Treasury::Proposals` (r:0 w:1) - /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - fn propose_spend() -> Weight { - // Proof Size summary in bytes: - // Measured: `177` - // Estimated: `1489` - // Minimum execution time: 24_704_000 picoseconds. - Weight::from_parts(25_484_000, 1489) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) - } - /// Storage: `Treasury::Proposals` (r:1 w:1) - /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn reject_proposal() -> Weight { - // Proof Size summary in bytes: - // Measured: `335` - // Estimated: `3593` - // Minimum execution time: 26_632_000 picoseconds. - Weight::from_parts(27_325_000, 3593) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) - } - /// Storage: `Treasury::Proposals` (r:1 w:0) - /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - /// Storage: `Treasury::Approvals` (r:1 w:1) - /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) - /// The range of component `p` is `[0, 99]`. - fn approve_proposal(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `504 + p * (8 ±0)` - // Estimated: `3573` - // Minimum execution time: 8_436_000 picoseconds. - Weight::from_parts(11_268_438, 3573) - // Standard Error: 1_039 - .saturating_add(Weight::from_parts(70_903, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: `Treasury::Approvals` (r:1 w:1) - /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) + /// Storage: Treasury Approvals (r:1 w:1) + /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) fn remove_approval() -> Weight { // Proof Size summary in bytes: // Measured: `161` @@ -232,50 +187,8 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: `Treasury::ProposalCount` (r:1 w:1) - /// Proof: `Treasury::ProposalCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Treasury::Proposals` (r:0 w:1) - /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - fn propose_spend() -> Weight { - // Proof Size summary in bytes: - // Measured: `177` - // Estimated: `1489` - // Minimum execution time: 24_704_000 picoseconds. - Weight::from_parts(25_484_000, 1489) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) - } - /// Storage: `Treasury::Proposals` (r:1 w:1) - /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn reject_proposal() -> Weight { - // Proof Size summary in bytes: - // Measured: `335` - // Estimated: `3593` - // Minimum execution time: 26_632_000 picoseconds. - Weight::from_parts(27_325_000, 3593) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) - } - /// Storage: `Treasury::Proposals` (r:1 w:0) - /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - /// Storage: `Treasury::Approvals` (r:1 w:1) - /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) - /// The range of component `p` is `[0, 99]`. - fn approve_proposal(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `504 + p * (8 ±0)` - // Estimated: `3573` - // Minimum execution time: 8_436_000 picoseconds. - Weight::from_parts(11_268_438, 3573) - // Standard Error: 1_039 - .saturating_add(Weight::from_parts(70_903, 0).saturating_mul(p.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: `Treasury::Approvals` (r:1 w:1) - /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) + /// Storage: Treasury Approvals (r:1 w:1) + /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) fn remove_approval() -> Weight { // Proof Size summary in bytes: // Measured: `161` -- GitLab From cc387132facc83214bd3e67f0ae724bf617f0292 Mon Sep 17 00:00:00 2001 From: Tin Chung <56880684+chungquantin@users.noreply.github.com> Date: Tue, 18 Jun 2024 19:30:13 +0800 Subject: [PATCH 020/130] Add set_partial_params dispatchable function (#3843) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # ISSUE - Link to issue: https://github.com/paritytech/polkadot-sdk/issues/3617 # Description > Any set parameter / update config call with multiple arguments should have each argument to be an Option field. Please put this to some best practice document. This allows new update config call does not need to duplicate the fields that does not need to update. It also makes concurrent votes of update call possible, otherwise there will be race condition. It also helps with review such proposal otherwise reviewers need to check the other fields should remain the same. - [ ] Concurrent call & race condition testing - [x] Each argument of the `ParamsType` is an `Option` field. Introduce through ```rust pub type PartialParamsOf = ParamsType>::Balance>, Option>, RANK_COUNT>; ``` # Outcome ```rust let params = ParamsType { active_salary: [None; 9], passive_salary: [None; 9], demotion_period: [None, Some(10), None, None, None, None, None, None, None], min_promotion_period: [None; 9], offboard_timeout: Some(1), }; CoreFellowship::set_partial_params(signed(2), Box::new(params.clone())), ``` Test coverage ```diff running 21 tests test tests::unit::__construct_runtime_integrity_test::runtime_integrity_tests ... ok test tests::unit::basic_stuff ... ok test tests::integration::test_genesis_config_builds ... ok test tests::integration::__construct_runtime_integrity_test::runtime_integrity_tests ... ok test tests::unit::auto_demote_offboard_works ... ok test tests::unit::auto_demote_works ... ok test tests::unit::get_salary_works ... ok test tests::unit::active_changing_get_salary_works ... ok test tests::integration::swap_bad_noops ... ok test tests::unit::promote_postpones_auto_demote ... ok test tests::unit::infinite_demotion_period_works ... ok test tests::unit::proof_postpones_auto_demote ... ok test tests::unit::induct_works ... ok test tests::unit::set_params_works ... ok test tests::unit::test_genesis_config_builds ... ok test tests::unit::offboard_works ... ok test tests::unit::sync_works ... ok + test tests::unit::set_partial_params_works ... ok test tests::integration::swap_exhaustive_works ... ok test tests::unit::promote_works ... ok test tests::integration::swap_simple_works ... ok test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s Doc-tests pallet_core_fellowship running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` polkadot address: 19nSqFQorfF2HxD3oBzWM3oCh4SaCRKWt1yvmgaPYGCo71J --------- Co-authored-by: Dónal Murray Co-authored-by: Oliver Tale-Yazdi Co-authored-by: Bastian Köcher --- .../pallet_core_fellowship_ambassador_core.rs | 11 ++++ .../pallet_core_fellowship_fellowship_core.rs | 11 ++++ prdoc/pr_3843.prdoc | 17 ++++++ .../frame/core-fellowship/src/benchmarking.rs | 39 +++++++++++++ substrate/frame/core-fellowship/src/lib.rs | 55 +++++++++++++++++++ .../frame/core-fellowship/src/tests/unit.rs | 34 ++++++++++++ .../frame/core-fellowship/src/weights.rs | 21 +++++++ 7 files changed, 188 insertions(+) create mode 100644 prdoc/pr_3843.prdoc diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_ambassador_core.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_ambassador_core.rs index f40940a8b25..dbe681f51bb 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_ambassador_core.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_ambassador_core.rs @@ -58,6 +58,17 @@ impl pallet_core_fellowship::WeightInfo for WeightInfo< .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `AmbassadorCore::Params` (r:0 w:1) + /// Proof: `AmbassadorCore::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) + fn set_partial_params() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 11_000_000 picoseconds. + Weight::from_parts(11_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: `AmbassadorCore::Member` (r:1 w:1) /// Proof: `AmbassadorCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) /// Storage: `AmbassadorCollective::Members` (r:1 w:1) diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_fellowship_core.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_fellowship_core.rs index 471ee82ead7..7e6264c0c10 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_fellowship_core.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_fellowship_core.rs @@ -57,6 +57,17 @@ impl pallet_core_fellowship::WeightInfo for WeightInfo< .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `FellowshipCore::Params` (r:0 w:1) + /// Proof: `FellowshipCore::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) + fn set_partial_params() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 11_000_000 picoseconds. + Weight::from_parts(12_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } /// Storage: `FellowshipCore::Member` (r:1 w:1) /// Proof: `FellowshipCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) /// Storage: `FellowshipCollective::Members` (r:1 w:1) diff --git a/prdoc/pr_3843.prdoc b/prdoc/pr_3843.prdoc new file mode 100644 index 00000000000..e01900dcc25 --- /dev/null +++ b/prdoc/pr_3843.prdoc @@ -0,0 +1,17 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Introduce a new dispatchable function `set_partial_params` in `pallet-core-fellowship` + +doc: + - audience: Runtime Dev + description: | + This PR adds a new dispatchable function `set_partial_params` + to update config with multiple arguments without duplicating the + fields that does not need to update. + +crates: + - name: pallet-core-fellowship + bump: major + - name: collectives-westend-runtime + bump: patch diff --git a/substrate/frame/core-fellowship/src/benchmarking.rs b/substrate/frame/core-fellowship/src/benchmarking.rs index b3ee3ab7d16..2dabab3983d 100644 --- a/substrate/frame/core-fellowship/src/benchmarking.rs +++ b/substrate/frame/core-fellowship/src/benchmarking.rs @@ -85,6 +85,45 @@ mod benchmarks { Ok(()) } + #[benchmark] + fn set_partial_params() -> Result<(), BenchmarkError> { + let max_rank = T::MaxRank::get().try_into().unwrap(); + + // Set up the initial default state for the Params storage + let params = ParamsType { + active_salary: BoundedVec::try_from(vec![100u32.into(); max_rank]).unwrap(), + passive_salary: BoundedVec::try_from(vec![10u32.into(); max_rank]).unwrap(), + demotion_period: BoundedVec::try_from(vec![100u32.into(); max_rank]).unwrap(), + min_promotion_period: BoundedVec::try_from(vec![100u32.into(); max_rank]).unwrap(), + offboard_timeout: 1u32.into(), + }; + CoreFellowship::::set_params(RawOrigin::Root.into(), Box::new(params))?; + + let default_params = Params::::get(); + let expected_params = ParamsType { + active_salary: default_params.active_salary, + passive_salary: BoundedVec::try_from(vec![10u32.into(); max_rank]).unwrap(), + demotion_period: default_params.demotion_period, + min_promotion_period: BoundedVec::try_from(vec![100u32.into(); max_rank]).unwrap(), + offboard_timeout: 1u32.into(), + }; + + let params_payload = ParamsType { + active_salary: BoundedVec::try_from(vec![None; max_rank]).unwrap(), + passive_salary: BoundedVec::try_from(vec![Some(10u32.into()); max_rank]).unwrap(), + demotion_period: BoundedVec::try_from(vec![None; max_rank]).unwrap(), + min_promotion_period: BoundedVec::try_from(vec![Some(100u32.into()); max_rank]) + .unwrap(), + offboard_timeout: None, + }; + + #[extrinsic_call] + _(RawOrigin::Root, Box::new(params_payload.clone())); + + assert_eq!(Params::::get(), expected_params); + Ok(()) + } + #[benchmark] fn bump_offboard() -> Result<(), BenchmarkError> { set_benchmark_params::()?; diff --git a/substrate/frame/core-fellowship/src/lib.rs b/substrate/frame/core-fellowship/src/lib.rs index 94339b85d05..6f0bb77714d 100644 --- a/substrate/frame/core-fellowship/src/lib.rs +++ b/substrate/frame/core-fellowship/src/lib.rs @@ -222,6 +222,11 @@ pub mod pallet { pub type ParamsOf = ParamsType<>::Balance, BlockNumberFor, >::MaxRank>; + pub type PartialParamsOf = ParamsType< + Option<>::Balance>, + Option>, + >::MaxRank, + >; pub type MemberStatusOf = MemberStatus>; pub type RankOf = <>::Members as RankedMembers>::Rank; @@ -558,9 +563,59 @@ pub mod pallet { Ok(Pays::No.into()) } + + /// Set the parameters partially. + /// + /// - `origin`: An origin complying with `ParamsOrigin` or root. + /// - `partial_params`: The new parameters for the pallet. + /// + /// This update config with multiple arguments without duplicating + /// the fields that does not need to update (set to None). + #[pallet::weight(T::WeightInfo::set_partial_params())] + #[pallet::call_index(9)] + pub fn set_partial_params( + origin: OriginFor, + partial_params: Box>, + ) -> DispatchResult { + T::ParamsOrigin::ensure_origin_or_root(origin)?; + let params = Params::::mutate(|p| { + Self::set_partial_params_slice(&mut p.active_salary, partial_params.active_salary); + Self::set_partial_params_slice( + &mut p.passive_salary, + partial_params.passive_salary, + ); + Self::set_partial_params_slice( + &mut p.demotion_period, + partial_params.demotion_period, + ); + Self::set_partial_params_slice( + &mut p.min_promotion_period, + partial_params.min_promotion_period, + ); + if let Some(new_offboard_timeout) = partial_params.offboard_timeout { + p.offboard_timeout = new_offboard_timeout; + } + p.clone() + }); + Self::deposit_event(Event::::ParamsChanged { params }); + Ok(()) + } } impl, I: 'static> Pallet { + /// Partially update the base slice with a new slice + /// + /// Only elements in the base slice which has a new value in the new slice will be updated. + pub(crate) fn set_partial_params_slice( + base_slice: &mut BoundedVec>::MaxRank>, + new_slice: BoundedVec, >::MaxRank>, + ) { + for (base_element, new_element) in base_slice.iter_mut().zip(new_slice) { + if let Some(element) = new_element { + *base_element = element; + } + } + } /// Convert a rank into a `0..RANK_COUNT` index suitable for the arrays in Params. /// /// Rank 1 becomes index 0, rank `RANK_COUNT` becomes index `RANK_COUNT - 1`. Any rank not diff --git a/substrate/frame/core-fellowship/src/tests/unit.rs b/substrate/frame/core-fellowship/src/tests/unit.rs index 9245e5159a9..5d6d59c5c89 100644 --- a/substrate/frame/core-fellowship/src/tests/unit.rs +++ b/substrate/frame/core-fellowship/src/tests/unit.rs @@ -187,6 +187,40 @@ fn set_params_works() { }); } +#[test] +fn set_partial_params_works() { + new_test_ext().execute_with(|| { + let params = ParamsType { + active_salary: bounded_vec![None; 9], + passive_salary: bounded_vec![None; 9], + demotion_period: bounded_vec![None, Some(10), None, None, None, None, None, None, None], + min_promotion_period: bounded_vec![None; 9], + offboard_timeout: Some(2), + }; + assert_noop!( + CoreFellowship::set_partial_params(signed(2), Box::new(params.clone())), + DispatchError::BadOrigin + ); + assert_ok!(CoreFellowship::set_partial_params(signed(1), Box::new(params))); + + // Update params from the base params value declared in `new_test_ext` + let raw_updated_params = ParamsType { + active_salary: bounded_vec![10, 20, 30, 40, 50, 60, 70, 80, 90], + passive_salary: bounded_vec![1, 2, 3, 4, 5, 6, 7, 8, 9], + demotion_period: bounded_vec![2, 10, 6, 8, 10, 12, 14, 16, 18], + min_promotion_period: bounded_vec![3, 6, 9, 12, 15, 18, 21, 24, 27], + offboard_timeout: 2, + }; + // Updated params stored in Params storage value + let updated_params = Params::::get(); + assert_eq!(raw_updated_params, updated_params); + + System::assert_last_event( + Event::::ParamsChanged { params: updated_params }.into(), + ); + }); +} + #[test] fn induct_works() { new_test_ext().execute_with(|| { diff --git a/substrate/frame/core-fellowship/src/weights.rs b/substrate/frame/core-fellowship/src/weights.rs index 8fad6f585c1..c1042d0ddfa 100644 --- a/substrate/frame/core-fellowship/src/weights.rs +++ b/substrate/frame/core-fellowship/src/weights.rs @@ -50,6 +50,7 @@ use core::marker::PhantomData; /// Weight functions needed for `pallet_core_fellowship`. pub trait WeightInfo { fn set_params() -> Weight; + fn set_partial_params() -> Weight; fn bump_offboard() -> Weight; fn bump_demote() -> Weight; fn set_active() -> Weight; @@ -74,6 +75,16 @@ impl WeightInfo for SubstrateWeight { Weight::from_parts(8_018_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } + /// Storage: CoreFellowship Params (r:0 w:1) + /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) + fn set_partial_params() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_454_000 picoseconds. + Weight::from_parts(9_804_000, 0) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } /// Storage: `CoreFellowship::Member` (r:1 w:1) /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) /// Storage: `RankedCollective::Members` (r:1 w:1) @@ -245,6 +256,16 @@ impl WeightInfo for () { Weight::from_parts(8_018_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } + /// Storage: CoreFellowship Params (r:0 w:1) + /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) + fn set_partial_params() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_454_000 picoseconds. + Weight::from_parts(9_804_000, 0) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } /// Storage: `CoreFellowship::Member` (r:1 w:1) /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) /// Storage: `RankedCollective::Members` (r:1 w:1) -- GitLab From 029a6562152fd83d4a4d26ec8e177b443c593872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 18 Jun 2024 13:38:04 +0200 Subject: [PATCH 021/130] Unify `code_at` logic between `CallExecutor` & `Client` (#4618) This unifies the logic between `CallExecutor` and `Client` when it comes to fetching the `code` for a given block. The actual `code` depends on potential overrides/substitutes. Besides that it changes the logic in the lookahead collator on which `ValidationCodeHash` it sends to the validator alongside the `POV`. We are now sending the code hash as found on the relay chain. This is done as the local node could run with an override which is compatible to the validation code on the relay chain, but has a different hash. --- .../consensus/aura/src/collators/lookahead.rs | 12 +- .../consensus/aura/src/collators/mod.rs | 2 +- prdoc/pr_4618.prdoc | 20 + .../service/src/client/call_executor.rs | 222 +---------- substrate/client/service/src/client/client.rs | 23 +- .../service/src/client/code_provider.rs | 348 ++++++++++++++++++ substrate/client/service/src/client/mod.rs | 8 +- .../service/src/client/wasm_substitutes.rs | 6 +- substrate/test-utils/client/src/client_ext.rs | 2 +- 9 files changed, 407 insertions(+), 236 deletions(-) create mode 100644 prdoc/pr_4618.prdoc create mode 100644 substrate/client/service/src/client/code_provider.rs diff --git a/cumulus/client/consensus/aura/src/collators/lookahead.rs b/cumulus/client/consensus/aura/src/collators/lookahead.rs index 09416233ea9..b6f7b07f55d 100644 --- a/cumulus/client/consensus/aura/src/collators/lookahead.rs +++ b/cumulus/client/consensus/aura/src/collators/lookahead.rs @@ -363,13 +363,11 @@ where Ok(x) => x, }; - let validation_code_hash = match params.code_hash_provider.code_hash_at(parent_hash) - { - None => { - tracing::error!(target: crate::LOG_TARGET, ?parent_hash, "Could not fetch validation code hash"); - break - }, - Some(v) => v, + let Some(validation_code_hash) = + params.code_hash_provider.code_hash_at(parent_hash) + else { + tracing::error!(target: crate::LOG_TARGET, ?parent_hash, "Could not fetch validation code hash"); + break }; super::check_validation_code_or_log( diff --git a/cumulus/client/consensus/aura/src/collators/mod.rs b/cumulus/client/consensus/aura/src/collators/mod.rs index 6e0067d0ced..0abc034c1ed 100644 --- a/cumulus/client/consensus/aura/src/collators/mod.rs +++ b/cumulus/client/consensus/aura/src/collators/mod.rs @@ -64,7 +64,7 @@ async fn check_validation_code_or_log( ?relay_parent, ?local_validation_code_hash, relay_validation_code_hash = ?state, - "Parachain code doesn't match validation code stored in the relay chain state", + "Parachain code doesn't match validation code stored in the relay chain state.", ); }, None => { diff --git a/prdoc/pr_4618.prdoc b/prdoc/pr_4618.prdoc new file mode 100644 index 00000000000..3dd0fce81ee --- /dev/null +++ b/prdoc/pr_4618.prdoc @@ -0,0 +1,20 @@ +title: Unify logic for fetching the `:code` of a block + +doc: + - audience: Node Operator + description: | + Fixes an issue on parachains when running with a custom `substitute` of the on chain wasm code + and having replaced the wasm code on the relay chain. The relay chain was rejecting blocks + build this way, because the collator was reporting the actual on chain wasm code hash + to the relay chain. However, the relay chain was expecting the code hash of the wasm code substitute + that was also registered on the relay chain. + - audience: Node Dev + description: | + `Client::code_at` will now use the same `substitute` to determine the code for a given block as it is + done when executing any runtime call. + +crates: + - name: cumulus-client-consensus-aura + bump: minor + - name: sc-service + bump: minor diff --git a/substrate/client/service/src/client/call_executor.rs b/substrate/client/service/src/client/call_executor.rs index 9da4d219257..1341aa0e720 100644 --- a/substrate/client/service/src/client/call_executor.rs +++ b/substrate/client/service/src/client/call_executor.rs @@ -16,19 +16,19 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use super::{client::ClientConfig, wasm_override::WasmOverride, wasm_substitutes::WasmSubstitutes}; +use super::{code_provider::CodeProvider, ClientConfig}; use sc_client_api::{ backend, call_executor::CallExecutor, execution_extensions::ExecutionExtensions, HeaderBackend, }; use sc_executor::{RuntimeVersion, RuntimeVersionOf}; use sp_api::ProofRecorder; -use sp_core::traits::{CallContext, CodeExecutor, RuntimeCode}; +use sp_core::traits::{CallContext, CodeExecutor}; use sp_externalities::Extensions; use sp_runtime::{ generic::BlockId, traits::{Block as BlockT, HashingFor}, }; -use sp_state_machine::{backend::AsTrieBackend, Ext, OverlayedChanges, StateMachine, StorageProof}; +use sp_state_machine::{backend::AsTrieBackend, OverlayedChanges, StateMachine, StorageProof}; use std::{cell::RefCell, sync::Arc}; /// Call executor that executes methods locally, querying all required @@ -36,8 +36,7 @@ use std::{cell::RefCell, sync::Arc}; pub struct LocalCallExecutor { backend: Arc, executor: E, - wasm_override: Arc>, - wasm_substitutes: WasmSubstitutes, + code_provider: CodeProvider, execution_extensions: Arc>, } @@ -53,81 +52,15 @@ where client_config: ClientConfig, execution_extensions: ExecutionExtensions, ) -> sp_blockchain::Result { - let wasm_override = client_config - .wasm_runtime_overrides - .as_ref() - .map(|p| WasmOverride::new(p.clone(), &executor)) - .transpose()?; - - let wasm_substitutes = WasmSubstitutes::new( - client_config.wasm_runtime_substitutes, - executor.clone(), - backend.clone(), - )?; + let code_provider = CodeProvider::new(&client_config, executor.clone(), backend.clone())?; Ok(LocalCallExecutor { backend, executor, - wasm_override: Arc::new(wasm_override), - wasm_substitutes, + code_provider, execution_extensions: Arc::new(execution_extensions), }) } - - /// Check if local runtime code overrides are enabled and one is available - /// for the given `BlockId`. If yes, return it; otherwise return the same - /// `RuntimeCode` instance that was passed. - fn check_override<'a>( - &'a self, - onchain_code: RuntimeCode<'a>, - state: &B::State, - hash: Block::Hash, - ) -> sp_blockchain::Result<(RuntimeCode<'a>, RuntimeVersion)> - where - Block: BlockT, - B: backend::Backend, - { - let on_chain_version = self.on_chain_runtime_version(&onchain_code, state)?; - let code_and_version = if let Some(d) = self.wasm_override.as_ref().as_ref().and_then(|o| { - o.get( - &on_chain_version.spec_version, - onchain_code.heap_pages, - &on_chain_version.spec_name, - ) - }) { - log::debug!(target: "wasm_overrides", "using WASM override for block {}", hash); - d - } else if let Some(s) = - self.wasm_substitutes - .get(on_chain_version.spec_version, onchain_code.heap_pages, hash) - { - log::debug!(target: "wasm_substitutes", "Using WASM substitute for block {:?}", hash); - s - } else { - log::debug!( - target: "wasm_overrides", - "Neither WASM override nor substitute available for block {hash}, using onchain code", - ); - (onchain_code, on_chain_version) - }; - - Ok(code_and_version) - } - - /// Returns the on chain runtime version. - fn on_chain_runtime_version( - &self, - code: &RuntimeCode, - state: &B::State, - ) -> sp_blockchain::Result { - let mut overlay = OverlayedChanges::default(); - - let mut ext = Ext::new(&mut overlay, state, None); - - self.executor - .runtime_version(&mut ext, code) - .map_err(|e| sp_blockchain::Error::VersionInvalid(e.to_string())) - } } impl Clone for LocalCallExecutor @@ -138,8 +71,7 @@ where LocalCallExecutor { backend: self.backend.clone(), executor: self.executor.clone(), - wasm_override: self.wasm_override.clone(), - wasm_substitutes: self.wasm_substitutes.clone(), + code_provider: self.code_provider.clone(), execution_extensions: self.execution_extensions.clone(), } } @@ -175,7 +107,7 @@ where let runtime_code = state_runtime_code.runtime_code().map_err(sp_blockchain::Error::RuntimeCode)?; - let runtime_code = self.check_override(runtime_code, &state, at_hash)?.0; + let runtime_code = self.code_provider.maybe_override_code(runtime_code, &state, at_hash)?.0; let mut extensions = self.execution_extensions.extensions(at_hash, at_number); @@ -215,7 +147,7 @@ where let runtime_code = state_runtime_code.runtime_code().map_err(sp_blockchain::Error::RuntimeCode)?; - let runtime_code = self.check_override(runtime_code, &state, at_hash)?.0; + let runtime_code = self.code_provider.maybe_override_code(runtime_code, &state, at_hash)?.0; let mut extensions = extensions.borrow_mut(); match recorder { @@ -263,7 +195,9 @@ where let runtime_code = state_runtime_code.runtime_code().map_err(sp_blockchain::Error::RuntimeCode)?; - self.check_override(runtime_code, &state, at_hash).map(|(_, v)| v) + self.code_provider + .maybe_override_code(runtime_code, &state, at_hash) + .map(|(_, v)| v) } fn prove_execution( @@ -281,7 +215,7 @@ where let state_runtime_code = sp_state_machine::backend::BackendRuntimeCode::new(trie_backend); let runtime_code = state_runtime_code.runtime_code().map_err(sp_blockchain::Error::RuntimeCode)?; - let runtime_code = self.check_override(runtime_code, &state, at_hash)?.0; + let runtime_code = self.code_provider.maybe_override_code(runtime_code, &state, at_hash)?.0; sp_state_machine::prove_execution_on_trie_backend( trie_backend, @@ -331,133 +265,3 @@ where self.executor.native_version() } } - -#[cfg(test)] -mod tests { - use super::*; - use backend::Backend; - use sc_client_api::in_mem; - use sc_executor::WasmExecutor; - use sp_core::{ - testing::TaskExecutor, - traits::{FetchRuntimeCode, WrappedRuntimeCode}, - }; - use std::collections::HashMap; - use substrate_test_runtime_client::{runtime, GenesisInit}; - - #[test] - fn should_get_override_if_exists() { - let executor = WasmExecutor::default(); - - let overrides = crate::client::wasm_override::dummy_overrides(); - let onchain_code = WrappedRuntimeCode(substrate_test_runtime::wasm_binary_unwrap().into()); - let onchain_code = RuntimeCode { - code_fetcher: &onchain_code, - heap_pages: Some(128), - hash: vec![0, 0, 0, 0], - }; - - let backend = Arc::new(in_mem::Backend::::new()); - - // wasm_runtime_overrides is `None` here because we construct the - // LocalCallExecutor directly later on - let client_config = ClientConfig::default(); - - let genesis_block_builder = crate::GenesisBlockBuilder::new( - &substrate_test_runtime_client::GenesisParameters::default().genesis_storage(), - !client_config.no_genesis, - backend.clone(), - executor.clone(), - ) - .expect("Creates genesis block builder"); - - // client is used for the convenience of creating and inserting the genesis block. - let _client = - crate::client::new_with_backend::<_, _, runtime::Block, _, runtime::RuntimeApi>( - backend.clone(), - executor.clone(), - genesis_block_builder, - Box::new(TaskExecutor::new()), - None, - None, - client_config, - ) - .expect("Creates a client"); - - let call_executor = LocalCallExecutor { - backend: backend.clone(), - executor: executor.clone(), - wasm_override: Arc::new(Some(overrides)), - wasm_substitutes: WasmSubstitutes::new( - Default::default(), - executor.clone(), - backend.clone(), - ) - .unwrap(), - execution_extensions: Arc::new(ExecutionExtensions::new( - None, - Arc::new(executor.clone()), - )), - }; - - let check = call_executor - .check_override( - onchain_code, - &backend.state_at(backend.blockchain().info().genesis_hash).unwrap(), - backend.blockchain().info().genesis_hash, - ) - .expect("RuntimeCode override") - .0; - - assert_eq!(Some(vec![2, 2, 2, 2, 2, 2, 2, 2]), check.fetch_runtime_code().map(Into::into)); - } - - #[test] - fn returns_runtime_version_from_substitute() { - const SUBSTITUTE_SPEC_NAME: &str = "substitute-spec-name-cool"; - - let executor = WasmExecutor::default(); - - let backend = Arc::new(in_mem::Backend::::new()); - - // Let's only override the `spec_name` for our testing purposes. - let substitute = sp_version::embed::embed_runtime_version( - &substrate_test_runtime::WASM_BINARY_BLOATY.unwrap(), - sp_version::RuntimeVersion { - spec_name: SUBSTITUTE_SPEC_NAME.into(), - ..substrate_test_runtime::VERSION - }, - ) - .unwrap(); - - let client_config = crate::client::ClientConfig { - wasm_runtime_substitutes: vec![(0, substitute)].into_iter().collect::>(), - ..Default::default() - }; - - let genesis_block_builder = crate::GenesisBlockBuilder::new( - &substrate_test_runtime_client::GenesisParameters::default().genesis_storage(), - !client_config.no_genesis, - backend.clone(), - executor.clone(), - ) - .expect("Creates genesis block builder"); - - // client is used for the convenience of creating and inserting the genesis block. - let client = - crate::client::new_with_backend::<_, _, runtime::Block, _, runtime::RuntimeApi>( - backend.clone(), - executor.clone(), - genesis_block_builder, - Box::new(TaskExecutor::new()), - None, - None, - client_config, - ) - .expect("Creates a client"); - - let version = client.runtime_version_at(client.chain_info().genesis_hash).unwrap(); - - assert_eq!(SUBSTITUTE_SPEC_NAME, &*version.spec_name); - } -} diff --git a/substrate/client/service/src/client/client.rs b/substrate/client/service/src/client/client.rs index 3c25c233775..2fbcc3ba4f7 100644 --- a/substrate/client/service/src/client/client.rs +++ b/substrate/client/service/src/client/client.rs @@ -18,7 +18,10 @@ //! Substrate Client -use super::block_rules::{BlockRules, LookupResult as BlockLookupResult}; +use super::{ + block_rules::{BlockRules, LookupResult as BlockLookupResult}, + CodeProvider, +}; use crate::client::notification_pinning::NotificationPinningWorker; use log::{debug, info, trace, warn}; use parking_lot::{Mutex, RwLock}; @@ -57,10 +60,7 @@ use sp_consensus::{BlockOrigin, BlockStatus, Error as ConsensusError}; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedSender}; use sp_core::{ - storage::{ - well_known_keys, ChildInfo, ChildType, PrefixedStorageKey, StorageChild, StorageData, - StorageKey, - }, + storage::{ChildInfo, ChildType, PrefixedStorageKey, StorageChild, StorageData, StorageKey}, traits::{CallContext, SpawnNamed}, }; use sp_runtime::{ @@ -115,6 +115,7 @@ where config: ClientConfig, telemetry: Option, unpin_worker_sender: TracingUnboundedSender>, + code_provider: CodeProvider, _phantom: PhantomData, } @@ -410,6 +411,7 @@ where Block, BlockImportOperation = >::BlockImportOperation, >, + E: Clone, B: 'static, { let info = backend.blockchain().info(); @@ -438,6 +440,7 @@ where ); let unpin_worker = NotificationPinningWorker::new(rx, backend.clone()); spawn_handle.spawn("notification-pinning-worker", None, Box::pin(unpin_worker.run())); + let code_provider = CodeProvider::new(&config, executor.clone(), backend.clone())?; Ok(Client { backend, @@ -453,6 +456,7 @@ where config, telemetry, unpin_worker_sender, + code_provider, _phantom: Default::default(), }) } @@ -475,13 +479,10 @@ where } /// Get the code at a given block. + /// + /// This takes any potential substitutes into account, but ignores overrides. pub fn code_at(&self, hash: Block::Hash) -> sp_blockchain::Result> { - Ok(StorageProvider::storage(self, hash, &StorageKey(well_known_keys::CODE.to_vec()))? - .expect( - "None is returned if there's no value stored for the given key;\ - ':code' key is always defined; qed", - ) - .0) + self.code_provider.code_at_ignoring_overrides(hash) } /// Get the RuntimeVersion at a given block. diff --git a/substrate/client/service/src/client/code_provider.rs b/substrate/client/service/src/client/code_provider.rs new file mode 100644 index 00000000000..8ba7766ea65 --- /dev/null +++ b/substrate/client/service/src/client/code_provider.rs @@ -0,0 +1,348 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use super::{client::ClientConfig, wasm_override::WasmOverride, wasm_substitutes::WasmSubstitutes}; +use sc_client_api::backend; +use sc_executor::{RuntimeVersion, RuntimeVersionOf}; +use sp_core::traits::{FetchRuntimeCode, RuntimeCode}; +use sp_runtime::traits::Block as BlockT; +use sp_state_machine::{Ext, OverlayedChanges}; +use std::sync::Arc; + +/// Provider for fetching `:code` of a block. +/// +/// As a node can run with code overrides or substitutes, this will ensure that these are taken into +/// account before returning the actual `code` for a block. +pub struct CodeProvider { + backend: Arc, + executor: Arc, + wasm_override: Arc>, + wasm_substitutes: WasmSubstitutes, +} + +impl Clone for CodeProvider { + fn clone(&self) -> Self { + Self { + backend: self.backend.clone(), + executor: self.executor.clone(), + wasm_override: self.wasm_override.clone(), + wasm_substitutes: self.wasm_substitutes.clone(), + } + } +} + +impl CodeProvider +where + Block: BlockT, + Backend: backend::Backend, + Executor: RuntimeVersionOf, +{ + /// Create a new instance. + pub fn new( + client_config: &ClientConfig, + executor: Executor, + backend: Arc, + ) -> sp_blockchain::Result { + let wasm_override = client_config + .wasm_runtime_overrides + .as_ref() + .map(|p| WasmOverride::new(p.clone(), &executor)) + .transpose()?; + + let executor = Arc::new(executor); + + let wasm_substitutes = WasmSubstitutes::new( + client_config.wasm_runtime_substitutes.clone(), + executor.clone(), + backend.clone(), + )?; + + Ok(Self { backend, executor, wasm_override: Arc::new(wasm_override), wasm_substitutes }) + } + + /// Returns the `:code` for the given `block`. + /// + /// This takes into account potential overrides/substitutes. + pub fn code_at_ignoring_overrides(&self, block: Block::Hash) -> sp_blockchain::Result> { + let state = self.backend.state_at(block)?; + + let state_runtime_code = sp_state_machine::backend::BackendRuntimeCode::new(&state); + let runtime_code = + state_runtime_code.runtime_code().map_err(sp_blockchain::Error::RuntimeCode)?; + + self.maybe_override_code_internal(runtime_code, &state, block, true) + .and_then(|r| { + r.0.fetch_runtime_code().map(Into::into).ok_or_else(|| { + sp_blockchain::Error::Backend("Could not find `:code` in backend.".into()) + }) + }) + } + + /// Maybe override the given `onchain_code`. + /// + /// This takes into account potential overrides/substitutes. + pub fn maybe_override_code<'a>( + &'a self, + onchain_code: RuntimeCode<'a>, + state: &Backend::State, + hash: Block::Hash, + ) -> sp_blockchain::Result<(RuntimeCode<'a>, RuntimeVersion)> { + self.maybe_override_code_internal(onchain_code, state, hash, false) + } + + /// Maybe override the given `onchain_code`. + /// + /// This takes into account potential overrides(depending on `ignore_overrides`)/substitutes. + fn maybe_override_code_internal<'a>( + &'a self, + onchain_code: RuntimeCode<'a>, + state: &Backend::State, + hash: Block::Hash, + ignore_overrides: bool, + ) -> sp_blockchain::Result<(RuntimeCode<'a>, RuntimeVersion)> { + let on_chain_version = self.on_chain_runtime_version(&onchain_code, state)?; + let code_and_version = if let Some(d) = self.wasm_override.as_ref().as_ref().and_then(|o| { + if ignore_overrides { + return None + } + + o.get( + &on_chain_version.spec_version, + onchain_code.heap_pages, + &on_chain_version.spec_name, + ) + }) { + tracing::debug!(target: "code-provider::overrides", block = ?hash, "using WASM override"); + d + } else if let Some(s) = + self.wasm_substitutes + .get(on_chain_version.spec_version, onchain_code.heap_pages, hash) + { + tracing::debug!(target: "code-provider::substitutes", block = ?hash, "Using WASM substitute"); + s + } else { + tracing::debug!( + target: "code-provider", + block = ?hash, + "Neither WASM override nor substitute available, using onchain code", + ); + (onchain_code, on_chain_version) + }; + + Ok(code_and_version) + } + + /// Returns the on chain runtime version. + fn on_chain_runtime_version( + &self, + code: &RuntimeCode, + state: &Backend::State, + ) -> sp_blockchain::Result { + let mut overlay = OverlayedChanges::default(); + + let mut ext = Ext::new(&mut overlay, state, None); + + self.executor + .runtime_version(&mut ext, code) + .map_err(|e| sp_blockchain::Error::VersionInvalid(e.to_string())) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use backend::Backend; + use sc_client_api::{in_mem, HeaderBackend}; + use sc_executor::WasmExecutor; + use sp_core::{ + testing::TaskExecutor, + traits::{FetchRuntimeCode, WrappedRuntimeCode}, + }; + use std::collections::HashMap; + use substrate_test_runtime_client::{runtime, GenesisInit}; + + #[test] + fn no_override_no_substitutes_work() { + let executor = WasmExecutor::default(); + + let code_fetcher = WrappedRuntimeCode(substrate_test_runtime::wasm_binary_unwrap().into()); + let onchain_code = RuntimeCode { + code_fetcher: &code_fetcher, + heap_pages: Some(128), + hash: vec![0, 0, 0, 0], + }; + + let backend = Arc::new(in_mem::Backend::::new()); + + // wasm_runtime_overrides is `None` here because we construct the + // LocalCallExecutor directly later on + let client_config = ClientConfig::default(); + + let genesis_block_builder = crate::GenesisBlockBuilder::new( + &substrate_test_runtime_client::GenesisParameters::default().genesis_storage(), + !client_config.no_genesis, + backend.clone(), + executor.clone(), + ) + .expect("Creates genesis block builder"); + + // client is used for the convenience of creating and inserting the genesis block. + let _client = + crate::client::new_with_backend::<_, _, runtime::Block, _, runtime::RuntimeApi>( + backend.clone(), + executor.clone(), + genesis_block_builder, + Box::new(TaskExecutor::new()), + None, + None, + client_config.clone(), + ) + .expect("Creates a client"); + + let executor = Arc::new(executor); + + let code_provider = CodeProvider { + backend: backend.clone(), + executor: executor.clone(), + wasm_override: Arc::new(None), + wasm_substitutes: WasmSubstitutes::new(Default::default(), executor, backend.clone()) + .unwrap(), + }; + + let check = code_provider + .maybe_override_code( + onchain_code, + &backend.state_at(backend.blockchain().info().genesis_hash).unwrap(), + backend.blockchain().info().genesis_hash, + ) + .expect("RuntimeCode override") + .0; + + assert_eq!(code_fetcher.fetch_runtime_code(), check.fetch_runtime_code()); + } + + #[test] + fn should_get_override_if_exists() { + let executor = WasmExecutor::default(); + + let overrides = crate::client::wasm_override::dummy_overrides(); + let onchain_code = WrappedRuntimeCode(substrate_test_runtime::wasm_binary_unwrap().into()); + let onchain_code = RuntimeCode { + code_fetcher: &onchain_code, + heap_pages: Some(128), + hash: vec![0, 0, 0, 0], + }; + + let backend = Arc::new(in_mem::Backend::::new()); + + // wasm_runtime_overrides is `None` here because we construct the + // LocalCallExecutor directly later on + let client_config = ClientConfig::default(); + + let genesis_block_builder = crate::GenesisBlockBuilder::new( + &substrate_test_runtime_client::GenesisParameters::default().genesis_storage(), + !client_config.no_genesis, + backend.clone(), + executor.clone(), + ) + .expect("Creates genesis block builder"); + + // client is used for the convenience of creating and inserting the genesis block. + let _client = + crate::client::new_with_backend::<_, _, runtime::Block, _, runtime::RuntimeApi>( + backend.clone(), + executor.clone(), + genesis_block_builder, + Box::new(TaskExecutor::new()), + None, + None, + client_config.clone(), + ) + .expect("Creates a client"); + + let executor = Arc::new(executor); + + let code_provider = CodeProvider { + backend: backend.clone(), + executor: executor.clone(), + wasm_override: Arc::new(Some(overrides)), + wasm_substitutes: WasmSubstitutes::new(Default::default(), executor, backend.clone()) + .unwrap(), + }; + + let check = code_provider + .maybe_override_code( + onchain_code, + &backend.state_at(backend.blockchain().info().genesis_hash).unwrap(), + backend.blockchain().info().genesis_hash, + ) + .expect("RuntimeCode override") + .0; + + assert_eq!(Some(vec![2, 2, 2, 2, 2, 2, 2, 2]), check.fetch_runtime_code().map(Into::into)); + } + + #[test] + fn returns_runtime_version_from_substitute() { + const SUBSTITUTE_SPEC_NAME: &str = "substitute-spec-name-cool"; + + let executor = WasmExecutor::default(); + + let backend = Arc::new(in_mem::Backend::::new()); + + // Let's only override the `spec_name` for our testing purposes. + let substitute = sp_version::embed::embed_runtime_version( + &substrate_test_runtime::WASM_BINARY_BLOATY.unwrap(), + sp_version::RuntimeVersion { + spec_name: SUBSTITUTE_SPEC_NAME.into(), + ..substrate_test_runtime::VERSION + }, + ) + .unwrap(); + + let client_config = crate::client::ClientConfig { + wasm_runtime_substitutes: vec![(0, substitute)].into_iter().collect::>(), + ..Default::default() + }; + + let genesis_block_builder = crate::GenesisBlockBuilder::new( + &substrate_test_runtime_client::GenesisParameters::default().genesis_storage(), + !client_config.no_genesis, + backend.clone(), + executor.clone(), + ) + .expect("Creates genesis block builder"); + + // client is used for the convenience of creating and inserting the genesis block. + let client = + crate::client::new_with_backend::<_, _, runtime::Block, _, runtime::RuntimeApi>( + backend.clone(), + executor.clone(), + genesis_block_builder, + Box::new(TaskExecutor::new()), + None, + None, + client_config, + ) + .expect("Creates a client"); + + let version = client.runtime_version_at(client.chain_info().genesis_hash).unwrap(); + + assert_eq!(SUBSTITUTE_SPEC_NAME, &*version.spec_name); + } +} diff --git a/substrate/client/service/src/client/mod.rs b/substrate/client/service/src/client/mod.rs index 0703cc2b47d..ec77a92f162 100644 --- a/substrate/client/service/src/client/mod.rs +++ b/substrate/client/service/src/client/mod.rs @@ -47,14 +47,14 @@ mod block_rules; mod call_executor; mod client; +mod code_provider; mod notification_pinning; mod wasm_override; mod wasm_substitutes; -pub use self::{ - call_executor::LocalCallExecutor, - client::{Client, ClientConfig}, -}; +pub use call_executor::LocalCallExecutor; +pub use client::{Client, ClientConfig}; +pub(crate) use code_provider::CodeProvider; #[cfg(feature = "test-helpers")] pub use self::client::{new_in_mem, new_with_backend}; diff --git a/substrate/client/service/src/client/wasm_substitutes.rs b/substrate/client/service/src/client/wasm_substitutes.rs index 70db0ef20f5..07ca6c96062 100644 --- a/substrate/client/service/src/client/wasm_substitutes.rs +++ b/substrate/client/service/src/client/wasm_substitutes.rs @@ -94,7 +94,7 @@ impl From for sp_blockchain::Error { pub struct WasmSubstitutes { /// spec_version -> WasmSubstitute substitutes: Arc>>, - executor: Executor, + executor: Arc, backend: Arc, } @@ -110,14 +110,14 @@ impl Clone for WasmSubstitutes WasmSubstitutes where - Executor: RuntimeVersionOf + Clone + 'static, + Executor: RuntimeVersionOf, Backend: backend::Backend, Block: BlockT, { /// Create a new instance. pub fn new( substitutes: HashMap, Vec>, - executor: Executor, + executor: Arc, backend: Arc, ) -> Result { let substitutes = substitutes diff --git a/substrate/test-utils/client/src/client_ext.rs b/substrate/test-utils/client/src/client_ext.rs index 73581a4f0ef..9dc4739eb79 100644 --- a/substrate/test-utils/client/src/client_ext.rs +++ b/substrate/test-utils/client/src/client_ext.rs @@ -153,7 +153,7 @@ where Self: BlockImport, RA: Send, B: Send + Sync, - E: Send, + E: Send + Sync, { async fn import(&mut self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError> { let (header, extrinsics) = block.deconstruct(); -- GitLab From e1729592a22973a980ac455557d9c559d7b1a567 Mon Sep 17 00:00:00 2001 From: tianyeyouyou <150894831+tianyeyouyou@users.noreply.github.com> Date: Tue, 18 Jun 2024 19:44:31 +0800 Subject: [PATCH 022/130] chore: remove redundant words. (#4653) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit remove redundant words in comments. Co-authored-by: Bastian Köcher Co-authored-by: Oliver Tale-Yazdi --- substrate/primitives/storage/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/substrate/primitives/storage/src/lib.rs b/substrate/primitives/storage/src/lib.rs index 197994f5747..3b9afae4ca0 100644 --- a/substrate/primitives/storage/src/lib.rs +++ b/substrate/primitives/storage/src/lib.rs @@ -293,7 +293,7 @@ impl ChildInfo { } } - /// Return a the full location in the direct parent of + /// Return the full location in the direct parent of /// this trie. pub fn prefixed_storage_key(&self) -> PrefixedStorageKey { match self { @@ -302,7 +302,7 @@ impl ChildInfo { } } - /// Returns a the full location in the direct parent of + /// Returns the full location in the direct parent of /// this trie. pub fn into_prefixed_storage_key(self) -> PrefixedStorageKey { match self { -- GitLab From 6daa939bc7c3f26c693a876d5a4b7ea00c6b2d7f Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 18 Jun 2024 15:12:03 +0200 Subject: [PATCH 023/130] Migrated commands to github actions (#4701) Migrated commands individually to work as GitHub actions with a [`workflow_dispatch`](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_dispatch) event. This will not disable the command-bot yet, but it's the first step before disabling it. ### Commands migrated - [x] bench-all - [x] bench-overhead - [x] bench - [x] fmt - [x] update-ui Also created an action that will inform users about the new documentation when they comment `bot`. ### Created documentation Created a detailed documentation on how to use this action. Found the documentation [here](https://github.com/paritytech/polkadot-sdk/blob/bullrich/cmd-action/.github/commands-readme.md). --------- Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: Przemek Rzad --- .github/actions/set-up-gh/action.yml | 36 ++++ .github/command-screnshot.png | Bin 0 -> 31548 bytes .github/commands-readme.md | 199 +++++++++++++++++++ .github/workflows/command-bench-all.yml | 97 +++++++++ .github/workflows/command-bench-overhead.yml | 75 +++++++ .github/workflows/command-bench.yml | 122 ++++++++++++ .github/workflows/command-fmt.yml | 54 +++++ .github/workflows/command-inform.yml | 15 ++ .github/workflows/command-update-ui.yml | 55 +++++ scripts/bench-all.sh | 16 ++ scripts/bench.sh | 117 +++++++++++ scripts/command-utils.sh | 80 ++++++++ scripts/lib/bench-all-cumulus.sh | 139 +++++++++++++ scripts/lib/bench-all-pallet.sh | 96 +++++++++ scripts/lib/bench-all-polkadot.sh | 88 ++++++++ scripts/lib/bench-all-substrate.sh | 148 ++++++++++++++ scripts/lib/bench-overhead.sh | 66 ++++++ scripts/lib/bench-pallet.sh | 178 +++++++++++++++++ scripts/sync.sh | 74 +++++++ 19 files changed, 1655 insertions(+) create mode 100644 .github/actions/set-up-gh/action.yml create mode 100644 .github/command-screnshot.png create mode 100644 .github/commands-readme.md create mode 100644 .github/workflows/command-bench-all.yml create mode 100644 .github/workflows/command-bench-overhead.yml create mode 100644 .github/workflows/command-bench.yml create mode 100644 .github/workflows/command-fmt.yml create mode 100644 .github/workflows/command-inform.yml create mode 100644 .github/workflows/command-update-ui.yml create mode 100755 scripts/bench-all.sh create mode 100755 scripts/bench.sh create mode 100644 scripts/command-utils.sh create mode 100755 scripts/lib/bench-all-cumulus.sh create mode 100644 scripts/lib/bench-all-pallet.sh create mode 100644 scripts/lib/bench-all-polkadot.sh create mode 100644 scripts/lib/bench-all-substrate.sh create mode 100644 scripts/lib/bench-overhead.sh create mode 100644 scripts/lib/bench-pallet.sh create mode 100755 scripts/sync.sh diff --git a/.github/actions/set-up-gh/action.yml b/.github/actions/set-up-gh/action.yml new file mode 100644 index 00000000000..fc16ce0b263 --- /dev/null +++ b/.github/actions/set-up-gh/action.yml @@ -0,0 +1,36 @@ +name: 'install gh' +description: 'Install the gh cli in a debian based distro and switches to the PR branch.' +inputs: + pr-number: + description: "Number of the PR" + required: true + GH_TOKEN: + description: "GitHub token" + required: true +outputs: + branch: + description: 'Branch name for the PR' + value: ${{ steps.branch.outputs.branch }} +runs: + using: "composite" + steps: + - name: Instal gh cli + shell: bash + # Here it would get the script from previous step + run: | + (type -p wget >/dev/null || (apt update && apt-get install wget -y)) + mkdir -p -m 755 /etc/apt/keyrings + wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null + chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null + apt update + apt install gh -y + git config --global --add safe.directory '*' + - run: gh pr checkout ${{ inputs.pr-number }} + shell: bash + env: + GITHUB_TOKEN: ${{ inputs.GH_TOKEN }} + - name: Export branch name + shell: bash + run: echo "branch=$(git rev-parse --abbrev-ref HEAD)" >> "$GITHUB_OUTPUT" + id: branch diff --git a/.github/command-screnshot.png b/.github/command-screnshot.png new file mode 100644 index 0000000000000000000000000000000000000000..1451fabca8b975534778e8321facd261e3b803fb GIT binary patch literal 31548 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%0D|Qs}dMP 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 $GITHUB_OUTPUT + cmd-bench-all: + needs: [set-image] + runs-on: arc-runners-polkadot-sdk-benchmark + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - name: Download repo + uses: actions/checkout@v4 + - name: Install gh cli + id: gh + uses: ./.github/actions/set-up-gh + with: + pr-number: ${{ inputs.pr }} + GH_TOKEN: ${{ github.token }} + - name: Run bench all + run: | + "./scripts/bench-all.sh" "${{ inputs.benchmark }}" --runtime "${{ inputs.runtime }}" --pallet "${{ inputs.pallet }}" --target_dir "${{ inputs.target_dir }}" + - name: Report failure + if: ${{ failure() }} + run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} + - run: git pull --rebase + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: cmd-action - ${{ github.workflow }} + branch: ${{ steps.gh.outputs.branch }} + - name: Report succeed + run: gh pr comment ${{ inputs.pr }} --body "

Action completed 🎉🎉

Run by @${{ github.actor }} for ${{ github.workflow }} completed 🎉. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/command-bench-overhead.yml b/.github/workflows/command-bench-overhead.yml new file mode 100644 index 00000000000..735b4010210 --- /dev/null +++ b/.github/workflows/command-bench-overhead.yml @@ -0,0 +1,75 @@ +name: Command Bench Overhead + +on: + workflow_dispatch: + inputs: + pr: + description: Number of the Pull Request + required: true + benchmark: + description: Pallet benchmark + type: choice + required: true + options: + - default + - substrate + - cumulus + runtime: + description: Runtime + type: choice + options: + - rococo + - westend + - asset-hub-rococo + - asset-hub-westend + target_dir: + description: Target directory + type: choice + options: + - polkadot + - substrate + - cumulus + +jobs: + set-image: + runs-on: ubuntu-latest + outputs: + IMAGE: ${{ steps.set_image.outputs.IMAGE }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - id: set_image + run: cat .github/env >> $GITHUB_OUTPUT + cmd-bench-overhead: + needs: [set-image] + runs-on: arc-runners-polkadot-sdk-benchmark + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - name: Download repo + uses: actions/checkout@v4 + - name: Install gh cli + id: gh + uses: ./.github/actions/set-up-gh + with: + pr-number: ${{ inputs.pr }} + GH_TOKEN: ${{ github.token }} + - name: Run bench overhead + run: | + "./scripts/bench.sh" "${{ inputs.benchmark }}" --subcommand "overhead" --runtime "${{ inputs.runtime }}" --target_dir "${{ inputs.target_dir }}" + - name: Report failure + if: ${{ failure() }} + run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} + - run: git pull --rebase + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: cmd-action - ${{ github.workflow }} + branch: ${{ steps.gh.outputs.branch }} + - name: Report succeed + run: gh pr comment ${{ inputs.pr }} --body "

Action completed 🎉🎉

Run by @${{ github.actor }} for ${{ github.workflow }} completed 🎉. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/command-bench.yml b/.github/workflows/command-bench.yml new file mode 100644 index 00000000000..0ff166be48c --- /dev/null +++ b/.github/workflows/command-bench.yml @@ -0,0 +1,122 @@ +name: Command Bench + +on: + workflow_dispatch: + inputs: + pr: + description: Number of the Pull Request + required: true + benchmark: + description: Pallet benchmark + type: choice + required: true + options: + - substrate-pallet + - polkadot-pallet + - cumulus-assets + - cumulus-collectives + - cumulus-coretime + - cumulus-bridge-hubs + - cumulus-contracts + - cumulus-glutton + - cumulus-starters + - cumulus-people + - cumulus-testing + subcommand: + description: Subcommand + type: choice + required: true + options: + - pallet + - xcm + runtime: + description: Runtime + type: choice + options: + - dev + - rococo + - westend + - asset-hub-westend + - asset-hub-rococo + - collectives-westend + - coretime-rococo + - coretime-westend + - bridge-hub-rococo + - bridge-hub-westend + - contracts-rococo + - glutton-westend + - glutton-westend-dev-1300 + - seedling + - shell + - people-westend + - people-rococo + - penpal + - rococo-parachain + pallet: + description: Pallet + type: string + default: pallet_name + target_dir: + description: Target directory + type: choice + options: + - substrate + - polkadot + - cumulus + runtime_dir: + description: Runtime directory + type: choice + options: + - people + - collectives + - coretime + - bridge-hubs + - contracts + - glutton + - starters + - testing + + +jobs: + set-image: + runs-on: ubuntu-latest + outputs: + IMAGE: ${{ steps.set_image.outputs.IMAGE }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - id: set_image + run: cat .github/env >> $GITHUB_OUTPUT + cmd-bench: + needs: [set-image] + runs-on: arc-runners-polkadot-sdk-benchmark + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - name: Download repo + uses: actions/checkout@v4 + - name: Install gh cli + id: gh + uses: ./.github/actions/set-up-gh + with: + pr-number: ${{ inputs.pr }} + GH_TOKEN: ${{ github.token }} + - name: Run bench + run: | + "./scripts/bench.sh" "${{ inputs.benchmark }}" --runtime "${{ inputs.runtime }}" --pallet "${{ inputs.pallet }}" --target_dir "${{ inputs.target_dir }}" --subcommand "${{ inputs.subcommand }}" --runtime_dir "${{ inputs.runtime_dir }}" + - name: Report failure + if: ${{ failure() }} + run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} + - run: git pull --rebase + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: cmd-action - ${{ github.workflow }} + branch: ${{ steps.gh.outputs.branch }} + - name: Report succeed + run: gh pr comment ${{ inputs.pr }} --body "

Action completed 🎉🎉

Run by @${{ github.actor }} for ${{ github.workflow }} completed 🎉. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/command-fmt.yml b/.github/workflows/command-fmt.yml new file mode 100644 index 00000000000..d415007d938 --- /dev/null +++ b/.github/workflows/command-fmt.yml @@ -0,0 +1,54 @@ +name: Command FMT + +on: + workflow_dispatch: + inputs: + pr: + description: Number of the Pull Request + required: true + +jobs: + set-image: + runs-on: ubuntu-latest + outputs: + IMAGE: ${{ steps.set_image.outputs.IMAGE }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - id: set_image + run: cat .github/env >> $GITHUB_OUTPUT + cmd-fmt: + needs: [set-image] + runs-on: ubuntu-latest + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - name: Download repo + uses: actions/checkout@v4 + - name: Install gh cli + id: gh + uses: ./.github/actions/set-up-gh + with: + pr-number: ${{ inputs.pr }} + GH_TOKEN: ${{ github.token }} + - name: Run FMT + run: | + # format toml. + # since paritytech/ci-unified:bullseye-1.73.0-2023-11-01-v20231204 includes taplo-cli + taplo format --config .config/taplo.toml + - name: Report failure + if: ${{ failure() }} + run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} + - run: git pull --rebase + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: cmd-action - ${{ github.workflow }} + branch: ${{ steps.gh.outputs.branch }} + - name: Report succeed + run: gh pr comment ${{ inputs.pr }} --body "

Action completed 🎉🎉

Run by @${{ github.actor }} for ${{ github.workflow }} completed 🎉. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/command-inform.yml b/.github/workflows/command-inform.yml new file mode 100644 index 00000000000..1c7323c998d --- /dev/null +++ b/.github/workflows/command-inform.yml @@ -0,0 +1,15 @@ +name: Inform of new command action + +on: + issue_comment: + types: [created] + +jobs: + comment: + runs-on: ubuntu-latest + steps: + - name: Inform that the new command exist + if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, 'bot ') }} + run: gh pr comment ${{ github.event.issue.number }} --body 'We are migrating this bot to be a GitHub Action

Please, see the documentation on how to use it' + env: + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/command-update-ui.yml b/.github/workflows/command-update-ui.yml new file mode 100644 index 00000000000..9b9c45c5c0b --- /dev/null +++ b/.github/workflows/command-update-ui.yml @@ -0,0 +1,55 @@ +name: Command Update UI + +on: + workflow_dispatch: + inputs: + pr: + description: Number of the Pull Request + required: true + rust-version: + description: Version of rust. Example 1.70 + required: false + +jobs: + set-image: + runs-on: ubuntu-latest + outputs: + IMAGE: ${{ steps.set_image.outputs.IMAGE }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - id: set_image + run: cat .github/env >> $GITHUB_OUTPUT + cmd-update-ui: + needs: [set-image] + runs-on: arc-runners-polkadot-sdk-beefy + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - name: Download repo + uses: actions/checkout@v4 + - name: Install gh cli + id: gh + uses: ./.github/actions/set-up-gh + with: + pr-number: ${{ inputs.pr }} + GH_TOKEN: ${{ github.token }} + - name: Run update-ui + run: | + "./scripts/update-ui-tests.sh" "${{ inputs.rust-version }}" + - name: Report failure + if: ${{ failure() }} + run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} + - run: git pull --rebase + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: cmd-action - ${{ github.workflow }} + branch: ${{ steps.gh.outputs.branch }} + - name: Report succeed + run: gh pr comment ${{ inputs.pr }} --body "

Action completed 🎉🎉

Run by @${{ github.actor }} for ${{ github.workflow }} completed 🎉. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} diff --git a/scripts/bench-all.sh b/scripts/bench-all.sh new file mode 100755 index 00000000000..e5512e26bba --- /dev/null +++ b/scripts/bench-all.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +set -eu -o pipefail +shopt -s inherit_errexit +shopt -s globstar + +. "$(realpath "$(dirname "${BASH_SOURCE[0]}")/command-utils.sh")" + +get_arg optional --pallet "$@" +PALLET="${out:-""}" + +if [[ ! -z "$PALLET" ]]; then + . "$(dirname "${BASH_SOURCE[0]}")/lib/bench-all-pallet.sh" "$@" +else + . "$(dirname "${BASH_SOURCE[0]}")/bench.sh" --subcommand=all "$@" +fi diff --git a/scripts/bench.sh b/scripts/bench.sh new file mode 100755 index 00000000000..2f4ef7ec6a1 --- /dev/null +++ b/scripts/bench.sh @@ -0,0 +1,117 @@ +#!/bin/bash +# Initially based on https://github.com/paritytech/bench-bot/blob/cd3b2943d911ae29e41fe6204788ef99c19412c3/bench.js + +# Most external variables used in this script, such as $GH_CONTRIBUTOR, are +# related to https://github.com/paritytech/try-runtime-bot + +# This script relies on $GITHUB_TOKEN which is probably a protected GitLab CI +# variable; if this assumption holds true, it is implied that this script should +# be ran only on protected pipelines + +set -eu -o pipefail +shopt -s inherit_errexit + +# realpath allows to reuse the current +BENCH_ROOT_DIR=$(realpath "$(dirname "${BASH_SOURCE[0]}")") + +. "$(realpath "$(dirname "${BASH_SOURCE[0]}")/command-utils.sh")" + +repository_name="$(basename "$PWD")" + +get_arg optional --target_dir "$@" +target_dir="${out:-""}" + +get_arg optional --noexit "$@" +noexit="${out:-""}" + +output_path="." + +profile="production" + +if [[ "$repository_name" == "polkadot-sdk" ]]; then + output_path="./$target_dir" +fi + +cargo_run_benchmarks="cargo run --quiet --profile=${profile}" + +echo "Repository: $repository_name" +echo "Target Dir: $target_dir" +echo "Output Path: $output_path" + +cargo_run() { + echo "Running $cargo_run_benchmarks" "${args[@]}" + + # if not patched with PATCH_something=123 then use --locked + if [[ -z "${BENCH_PATCHED:-}" ]]; then + cargo_run_benchmarks+=" --locked" + fi + + $cargo_run_benchmarks "${args[@]}" +} + + +main() { + + # Remove the "github" remote since the same repository might be reused by a + # GitLab runner, therefore the remote might already exist from a previous run + # in case it was not cleaned up properly for some reason + &>/dev/null git remote remove github || : + + tmp_dirs=() + cleanup() { + exit_code=$? + # Clean up the "github" remote at the end since it contains the + # $GITHUB_TOKEN secret, which is only available for protected pipelines on + # GitLab + &>/dev/null git remote remove github || : + rm -rf "${tmp_dirs[@]}" + echo "Done, exit: $exit_code" + exit $exit_code + } + + # avoid exit if --noexit is passed + if [ -z "$noexit" ]; then + trap cleanup EXIT + fi + + # set -x + + get_arg required --subcommand "$@" + local subcommand="${out:-""}" + + case "$subcommand" in + runtime|pallet|xcm) + echo 'Running bench_pallet' + . "$BENCH_ROOT_DIR/lib/bench-pallet.sh" "$@" + ;; + overhead) + echo 'Running bench_overhead' + . "$BENCH_ROOT_DIR/lib/bench-overhead.sh" "$@" + ;; + all) + echo "Running all-$target_dir" + . "$BENCH_ROOT_DIR/lib/bench-all-${target_dir}.sh" "$@" + ;; + *) + die "Invalid subcommand $subcommand to process_args" + ;; + esac + + # set +x + + # in case we used diener to patch some dependency during benchmark execution, + # revert the patches so that they're not included in the diff + git checkout --quiet HEAD Cargo.toml + + # Save the generated weights to GitLab artifacts in case commit+push fails + echo "Showing weights diff for command" + git diff -P | tee -a "${ARTIFACTS_DIR}/weights.patch" + echo "Wrote weights patch to \"${ARTIFACTS_DIR}/weights.patch\"" + + + # instead of using `cargo run --locked`, we allow the Cargo files to be updated + # but avoid committing them. It is so `cmd_runner_apply_patches` can work + git restore --staged Cargo.* +} + +main "$@" diff --git a/scripts/command-utils.sh b/scripts/command-utils.sh new file mode 100644 index 00000000000..252e4c86480 --- /dev/null +++ b/scripts/command-utils.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash + +if [ "${LOADED_UTILS_SH:-}" ]; then + return +else + export LOADED_UTILS_SH=true +fi + +export ARTIFACTS_DIR="$PWD/.git/.artifacts" + +die() { + if [ "${1:-}" ]; then + >&2 echo "$1" + fi + exit 1 +} + +get_arg() { + local arg_type="$1" + shift + + local is_required + case "$arg_type" in + required|required-many) + is_required=true + ;; + optional|optional-many) ;; + *) + die "Invalid is_required argument \"$2\" in get_arg" + ;; + esac + + local has_many_values + if [ "${arg_type: -6}" == "-many" ]; then + has_many_values=true + fi + + local option_arg="$1" + shift + + local args=("$@") + + unset out + out=() + + local get_next_arg + for arg in "${args[@]}"; do + if [ "${get_next_arg:-}" ]; then + out+=("$arg") + unset get_next_arg + if [ ! "${has_many_values:-}" ]; then + break + fi + # --foo=bar (get the value after '=') + elif [ "${arg:0:$(( ${#option_arg} + 1 ))}" == "$option_arg=" ]; then + out+=("${arg:$(( ${#option_arg} + 1 ))}") + if [ ! "${has_many_values:-}" ]; then + break + fi + # --foo bar (get the next argument) + elif [ "$arg" == "$option_arg" ]; then + get_next_arg=true + fi + done + + # arg list ended with --something but no argument was provided next + if [ "${get_next_arg:-}" ]; then + die "Expected argument after \"${args[-1]}"\" + fi + + if [ "${out[0]:-}" ]; then + if [ ! "${has_many_values:-}" ]; then + out="${out[0]}" + fi + elif [ "${is_required:-}" ]; then + die "Argument $option_arg is required, but was not found" + else + unset out + fi +} diff --git a/scripts/lib/bench-all-cumulus.sh b/scripts/lib/bench-all-cumulus.sh new file mode 100755 index 00000000000..f4c2a35c6b6 --- /dev/null +++ b/scripts/lib/bench-all-cumulus.sh @@ -0,0 +1,139 @@ +#!/usr/bin/env bash +# originally moved from https://github.com/paritytech/cumulus/blob/445f9277ab55b4d930ced4fbbb38d27c617c6658/scripts/benchmarks-ci.sh + +# default RUST_LOG is warn, but could be overridden +export RUST_LOG="${RUST_LOG:-error}" + +THIS_DIR=$(dirname "${BASH_SOURCE[0]}") +. "$THIS_DIR/../command-utils.sh" + +POLKADOT_PARACHAIN="./target/$profile/polkadot-parachain" + +run_cumulus_bench() { + local artifactsDir="$ARTIFACTS_DIR" + local category=$1 + local runtimeName=$2 + local paraId=${3:-} + + local benchmarkOutput="$output_path/parachains/runtimes/$category/$runtimeName/src/weights" + local benchmarkRuntimeChain + if [[ ! -z "$paraId" ]]; then + benchmarkRuntimeChain="${runtimeName}-dev-$paraId" + else + benchmarkRuntimeChain="$runtimeName-dev" + fi + + local benchmarkMetadataOutputDir="$artifactsDir/$runtimeName" + mkdir -p "$benchmarkMetadataOutputDir" + + # Load all pallet names in an array. + echo "[+] Listing pallets for runtime $runtimeName for chain: $benchmarkRuntimeChain ..." + local pallets=($( + $POLKADOT_PARACHAIN benchmark pallet --list --chain="${benchmarkRuntimeChain}" |\ + tail -n+2 |\ + cut -d',' -f1 |\ + sort |\ + uniq + )) + + if [ ${#pallets[@]} -ne 0 ]; then + echo "[+] Benchmarking ${#pallets[@]} pallets for runtime $runtimeName for chain: $benchmarkRuntimeChain, pallets:" + for pallet in "${pallets[@]}"; do + echo " [+] $pallet" + done + else + echo "$runtimeName pallet list not found in benchmarks-ci.sh" + exit 1 + fi + + for pallet in "${pallets[@]}"; do + # (by default) do not choose output_file, like `pallet_assets.rs` because it does not work for multiple instances + # `benchmark pallet` command will decide the output_file name if there are multiple instances + local output_file="" + local extra_args="" + # a little hack for pallet_xcm_benchmarks - we want to force custom implementation for XcmWeightInfo + if [[ "$pallet" == "pallet_xcm_benchmarks::generic" ]] || [[ "$pallet" == "pallet_xcm_benchmarks::fungible" ]]; then + output_file="xcm/${pallet//::/_}.rs" + extra_args="--template=$output_path/templates/xcm-bench-template.hbs" + fi + $POLKADOT_PARACHAIN benchmark pallet \ + $extra_args \ + --chain="${benchmarkRuntimeChain}" \ + --wasm-execution=compiled \ + --pallet="$pallet" \ + --no-storage-info \ + --no-median-slopes \ + --no-min-squares \ + --extrinsic='*' \ + --steps=50 \ + --repeat=20 \ + --json \ + --header="$output_path/file_header.txt" \ + --output="${benchmarkOutput}/${output_file}" >> "$benchmarkMetadataOutputDir/${pallet//::/_}_benchmark.json" + done +} + + +echo "[+] Compiling benchmarks..." +cargo build --profile $profile --locked --features=runtime-benchmarks -p polkadot-parachain-bin + +# Run benchmarks for all pallets of a given runtime if runtime argument provided +get_arg optional --runtime "$@" +runtime="${out:-""}" + +if [[ $runtime ]]; then + paraId="" + case "$runtime" in + asset-*) + category="assets" + ;; + collectives-*) + category="collectives" + ;; + coretime-*) + category="coretime" + ;; + bridge-*) + category="bridge-hubs" + ;; + contracts-*) + category="contracts" + ;; + people-*) + category="people" + ;; + glutton-*) + category="glutton" + paraId="1300" + ;; + *) + echo "Unknown runtime: $runtime" + exit 1 + ;; + esac + + run_cumulus_bench $category $runtime $paraId + +else # run all + # Assets + run_cumulus_bench assets asset-hub-rococo + run_cumulus_bench assets asset-hub-westend + + # Collectives + run_cumulus_bench collectives collectives-westend + + # Coretime + run_cumulus_bench coretime coretime-rococo + run_cumulus_bench coretime coretime-westend + + # People + run_cumulus_bench people people-rococo + run_cumulus_bench people people-westend + + # Bridge Hubs + run_cumulus_bench bridge-hubs bridge-hub-rococo + run_cumulus_bench bridge-hubs bridge-hub-westend + + # Glutton + run_cumulus_bench glutton glutton-westend 1300 +fi diff --git a/scripts/lib/bench-all-pallet.sh b/scripts/lib/bench-all-pallet.sh new file mode 100644 index 00000000000..e6908045ddb --- /dev/null +++ b/scripts/lib/bench-all-pallet.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash + +set -eu -o pipefail +shopt -s inherit_errexit +shopt -s globstar + +. "$(dirname "${BASH_SOURCE[0]}")/../command-utils.sh" + +get_arg required --pallet "$@" +PALLET="${out:-""}" + +REPO_NAME="$(basename "$PWD")" +BASE_COMMAND="$(dirname "${BASH_SOURCE[0]}")/../../bench/bench.sh --noexit=true --subcommand=pallet" + +WEIGHT_FILE_PATHS=( $(find . -type f -name "${PALLET}.rs" -path "**/weights/*" | sed 's|^\./||g') ) + +# convert pallet_ranked_collective to ranked-collective +CLEAN_PALLET=$(echo $PALLET | sed 's/pallet_//g' | sed 's/_/-/g') + +# add substrate pallet weights to a list +SUBSTRATE_PALLET_PATH=$(ls substrate/frame/$CLEAN_PALLET/src/weights.rs || :) +if [ ! -z "${SUBSTRATE_PALLET_PATH}" ]; then + WEIGHT_FILE_PATHS+=("$SUBSTRATE_PALLET_PATH") +fi + +# add trappist pallet weights to a list +TRAPPIST_PALLET_PATH=$(ls pallet/$CLEAN_PALLET/src/weights.rs || :) +if [ ! -z "${TRAPPIST_PALLET_PATH}" ]; then + WEIGHT_FILE_PATHS+=("$TRAPPIST_PALLET_PATH") +fi + +COMMANDS=() + +if [ "${#WEIGHT_FILE_PATHS[@]}" -eq 0 ]; then + echo "No weights files found for pallet: $PALLET" + exit 1 +else + echo "Found weights files for pallet: $PALLET" +fi + +for f in ${WEIGHT_FILE_PATHS[@]}; do + echo "- $f" + # f examples: + # cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_balances.rs + # polkadot/runtime/rococo/src/weights/pallet_balances.rs + # runtime/trappist/src/weights/pallet_assets.rs + TARGET_DIR=$(echo $f | cut -d'/' -f 1) + + if [ "$REPO_NAME" == "polkadot-sdk" ]; then + case $TARGET_DIR in + cumulus) + TYPE=$(echo $f | cut -d'/' -f 2) + # Example: cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_balances.rs + if [ "$TYPE" == "parachains" ]; then + RUNTIME=$(echo $f | cut -d'/' -f 5) + RUNTIME_DIR=$(echo $f | cut -d'/' -f 4) + COMMANDS+=("$BASE_COMMAND --runtime=$RUNTIME --runtime_dir=$RUNTIME_DIR --target_dir=$TARGET_DIR --pallet=$PALLET") + fi + ;; + polkadot) + # Example: polkadot/runtime/rococo/src/weights/pallet_balances.rs + RUNTIME=$(echo $f | cut -d'/' -f 3) + COMMANDS+=("$BASE_COMMAND --runtime=$RUNTIME --target_dir=$TARGET_DIR --pallet=$PALLET") + ;; + substrate) + # Example: substrate/frame/contracts/src/weights.rs + COMMANDS+=("$BASE_COMMAND --target_dir=$TARGET_DIR --runtime=dev --pallet=$PALLET") + ;; + *) + echo "Unknown dir: $TARGET_DIR" + exit 1 + ;; + esac + fi + + if [ "$REPO_NAME" == "trappist" ]; then + case $TARGET_DIR in + runtime) + TYPE=$(echo $f | cut -d'/' -f 2) + if [ "$TYPE" == "trappist" || "$TYPE" == "stout" ]; then + # Example: runtime/trappist/src/weights/pallet_assets.rs + COMMANDS+=("$BASE_COMMAND --target_dir=trappist --runtime=$TYPE --pallet=$PALLET") + fi + ;; + *) + echo "Unknown dir: $TARGET_DIR" + exit 1 + ;; + esac + fi +done + +for cmd in "${COMMANDS[@]}"; do + echo "Running command: $cmd" + . $cmd +done diff --git a/scripts/lib/bench-all-polkadot.sh b/scripts/lib/bench-all-polkadot.sh new file mode 100644 index 00000000000..ac52e00140e --- /dev/null +++ b/scripts/lib/bench-all-polkadot.sh @@ -0,0 +1,88 @@ +#!/bin/bash + +# Runs all benchmarks for all pallets, for a given runtime, provided by $1 +# Should be run on a reference machine to gain accurate benchmarks +# current reference machine: https://github.com/paritytech/polkadot/pull/6508/files +# original source: https://github.com/paritytech/polkadot/blob/b9842c4b52f6791fef6c11ecd020b22fe614f041/scripts/run_all_benches.sh + +get_arg required --runtime "$@" +runtime="${out:-""}" + +# default RUST_LOG is error, but could be overridden +export RUST_LOG="${RUST_LOG:-error}" + +echo "[+] Compiling benchmarks..." +cargo build --profile $profile --locked --features=runtime-benchmarks -p polkadot + +POLKADOT_BIN="./target/$profile/polkadot" + +# Update the block and extrinsic overhead weights. +echo "[+] Benchmarking block and extrinsic overheads..." +OUTPUT=$( + $POLKADOT_BIN benchmark overhead \ + --chain="${runtime}-dev" \ + --wasm-execution=compiled \ + --weight-path="$output_path/runtime/${runtime}/constants/src/weights/" \ + --warmup=10 \ + --repeat=100 \ + --header="$output_path/file_header.txt" +) +if [ $? -ne 0 ]; then + echo "$OUTPUT" >> "$ERR_FILE" + echo "[-] Failed to benchmark the block and extrinsic overheads. Error written to $ERR_FILE; continuing..." +fi + + +# Load all pallet names in an array. +PALLETS=($( + $POLKADOT_BIN benchmark pallet --list --chain="${runtime}-dev" |\ + tail -n+2 |\ + cut -d',' -f1 |\ + sort |\ + uniq +)) + +echo "[+] Benchmarking ${#PALLETS[@]} pallets for runtime $runtime" + +# Define the error file. +ERR_FILE="${ARTIFACTS_DIR}/benchmarking_errors.txt" +# Delete the error file before each run. +rm -f $ERR_FILE + +# Benchmark each pallet. +for PALLET in "${PALLETS[@]}"; do + echo "[+] Benchmarking $PALLET for $runtime"; + + output_file="" + if [[ $PALLET == *"::"* ]]; then + # translates e.g. "pallet_foo::bar" to "pallet_foo_bar" + output_file="${PALLET//::/_}.rs" + fi + + OUTPUT=$( + $POLKADOT_BIN benchmark pallet \ + --chain="${runtime}-dev" \ + --steps=50 \ + --repeat=20 \ + --no-storage-info \ + --no-median-slopes \ + --no-min-squares \ + --pallet="$PALLET" \ + --extrinsic="*" \ + --execution=wasm \ + --wasm-execution=compiled \ + --header="$output_path/file_header.txt" \ + --output="$output_path/runtime/${runtime}/src/weights/${output_file}" 2>&1 + ) + if [ $? -ne 0 ]; then + echo "$OUTPUT" >> "$ERR_FILE" + echo "[-] Failed to benchmark $PALLET. Error written to $ERR_FILE; continuing..." + fi +done + +# Check if the error file exists. +if [ -f "$ERR_FILE" ]; then + echo "[-] Some benchmarks failed. See: $ERR_FILE" +else + echo "[+] All benchmarks passed." +fi diff --git a/scripts/lib/bench-all-substrate.sh b/scripts/lib/bench-all-substrate.sh new file mode 100644 index 00000000000..eeb18cdd8bb --- /dev/null +++ b/scripts/lib/bench-all-substrate.sh @@ -0,0 +1,148 @@ +#!/usr/bin/env bash + +# This file is part of Substrate. +# Copyright (C) 2022 Parity Technologies (UK) Ltd. +# SPDX-License-Identifier: Apache-2.0 +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script has three parts which all use the Substrate runtime: +# - Pallet benchmarking to update the pallet weights +# - Overhead benchmarking for the Extrinsic and Block weights +# - Machine benchmarking +# +# Should be run on a reference machine to gain accurate benchmarks +# current reference machine: https://github.com/paritytech/substrate/pull/5848 + +# Original source: https://github.com/paritytech/substrate/blob/ff9921a260a67e3a71f25c8b402cd5c7da787a96/scripts/run_all_benchmarks.sh +# Fail if any sub-command in a pipe fails, not just the last one. +set -o pipefail +# Fail on undeclared variables. +set -u +# Fail if any sub-command fails. +set -e +# Fail on traps. +# set -E + +# default RUST_LOG is warn, but could be overridden +export RUST_LOG="${RUST_LOG:-error}" + +echo "[+] Compiling Substrate benchmarks..." +cargo build --profile=$profile --locked --features=runtime-benchmarks -p staging-node-cli + +# The executable to use. +SUBSTRATE="./target/$profile/substrate-node" + +# Manually exclude some pallets. +EXCLUDED_PALLETS=( + # Helper pallets + "pallet_election_provider_support_benchmarking" + # Pallets without automatic benchmarking + "pallet_babe" + "pallet_grandpa" + "pallet_mmr" + "pallet_offences" + # Only used for testing, does not need real weights. + "frame_benchmarking_pallet_pov" + "pallet_example_tasks" + "pallet_example_basic" + "pallet_example_split" + "pallet_example_kitchensink" + "pallet_example_mbm" + "tasks_example" +) + +# Load all pallet names in an array. +ALL_PALLETS=($( + $SUBSTRATE benchmark pallet --list --chain=dev |\ + tail -n+2 |\ + cut -d',' -f1 |\ + sort |\ + uniq +)) + +# Define the error file. +ERR_FILE="${ARTIFACTS_DIR}/benchmarking_errors.txt" + +# Delete the error file before each run. +rm -f "$ERR_FILE" + +mkdir -p "$(dirname "$ERR_FILE")" + +# Update the block and extrinsic overhead weights. +echo "[+] Benchmarking block and extrinsic overheads..." +OUTPUT=$( + $SUBSTRATE benchmark overhead \ + --chain=dev \ + --wasm-execution=compiled \ + --weight-path="$output_path/frame/support/src/weights/" \ + --header="$output_path/HEADER-APACHE2" \ + --warmup=10 \ + --repeat=100 2>&1 +) +if [ $? -ne 0 ]; then + echo "$OUTPUT" >> "$ERR_FILE" + echo "[-] Failed to benchmark the block and extrinsic overheads. Error written to $ERR_FILE; continuing..." +fi + +echo "[+] Benchmarking ${#ALL_PALLETS[@]} Substrate pallets and excluding ${#EXCLUDED_PALLETS[@]}." + +echo "[+] Excluded pallets ${EXCLUDED_PALLETS[@]}" +echo "[+] ------ " +echo "[+] Whole list pallets ${ALL_PALLETS[@]}" + +# Benchmark each pallet. +for PALLET in "${ALL_PALLETS[@]}"; do + FOLDER="$(echo "${PALLET#*_}" | tr '_' '-')"; + WEIGHT_FILE="$output_path/frame/${FOLDER}/src/weights.rs" + + # Skip the pallet if it is in the excluded list. + + if [[ " ${EXCLUDED_PALLETS[@]} " =~ " ${PALLET} " ]]; then + echo "[+] Skipping $PALLET as it is in the excluded list." + continue + fi + + echo "[+] Benchmarking $PALLET with weight file $WEIGHT_FILE"; + + set +e # Disable exit on error for the benchmarking of the pallets + OUTPUT=$( + $SUBSTRATE benchmark pallet \ + --chain=dev \ + --steps=50 \ + --repeat=20 \ + --pallet="$PALLET" \ + --no-storage-info \ + --no-median-slopes \ + --no-min-squares \ + --extrinsic="*" \ + --wasm-execution=compiled \ + --heap-pages=4096 \ + --output="$WEIGHT_FILE" \ + --header="$output_path/HEADER-APACHE2" \ + --template="$output_path/.maintain/frame-weight-template.hbs" 2>&1 + ) + if [ $? -ne 0 ]; then + echo -e "$PALLET: $OUTPUT\n" >> "$ERR_FILE" + echo "[-] Failed to benchmark $PALLET. Error written to $ERR_FILE; continuing..." + fi + set -e # Re-enable exit on error +done + + +# Check if the error file exists. +if [ -s "$ERR_FILE" ]; then + echo "[-] Some benchmarks failed. See: $ERR_FILE" + exit 1 +else + echo "[+] All benchmarks passed." +fi diff --git a/scripts/lib/bench-overhead.sh b/scripts/lib/bench-overhead.sh new file mode 100644 index 00000000000..c4cca8b4c12 --- /dev/null +++ b/scripts/lib/bench-overhead.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +THIS_DIR=$(dirname "${BASH_SOURCE[0]}") +. "$THIS_DIR/../command-utils.sh" + +bench_overhead_common_args=( + -- + benchmark + overhead + --wasm-execution=compiled + --warmup=10 + --repeat=100 +) +bench_overhead() { + local args + case "$target_dir" in + substrate) + args=( + --bin=substrate + "${bench_overhead_common_args[@]}" + --header="$output_path/HEADER-APACHE2" + --weight-path="$output_path/frame/support/src/weights" + --chain="dev" + ) + ;; + polkadot) + get_arg required --runtime "$@" + local runtime="${out:-""}" + args=( + --bin=polkadot + "${bench_overhead_common_args[@]}" + --header="$output_path/file_header.txt" + --weight-path="$output_path/runtime/$runtime/constants/src/weights" + --chain="$runtime-dev" + ) + ;; + cumulus) + get_arg required --runtime "$@" + local runtime="${out:-""}" + args=( + -p=polkadot-parachain-bin + "${bench_overhead_common_args[@]}" + --header="$output_path/file_header.txt" + --weight-path="$output_path/parachains/runtimes/assets/$runtime/src/weights" + --chain="$runtime" + ) + ;; + trappist) + get_arg required --runtime "$@" + local runtime="${out:-""}" + args=( + "${bench_overhead_common_args[@]}" + --header="$output_path/templates/file_header.txt" + --weight-path="$output_path/runtime/$runtime/src/weights" + --chain="$runtime-dev" + ) + ;; + *) + die "Target Dir \"$target_dir\" is not supported in bench_overhead" + ;; + esac + + cargo_run "${args[@]}" +} + +bench_overhead "$@" diff --git a/scripts/lib/bench-pallet.sh b/scripts/lib/bench-pallet.sh new file mode 100644 index 00000000000..15eac31e3a4 --- /dev/null +++ b/scripts/lib/bench-pallet.sh @@ -0,0 +1,178 @@ +#!/bin/bash + +THIS_DIR=$(dirname "${BASH_SOURCE[0]}") +. "$THIS_DIR/../command-utils.sh" + +bench_pallet_common_args=( + -- + benchmark + pallet + --steps=50 + --repeat=20 + --extrinsic="*" + --wasm-execution=compiled + --heap-pages=4096 + --json-file="${ARTIFACTS_DIR}/bench.json" +) +bench_pallet() { + get_arg required --subcommand "$@" + local subcommand="${out:-""}" + + get_arg required --runtime "$@" + local runtime="${out:-""}" + + get_arg required --pallet "$@" + local pallet="${out:-""}" + + local args + case "$target_dir" in + substrate) + args=( + --features=runtime-benchmarks + --manifest-path="$output_path/bin/node/cli/Cargo.toml" + "${bench_pallet_common_args[@]}" + --pallet="$pallet" + --chain="$runtime" + ) + + case "$subcommand" in + pallet) + # Translates e.g. "pallet_foo::bar" to "pallet_foo_bar" + local output_dir="${pallet//::/_}" + + # Substrate benchmarks are output to the "frame" directory but they aren't + # named exactly after the $pallet argument. For example: + # - When $pallet == pallet_balances, the output folder is frame/balances + # - When $pallet == frame_benchmarking, the output folder is frame/benchmarking + # The common pattern we infer from those examples is that we should remove + # the prefix + if [[ "$output_dir" =~ ^[A-Za-z]*[^A-Za-z](.*)$ ]]; then + output_dir="${BASH_REMATCH[1]}" + fi + + # We also need to translate '_' to '-' due to the folders' naming + # conventions + output_dir="${output_dir//_/-}" + + args+=( + --header="$output_path/HEADER-APACHE2" + --output="$output_path/frame/$output_dir/src/weights.rs" + --template="$output_path/.maintain/frame-weight-template.hbs" + ) + ;; + *) + die "Subcommand $subcommand is not supported for $target_dir in bench_pallet" + ;; + esac + ;; + polkadot) + # For backward compatibility: replace "-dev" with "" + runtime=${runtime/-dev/} + + local weights_dir="$output_path/runtime/${runtime}/src/weights" + + args=( + --bin=polkadot + --features=runtime-benchmarks + "${bench_pallet_common_args[@]}" + --pallet="$pallet" + --chain="${runtime}-dev" + ) + + case "$subcommand" in + pallet) + args+=( + --header="$output_path/file_header.txt" + --output="${weights_dir}/" + ) + ;; + xcm) + args+=( + --header="$output_path/file_header.txt" + --template="$output_path/xcm/pallet-xcm-benchmarks/template.hbs" + --output="${weights_dir}/xcm/" + ) + ;; + *) + die "Subcommand $subcommand is not supported for $target_dir in bench_pallet" + ;; + esac + ;; + cumulus) + get_arg required --runtime_dir "$@" + local runtime_dir="${out:-""}" + local chain="$runtime" + + # to support specifying parachain id from runtime name (e.g. ["glutton-westend", "glutton-westend-dev-1300"]) + # If runtime ends with "-dev" or "-dev-\d+", leave as it is, otherwise concat "-dev" at the end of $chain + if [[ ! "$runtime" =~ -dev(-[0-9]+)?$ ]]; then + chain="${runtime}-dev" + fi + + # replace "-dev" or "-dev-\d+" with "" for runtime + runtime=$(echo "$runtime" | sed 's/-dev.*//g') + + args=( + -p=polkadot-parachain-bin + --features=runtime-benchmarks + "${bench_pallet_common_args[@]}" + --pallet="$pallet" + --chain="${chain}" + --header="$output_path/file_header.txt" + ) + + case "$subcommand" in + pallet) + args+=( + --output="$output_path/parachains/runtimes/$runtime_dir/$runtime/src/weights/" + ) + ;; + xcm) + mkdir -p "$output_path/parachains/runtimes/$runtime_dir/$runtime/src/weights/xcm" + args+=( + --template="$output_path/templates/xcm-bench-template.hbs" + --output="$output_path/parachains/runtimes/$runtime_dir/$runtime/src/weights/xcm/" + ) + ;; + *) + die "Subcommand $subcommand is not supported for $target_dir in bench_pallet" + ;; + esac + ;; + trappist) + local weights_dir="$output_path/runtime/$runtime/src/weights" + + args=( + --features=runtime-benchmarks + "${bench_pallet_common_args[@]}" + --pallet="$pallet" + --chain="${runtime}-dev" + --header="$output_path/templates/file_header.txt" + ) + + case "$subcommand" in + pallet) + args+=( + --output="${weights_dir}/" + ) + ;; + xcm) + args+=( + --template="$output_path/templates/xcm-bench-template.hbs" + --output="${weights_dir}/xcm/" + ) + ;; + *) + die "Subcommand $subcommand is not supported for $target_dir in bench_pallet" + ;; + esac + ;; + *) + die "Repository $target_dir is not supported in bench_pallet" + ;; + esac + + cargo_run "${args[@]}" +} + +bench_pallet "$@" diff --git a/scripts/sync.sh b/scripts/sync.sh new file mode 100755 index 00000000000..b5d8a521993 --- /dev/null +++ b/scripts/sync.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +set -eu -o pipefail + +. "$(realpath "$(dirname "${BASH_SOURCE[0]}")/command-utils.sh")" + + +# Function to check syncing status +check_syncing() { + # Send the system_health request and parse the isSyncing field + RESPONSE=$(curl -sSX POST http://127.0.0.1:9944 \ + --header 'Content-Type: application/json' \ + --data-raw '{"jsonrpc": "2.0", "method": "system_health", "params": [], "id": "1"}') + + # Check for errors in the curl command + if [ $? -ne 0 ]; then + echo "Error: Unable to send request to Polkadot node" + fi + + IS_SYNCING=$(echo $RESPONSE | jq -r '.result.isSyncing') + + # Check for errors in the jq command or missing field in the response + if [ $? -ne 0 ] || [ "$IS_SYNCING" == "null" ]; then + echo "Error: Unable to parse sync status from response" + fi + + # Return the isSyncing value + echo $IS_SYNCING +} + +main() { + get_arg required --chain "$@" + local chain="${out:-""}" + + get_arg required --type "$@" + local type="${out:-""}" + + export RUST_LOG="${RUST_LOG:-remote-ext=debug,runtime=trace}" + + cargo build --release + + cp "./target/release/polkadot" ./polkadot-bin + + # Start sync. + # "&" runs the process in the background + # "> /dev/tty" redirects the output of the process to the terminal + ./polkadot-bin --sync="$type" --chain="$chain" > "$ARTIFACTS_DIR/sync.log" 2>&1 & + + # Get the PID of process + POLKADOT_SYNC_PID=$! + + sleep 10 + + # Poll the node every 100 seconds until syncing is complete + while :; do + SYNC_STATUS="$(check_syncing)" + if [ "$SYNC_STATUS" == "true" ]; then + echo "Node is still syncing..." + sleep 100 + elif [ "$SYNC_STATUS" == "false" ]; then + echo "Node sync is complete!" + kill "$POLKADOT_SYNC_PID" # Stop the Polkadot node process once syncing is complete + exit 0 # Success + elif [[ "$SYNC_STATUS" = Error:* ]]; then + echo "$SYNC_STATUS" + exit 1 # Error + else + echo "Unknown error: $SYNC_STATUS" + exit 1 # Unknown error + fi + done +} + +main "$@" -- GitLab From 739c37bfd6df30fac0ffb9b491ee2495e1753054 Mon Sep 17 00:00:00 2001 From: Tsvetomir Dimitrov Date: Wed, 19 Jun 2024 12:58:29 +0300 Subject: [PATCH 024/130] Fix core sharing and make use of scheduling_lookahead (#4724) Implements most of https://github.com/paritytech/polkadot-sdk/issues/1797 Core sharing (two parachains or more marachains scheduled on the same core with the same `PartsOf57600` value) was not working correctly. The expected behaviour is to have Backed and Included event in each block for the paras sharing the core and the paras should take turns. E.g. for two cores we expect: Backed(a); Included(a)+Backed(b); Included(b)+Backed(a); etc. Instead of this each block contains just one event and there are a lot of gaps (blocks w/o events) during the session. Core sharing should also work when collators are building collations ahead of time TODOs: - [x] Add a zombienet test verifying that the behaviour mentioned above works. - [x] prdoc --------- Co-authored-by: alindima --- .gitlab/pipeline/zombienet/polkadot.yml | 17 ++ Cargo.lock | 1 + polkadot/node/core/backing/src/lib.rs | 88 ++++++----- polkadot/node/core/backing/src/tests/mod.rs | 45 +++++- .../src/tests/prospective_parachains.rs | 20 +++ .../core/prospective-parachains/Cargo.toml | 1 + .../core/prospective-parachains/src/lib.rs | 73 +++++---- .../core/prospective-parachains/src/tests.rs | 145 +++++++++++++----- .../src/collator_side/mod.rs | 30 ++-- .../src/collator_side/tests/mod.rs | 57 +++++-- .../tests/prospective_parachains.rs | 89 +---------- .../src/validator_side/collation.rs | 6 +- .../src/validator_side/mod.rs | 74 ++++----- .../src/validator_side/tests/mod.rs | 38 ++++- .../tests/prospective_parachains.rs | 20 +++ .../statement-distribution/src/v2/mod.rs | 42 ++--- polkadot/node/subsystem-util/src/vstaging.rs | 15 +- .../src/runtime_api_impl/vstaging.rs | 8 +- polkadot/runtime/parachains/src/scheduler.rs | 3 + polkadot/zombienet_tests/assign-core.js | 48 ++++++ .../0001-basic-3cores-6s-blocks.zndsl | 4 +- ...stic-scaling-doesnt-break-parachains.zndsl | 4 +- .../elastic_scaling/assign-core.js | 40 +---- .../functional/0015-coretime-shared-core.toml | 44 ++++++ .../0015-coretime-shared-core.zndsl | 16 ++ .../functional/0015-force-register-paras.js | 63 ++++++++ .../zombienet_tests/functional/assign-core.js | 1 + prdoc/pr_4724.prdoc | 24 +++ 28 files changed, 675 insertions(+), 341 deletions(-) create mode 100644 polkadot/zombienet_tests/assign-core.js mode change 100644 => 120000 polkadot/zombienet_tests/elastic_scaling/assign-core.js create mode 100644 polkadot/zombienet_tests/functional/0015-coretime-shared-core.toml create mode 100644 polkadot/zombienet_tests/functional/0015-coretime-shared-core.zndsl create mode 100644 polkadot/zombienet_tests/functional/0015-force-register-paras.js create mode 120000 polkadot/zombienet_tests/functional/assign-core.js create mode 100644 prdoc/pr_4724.prdoc diff --git a/.gitlab/pipeline/zombienet/polkadot.yml b/.gitlab/pipeline/zombienet/polkadot.yml index b158cbe0b5a..90251082077 100644 --- a/.gitlab/pipeline/zombienet/polkadot.yml +++ b/.gitlab/pipeline/zombienet/polkadot.yml @@ -162,6 +162,9 @@ zombienet-polkadot-elastic-scaling-0001-basic-3cores-6s-blocks: - .zombienet-polkadot-common variables: FORCED_INFRA_INSTANCE: "spot-iops" + before_script: + - !reference [.zombienet-polkadot-common, before_script] + - cp --remove-destination ${LOCAL_DIR}/assign-core.js ${LOCAL_DIR}/elastic_scaling script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh --local-dir="${LOCAL_DIR}/elastic_scaling" @@ -170,6 +173,9 @@ zombienet-polkadot-elastic-scaling-0001-basic-3cores-6s-blocks: zombienet-polkadot-elastic-scaling-0002-elastic-scaling-doesnt-break-parachains: extends: - .zombienet-polkadot-common + before_script: + - !reference [.zombienet-polkadot-common, before_script] + - cp --remove-destination ${LOCAL_DIR}/assign-core.js ${LOCAL_DIR}/elastic_scaling script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh --local-dir="${LOCAL_DIR}/elastic_scaling" @@ -199,6 +205,17 @@ zombienet-polkadot-functional-0014-chunk-fetching-network-compatibility: --local-dir="${LOCAL_DIR}/functional" --test="0014-chunk-fetching-network-compatibility.zndsl" +zombienet-polkadot-functional-0015-coretime-shared-core: + extends: + - .zombienet-polkadot-common + before_script: + - !reference [.zombienet-polkadot-common, before_script] + - cp --remove-destination ${LOCAL_DIR}/assign-core.js ${LOCAL_DIR}/functional + script: + - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh + --local-dir="${LOCAL_DIR}/functional" + --test="0015-coretime-shared-core.zndsl" + zombienet-polkadot-smoke-0001-parachains-smoke-test: extends: - .zombienet-polkadot-common diff --git a/Cargo.lock b/Cargo.lock index 113cfa06a84..bbb785a618a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13209,6 +13209,7 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "polkadot-primitives-test-helpers", + "rstest", "sc-keystore", "sp-application-crypto", "sp-core", diff --git a/polkadot/node/core/backing/src/lib.rs b/polkadot/node/core/backing/src/lib.rs index 38e8a93bb04..1bda81c5197 100644 --- a/polkadot/node/core/backing/src/lib.rs +++ b/polkadot/node/core/backing/src/lib.rs @@ -102,6 +102,7 @@ use polkadot_node_subsystem_util::{ runtime::{ self, prospective_parachains_mode, request_min_backing_votes, ProspectiveParachainsMode, }, + vstaging::{fetch_claim_queue, ClaimQueueSnapshot}, Validator, }; use polkadot_primitives::{ @@ -212,8 +213,6 @@ struct PerRelayParentState { parent: Hash, /// Session index. session_index: SessionIndex, - /// The `ParaId` assigned to the local validator at this relay parent. - assigned_para: Option, /// The `CoreIndex` assigned to the local validator at this relay parent. assigned_core: Option, /// The candidates that are backed by enough validators in their group, by hash. @@ -233,8 +232,11 @@ struct PerRelayParentState { /// If true, we're appending extra bits in the BackedCandidate validator indices bitfield, /// which represent the assigned core index. True if ElasticScalingMVP is enabled. inject_core_index: bool, - /// The core states for all cores. - cores: Vec, + /// The number of cores. + n_cores: u32, + /// Claim queue state. If the runtime API is not available, it'll be populated with info from + /// availability cores. + claim_queue: ClaimQueueSnapshot, /// The validator index -> group mapping at this relay parent. validator_to_group: Arc>>, /// The associated group rotation information. @@ -1004,20 +1006,19 @@ macro_rules! try_runtime_api { fn core_index_from_statement( validator_to_group: &IndexedVec>, group_rotation_info: &GroupRotationInfo, - cores: &[CoreState], + n_cores: u32, + claim_queue: &ClaimQueueSnapshot, statement: &SignedFullStatementWithPVD, ) -> Option { let compact_statement = statement.as_unchecked(); let candidate_hash = CandidateHash(*compact_statement.unchecked_payload().candidate_hash()); - let n_cores = cores.len(); - gum::trace!( target:LOG_TARGET, ?group_rotation_info, ?statement, ?validator_to_group, - n_cores = ?cores.len(), + n_cores, ?candidate_hash, "Extracting core index from statement" ); @@ -1029,7 +1030,7 @@ fn core_index_from_statement( ?group_rotation_info, ?statement, ?validator_to_group, - n_cores = ?cores.len() , + n_cores, ?candidate_hash, "Invalid validator index: {:?}", statement_validator_index @@ -1038,37 +1039,25 @@ fn core_index_from_statement( }; // First check if the statement para id matches the core assignment. - let core_index = group_rotation_info.core_for_group(*group_index, n_cores); + let core_index = group_rotation_info.core_for_group(*group_index, n_cores as _); - if core_index.0 as usize > n_cores { + if core_index.0 > n_cores { gum::warn!(target: LOG_TARGET, ?candidate_hash, ?core_index, n_cores, "Invalid CoreIndex"); return None } if let StatementWithPVD::Seconded(candidate, _pvd) = statement.payload() { let candidate_para_id = candidate.descriptor.para_id; - let assigned_para_id = match &cores[core_index.0 as usize] { - CoreState::Free => { - gum::debug!(target: LOG_TARGET, ?candidate_hash, "Invalid CoreIndex, core is not assigned to any para_id"); - return None - }, - CoreState::Occupied(occupied) => - if let Some(next) = &occupied.next_up_on_available { - next.para_id - } else { - return None - }, - CoreState::Scheduled(scheduled) => scheduled.para_id, - }; + let mut assigned_paras = claim_queue.iter_claims_for_core(&core_index); - if assigned_para_id != candidate_para_id { + if !assigned_paras.any(|id| id == &candidate_para_id) { gum::debug!( target: LOG_TARGET, ?candidate_hash, ?core_index, - ?assigned_para_id, + assigned_paras = ?claim_queue.iter_claims_for_core(&core_index).collect::>(), ?candidate_para_id, - "Invalid CoreIndex, core is assigned to a different para_id" + "Invalid CoreIndex, core is not assigned to this para_id" ); return None } @@ -1129,6 +1118,8 @@ async fn construct_per_relay_parent_state( Error::UtilError(TryFrom::try_from(e).expect("the conversion is infallible; qed")) })?; + let maybe_claim_queue = try_runtime_api!(fetch_claim_queue(ctx.sender(), parent).await); + let signing_context = SigningContext { parent_hash: parent, session_index }; let validator = match Validator::construct( &validators, @@ -1153,31 +1144,35 @@ async fn construct_per_relay_parent_state( let mut groups = HashMap::>::new(); let mut assigned_core = None; - let mut assigned_para = None; + + let has_claim_queue = maybe_claim_queue.is_some(); + let mut claim_queue = maybe_claim_queue.unwrap_or_default().0; for (idx, core) in cores.iter().enumerate() { - let core_para_id = match core { - CoreState::Scheduled(scheduled) => scheduled.para_id, - CoreState::Occupied(occupied) => - if mode.is_enabled() { + let core_index = CoreIndex(idx as _); + + if !has_claim_queue { + match core { + CoreState::Scheduled(scheduled) => + claim_queue.insert(core_index, [scheduled.para_id].into_iter().collect()), + CoreState::Occupied(occupied) if mode.is_enabled() => { // Async backing makes it legal to build on top of // occupied core. if let Some(next) = &occupied.next_up_on_available { - next.para_id + claim_queue.insert(core_index, [next.para_id].into_iter().collect()) } else { continue } - } else { - continue }, - CoreState::Free => continue, - }; + _ => continue, + }; + } else if !claim_queue.contains_key(&core_index) { + continue + } - let core_index = CoreIndex(idx as _); let group_index = group_rotation_info.group_for_core(core_index, n_cores); if let Some(g) = validator_groups.get(group_index.0 as usize) { if validator.as_ref().map_or(false, |v| g.contains(&v.index())) { - assigned_para = Some(core_para_id); assigned_core = Some(core_index); } groups.insert(core_index, g.clone()); @@ -1212,7 +1207,6 @@ async fn construct_per_relay_parent_state( parent, session_index, assigned_core, - assigned_para, backed: HashSet::new(), table: Table::new(table_config), table_context, @@ -1221,7 +1215,8 @@ async fn construct_per_relay_parent_state( fallbacks: HashMap::new(), minimum_backing_votes, inject_core_index, - cores, + n_cores: cores.len() as u32, + claim_queue: ClaimQueueSnapshot::from(claim_queue), validator_to_group: validator_to_group.clone(), group_rotation_info, })) @@ -1674,7 +1669,8 @@ async fn import_statement( let core = core_index_from_statement( &rp_state.validator_to_group, &rp_state.group_rotation_info, - &rp_state.cores, + rp_state.n_cores, + &rp_state.claim_queue, statement, ) .ok_or(Error::CoreIndexUnavailable)?; @@ -2098,12 +2094,14 @@ async fn handle_second_message( return Ok(()) } + let assigned_paras = rp_state.assigned_core.and_then(|core| rp_state.claim_queue.0.get(&core)); + // Sanity check that candidate is from our assignment. - if Some(candidate.descriptor().para_id) != rp_state.assigned_para { + if !matches!(assigned_paras, Some(paras) if paras.contains(&candidate.descriptor().para_id)) { gum::debug!( target: LOG_TARGET, our_assignment_core = ?rp_state.assigned_core, - our_assignment_para = ?rp_state.assigned_para, + our_assignment_paras = ?assigned_paras, collation = ?candidate.descriptor().para_id, "Subsystem asked to second for para outside of our assignment", ); @@ -2113,7 +2111,7 @@ async fn handle_second_message( gum::debug!( target: LOG_TARGET, our_assignment_core = ?rp_state.assigned_core, - our_assignment_para = ?rp_state.assigned_para, + our_assignment_paras = ?assigned_paras, collation = ?candidate.descriptor().para_id, "Current assignments vs collation", ); diff --git a/polkadot/node/core/backing/src/tests/mod.rs b/polkadot/node/core/backing/src/tests/mod.rs index bb23c7fbeb2..5f2bc7e1842 100644 --- a/polkadot/node/core/backing/src/tests/mod.rs +++ b/polkadot/node/core/backing/src/tests/mod.rs @@ -42,7 +42,10 @@ use sp_application_crypto::AppCrypto; use sp_keyring::Sr25519Keyring; use sp_keystore::Keystore; use sp_tracing as _; -use std::{collections::HashMap, time::Duration}; +use std::{ + collections::{BTreeMap, HashMap, VecDeque}, + time::Duration, +}; mod prospective_parachains; @@ -75,6 +78,7 @@ pub(crate) struct TestState { validator_groups: (Vec>, GroupRotationInfo), validator_to_group: IndexedVec>, availability_cores: Vec, + claim_queue: BTreeMap>, head_data: HashMap, signing_context: SigningContext, relay_parent: Hash, @@ -130,6 +134,10 @@ impl Default for TestState { CoreState::Scheduled(ScheduledCore { para_id: chain_b, collator: None }), ]; + let mut claim_queue = BTreeMap::new(); + claim_queue.insert(CoreIndex(0), [chain_a].into_iter().collect()); + claim_queue.insert(CoreIndex(1), [chain_b].into_iter().collect()); + let mut head_data = HashMap::new(); head_data.insert(chain_a, HeadData(vec![4, 5, 6])); head_data.insert(chain_b, HeadData(vec![5, 6, 7])); @@ -153,6 +161,7 @@ impl Default for TestState { validator_groups: (validator_groups, group_rotation_info), validator_to_group, availability_cores, + claim_queue, head_data, validation_data, signing_context, @@ -338,6 +347,26 @@ async fn test_startup(virtual_overseer: &mut VirtualOverseer, test_state: &TestS tx.send(Ok(test_state.disabled_validators.clone())).unwrap(); } ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::Version(tx)) + ) if parent == test_state.relay_parent => { + tx.send(Ok(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)).unwrap(); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::ClaimQueue(tx)) + ) if parent == test_state.relay_parent => { + tx.send(Ok( + test_state.claim_queue.clone() + )).unwrap(); + } + ); } async fn assert_validation_requests( @@ -730,11 +759,16 @@ fn get_backed_candidate_preserves_order() { // Assign the second core to the same para as the first one. test_state.availability_cores[1] = CoreState::Scheduled(ScheduledCore { para_id: test_state.chain_ids[0], collator: None }); + *test_state.claim_queue.get_mut(&CoreIndex(1)).unwrap() = + [test_state.chain_ids[0]].into_iter().collect(); // Add another availability core for paraid 2. test_state.availability_cores.push(CoreState::Scheduled(ScheduledCore { para_id: test_state.chain_ids[1], collator: None, })); + test_state + .claim_queue + .insert(CoreIndex(2), [test_state.chain_ids[1]].into_iter().collect()); test_harness(test_state.keystore.clone(), |mut virtual_overseer| async move { test_startup(&mut virtual_overseer, &test_state).await; @@ -1103,7 +1137,8 @@ fn extract_core_index_from_statement_works() { let core_index_1 = core_index_from_statement( &test_state.validator_to_group, &test_state.validator_groups.1, - &test_state.availability_cores, + test_state.availability_cores.len() as _, + &test_state.claim_queue.clone().into(), &signed_statement_1, ) .unwrap(); @@ -1113,7 +1148,8 @@ fn extract_core_index_from_statement_works() { let core_index_2 = core_index_from_statement( &test_state.validator_to_group, &test_state.validator_groups.1, - &test_state.availability_cores, + test_state.availability_cores.len() as _, + &test_state.claim_queue.clone().into(), &signed_statement_2, ); @@ -1123,7 +1159,8 @@ fn extract_core_index_from_statement_works() { let core_index_3 = core_index_from_statement( &test_state.validator_to_group, &test_state.validator_groups.1, - &test_state.availability_cores, + test_state.availability_cores.len() as _, + &test_state.claim_queue.clone().into(), &signed_statement_3, ) .unwrap(); diff --git a/polkadot/node/core/backing/src/tests/prospective_parachains.rs b/polkadot/node/core/backing/src/tests/prospective_parachains.rs index 74490c84eb1..15bc0b4a113 100644 --- a/polkadot/node/core/backing/src/tests/prospective_parachains.rs +++ b/polkadot/node/core/backing/src/tests/prospective_parachains.rs @@ -212,6 +212,26 @@ async fn activate_leaf( tx.send(Ok(Vec::new())).unwrap(); } ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::Version(tx)) + ) if parent == hash => { + tx.send(Ok(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)).unwrap(); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::ClaimQueue(tx)) + ) if parent == hash => { + tx.send(Ok( + test_state.claim_queue.clone() + )).unwrap(); + } + ); } } diff --git a/polkadot/node/core/prospective-parachains/Cargo.toml b/polkadot/node/core/prospective-parachains/Cargo.toml index f3193153be8..b9573ee9851 100644 --- a/polkadot/node/core/prospective-parachains/Cargo.toml +++ b/polkadot/node/core/prospective-parachains/Cargo.toml @@ -32,3 +32,4 @@ sc-keystore = { path = "../../../../substrate/client/keystore" } sp-application-crypto = { path = "../../../../substrate/primitives/application-crypto" } sp-keyring = { path = "../../../../substrate/primitives/keyring" } sp-keystore = { path = "../../../../substrate/primitives/keystore" } +rstest = "0.18.2" diff --git a/polkadot/node/core/prospective-parachains/src/lib.rs b/polkadot/node/core/prospective-parachains/src/lib.rs index d5bb5ff76ba..e4b6deffdf4 100644 --- a/polkadot/node/core/prospective-parachains/src/lib.rs +++ b/polkadot/node/core/prospective-parachains/src/lib.rs @@ -44,6 +44,7 @@ use polkadot_node_subsystem_util::{ inclusion_emulator::{Constraints, RelayChainBlockInfo}, request_session_index_for_child, runtime::{prospective_parachains_mode, ProspectiveParachainsMode}, + vstaging::fetch_claim_queue, }; use polkadot_primitives::{ async_backing::CandidatePendingAvailability, BlockNumber, CandidateHash, @@ -870,37 +871,51 @@ async fn fetch_backing_state( async fn fetch_upcoming_paras( ctx: &mut Context, relay_parent: Hash, -) -> JfyiErrorResult> { - let (tx, rx) = oneshot::channel(); - - // This'll have to get more sophisticated with parathreads, - // but for now we can just use the `AvailabilityCores`. - ctx.send_message(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::AvailabilityCores(tx), - )) - .await; - - let cores = rx.await.map_err(JfyiError::RuntimeApiRequestCanceled)??; - let mut upcoming = HashSet::new(); - for core in cores { - match core { - CoreState::Occupied(occupied) => { - if let Some(next_up_on_available) = occupied.next_up_on_available { - upcoming.insert(next_up_on_available.para_id); - } - if let Some(next_up_on_time_out) = occupied.next_up_on_time_out { - upcoming.insert(next_up_on_time_out.para_id); +) -> JfyiErrorResult> { + Ok(match fetch_claim_queue(ctx.sender(), relay_parent).await? { + Some(claim_queue) => { + // Runtime supports claim queue - use it + claim_queue + .iter_all_claims() + .flat_map(|(_, paras)| paras.into_iter()) + .copied() + .collect() + }, + None => { + // fallback to availability cores - remove this branch once claim queue is released + // everywhere + let (tx, rx) = oneshot::channel(); + ctx.send_message(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::AvailabilityCores(tx), + )) + .await; + + let cores = rx.await.map_err(JfyiError::RuntimeApiRequestCanceled)??; + + let mut upcoming = HashSet::with_capacity(cores.len()); + for core in cores { + match core { + CoreState::Occupied(occupied) => { + // core sharing won't work optimally with this branch because the collations + // can't be prepared in advance. + if let Some(next_up_on_available) = occupied.next_up_on_available { + upcoming.insert(next_up_on_available.para_id); + } + if let Some(next_up_on_time_out) = occupied.next_up_on_time_out { + upcoming.insert(next_up_on_time_out.para_id); + } + }, + CoreState::Scheduled(scheduled) => { + upcoming.insert(scheduled.para_id); + }, + CoreState::Free => {}, } - }, - CoreState::Scheduled(scheduled) => { - upcoming.insert(scheduled.para_id); - }, - CoreState::Free => {}, - } - } + } - Ok(upcoming.into_iter().collect()) + upcoming + }, + }) } // Fetch ancestors in descending order, up to the amount requested. diff --git a/polkadot/node/core/prospective-parachains/src/tests.rs b/polkadot/node/core/prospective-parachains/src/tests.rs index d2fc3cbd362..221fbf4c4e6 100644 --- a/polkadot/node/core/prospective-parachains/src/tests.rs +++ b/polkadot/node/core/prospective-parachains/src/tests.rs @@ -26,11 +26,15 @@ use polkadot_node_subsystem::{ use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_primitives::{ async_backing::{AsyncBackingParams, BackingState, Constraints, InboundHrmpLimitations}, - CommittedCandidateReceipt, HeadData, Header, PersistedValidationData, ScheduledCore, + CommittedCandidateReceipt, CoreIndex, HeadData, Header, PersistedValidationData, ScheduledCore, ValidationCodeHash, }; use polkadot_primitives_test_helpers::make_candidate; -use std::sync::Arc; +use rstest::rstest; +use std::{ + collections::{BTreeMap, VecDeque}, + sync::Arc, +}; use test_helpers::mock::new_leaf; const ALLOWED_ANCESTRY_LEN: u32 = 3; @@ -70,7 +74,8 @@ fn dummy_constraints( } struct TestState { - availability_cores: Vec, + claim_queue: BTreeMap>, + runtime_api_version: u32, validation_code_hash: ValidationCodeHash, } @@ -79,13 +84,23 @@ impl Default for TestState { let chain_a = ParaId::from(1); let chain_b = ParaId::from(2); - let availability_cores = vec![ - CoreState::Scheduled(ScheduledCore { para_id: chain_a, collator: None }), - CoreState::Scheduled(ScheduledCore { para_id: chain_b, collator: None }), - ]; + let mut claim_queue = BTreeMap::new(); + claim_queue.insert(CoreIndex(0), [chain_a].into_iter().collect()); + claim_queue.insert(CoreIndex(1), [chain_b].into_iter().collect()); + let validation_code_hash = Hash::repeat_byte(42).into(); - Self { availability_cores, validation_code_hash } + Self { + validation_code_hash, + claim_queue, + runtime_api_version: RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT, + } + } +} + +impl TestState { + fn set_runtime_api_version(&mut self, version: u32) { + self.runtime_api_version = version; } } @@ -227,12 +242,39 @@ async fn handle_leaf_activation( assert_matches!( virtual_overseer.recv().await, AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::AvailabilityCores(tx)) + RuntimeApiMessage::Request(parent, RuntimeApiRequest::Version(tx)) ) if parent == *hash => { - tx.send(Ok(test_state.availability_cores.clone())).unwrap(); + tx.send( + Ok(test_state.runtime_api_version) + ).unwrap(); } ); + if test_state.runtime_api_version < RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT { + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::AvailabilityCores(tx)) + ) if parent == *hash => { + tx.send(Ok(test_state.claim_queue.values().map(|paras| CoreState::Scheduled( + ScheduledCore { + para_id: *paras.front().unwrap(), + collator: None + } + )).collect())).unwrap(); + } + ); + } else { + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::ClaimQueue(tx)) + ) if parent == *hash => { + tx.send(Ok(test_state.claim_queue.clone())).unwrap(); + } + ); + } + send_block_header(virtual_overseer, *hash, *number).await; // Check that subsystem job issues a request for ancestors. @@ -277,14 +319,16 @@ async fn handle_leaf_activation( ); } - for _ in 0..test_state.availability_cores.len() { + let paras: HashSet<_> = test_state.claim_queue.values().flatten().collect(); + + for _ in 0..paras.len() { let message = virtual_overseer.recv().await; // Get the para we are working with since the order is not deterministic. - let para_id = match message { + let para_id = match &message { AllMessages::RuntimeApi(RuntimeApiMessage::Request( _, RuntimeApiRequest::ParaBackingState(p_id, _), - )) => p_id, + )) => *p_id, _ => panic!("received unexpected message {:?}", message), }; @@ -505,9 +549,18 @@ fn should_do_no_work_if_async_backing_disabled_for_leaf() { // - Two for the same leaf A (one for parachain 1 and one for parachain 2) // - One for leaf B on parachain 1 // - One for leaf C on parachain 2 +// Also tests a claim queue size larger than 1. #[test] fn introduce_candidates_basic() { - let test_state = TestState::default(); + let mut test_state = TestState::default(); + + let chain_a = ParaId::from(1); + let chain_b = ParaId::from(2); + let mut claim_queue = BTreeMap::new(); + claim_queue.insert(CoreIndex(0), [chain_a, chain_b].into_iter().collect()); + + test_state.claim_queue = claim_queue; + let view = test_harness(|mut virtual_overseer| async move { // Leaf A let leaf_a = TestLeaf { @@ -2032,9 +2085,15 @@ fn check_pvd_query() { // Test simultaneously activating and deactivating leaves, and simultaneously deactivating // multiple leaves. -#[test] -fn correctly_updates_leaves() { - let test_state = TestState::default(); +// This test is parametrised with the runtime api version. For versions that don't support the claim +// queue API, we check that av-cores are used. +#[rstest] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)] +#[case(8)] +fn correctly_updates_leaves(#[case] runtime_api_version: u32) { + let mut test_state = TestState::default(); + test_state.set_runtime_api_version(runtime_api_version); + let view = test_harness(|mut virtual_overseer| async move { // Leaf A let leaf_a = TestLeaf { @@ -2140,15 +2199,12 @@ fn correctly_updates_leaves() { fn persists_pending_availability_candidate() { let mut test_state = TestState::default(); let para_id = ParaId::from(1); - test_state.availability_cores = test_state - .availability_cores + test_state.claim_queue = test_state + .claim_queue .into_iter() - .filter(|core| match core { - CoreState::Scheduled(scheduled_core) => scheduled_core.para_id == para_id, - _ => false, - }) + .filter(|(_, paras)| matches!(paras.front(), Some(para) if para == ¶_id)) .collect(); - assert_eq!(test_state.availability_cores.len(), 1); + assert_eq!(test_state.claim_queue.len(), 1); test_harness(|mut virtual_overseer| async move { let para_head = HeadData(vec![1, 2, 3]); @@ -2237,18 +2293,15 @@ fn persists_pending_availability_candidate() { } #[test] -fn backwards_compatible() { +fn backwards_compatible_with_non_async_backing_params() { let mut test_state = TestState::default(); let para_id = ParaId::from(1); - test_state.availability_cores = test_state - .availability_cores + test_state.claim_queue = test_state + .claim_queue .into_iter() - .filter(|core| match core { - CoreState::Scheduled(scheduled_core) => scheduled_core.para_id == para_id, - _ => false, - }) + .filter(|(_, paras)| matches!(paras.front(), Some(para) if para == ¶_id)) .collect(); - assert_eq!(test_state.availability_cores.len(), 1); + assert_eq!(test_state.claim_queue.len(), 1); test_harness(|mut virtual_overseer| async move { let para_head = HeadData(vec![1, 2, 3]); @@ -2350,20 +2403,30 @@ fn uses_ancestry_only_within_session() { .await; assert_matches!( - virtual_overseer.recv().await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::AsyncBackingParams(tx)) - ) if parent == hash => { - tx.send(Ok(AsyncBackingParams { max_candidate_depth: 0, allowed_ancestry_len: ancestry_len - })).unwrap(); } - ); + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::AsyncBackingParams(tx) + )) if parent == hash => { + tx.send(Ok(AsyncBackingParams { max_candidate_depth: 0, allowed_ancestry_len: ancestry_len})).unwrap(); + }); assert_matches!( virtual_overseer.recv().await, AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::AvailabilityCores(tx)) + RuntimeApiMessage::Request(parent, RuntimeApiRequest::Version(tx)) + ) if parent == hash => { + tx.send(Ok(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)).unwrap(); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::ClaimQueue(tx)) ) if parent == hash => { - tx.send(Ok(Vec::new())).unwrap(); + tx.send(Ok(BTreeMap::new())).unwrap(); } ); diff --git a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs index 80a85420b39..5c201542eb5 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs @@ -51,6 +51,7 @@ use polkadot_node_subsystem_util::{ get_availability_cores, get_group_rotation_info, prospective_parachains_mode, ProspectiveParachainsMode, RuntimeInfo, }, + vstaging::fetch_claim_queue, TimeoutExt, }; use polkadot_primitives::{ @@ -579,22 +580,27 @@ async fn determine_cores( let cores = get_availability_cores(sender, relay_parent).await?; let n_cores = cores.len(); let mut assigned_cores = Vec::new(); + let maybe_claim_queue = fetch_claim_queue(sender, relay_parent).await?; for (idx, core) in cores.iter().enumerate() { - let core_para_id = match core { - CoreState::Scheduled(scheduled) => Some(scheduled.para_id), - CoreState::Occupied(occupied) => - if relay_parent_mode.is_enabled() { - // With async backing we don't care about the core state, - // it is only needed for figuring our validators group. - Some(occupied.candidate_descriptor.para_id) - } else { - None - }, - CoreState::Free => None, + let core_is_scheduled = match maybe_claim_queue { + Some(ref claim_queue) => { + // Runtime supports claim queue - use it. + claim_queue + .iter_claims_for_core(&CoreIndex(idx as u32)) + .any(|para| para == ¶_id) + }, + None => match core { + CoreState::Scheduled(scheduled) if scheduled.para_id == para_id => true, + CoreState::Occupied(occupied) if relay_parent_mode.is_enabled() => + // With async backing we don't care about the core state, + // it is only needed for figuring our validators group. + occupied.next_up_on_available.as_ref().map(|c| c.para_id) == Some(para_id), + _ => false, + }, }; - if core_para_id == Some(para_id) { + if core_is_scheduled { assigned_cores.push(CoreIndex::from(idx as u32)); } } diff --git a/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs b/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs index a13e99df4ab..13601ca7a00 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs @@ -16,7 +16,11 @@ use super::*; -use std::{collections::HashSet, sync::Arc, time::Duration}; +use std::{ + collections::{BTreeMap, HashSet, VecDeque}, + sync::Arc, + time::Duration, +}; use assert_matches::assert_matches; use futures::{executor, future, Future}; @@ -66,7 +70,7 @@ struct TestState { group_rotation_info: GroupRotationInfo, validator_peer_id: Vec, relay_parent: Hash, - availability_cores: Vec, + claim_queue: BTreeMap>, local_peer_id: PeerId, collator_pair: CollatorPair, session_index: SessionIndex, @@ -105,8 +109,9 @@ impl Default for TestState { let group_rotation_info = GroupRotationInfo { session_start_block: 0, group_rotation_frequency: 100, now: 1 }; - let availability_cores = - vec![CoreState::Scheduled(ScheduledCore { para_id, collator: None }), CoreState::Free]; + let mut claim_queue = BTreeMap::new(); + claim_queue.insert(CoreIndex(0), [para_id].into_iter().collect()); + claim_queue.insert(CoreIndex(1), VecDeque::new()); let relay_parent = Hash::random(); @@ -133,7 +138,7 @@ impl Default for TestState { group_rotation_info, validator_peer_id, relay_parent, - availability_cores, + claim_queue, local_peer_id, collator_pair, session_index: 1, @@ -147,17 +152,14 @@ impl TestState { pub fn with_elastic_scaling() -> Self { let mut state = Self::default(); let para_id = state.para_id; - state - .availability_cores - .push(CoreState::Scheduled(ScheduledCore { para_id, collator: None })); - state - .availability_cores - .push(CoreState::Scheduled(ScheduledCore { para_id, collator: None })); + + state.claim_queue.insert(CoreIndex(2), [para_id].into_iter().collect()); + state.claim_queue.insert(CoreIndex(3), [para_id].into_iter().collect()); state } fn current_group_validator_indices(&self) -> &[ValidatorIndex] { - let core_num = self.availability_cores.len(); + let core_num = self.claim_queue.len(); let GroupIndex(group_idx) = self.group_rotation_info.group_for_core(CoreIndex(0), core_num); &self.session_info.validator_groups.get(GroupIndex::from(group_idx)).unwrap() } @@ -395,7 +397,36 @@ async fn distribute_collation_with_receipt( RuntimeApiRequest::AvailabilityCores(tx) )) => { assert_eq!(relay_parent, _relay_parent); - tx.send(Ok(test_state.availability_cores.clone())).unwrap(); + tx.send(Ok(test_state.claim_queue.values().map(|paras| + if let Some(para) = paras.front() { + CoreState::Scheduled(ScheduledCore { para_id: *para, collator: None }) + } else { + CoreState::Free + } + ).collect())).unwrap(); + } + ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _relay_parent, + RuntimeApiRequest::Version(tx) + )) => { + assert_eq!(relay_parent, _relay_parent); + tx.send(Ok(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)).unwrap(); + } + ); + + // obtain the claim queue schedule. + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _relay_parent, + RuntimeApiRequest::ClaimQueue(tx) + )) => { + assert_eq!(relay_parent, _relay_parent); + tx.send(Ok(test_state.claim_queue.clone())).unwrap(); } ); diff --git a/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs b/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs index 0a0a85fb1f2..ea8fdb0e04f 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs @@ -19,7 +19,7 @@ use super::*; use polkadot_node_subsystem::messages::ChainApiMessage; -use polkadot_primitives::{AsyncBackingParams, Header, OccupiedCore}; +use polkadot_primitives::{AsyncBackingParams, Header}; const ASYNC_BACKING_PARAMETERS: AsyncBackingParams = AsyncBackingParams { max_candidate_depth: 4, allowed_ancestry_len: 3 }; @@ -665,90 +665,3 @@ fn advertise_and_send_collation_by_hash() { }, ) } - -/// Tests that collator distributes collation built on top of occupied core. -#[test] -fn advertise_core_occupied() { - let mut test_state = TestState::default(); - let candidate = - TestCandidateBuilder { para_id: test_state.para_id, ..Default::default() }.build(); - test_state.availability_cores[0] = CoreState::Occupied(OccupiedCore { - next_up_on_available: None, - occupied_since: 0, - time_out_at: 0, - next_up_on_time_out: None, - availability: BitVec::default(), - group_responsible: GroupIndex(0), - candidate_hash: candidate.hash(), - candidate_descriptor: candidate.descriptor, - }); - - let local_peer_id = test_state.local_peer_id; - let collator_pair = test_state.collator_pair.clone(); - - test_harness( - local_peer_id, - collator_pair, - ReputationAggregator::new(|_| true), - |mut test_harness| async move { - let virtual_overseer = &mut test_harness.virtual_overseer; - - let head_a = Hash::from_low_u64_be(128); - let head_a_num: u32 = 64; - - // Grandparent of head `a`. - let head_b = Hash::from_low_u64_be(130); - - // Set collating para id. - overseer_send(virtual_overseer, CollatorProtocolMessage::CollateOn(test_state.para_id)) - .await; - // Activated leaf is `a`, but the collation will be based on `b`. - update_view(virtual_overseer, vec![(head_a, head_a_num)], 1).await; - - let pov = PoV { block_data: BlockData(vec![1, 2, 3]) }; - let candidate = TestCandidateBuilder { - para_id: test_state.para_id, - relay_parent: head_b, - pov_hash: pov.hash(), - ..Default::default() - } - .build(); - let candidate_hash = candidate.hash(); - distribute_collation_with_receipt( - virtual_overseer, - &test_state, - head_b, - true, - candidate, - pov, - Hash::zero(), - ) - .await; - - let validators = test_state.current_group_validator_authority_ids(); - let peer_ids = test_state.current_group_validator_peer_ids(); - - connect_peer( - virtual_overseer, - peer_ids[0], - CollationVersion::V2, - Some(validators[0].clone()), - ) - .await; - expect_declare_msg_v2(virtual_overseer, &test_state, &peer_ids[0]).await; - // Peer is aware of the leaf. - send_peer_view_change(virtual_overseer, &peer_ids[0], vec![head_a]).await; - - // Collation is advertised. - expect_advertise_collation_msg( - virtual_overseer, - &peer_ids[0], - head_b, - Some(vec![candidate_hash]), - ) - .await; - - test_harness - }, - ) -} diff --git a/polkadot/node/network/collator-protocol/src/validator_side/collation.rs b/polkadot/node/network/collator-protocol/src/validator_side/collation.rs index 001df1fb3da..96ffe9f13db 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/collation.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/collation.rs @@ -270,7 +270,7 @@ impl Collations { // We don't need to fetch any other collation when we already have seconded one. CollationStatus::Seconded => None, CollationStatus::Waiting => - if !self.is_seconded_limit_reached(relay_parent_mode) { + if self.is_seconded_limit_reached(relay_parent_mode) { None } else { self.waiting_queue.pop_front() @@ -280,7 +280,7 @@ impl Collations { } } - /// Checks the limit of seconded candidates for a given para. + /// Checks the limit of seconded candidates. pub(super) fn is_seconded_limit_reached( &self, relay_parent_mode: ProspectiveParachainsMode, @@ -293,7 +293,7 @@ impl Collations { } else { 1 }; - self.seconded_count < seconded_limit + self.seconded_count >= seconded_limit } } diff --git a/polkadot/node/network/collator-protocol/src/validator_side/mod.rs b/polkadot/node/network/collator-protocol/src/validator_side/mod.rs index 9f037a983e5..f5c9726f3f6 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/mod.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/mod.rs @@ -19,7 +19,7 @@ use futures::{ }; use futures_timer::Delay; use std::{ - collections::{hash_map::Entry, HashMap, HashSet}, + collections::{hash_map::Entry, HashMap, HashSet, VecDeque}, future::Future, time::{Duration, Instant}, }; @@ -51,6 +51,7 @@ use polkadot_node_subsystem_util::{ backing_implicit_view::View as ImplicitView, reputation::{ReputationAggregator, REPUTATION_CHANGE_INTERVAL}, runtime::{prospective_parachains_mode, ProspectiveParachainsMode}, + vstaging::fetch_claim_queue, }; use polkadot_primitives::{ CandidateHash, CollatorId, CoreState, Hash, HeadData, Id as ParaId, OccupiedCoreAssumption, @@ -362,8 +363,8 @@ impl PeerData { #[derive(Debug)] struct GroupAssignments { - /// Current assignment. - current: Option, + /// Current assignments. + current: Vec, } struct PerRelayParent { @@ -376,7 +377,7 @@ impl PerRelayParent { fn new(mode: ProspectiveParachainsMode) -> Self { Self { prospective_parachains_mode: mode, - assignment: GroupAssignments { current: None }, + assignment: GroupAssignments { current: vec![] }, collations: Collations::default(), } } @@ -491,34 +492,34 @@ where .await .map_err(Error::CancelledAvailabilityCores)??; - let para_now = match polkadot_node_subsystem_util::signing_key_and_index(&validators, keystore) - .and_then(|(_, index)| polkadot_node_subsystem_util::find_validator_group(&groups, index)) - { - Some(group) => { - let core_now = rotation_info.core_for_group(group, cores.len()); - - cores.get(core_now.0 as usize).and_then(|c| match c { - CoreState::Occupied(core) if relay_parent_mode.is_enabled() => Some(core.para_id()), - CoreState::Scheduled(core) => Some(core.para_id), - CoreState::Occupied(_) | CoreState::Free => None, - }) - }, - None => { - gum::trace!(target: LOG_TARGET, ?relay_parent, "Not a validator"); - - return Ok(()) - }, + let core_now = if let Some(group) = + polkadot_node_subsystem_util::signing_key_and_index(&validators, keystore).and_then( + |(_, index)| polkadot_node_subsystem_util::find_validator_group(&groups, index), + ) { + rotation_info.core_for_group(group, cores.len()) + } else { + gum::trace!(target: LOG_TARGET, ?relay_parent, "Not a validator"); + return Ok(()) }; - // This code won't work well, if at all for on-demand parachains. For on-demand we'll - // have to be aware of which core the on-demand claim is going to be multiplexed - // onto. The on-demand claim will also have a known collator, and we should always - // allow an incoming connection from that collator. If not even connecting to them - // directly. - // - // However, this'll work fine for parachains, as each parachain gets a dedicated - // core. - if let Some(para_id) = para_now.as_ref() { + let paras_now = match fetch_claim_queue(sender, relay_parent).await.map_err(Error::Runtime)? { + // Runtime supports claim queue - use it + // + // `relay_parent_mode` is not examined here because if the runtime supports claim queue + // then it supports async backing params too (`ASYNC_BACKING_STATE_RUNTIME_REQUIREMENT` + // < `CLAIM_QUEUE_RUNTIME_REQUIREMENT`). + Some(mut claim_queue) => claim_queue.0.remove(&core_now), + // Claim queue is not supported by the runtime - use availability cores instead. + None => cores.get(core_now.0 as usize).and_then(|c| match c { + CoreState::Occupied(core) if relay_parent_mode.is_enabled() => + core.next_up_on_available.as_ref().map(|c| [c.para_id].into_iter().collect()), + CoreState::Scheduled(core) => Some([core.para_id].into_iter().collect()), + CoreState::Occupied(_) | CoreState::Free => None, + }), + } + .unwrap_or_else(|| VecDeque::new()); + + for para_id in paras_now.iter() { let entry = current_assignments.entry(*para_id).or_default(); *entry += 1; if *entry == 1 { @@ -531,7 +532,7 @@ where } } - *group_assignment = GroupAssignments { current: para_now }; + *group_assignment = GroupAssignments { current: paras_now.into_iter().collect() }; Ok(()) } @@ -542,7 +543,7 @@ fn remove_outgoing( ) { let GroupAssignments { current, .. } = per_relay_parent.assignment; - if let Some(cur) = current { + for cur in current { if let Entry::Occupied(mut occupied) = current_assignments.entry(cur) { *occupied.get_mut() -= 1; if *occupied.get() == 0 { @@ -857,7 +858,8 @@ async fn process_incoming_peer_message( peer_id = ?origin, ?collator_id, ?para_id, - "Declared as collator for unneeded para", + "Declared as collator for unneeded para. Current assignments: {:?}", + &state.current_assignments ); modify_reputation( @@ -1089,7 +1091,7 @@ where peer_data.collating_para().ok_or(AdvertisementError::UndeclaredCollator)?; // Check if this is assigned to us. - if assignment.current.map_or(true, |id| id != collator_para_id) { + if !assignment.current.contains(&collator_para_id) { return Err(AdvertisementError::InvalidAssignment) } @@ -1105,7 +1107,7 @@ where ) .map_err(AdvertisementError::Invalid)?; - if !per_relay_parent.collations.is_seconded_limit_reached(relay_parent_mode) { + if per_relay_parent.collations.is_seconded_limit_reached(relay_parent_mode) { return Err(AdvertisementError::SecondedLimitReached) } @@ -1197,7 +1199,7 @@ where }); let collations = &mut per_relay_parent.collations; - if !collations.is_seconded_limit_reached(relay_parent_mode) { + if collations.is_seconded_limit_reached(relay_parent_mode) { gum::trace!( target: LOG_TARGET, peer_id = ?peer_id, diff --git a/polkadot/node/network/collator-protocol/src/validator_side/tests/mod.rs b/polkadot/node/network/collator-protocol/src/validator_side/tests/mod.rs index 3f4459d8e65..44e25efd4df 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/tests/mod.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/tests/mod.rs @@ -21,7 +21,12 @@ use sc_network::ProtocolName; use sp_core::{crypto::Pair, Encode}; use sp_keyring::Sr25519Keyring; use sp_keystore::Keystore; -use std::{iter, sync::Arc, time::Duration}; +use std::{ + collections::{BTreeMap, VecDeque}, + iter, + sync::Arc, + time::Duration, +}; use polkadot_node_network_protocol::{ our_view, @@ -37,7 +42,7 @@ use polkadot_node_subsystem::{ use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_node_subsystem_util::{reputation::add_reputation, TimeoutExt}; use polkadot_primitives::{ - CandidateReceipt, CollatorPair, CoreState, GroupIndex, GroupRotationInfo, HeadData, + CandidateReceipt, CollatorPair, CoreIndex, CoreState, GroupIndex, GroupRotationInfo, HeadData, OccupiedCore, PersistedValidationData, ScheduledCore, ValidatorId, ValidatorIndex, }; use polkadot_primitives_test_helpers::{ @@ -71,6 +76,7 @@ struct TestState { validator_groups: Vec>, group_rotation_info: GroupRotationInfo, cores: Vec, + claim_queue: BTreeMap>, } impl Default for TestState { @@ -104,7 +110,7 @@ impl Default for TestState { CoreState::Scheduled(ScheduledCore { para_id: chain_ids[0], collator: None }), CoreState::Free, CoreState::Occupied(OccupiedCore { - next_up_on_available: None, + next_up_on_available: Some(ScheduledCore { para_id: chain_ids[1], collator: None }), occupied_since: 0, time_out_at: 1, next_up_on_time_out: None, @@ -120,6 +126,11 @@ impl Default for TestState { }), ]; + let mut claim_queue = BTreeMap::new(); + claim_queue.insert(CoreIndex(0), [chain_ids[0]].into_iter().collect()); + claim_queue.insert(CoreIndex(1), VecDeque::new()); + claim_queue.insert(CoreIndex(2), [chain_ids[1]].into_iter().collect()); + Self { chain_ids, relay_parent, @@ -128,6 +139,7 @@ impl Default for TestState { validator_groups, group_rotation_info, cores, + claim_queue, } } } @@ -264,6 +276,26 @@ async fn respond_to_core_info_queries( let _ = tx.send(Ok(test_state.cores.clone())); } ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _, + RuntimeApiRequest::Version(tx), + )) => { + let _ = tx.send(Ok(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)); + } + ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _, + RuntimeApiRequest::ClaimQueue(tx), + )) => { + let _ = tx.send(Ok(test_state.claim_queue.clone())); + } + ); } /// Assert that the next message is a `CandidateBacking(Second())`. diff --git a/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs b/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs index 178dcb85e03..472731b506a 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs @@ -72,6 +72,26 @@ async fn assert_assign_incoming( tx.send(Ok(test_state.cores.clone())).unwrap(); } ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::Version(tx), + )) if parent == hash => { + let _ = tx.send(Ok(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)); + } + ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::ClaimQueue(tx), + )) if parent == hash => { + let _ = tx.send(Ok(test_state.claim_queue.clone())); + } + ); } /// Handle a view update. diff --git a/polkadot/node/network/statement-distribution/src/v2/mod.rs b/polkadot/node/network/statement-distribution/src/v2/mod.rs index 73416b193bb..2bb9c82c6a6 100644 --- a/polkadot/node/network/statement-distribution/src/v2/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/mod.rs @@ -195,8 +195,8 @@ struct ActiveValidatorState { index: ValidatorIndex, // our validator group group: GroupIndex, - // the assignment of our validator group, if any. - assignment: Option, + // the assignments of our validator group, if any. + assignments: Vec, // the 'direct-in-group' communication at this relay-parent. cluster_tracker: ClusterTracker, } @@ -740,8 +740,8 @@ fn find_active_validator_state( let our_group = groups.by_validator_index(validator_index)?; let core_index = group_rotation_info.core_for_group(our_group, availability_cores.len()); - let para_assigned_to_core = if let Some(claim_queue) = maybe_claim_queue { - claim_queue.get_claim_for(core_index, 0) + let paras_assigned_to_core = if let Some(claim_queue) = maybe_claim_queue { + claim_queue.iter_claims_for_core(&core_index).copied().collect() } else { availability_cores .get(core_index.0 as usize) @@ -753,6 +753,8 @@ fn find_active_validator_state( .map(|scheduled_core| scheduled_core.para_id), CoreState::Free | CoreState::Occupied(_) => None, }) + .into_iter() + .collect() }; let group_validators = groups.get(our_group)?.to_owned(); @@ -760,7 +762,7 @@ fn find_active_validator_state( active: Some(ActiveValidatorState { index: validator_index, group: our_group, - assignment: para_assigned_to_core, + assignments: paras_assigned_to_core, cluster_tracker: ClusterTracker::new(group_validators, seconding_limit) .expect("group is non-empty because we are in it; qed"), }), @@ -1162,10 +1164,10 @@ pub(crate) async fn share_local_statement( None => return Ok(()), }; - let (local_index, local_assignment, local_group) = + let (local_index, local_assignments, local_group) = match per_relay_parent.active_validator_state() { None => return Err(JfyiError::InvalidShare), - Some(l) => (l.index, l.assignment, l.group), + Some(l) => (l.index, &l.assignments, l.group), }; // Two possibilities: either the statement is `Seconded` or we already @@ -1203,7 +1205,7 @@ pub(crate) async fn share_local_statement( return Err(JfyiError::InvalidShare) } - if local_assignment != Some(expected_para) || relay_parent != expected_relay_parent { + if !local_assignments.contains(&expected_para) || relay_parent != expected_relay_parent { return Err(JfyiError::InvalidShare) } @@ -2144,12 +2146,11 @@ async fn determine_groups_per_para( let n_cores = availability_cores.len(); // Determine the core indices occupied by each para at the current relay parent. To support - // on-demand parachains we also consider the core indices at next block if core has a candidate - // pending availability. - let para_core_indices: Vec<_> = if let Some(claim_queue) = maybe_claim_queue { + // on-demand parachains we also consider the core indices at next blocks. + let schedule: HashMap> = if let Some(claim_queue) = maybe_claim_queue { claim_queue - .iter_claims_at_depth(0) - .map(|(core_index, para)| (para, core_index)) + .iter_all_claims() + .map(|(core_index, paras)| (*core_index, paras.iter().copied().collect())) .collect() } else { availability_cores @@ -2157,12 +2158,12 @@ async fn determine_groups_per_para( .enumerate() .filter_map(|(index, core)| match core { CoreState::Scheduled(scheduled_core) => - Some((scheduled_core.para_id, CoreIndex(index as u32))), + Some((CoreIndex(index as u32), vec![scheduled_core.para_id])), CoreState::Occupied(occupied_core) => if max_candidate_depth >= 1 { - occupied_core - .next_up_on_available - .map(|scheduled_core| (scheduled_core.para_id, CoreIndex(index as u32))) + occupied_core.next_up_on_available.map(|scheduled_core| { + (CoreIndex(index as u32), vec![scheduled_core.para_id]) + }) } else { None }, @@ -2173,9 +2174,12 @@ async fn determine_groups_per_para( let mut groups_per_para = HashMap::new(); // Map from `CoreIndex` to `GroupIndex` and collect as `HashMap`. - for (para, core_index) in para_core_indices { + for (core_index, paras) in schedule { let group_index = group_rotation_info.group_for_core(core_index, n_cores); - groups_per_para.entry(para).or_insert_with(Vec::new).push(group_index) + + for para in paras { + groups_per_para.entry(para).or_insert_with(Vec::new).push(group_index); + } } groups_per_para diff --git a/polkadot/node/subsystem-util/src/vstaging.rs b/polkadot/node/subsystem-util/src/vstaging.rs index b166a54f75c..b6cd73f412b 100644 --- a/polkadot/node/subsystem-util/src/vstaging.rs +++ b/polkadot/node/subsystem-util/src/vstaging.rs @@ -31,7 +31,7 @@ const LOG_TARGET: &'static str = "parachain::subsystem-util-vstaging"; /// A snapshot of the runtime claim queue at an arbitrary relay chain block. #[derive(Default)] -pub struct ClaimQueueSnapshot(BTreeMap>); +pub struct ClaimQueueSnapshot(pub BTreeMap>); impl From>> for ClaimQueueSnapshot { fn from(claim_queue_snapshot: BTreeMap>) -> Self { @@ -56,6 +56,19 @@ impl ClaimQueueSnapshot { .iter() .filter_map(move |(core_index, paras)| Some((*core_index, *paras.get(depth)?))) } + + /// Returns an iterator over all claims on the given core. + pub fn iter_claims_for_core( + &self, + core_index: &CoreIndex, + ) -> impl Iterator + '_ { + self.0.get(core_index).map(|c| c.iter()).into_iter().flatten() + } + + /// Returns an iterator over the whole claim queue. + pub fn iter_all_claims(&self) -> impl Iterator)> + '_ { + self.0.iter() + } } // TODO: https://github.com/paritytech/polkadot-sdk/issues/1940 diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs b/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs index 62e96e9fbb0..f4e3db185fe 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs @@ -28,10 +28,10 @@ use sp_std::{ pub fn claim_queue() -> BTreeMap> { let now = >::block_number() + One::one(); - // This explicit update is only strictly required for session boundaries: - // - // At the end of a session we clear the claim queues: Without this update call, nothing would be - // scheduled to the client. + // This is needed so that the claim queue always has the right size (equal to + // scheduling_lookahead). Otherwise, if a candidate is backed in the same block where the + // previous candidate is included, the claim queue will have already pop()-ed the next item + // from the queue and the length would be `scheduling_lookahead - 1`. >::free_cores_and_fill_claim_queue(Vec::new(), now); let config = configuration::ActiveConfig::::get(); // Extra sanity, config should already never be smaller than 1: diff --git a/polkadot/runtime/parachains/src/scheduler.rs b/polkadot/runtime/parachains/src/scheduler.rs index 33b4d849c49..d7fe5c06863 100644 --- a/polkadot/runtime/parachains/src/scheduler.rs +++ b/polkadot/runtime/parachains/src/scheduler.rs @@ -351,6 +351,9 @@ impl Pallet { } /// Note that the given cores have become occupied. Update the claim queue accordingly. + /// This will not push a new entry onto the claim queue, so the length after this call will be + /// the expected length - 1. The claim_queue runtime API will take care of adding another entry + /// here, to ensure the right lookahead. pub(crate) fn occupied( now_occupied: BTreeMap, ) -> BTreeMap { diff --git a/polkadot/zombienet_tests/assign-core.js b/polkadot/zombienet_tests/assign-core.js new file mode 100644 index 00000000000..5ddb86930f5 --- /dev/null +++ b/polkadot/zombienet_tests/assign-core.js @@ -0,0 +1,48 @@ +async function run(nodeName, networkInfo, args) { + const wsUri = networkInfo.nodesByName[nodeName].wsUri; + const api = await zombie.connect(wsUri); + + let core = Number(args[0]); + + let assignments = []; + + for (let i = 1; i < args.length; i += 2) { + let [para, parts] = [args[i], args[i + 1]]; + + console.log(`Assigning para ${para} to core ${core}`); + + assignments.push( + [{ task: para }, parts] + ); + } + await zombie.util.cryptoWaitReady(); + + // account to submit tx + const keyring = new zombie.Keyring({ type: "sr25519" }); + const alice = keyring.addFromUri("//Alice"); + + await new Promise(async (resolve, reject) => { + const unsub = await api.tx.sudo + .sudo(api.tx.coretime.assignCore(core, 0, assignments, null)) + .signAndSend(alice, ({ status, isError }) => { + if (status.isInBlock) { + console.log( + `Transaction included at blockhash ${status.asInBlock}`, + ); + } else if (status.isFinalized) { + console.log( + `Transaction finalized at blockHash ${status.asFinalized}`, + ); + unsub(); + return resolve(); + } else if (isError) { + console.log(`Transaction error`); + reject(`Transaction error`); + } + }); + }); + + return 0; +} + +module.exports = { run }; diff --git a/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.zndsl b/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.zndsl index d624cbaf9df..d47ef8f415f 100644 --- a/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.zndsl +++ b/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.zndsl @@ -11,8 +11,8 @@ elastic-validator-4: reports node_roles is 4 # Register 2 extra cores to this some-parachain. -elastic-validator-0: js-script ./assign-core.js with "2000,0" return is 0 within 600 seconds -elastic-validator-0: js-script ./assign-core.js with "2000,1" return is 0 within 600 seconds +elastic-validator-0: js-script ./assign-core.js with "0,2000,57600" return is 0 within 600 seconds +elastic-validator-0: js-script ./assign-core.js with "1,2000,57600" return is 0 within 600 seconds # Wait for 20 relay chain blocks elastic-validator-0: reports substrate_block_height{status="best"} is at least 20 within 600 seconds diff --git a/polkadot/zombienet_tests/elastic_scaling/0002-elastic-scaling-doesnt-break-parachains.zndsl b/polkadot/zombienet_tests/elastic_scaling/0002-elastic-scaling-doesnt-break-parachains.zndsl index 900a3befbc6..7ba896e1c90 100644 --- a/polkadot/zombienet_tests/elastic_scaling/0002-elastic-scaling-doesnt-break-parachains.zndsl +++ b/polkadot/zombienet_tests/elastic_scaling/0002-elastic-scaling-doesnt-break-parachains.zndsl @@ -11,8 +11,8 @@ validator: reports substrate_block_height{status="finalized"} is at least 10 wit validator: parachain 2000 block height is at least 10 within 200 seconds # Register the second core assigned to this parachain. -alice: js-script ./assign-core.js with "2000,0" return is 0 within 600 seconds -alice: js-script ./assign-core.js with "2000,1" return is 0 within 600 seconds +alice: js-script ./assign-core.js with "0,2000,57600" return is 0 within 600 seconds +alice: js-script ./assign-core.js with "0,2000,57600" return is 0 within 600 seconds validator: reports substrate_block_height{status="finalized"} is at least 35 within 100 seconds diff --git a/polkadot/zombienet_tests/elastic_scaling/assign-core.js b/polkadot/zombienet_tests/elastic_scaling/assign-core.js deleted file mode 100644 index add63b6d308..00000000000 --- a/polkadot/zombienet_tests/elastic_scaling/assign-core.js +++ /dev/null @@ -1,39 +0,0 @@ -async function run(nodeName, networkInfo, args) { - const wsUri = networkInfo.nodesByName[nodeName].wsUri; - const api = await zombie.connect(wsUri); - - let para = Number(args[0]); - let core = Number(args[1]); - console.log(`Assigning para ${para} to core ${core}`); - - await zombie.util.cryptoWaitReady(); - - // account to submit tx - const keyring = new zombie.Keyring({ type: "sr25519" }); - const alice = keyring.addFromUri("//Alice"); - - await new Promise(async (resolve, reject) => { - const unsub = await api.tx.sudo - .sudo(api.tx.coretime.assignCore(core, 0, [[{ task: para }, 57600]], null)) - .signAndSend(alice, ({ status, isError }) => { - if (status.isInBlock) { - console.log( - `Transaction included at blockhash ${status.asInBlock}`, - ); - } else if (status.isFinalized) { - console.log( - `Transaction finalized at blockHash ${status.asFinalized}`, - ); - unsub(); - return resolve(); - } else if (isError) { - console.log(`Transaction error`); - reject(`Transaction error`); - } - }); - }); - - return 0; -} - -module.exports = { run }; diff --git a/polkadot/zombienet_tests/elastic_scaling/assign-core.js b/polkadot/zombienet_tests/elastic_scaling/assign-core.js new file mode 120000 index 00000000000..eeb6402c06f --- /dev/null +++ b/polkadot/zombienet_tests/elastic_scaling/assign-core.js @@ -0,0 +1 @@ +../assign-core.js \ No newline at end of file diff --git a/polkadot/zombienet_tests/functional/0015-coretime-shared-core.toml b/polkadot/zombienet_tests/functional/0015-coretime-shared-core.toml new file mode 100644 index 00000000000..fed30e0db05 --- /dev/null +++ b/polkadot/zombienet_tests/functional/0015-coretime-shared-core.toml @@ -0,0 +1,44 @@ +[settings] +timeout = 1000 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.async_backing_params] + max_candidate_depth = 3 + allowed_ancestry_len = 2 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 1 + lookahead = 2 + num_cores = 4 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.approval_voting_params] + needed_approvals = 3 + +[relaychain] +default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" +chain = "rococo-local" +command = "polkadot" + + [[relaychain.node_groups]] + name = "validator" + args = ["-lruntime=debug,parachain=debug,parachain::backing=trace,parachain::collator-protocol=trace,parachain::prospective-parachains=trace,runtime::parachains::scheduler=trace,runtime::inclusion-inherent=trace,runtime::inclusion=trace" ] + count = 4 + +{% for id in range(2000,2004) %} +[[parachains]] +id = {{id}} +register_para = false +onboard_as_parachain = false +add_to_genesis = false +chain = "glutton-westend-local-{{id}}" + [parachains.genesis.runtimeGenesis.patch.glutton] + compute = "50000000" + storage = "2500000000" + trashDataCount = 5120 + + [parachains.collator] + name = "collator-{{id}}" + image = "{{CUMULUS_IMAGE}}" + command = "polkadot-parachain" + args = ["-lparachain=debug"] + +{% endfor %} diff --git a/polkadot/zombienet_tests/functional/0015-coretime-shared-core.zndsl b/polkadot/zombienet_tests/functional/0015-coretime-shared-core.zndsl new file mode 100644 index 00000000000..b8b8887df85 --- /dev/null +++ b/polkadot/zombienet_tests/functional/0015-coretime-shared-core.zndsl @@ -0,0 +1,16 @@ +Description: CT shared core test +Network: ./0015-coretime-shared-core.toml +Creds: config + +validator: reports node_roles is 4 + +# register paras 2 by 2 to speed up the test. registering all at once will exceed the weight limit. +validator-0: js-script ./0015-force-register-paras.js with "2000,2001" return is 0 within 600 seconds +validator-0: js-script ./0015-force-register-paras.js with "2002,2003" return is 0 within 600 seconds +# assign core 0 to be shared by all paras. +validator-0: js-script ./assign-core.js with "0,2000,14400,2001,14400,2002,14400,2003,14400" return is 0 within 600 seconds + +collator-2000: reports block height is at least 6 within 200 seconds +collator-2001: reports block height is at least 6 within 50 seconds +collator-2002: reports block height is at least 6 within 50 seconds +collator-2003: reports block height is at least 6 within 50 seconds diff --git a/polkadot/zombienet_tests/functional/0015-force-register-paras.js b/polkadot/zombienet_tests/functional/0015-force-register-paras.js new file mode 100644 index 00000000000..f82163b0110 --- /dev/null +++ b/polkadot/zombienet_tests/functional/0015-force-register-paras.js @@ -0,0 +1,63 @@ +async function run(nodeName, networkInfo, args) { + const init = networkInfo.nodesByName[nodeName]; + let wsUri = init.wsUri; + let userDefinedTypes = init.userDefinedTypes; + const api = await zombie.connect(wsUri, userDefinedTypes); + + // account to submit tx + const keyring = new zombie.Keyring({ type: "sr25519" }); + const alice = keyring.addFromUri("//Alice"); + + let calls = []; + + for (let i = 0; i < args.length; i++) { + let para = args[i]; + const sec = networkInfo.nodesByName["collator-" + para]; + const api_collator = await zombie.connect(sec.wsUri, sec.userDefinedTypes); + + await zombie.util.cryptoWaitReady(); + + // Get the genesis header and the validation code of the parachain + const genesis_header = await api_collator.rpc.chain.getHeader(); + const validation_code = await api_collator.rpc.state.getStorage("0x3A636F6465"); + + calls.push( + api.tx.paras.addTrustedValidationCode(validation_code.toHex()) + ); + calls.push( + api.tx.registrar.forceRegister( + alice.address, + 0, + Number(para), + genesis_header.toHex(), + validation_code.toHex(), + ) + ); + } + + const sudo_batch = api.tx.sudo.sudo(api.tx.utility.batch(calls)); + + await new Promise(async (resolve, reject) => { + const unsub = await sudo_batch + .signAndSend(alice, ({ status, isError }) => { + if (status.isInBlock) { + console.log( + `Transaction included at blockhash ${status.asInBlock}`, + ); + } else if (status.isFinalized) { + console.log( + `Transaction finalized at blockHash ${status.asFinalized}`, + ); + unsub(); + return resolve(); + } else if (isError) { + console.log(`Transaction error`); + reject(`Transaction error`); + } + }); + }); + + return 0; +} + +module.exports = { run }; diff --git a/polkadot/zombienet_tests/functional/assign-core.js b/polkadot/zombienet_tests/functional/assign-core.js new file mode 120000 index 00000000000..eeb6402c06f --- /dev/null +++ b/polkadot/zombienet_tests/functional/assign-core.js @@ -0,0 +1 @@ +../assign-core.js \ No newline at end of file diff --git a/prdoc/pr_4724.prdoc b/prdoc/pr_4724.prdoc new file mode 100644 index 00000000000..3723c2a7024 --- /dev/null +++ b/prdoc/pr_4724.prdoc @@ -0,0 +1,24 @@ +title: Fix core sharing and make use of scheduling_lookahead during backing + +doc: + - audience: Node Dev + description: | + Core sharing (two or more parachains scheduled on the same core with interlaced assignments) was not working correctly. + Adds the neccessary fixes to the backing subsystems. Moreover, adds support for backing collations which are built + and advertised ahead of time (with up to `scheduling_lookahead` relay chain blocks in advance). + +crates: + - name: polkadot-node-core-backing + bump: patch + - name: polkadot-node-core-prospective-parachains + bump: patch + - name: polkadot-collator-protocol + bump: patch + - name: polkadot-statement-distribution + bump: patch + - name: polkadot-node-subsystem-util + bump: minor + - name: polkadot-runtime-parachains + bump: none + - name: polkadot + bump: none -- GitLab From 4389aafb7f5f85b6fe7199ef7c428d09b2e89191 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 19 Jun 2024 15:49:35 +0200 Subject: [PATCH 025/130] Update bridges zombienet tests relay version (#4821) --- docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile index 196ba861f50..e17952ccee8 100644 --- a/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile +++ b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile @@ -1,7 +1,7 @@ # this image is built on top of existing Zombienet image ARG ZOMBIENET_IMAGE # this image uses substrate-relay image built elsewhere -ARG SUBSTRATE_RELAY_IMAGE=docker.io/paritytech/substrate-relay:v1.5.0 +ARG SUBSTRATE_RELAY_IMAGE=docker.io/paritytech/substrate-relay:v1.6.4 # metadata ARG VCS_REF -- GitLab From 9f09169e1518b623d00968337cdaf55f5eff7b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 19 Jun 2024 17:10:33 +0200 Subject: [PATCH 026/130] Fix CLI pruning params (#4836) `ValueEnum` is apparently not using the `from_str`... Closes: https://github.com/paritytech/polkadot-sdk/issues/4828 --- .../client/cli/src/params/pruning_params.rs | 81 +++++++++++++------ 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/substrate/client/cli/src/params/pruning_params.rs b/substrate/client/cli/src/params/pruning_params.rs index 88ae006c638..6b7b0e7ffa9 100644 --- a/substrate/client/cli/src/params/pruning_params.rs +++ b/substrate/client/cli/src/params/pruning_params.rs @@ -17,7 +17,7 @@ // along with this program. If not, see . use crate::error; -use clap::{builder::PossibleValue, Args, ValueEnum}; +use clap::Args; use sc_service::{BlocksPruning, PruningMode}; /// Parameters to define the pruning mode @@ -30,23 +30,38 @@ pub struct PruningParams { /// This setting can only be set on the first creation of the database. Every subsequent run /// will load the pruning mode from the database and will error if the stored mode doesn't /// match this CLI value. It is fine to drop this CLI flag for subsequent runs. The only - /// exception is that `` can change between subsequent runs (increasing it will not + /// exception is that `NUMBER` can change between subsequent runs (increasing it will not /// lead to restoring pruned state). /// + /// Possible values: + /// + /// - archive: Keep the data of all blocks. + /// + /// - archive-canonical: Keep only the data of finalized blocks. + /// + /// - NUMBER: Keep the data of the last NUMBER of finalized blocks. + /// /// [default: 256] - #[arg(alias = "pruning", long, value_name = "PRUNING_MODE", value_enum)] + #[arg(alias = "pruning", long, value_name = "PRUNING_MODE")] pub state_pruning: Option, /// Specify the blocks pruning mode. /// /// This mode specifies when the block's body (including justifications) /// should be pruned (ie, removed) from the database. + /// + /// Possible values: + /// + /// - archive: Keep the data of all blocks. + /// + /// - archive-canonical: Keep only the data of finalized blocks. + /// + /// - NUMBER: Keep the data of the last NUMBER of finalized blocks. #[arg( alias = "keep-blocks", long, value_name = "PRUNING_MODE", - default_value_t = DatabasePruningMode::ArchiveCanonical, - value_enum + default_value = "archive-canonical" )] pub blocks_pruning: DatabasePruningMode, } @@ -78,26 +93,6 @@ pub enum DatabasePruningMode { Custom(u32), } -impl ValueEnum for DatabasePruningMode { - fn value_variants<'a>() -> &'a [Self] { - &[Self::Archive, Self::ArchiveCanonical, Self::Custom(0)] - } - - fn to_possible_value(&self) -> Option { - Some(match self { - Self::Archive => PossibleValue::new("archive").help("Keep the data of all blocks."), - Self::ArchiveCanonical => PossibleValue::new("archive-canonical") - .help("Keep only the data of finalized blocks."), - Self::Custom(_) => PossibleValue::new("") - .help("Keep the data of the last of finalized blocks."), - }) - } - - fn from_str(input: &str, _: bool) -> Result { - ::from_str(input) - } -} - impl std::str::FromStr for DatabasePruningMode { type Err = String; @@ -132,3 +127,39 @@ impl Into for DatabasePruningMode { } } } + +#[cfg(test)] +mod tests { + use super::*; + use clap::Parser; + + #[derive(Parser)] + struct Cli { + #[clap(flatten)] + pruning: PruningParams, + } + + #[test] + fn pruning_params_parse_works() { + let Cli { pruning } = + Cli::parse_from(["", "--state-pruning=1000", "--blocks-pruning=1000"]); + + assert!(matches!(pruning.state_pruning, Some(DatabasePruningMode::Custom(1000)))); + assert!(matches!(pruning.blocks_pruning, DatabasePruningMode::Custom(1000))); + + let Cli { pruning } = + Cli::parse_from(["", "--state-pruning=archive", "--blocks-pruning=archive"]); + + assert!(matches!(dbg!(pruning.state_pruning), Some(DatabasePruningMode::Archive))); + assert!(matches!(pruning.blocks_pruning, DatabasePruningMode::Archive)); + + let Cli { pruning } = Cli::parse_from([ + "", + "--state-pruning=archive-canonical", + "--blocks-pruning=archive-canonical", + ]); + + assert!(matches!(dbg!(pruning.state_pruning), Some(DatabasePruningMode::ArchiveCanonical))); + assert!(matches!(pruning.blocks_pruning, DatabasePruningMode::ArchiveCanonical)); + } +} -- GitLab From 6c857609a9425902d6dfe5445afb16c6b23ad86c Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 19 Jun 2024 18:20:11 +0200 Subject: [PATCH 027/130] rpc server: add `health/readiness endpoint` (#4802) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous attempt https://github.com/paritytech/substrate/pull/14314 Close #4443 Ideally, we should move /health and /health/readiness to the prometheus server but because it's was quite easy to implement on the RPC server and that RPC server already exposes /health. Manual tests on a polkadot node syncing: ```bash ➜ polkadot-sdk (na-fix-4443) ✗ curl -v localhost:9944/health * Host localhost:9944 was resolved. * IPv6: ::1 * IPv4: 127.0.0.1 * Trying [::1]:9944... * connect to ::1 port 9944 from ::1 port 55024 failed: Connection refused * Trying 127.0.0.1:9944... * Connected to localhost (127.0.0.1) port 9944 > GET /health HTTP/1.1 > Host: localhost:9944 > User-Agent: curl/8.5.0 > Accept: */* > < HTTP/1.1 200 OK < content-type: application/json; charset=utf-8 < content-length: 53 < date: Fri, 14 Jun 2024 16:12:23 GMT < * Connection #0 to host localhost left intact {"peers":0,"isSyncing":false,"shouldHavePeers":false}% ➜ polkadot-sdk (na-fix-4443) ✗ curl -v localhost:9944/health/readiness * Host localhost:9944 was resolved. * IPv6: ::1 * IPv4: 127.0.0.1 * Trying [::1]:9944... * connect to ::1 port 9944 from ::1 port 54328 failed: Connection refused * Trying 127.0.0.1:9944... * Connected to localhost (127.0.0.1) port 9944 > GET /health/readiness HTTP/1.1 > Host: localhost:9944 > User-Agent: curl/8.5.0 > Accept: */* > < HTTP/1.1 500 Internal Server Error < content-type: application/json; charset=utf-8 < content-length: 0 < date: Fri, 14 Jun 2024 16:12:36 GMT < * Connection #0 to host localhost left intact ``` //cc @BulatSaif you may be interested in this.. --------- Co-authored-by: Bastian Köcher --- Cargo.lock | 1 + prdoc/pr_4802.prdoc | 16 ++ substrate/client/rpc-servers/Cargo.toml | 1 + substrate/client/rpc-servers/src/lib.rs | 10 +- .../client/rpc-servers/src/middleware/mod.rs | 2 + .../rpc-servers/src/middleware/node_health.rs | 199 ++++++++++++++++++ 6 files changed, 223 insertions(+), 6 deletions(-) create mode 100644 prdoc/pr_4802.prdoc create mode 100644 substrate/client/rpc-servers/src/middleware/node_health.rs diff --git a/Cargo.lock b/Cargo.lock index bbb785a618a..cb4c25ae998 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17846,6 +17846,7 @@ dependencies = [ "ip_network", "jsonrpsee", "log", + "serde", "serde_json", "substrate-prometheus-endpoint", "tokio", diff --git a/prdoc/pr_4802.prdoc b/prdoc/pr_4802.prdoc new file mode 100644 index 00000000000..5757c4cbae1 --- /dev/null +++ b/prdoc/pr_4802.prdoc @@ -0,0 +1,16 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Add `health/readiness endpoint` to the rpc server + +doc: + - audience: Node Operator + description: | + Add `/health/readiness endpoint` to the rpc server which returns HTTP status code 200 if the chain is synced + and can connect to the rest of the network otherwise status code 500 is returned. + The endpoint can be reached by performing a HTTP GET request to the + endpoint such as `$ curl /health/readiness` + +crates: + - name: sc-rpc-server + bump: patch diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index 7837c852a1c..19369e295fc 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -25,6 +25,7 @@ ip_network = "0.4.1" jsonrpsee = { version = "0.22", features = ["server"] } log = { workspace = true, default-features = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } +serde = { workspace = true } serde_json = { workspace = true, default-features = true } tokio = { version = "1.22.0", features = ["parking_lot"] } tower = { version = "0.4.13", features = ["util"] } diff --git a/substrate/client/rpc-servers/src/lib.rs b/substrate/client/rpc-servers/src/lib.rs index ba1fcf5e367..647a7ca7e43 100644 --- a/substrate/client/rpc-servers/src/lib.rs +++ b/substrate/client/rpc-servers/src/lib.rs @@ -32,12 +32,10 @@ use hyper::{ service::{make_service_fn, service_fn}, }; use jsonrpsee::{ - server::{ - middleware::http::ProxyGetRequestLayer, stop_channel, ws, PingConfig, StopHandle, - TowerServiceBuilder, - }, + server::{stop_channel, ws, PingConfig, StopHandle, TowerServiceBuilder}, Methods, RpcModule, }; +use middleware::NodeHealthProxyLayer; use tokio::net::TcpListener; use tower::Service; use utils::{build_rpc_api, format_cors, get_proxy_ip, host_filtering, try_into_cors}; @@ -132,8 +130,8 @@ where let http_middleware = tower::ServiceBuilder::new() .option_layer(host_filter) - // Proxy `GET /health` requests to internal `system_health` method. - .layer(ProxyGetRequestLayer::new("/health", "system_health")?) + // Proxy `GET /health, /health/readiness` requests to the internal `system_health` method. + .layer(NodeHealthProxyLayer::default()) .layer(try_into_cors(cors)?); let mut builder = jsonrpsee::server::Server::builder() diff --git a/substrate/client/rpc-servers/src/middleware/mod.rs b/substrate/client/rpc-servers/src/middleware/mod.rs index 88ed8b2f433..0a14be4dacf 100644 --- a/substrate/client/rpc-servers/src/middleware/mod.rs +++ b/substrate/client/rpc-servers/src/middleware/mod.rs @@ -32,9 +32,11 @@ use jsonrpsee::{ }; mod metrics; +mod node_health; mod rate_limit; pub use metrics::*; +pub use node_health::*; pub use rate_limit::*; const MAX_JITTER: Duration = Duration::from_millis(50); diff --git a/substrate/client/rpc-servers/src/middleware/node_health.rs b/substrate/client/rpc-servers/src/middleware/node_health.rs new file mode 100644 index 00000000000..d68ec14cb8f --- /dev/null +++ b/substrate/client/rpc-servers/src/middleware/node_health.rs @@ -0,0 +1,199 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Middleware for handling `/health` and `/health/readiness` endpoints. + +use std::{ + error::Error, + future::Future, + pin::Pin, + task::{Context, Poll}, +}; + +use futures::future::FutureExt; +use http::{HeaderValue, Method, StatusCode, Uri}; +use hyper::Body; +use jsonrpsee::types::{Response as RpcResponse, ResponseSuccess as RpcResponseSuccess}; +use tower::Service; + +const RPC_SYSTEM_HEALTH_CALL: &str = r#"{"jsonrpc":"2.0","method":"system_health","id":0}"#; +const HEADER_VALUE_JSON: HeaderValue = HeaderValue::from_static("application/json; charset=utf-8"); + +/// Layer that applies [`NodeHealthProxy`] which +/// proxies `/health` and `/health/readiness` endpoints. +#[derive(Debug, Clone, Default)] +pub struct NodeHealthProxyLayer; + +impl tower::Layer for NodeHealthProxyLayer { + type Service = NodeHealthProxy; + + fn layer(&self, service: S) -> Self::Service { + NodeHealthProxy::new(service) + } +} + +/// Middleware that proxies `/health` and `/health/readiness` endpoints. +pub struct NodeHealthProxy(S); + +impl NodeHealthProxy { + /// Creates a new [`NodeHealthProxy`]. + pub fn new(service: S) -> Self { + Self(service) + } +} + +impl tower::Service> for NodeHealthProxy +where + S: Service, Response = http::Response>, + S::Response: 'static, + S::Error: Into> + 'static, + S::Future: Send + 'static, +{ + type Response = S::Response; + type Error = Box; + type Future = + Pin> + Send + 'static>>; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.0.poll_ready(cx).map_err(Into::into) + } + + fn call(&mut self, mut req: http::Request) -> Self::Future { + let maybe_intercept = InterceptRequest::from_http(&req); + + // Modify the request and proxy it to `system_health` + if let InterceptRequest::Health | InterceptRequest::Readiness = maybe_intercept { + // RPC methods are accessed with `POST`. + *req.method_mut() = Method::POST; + // Precautionary remove the URI. + *req.uri_mut() = Uri::from_static("/"); + + // Requests must have the following headers: + req.headers_mut().insert(http::header::CONTENT_TYPE, HEADER_VALUE_JSON); + req.headers_mut().insert(http::header::ACCEPT, HEADER_VALUE_JSON); + + // Adjust the body to reflect the method call. + req = req.map(|_| Body::from(RPC_SYSTEM_HEALTH_CALL)); + } + + // Call the inner service and get a future that resolves to the response. + let fut = self.0.call(req); + + async move { + let res = fut.await.map_err(|err| err.into())?; + + Ok(match maybe_intercept { + InterceptRequest::Deny => + http_response(StatusCode::METHOD_NOT_ALLOWED, Body::empty()), + InterceptRequest::No => res, + InterceptRequest::Health => { + let health = parse_rpc_response(res.into_body()).await?; + http_ok_response(serde_json::to_string(&health)?) + }, + InterceptRequest::Readiness => { + let health = parse_rpc_response(res.into_body()).await?; + if (!health.is_syncing && health.peers > 0) || !health.should_have_peers { + http_ok_response(Body::empty()) + } else { + http_internal_error() + } + }, + }) + } + .boxed() + } +} + +// NOTE: This is duplicated here to avoid dependency to the `RPC API`. +#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct Health { + /// Number of connected peers + pub peers: usize, + /// Is the node syncing + pub is_syncing: bool, + /// Should this node have any peers + /// + /// Might be false for local chains or when running without discovery. + pub should_have_peers: bool, +} + +fn http_ok_response>(body: S) -> hyper::Response { + http_response(StatusCode::OK, body) +} + +fn http_response>( + status_code: StatusCode, + body: S, +) -> hyper::Response { + hyper::Response::builder() + .status(status_code) + .header(http::header::CONTENT_TYPE, HEADER_VALUE_JSON) + .body(body.into()) + .expect("Header is valid; qed") +} + +fn http_internal_error() -> hyper::Response { + http_response(hyper::StatusCode::INTERNAL_SERVER_ERROR, Body::empty()) +} + +async fn parse_rpc_response(body: Body) -> Result> { + let bytes = hyper::body::to_bytes(body).await?; + + let raw_rp = serde_json::from_slice::>(&bytes)?; + let rp = RpcResponseSuccess::::try_from(raw_rp)?; + + Ok(rp.result) +} + +/// Whether the request should be treated as ordinary RPC call or be modified. +enum InterceptRequest { + /// Proxy `/health` to `system_health`. + Health, + /// Checks if node has at least one peer and is not doing major syncing. + /// + /// Returns HTTP status code 200 on success otherwise HTTP status code 500 is returned. + Readiness, + /// Treat as a ordinary RPC call and don't modify the request or response. + No, + /// Deny health or readiness calls that is not HTTP GET request. + /// + /// Returns HTTP status code 405. + Deny, +} + +impl InterceptRequest { + fn from_http(req: &http::Request) -> InterceptRequest { + match req.uri().path() { + "/health" => + if req.method() == http::Method::GET { + InterceptRequest::Health + } else { + InterceptRequest::Deny + }, + "/health/readiness" => + if req.method() == http::Method::GET { + InterceptRequest::Readiness + } else { + InterceptRequest::Deny + }, + // Forward all other requests to the RPC server. + _ => InterceptRequest::No, + } + } +} -- GitLab From 74decbbdf22a7b109209448307563c6f3d62abac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 08:56:56 +0000 Subject: [PATCH 028/130] Bump curve25519-dalek from 4.1.2 to 4.1.3 (#4824) Bumps [curve25519-dalek](https://github.com/dalek-cryptography/curve25519-dalek) from 4.1.2 to 4.1.3.
Commits
  • 5312a03 curve: Bump version to 4.1.3 (#660)
  • b4f9e4d SECURITY: fix timing variability in backend/serial/u32/scalar.rs (#661)
  • 415892a SECURITY: fix timing variability in backend/serial/u64/scalar.rs (#659)
  • 56bf398 Updates license field to valid SPDX format (#647)
  • 9252fa5 Mitigate check-cfg until MSRV 1.77 (#652)
  • 1efe6a9 Fix a minor typo in signing.rs (#649)
  • cc3421a Indicate that the rand_core feature is required (#641)
  • 858c4ca Address new nightly clippy unnecessary qualifications (#639)
  • 31ccb67 Remove platforms in favor using CARGO_CFG_TARGET_POINTER_WIDTH (#636)
  • 19c7f4a Fix new nightly redundant import lint warns (#638)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=curve25519-dalek&package-manager=cargo&previous-version=4.1.2&new-version=4.1.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/paritytech/polkadot-sdk/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 19 +++++++++---------- .../primitives/statement-store/Cargo.toml | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb4c25ae998..5f3e3c3603e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4536,16 +4536,15 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.2" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "platforms", "rustc_version 0.4.0", "subtle 2.5.0", "zeroize", @@ -5018,7 +5017,7 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ - "curve25519-dalek 4.1.2", + "curve25519-dalek 4.1.3", "ed25519 2.2.2", "rand_core 0.6.4", "serde", @@ -5033,7 +5032,7 @@ version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" dependencies = [ - "curve25519-dalek 4.1.2", + "curve25519-dalek 4.1.3", "ed25519 2.2.2", "hashbrown 0.14.3", "hex", @@ -8479,7 +8478,7 @@ dependencies = [ "bitflags 1.3.2", "blake2 0.10.6", "c2-chacha", - "curve25519-dalek 4.1.2", + "curve25519-dalek 4.1.3", "either", "hashlink", "lioness", @@ -18339,7 +18338,7 @@ dependencies = [ "aead", "arrayref", "arrayvec 0.7.4", - "curve25519-dalek 4.1.2", + "curve25519-dalek 4.1.3", "getrandom_or_panic", "merlin", "rand_core 0.6.4", @@ -19085,7 +19084,7 @@ dependencies = [ "aes-gcm", "blake2 0.10.6", "chacha20poly1305", - "curve25519-dalek 4.1.2", + "curve25519-dalek 4.1.3", "rand_core 0.6.4", "ring 0.17.7", "rustc_version 0.4.0", @@ -20356,7 +20355,7 @@ name = "sp-statement-store" version = "10.0.0" dependencies = [ "aes-gcm", - "curve25519-dalek 4.1.2", + "curve25519-dalek 4.1.3", "ed25519-dalek 2.1.1", "hkdf", "parity-scale-codec", @@ -23781,7 +23780,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" dependencies = [ - "curve25519-dalek 4.1.2", + "curve25519-dalek 4.1.3", "rand_core 0.6.4", "serde", "zeroize", diff --git a/substrate/primitives/statement-store/Cargo.toml b/substrate/primitives/statement-store/Cargo.toml index bb893b25dc4..60919b7439e 100644 --- a/substrate/primitives/statement-store/Cargo.toml +++ b/substrate/primitives/statement-store/Cargo.toml @@ -30,7 +30,7 @@ thiserror = { optional = true, workspace = true } # ECIES dependencies ed25519-dalek = { version = "2.1", optional = true } x25519-dalek = { version = "2.0", optional = true, features = ["static_secrets"] } -curve25519-dalek = { version = "4.1.1", optional = true } +curve25519-dalek = { version = "4.1.3", optional = true } aes-gcm = { version = "0.10", optional = true } hkdf = { version = "0.12.0", optional = true } sha2 = { version = "0.10.7", optional = true } -- GitLab From a23abb17232107275089040a33ff38e6a801e648 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 09:23:19 +0200 Subject: [PATCH 029/130] Bump ws from 8.16.0 to 8.17.1 in /bridges/testing/framework/utils/generate_hex_encoded_call (#4825) Bumps [ws](https://github.com/websockets/ws) from 8.16.0 to 8.17.1.
Release notes

Sourced from ws's releases.

8.17.1

Bug fixes

  • Fixed a DoS vulnerability (#2231).

A request with a number of headers exceeding the[server.maxHeadersCount][] threshold could be used to crash a ws server.

const http = require('http');
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 0 }, function () { const chars = "!#$%&'*+-.0123456789abcdefghijklmnopqrstuvwxyz^_`|~".split(''); const headers = {}; let count = 0;

for (let i = 0; i < chars.length; i++) { if (count === 2000) break;

for (let j = 0; j &lt; chars.length; j++) {
  const key = chars[i] + chars[j];
  headers[key] = 'x';

  if (++count === 2000) break;
}

}

headers.Connection = 'Upgrade'; headers.Upgrade = 'websocket'; headers['Sec-WebSocket-Key'] = 'dGhlIHNhbXBsZSBub25jZQ=='; headers['Sec-WebSocket-Version'] = '13';

const request = http.request({ headers: headers, host: '127.0.0.1', port: wss.address().port });

request.end(); });

The vulnerability was reported by Ryan LaPointe in websockets/ws#2230.

In vulnerable versions of ws, the issue can be mitigated in the following ways:

  1. Reduce the maximum allowed length of the request headers using the [--max-http-header-size=size][] and/or the [maxHeaderSize][] options so that no more headers than the server.maxHeadersCount limit can be sent.

... (truncated)

Commits
  • 3c56601 [dist] 8.17.1
  • e55e510 [security] Fix crash when the Upgrade header cannot be read (#2231)
  • 6a00029 [test] Increase code coverage
  • ddfe4a8 [perf] Reduce the amount of crypto.randomFillSync() calls
  • b73b118 [dist] 8.17.0
  • 29694a5 [test] Use the highWaterMark variable
  • 934c9d6 [ci] Test on node 22
  • 1817bac [ci] Do not test on node 21
  • 96c9b3d [major] Flip the default value of allowSynchronousEvents (#2221)
  • e5f32c7 [fix] Emit at most one event per event loop iteration (#2218)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ws&package-manager=npm_and_yarn&previous-version=8.16.0&new-version=8.17.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/paritytech/polkadot-sdk/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Branislav Kontur --- .../utils/generate_hex_encoded_call/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bridges/testing/framework/utils/generate_hex_encoded_call/package-lock.json b/bridges/testing/framework/utils/generate_hex_encoded_call/package-lock.json index b2dddaa19ed..ca3abcc528c 100644 --- a/bridges/testing/framework/utils/generate_hex_encoded_call/package-lock.json +++ b/bridges/testing/framework/utils/generate_hex_encoded_call/package-lock.json @@ -736,9 +736,9 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { "node": ">=10.0.0" }, -- GitLab From b301218db8785c6d425ca9a9ef90daa80780f2ce Mon Sep 17 00:00:00 2001 From: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Fri, 21 Jun 2024 11:33:33 +0200 Subject: [PATCH 030/130] [ci] Change storage type for forklift in GHA (#4850) PR changes forklift authentication to gcs cc https://github.com/paritytech/ci_cd/issues/987 --- .forklift/config-gitlab.toml | 33 +++++++++++++++++++ .forklift/config.toml | 10 ++---- .github/review-bot.yml | 2 ++ .github/workflows/check-runtime-migration.yml | 7 ---- .github/workflows/tests-linux-stable.yml | 18 +++------- .github/workflows/tests.yml | 18 +++------- .gitlab-ci.yml | 3 +- 7 files changed, 50 insertions(+), 41 deletions(-) create mode 100644 .forklift/config-gitlab.toml diff --git a/.forklift/config-gitlab.toml b/.forklift/config-gitlab.toml new file mode 100644 index 00000000000..ab3b2729a46 --- /dev/null +++ b/.forklift/config-gitlab.toml @@ -0,0 +1,33 @@ +[compression] +type = "zstd" + +[compression.zstd] +compressionLevel = 3 + +[general] +jobNameVariable = "CI_JOB_NAME" +jobsBlackList = [] +logLevel = "warn" +threadsCount = 6 + +[cache] +extraEnv = ["RUNTIME_METADATA_HASH"] + +[metrics] +enabled = true +pushEndpoint = "placeholder" + +[metrics.extraLabels] +environment = "production" +job_name = "$CI_JOB_NAME" +project_name = "$CI_PROJECT_PATH" + +[storage] +type = "s3" + +[storage.s3] +accessKeyId = "placeholder" +bucketName = "placeholder" +concurrency = 10 +endpointUrl = "placeholder" +secretAccessKey = "placeholder" diff --git a/.forklift/config.toml b/.forklift/config.toml index ab3b2729a46..6f8eed8882e 100644 --- a/.forklift/config.toml +++ b/.forklift/config.toml @@ -23,11 +23,7 @@ job_name = "$CI_JOB_NAME" project_name = "$CI_PROJECT_PATH" [storage] -type = "s3" +type = "gcs" -[storage.s3] -accessKeyId = "placeholder" -bucketName = "placeholder" -concurrency = 10 -endpointUrl = "placeholder" -secretAccessKey = "placeholder" +[storage.gcs] +bucketName = "parity-ci-forklift" diff --git a/.github/review-bot.yml b/.github/review-bot.yml index ed719cefec8..adbc480c6ba 100644 --- a/.github/review-bot.yml +++ b/.github/review-bot.yml @@ -9,6 +9,7 @@ rules: - ^\.gitlab/.* - ^\.config/nextest.toml - ^\.cargo/.* + - ^\.forklift/.* exclude: - ^\.gitlab/pipeline/zombienet.* type: "or" @@ -33,6 +34,7 @@ rules: - ^docker/.* - ^\.github/.* - ^\.gitlab/.* + - ^\.forklift/.* - ^\.config/nextest.toml - ^\.cargo/.* minApprovals: 2 diff --git a/.github/workflows/check-runtime-migration.yml b/.github/workflows/check-runtime-migration.yml index 671673c02c0..33da5a8ecd5 100644 --- a/.github/workflows/check-runtime-migration.yml +++ b/.github/workflows/check-runtime-migration.yml @@ -11,13 +11,6 @@ concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true -env: - FORKLIFT_storage_s3_bucketName: ${{ secrets.FORKLIFT_storage_s3_bucketName }} - FORKLIFT_storage_s3_accessKeyId: ${{ secrets.FORKLIFT_storage_s3_accessKeyId }} - FORKLIFT_storage_s3_secretAccessKey: ${{ secrets.FORKLIFT_storage_s3_secretAccessKey }} - FORKLIFT_storage_s3_endpointUrl: ${{ secrets.FORKLIFT_storage_s3_endpointUrl }} - FORKLIFT_metrics_pushEndpoint: ${{ secrets.FORKLIFT_metrics_pushEndpoint }} - jobs: set-image: # GitHub Actions allows using 'env' in a container context. diff --git a/.github/workflows/tests-linux-stable.yml b/.github/workflows/tests-linux-stable.yml index 5fdfabc437f..6f2ac87c3ef 100644 --- a/.github/workflows/tests-linux-stable.yml +++ b/.github/workflows/tests-linux-stable.yml @@ -12,15 +12,7 @@ concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true -env: - FORKLIFT_storage_s3_bucketName: ${{ secrets.FORKLIFT_storage_s3_bucketName }} - FORKLIFT_storage_s3_accessKeyId: ${{ secrets.FORKLIFT_storage_s3_accessKeyId }} - FORKLIFT_storage_s3_secretAccessKey: ${{ secrets.FORKLIFT_storage_s3_secretAccessKey }} - FORKLIFT_storage_s3_endpointUrl: ${{ secrets.FORKLIFT_storage_s3_endpointUrl }} - FORKLIFT_metrics_pushEndpoint: ${{ secrets.FORKLIFT_metrics_pushEndpoint }} - jobs: - changes: permissions: pull-requests: read @@ -31,7 +23,7 @@ jobs: # However, env variables don't work for forks: https://github.com/orgs/community/discussions/44322 # This workaround sets the container image for each job using 'set-image' job output. needs: changes - if: ${{ needs.changes.outputs.rust }} + if: ${{ needs.changes.outputs.rust }} runs-on: ubuntu-latest outputs: IMAGE: ${{ steps.set_image.outputs.IMAGE }} @@ -40,10 +32,10 @@ jobs: uses: actions/checkout@v4 - id: set_image run: cat .github/env >> $GITHUB_OUTPUT - + test-linux-stable-int: needs: [set-image, changes] - if: ${{ needs.changes.outputs.rust }} + if: ${{ needs.changes.outputs.rust }} runs-on: arc-runners-polkadot-sdk-beefy timeout-minutes: 30 container: @@ -60,11 +52,11 @@ jobs: uses: actions/checkout@v4 - name: script run: WASM_BUILD_NO_COLOR=1 time forklift cargo test -p staging-node-cli --release --locked -- --ignored - + # https://github.com/paritytech/ci_cd/issues/864 test-linux-stable-runtime-benchmarks: needs: [set-image, changes] - if: ${{ needs.changes.outputs.rust }} + if: ${{ needs.changes.outputs.rust }} runs-on: arc-runners-polkadot-sdk-beefy timeout-minutes: 30 container: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 293acadc4e6..0c1447cba33 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,15 +11,7 @@ concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true -env: - FORKLIFT_storage_s3_bucketName: ${{ secrets.FORKLIFT_storage_s3_bucketName }} - FORKLIFT_storage_s3_accessKeyId: ${{ secrets.FORKLIFT_storage_s3_accessKeyId }} - FORKLIFT_storage_s3_secretAccessKey: ${{ secrets.FORKLIFT_storage_s3_secretAccessKey }} - FORKLIFT_storage_s3_endpointUrl: ${{ secrets.FORKLIFT_storage_s3_endpointUrl }} - FORKLIFT_metrics_pushEndpoint: ${{ secrets.FORKLIFT_metrics_pushEndpoint }} - jobs: - changes: permissions: pull-requests: read @@ -40,7 +32,7 @@ jobs: quick-benchmarks: needs: [set-image, changes] - if: ${{ needs.changes.outputs.rust }} + if: ${{ needs.changes.outputs.rust }} runs-on: arc-runners-polkadot-sdk-beefy timeout-minutes: 30 container: @@ -55,11 +47,11 @@ jobs: uses: actions/checkout@v4 - name: script run: time forklift cargo run --locked --release -p staging-node-cli --bin substrate-node --features runtime-benchmarks -- benchmark pallet --chain dev --pallet "*" --extrinsic "*" --steps 2 --repeat 1 --quiet - + # cf https://github.com/paritytech/polkadot-sdk/issues/1652 test-syscalls: needs: [set-image, changes] - if: ${{ needs.changes.outputs.rust }} + if: ${{ needs.changes.outputs.rust }} runs-on: arc-runners-polkadot-sdk-beefy timeout-minutes: 30 container: @@ -81,10 +73,10 @@ jobs: # - if [[ "$CI_JOB_STATUS" == "failed" ]]; then # printf "The x86_64 syscalls used by the worker binaries have changed. Please review if this is expected and update polkadot/scripts/list-syscalls/*-worker-syscalls as needed.\n"; # fi - + cargo-check-all-benches: needs: [set-image, changes] - if: ${{ needs.changes.outputs.rust }} + if: ${{ needs.changes.outputs.rust }} runs-on: arc-runners-polkadot-sdk-beefy timeout-minutes: 30 container: diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 73a8c52c448..7f2babc6bd4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -120,7 +120,8 @@ default: .forklift-cache: before_script: - mkdir ~/.forklift - - cp .forklift/config.toml ~/.forklift/config.toml + - cp .forklift/config-gitlab.toml ~/.forklift/config.toml + - cat .forklift/config-gitlab.toml > .forklift/config.toml - > if [ "$FORKLIFT_BYPASS" != "true" ]; then echo "FORKLIFT_BYPASS not set"; -- GitLab From 2657cfba042e01e619cb8d4f0a71382c6e6a0a08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Molina=20Colmenero?= Date: Fri, 21 Jun 2024 15:43:00 +0200 Subject: [PATCH 031/130] Do not make pallet-nfts benchmarks signature-dependent (#4756) This PR: - Adds extra functionality to pallet-nfts's `BenchmarkHelper` to provide signers and sign message. - Abstracts away the explicit link with Sr25519 schema in the benchmarks, allowing parachains with a different one to be able to run them and calculate the weights. - Adds a default implementation for the empty tuple that leaves the code equivalent. --- prdoc/pr_4756.prdoc | 15 ++++++++++ substrate/frame/nfts/src/benchmarking.rs | 22 ++++----------- substrate/frame/nfts/src/lib.rs | 36 ++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 prdoc/pr_4756.prdoc diff --git a/prdoc/pr_4756.prdoc b/prdoc/pr_4756.prdoc new file mode 100644 index 00000000000..064a79fb066 --- /dev/null +++ b/prdoc/pr_4756.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Do not make pallet-nfts benchmarks signature-dependent + +doc: + - audience: Runtime Dev + description: | + - Adds extra functionality to pallet-nfts's BenchmarkHelper to provide signers and sign message. + - Abstracts away the explicit link with Sr25519 schema in the benchmarks, allowing parachains with a different one to be able to run them and calculate the weights. + - Adds a default implementation for the empty tuple that leaves the code equivalent. + +crates: + - name: pallet-nfts + bump: minor diff --git a/substrate/frame/nfts/src/benchmarking.rs b/substrate/frame/nfts/src/benchmarking.rs index 8792af675fc..80860bc5a53 100644 --- a/substrate/frame/nfts/src/benchmarking.rs +++ b/substrate/frame/nfts/src/benchmarking.rs @@ -30,11 +30,7 @@ use frame_support::{ BoundedVec, }; use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin as SystemOrigin}; -use sp_io::crypto::{sr25519_generate, sr25519_sign}; -use sp_runtime::{ - traits::{Bounded, IdentifyAccount, One}, - AccountId32, MultiSignature, MultiSigner, -}; +use sp_runtime::traits::{Bounded, One}; use sp_std::prelude::*; use crate::Pallet as Nfts; @@ -229,12 +225,6 @@ fn make_filled_vec(value: u16, length: usize) -> Vec { } benchmarks_instance_pallet! { - where_clause { - where - T::OffchainSignature: From, - T::AccountId: From, - } - create { let collection = T::Helper::collection(0); let origin = T::CreateOrigin::try_successful_origin(&collection) @@ -800,8 +790,7 @@ benchmarks_instance_pallet! { mint_pre_signed { let n in 0 .. T::MaxAttributesPerCall::get() as u32; - let caller_public = sr25519_generate(0.into(), None); - let caller = MultiSigner::Sr25519(caller_public).into_account().into(); + let (caller_public, caller) = T::Helper::signer(); T::Currency::make_free_balance_be(&caller, DepositBalanceOf::::max_value()); let caller_lookup = T::Lookup::unlookup(caller.clone()); @@ -830,7 +819,7 @@ benchmarks_instance_pallet! { mint_price: Some(DepositBalanceOf::::min_value()), }; let message = Encode::encode(&mint_data); - let signature = MultiSignature::Sr25519(sr25519_sign(0.into(), &caller_public, &message).unwrap()); + let signature = T::Helper::sign(&caller_public, &message); let target: T::AccountId = account("target", 0, SEED); T::Currency::make_free_balance_be(&target, DepositBalanceOf::::max_value()); @@ -848,8 +837,7 @@ benchmarks_instance_pallet! { let item_owner: T::AccountId = account("item_owner", 0, SEED); let item_owner_lookup = T::Lookup::unlookup(item_owner.clone()); - let signer_public = sr25519_generate(0.into(), None); - let signer: T::AccountId = MultiSigner::Sr25519(signer_public).into_account().into(); + let (signer_public, signer) = T::Helper::signer(); T::Currency::make_free_balance_be(&item_owner, DepositBalanceOf::::max_value()); @@ -876,7 +864,7 @@ benchmarks_instance_pallet! { deadline: One::one(), }; let message = Encode::encode(&pre_signed_data); - let signature = MultiSignature::Sr25519(sr25519_sign(0.into(), &signer_public, &message).unwrap()); + let signature = T::Helper::sign(&signer_public, &message); frame_system::Pallet::::set_block_number(One::one()); }: _(SystemOrigin::Signed(item_owner.clone()), pre_signed_data, signature.into(), signer.clone()) diff --git a/substrate/frame/nfts/src/lib.rs b/substrate/frame/nfts/src/lib.rs index 615720268fe..0406cac6e2c 100644 --- a/substrate/frame/nfts/src/lib.rs +++ b/substrate/frame/nfts/src/lib.rs @@ -84,18 +84,42 @@ pub mod pallet { pub struct Pallet(PhantomData<(T, I)>); #[cfg(feature = "runtime-benchmarks")] - pub trait BenchmarkHelper { + pub trait BenchmarkHelper { fn collection(i: u16) -> CollectionId; fn item(i: u16) -> ItemId; + fn signer() -> (Public, AccountId); + fn sign(signer: &Public, message: &[u8]) -> Signature; } #[cfg(feature = "runtime-benchmarks")] - impl, ItemId: From> BenchmarkHelper for () { + impl + BenchmarkHelper< + CollectionId, + ItemId, + sp_runtime::MultiSigner, + sp_runtime::AccountId32, + sp_runtime::MultiSignature, + > for () + where + CollectionId: From, + ItemId: From, + { fn collection(i: u16) -> CollectionId { i.into() } fn item(i: u16) -> ItemId { i.into() } + fn signer() -> (sp_runtime::MultiSigner, sp_runtime::AccountId32) { + let public = sp_io::crypto::sr25519_generate(0.into(), None); + let account = sp_runtime::MultiSigner::Sr25519(public).into_account(); + (public.into(), account) + } + fn sign(signer: &sp_runtime::MultiSigner, message: &[u8]) -> sp_runtime::MultiSignature { + sp_runtime::MultiSignature::Sr25519( + sp_io::crypto::sr25519_sign(0.into(), &signer.clone().try_into().unwrap(), message) + .unwrap(), + ) + } } #[pallet::config] @@ -206,7 +230,13 @@ pub mod pallet { #[cfg(feature = "runtime-benchmarks")] /// A set of helper functions for benchmarking. - type Helper: BenchmarkHelper; + type Helper: BenchmarkHelper< + Self::CollectionId, + Self::ItemId, + Self::OffchainPublic, + Self::AccountId, + Self::OffchainSignature, + >; /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; -- GitLab From d18d362380aad1f4ccd4c70c6d32f587b7250bb9 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Fri, 21 Jun 2024 16:30:29 +0200 Subject: [PATCH 032/130] [HRMP] Dont partially modify pages (#4710) Changes: - The XCMP queue does not partially modify pages anymore by using `try_mutate` instead of `mutate`. - The XCMP queue max page size is now the min between the value that the relay reports and the local limit. Thanks to whom pointed this out to me via DM. --------- Signed-off-by: Oliver Tale-Yazdi --- cumulus/pallets/xcmp-queue/src/lib.rs | 13 ++++++----- cumulus/pallets/xcmp-queue/src/tests.rs | 31 ++++++++++++++++++++++++- prdoc/pr_4710.prdoc | 11 +++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 prdoc/pr_4710.prdoc diff --git a/cumulus/pallets/xcmp-queue/src/lib.rs b/cumulus/pallets/xcmp-queue/src/lib.rs index 5633f05f13b..45126a9425d 100644 --- a/cumulus/pallets/xcmp-queue/src/lib.rs +++ b/cumulus/pallets/xcmp-queue/src/lib.rs @@ -491,7 +491,7 @@ impl Pallet { let channel_info = T::ChannelInfo::get_channel_info(recipient).ok_or(MessageSendError::NoChannel)?; // Max message size refers to aggregates, or pages. Not to individual fragments. - let max_message_size = channel_info.max_message_size as usize; + let max_message_size = channel_info.max_message_size.min(T::MaxPageSize::get()) as usize; let format_size = format.encoded_size(); // We check the encoded fragment length plus the format size against the max message size // because the format is concatenated if a new page is needed. @@ -522,7 +522,7 @@ impl Pallet { // We return the size of the last page inside of the option, to not calculate it again. let appended_to_last_page = have_active .then(|| { - >::mutate( + >::try_mutate( recipient, channel_details.last_index - 1, |page| { @@ -532,17 +532,18 @@ impl Pallet { ) != Ok(format) { defensive!("Bad format in outbound queue; dropping message"); - return None + return Err(()) } if page.len() + encoded_fragment.len() > max_message_size { - return None + return Err(()) } for frag in encoded_fragment.iter() { - page.try_push(*frag).ok()?; + page.try_push(*frag)?; } - Some(page.len()) + Ok(page.len()) }, ) + .ok() }) .flatten(); diff --git a/cumulus/pallets/xcmp-queue/src/tests.rs b/cumulus/pallets/xcmp-queue/src/tests.rs index cdf41e27f0b..5b02baf2310 100644 --- a/cumulus/pallets/xcmp-queue/src/tests.rs +++ b/cumulus/pallets/xcmp-queue/src/tests.rs @@ -28,6 +28,7 @@ use frame_support::{ use mock::{new_test_ext, ParachainSystem, RuntimeOrigin as Origin, Test, XcmpQueue}; use sp_runtime::traits::{BadOrigin, Zero}; use std::iter::{once, repeat}; +use xcm_builder::InspectMessageQueues; #[test] fn empty_concatenated_works() { @@ -854,7 +855,6 @@ fn verify_fee_factor_increase_and_decrease() { #[test] fn get_messages_works() { new_test_ext().execute_with(|| { - use xcm_builder::InspectMessageQueues; let sibling_para_id = ParaId::from(2001); ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests(sibling_para_id); let destination: Location = (Parent, Parachain(sibling_para_id.into())).into(); @@ -890,3 +890,32 @@ fn get_messages_works() { ); }); } + +/// We try to send a fragment that will not fit into the currently active page. This should +/// therefore not modify the current page but instead create a new one. +#[test] +fn page_not_modified_when_fragment_does_not_fit() { + new_test_ext().execute_with(|| { + let sibling = ParaId::from(2001); + ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests(sibling); + + let destination: Location = (Parent, Parachain(sibling.into())).into(); + let message = Xcm(vec![ClearOrigin; 600]); + + loop { + let old_page_zero = OutboundXcmpMessages::::get(sibling, 0); + assert_ok!(send_xcm::(destination.clone(), message.clone())); + + // If a new page was created by this send_xcm call, then page_zero was not also + // modified: + let num_pages = OutboundXcmpMessages::::iter_prefix(sibling).count(); + if num_pages == 2 { + let new_page_zero = OutboundXcmpMessages::::get(sibling, 0); + assert_eq!(old_page_zero, new_page_zero); + break + } else if num_pages > 2 { + panic!("Too many pages created"); + } + } + }); +} diff --git a/prdoc/pr_4710.prdoc b/prdoc/pr_4710.prdoc new file mode 100644 index 00000000000..d7d31d81720 --- /dev/null +++ b/prdoc/pr_4710.prdoc @@ -0,0 +1,11 @@ +title: "Dont partially modify HRMP pages" + +doc: + - audience: Runtime Dev + description: | + The xcmp-queue pallet now does not partially modify a page anymore when the next message does + not fully fit into it but instead cleanly creates a new one. + +crates: + - name: cumulus-pallet-xcmp-queue + bump: patch -- GitLab From a477bd0ba546e419d7995681f87b5dad07f9bb5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Andr=C3=A9s=20Dorado=20Su=C3=A1rez?= Date: Fri, 21 Jun 2024 09:36:37 -0500 Subject: [PATCH 033/130] Implement `pallet-assets-freezer` (#3951) Closes #3342 cc/ @liamaharon TODO: - [x] Improve docs. - [x] Define public interface (See #3342). In case we define public calls to the pallet implementation: - Implement public calls. - Benchmarks. polkadot address: 12gMhxHw8QjEwLQvnqsmMVY1z5gFa54vND74aMUbhhwN6mJR --------- Co-authored-by: command-bot <> Co-authored-by: Liam Aharon --- Cargo.lock | 20 ++ Cargo.toml | 1 + .../assets/asset-hub-rococo/Cargo.toml | 4 + .../assets/asset-hub-rococo/src/lib.rs | 30 +- .../assets/asset-hub-westend/Cargo.toml | 4 + .../assets/asset-hub-westend/src/lib.rs | 30 +- prdoc/pr_3951.prdoc | 30 ++ substrate/frame/assets-freezer/Cargo.toml | 61 ++++ substrate/frame/assets-freezer/src/impls.rs | 158 +++++++++ substrate/frame/assets-freezer/src/lib.rs | 176 ++++++++++ substrate/frame/assets-freezer/src/mock.rs | 154 +++++++++ substrate/frame/assets-freezer/src/tests.rs | 304 ++++++++++++++++++ substrate/frame/balances/src/lib.rs | 4 +- substrate/frame/balances/src/types.rs | 9 - substrate/frame/support/src/traits/tokens.rs | 6 +- .../frame/support/src/traits/tokens/misc.rs | 11 +- umbrella/Cargo.toml | 10 +- umbrella/src/lib.rs | 4 + 18 files changed, 994 insertions(+), 22 deletions(-) create mode 100644 prdoc/pr_3951.prdoc create mode 100644 substrate/frame/assets-freezer/Cargo.toml create mode 100644 substrate/frame/assets-freezer/src/impls.rs create mode 100644 substrate/frame/assets-freezer/src/lib.rs create mode 100644 substrate/frame/assets-freezer/src/mock.rs create mode 100644 substrate/frame/assets-freezer/src/tests.rs diff --git a/Cargo.lock b/Cargo.lock index 5f3e3c3603e..7f58c4b9361 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -823,6 +823,7 @@ dependencies = [ "pallet-asset-conversion-ops", "pallet-asset-conversion-tx-payment", "pallet-assets", + "pallet-assets-freezer", "pallet-aura", "pallet-authorship", "pallet-balances", @@ -956,6 +957,7 @@ dependencies = [ "pallet-asset-conversion-ops", "pallet-asset-conversion-tx-payment", "pallet-assets", + "pallet-assets-freezer", "pallet-aura", "pallet-authorship", "pallet-balances", @@ -9546,6 +9548,23 @@ dependencies = [ "sp-std 14.0.0", ] +[[package]] +name = "pallet-assets-freezer" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-assets", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", +] + [[package]] name = "pallet-atomic-swap" version = "28.0.0" @@ -14017,6 +14036,7 @@ dependencies = [ "pallet-asset-rate", "pallet-asset-tx-payment", "pallet-assets", + "pallet-assets-freezer", "pallet-atomic-swap", "pallet-aura", "pallet-authority-discovery", diff --git a/Cargo.toml b/Cargo.toml index 2b2a1cdc17d..ba52b0179ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -306,6 +306,7 @@ members = [ "substrate/frame/asset-conversion/ops", "substrate/frame/asset-rate", "substrate/frame/assets", + "substrate/frame/assets-freezer", "substrate/frame/atomic-swap", "substrate/frame/aura", "substrate/frame/authority-discovery", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml index a880730ddac..b8670c2957d 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml @@ -28,6 +28,7 @@ pallet-asset-conversion-tx-payment = { path = "../../../../../substrate/frame/tr pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false } pallet-asset-conversion-ops = { path = "../../../../../substrate/frame/asset-conversion/ops", default-features = false } pallet-asset-conversion = { path = "../../../../../substrate/frame/asset-conversion", default-features = false } +pallet-assets-freezer = { path = "../../../../../substrate/frame/assets-freezer", default-features = false } pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } @@ -116,6 +117,7 @@ runtime-benchmarks = [ "frame-system/runtime-benchmarks", "pallet-asset-conversion-ops/runtime-benchmarks", "pallet-asset-conversion/runtime-benchmarks", + "pallet-assets-freezer/runtime-benchmarks", "pallet-assets/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", @@ -151,6 +153,7 @@ try-runtime = [ "pallet-asset-conversion-ops/try-runtime", "pallet-asset-conversion-tx-payment/try-runtime", "pallet-asset-conversion/try-runtime", + "pallet-assets-freezer/try-runtime", "pallet-assets/try-runtime", "pallet-aura/try-runtime", "pallet-authorship/try-runtime", @@ -200,6 +203,7 @@ std = [ "pallet-asset-conversion-ops/std", "pallet-asset-conversion-tx-payment/std", "pallet-asset-conversion/std", + "pallet-assets-freezer/std", "pallet-assets/std", "pallet-aura/std", "pallet-authorship/std", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 5bba1b568d9..423f9549edc 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -257,7 +257,7 @@ impl pallet_assets::Config for Runtime { type MetadataDepositPerByte = MetadataDepositPerByte; type ApprovalDeposit = ApprovalDeposit; type StringLimit = AssetsStringLimit; - type Freezer = (); + type Freezer = AssetsFreezer; type Extra = (); type WeightInfo = weights::pallet_assets_local::WeightInfo; type CallbackHandle = (); @@ -267,6 +267,13 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +// Allow Freezes for the `Assets` pallet +pub type AssetsFreezerInstance = pallet_assets_freezer::Instance1; +impl pallet_assets_freezer::Config for Runtime { + type RuntimeFreezeReason = RuntimeFreezeReason; + type RuntimeEvent = RuntimeEvent; +} + parameter_types! { pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); pub const LiquidityWithdrawalFee: Permill = Permill::from_percent(0); @@ -295,7 +302,7 @@ impl pallet_assets::Config for Runtime { type MetadataDepositPerByte = ConstU128<0>; type ApprovalDeposit = ApprovalDeposit; type StringLimit = ConstU32<50>; - type Freezer = (); + type Freezer = PoolAssetsFreezer; type Extra = (); type WeightInfo = weights::pallet_assets_pool::WeightInfo; type CallbackHandle = (); @@ -303,6 +310,13 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +// Allow Freezes for the `PoolAssets` pallet +pub type PoolAssetsFreezerInstance = pallet_assets_freezer::Instance3; +impl pallet_assets_freezer::Config for Runtime { + type RuntimeFreezeReason = RuntimeFreezeReason; + type RuntimeEvent = RuntimeEvent; +} + /// Union fungibles implementation for `Assets` and `ForeignAssets`. pub type LocalAndForeignAssets = fungibles::UnionOf< Assets, @@ -411,7 +425,7 @@ impl pallet_assets::Config for Runtime { type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; type ApprovalDeposit = ForeignAssetsApprovalDeposit; type StringLimit = ForeignAssetsAssetsStringLimit; - type Freezer = (); + type Freezer = ForeignAssetsFreezer; type Extra = (); type WeightInfo = weights::pallet_assets_foreign::WeightInfo; type CallbackHandle = (); @@ -421,6 +435,13 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; } +// Allow Freezes for the `ForeignAssets` pallet +pub type ForeignAssetsFreezerInstance = pallet_assets_freezer::Instance2; +impl pallet_assets_freezer::Config for Runtime { + type RuntimeFreezeReason = RuntimeFreezeReason; + type RuntimeEvent = RuntimeEvent; +} + parameter_types! { // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. pub const DepositBase: Balance = deposit(1, 88); @@ -953,6 +974,9 @@ construct_runtime!( NftFractionalization: pallet_nft_fractionalization = 54, PoolAssets: pallet_assets:: = 55, AssetConversion: pallet_asset_conversion = 56, + AssetsFreezer: pallet_assets_freezer:: = 57, + ForeignAssetsFreezer: pallet_assets_freezer:: = 58, + PoolAssetsFreezer: pallet_assets_freezer:: = 59, // TODO: the pallet instance should be removed once all pools have migrated // to the new account IDs. diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index 953f6a8b400..f310b2e0313 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -28,6 +28,7 @@ pallet-asset-conversion-ops = { path = "../../../../../substrate/frame/asset-con pallet-asset-conversion-tx-payment = { path = "../../../../../substrate/frame/transaction-payment/asset-conversion-tx-payment", default-features = false } pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false } pallet-asset-conversion = { path = "../../../../../substrate/frame/asset-conversion", default-features = false } +pallet-assets-freezer = { path = "../../../../../substrate/frame/assets-freezer", default-features = false } pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } @@ -115,6 +116,7 @@ runtime-benchmarks = [ "frame-system/runtime-benchmarks", "pallet-asset-conversion-ops/runtime-benchmarks", "pallet-asset-conversion/runtime-benchmarks", + "pallet-assets-freezer/runtime-benchmarks", "pallet-assets/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", @@ -150,6 +152,7 @@ try-runtime = [ "pallet-asset-conversion-ops/try-runtime", "pallet-asset-conversion-tx-payment/try-runtime", "pallet-asset-conversion/try-runtime", + "pallet-assets-freezer/try-runtime", "pallet-assets/try-runtime", "pallet-aura/try-runtime", "pallet-authorship/try-runtime", @@ -200,6 +203,7 @@ std = [ "pallet-asset-conversion-ops/std", "pallet-asset-conversion-tx-payment/std", "pallet-asset-conversion/std", + "pallet-assets-freezer/std", "pallet-assets/std", "pallet-aura/std", "pallet-authorship/std", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index dcf9565f330..6764242cc33 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -255,7 +255,7 @@ impl pallet_assets::Config for Runtime { type MetadataDepositPerByte = MetadataDepositPerByte; type ApprovalDeposit = ApprovalDeposit; type StringLimit = AssetsStringLimit; - type Freezer = (); + type Freezer = AssetsFreezer; type Extra = (); type WeightInfo = weights::pallet_assets_local::WeightInfo; type CallbackHandle = (); @@ -265,6 +265,13 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +// Allow Freezes for the `Assets` pallet +pub type AssetsFreezerInstance = pallet_assets_freezer::Instance1; +impl pallet_assets_freezer::Config for Runtime { + type RuntimeFreezeReason = RuntimeFreezeReason; + type RuntimeEvent = RuntimeEvent; +} + parameter_types! { pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); pub const LiquidityWithdrawalFee: Permill = Permill::from_percent(0); @@ -292,7 +299,7 @@ impl pallet_assets::Config for Runtime { type MetadataDepositPerByte = ConstU128<0>; type ApprovalDeposit = ConstU128<0>; type StringLimit = ConstU32<50>; - type Freezer = (); + type Freezer = PoolAssetsFreezer; type Extra = (); type WeightInfo = weights::pallet_assets_pool::WeightInfo; type CallbackHandle = (); @@ -300,6 +307,13 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +// Allow Freezes for the `PoolAssets` pallet +pub type PoolAssetsFreezerInstance = pallet_assets_freezer::Instance3; +impl pallet_assets_freezer::Config for Runtime { + type RuntimeFreezeReason = RuntimeFreezeReason; + type RuntimeEvent = RuntimeEvent; +} + /// Union fungibles implementation for `Assets` and `ForeignAssets`. pub type LocalAndForeignAssets = fungibles::UnionOf< Assets, @@ -405,7 +419,7 @@ impl pallet_assets::Config for Runtime { type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; type ApprovalDeposit = ForeignAssetsApprovalDeposit; type StringLimit = ForeignAssetsAssetsStringLimit; - type Freezer = (); + type Freezer = ForeignAssetsFreezer; type Extra = (); type WeightInfo = weights::pallet_assets_foreign::WeightInfo; type CallbackHandle = (); @@ -415,6 +429,13 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; } +// Allow Freezes for the `ForeignAssets` pallet +pub type ForeignAssetsFreezerInstance = pallet_assets_freezer::Instance2; +impl pallet_assets_freezer::Config for Runtime { + type RuntimeFreezeReason = RuntimeFreezeReason; + type RuntimeEvent = RuntimeEvent; +} + parameter_types! { // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. pub const DepositBase: Balance = deposit(1, 88); @@ -943,6 +964,9 @@ construct_runtime!( NftFractionalization: pallet_nft_fractionalization = 54, PoolAssets: pallet_assets:: = 55, AssetConversion: pallet_asset_conversion = 56, + AssetsFreezer: pallet_assets_freezer:: = 57, + ForeignAssetsFreezer: pallet_assets_freezer:: = 58, + PoolAssetsFreezer: pallet_assets_freezer:: = 59, StateTrieMigration: pallet_state_trie_migration = 70, diff --git a/prdoc/pr_3951.prdoc b/prdoc/pr_3951.prdoc new file mode 100644 index 00000000000..3a8096e6f44 --- /dev/null +++ b/prdoc/pr_3951.prdoc @@ -0,0 +1,30 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Pallet Assets Freezer + +doc: + - audience: Runtime Dev + description: | + This pallet is an extension of `pallet-assets`, supporting + freezes similar to `pallet-balances`. + To use this pallet, set `Freezer` of `pallet-assets` Config to the according instance of + `pallet-assets-freezer`. + - audience: Runtime User + description: | + The storage of this pallet contains a Vecs of account freezes. Applications UIs and Developer + Tools might benefit from observing it. + +crates: + - name: frame-support + bump: minor + - name: pallet-assets-freezer + bump: major + - name: pallet-assets + bump: patch + - name: pallet-balances + bump: patch + - name: asset-hub-rococo-runtime + bump: minor + - name: asset-hub-westend-runtime + bump: minor diff --git a/substrate/frame/assets-freezer/Cargo.toml b/substrate/frame/assets-freezer/Cargo.toml new file mode 100644 index 00000000000..d7b5d2d40c4 --- /dev/null +++ b/substrate/frame/assets-freezer/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "pallet-assets-freezer" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "MIT-0" +homepage = "https://substrate.io" +repository.workspace = true +description = "Provides freezing features to `pallet-assets`" + +[lints] +workspace = true + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +log = { workspace = true } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } +frame-support = { path = "../support", default-features = false } +frame-system = { path = "../system", default-features = false } +pallet-assets = { path = "../assets", default-features = false } +sp-runtime = { path = "../../primitives/runtime", default-features = false } + +[dev-dependencies] +sp-io = { path = "../../primitives/io", default-features = false } +sp-core = { path = "../../primitives/core", default-features = false } +pallet-balances = { path = "../balances", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-benchmarking?/std", + "frame-support/std", + "frame-system/std", + "log/std", + "pallet-assets/std", + "pallet-balances/std", + "scale-info/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-assets/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-assets/try-runtime", + "pallet-balances/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/substrate/frame/assets-freezer/src/impls.rs b/substrate/frame/assets-freezer/src/impls.rs new file mode 100644 index 00000000000..cd383f1c3cd --- /dev/null +++ b/substrate/frame/assets-freezer/src/impls.rs @@ -0,0 +1,158 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::*; + +use frame_support::traits::{ + fungibles::{Inspect, InspectFreeze, MutateFreeze}, + tokens::{DepositConsequence, Fortitude, Preservation, Provenance, WithdrawConsequence}, +}; +use pallet_assets::FrozenBalance; +use sp_runtime::traits::Zero; + +// Implements [`FrozenBalance`] from [`pallet-assets`], so it can understand how much of an +// account balance is frozen, and is able to signal to this pallet when to clear the state of an +// account. +impl, I: 'static> FrozenBalance + for Pallet +{ + fn frozen_balance(asset: T::AssetId, who: &T::AccountId) -> Option { + FrozenBalances::::get(asset, who) + } + + fn died(asset: T::AssetId, who: &T::AccountId) { + FrozenBalances::::remove(asset.clone(), who); + Freezes::::remove(asset, who); + } +} + +// Implement [`fungibles::Inspect`](frame_support::traits::fungibles::Inspect) as it is bound by +// [`fungibles::InspectFreeze`](frame_support::traits::fungibles::InspectFreeze) and +// [`fungibles::MutateFreeze`](frame_support::traits::fungibles::MutateFreeze). To do so, we'll +// re-export all of `pallet-assets` implementation of the same trait. +impl, I: 'static> Inspect for Pallet { + type AssetId = T::AssetId; + type Balance = T::Balance; + + fn total_issuance(asset: Self::AssetId) -> Self::Balance { + pallet_assets::Pallet::::total_issuance(asset) + } + + fn minimum_balance(asset: Self::AssetId) -> Self::Balance { + pallet_assets::Pallet::::minimum_balance(asset) + } + + fn total_balance(asset: Self::AssetId, who: &T::AccountId) -> Self::Balance { + pallet_assets::Pallet::::total_balance(asset, who) + } + + fn balance(asset: Self::AssetId, who: &T::AccountId) -> Self::Balance { + pallet_assets::Pallet::::balance(asset, who) + } + + fn reducible_balance( + asset: Self::AssetId, + who: &T::AccountId, + preservation: Preservation, + force: Fortitude, + ) -> Self::Balance { + pallet_assets::Pallet::::reducible_balance(asset, who, preservation, force) + } + + fn can_deposit( + asset: Self::AssetId, + who: &T::AccountId, + amount: Self::Balance, + provenance: Provenance, + ) -> DepositConsequence { + pallet_assets::Pallet::::can_deposit(asset, who, amount, provenance) + } + + fn can_withdraw( + asset: Self::AssetId, + who: &T::AccountId, + amount: Self::Balance, + ) -> WithdrawConsequence { + pallet_assets::Pallet::::can_withdraw(asset, who, amount) + } + + fn asset_exists(asset: Self::AssetId) -> bool { + pallet_assets::Pallet::::asset_exists(asset) + } +} + +impl, I: 'static> InspectFreeze for Pallet { + type Id = T::RuntimeFreezeReason; + + fn balance_frozen(asset: Self::AssetId, id: &Self::Id, who: &T::AccountId) -> Self::Balance { + let freezes = Freezes::::get(asset, who); + freezes.into_iter().find(|l| &l.id == id).map_or(Zero::zero(), |l| l.amount) + } + + fn can_freeze(asset: Self::AssetId, id: &Self::Id, who: &T::AccountId) -> bool { + let freezes = Freezes::::get(asset, who); + !freezes.is_full() || freezes.into_iter().any(|i| i.id == *id) + } +} + +impl, I: 'static> MutateFreeze for Pallet { + fn set_freeze( + asset: Self::AssetId, + id: &Self::Id, + who: &T::AccountId, + amount: Self::Balance, + ) -> sp_runtime::DispatchResult { + if amount.is_zero() { + return Self::thaw(asset, id, who); + } + let mut freezes = Freezes::::get(asset.clone(), who); + if let Some(i) = freezes.iter_mut().find(|i| &i.id == id) { + i.amount = amount; + } else { + freezes + .try_push(IdAmount { id: *id, amount }) + .map_err(|_| Error::::TooManyFreezes)?; + } + Self::update_freezes(asset, who, freezes.as_bounded_slice()) + } + + fn extend_freeze( + asset: Self::AssetId, + id: &Self::Id, + who: &T::AccountId, + amount: Self::Balance, + ) -> sp_runtime::DispatchResult { + if amount.is_zero() { + return Ok(()); + } + let mut freezes = Freezes::::get(asset.clone(), who); + if let Some(i) = freezes.iter_mut().find(|x| &x.id == id) { + i.amount = i.amount.max(amount); + } else { + freezes + .try_push(IdAmount { id: *id, amount }) + .map_err(|_| Error::::TooManyFreezes)?; + } + Self::update_freezes(asset, who, freezes.as_bounded_slice()) + } + + fn thaw(asset: Self::AssetId, id: &Self::Id, who: &T::AccountId) -> sp_runtime::DispatchResult { + let mut freezes = Freezes::::get(asset.clone(), who); + freezes.retain(|f| &f.id != id); + Self::update_freezes(asset, who, freezes.as_bounded_slice()) + } +} diff --git a/substrate/frame/assets-freezer/src/lib.rs b/substrate/frame/assets-freezer/src/lib.rs new file mode 100644 index 00000000000..b42d41ac1d9 --- /dev/null +++ b/substrate/frame/assets-freezer/src/lib.rs @@ -0,0 +1,176 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # Assets Freezer Pallet +//! +//! A pallet capable of freezing fungibles from `pallet-assets`. This is an extension of +//! `pallet-assets`, wrapping [`fungibles::Inspect`](`frame_support::traits::fungibles::Inspect`). +//! It implements both +//! [`fungibles::freeze::Inspect`](frame_support::traits::fungibles::freeze::Inspect) and +//! [`fungibles::freeze::Mutate`](frame_support::traits::fungibles::freeze::Mutate). The complexity +//! of the operations is `O(n)`. where `n` is the variant count of `RuntimeFreezeReason`. +//! +//! ## Pallet API +//! +//! See the [`pallet`] module for more information about the interfaces this pallet exposes, +//! including its configuration trait, dispatchables, storage items, events and errors. +//! +//! ## Overview +//! +//! This pallet provides the following functionality: +//! +//! - Pallet hooks allowing [`pallet-assets`] to know the frozen balance for an account on a given +//! asset (see [`pallet_assets::FrozenBalance`]). +//! - An implementation of +//! [`fungibles::freeze::Inspect`](frame_support::traits::fungibles::freeze::Inspect) and +//! [`fungibles::freeze::Mutate`](frame_support::traits::fungibles::freeze::Mutate), allowing +//! other pallets to manage freezes for the `pallet-assets` assets. + +#![cfg_attr(not(feature = "std"), no_std)] + +use frame_support::{ + pallet_prelude::*, + traits::{tokens::IdAmount, VariantCount, VariantCountOf}, + BoundedVec, +}; +use frame_system::pallet_prelude::BlockNumberFor; +use sp_runtime::{ + traits::{Saturating, Zero}, + BoundedSlice, +}; + +pub use pallet::*; + +#[cfg(test)] +mod mock; +#[cfg(test)] +mod tests; + +mod impls; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + + #[pallet::config(with_default)] + pub trait Config: frame_system::Config + pallet_assets::Config { + /// The overarching freeze reason. + #[pallet::no_default_bounds] + type RuntimeFreezeReason: Parameter + Member + MaxEncodedLen + Copy + VariantCount; + + /// The overarching event type. + #[pallet::no_default_bounds] + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + } + + #[pallet::error] + pub enum Error { + /// Number of freezes on an account would exceed `MaxFreezes`. + TooManyFreezes, + } + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event, I: 'static = ()> { + // `who`s frozen balance was increased by `amount`. + Frozen { who: T::AccountId, asset_id: T::AssetId, amount: T::Balance }, + // `who`s frozen balance was decreased by `amount`. + Thawed { who: T::AccountId, asset_id: T::AssetId, amount: T::Balance }, + } + + /// A map that stores freezes applied on an account for a given AssetId. + #[pallet::storage] + pub(super) type Freezes, I: 'static = ()> = StorageDoubleMap< + _, + Blake2_128Concat, + T::AssetId, + Blake2_128Concat, + T::AccountId, + BoundedVec< + IdAmount, + VariantCountOf, + >, + ValueQuery, + >; + + /// A map that stores the current total frozen balance for every account on a given AssetId. + #[pallet::storage] + pub(super) type FrozenBalances, I: 'static = ()> = StorageDoubleMap< + _, + Blake2_128Concat, + T::AssetId, + Blake2_128Concat, + T::AccountId, + T::Balance, + >; + + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet { + #[cfg(feature = "try-runtime")] + fn try_state(_: BlockNumberFor) -> Result<(), sp_runtime::TryRuntimeError> { + Self::do_try_state() + } + } +} + +impl, I: 'static> Pallet { + fn update_freezes( + asset: T::AssetId, + who: &T::AccountId, + freezes: BoundedSlice< + IdAmount, + VariantCountOf, + >, + ) -> DispatchResult { + let prev_frozen = FrozenBalances::::get(asset.clone(), who).unwrap_or_default(); + let after_frozen = freezes.into_iter().map(|f| f.amount).max().unwrap_or_else(Zero::zero); + FrozenBalances::::set(asset.clone(), who, Some(after_frozen)); + if freezes.is_empty() { + Freezes::::remove(asset.clone(), who); + FrozenBalances::::remove(asset.clone(), who); + } else { + Freezes::::insert(asset.clone(), who, freezes); + } + if prev_frozen > after_frozen { + let amount = prev_frozen.saturating_sub(after_frozen); + Self::deposit_event(Event::Thawed { asset_id: asset, who: who.clone(), amount }); + } else if after_frozen > prev_frozen { + let amount = after_frozen.saturating_sub(prev_frozen); + Self::deposit_event(Event::Frozen { asset_id: asset, who: who.clone(), amount }); + } + Ok(()) + } + + #[cfg(any(test, feature = "try-runtime"))] + fn do_try_state() -> Result<(), sp_runtime::TryRuntimeError> { + for (asset, who, _) in FrozenBalances::::iter() { + let max_frozen_amount = + Freezes::::get(asset.clone(), who.clone()).iter().map(|l| l.amount).max(); + + frame_support::ensure!( + FrozenBalances::::get(asset, who) == max_frozen_amount, + "The `FrozenAmount` is not equal to the maximum amount in `Freezes` for (`asset`, `who`)" + ); + } + + Ok(()) + } +} diff --git a/substrate/frame/assets-freezer/src/mock.rs b/substrate/frame/assets-freezer/src/mock.rs new file mode 100644 index 00000000000..b4e8c857fba --- /dev/null +++ b/substrate/frame/assets-freezer/src/mock.rs @@ -0,0 +1,154 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Tests mock for `pallet-assets-freezer`. + +use crate as pallet_assets_freezer; +pub use crate::*; +use codec::{Compact, Decode, Encode, MaxEncodedLen}; +use frame_support::{ + derive_impl, + traits::{AsEnsureOriginWithArg, ConstU64}, +}; +use scale_info::TypeInfo; +use sp_core::{ConstU32, H256}; +use sp_runtime::{ + traits::{BlakeTwo256, IdentityLookup}, + BuildStorage, +}; + +pub type AccountId = u64; +pub type Balance = u64; +pub type AssetId = u32; +type Block = frame_system::mocking::MockBlock; + +frame_support::construct_runtime!( + pub enum Test + { + System: frame_system, + Assets: pallet_assets, + AssetsFreezer: pallet_assets_freezer, + Balances: pallet_balances, + } +); + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for Test { + type BaseCallFilter = frame_support::traits::Everything; + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); + type RuntimeOrigin = RuntimeOrigin; + type Nonce = u64; + type Hash = H256; + type RuntimeCall = RuntimeCall; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Block = Block; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +impl pallet_balances::Config for Test { + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type Balance = Balance; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ConstU64<1>; + type AccountStore = System; + type WeightInfo = (); + type FreezeIdentifier = (); + type MaxFreezes = (); + type RuntimeHoldReason = (); + type RuntimeFreezeReason = (); +} + +impl pallet_assets::Config for Test { + type AssetId = AssetId; + type AssetIdParameter = Compact; + type AssetDeposit = ConstU64<1>; + type Balance = Balance; + type AssetAccountDeposit = ConstU64<1>; + type MetadataDepositBase = (); + type MetadataDepositPerByte = (); + type ApprovalDeposit = (); + type CreateOrigin = AsEnsureOriginWithArg>; + type ForceOrigin = frame_system::EnsureRoot; + type StringLimit = ConstU32<32>; + type Extra = (); + type RemoveItemsLimit = ConstU32<10>; + type CallbackHandle = (); + type Currency = Balances; + type Freezer = AssetsFreezer; + type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = (); +} + +#[derive( + Decode, Encode, MaxEncodedLen, PartialEq, Eq, Ord, PartialOrd, TypeInfo, Debug, Clone, Copy, +)] +pub enum DummyFreezeReason { + Governance, + Staking, + Other, +} + +impl VariantCount for DummyFreezeReason { + // Intentionally set below the actual count of variants, to allow testing for `can_freeze` + const VARIANT_COUNT: u32 = 2; +} + +impl Config for Test { + type RuntimeFreezeReason = DummyFreezeReason; + type RuntimeEvent = RuntimeEvent; +} + +pub fn new_test_ext(execute: impl FnOnce()) -> sp_io::TestExternalities { + let t = RuntimeGenesisConfig { + assets: pallet_assets::GenesisConfig { + assets: vec![(1, 0, true, 1)], + metadata: vec![], + accounts: vec![(1, 1, 100)], + }, + system: Default::default(), + balances: Default::default(), + } + .build_storage() + .unwrap(); + let mut ext: sp_io::TestExternalities = t.into(); + ext.execute_with(|| { + System::set_block_number(1); + execute(); + frame_support::assert_ok!(AssetsFreezer::do_try_state()); + }); + + ext +} diff --git a/substrate/frame/assets-freezer/src/tests.rs b/substrate/frame/assets-freezer/src/tests.rs new file mode 100644 index 00000000000..4f2dea79c70 --- /dev/null +++ b/substrate/frame/assets-freezer/src/tests.rs @@ -0,0 +1,304 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Tests for pallet-assets-freezer. + +use crate::mock::*; + +use codec::Compact; +use frame_support::{ + assert_ok, assert_storage_noop, + traits::{ + fungibles::{Inspect, InspectFreeze, MutateFreeze}, + tokens::{Fortitude, Preservation}, + }, +}; +use pallet_assets::FrozenBalance; + +const WHO: AccountId = 1; +const ASSET_ID: AssetId = 1; + +fn test_set_freeze(id: DummyFreezeReason, amount: Balance) { + let mut freezes = Freezes::::get(ASSET_ID, WHO); + + if let Some(i) = freezes.iter_mut().find(|l| l.id == id) { + i.amount = amount; + } else { + freezes + .try_push(IdAmount { id, amount }) + .expect("freeze is added without exceeding bounds; qed"); + } + + assert_ok!(AssetsFreezer::update_freezes(ASSET_ID, &WHO, freezes.as_bounded_slice())); +} + +fn test_thaw(id: DummyFreezeReason) { + let mut freezes = Freezes::::get(ASSET_ID, WHO); + freezes.retain(|l| l.id != id); + + assert_ok!(AssetsFreezer::update_freezes(ASSET_ID, &WHO, freezes.as_bounded_slice())); +} + +mod impl_frozen_balance { + use super::*; + + #[test] + fn frozen_balance_works() { + new_test_ext(|| { + assert_eq!(AssetsFreezer::frozen_balance(ASSET_ID, &WHO), None); + test_set_freeze(DummyFreezeReason::Governance, 1); + assert_eq!(AssetsFreezer::frozen_balance(ASSET_ID, &WHO), Some(1u64)); + test_set_freeze(DummyFreezeReason::Staking, 3); + assert_eq!(AssetsFreezer::frozen_balance(ASSET_ID, &WHO), Some(3u64)); + test_set_freeze(DummyFreezeReason::Governance, 2); + assert_eq!(AssetsFreezer::frozen_balance(ASSET_ID, &WHO), Some(3u64)); + // also test thawing works to reduce a balance, and finally thawing everything resets to + // None + test_thaw(DummyFreezeReason::Governance); + assert_eq!(AssetsFreezer::frozen_balance(ASSET_ID, &WHO), Some(3u64)); + test_thaw(DummyFreezeReason::Staking); + assert_eq!(AssetsFreezer::frozen_balance(ASSET_ID, &WHO), None); + }); + } + + #[test] + fn died_works() { + new_test_ext(|| { + test_set_freeze(DummyFreezeReason::Governance, 1); + AssetsFreezer::died(ASSET_ID, &WHO); + assert!(FrozenBalances::::get(ASSET_ID, WHO).is_none()); + assert!(Freezes::::get(ASSET_ID, WHO).is_empty()); + }); + } +} + +mod impl_inspect_freeze { + use super::*; + + #[test] + fn balance_frozen_works() { + new_test_ext(|| { + assert_eq!( + AssetsFreezer::balance_frozen(ASSET_ID, &DummyFreezeReason::Governance, &WHO), + 0u64 + ); + test_set_freeze(DummyFreezeReason::Governance, 1); + assert_eq!( + AssetsFreezer::balance_frozen(ASSET_ID, &DummyFreezeReason::Governance, &WHO), + 1u64 + ); + test_set_freeze(DummyFreezeReason::Staking, 3); + assert_eq!( + AssetsFreezer::balance_frozen(ASSET_ID, &DummyFreezeReason::Staking, &WHO), + 3u64 + ); + test_set_freeze(DummyFreezeReason::Staking, 2); + assert_eq!( + AssetsFreezer::balance_frozen(ASSET_ID, &DummyFreezeReason::Staking, &WHO), + 2u64 + ); + // also test thawing works to reduce a balance, and finally thawing everything resets to + // 0 + test_thaw(DummyFreezeReason::Governance); + assert_eq!( + AssetsFreezer::balance_frozen(ASSET_ID, &DummyFreezeReason::Governance, &WHO), + 0u64 + ); + test_thaw(DummyFreezeReason::Staking); + assert_eq!( + AssetsFreezer::balance_frozen(ASSET_ID, &DummyFreezeReason::Staking, &WHO), + 0u64 + ); + }); + } + + /// This tests it's not possible to freeze once the freezes [`BoundedVec`] is full. This is, + /// the lenght of the vec is equal to [`Config::MaxFreezes`]. + /// This test assumes a mock configuration where this parameter is set to `2`. + #[test] + fn can_freeze_works() { + new_test_ext(|| { + test_set_freeze(DummyFreezeReason::Governance, 1); + assert!(AssetsFreezer::can_freeze(ASSET_ID, &DummyFreezeReason::Staking, &WHO)); + test_set_freeze(DummyFreezeReason::Staking, 1); + assert!(!AssetsFreezer::can_freeze(ASSET_ID, &DummyFreezeReason::Other, &WHO)); + }); + } +} + +mod impl_mutate_freeze { + use super::*; + + #[test] + fn set_freeze_works() { + new_test_ext(|| { + assert_eq!( + Assets::reducible_balance( + ASSET_ID, + &WHO, + Preservation::Preserve, + Fortitude::Polite, + ), + 99 + ); + assert_ok!(AssetsFreezer::set_freeze( + ASSET_ID, + &DummyFreezeReason::Governance, + &WHO, + 10 + )); + assert_eq!( + Assets::reducible_balance( + ASSET_ID, + &WHO, + Preservation::Preserve, + Fortitude::Polite, + ), + 89 + ); + System::assert_last_event( + Event::::Frozen { asset_id: ASSET_ID, who: WHO, amount: 10 }.into(), + ); + assert_ok!(AssetsFreezer::set_freeze( + ASSET_ID, + &DummyFreezeReason::Governance, + &WHO, + 8 + )); + assert_eq!( + Assets::reducible_balance( + ASSET_ID, + &WHO, + Preservation::Preserve, + Fortitude::Polite, + ), + 91 + ); + System::assert_last_event( + Event::::Thawed { asset_id: ASSET_ID, who: WHO, amount: 2 }.into(), + ); + }); + } + + #[test] + fn extend_freeze_works() { + new_test_ext(|| { + assert_ok!(AssetsFreezer::set_freeze( + ASSET_ID, + &DummyFreezeReason::Governance, + &WHO, + 10 + )); + assert_storage_noop!(assert_ok!(AssetsFreezer::extend_freeze( + ASSET_ID, + &DummyFreezeReason::Governance, + &WHO, + 8 + ))); + System::assert_last_event( + Event::::Frozen { asset_id: ASSET_ID, who: WHO, amount: 10 }.into(), + ); + assert_eq!( + Assets::reducible_balance( + ASSET_ID, + &WHO, + Preservation::Preserve, + Fortitude::Polite, + ), + 89 + ); + assert_ok!(AssetsFreezer::extend_freeze( + ASSET_ID, + &DummyFreezeReason::Governance, + &WHO, + 11 + )); + System::assert_last_event( + Event::::Frozen { asset_id: ASSET_ID, who: WHO, amount: 1 }.into(), + ); + assert_eq!( + Assets::reducible_balance( + ASSET_ID, + &WHO, + Preservation::Preserve, + Fortitude::Polite, + ), + 88 + ); + }); + } + + #[test] + fn thaw_works() { + new_test_ext(|| { + assert_ok!(AssetsFreezer::set_freeze( + ASSET_ID, + &DummyFreezeReason::Governance, + &WHO, + 10 + )); + System::assert_has_event( + Event::::Frozen { asset_id: ASSET_ID, who: WHO, amount: 10 }.into(), + ); + assert_eq!( + Assets::reducible_balance( + ASSET_ID, + &WHO, + Preservation::Preserve, + Fortitude::Polite, + ), + 89 + ); + assert_ok!(AssetsFreezer::thaw(ASSET_ID, &DummyFreezeReason::Governance, &WHO)); + System::assert_has_event( + Event::::Thawed { asset_id: ASSET_ID, who: WHO, amount: 10 }.into(), + ); + assert_eq!( + Assets::reducible_balance( + ASSET_ID, + &WHO, + Preservation::Preserve, + Fortitude::Polite, + ), + 99 + ); + }); + } +} + +mod with_pallet_assets { + use frame_support::assert_noop; + + use super::*; + + #[test] + fn frozen_balance_affects_balance_transferring() { + new_test_ext(|| { + assert_ok!(AssetsFreezer::set_freeze( + ASSET_ID, + &DummyFreezeReason::Governance, + &WHO, + 20 + )); + assert_noop!( + Assets::transfer(RuntimeOrigin::signed(WHO), Compact(ASSET_ID), 2, 80), + pallet_assets::Error::::BalanceLow, + ); + assert_ok!(Assets::transfer(RuntimeOrigin::signed(WHO), Compact(ASSET_ID), 2, 79)); + }); + } +} diff --git a/substrate/frame/balances/src/lib.rs b/substrate/frame/balances/src/lib.rs index 4935323b3aa..d01884293c0 100644 --- a/substrate/frame/balances/src/lib.rs +++ b/substrate/frame/balances/src/lib.rs @@ -158,6 +158,7 @@ use frame_support::{ tokens::{ fungible, BalanceStatus as Status, DepositConsequence, Fortitude::{self, Force, Polite}, + IdAmount, Preservation::{Expendable, Preserve, Protect}, WithdrawConsequence, }, @@ -177,8 +178,7 @@ use sp_runtime::{ }; use sp_std::{cmp, fmt::Debug, mem, prelude::*, result}; pub use types::{ - AccountData, AdjustmentDirection, BalanceLock, DustCleaner, ExtraFlags, IdAmount, Reasons, - ReserveData, + AccountData, AdjustmentDirection, BalanceLock, DustCleaner, ExtraFlags, Reasons, ReserveData, }; pub use weights::WeightInfo; diff --git a/substrate/frame/balances/src/types.rs b/substrate/frame/balances/src/types.rs index 3e36a83575c..917b7507d7c 100644 --- a/substrate/frame/balances/src/types.rs +++ b/substrate/frame/balances/src/types.rs @@ -78,15 +78,6 @@ pub struct ReserveData { pub amount: Balance, } -/// An identifier and balance. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, MaxEncodedLen, TypeInfo)] -pub struct IdAmount { - /// An identifier for this item. - pub id: Id, - /// Some amount for this item. - pub amount: Balance, -} - /// All balance information for an account. #[derive(Encode, Decode, Clone, PartialEq, Eq, Default, RuntimeDebug, MaxEncodedLen, TypeInfo)] pub struct AccountData { diff --git a/substrate/frame/support/src/traits/tokens.rs b/substrate/frame/support/src/traits/tokens.rs index 8842b205801..138703cf1d1 100644 --- a/substrate/frame/support/src/traits/tokens.rs +++ b/substrate/frame/support/src/traits/tokens.rs @@ -30,8 +30,8 @@ pub use imbalance::Imbalance; pub mod pay; pub use misc::{ AssetId, Balance, BalanceStatus, ConversionFromAssetBalance, ConversionToAssetBalance, - ConvertRank, DepositConsequence, ExistenceRequirement, Fortitude, GetSalary, Locker, Precision, - Preservation, Provenance, Restriction, UnityAssetBalanceConversion, UnityOrOuterConversion, - WithdrawConsequence, WithdrawReasons, + ConvertRank, DepositConsequence, ExistenceRequirement, Fortitude, GetSalary, IdAmount, Locker, + Precision, Preservation, Provenance, Restriction, UnityAssetBalanceConversion, + UnityOrOuterConversion, WithdrawConsequence, WithdrawReasons, }; pub use pay::{Pay, PayFromAccount, PaymentStatus}; diff --git a/substrate/frame/support/src/traits/tokens/misc.rs b/substrate/frame/support/src/traits/tokens/misc.rs index 424acb1d550..e1ff1e058ae 100644 --- a/substrate/frame/support/src/traits/tokens/misc.rs +++ b/substrate/frame/support/src/traits/tokens/misc.rs @@ -17,7 +17,7 @@ //! Miscellaneous types. -use crate::traits::Contains; +use crate::{traits::Contains, TypeInfo}; use codec::{Decode, Encode, FullCodec, MaxEncodedLen}; use sp_arithmetic::traits::{AtLeast32BitUnsigned, Zero}; use sp_core::RuntimeDebug; @@ -357,3 +357,12 @@ impl> GetSalary for ConvertRank { C::convert(rank) } } + +/// An identifier and balance. +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, MaxEncodedLen, TypeInfo)] +pub struct IdAmount { + /// An identifier for this item. + pub id: Id, + /// Some amount for this item. + pub amount: Balance, +} diff --git a/umbrella/Cargo.toml b/umbrella/Cargo.toml index d790b4f5949..93af28a7ddd 100644 --- a/umbrella/Cargo.toml +++ b/umbrella/Cargo.toml @@ -68,6 +68,7 @@ std = [ "pallet-asset-conversion?/std", "pallet-asset-rate?/std", "pallet-asset-tx-payment?/std", + "pallet-assets-freezer?/std", "pallet-assets?/std", "pallet-atomic-swap?/std", "pallet-aura?/std", @@ -263,6 +264,7 @@ runtime-benchmarks = [ "pallet-asset-conversion?/runtime-benchmarks", "pallet-asset-rate?/runtime-benchmarks", "pallet-asset-tx-payment?/runtime-benchmarks", + "pallet-assets-freezer?/runtime-benchmarks", "pallet-assets?/runtime-benchmarks", "pallet-babe?/runtime-benchmarks", "pallet-bags-list?/runtime-benchmarks", @@ -385,6 +387,7 @@ try-runtime = [ "pallet-asset-conversion?/try-runtime", "pallet-asset-rate?/try-runtime", "pallet-asset-tx-payment?/try-runtime", + "pallet-assets-freezer?/try-runtime", "pallet-assets?/try-runtime", "pallet-atomic-swap?/try-runtime", "pallet-aura?/try-runtime", @@ -536,7 +539,7 @@ with-tracing = [ "sp-tracing?/with-tracing", "sp-tracing?/with-tracing", ] -runtime = ["assets-common", "binary-merkle-tree", "bp-asset-hub-rococo", "bp-asset-hub-westend", "bp-bridge-hub-cumulus", "bp-bridge-hub-kusama", "bp-bridge-hub-polkadot", "bp-bridge-hub-rococo", "bp-bridge-hub-westend", "bp-header-chain", "bp-kusama", "bp-messages", "bp-parachains", "bp-polkadot", "bp-polkadot-bulletin", "bp-polkadot-core", "bp-relayers", "bp-rococo", "bp-runtime", "bp-test-utils", "bp-westend", "bp-xcm-bridge-hub", "bp-xcm-bridge-hub-router", "bridge-hub-common", "bridge-runtime-common", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", "cumulus-pallet-parachain-system-proc-macro", "cumulus-pallet-session-benchmarking", "cumulus-pallet-solo-to-para", "cumulus-pallet-xcm", "cumulus-pallet-xcmp-queue", "cumulus-ping", "cumulus-primitives-aura", "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", "cumulus-primitives-proof-size-hostfunction", "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-timestamp", "cumulus-primitives-utility", "frame-benchmarking", "frame-benchmarking-pallet-pov", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-executive", "frame-metadata-hash-extension", "frame-support", "frame-support-procedural", "frame-support-procedural-tools-derive", "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", "pallet-alliance", "pallet-asset-conversion", "pallet-asset-conversion-ops", "pallet-asset-conversion-tx-payment", "pallet-asset-rate", "pallet-asset-tx-payment", "pallet-assets", "pallet-atomic-swap", "pallet-aura", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", "pallet-bags-list", "pallet-balances", "pallet-beefy", "pallet-beefy-mmr", "pallet-bounties", "pallet-bridge-grandpa", "pallet-bridge-messages", "pallet-bridge-parachains", "pallet-bridge-relayers", "pallet-broker", "pallet-child-bounties", "pallet-collator-selection", "pallet-collective", "pallet-collective-content", "pallet-contracts", "pallet-contracts-proc-macro", "pallet-contracts-uapi", "pallet-conviction-voting", "pallet-core-fellowship", "pallet-delegated-staking", "pallet-democracy", "pallet-dev-mode", "pallet-election-provider-multi-phase", "pallet-election-provider-support-benchmarking", "pallet-elections-phragmen", "pallet-fast-unstake", "pallet-glutton", "pallet-grandpa", "pallet-identity", "pallet-im-online", "pallet-indices", "pallet-insecure-randomness-collective-flip", "pallet-lottery", "pallet-membership", "pallet-message-queue", "pallet-migrations", "pallet-mixnet", "pallet-mmr", "pallet-multisig", "pallet-nft-fractionalization", "pallet-nfts", "pallet-nfts-runtime-api", "pallet-nis", "pallet-node-authorization", "pallet-nomination-pools", "pallet-nomination-pools-benchmarking", "pallet-nomination-pools-runtime-api", "pallet-offences", "pallet-offences-benchmarking", "pallet-paged-list", "pallet-parameters", "pallet-preimage", "pallet-proxy", "pallet-ranked-collective", "pallet-recovery", "pallet-referenda", "pallet-remark", "pallet-root-offences", "pallet-root-testing", "pallet-safe-mode", "pallet-salary", "pallet-scheduler", "pallet-scored-pool", "pallet-session", "pallet-session-benchmarking", "pallet-skip-feeless-payment", "pallet-society", "pallet-staking", "pallet-staking-reward-curve", "pallet-staking-reward-fn", "pallet-staking-runtime-api", "pallet-state-trie-migration", "pallet-statement", "pallet-sudo", "pallet-timestamp", "pallet-tips", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", "pallet-transaction-storage", "pallet-treasury", "pallet-tx-pause", "pallet-uniques", "pallet-utility", "pallet-vesting", "pallet-whitelist", "pallet-xcm", "pallet-xcm-benchmarks", "pallet-xcm-bridge-hub", "pallet-xcm-bridge-hub-router", "parachains-common", "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-primitives", "polkadot-runtime-common", "polkadot-runtime-metrics", "polkadot-runtime-parachains", "polkadot-sdk-frame", "rococo-runtime-constants", "sc-chain-spec-derive", "sc-tracing-proc-macro", "slot-range-helper", "snowbridge-beacon-primitives", "snowbridge-core", "snowbridge-ethereum", "snowbridge-outbound-queue-merkle-tree", "snowbridge-outbound-queue-runtime-api", "snowbridge-pallet-ethereum-client", "snowbridge-pallet-ethereum-client-fixtures", "snowbridge-pallet-inbound-queue", "snowbridge-pallet-inbound-queue-fixtures", "snowbridge-pallet-outbound-queue", "snowbridge-pallet-system", "snowbridge-router-primitives", "snowbridge-runtime-common", "snowbridge-system-runtime-api", "sp-api", "sp-api-proc-macro", "sp-application-crypto", "sp-arithmetic", "sp-authority-discovery", "sp-block-builder", "sp-consensus-aura", "sp-consensus-babe", "sp-consensus-beefy", "sp-consensus-grandpa", "sp-consensus-pow", "sp-consensus-slots", "sp-core", "sp-crypto-ec-utils", "sp-crypto-hashing", "sp-crypto-hashing-proc-macro", "sp-debug-derive", "sp-externalities", "sp-genesis-builder", "sp-inherents", "sp-io", "sp-keyring", "sp-keystore", "sp-metadata-ir", "sp-mixnet", "sp-mmr-primitives", "sp-npos-elections", "sp-offchain", "sp-runtime", "sp-runtime-interface", "sp-runtime-interface-proc-macro", "sp-session", "sp-staking", "sp-state-machine", "sp-statement-store", "sp-std", "sp-storage", "sp-timestamp", "sp-tracing", "sp-transaction-pool", "sp-transaction-storage-proof", "sp-trie", "sp-version", "sp-version-proc-macro", "sp-wasm-interface", "sp-weights", "staging-parachain-info", "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", "substrate-bip39", "testnet-parachains-constants", "tracing-gum-proc-macro", "westend-runtime-constants", "xcm-fee-payment-runtime-api", "xcm-procedural"] +runtime = ["assets-common", "binary-merkle-tree", "bp-asset-hub-rococo", "bp-asset-hub-westend", "bp-bridge-hub-cumulus", "bp-bridge-hub-kusama", "bp-bridge-hub-polkadot", "bp-bridge-hub-rococo", "bp-bridge-hub-westend", "bp-header-chain", "bp-kusama", "bp-messages", "bp-parachains", "bp-polkadot", "bp-polkadot-bulletin", "bp-polkadot-core", "bp-relayers", "bp-rococo", "bp-runtime", "bp-test-utils", "bp-westend", "bp-xcm-bridge-hub", "bp-xcm-bridge-hub-router", "bridge-hub-common", "bridge-runtime-common", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", "cumulus-pallet-parachain-system-proc-macro", "cumulus-pallet-session-benchmarking", "cumulus-pallet-solo-to-para", "cumulus-pallet-xcm", "cumulus-pallet-xcmp-queue", "cumulus-ping", "cumulus-primitives-aura", "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", "cumulus-primitives-proof-size-hostfunction", "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-timestamp", "cumulus-primitives-utility", "frame-benchmarking", "frame-benchmarking-pallet-pov", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-executive", "frame-metadata-hash-extension", "frame-support", "frame-support-procedural", "frame-support-procedural-tools-derive", "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", "pallet-alliance", "pallet-asset-conversion", "pallet-asset-conversion-ops", "pallet-asset-conversion-tx-payment", "pallet-asset-rate", "pallet-asset-tx-payment", "pallet-assets", "pallet-assets-freezer", "pallet-atomic-swap", "pallet-aura", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", "pallet-bags-list", "pallet-balances", "pallet-beefy", "pallet-beefy-mmr", "pallet-bounties", "pallet-bridge-grandpa", "pallet-bridge-messages", "pallet-bridge-parachains", "pallet-bridge-relayers", "pallet-broker", "pallet-child-bounties", "pallet-collator-selection", "pallet-collective", "pallet-collective-content", "pallet-contracts", "pallet-contracts-proc-macro", "pallet-contracts-uapi", "pallet-conviction-voting", "pallet-core-fellowship", "pallet-delegated-staking", "pallet-democracy", "pallet-dev-mode", "pallet-election-provider-multi-phase", "pallet-election-provider-support-benchmarking", "pallet-elections-phragmen", "pallet-fast-unstake", "pallet-glutton", "pallet-grandpa", "pallet-identity", "pallet-im-online", "pallet-indices", "pallet-insecure-randomness-collective-flip", "pallet-lottery", "pallet-membership", "pallet-message-queue", "pallet-migrations", "pallet-mixnet", "pallet-mmr", "pallet-multisig", "pallet-nft-fractionalization", "pallet-nfts", "pallet-nfts-runtime-api", "pallet-nis", "pallet-node-authorization", "pallet-nomination-pools", "pallet-nomination-pools-benchmarking", "pallet-nomination-pools-runtime-api", "pallet-offences", "pallet-offences-benchmarking", "pallet-paged-list", "pallet-parameters", "pallet-preimage", "pallet-proxy", "pallet-ranked-collective", "pallet-recovery", "pallet-referenda", "pallet-remark", "pallet-root-offences", "pallet-root-testing", "pallet-safe-mode", "pallet-salary", "pallet-scheduler", "pallet-scored-pool", "pallet-session", "pallet-session-benchmarking", "pallet-skip-feeless-payment", "pallet-society", "pallet-staking", "pallet-staking-reward-curve", "pallet-staking-reward-fn", "pallet-staking-runtime-api", "pallet-state-trie-migration", "pallet-statement", "pallet-sudo", "pallet-timestamp", "pallet-tips", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", "pallet-transaction-storage", "pallet-treasury", "pallet-tx-pause", "pallet-uniques", "pallet-utility", "pallet-vesting", "pallet-whitelist", "pallet-xcm", "pallet-xcm-benchmarks", "pallet-xcm-bridge-hub", "pallet-xcm-bridge-hub-router", "parachains-common", "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-primitives", "polkadot-runtime-common", "polkadot-runtime-metrics", "polkadot-runtime-parachains", "polkadot-sdk-frame", "rococo-runtime-constants", "sc-chain-spec-derive", "sc-tracing-proc-macro", "slot-range-helper", "snowbridge-beacon-primitives", "snowbridge-core", "snowbridge-ethereum", "snowbridge-outbound-queue-merkle-tree", "snowbridge-outbound-queue-runtime-api", "snowbridge-pallet-ethereum-client", "snowbridge-pallet-ethereum-client-fixtures", "snowbridge-pallet-inbound-queue", "snowbridge-pallet-inbound-queue-fixtures", "snowbridge-pallet-outbound-queue", "snowbridge-pallet-system", "snowbridge-router-primitives", "snowbridge-runtime-common", "snowbridge-system-runtime-api", "sp-api", "sp-api-proc-macro", "sp-application-crypto", "sp-arithmetic", "sp-authority-discovery", "sp-block-builder", "sp-consensus-aura", "sp-consensus-babe", "sp-consensus-beefy", "sp-consensus-grandpa", "sp-consensus-pow", "sp-consensus-slots", "sp-core", "sp-crypto-ec-utils", "sp-crypto-hashing", "sp-crypto-hashing-proc-macro", "sp-debug-derive", "sp-externalities", "sp-genesis-builder", "sp-inherents", "sp-io", "sp-keyring", "sp-keystore", "sp-metadata-ir", "sp-mixnet", "sp-mmr-primitives", "sp-npos-elections", "sp-offchain", "sp-runtime", "sp-runtime-interface", "sp-runtime-interface-proc-macro", "sp-session", "sp-staking", "sp-state-machine", "sp-statement-store", "sp-std", "sp-storage", "sp-timestamp", "sp-tracing", "sp-transaction-pool", "sp-transaction-storage-proof", "sp-trie", "sp-version", "sp-version-proc-macro", "sp-wasm-interface", "sp-weights", "staging-parachain-info", "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", "substrate-bip39", "testnet-parachains-constants", "tracing-gum-proc-macro", "westend-runtime-constants", "xcm-fee-payment-runtime-api", "xcm-procedural"] node = ["asset-test-utils", "bridge-hub-test-utils", "cumulus-client-cli", "cumulus-client-collator", "cumulus-client-consensus-aura", "cumulus-client-consensus-common", "cumulus-client-consensus-proposer", "cumulus-client-consensus-relay-chain", "cumulus-client-network", "cumulus-client-parachain-inherent", "cumulus-client-pov-recovery", "cumulus-client-service", "cumulus-relay-chain-inprocess-interface", "cumulus-relay-chain-interface", "cumulus-relay-chain-minimal-node", "cumulus-relay-chain-rpc-interface", "cumulus-test-relay-sproof-builder", "emulated-integration-tests-common", "fork-tree", "frame-benchmarking-cli", "frame-remote-externalities", "frame-support-procedural-tools", "generate-bags", "mmr-gadget", "mmr-rpc", "pallet-contracts-mock-network", "pallet-transaction-payment-rpc", "parachains-runtimes-test-utils", "polkadot-approval-distribution", "polkadot-availability-bitfield-distribution", "polkadot-availability-distribution", "polkadot-availability-recovery", "polkadot-cli", "polkadot-collator-protocol", "polkadot-dispute-distribution", "polkadot-erasure-coding", "polkadot-gossip-support", "polkadot-network-bridge", "polkadot-node-collation-generation", "polkadot-node-core-approval-voting", "polkadot-node-core-av-store", "polkadot-node-core-backing", "polkadot-node-core-bitfield-signing", "polkadot-node-core-candidate-validation", "polkadot-node-core-chain-api", "polkadot-node-core-chain-selection", "polkadot-node-core-dispute-coordinator", "polkadot-node-core-parachains-inherent", "polkadot-node-core-prospective-parachains", "polkadot-node-core-provisioner", "polkadot-node-core-pvf", "polkadot-node-core-pvf-checker", "polkadot-node-core-pvf-common", "polkadot-node-core-pvf-execute-worker", "polkadot-node-core-pvf-prepare-worker", "polkadot-node-core-runtime-api", "polkadot-node-jaeger", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-types", "polkadot-node-subsystem-util", "polkadot-overseer", "polkadot-rpc", "polkadot-service", "polkadot-statement-distribution", "polkadot-statement-table", "sc-allocator", "sc-authority-discovery", "sc-basic-authorship", "sc-block-builder", "sc-chain-spec", "sc-cli", "sc-client-api", "sc-client-db", "sc-consensus", "sc-consensus-aura", "sc-consensus-babe", "sc-consensus-babe-rpc", "sc-consensus-beefy", "sc-consensus-beefy-rpc", "sc-consensus-epochs", "sc-consensus-grandpa", "sc-consensus-grandpa-rpc", "sc-consensus-manual-seal", "sc-consensus-pow", "sc-consensus-slots", "sc-executor", "sc-executor-common", "sc-executor-polkavm", "sc-executor-wasmtime", "sc-informant", "sc-keystore", "sc-mixnet", "sc-network", "sc-network-common", "sc-network-gossip", "sc-network-light", "sc-network-statement", "sc-network-sync", "sc-network-transactions", "sc-network-types", "sc-offchain", "sc-proposer-metrics", "sc-rpc", "sc-rpc-api", "sc-rpc-server", "sc-rpc-spec-v2", "sc-service", "sc-state-db", "sc-statement-store", "sc-storage-monitor", "sc-sync-state-rpc", "sc-sysinfo", "sc-telemetry", "sc-tracing", "sc-transaction-pool", "sc-transaction-pool-api", "sc-utils", "snowbridge-runtime-test-common", "sp-blockchain", "sp-consensus", "sp-core-hashing", "sp-core-hashing-proc-macro", "sp-database", "sp-maybe-compressed-blob", "sp-panic-handler", "sp-rpc", "staging-chain-spec-builder", "staging-node-inspect", "staging-tracking-allocator", "std", "subkey", "substrate-build-script-utils", "substrate-frame-rpc-support", "substrate-frame-rpc-system", "substrate-prometheus-endpoint", "substrate-rpc-client", "substrate-state-trie-migration-rpc", "substrate-wasm-builder", "tracing-gum", "xcm-emulator", "xcm-simulator"] tuples-96 = [ "frame-support-procedural?/tuples-96", @@ -854,6 +857,11 @@ path = "../substrate/frame/assets" default-features = false optional = true +[dependencies.pallet-assets-freezer] +path = "../substrate/frame/assets-freezer" +default-features = false +optional = true + [dependencies.pallet-atomic-swap] path = "../substrate/frame/atomic-swap" default-features = false diff --git a/umbrella/src/lib.rs b/umbrella/src/lib.rs index 78b34ba179b..87fcd4214db 100644 --- a/umbrella/src/lib.rs +++ b/umbrella/src/lib.rs @@ -360,6 +360,10 @@ pub use pallet_asset_tx_payment; #[cfg(feature = "pallet-assets")] pub use pallet_assets; +/// Provides freezing features to `pallet-assets`. +#[cfg(feature = "pallet-assets-freezer")] +pub use pallet_assets_freezer; + /// FRAME atomic swap pallet. #[cfg(feature = "pallet-atomic-swap")] pub use pallet_atomic_swap; -- GitLab From 3b3a1d2b99512aa3bb52a2af6fe6adc8c63ac984 Mon Sep 17 00:00:00 2001 From: Dmitry Markin Date: Fri, 21 Jun 2024 17:38:22 +0300 Subject: [PATCH 034/130] sc-network-types: implement `From for Multiaddr` (#4855) Add `From` implementation used by downstream project. Ref. https://github.com/paritytech/polkadot-sdk/pull/4198#discussion_r1648676102 CC @nazar-pc --- .../client/network/types/src/multiaddr.rs | 22 ++++++++++++++++ .../network/types/src/multiaddr/protocol.rs | 26 ++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/substrate/client/network/types/src/multiaddr.rs b/substrate/client/network/types/src/multiaddr.rs index 312bef9baab..de317e2aa1c 100644 --- a/substrate/client/network/types/src/multiaddr.rs +++ b/substrate/client/network/types/src/multiaddr.rs @@ -22,6 +22,7 @@ use litep2p::types::multiaddr::{ }; use std::{ fmt::{self, Debug, Display}, + net::{IpAddr, Ipv4Addr, Ipv6Addr}, str::FromStr, }; @@ -102,6 +103,27 @@ impl From for LiteP2pMultiaddr { } } +impl From for Multiaddr { + fn from(v: IpAddr) -> Multiaddr { + match v { + IpAddr::V4(a) => a.into(), + IpAddr::V6(a) => a.into(), + } + } +} + +impl From for Multiaddr { + fn from(v: Ipv4Addr) -> Multiaddr { + Protocol::Ip4(v).into() + } +} + +impl From for Multiaddr { + fn from(v: Ipv6Addr) -> Multiaddr { + Protocol::Ip6(v).into() + } +} + impl TryFrom> for Multiaddr { type Error = ParseError; diff --git a/substrate/client/network/types/src/multiaddr/protocol.rs b/substrate/client/network/types/src/multiaddr/protocol.rs index 800d08fe36b..2a3b59e6a68 100644 --- a/substrate/client/network/types/src/multiaddr/protocol.rs +++ b/substrate/client/network/types/src/multiaddr/protocol.rs @@ -20,7 +20,7 @@ use crate::multihash::Multihash; use litep2p::types::multiaddr::Protocol as LiteP2pProtocol; use std::{ borrow::Cow, - net::{Ipv4Addr, Ipv6Addr}, + net::{IpAddr, Ipv4Addr, Ipv6Addr}, }; /// [`Protocol`] describes all possible multiaddress protocols. @@ -60,6 +60,30 @@ pub enum Protocol<'a> { Wss(Cow<'a, str>), } +impl<'a> From for Protocol<'a> { + #[inline] + fn from(addr: IpAddr) -> Self { + match addr { + IpAddr::V4(addr) => Protocol::Ip4(addr), + IpAddr::V6(addr) => Protocol::Ip6(addr), + } + } +} + +impl<'a> From for Protocol<'a> { + #[inline] + fn from(addr: Ipv4Addr) -> Self { + Protocol::Ip4(addr) + } +} + +impl<'a> From for Protocol<'a> { + #[inline] + fn from(addr: Ipv6Addr) -> Self { + Protocol::Ip6(addr) + } +} + impl<'a> From> for Protocol<'a> { fn from(protocol: LiteP2pProtocol<'a>) -> Self { match protocol { -- GitLab From c4b3c1c6c6e492c4196e06fbba824a58e8119a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 21 Jun 2024 17:05:24 +0200 Subject: [PATCH 035/130] Bump time to fix compilation on latest nightly (#4862) Closes: https://github.com/paritytech/polkadot-sdk/issues/4748 --- Cargo.lock | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f58c4b9361..f86907030f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4694,9 +4694,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] [[package]] name = "derivative" @@ -9148,6 +9151,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.4.2" @@ -15012,6 +15021,12 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "pprof" version = "0.12.1" @@ -21844,14 +21859,16 @@ dependencies = [ [[package]] name = "time" -version = "0.3.27" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb39ee79a6d8de55f48f2293a830e040392f1c5f16e336bdd1788cd0aadce07" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", "libc", + "num-conv", "num_threads", + "powerfmt", "serde", "time-core", "time-macros", @@ -21859,16 +21876,17 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.13" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733d258752e9303d392b94b75230d07b0b9c489350c69b851fc6c065fde3e8f9" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] -- GitLab From 812dbff17513cbd2aeb2ff9c41214711bd1c0004 Mon Sep 17 00:00:00 2001 From: Muharem Date: Sat, 22 Jun 2024 15:54:33 +0200 Subject: [PATCH 036/130] Frame: `Consideration` trait generic over `Footprint` and indicates zero cost (#4596) `Consideration` trait generic over `Footprint` and indicates zero cost for a give footprint. `Consideration` trait is generic over `Footprint` (currently defined over the type with the same name). This makes it possible to setup a custom footprint (e.g. current number of proposals in the storage). `Consideration::new` and `Consideration::update` return an `Option` instead `Self`, this make it possible to indicate a no cost for a specific footprint (e.g. if current number of proposals in the storage < max_proposal_count / 2 then no cost). These cases need to be handled for https://github.com/paritytech/polkadot-sdk/pull/3151 --- prdoc/pr_4596.prdoc | 18 ++ .../balances/src/tests/fungible_tests.rs | 177 +++++++++++++++++- substrate/frame/balances/src/tests/mod.rs | 4 + substrate/frame/preimage/src/benchmarking.rs | 2 +- substrate/frame/preimage/src/lib.rs | 19 +- substrate/frame/support/src/traits/storage.rs | 26 +-- .../support/src/traits/tokens/fungible/mod.rs | 113 +++++++---- 7 files changed, 299 insertions(+), 60 deletions(-) create mode 100644 prdoc/pr_4596.prdoc diff --git a/prdoc/pr_4596.prdoc b/prdoc/pr_4596.prdoc new file mode 100644 index 00000000000..d47aa3aedfb --- /dev/null +++ b/prdoc/pr_4596.prdoc @@ -0,0 +1,18 @@ +title: "Frame: `Consideration` trait generic over `Footprint` and handles zero cost" + +doc: + - audience: Runtime Dev + description: | + `Consideration` trait generic over `Footprint` and can handle zero cost for a give footprint. + + `Consideration` trait is generic over `Footprint` (currently defined over the type with the same name). This makes it possible to setup a custom footprint (e.g. current number of proposals in the storage). + + `Consideration::new` and `Consideration::update` return an `Option` instead `Self`, this make it possible to define no cost for a specific footprint (e.g. current number of proposals in the storage < max_proposal_count / 2). + +crates: + - name: frame-support + bump: major + - name: pallet-preimage + bump: major + - name: pallet-balances + bump: patch diff --git a/substrate/frame/balances/src/tests/fungible_tests.rs b/substrate/frame/balances/src/tests/fungible_tests.rs index 52fbe10bede..1a09303a659 100644 --- a/substrate/frame/balances/src/tests/fungible_tests.rs +++ b/substrate/frame/balances/src/tests/fungible_tests.rs @@ -18,13 +18,20 @@ //! Tests regarding the functionality of the `fungible` trait set implementations. use super::*; -use frame_support::traits::tokens::{ - Fortitude::{Force, Polite}, - Precision::{BestEffort, Exact}, - Preservation::{Expendable, Preserve, Protect}, - Restriction::Free, +use frame_support::traits::{ + tokens::{ + Fortitude::{Force, Polite}, + Precision::{BestEffort, Exact}, + Preservation::{Expendable, Preserve, Protect}, + Restriction::Free, + }, + Consideration, Footprint, LinearStoragePrice, }; -use fungible::{Inspect, InspectFreeze, InspectHold, Mutate, MutateFreeze, MutateHold, Unbalanced}; +use fungible::{ + FreezeConsideration, HoldConsideration, Inspect, InspectFreeze, InspectHold, + LoneFreezeConsideration, LoneHoldConsideration, Mutate, MutateFreeze, MutateHold, Unbalanced, +}; +use sp_core::ConstU64; #[test] fn inspect_trait_reducible_balance_basic_works() { @@ -493,3 +500,161 @@ fn withdraw_precision_exact_works() { ); }); } + +#[test] +fn freeze_consideration_works() { + ExtBuilder::default() + .existential_deposit(1) + .monied(true) + .build_and_execute_with(|| { + type Consideration = FreezeConsideration< + u64, + Balances, + FooReason, + LinearStoragePrice, ConstU64<1>, u64>, + Footprint, + >; + + let who = 4; + // freeze amount taken somewhere outside of our (Consideration) scope. + let extend_freeze = 15; + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 0); + + let ticket = Consideration::new(&who, Footprint::from_parts(10, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 10); + + let ticket = ticket.update(&who, Footprint::from_parts(4, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 4); + + assert_ok!(Balances::increase_frozen(&TestId::Foo, &who, extend_freeze)); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 4 + extend_freeze); + + let ticket = ticket.update(&who, Footprint::from_parts(8, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 8 + extend_freeze); + + assert_eq!(ticket.update(&who, Footprint::from_parts(0, 0)).unwrap(), None); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 0 + extend_freeze); + + let ticket = Consideration::new(&who, Footprint::from_parts(10, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 10 + extend_freeze); + + let _ = ticket.drop(&who).unwrap(); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 0 + extend_freeze); + }); +} + +#[test] +fn hold_consideration_works() { + ExtBuilder::default() + .existential_deposit(1) + .monied(true) + .build_and_execute_with(|| { + type Consideration = HoldConsideration< + u64, + Balances, + FooReason, + LinearStoragePrice, ConstU64<1>, u64>, + Footprint, + >; + + let who = 4; + // hold amount taken somewhere outside of our (Consideration) scope. + let extend_hold = 15; + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 0); + + let ticket = Consideration::new(&who, Footprint::from_parts(10, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 10); + + let ticket = ticket.update(&who, Footprint::from_parts(4, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 4); + + assert_ok!(Balances::hold(&TestId::Foo, &who, extend_hold)); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 4 + extend_hold); + + let ticket = ticket.update(&who, Footprint::from_parts(8, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 8 + extend_hold); + + assert_eq!(ticket.update(&who, Footprint::from_parts(0, 0)).unwrap(), None); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 0 + extend_hold); + + let ticket = Consideration::new(&who, Footprint::from_parts(10, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 10 + extend_hold); + + let _ = ticket.drop(&who).unwrap(); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 0 + extend_hold); + }); +} + +#[test] +fn lone_freeze_consideration_works() { + ExtBuilder::default() + .existential_deposit(1) + .monied(true) + .build_and_execute_with(|| { + type Consideration = LoneFreezeConsideration< + u64, + Balances, + FooReason, + LinearStoragePrice, ConstU64<1>, u64>, + Footprint, + >; + + let who = 4; + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 0); + + let ticket = Consideration::new(&who, Footprint::from_parts(10, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 10); + + assert_ok!(Balances::increase_frozen(&TestId::Foo, &who, 5)); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 15); + + let ticket = ticket.update(&who, Footprint::from_parts(4, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 4); + + assert_eq!(ticket.update(&who, Footprint::from_parts(0, 0)).unwrap(), None); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 0); + + let ticket = Consideration::new(&who, Footprint::from_parts(10, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 10); + + let _ = ticket.drop(&who).unwrap(); + assert_eq!(Balances::balance_frozen(&TestId::Foo, &who), 0); + }); +} + +#[test] +fn lone_hold_consideration_works() { + ExtBuilder::default() + .existential_deposit(1) + .monied(true) + .build_and_execute_with(|| { + type Consideration = LoneHoldConsideration< + u64, + Balances, + FooReason, + LinearStoragePrice, ConstU64<1>, u64>, + Footprint, + >; + + let who = 4; + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 0); + + let ticket = Consideration::new(&who, Footprint::from_parts(10, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 10); + + assert_ok!(Balances::hold(&TestId::Foo, &who, 5)); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 15); + + let ticket = ticket.update(&who, Footprint::from_parts(4, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 4); + + assert_eq!(ticket.update(&who, Footprint::from_parts(0, 0)).unwrap(), None); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 0); + + let ticket = Consideration::new(&who, Footprint::from_parts(10, 1)).unwrap().unwrap(); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 10); + + let _ = ticket.drop(&who).unwrap(); + assert_eq!(Balances::balance_on_hold(&TestId::Foo, &who), 0); + }); +} diff --git a/substrate/frame/balances/src/tests/mod.rs b/substrate/frame/balances/src/tests/mod.rs index 5ed37170407..ba0cdabdabb 100644 --- a/substrate/frame/balances/src/tests/mod.rs +++ b/substrate/frame/balances/src/tests/mod.rs @@ -107,6 +107,10 @@ impl pallet_transaction_payment::Config for Test { type FeeMultiplierUpdate = (); } +parameter_types! { + pub FooReason: TestId = TestId::Foo; +} + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl Config for Test { type DustRemoval = DustTrap; diff --git a/substrate/frame/preimage/src/benchmarking.rs b/substrate/frame/preimage/src/benchmarking.rs index d0c3404f40a..f2b76a7999d 100644 --- a/substrate/frame/preimage/src/benchmarking.rs +++ b/substrate/frame/preimage/src/benchmarking.rs @@ -116,7 +116,7 @@ benchmarks! { T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?, hash ) verify { - let ticket = TicketOf::::new(¬er, Footprint { count: 1, size: MAX_SIZE as u64 }).unwrap(); + let ticket = TicketOf::::new(¬er, Footprint { count: 1, size: MAX_SIZE as u64 }).unwrap().unwrap(); let s = RequestStatus::Requested { maybe_ticket: Some((noter, ticket)), count: 1, maybe_len: Some(MAX_SIZE) }; assert_eq!(RequestStatusFor::::get(&hash), Some(s)); } diff --git a/substrate/frame/preimage/src/lib.rs b/substrate/frame/preimage/src/lib.rs index 4e474685166..dd323a12b8f 100644 --- a/substrate/frame/preimage/src/lib.rs +++ b/substrate/frame/preimage/src/lib.rs @@ -122,7 +122,9 @@ pub mod pallet { type ManagerOrigin: EnsureOrigin; /// A means of providing some cost while data is stored on-chain. - type Consideration: Consideration; + /// + /// Should never return a `None`, implying no cost for a non-empty preimage. + type Consideration: Consideration; } #[pallet::pallet] @@ -158,6 +160,8 @@ pub mod pallet { TooMany, /// Too few hashes were requested to be upgraded (i.e. zero). TooFew, + /// No ticket with a cost was returned by [`Config::Consideration`] to store the preimage. + NoCost, } /// A reason for this pallet placing a hold on funds. @@ -268,10 +272,10 @@ impl Pallet { // unreserve deposit T::Currency::unreserve(&who, amount); // take consideration - let Ok(ticket) = + let Ok(Some(ticket)) = T::Consideration::new(&who, Footprint::from_parts(1, len as usize)) - .defensive_proof("Unexpected inability to take deposit after unreserved") else { + defensive!("None ticket or inability to take deposit after unreserved"); return true }; RequestStatus::Unrequested { ticket: (who, ticket), len } @@ -282,12 +286,10 @@ impl Pallet { T::Currency::unreserve(&who, deposit); // take consideration if let Some(len) = maybe_len { - let Ok(ticket) = + let Ok(Some(ticket)) = T::Consideration::new(&who, Footprint::from_parts(1, len as usize)) - .defensive_proof( - "Unexpected inability to take deposit after unreserved", - ) else { + defensive!("None ticket or inability to take deposit after unreserved"); return true }; Some((who, ticket)) @@ -347,7 +349,8 @@ impl Pallet { RequestStatus::Requested { maybe_ticket: None, count: 1, maybe_len: Some(len) }, (None, Some(depositor)) => { let ticket = - T::Consideration::new(depositor, Footprint::from_parts(1, len as usize))?; + T::Consideration::new(depositor, Footprint::from_parts(1, len as usize))? + .ok_or(Error::::NoCost)?; RequestStatus::Unrequested { ticket: (depositor.clone(), ticket), len } }, }; diff --git a/substrate/frame/support/src/traits/storage.rs b/substrate/frame/support/src/traits/storage.rs index 9e467aea422..875ff56bea1 100644 --- a/substrate/frame/support/src/traits/storage.rs +++ b/substrate/frame/support/src/traits/storage.rs @@ -194,7 +194,7 @@ where } /// Some sort of cost taken from account temporarily in order to offset the cost to the chain of -/// holding some data [`Footprint`] in state. +/// holding some data `Footprint` (e.g. [`Footprint`]) in state. /// /// The cost may be increased, reduced or dropped entirely as the footprint changes. /// @@ -206,16 +206,20 @@ where /// treated as one*. Don't type to duplicate it, and remember to drop it when you're done with /// it. #[must_use] -pub trait Consideration: Member + FullCodec + TypeInfo + MaxEncodedLen { +pub trait Consideration: + Member + FullCodec + TypeInfo + MaxEncodedLen +{ /// Create a ticket for the `new` footprint attributable to `who`. This ticket *must* ultimately - /// be consumed through `update` or `drop` once the footprint changes or is removed. - fn new(who: &AccountId, new: Footprint) -> Result; + /// be consumed through `update` or `drop` once the footprint changes or is removed. `None` + /// implies no cost for a given footprint. + fn new(who: &AccountId, new: Footprint) -> Result, DispatchError>; /// Optionally consume an old ticket and alter the footprint, enforcing the new cost to `who` - /// and returning the new ticket (or an error if there was an issue). + /// and returning the new ticket (or an error if there was an issue). `None` implies no cost for + /// a given footprint. /// /// For creating tickets and dropping them, you can use the simpler `new` and `drop` instead. - fn update(self, who: &AccountId, new: Footprint) -> Result; + fn update(self, who: &AccountId, new: Footprint) -> Result, DispatchError>; /// Consume a ticket for some `old` footprint attributable to `who` which should now been freed. fn drop(self, who: &AccountId) -> Result<(), DispatchError>; @@ -230,12 +234,12 @@ pub trait Consideration: Member + FullCodec + TypeInfo + MaxEncodedLe } } -impl Consideration for () { - fn new(_: &A, _: Footprint) -> Result { - Ok(()) +impl Consideration for () { + fn new(_: &A, _: F) -> Result, DispatchError> { + Ok(Some(())) } - fn update(self, _: &A, _: Footprint) -> Result<(), DispatchError> { - Ok(()) + fn update(self, _: &A, _: F) -> Result, DispatchError> { + Ok(Some(())) } fn drop(self, _: &A) -> Result<(), DispatchError> { Ok(()) diff --git a/substrate/frame/support/src/traits/tokens/fungible/mod.rs b/substrate/frame/support/src/traits/tokens/fungible/mod.rs index 01c3b9dfe46..b8e98564898 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/mod.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/mod.rs @@ -198,31 +198,40 @@ use crate::{ MaxEncodedLen, RuntimeDebugNoBound, )] -#[scale_info(skip_type_params(A, F, R, D))] +#[scale_info(skip_type_params(A, F, R, D, Fp))] #[codec(mel_bound())] -pub struct FreezeConsideration(F::Balance, PhantomData (A, R, D)>) +pub struct FreezeConsideration(F::Balance, PhantomData (A, R, D, Fp)>) where F: MutateFreeze; impl< A: 'static, F: 'static + MutateFreeze, R: 'static + Get, - D: 'static + Convert, - > Consideration for FreezeConsideration + D: 'static + Convert, + Fp: 'static, + > Consideration for FreezeConsideration { - fn new(who: &A, footprint: Footprint) -> Result { + fn new(who: &A, footprint: Fp) -> Result, DispatchError> { let new = D::convert(footprint); - F::increase_frozen(&R::get(), who, new)?; - Ok(Self(new, PhantomData)) + if new.is_zero() { + Ok(None) + } else { + F::increase_frozen(&R::get(), who, new)?; + Ok(Some(Self(new, PhantomData))) + } } - fn update(self, who: &A, footprint: Footprint) -> Result { + fn update(self, who: &A, footprint: Fp) -> Result, DispatchError> { let new = D::convert(footprint); if self.0 > new { F::decrease_frozen(&R::get(), who, self.0 - new)?; } else if new > self.0 { F::increase_frozen(&R::get(), who, new - self.0)?; } - Ok(Self(new, PhantomData)) + if new.is_zero() { + Ok(None) + } else { + Ok(Some(Self(new, PhantomData))) + } } fn drop(self, who: &A) -> Result<(), DispatchError> { F::decrease_frozen(&R::get(), who, self.0).map(|_| ()) @@ -240,31 +249,43 @@ impl< MaxEncodedLen, RuntimeDebugNoBound, )] -#[scale_info(skip_type_params(A, F, R, D))] +#[scale_info(skip_type_params(A, F, R, D, Fp))] #[codec(mel_bound())] -pub struct HoldConsideration(F::Balance, PhantomData (A, R, D)>) +pub struct HoldConsideration( + F::Balance, + PhantomData (A, R, D, Fp)>, +) where F: MutateHold; impl< A: 'static, F: 'static + MutateHold, R: 'static + Get, - D: 'static + Convert, - > Consideration for HoldConsideration + D: 'static + Convert, + Fp: 'static, + > Consideration for HoldConsideration { - fn new(who: &A, footprint: Footprint) -> Result { + fn new(who: &A, footprint: Fp) -> Result, DispatchError> { let new = D::convert(footprint); - F::hold(&R::get(), who, new)?; - Ok(Self(new, PhantomData)) + if new.is_zero() { + Ok(None) + } else { + F::hold(&R::get(), who, new)?; + Ok(Some(Self(new, PhantomData))) + } } - fn update(self, who: &A, footprint: Footprint) -> Result { + fn update(self, who: &A, footprint: Fp) -> Result, DispatchError> { let new = D::convert(footprint); if self.0 > new { F::release(&R::get(), who, self.0 - new, BestEffort)?; } else if new > self.0 { F::hold(&R::get(), who, new - self.0)?; } - Ok(Self(new, PhantomData)) + if new.is_zero() { + Ok(None) + } else { + Ok(Some(Self(new, PhantomData))) + } } fn drop(self, who: &A) -> Result<(), DispatchError> { F::release(&R::get(), who, self.0, BestEffort).map(|_| ()) @@ -291,22 +312,34 @@ impl< MaxEncodedLen, RuntimeDebugNoBound, )] -#[scale_info(skip_type_params(A, Fx, Rx, D))] +#[scale_info(skip_type_params(A, Fx, Rx, D, Fp))] #[codec(mel_bound())] -pub struct LoneFreezeConsideration(PhantomData (A, Fx, Rx, D)>); +pub struct LoneFreezeConsideration(PhantomData (A, Fx, Rx, D, Fp)>); impl< A: 'static, Fx: 'static + MutateFreeze, Rx: 'static + Get, - D: 'static + Convert, - > Consideration for LoneFreezeConsideration + D: 'static + Convert, + Fp: 'static, + > Consideration for LoneFreezeConsideration { - fn new(who: &A, footprint: Footprint) -> Result { + fn new(who: &A, footprint: Fp) -> Result, DispatchError> { ensure!(Fx::balance_frozen(&Rx::get(), who).is_zero(), DispatchError::Unavailable); - Fx::set_frozen(&Rx::get(), who, D::convert(footprint), Polite).map(|_| Self(PhantomData)) + let new = D::convert(footprint); + if new.is_zero() { + Ok(None) + } else { + Fx::set_frozen(&Rx::get(), who, new, Polite).map(|_| Some(Self(PhantomData))) + } } - fn update(self, who: &A, footprint: Footprint) -> Result { - Fx::set_frozen(&Rx::get(), who, D::convert(footprint), Polite).map(|_| Self(PhantomData)) + fn update(self, who: &A, footprint: Fp) -> Result, DispatchError> { + let new = D::convert(footprint); + let _ = Fx::set_frozen(&Rx::get(), who, new, Polite)?; + if new.is_zero() { + Ok(None) + } else { + Ok(Some(Self(PhantomData))) + } } fn drop(self, who: &A) -> Result<(), DispatchError> { Fx::thaw(&Rx::get(), who).map(|_| ()) @@ -330,22 +363,34 @@ impl< MaxEncodedLen, RuntimeDebugNoBound, )] -#[scale_info(skip_type_params(A, Fx, Rx, D))] +#[scale_info(skip_type_params(A, Fx, Rx, D, Fp))] #[codec(mel_bound())] -pub struct LoneHoldConsideration(PhantomData (A, Fx, Rx, D)>); +pub struct LoneHoldConsideration(PhantomData (A, Fx, Rx, D, Fp)>); impl< A: 'static, F: 'static + MutateHold, R: 'static + Get, - D: 'static + Convert, - > Consideration for LoneHoldConsideration + D: 'static + Convert, + Fp: 'static, + > Consideration for LoneHoldConsideration { - fn new(who: &A, footprint: Footprint) -> Result { + fn new(who: &A, footprint: Fp) -> Result, DispatchError> { ensure!(F::balance_on_hold(&R::get(), who).is_zero(), DispatchError::Unavailable); - F::set_on_hold(&R::get(), who, D::convert(footprint)).map(|_| Self(PhantomData)) + let new = D::convert(footprint); + if new.is_zero() { + Ok(None) + } else { + F::set_on_hold(&R::get(), who, new).map(|_| Some(Self(PhantomData))) + } } - fn update(self, who: &A, footprint: Footprint) -> Result { - F::set_on_hold(&R::get(), who, D::convert(footprint)).map(|_| Self(PhantomData)) + fn update(self, who: &A, footprint: Fp) -> Result, DispatchError> { + let new = D::convert(footprint); + let _ = F::set_on_hold(&R::get(), who, new)?; + if new.is_zero() { + Ok(None) + } else { + Ok(Some(Self(PhantomData))) + } } fn drop(self, who: &A) -> Result<(), DispatchError> { F::release_all(&R::get(), who, BestEffort).map(|_| ()) -- GitLab From 25a648d22877f9c319a5a8553ffe9d85ad033de2 Mon Sep 17 00:00:00 2001 From: "polka.dom" Date: Sun, 23 Jun 2024 05:22:30 -0400 Subject: [PATCH 037/130] Remove pallet::getter macro usage from pallet-elections-phragmen (#4513) As per #3326, removes pallet::getter macro usage from the pallet-elections-phragmen. The syntax `StorageItem::::get()` should be used instead. cc @muraca --------- Co-authored-by: Oliver Tale-Yazdi --- prdoc/pr_4513.prdoc | 14 ++ .../elections-phragmen/src/benchmarking.rs | 56 +++--- substrate/frame/elections-phragmen/src/lib.rs | 184 +++++++++--------- .../elections-phragmen/src/migrations/v3.rs | 10 +- 4 files changed, 138 insertions(+), 126 deletions(-) create mode 100644 prdoc/pr_4513.prdoc diff --git a/prdoc/pr_4513.prdoc b/prdoc/pr_4513.prdoc new file mode 100644 index 00000000000..e7363d211c1 --- /dev/null +++ b/prdoc/pr_4513.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from pallet-elections-phragmen + +doc: + - audience: Runtime Dev + description: | + This PR removed the `pallet::getter`s from `pallet-elections-phragmen`. + The syntax `StorageItem::::get()` should be used instead. + +crates: + - name: pallet-elections-phragmen + bump: major diff --git a/substrate/frame/elections-phragmen/src/benchmarking.rs b/substrate/frame/elections-phragmen/src/benchmarking.rs index 55bb1b968fa..8e762f667b2 100644 --- a/substrate/frame/elections-phragmen/src/benchmarking.rs +++ b/substrate/frame/elections-phragmen/src/benchmarking.rs @@ -56,7 +56,7 @@ fn default_stake(num_votes: u32) -> BalanceOf { /// Get the current number of candidates. fn candidate_count() -> u32 { - >::decode_len().unwrap_or(0usize) as u32 + Candidates::::decode_len().unwrap_or(0usize) as u32 } /// Add `c` new candidates. @@ -67,7 +67,7 @@ fn submit_candidates( (0..c) .map(|i| { let account = endowed_account::(prefix, i); - >::submit_candidacy( + Elections::::submit_candidacy( RawOrigin::Signed(account.clone()).into(), candidate_count::(), ) @@ -96,7 +96,7 @@ fn submit_voter( votes: Vec, stake: BalanceOf, ) -> DispatchResultWithPostInfo { - >::vote(RawOrigin::Signed(caller).into(), votes, stake) + Elections::::vote(RawOrigin::Signed(caller).into(), votes, stake) } /// create `num_voter` voters who randomly vote for at most `votes` of `all_candidates` if @@ -121,28 +121,28 @@ fn distribute_voters( /// members, or members and runners-up. fn fill_seats_up_to(m: u32) -> Result, &'static str> { let _ = submit_candidates_with_self_vote::(m, "fill_seats_up_to")?; - assert_eq!(>::candidates().len() as u32, m, "wrong number of candidates."); - >::do_phragmen(); - assert_eq!(>::candidates().len(), 0, "some candidates remaining."); + assert_eq!(Candidates::::get().len() as u32, m, "wrong number of candidates."); + Elections::::do_phragmen(); + assert_eq!(Candidates::::get().len(), 0, "some candidates remaining."); assert_eq!( - >::members().len() + >::runners_up().len(), + Members::::get().len() + RunnersUp::::get().len(), m as usize, "wrong number of members and runners-up", ); - Ok(>::members() + Ok(Members::::get() .into_iter() .map(|m| m.who) - .chain(>::runners_up().into_iter().map(|r| r.who)) + .chain(RunnersUp::::get().into_iter().map(|r| r.who)) .collect()) } /// removes all the storage items to reverse any genesis state. fn clean() { - >::kill(); - >::kill(); - >::kill(); + Members::::kill(); + Candidates::::kill(); + RunnersUp::::kill(); #[allow(deprecated)] - >::remove_all(None); + Voting::::remove_all(None); } benchmarks! { @@ -180,14 +180,14 @@ benchmarks! { // original votes. let mut votes = all_candidates.iter().skip(1).cloned().collect::>(); - submit_voter::(caller.clone(), votes.clone(), stake / >::from(10u32))?; + submit_voter::(caller.clone(), votes.clone(), stake / BalanceOf::::from(10u32))?; // new votes. votes = all_candidates; - assert!(votes.len() > >::get(caller.clone()).votes.len()); + assert!(votes.len() > Voting::::get(caller.clone()).votes.len()); whitelist!(caller); - }: vote(RawOrigin::Signed(caller), votes, stake / >::from(10u32)) + }: vote(RawOrigin::Signed(caller), votes, stake / BalanceOf::::from(10u32)) vote_less { let v in 2 .. T::MaxVotesPerVoter::get(); @@ -205,7 +205,7 @@ benchmarks! { // new votes. votes = votes.into_iter().skip(1).collect::>(); - assert!(votes.len() < >::get(caller.clone()).votes.len()); + assert!(votes.len() < Voting::::get(caller.clone()).votes.len()); whitelist!(caller); }: vote(RawOrigin::Signed(caller), votes, stake) @@ -294,7 +294,7 @@ benchmarks! { let members_and_runners_up = fill_seats_up_to::(m)?; let bailing = members_and_runners_up[0].clone(); - assert!(>::is_member(&bailing)); + assert!(Elections::::is_member(&bailing)); whitelist!(bailing); }: renounce_candidacy(RawOrigin::Signed(bailing.clone()), Renouncing::Member) @@ -318,7 +318,7 @@ benchmarks! { let members_and_runners_up = fill_seats_up_to::(m)?; let bailing = members_and_runners_up[T::DesiredMembers::get() as usize + 1].clone(); - assert!(>::is_runner_up(&bailing)); + assert!(Elections::::is_runner_up(&bailing)); whitelist!(bailing); }: renounce_candidacy(RawOrigin::Signed(bailing.clone()), Renouncing::RunnerUp) @@ -345,11 +345,11 @@ benchmarks! { clean::(); let _ = fill_seats_up_to::(m)?; - let removing = as_lookup::(>::members_ids()[0].clone()); + let removing = as_lookup::(Elections::::members_ids()[0].clone()); }: remove_member(RawOrigin::Root, removing, true, false) verify { // must still have enough members. - assert_eq!(>::members().len() as u32, T::DesiredMembers::get()); + assert_eq!(Members::::get().len() as u32, T::DesiredMembers::get()); #[cfg(test)] { // reset members in between benchmark tests. @@ -371,15 +371,15 @@ benchmarks! { distribute_voters::(all_candidates, v, T::MaxVotesPerVoter::get() as usize)?; // all candidates leave. - >::kill(); + Candidates::::kill(); // now everyone is defunct - assert!(>::iter().all(|(_, v)| >::is_defunct_voter(&v.votes))); - assert_eq!(>::iter().count() as u32, v); + assert!(Voting::::iter().all(|(_, v)| Elections::::is_defunct_voter(&v.votes))); + assert_eq!(Voting::::iter().count() as u32, v); let root = RawOrigin::Root; }: _(root, v, d) verify { - assert_eq!(>::iter().count() as u32, v - d); + assert_eq!(Voting::::iter().count() as u32, v - d); } election_phragmen { @@ -404,12 +404,12 @@ benchmarks! { let all_candidates = submit_candidates_with_self_vote::(c, "candidates")?; let _ = distribute_voters::(all_candidates, v.saturating_sub(c), votes_per_voter as usize)?; }: { - >::on_initialize(T::TermDuration::get()); + Elections::::on_initialize(T::TermDuration::get()); } verify { - assert_eq!(>::members().len() as u32, T::DesiredMembers::get().min(c)); + assert_eq!(Members::::get().len() as u32, T::DesiredMembers::get().min(c)); assert_eq!( - >::runners_up().len() as u32, + RunnersUp::::get().len() as u32, T::DesiredRunnersUp::get().min(c.saturating_sub(T::DesiredMembers::get())), ); diff --git a/substrate/frame/elections-phragmen/src/lib.rs b/substrate/frame/elections-phragmen/src/lib.rs index a5b6fca0a8a..c6eca40c471 100644 --- a/substrate/frame/elections-phragmen/src/lib.rs +++ b/substrate/frame/elections-phragmen/src/lib.rs @@ -377,9 +377,9 @@ pub mod pallet { ); ensure!(!votes.is_empty(), Error::::NoVotes); - let candidates_count = >::decode_len().unwrap_or(0); - let members_count = >::decode_len().unwrap_or(0); - let runners_up_count = >::decode_len().unwrap_or(0); + let candidates_count = Candidates::::decode_len().unwrap_or(0); + let members_count = Members::::decode_len().unwrap_or(0); + let runners_up_count = RunnersUp::::decode_len().unwrap_or(0); // can never submit a vote of there are no members, and cannot submit more votes than // all potential vote targets. @@ -393,7 +393,7 @@ pub mod pallet { // Reserve bond. let new_deposit = Self::deposit_of(votes.len()); - let Voter { deposit: old_deposit, .. } = >::get(&who); + let Voter { deposit: old_deposit, .. } = Voting::::get(&who); match new_deposit.cmp(&old_deposit) { Ordering::Greater => { // Must reserve a bit more. @@ -455,7 +455,7 @@ pub mod pallet { ) -> DispatchResult { let who = ensure_signed(origin)?; - let actual_count = >::decode_len().unwrap_or(0) as u32; + let actual_count = Candidates::::decode_len().unwrap_or(0) as u32; ensure!(actual_count <= candidate_count, Error::::InvalidWitnessData); ensure!( actual_count <= ::MaxCandidates::get(), @@ -470,7 +470,7 @@ pub mod pallet { T::Currency::reserve(&who, T::CandidacyBond::get()) .map_err(|_| Error::::InsufficientCandidateFunds)?; - >::mutate(|c| c.insert(index, (who, T::CandidacyBond::get()))); + Candidates::::mutate(|c| c.insert(index, (who, T::CandidacyBond::get()))); Ok(()) } @@ -509,7 +509,7 @@ pub mod pallet { Self::deposit_event(Event::Renounced { candidate: who }); }, Renouncing::RunnerUp => { - >::try_mutate::<_, Error, _>(|runners_up| { + RunnersUp::::try_mutate::<_, Error, _>(|runners_up| { let index = runners_up .iter() .position(|SeatHolder { who: r, .. }| r == &who) @@ -523,7 +523,7 @@ pub mod pallet { })?; }, Renouncing::Candidate(count) => { - >::try_mutate::<_, Error, _>(|candidates| { + Candidates::::try_mutate::<_, Error, _>(|candidates| { ensure!(count >= candidates.len() as u32, Error::::InvalidWitnessData); let index = candidates .binary_search_by(|(c, _)| c.cmp(&who)) @@ -599,7 +599,7 @@ pub mod pallet { ) -> DispatchResult { let _ = ensure_root(origin)?; - >::iter() + Voting::::iter() .take(num_voters as usize) .filter(|(_, x)| Self::is_defunct_voter(&x.votes)) .take(num_defunct as usize) @@ -682,7 +682,6 @@ pub mod pallet { /// /// Invariant: Always sorted based on account id. #[pallet::storage] - #[pallet::getter(fn members)] pub type Members = StorageValue<_, Vec>>, ValueQuery>; @@ -691,7 +690,6 @@ pub mod pallet { /// Invariant: Always sorted based on rank (worse to best). Upon removal of a member, the /// last (i.e. _best_) runner-up will be replaced. #[pallet::storage] - #[pallet::getter(fn runners_up)] pub type RunnersUp = StorageValue<_, Vec>>, ValueQuery>; @@ -702,19 +700,16 @@ pub mod pallet { /// /// Invariant: Always sorted based on account id. #[pallet::storage] - #[pallet::getter(fn candidates)] pub type Candidates = StorageValue<_, Vec<(T::AccountId, BalanceOf)>, ValueQuery>; /// The total number of vote rounds that have happened, excluding the upcoming one. #[pallet::storage] - #[pallet::getter(fn election_rounds)] pub type ElectionRounds = StorageValue<_, u32, ValueQuery>; /// Votes and locked stake of a particular voter. /// /// TWOX-NOTE: SAFE as `AccountId` is a crypto hash. #[pallet::storage] - #[pallet::getter(fn voting)] pub type Voting = StorageMap<_, Twox64Concat, T::AccountId, Voter>, ValueQuery>; @@ -768,7 +763,7 @@ pub mod pallet { // they have any lock. NOTE: this means that we will still try to remove a lock // once this genesis voter is removed, and for now it is okay because // remove_lock is noop if lock is not there. - >::insert( + Voting::::insert( &member, Voter { votes: vec![member.clone()], stake: *stake, deposit: Zero::zero() }, ); @@ -811,7 +806,7 @@ impl Pallet { // - `Ok(Option(replacement))` if member was removed and replacement was replaced. // - `Ok(None)` if member was removed but no replacement was found // - `Err(_)` if who is not a member. - let maybe_replacement = >::try_mutate::<_, Error, _>(|members| { + let maybe_replacement = Members::::try_mutate::<_, Error, _>(|members| { let remove_index = members .binary_search_by(|m| m.who.cmp(who)) .map_err(|_| Error::::NotMember)?; @@ -831,7 +826,7 @@ impl Pallet { T::Currency::unreserve(who, removed.deposit); } - let maybe_next_best = >::mutate(|r| r.pop()).map(|next_best| { + let maybe_next_best = RunnersUp::::mutate(|r| r.pop()).map(|next_best| { // defensive-only: Members and runners-up are disjoint. This will always be err and // give us an index to insert. if let Err(index) = members.binary_search_by(|m| m.who.cmp(&next_best.who)) { @@ -847,7 +842,7 @@ impl Pallet { })?; let remaining_member_ids_sorted = - Self::members().into_iter().map(|x| x.who).collect::>(); + Members::::get().into_iter().map(|x| x.who).collect::>(); let outgoing = &[who.clone()]; let maybe_current_prime = T::ChangeMembers::get_prime(); let return_value = match maybe_replacement { @@ -884,7 +879,7 @@ impl Pallet { /// Check if `who` is a candidate. It returns the insert index if the element does not exists as /// an error. fn is_candidate(who: &T::AccountId) -> Result<(), usize> { - Self::candidates().binary_search_by(|c| c.0.cmp(who)).map(|_| ()) + Candidates::::get().binary_search_by(|c| c.0.cmp(who)).map(|_| ()) } /// Check if `who` is a voter. It may or may not be a _current_ one. @@ -894,17 +889,17 @@ impl Pallet { /// Check if `who` is currently an active member. fn is_member(who: &T::AccountId) -> bool { - Self::members().binary_search_by(|m| m.who.cmp(who)).is_ok() + Members::::get().binary_search_by(|m| m.who.cmp(who)).is_ok() } /// Check if `who` is currently an active runner-up. fn is_runner_up(who: &T::AccountId) -> bool { - Self::runners_up().iter().any(|r| &r.who == who) + RunnersUp::::get().iter().any(|r| &r.who == who) } /// Get the members' account ids. pub(crate) fn members_ids() -> Vec { - Self::members().into_iter().map(|m| m.who).collect::>() + Members::::get().into_iter().map(|m| m.who).collect::>() } /// Get a concatenation of previous members and runners-up and their deposits. @@ -912,10 +907,10 @@ impl Pallet { /// These accounts are essentially treated as candidates. fn implicit_candidates_with_deposit() -> Vec<(T::AccountId, BalanceOf)> { // invariant: these two are always without duplicates. - Self::members() + Members::::get() .into_iter() .map(|m| (m.who, m.deposit)) - .chain(Self::runners_up().into_iter().map(|r| (r.who, r.deposit))) + .chain(RunnersUp::::get().into_iter().map(|r| (r.who, r.deposit))) .collect::>() } @@ -932,7 +927,7 @@ impl Pallet { /// Remove a certain someone as a voter. fn do_remove_voter(who: &T::AccountId) { - let Voter { deposit, .. } = >::take(who); + let Voter { deposit, .. } = Voting::::take(who); // remove storage, lock and unreserve. T::Currency::remove_lock(T::PalletId::get(), who); @@ -952,7 +947,7 @@ impl Pallet { let desired_runners_up = T::DesiredRunnersUp::get() as usize; let num_to_elect = desired_runners_up + desired_seats; - let mut candidates_and_deposit = Self::candidates(); + let mut candidates_and_deposit = Candidates::::get(); // add all the previous members and runners-up as candidates as well. candidates_and_deposit.append(&mut Self::implicit_candidates_with_deposit()); @@ -1011,12 +1006,12 @@ impl Pallet { sp_npos_elections::seq_phragmen(num_to_elect, candidate_ids, voters_and_votes, None) .map(|ElectionResult:: { winners, assignments: _ }| { // this is already sorted by id. - let old_members_ids_sorted = >::take() + let old_members_ids_sorted = Members::::take() .into_iter() .map(|m| m.who) .collect::>(); // this one needs a sort by id. - let mut old_runners_up_ids_sorted = >::take() + let mut old_runners_up_ids_sorted = RunnersUp::::take() .into_iter() .map(|r| r.who) .collect::>(); @@ -1122,7 +1117,7 @@ impl Pallet { // fetch deposits from the one recorded one. This will make sure that a // candidate who submitted candidacy before a change to candidacy deposit will // have the correct amount recorded. - >::put( + Members::::put( new_members_sorted_by_id .iter() .map(|(who, stake)| SeatHolder { @@ -1132,7 +1127,7 @@ impl Pallet { }) .collect::>(), ); - >::put( + RunnersUp::::put( new_runners_up_sorted_by_rank .into_iter() .map(|(who, stake)| SeatHolder { @@ -1144,10 +1139,10 @@ impl Pallet { ); // clean candidates. - >::kill(); + Candidates::::kill(); Self::deposit_event(Event::NewTerm { new_members: new_members_sorted_by_id }); - >::mutate(|v| *v += 1); + ElectionRounds::::mutate(|v| *v += 1); }) .map_err(|e| { log::error!(target: LOG_TARGET, "Failed to run election [{:?}].", e,); @@ -1294,11 +1289,11 @@ impl Pallet { } fn candidates_ids() -> Vec { - Pallet::::candidates().iter().map(|(x, _)| x).cloned().collect::>() + Candidates::::get().iter().map(|(x, _)| x).cloned().collect::>() } fn runners_up_ids() -> Vec { - Pallet::::runners_up().into_iter().map(|r| r.who).collect::>() + RunnersUp::::get().into_iter().map(|r| r.who).collect::>() } } @@ -1500,22 +1495,22 @@ mod tests { } fn candidate_ids() -> Vec { - Elections::candidates().into_iter().map(|(c, _)| c).collect::>() + Candidates::::get().into_iter().map(|(c, _)| c).collect::>() } fn candidate_deposit(who: &u64) -> u64 { - Elections::candidates() + Candidates::::get() .into_iter() .find_map(|(c, d)| if c == *who { Some(d) } else { None }) .unwrap_or_default() } fn voter_deposit(who: &u64) -> u64 { - Elections::voting(who).deposit + Voting::::get(who).deposit } fn runners_up_ids() -> Vec { - Elections::runners_up().into_iter().map(|r| r.who).collect::>() + RunnersUp::::get().into_iter().map(|r| r.who).collect::>() } fn members_ids() -> Vec { @@ -1523,11 +1518,14 @@ mod tests { } fn members_and_stake() -> Vec<(u64, u64)> { - Elections::members().into_iter().map(|m| (m.who, m.stake)).collect::>() + elections_phragmen::Members::::get() + .into_iter() + .map(|m| (m.who, m.stake)) + .collect::>() } fn runners_up_and_stake() -> Vec<(u64, u64)> { - Elections::runners_up() + RunnersUp::::get() .into_iter() .map(|r| (r.who, r.stake)) .collect::>() @@ -1562,7 +1560,7 @@ mod tests { } fn submit_candidacy(origin: RuntimeOrigin) -> sp_runtime::DispatchResult { - Elections::submit_candidacy(origin, Elections::candidates().len() as u32) + Elections::submit_candidacy(origin, Candidates::::get().len() as u32) } fn vote(origin: RuntimeOrigin, votes: Vec, stake: u64) -> DispatchResultWithPostInfo { @@ -1586,13 +1584,13 @@ mod tests { assert_eq!(::VotingBondFactor::get(), 0); assert_eq!(::CandidacyBond::get(), 3); assert_eq!(::TermDuration::get(), 5); - assert_eq!(Elections::election_rounds(), 0); + assert_eq!(ElectionRounds::::get(), 0); - assert!(Elections::members().is_empty()); - assert!(Elections::runners_up().is_empty()); + assert!(elections_phragmen::Members::::get().is_empty()); + assert!(RunnersUp::::get().is_empty()); assert!(candidate_ids().is_empty()); - assert_eq!(>::decode_len(), None); + assert_eq!(Candidates::::decode_len(), None); assert!(Elections::is_candidate(&1).is_err()); assert!(all_voters().is_empty()); @@ -1607,7 +1605,7 @@ mod tests { .build_and_execute(|| { System::set_block_number(1); assert_eq!( - Elections::members(), + elections_phragmen::Members::::get(), vec![ SeatHolder { who: 1, stake: 10, deposit: 0 }, SeatHolder { who: 2, stake: 20, deposit: 0 } @@ -1615,11 +1613,11 @@ mod tests { ); assert_eq!( - Elections::voting(1), + Voting::::get(1), Voter { stake: 10u64, votes: vec![1], deposit: 0 } ); assert_eq!( - Elections::voting(2), + Voting::::get(2), Voter { stake: 20u64, votes: vec![2], deposit: 0 } ); @@ -1639,19 +1637,19 @@ mod tests { System::set_block_number(1); assert_eq!( - Elections::voting(1), + Voting::::get(1), Voter { stake: 10u64, votes: vec![1], deposit: 0 } ); assert_eq!( - Elections::voting(2), + Voting::::get(2), Voter { stake: 20u64, votes: vec![2], deposit: 0 } ); assert_ok!(Elections::remove_voter(RuntimeOrigin::signed(1))); assert_ok!(Elections::remove_voter(RuntimeOrigin::signed(2))); - assert_eq!(Elections::voting(1), Default::default()); - assert_eq!(Elections::voting(2), Default::default()); + assert_eq!(Voting::::get(1), Default::default()); + assert_eq!(Voting::::get(2), Default::default()); }) } @@ -1662,7 +1660,7 @@ mod tests { .build_and_execute(|| { System::set_block_number(1); assert_eq!( - Elections::members(), + elections_phragmen::Members::::get(), vec![ SeatHolder { who: 1, stake: 10, deposit: 0 }, SeatHolder { who: 2, stake: 20, deposit: 0 }, @@ -1670,11 +1668,11 @@ mod tests { ); assert_eq!( - Elections::voting(1), + Voting::::get(1), Voter { stake: 10u64, votes: vec![1], deposit: 0 } ); assert_eq!( - Elections::voting(2), + Voting::::get(2), Voter { stake: 20u64, votes: vec![2], deposit: 0 } ); @@ -1718,17 +1716,17 @@ mod tests { ExtBuilder::default().term_duration(0).build_and_execute(|| { assert_eq!(::TermDuration::get(), 0); assert_eq!(::DesiredMembers::get(), 2); - assert_eq!(Elections::election_rounds(), 0); + assert_eq!(ElectionRounds::::get(), 0); assert!(members_ids().is_empty()); - assert!(Elections::runners_up().is_empty()); + assert!(RunnersUp::::get().is_empty()); assert!(candidate_ids().is_empty()); System::set_block_number(5); Elections::on_initialize(System::block_number()); assert!(members_ids().is_empty()); - assert!(Elections::runners_up().is_empty()); + assert!(RunnersUp::::get().is_empty()); assert!(candidate_ids().is_empty()); }); } @@ -1769,14 +1767,14 @@ mod tests { ExtBuilder::default().build_and_execute(|| { assert_ok!(submit_candidacy(RuntimeOrigin::signed(5))); assert_ok!(vote(RuntimeOrigin::signed(5), vec![5], 50)); - assert_eq!(Elections::candidates(), vec![(5, 3)]); + assert_eq!(Candidates::::get(), vec![(5, 3)]); // a runtime upgrade changes the bond. CANDIDACY_BOND.with(|v| *v.borrow_mut() = 4); assert_ok!(submit_candidacy(RuntimeOrigin::signed(4))); assert_ok!(vote(RuntimeOrigin::signed(4), vec![4], 40)); - assert_eq!(Elections::candidates(), vec![(4, 4), (5, 3)]); + assert_eq!(Candidates::::get(), vec![(4, 4), (5, 3)]); // once elected, they each hold their candidacy bond, no more. System::set_block_number(5); @@ -1785,7 +1783,7 @@ mod tests { assert_eq!(balances(&4), (34, 6)); assert_eq!(balances(&5), (45, 5)); assert_eq!( - Elections::members(), + elections_phragmen::Members::::get(), vec![ SeatHolder { who: 4, stake: 34, deposit: 4 }, SeatHolder { who: 5, stake: 45, deposit: 3 }, @@ -1834,7 +1832,7 @@ mod tests { Elections::on_initialize(System::block_number()); assert_eq!(members_ids(), vec![5]); - assert!(Elections::runners_up().is_empty()); + assert!(RunnersUp::::get().is_empty()); assert!(candidate_ids().is_empty()); assert_noop!(submit_candidacy(RuntimeOrigin::signed(5)), Error::::MemberSubmit); @@ -1960,7 +1958,7 @@ mod tests { // 2 + 1 assert_eq!(balances(&2), (17, 3)); - assert_eq!(Elections::voting(&2).deposit, 3); + assert_eq!(Voting::::get(&2).deposit, 3); assert_eq!(has_lock(&2), 10); assert_eq!(locked_stake_of(&2), 10); @@ -1968,7 +1966,7 @@ mod tests { assert_ok!(vote(RuntimeOrigin::signed(2), vec![5, 4], 15)); // 2 + 2 assert_eq!(balances(&2), (16, 4)); - assert_eq!(Elections::voting(&2).deposit, 4); + assert_eq!(Voting::::get(&2).deposit, 4); assert_eq!(has_lock(&2), 15); assert_eq!(locked_stake_of(&2), 15); @@ -1976,7 +1974,7 @@ mod tests { assert_ok!(vote(RuntimeOrigin::signed(2), vec![5, 3], 18)); // 2 + 2 assert_eq!(balances(&2), (16, 4)); - assert_eq!(Elections::voting(&2).deposit, 4); + assert_eq!(Voting::::get(&2).deposit, 4); assert_eq!(has_lock(&2), 16); assert_eq!(locked_stake_of(&2), 16); @@ -1984,7 +1982,7 @@ mod tests { assert_ok!(vote(RuntimeOrigin::signed(2), vec![4], 12)); // 2 + 1 assert_eq!(balances(&2), (17, 3)); - assert_eq!(Elections::voting(&2).deposit, 3); + assert_eq!(Voting::::get(&2).deposit, 3); assert_eq!(has_lock(&2), 12); assert_eq!(locked_stake_of(&2), 12); }); @@ -2262,9 +2260,9 @@ mod tests { assert_eq!(votes_of(&4), vec![4]); assert_eq!(candidate_ids(), vec![3, 4, 5]); - assert_eq!(>::decode_len().unwrap(), 3); + assert_eq!(Candidates::::decode_len().unwrap(), 3); - assert_eq!(Elections::election_rounds(), 0); + assert_eq!(ElectionRounds::::get(), 0); System::set_block_number(5); Elections::on_initialize(System::block_number()); @@ -2273,13 +2271,13 @@ mod tests { // votes for 5 assert_eq!(balances(&2), (18, 2)); assert_eq!(members_and_stake(), vec![(3, 25), (5, 18)]); - assert!(Elections::runners_up().is_empty()); + assert!(RunnersUp::::get().is_empty()); assert_eq_uvec!(all_voters(), vec![2, 3, 4]); assert!(candidate_ids().is_empty()); - assert_eq!(>::decode_len(), None); + assert_eq!(Candidates::::decode_len(), None); - assert_eq!(Elections::election_rounds(), 1); + assert_eq!(ElectionRounds::::get(), 1); }); } @@ -2342,7 +2340,7 @@ mod tests { Elections::on_initialize(System::block_number()); assert_eq!(members_and_stake(), vec![(5, 45)]); - assert_eq!(Elections::election_rounds(), 1); + assert_eq!(ElectionRounds::::get(), 1); // but now it has a valid target. assert_ok!(submit_candidacy(RuntimeOrigin::signed(4))); @@ -2352,7 +2350,7 @@ mod tests { // candidate 4 is affected by an old vote. assert_eq!(members_and_stake(), vec![(4, 28), (5, 45)]); - assert_eq!(Elections::election_rounds(), 2); + assert_eq!(ElectionRounds::::get(), 2); assert_eq_uvec!(all_voters(), vec![3, 5]); }); } @@ -2373,7 +2371,7 @@ mod tests { System::set_block_number(5); Elections::on_initialize(System::block_number()); - assert_eq!(Elections::election_rounds(), 1); + assert_eq!(ElectionRounds::::get(), 1); assert_eq!(members_ids(), vec![4, 5]); }); } @@ -2388,7 +2386,7 @@ mod tests { Elections::on_initialize(System::block_number()); assert!(candidate_ids().is_empty()); - assert_eq!(Elections::election_rounds(), 1); + assert_eq!(ElectionRounds::::get(), 1); assert!(members_ids().is_empty()); System::assert_last_event(RuntimeEvent::Elections(super::Event::NewTerm { @@ -2542,7 +2540,7 @@ mod tests { Elections::on_initialize(System::block_number()); assert_eq!(members_ids(), vec![4, 5]); - assert_eq!(Elections::election_rounds(), 1); + assert_eq!(ElectionRounds::::get(), 1); assert_ok!(submit_candidacy(RuntimeOrigin::signed(2))); assert_ok!(vote(RuntimeOrigin::signed(2), vec![2], 20)); @@ -2586,7 +2584,7 @@ mod tests { assert_eq!(runners_up_and_stake(), vec![(2, 15), (3, 25)]); // no new candidates but old members and runners-up are always added. assert!(candidate_ids().is_empty()); - assert_eq!(Elections::election_rounds(), b / 5); + assert_eq!(ElectionRounds::::get(), b / 5); assert_eq_uvec!(all_voters(), vec![2, 3, 4, 5]); }; @@ -2610,7 +2608,7 @@ mod tests { System::set_block_number(5); Elections::on_initialize(System::block_number()); assert_eq!(members_ids(), vec![4, 5]); - assert_eq!(Elections::election_rounds(), 1); + assert_eq!(ElectionRounds::::get(), 1); // a new candidate assert_ok!(submit_candidacy(RuntimeOrigin::signed(3))); @@ -2619,7 +2617,7 @@ mod tests { assert_ok!(Elections::remove_member(RuntimeOrigin::root(), 4, true, true)); assert_eq!(balances(&4), (35, 2)); // slashed - assert_eq!(Elections::election_rounds(), 2); // new election round + assert_eq!(ElectionRounds::::get(), 2); // new election round assert_eq!(members_ids(), vec![3, 5]); // new members }); } @@ -2636,14 +2634,14 @@ mod tests { assert_ok!(vote(RuntimeOrigin::signed(4), vec![4], 40)); assert_ok!(vote(RuntimeOrigin::signed(5), vec![5], 50)); - assert_eq!(>::decode_len().unwrap(), 3); + assert_eq!(Candidates::::decode_len().unwrap(), 3); - assert_eq!(Elections::election_rounds(), 0); + assert_eq!(ElectionRounds::::get(), 0); System::set_block_number(5); Elections::on_initialize(System::block_number()); assert_eq!(members_ids(), vec![3, 5]); - assert_eq!(Elections::election_rounds(), 1); + assert_eq!(ElectionRounds::::get(), 1); assert_ok!(Elections::remove_voter(RuntimeOrigin::signed(2))); assert_ok!(Elections::remove_voter(RuntimeOrigin::signed(3))); @@ -2654,7 +2652,7 @@ mod tests { System::set_block_number(10); Elections::on_initialize(System::block_number()); assert!(members_ids().is_empty()); - assert_eq!(Elections::election_rounds(), 2); + assert_eq!(ElectionRounds::::get(), 2); }); } @@ -2719,7 +2717,7 @@ mod tests { Elections::on_initialize(System::block_number()); assert_eq_uvec!(members_ids(), vec![3, 4]); - assert_eq!(Elections::election_rounds(), 1); + assert_eq!(ElectionRounds::::get(), 1); }); } @@ -3164,13 +3162,13 @@ mod tests { .desired_members(0) .desired_runners_up(0) .build_and_execute(|| { - assert_eq!(Elections::candidates().len(), 0); + assert_eq!(Candidates::::get().len(), 0); assert_ok!(submit_candidacy(RuntimeOrigin::signed(4))); assert_ok!(submit_candidacy(RuntimeOrigin::signed(3))); assert_ok!(submit_candidacy(RuntimeOrigin::signed(2))); - assert_eq!(Elections::candidates().len(), 3); + assert_eq!(Candidates::::get().len(), 3); assert_ok!(vote(RuntimeOrigin::signed(4), vec![4], 40)); assert_ok!(vote(RuntimeOrigin::signed(3), vec![3], 30)); @@ -3182,7 +3180,7 @@ mod tests { assert_eq!(members_ids().len(), 0); assert_eq!(runners_up_ids().len(), 0); assert_eq!(all_voters().len(), 3); - assert_eq!(Elections::candidates().len(), 0); + assert_eq!(Candidates::::get().len(), 0); }); // not interested in members @@ -3190,13 +3188,13 @@ mod tests { .desired_members(0) .desired_runners_up(2) .build_and_execute(|| { - assert_eq!(Elections::candidates().len(), 0); + assert_eq!(Candidates::::get().len(), 0); assert_ok!(submit_candidacy(RuntimeOrigin::signed(4))); assert_ok!(submit_candidacy(RuntimeOrigin::signed(3))); assert_ok!(submit_candidacy(RuntimeOrigin::signed(2))); - assert_eq!(Elections::candidates().len(), 3); + assert_eq!(Candidates::::get().len(), 3); assert_ok!(vote(RuntimeOrigin::signed(4), vec![4], 40)); assert_ok!(vote(RuntimeOrigin::signed(3), vec![3], 30)); @@ -3208,7 +3206,7 @@ mod tests { assert_eq!(members_ids().len(), 0); assert_eq!(runners_up_ids(), vec![3, 4]); assert_eq!(all_voters().len(), 3); - assert_eq!(Elections::candidates().len(), 0); + assert_eq!(Candidates::::get().len(), 0); }); // not interested in runners-up @@ -3216,13 +3214,13 @@ mod tests { .desired_members(2) .desired_runners_up(0) .build_and_execute(|| { - assert_eq!(Elections::candidates().len(), 0); + assert_eq!(Candidates::::get().len(), 0); assert_ok!(submit_candidacy(RuntimeOrigin::signed(4))); assert_ok!(submit_candidacy(RuntimeOrigin::signed(3))); assert_ok!(submit_candidacy(RuntimeOrigin::signed(2))); - assert_eq!(Elections::candidates().len(), 3); + assert_eq!(Candidates::::get().len(), 3); assert_ok!(vote(RuntimeOrigin::signed(4), vec![4], 40)); assert_ok!(vote(RuntimeOrigin::signed(3), vec![3], 30)); @@ -3234,7 +3232,7 @@ mod tests { assert_eq!(members_ids(), vec![3, 4]); assert_eq!(runners_up_ids().len(), 0); assert_eq!(all_voters().len(), 3); - assert_eq!(Elections::candidates().len(), 0); + assert_eq!(Candidates::::get().len(), 0); }); } diff --git a/substrate/frame/elections-phragmen/src/migrations/v3.rs b/substrate/frame/elections-phragmen/src/migrations/v3.rs index cdca1138ebb..b0092d6c07b 100644 --- a/substrate/frame/elections-phragmen/src/migrations/v3.rs +++ b/substrate/frame/elections-phragmen/src/migrations/v3.rs @@ -116,16 +116,16 @@ pub fn apply( /// Migrate from the old legacy voting bond (fixed) to the new one (per-vote dynamic). pub fn migrate_voters_to_recorded_deposit(old_deposit: V::Balance) { - >::translate::<(V::Balance, Vec), _>(|_who, (stake, votes)| { + Voting::::translate::<(V::Balance, Vec), _>(|_who, (stake, votes)| { Some(Voter { votes, stake, deposit: old_deposit }) }); - log::info!(target: LOG_TARGET, "migrated {} voter accounts.", >::iter().count()); + log::info!(target: LOG_TARGET, "migrated {} voter accounts.", Voting::::iter().count()); } /// Migrate all candidates to recorded deposit. pub fn migrate_candidates_to_recorded_deposit(old_deposit: V::Balance) { - let _ = >::translate::, _>(|maybe_old_candidates| { + let _ = Candidates::::translate::, _>(|maybe_old_candidates| { maybe_old_candidates.map(|old_candidates| { log::info!(target: LOG_TARGET, "migrated {} candidate accounts.", old_candidates.len()); old_candidates.into_iter().map(|c| (c, old_deposit)).collect::>() @@ -135,7 +135,7 @@ pub fn migrate_candidates_to_recorded_deposit(old_deposit: /// Migrate all members to recorded deposit. pub fn migrate_members_to_recorded_deposit(old_deposit: V::Balance) { - let _ = >::translate::, _>(|maybe_old_members| { + let _ = Members::::translate::, _>(|maybe_old_members| { maybe_old_members.map(|old_members| { log::info!(target: LOG_TARGET, "migrated {} member accounts.", old_members.len()); old_members @@ -148,7 +148,7 @@ pub fn migrate_members_to_recorded_deposit(old_deposit: V: /// Migrate all runners-up to recorded deposit. pub fn migrate_runners_up_to_recorded_deposit(old_deposit: V::Balance) { - let _ = >::translate::, _>( + let _ = RunnersUp::::translate::, _>( |maybe_old_runners_up| { maybe_old_runners_up.map(|old_runners_up| { log::info!( -- GitLab From f8feebc12736c04d60040e0f291615479f9951a5 Mon Sep 17 00:00:00 2001 From: girazoki Date: Sun, 23 Jun 2024 11:35:36 +0200 Subject: [PATCH 038/130] Reinitialize should allow to override existing config in collationGeneration (#4833) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently the `Initialize` and `Reinitialize` messages in the collationGeneration subsystem fail if: - `Initialize` if there exists already another configuration and - `Reinitialize` if another configuration does not exist I propose to instead change the behaviour of `Reinitialize` to always set the config regardless of whether one exists or not. --------- Co-authored-by: Bastian Köcher Co-authored-by: Andrei Sandu <54316454+sandreim@users.noreply.github.com> --- polkadot/node/collation-generation/src/lib.rs | 6 +----- prdoc/pr_4833.prdoc | 12 ++++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 prdoc/pr_4833.prdoc diff --git a/polkadot/node/collation-generation/src/lib.rs b/polkadot/node/collation-generation/src/lib.rs index 0c2f8ee14a5..d38516a4ff7 100644 --- a/polkadot/node/collation-generation/src/lib.rs +++ b/polkadot/node/collation-generation/src/lib.rs @@ -147,11 +147,7 @@ impl CollationGenerationSubsystem { Ok(FromOrchestra::Communication { msg: CollationGenerationMessage::Reinitialize(config), }) => { - if self.config.is_none() { - gum::error!(target: LOG_TARGET, "no initial initialization"); - } else { - self.config = Some(Arc::new(config)); - } + self.config = Some(Arc::new(config)); false }, Ok(FromOrchestra::Communication { diff --git a/prdoc/pr_4833.prdoc b/prdoc/pr_4833.prdoc new file mode 100644 index 00000000000..a5cf853696e --- /dev/null +++ b/prdoc/pr_4833.prdoc @@ -0,0 +1,12 @@ +title: "Reinitialize should allow to override existing config in collationGeneration" + +doc: + - audience: Node Dev + description: | + The Reinitialize collationGeneration subsystem message currently fails if no other config is already set. + As it is difficult to query the collationGeneration subsystem to check when to call Initialize or Reinitialize, this PR + proposes that Reinitialize overrides the configuration regardless if there was one already set. + +crates: + - name: polkadot-node-collation-generation + bump: minor -- GitLab From 686aa233e67c619bcdbc8b758a9ddf92c3315cf1 Mon Sep 17 00:00:00 2001 From: Nazar Mokrynskyi Date: Sun, 23 Jun 2024 14:36:34 +0300 Subject: [PATCH 039/130] Block import cleanups (#4842) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I carried these things in a fork for a long time, I think wouldn't hurt to have it upstream. Originally submitted as part of https://github.com/paritytech/polkadot-sdk/pull/1598 that went nowhere. --------- Co-authored-by: Bastian Köcher --- Cargo.lock | 1 - substrate/client/consensus/common/Cargo.toml | 1 - .../consensus/common/src/import_queue.rs | 3 +- .../common/src/import_queue/basic_queue.rs | 30 +++++-------------- 4 files changed, 9 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f86907030f8..22f89fe4577 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16995,7 +16995,6 @@ version = "0.33.0" dependencies = [ "async-trait", "futures", - "futures-timer", "log", "mockall 0.11.4", "parking_lot 0.12.1", diff --git a/substrate/client/consensus/common/Cargo.toml b/substrate/client/consensus/common/Cargo.toml index 6d642ec78fe..f45998e7d75 100644 --- a/substrate/client/consensus/common/Cargo.toml +++ b/substrate/client/consensus/common/Cargo.toml @@ -18,7 +18,6 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] async-trait = "0.1.79" futures = { version = "0.3.30", features = ["thread-pool"] } -futures-timer = "3.0.1" log = { workspace = true, default-features = true } mockall = "0.11.3" parking_lot = "0.12.1" diff --git a/substrate/client/consensus/common/src/import_queue.rs b/substrate/client/consensus/common/src/import_queue.rs index 371465536c3..1ddda04126a 100644 --- a/substrate/client/consensus/common/src/import_queue.rs +++ b/substrate/client/consensus/common/src/import_queue.rs @@ -104,7 +104,8 @@ pub trait Verifier: Send { /// /// The `import_*` methods can be called in order to send elements for the import queue to verify. pub trait ImportQueueService: Send { - /// Import bunch of blocks. + /// Import bunch of blocks, every next block must be an ancestor of the previous block in the + /// list. fn import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>); /// Import block justifications. diff --git a/substrate/client/consensus/common/src/import_queue/basic_queue.rs b/substrate/client/consensus/common/src/import_queue/basic_queue.rs index f4f618d1b31..e5eac3896cc 100644 --- a/substrate/client/consensus/common/src/import_queue/basic_queue.rs +++ b/substrate/client/consensus/common/src/import_queue/basic_queue.rs @@ -19,7 +19,6 @@ use futures::{ prelude::*, task::{Context, Poll}, }; -use futures_timer::Delay; use log::{debug, trace}; use prometheus_endpoint::Registry; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; @@ -28,7 +27,7 @@ use sp_runtime::{ traits::{Block as BlockT, Header as HeaderT, NumberFor}, Justification, Justifications, }; -use std::{pin::Pin, time::Duration}; +use std::pin::Pin; use crate::{ import_queue::{ @@ -224,7 +223,6 @@ async fn block_import_process( mut result_sender: BufferedLinkSender, mut block_import_receiver: TracingUnboundedReceiver>, metrics: Option, - delay_between_blocks: Duration, ) { loop { let worker_messages::ImportBlocks(origin, blocks) = match block_import_receiver.next().await @@ -239,15 +237,9 @@ async fn block_import_process( }, }; - let res = import_many_blocks( - &mut block_import, - origin, - blocks, - &mut verifier, - delay_between_blocks, - metrics.clone(), - ) - .await; + let res = + import_many_blocks(&mut block_import, origin, blocks, &mut verifier, metrics.clone()) + .await; result_sender.blocks_processed(res.imported, res.block_count, res.results); } @@ -276,13 +268,11 @@ impl BlockImportWorker { let (justification_sender, mut justification_port) = tracing_unbounded("mpsc_import_queue_worker_justification", 100_000); - let (block_import_sender, block_import_port) = + let (block_import_sender, block_import_receiver) = tracing_unbounded("mpsc_import_queue_worker_blocks", 100_000); let mut worker = BlockImportWorker { result_sender, justification_import, metrics }; - let delay_between_blocks = Duration::default(); - let future = async move { // Let's initialize `justification_import` if let Some(justification_import) = worker.justification_import.as_mut() { @@ -295,9 +285,8 @@ impl BlockImportWorker { block_import, verifier, worker.result_sender.clone(), - block_import_port, + block_import_receiver, worker.metrics.clone(), - delay_between_blocks, ); futures::pin_mut!(block_import_process); @@ -394,7 +383,6 @@ async fn import_many_blocks>( blocks_origin: BlockOrigin, blocks: Vec>, verifier: &mut V, - delay_between_blocks: Duration, metrics: Option, ) -> ImportManyBlocksResult { let count = blocks.len(); @@ -460,11 +448,7 @@ async fn import_many_blocks>( results.push((import_result, block_hash)); - if delay_between_blocks != Duration::default() && !has_error { - Delay::new(delay_between_blocks).await; - } else { - Yield::new().await - } + Yield::new().await } } -- GitLab From 7df94a469e02e1d553bd4050b0e91870d6a4c31b Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Mon, 24 Jun 2024 11:16:34 +0200 Subject: [PATCH 040/130] Dont publish example pallets (#4861) Signed-off-by: Oliver Tale-Yazdi --- substrate/frame/examples/basic/Cargo.toml | 1 + substrate/frame/examples/default-config/Cargo.toml | 1 + substrate/frame/examples/offchain-worker/Cargo.toml | 1 + substrate/frame/examples/split/Cargo.toml | 1 + substrate/frame/examples/tasks/Cargo.toml | 1 + 5 files changed, 5 insertions(+) diff --git a/substrate/frame/examples/basic/Cargo.toml b/substrate/frame/examples/basic/Cargo.toml index ba9f9eca27d..13ddccc30d7 100644 --- a/substrate/frame/examples/basic/Cargo.toml +++ b/substrate/frame/examples/basic/Cargo.toml @@ -8,6 +8,7 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME example pallet" readme = "README.md" +publish = false [lints] workspace = true diff --git a/substrate/frame/examples/default-config/Cargo.toml b/substrate/frame/examples/default-config/Cargo.toml index 0ad5b56cb6f..49e5bf2b4a2 100644 --- a/substrate/frame/examples/default-config/Cargo.toml +++ b/substrate/frame/examples/default-config/Cargo.toml @@ -8,6 +8,7 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME example pallet demonstrating derive_impl / default_config in action" readme = "README.md" +publish = false [lints] workspace = true diff --git a/substrate/frame/examples/offchain-worker/Cargo.toml b/substrate/frame/examples/offchain-worker/Cargo.toml index 23ce79c3440..88a761dd8fc 100644 --- a/substrate/frame/examples/offchain-worker/Cargo.toml +++ b/substrate/frame/examples/offchain-worker/Cargo.toml @@ -8,6 +8,7 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME example pallet for offchain worker" readme = "README.md" +publish = false [lints] workspace = true diff --git a/substrate/frame/examples/split/Cargo.toml b/substrate/frame/examples/split/Cargo.toml index 6cb4d7ddd6c..000e9089bda 100644 --- a/substrate/frame/examples/split/Cargo.toml +++ b/substrate/frame/examples/split/Cargo.toml @@ -8,6 +8,7 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME example split pallet" readme = "README.md" +publish = false [lints] workspace = true diff --git a/substrate/frame/examples/tasks/Cargo.toml b/substrate/frame/examples/tasks/Cargo.toml index 95246ef3f66..5ce9fd768a1 100644 --- a/substrate/frame/examples/tasks/Cargo.toml +++ b/substrate/frame/examples/tasks/Cargo.toml @@ -6,6 +6,7 @@ edition.workspace = true license.workspace = true repository.workspace = true description = "Pallet to demonstrate the usage of Tasks to recognize and execute service work" +publish = false [lints] workspace = true -- GitLab From fed81f7e854f4a82ad815343fac13caf7b5d03eb Mon Sep 17 00:00:00 2001 From: Deepak Chaudhary <54492415+Aideepakchaudhary@users.noreply.github.com> Date: Mon, 24 Jun 2024 18:34:34 +0800 Subject: [PATCH 041/130] pallet-membership should implement ContainsLengthBound (#4865) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### ISSUE Link to the issue: https://github.com/paritytech/polkadot-sdk/issues/1143 Deliverables - Implement trait `ContainsLengthBound` for pallet-membership ### Test Outcomes ___ Successful tests by running `cargo test -p pallet-membership --features runtime-benchmarks` running 22 tests test tests::__construct_runtime_integrity_test::runtime_integrity_tests ... ok test benchmark::bench_clear_prime ... ok test tests::add_member_works ... ok test tests::change_key_with_same_caller_as_argument_changes_nothing ... ok test tests::change_key_works ... ok test benchmark::bench_set_prime ... ok test benchmark::bench_remove_member ... ok test benchmark::bench_change_key ... ok test tests::change_key_works_that_does_not_change_order ... ok test benchmark::bench_reset_members ... ok test benchmark::bench_add_member ... ok test tests::genesis_build_panics_with_duplicate_members - should panic ... ok test benchmark::bench_swap_member ... ok test tests::query_membership_works ... ok test tests::prime_member_works ... ok test tests::test_genesis_config_builds ... ok test tests::remove_member_works ... ok test tests::migration_v4 ... ok test tests::swap_member_with_identical_arguments_changes_nothing ... ok test tests::swap_member_works_that_does_not_change_order ... ok test tests::swap_member_works ... ok test tests::reset_members_works ... ok test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s Doc-tests pallet_membership running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s --------- Co-authored-by: Bastian Köcher --- prdoc/pr_4865.prdoc | 13 +++++++++++++ substrate/frame/membership/src/lib.rs | 13 ++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 prdoc/pr_4865.prdoc diff --git a/prdoc/pr_4865.prdoc b/prdoc/pr_4865.prdoc new file mode 100644 index 00000000000..48ffd04219c --- /dev/null +++ b/prdoc/pr_4865.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Implement trait `ContainsLengthBound` for pallet-membership + +doc: + - audience: Runtime Dev + description: | + Implement trait ContainsLengthBound for pallet membership otherwise we can't use it with pallet-tips without wrapper + +crates: + - name: pallet-membership + bump: minor diff --git a/substrate/frame/membership/src/lib.rs b/substrate/frame/membership/src/lib.rs index aa6be6497ee..8deb4fc022f 100644 --- a/substrate/frame/membership/src/lib.rs +++ b/substrate/frame/membership/src/lib.rs @@ -24,7 +24,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use frame_support::{ - traits::{ChangeMembers, Contains, Get, InitializeMembers, SortedMembers}, + traits::{ChangeMembers, Contains, ContainsLengthBound, Get, InitializeMembers, SortedMembers}, BoundedVec, }; use sp_runtime::traits::{StaticLookup, UniqueSaturatedInto}; @@ -361,6 +361,17 @@ impl, I: 'static> Contains for Pallet { } } +impl ContainsLengthBound for Pallet { + fn min_len() -> usize { + 0 + } + + /// Implementation uses a parameter type so calling is cost-free. + fn max_len() -> usize { + T::MaxMembers::get() as usize + } +} + impl, I: 'static> SortedMembers for Pallet { fn sorted_members() -> Vec { Self::members().to_vec() -- GitLab From b7767168b7dd93964f40e8543b853097e3570621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 24 Jun 2024 12:37:13 +0200 Subject: [PATCH 042/130] Ensure earliest allowed block is at minimum the next block (#4823) When `min_enactment_period == 0` and `desired == At(n)` where `n` is smaller than the current block number, the scheduling would fail. This happened for example here: https://collectives.subsquare.io/fellowship/referenda/126 To ensure that this doesn't happen again, ensure that the earliest allowed block is at minimum the next block. --- prdoc/pr_4823.prdoc | 11 +++++++++++ substrate/frame/referenda/src/lib.rs | 3 ++- substrate/frame/referenda/src/mock.rs | 25 ++++++++++++++++++++++++- substrate/frame/referenda/src/tests.rs | 24 ++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 prdoc/pr_4823.prdoc diff --git a/prdoc/pr_4823.prdoc b/prdoc/pr_4823.prdoc new file mode 100644 index 00000000000..a498b33f7bf --- /dev/null +++ b/prdoc/pr_4823.prdoc @@ -0,0 +1,11 @@ +title: "`pallet-referenda`: Ensure to schedule referendas earliest at the next block" + +doc: + - audience: Runtime User + description: | + Ensure that referendas are scheduled earliest at the next block when they are enacted. + Otherwise the scheduling may fails and thus, the enactment of the referenda. + +crates: + - name: pallet-referenda + bump: patch diff --git a/substrate/frame/referenda/src/lib.rs b/substrate/frame/referenda/src/lib.rs index fbe27e1a478..0cdf450d3b6 100644 --- a/substrate/frame/referenda/src/lib.rs +++ b/substrate/frame/referenda/src/lib.rs @@ -891,7 +891,8 @@ impl, I: 'static> Pallet { call: BoundedCallOf, ) { let now = frame_system::Pallet::::block_number(); - let earliest_allowed = now.saturating_add(track.min_enactment_period); + // Earliest allowed block is always at minimum the next block. + let earliest_allowed = now.saturating_add(track.min_enactment_period.max(One::one())); let desired = desired.evaluate(now); let ok = T::Scheduler::schedule_named( (ASSEMBLY_ID, "enactment", index).using_encoded(sp_io::hashing::blake2_256), diff --git a/substrate/frame/referenda/src/mock.rs b/substrate/frame/referenda/src/mock.rs index d47da455811..bf0fa4e1a12 100644 --- a/substrate/frame/referenda/src/mock.rs +++ b/substrate/frame/referenda/src/mock.rs @@ -112,7 +112,7 @@ impl TracksInfo for TestTracksInfo { type Id = u8; type RuntimeOrigin = ::PalletsOrigin; fn tracks() -> &'static [(Self::Id, TrackInfo)] { - static DATA: [(u8, TrackInfo); 2] = [ + static DATA: [(u8, TrackInfo); 3] = [ ( 0u8, TrackInfo { @@ -157,6 +157,28 @@ impl TracksInfo for TestTracksInfo { }, }, ), + ( + 2u8, + TrackInfo { + name: "none", + max_deciding: 3, + decision_deposit: 1, + prepare_period: 2, + decision_period: 2, + confirm_period: 1, + min_enactment_period: 0, + min_approval: Curve::LinearDecreasing { + length: Perbill::from_percent(100), + floor: Perbill::from_percent(95), + ceil: Perbill::from_percent(100), + }, + min_support: Curve::LinearDecreasing { + length: Perbill::from_percent(100), + floor: Perbill::from_percent(90), + ceil: Perbill::from_percent(100), + }, + }, + ), ]; &DATA[..] } @@ -165,6 +187,7 @@ impl TracksInfo for TestTracksInfo { match system_origin { frame_system::RawOrigin::Root => Ok(0), frame_system::RawOrigin::None => Ok(1), + frame_system::RawOrigin::Signed(1) => Ok(2), _ => Err(()), } } else { diff --git a/substrate/frame/referenda/src/tests.rs b/substrate/frame/referenda/src/tests.rs index 52251fcbdbe..3f859636f7c 100644 --- a/substrate/frame/referenda/src/tests.rs +++ b/substrate/frame/referenda/src/tests.rs @@ -682,3 +682,27 @@ fn detects_incorrect_len() { ); }); } + +/// Ensures that `DispatchTime::After(0)` plus `min_enactment_period = 0` works. +#[test] +fn zero_enactment_delay_executes_proposal_at_next_block() { + ExtBuilder::default().build_and_execute(|| { + assert_eq!(Balances::free_balance(42), 0); + assert_ok!(Referenda::submit( + RuntimeOrigin::signed(1), + Box::new(RawOrigin::Signed(1).into()), + Preimage::bound( + pallet_balances::Call::transfer_keep_alive { dest: 42, value: 20 }.into() + ) + .unwrap(), + DispatchTime::After(0), + )); + assert_ok!(Referenda::place_decision_deposit(RuntimeOrigin::signed(1), 0)); + assert_eq!(ReferendumCount::::get(), 1); + set_tally(0, 100, 0); + + run_to(9); + + assert_eq!(Balances::free_balance(42), 20); + }); +} -- GitLab From 8efa0544179622245c82e15afe24f3a605296741 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Mon, 24 Jun 2024 13:27:53 +0200 Subject: [PATCH 043/130] Lift all dependencies (the big one) (#4716) After preparing in https://github.com/paritytech/polkadot-sdk/pull/4633, we can lift also all internal dependencies up to the workspace. This does not actually change anything, but uses `workspace = true` for all dependencies. You can check it with: ```bash git checkout -q $(git merge-base oty-lift-all-deps origin/master) cargo tree -e features > master.out git checkout -q oty-lift-all-deps cargo tree -e features > new.out diff master.out new.out ``` It did not yet lift 100% of dependencies, some inside of `target.*` or some that had conflicting aliases introduced recently. But i will do these together in a follow-up with CI checks. Can be reproduced with [zepter](https://github.com/ggwpez/zepter/): `zepter transpose d lift-to-workspace "regex:.*" --version-resolver highest --skip-package "polkadot-sdk" --ignore-errors --fix`. --------- Signed-off-by: Oliver Tale-Yazdi --- .config/taplo.toml | 7 + .github/scripts/check-workspace.py | 10 +- .github/scripts/deny-git-deps.py | 14 +- Cargo.lock | 17 +- Cargo.toml | 767 +++++++++++++++++- bridges/bin/runtime-common/Cargo.toml | 62 +- .../chains/chain-asset-hub-rococo/Cargo.toml | 8 +- .../chains/chain-asset-hub-westend/Cargo.toml | 8 +- .../chain-bridge-hub-cumulus/Cargo.toml | 16 +- .../chains/chain-bridge-hub-kusama/Cargo.toml | 14 +- .../chain-bridge-hub-polkadot/Cargo.toml | 14 +- .../chains/chain-bridge-hub-rococo/Cargo.toml | 14 +- .../chain-bridge-hub-westend/Cargo.toml | 14 +- bridges/chains/chain-kusama/Cargo.toml | 12 +- .../chains/chain-polkadot-bulletin/Cargo.toml | 22 +- bridges/chains/chain-polkadot/Cargo.toml | 12 +- bridges/chains/chain-rococo/Cargo.toml | 12 +- bridges/chains/chain-westend/Cargo.toml | 12 +- bridges/modules/beefy/Cargo.toml | 32 +- bridges/modules/grandpa/Cargo.toml | 30 +- bridges/modules/messages/Cargo.toml | 26 +- bridges/modules/parachains/Cargo.toml | 34 +- bridges/modules/relayers/Cargo.toml | 32 +- .../modules/xcm-bridge-hub-router/Cargo.toml | 26 +- bridges/modules/xcm-bridge-hub/Cargo.toml | 36 +- bridges/primitives/beefy/Cargo.toml | 22 +- bridges/primitives/header-chain/Cargo.toml | 24 +- bridges/primitives/messages/Cargo.toml | 18 +- bridges/primitives/parachains/Cargo.toml | 20 +- bridges/primitives/polkadot-core/Cargo.toml | 22 +- bridges/primitives/relayers/Cargo.toml | 18 +- bridges/primitives/runtime/Cargo.toml | 30 +- bridges/primitives/test-utils/Cargo.toml | 26 +- .../xcm-bridge-hub-router/Cargo.toml | 8 +- bridges/primitives/xcm-bridge-hub/Cargo.toml | 2 +- bridges/relays/client-substrate/Cargo.toml | 68 +- bridges/relays/equivocation/Cargo.toml | 16 +- bridges/relays/finality/Cargo.toml | 16 +- bridges/relays/lib-substrate-relay/Cargo.toml | 72 +- bridges/relays/messages/Cargo.toml | 22 +- bridges/relays/parachains/Cargo.toml | 18 +- bridges/relays/utils/Cargo.toml | 34 +- .../pallets/ethereum-client/Cargo.toml | 44 +- .../ethereum-client/fixtures/Cargo.toml | 10 +- .../pallets/inbound-queue/Cargo.toml | 46 +- .../pallets/inbound-queue/fixtures/Cargo.toml | 10 +- .../pallets/outbound-queue/Cargo.toml | 32 +- .../outbound-queue/merkle-tree/Cargo.toml | 18 +- .../outbound-queue/runtime-api/Cargo.toml | 12 +- bridges/snowbridge/pallets/system/Cargo.toml | 40 +- .../pallets/system/runtime-api/Cargo.toml | 12 +- .../snowbridge/primitives/beacon/Cargo.toml | 30 +- bridges/snowbridge/primitives/core/Cargo.toml | 32 +- .../snowbridge/primitives/ethereum/Cargo.toml | 26 +- .../snowbridge/primitives/router/Cargo.toml | 24 +- .../runtime/runtime-common/Cargo.toml | 16 +- .../snowbridge/runtime/test-common/Cargo.toml | 48 +- cumulus/client/cli/Cargo.toml | 20 +- cumulus/client/collator/Cargo.toml | 48 +- cumulus/client/consensus/aura/Cargo.toml | 70 +- cumulus/client/consensus/common/Cargo.toml | 52 +- cumulus/client/consensus/proposer/Cargo.toml | 14 +- .../client/consensus/relay-chain/Cargo.toml | 32 +- cumulus/client/network/Cargo.toml | 68 +- cumulus/client/parachain-inherent/Cargo.toml | 34 +- cumulus/client/pov-recovery/Cargo.toml | 62 +- .../Cargo.toml | 44 +- .../client/relay-chain-interface/Cargo.toml | 22 +- .../relay-chain-minimal-node/Cargo.toml | 70 +- .../relay-chain-rpc-interface/Cargo.toml | 58 +- cumulus/client/service/Cargo.toml | 60 +- cumulus/pallets/aura-ext/Cargo.toml | 24 +- cumulus/pallets/collator-selection/Cargo.toml | 38 +- cumulus/pallets/dmp-queue/Cargo.toml | 24 +- cumulus/pallets/parachain-system/Cargo.toml | 86 +- .../parachain-system/proc-macro/Cargo.toml | 4 +- .../pallets/session-benchmarking/Cargo.toml | 14 +- cumulus/pallets/solo-to-para/Cargo.toml | 18 +- cumulus/pallets/xcm/Cargo.toml | 18 +- cumulus/pallets/xcmp-queue/Cargo.toml | 44 +- cumulus/parachains/common/Cargo.toml | 50 +- .../assets/asset-hub-rococo/Cargo.toml | 18 +- .../assets/asset-hub-westend/Cargo.toml | 18 +- .../bridges/bridge-hub-rococo/Cargo.toml | 14 +- .../bridges/bridge-hub-westend/Cargo.toml | 14 +- .../collectives-westend/Cargo.toml | 14 +- .../people/people-rococo/Cargo.toml | 14 +- .../people/people-westend/Cargo.toml | 14 +- .../parachains/testing/penpal/Cargo.toml | 14 +- .../emulated/chains/relays/rococo/Cargo.toml | 20 +- .../emulated/chains/relays/westend/Cargo.toml | 28 +- .../emulated/common/Cargo.toml | 52 +- .../networks/rococo-system/Cargo.toml | 12 +- .../networks/rococo-westend-system/Cargo.toml | 16 +- .../networks/westend-system/Cargo.toml | 14 +- .../tests/assets/asset-hub-rococo/Cargo.toml | 46 +- .../tests/assets/asset-hub-westend/Cargo.toml | 58 +- .../bridges/bridge-hub-rococo/Cargo.toml | 54 +- .../bridges/bridge-hub-westend/Cargo.toml | 30 +- .../collectives-westend/Cargo.toml | 48 +- .../tests/people/people-rococo/Cargo.toml | 32 +- .../tests/people/people-westend/Cargo.toml | 32 +- .../pallets/collective-content/Cargo.toml | 18 +- .../pallets/parachain-info/Cargo.toml | 14 +- cumulus/parachains/pallets/ping/Cargo.toml | 18 +- .../assets/asset-hub-rococo/Cargo.toml | 154 ++-- .../assets/asset-hub-westend/Cargo.toml | 152 ++-- .../runtimes/assets/common/Cargo.toml | 30 +- .../runtimes/assets/test-utils/Cargo.toml | 48 +- .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 194 ++--- .../bridge-hubs/bridge-hub-westend/Cargo.toml | 160 ++-- .../runtimes/bridge-hubs/common/Cargo.toml | 20 +- .../bridge-hubs/test-utils/Cargo.toml | 64 +- .../collectives-westend/Cargo.toml | 140 ++-- .../parachains/runtimes/constants/Cargo.toml | 16 +- .../contracts/contracts-rococo/Cargo.toml | 116 +-- .../coretime/coretime-rococo/Cargo.toml | 116 +-- .../coretime/coretime-westend/Cargo.toml | 114 +-- .../glutton/glutton-westend/Cargo.toml | 80 +- .../runtimes/people/people-rococo/Cargo.toml | 116 +-- .../runtimes/people/people-westend/Cargo.toml | 116 +-- .../runtimes/starters/seedling/Cargo.toml | 58 +- .../runtimes/starters/shell/Cargo.toml | 62 +- .../parachains/runtimes/test-utils/Cargo.toml | 50 +- .../runtimes/testing/penpal/Cargo.toml | 110 +-- .../testing/rococo-parachain/Cargo.toml | 92 +-- cumulus/polkadot-parachain/Cargo.toml | 178 ++-- cumulus/primitives/aura/Cargo.toml | 14 +- cumulus/primitives/core/Cargo.toml | 20 +- .../primitives/parachain-inherent/Cargo.toml | 20 +- .../proof-size-hostfunction/Cargo.toml | 12 +- .../storage-weight-reclaim/Cargo.toml | 24 +- cumulus/primitives/timestamp/Cargo.toml | 12 +- cumulus/primitives/utility/Cargo.toml | 24 +- cumulus/test/client/Cargo.toml | 62 +- cumulus/test/relay-sproof-builder/Cargo.toml | 14 +- cumulus/test/runtime/Cargo.toml | 72 +- cumulus/test/service/Cargo.toml | 152 ++-- cumulus/xcm/xcm-emulator/Cargo.toml | 52 +- docs/sdk/Cargo.toml | 150 ++-- .../chain_spec_runtime/Cargo.toml | 42 +- master.wasm | Bin 0 -> 2462034 bytes modified.wasm | Bin 0 -> 2462034 bytes polkadot/Cargo.toml | 30 +- polkadot/cli/Cargo.toml | 42 +- polkadot/core-primitives/Cargo.toml | 10 +- polkadot/erasure-coding/Cargo.toml | 16 +- polkadot/erasure-coding/fuzzer/Cargo.toml | 8 +- polkadot/node/collation-generation/Cargo.toml | 30 +- polkadot/node/core/approval-voting/Cargo.toml | 74 +- polkadot/node/core/av-store/Cargo.toml | 46 +- polkadot/node/core/backing/Cargo.toml | 44 +- .../node/core/bitfield-signing/Cargo.toml | 18 +- .../node/core/candidate-validation/Cargo.toml | 40 +- polkadot/node/core/chain-api/Cargo.toml | 30 +- polkadot/node/core/chain-selection/Cargo.toml | 28 +- .../node/core/dispute-coordinator/Cargo.toml | 42 +- .../node/core/parachains-inherent/Cargo.toml | 18 +- .../core/prospective-parachains/Cargo.toml | 38 +- polkadot/node/core/provisioner/Cargo.toml | 30 +- polkadot/node/core/pvf-checker/Cargo.toml | 32 +- polkadot/node/core/pvf/Cargo.toml | 72 +- polkadot/node/core/pvf/common/Cargo.toml | 38 +- .../node/core/pvf/execute-worker/Cargo.toml | 18 +- .../node/core/pvf/prepare-worker/Cargo.toml | 34 +- polkadot/node/core/runtime-api/Cargo.toml | 32 +- polkadot/node/gum/Cargo.toml | 8 +- polkadot/node/gum/proc-macro/Cargo.toml | 8 +- polkadot/node/jaeger/Cargo.toml | 20 +- polkadot/node/malus/Cargo.toml | 56 +- polkadot/node/metrics/Cargo.toml | 40 +- .../network/approval-distribution/Cargo.toml | 44 +- .../availability-distribution/Cargo.toml | 52 +- .../network/availability-recovery/Cargo.toml | 54 +- .../network/bitfield-distribution/Cargo.toml | 40 +- polkadot/node/network/bridge/Cargo.toml | 44 +- .../node/network/collator-protocol/Cargo.toml | 56 +- .../network/dispute-distribution/Cargo.toml | 54 +- .../node/network/gossip-support/Cargo.toml | 50 +- polkadot/node/network/protocol/Cargo.toml | 38 +- .../network/statement-distribution/Cargo.toml | 60 +- polkadot/node/overseer/Cargo.toml | 44 +- polkadot/node/primitives/Cargo.toml | 28 +- polkadot/node/service/Cargo.toml | 238 +++--- polkadot/node/subsystem-bench/Cargo.toml | 122 +-- .../node/subsystem-test-helpers/Cargo.toml | 30 +- polkadot/node/subsystem-types/Cargo.toml | 44 +- polkadot/node/subsystem-util/Cargo.toml | 74 +- polkadot/node/subsystem/Cargo.toml | 6 +- polkadot/node/test/client/Cargo.toml | 46 +- polkadot/node/test/service/Cargo.toml | 94 +-- .../node/zombienet-backchannel/Cargo.toml | 16 +- polkadot/parachain/Cargo.toml | 18 +- polkadot/parachain/test-parachains/Cargo.toml | 10 +- .../test-parachains/adder/Cargo.toml | 14 +- .../test-parachains/adder/collator/Cargo.toml | 40 +- .../parachain/test-parachains/halt/Cargo.toml | 4 +- .../test-parachains/undying/Cargo.toml | 14 +- .../undying/collator/Cargo.toml | 40 +- polkadot/primitives/Cargo.toml | 38 +- polkadot/primitives/test-helpers/Cargo.toml | 12 +- polkadot/rpc/Cargo.toml | 56 +- polkadot/runtime/common/Cargo.toml | 98 +-- .../common/slot_range_helper/Cargo.toml | 10 +- polkadot/runtime/metrics/Cargo.toml | 12 +- polkadot/runtime/parachains/Cargo.toml | 104 +-- polkadot/runtime/rococo/Cargo.toml | 194 ++--- polkadot/runtime/rococo/constants/Cargo.toml | 18 +- polkadot/runtime/test-runtime/Cargo.toml | 104 +-- .../runtime/test-runtime/constants/Cargo.toml | 8 +- polkadot/runtime/westend/Cargo.toml | 208 ++--- polkadot/runtime/westend/constants/Cargo.toml | 18 +- polkadot/statement-table/Cargo.toml | 8 +- polkadot/utils/generate-bags/Cargo.toml | 8 +- .../remote-ext-tests/bags-list/Cargo.toml | 16 +- polkadot/xcm/Cargo.toml | 26 +- polkadot/xcm/docs/Cargo.toml | 36 +- polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml | 36 +- polkadot/xcm/pallet-xcm/Cargo.toml | 36 +- polkadot/xcm/procedural/Cargo.toml | 8 +- polkadot/xcm/xcm-builder/Cargo.toml | 46 +- polkadot/xcm/xcm-executor/Cargo.toml | 26 +- .../xcm-executor/integration-tests/Cargo.toml | 36 +- .../xcm-fee-payment-runtime-api/Cargo.toml | 38 +- polkadot/xcm/xcm-simulator/Cargo.toml | 30 +- polkadot/xcm/xcm-simulator/example/Cargo.toml | 40 +- polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml | 44 +- substrate/bin/node/bench/Cargo.toml | 54 +- substrate/bin/node/cli/Cargo.toml | 62 +- substrate/bin/node/inspect/Cargo.toml | 20 +- substrate/bin/node/primitives/Cargo.toml | 4 +- substrate/bin/node/rpc/Cargo.toml | 60 +- substrate/bin/node/runtime/Cargo.toml | 20 +- substrate/bin/node/testing/Cargo.toml | 64 +- .../bin/utils/chain-spec-builder/Cargo.toml | 6 +- substrate/bin/utils/subkey/Cargo.toml | 4 +- substrate/client/allocator/Cargo.toml | 4 +- substrate/client/api/Cargo.toml | 44 +- .../client/authority-discovery/Cargo.toml | 52 +- substrate/client/basic-authorship/Cargo.toml | 36 +- substrate/client/block-builder/Cargo.toml | 22 +- substrate/client/chain-spec/Cargo.toml | 46 +- substrate/client/chain-spec/derive/Cargo.toml | 4 +- substrate/client/cli/Cargo.toml | 64 +- substrate/client/consensus/aura/Cargo.toml | 60 +- substrate/client/consensus/babe/Cargo.toml | 68 +- .../client/consensus/babe/rpc/Cargo.toml | 38 +- substrate/client/consensus/beefy/Cargo.toml | 70 +- .../client/consensus/beefy/rpc/Cargo.toml | 26 +- substrate/client/consensus/common/Cargo.toml | 30 +- substrate/client/consensus/epochs/Cargo.toml | 12 +- substrate/client/consensus/grandpa/Cargo.toml | 84 +- .../client/consensus/grandpa/rpc/Cargo.toml | 34 +- .../client/consensus/manual-seal/Cargo.toml | 58 +- substrate/client/consensus/pow/Cargo.toml | 32 +- substrate/client/consensus/slots/Cargo.toml | 32 +- substrate/client/db/Cargo.toml | 56 +- substrate/client/executor/Cargo.toml | 66 +- substrate/client/executor/common/Cargo.toml | 8 +- substrate/client/executor/polkavm/Cargo.toml | 4 +- .../client/executor/runtime-test/Cargo.toml | 12 +- substrate/client/executor/wasmtime/Cargo.toml | 36 +- substrate/client/informant/Cargo.toml | 18 +- substrate/client/keystore/Cargo.toml | 12 +- .../client/merkle-mountain-range/Cargo.toml | 32 +- .../merkle-mountain-range/rpc/Cargo.toml | 14 +- substrate/client/mixnet/Cargo.toml | 40 +- substrate/client/network-gossip/Cargo.toml | 34 +- substrate/client/network/Cargo.toml | 114 +-- substrate/client/network/common/Cargo.toml | 26 +- substrate/client/network/light/Cargo.toml | 26 +- substrate/client/network/statement/Cargo.toml | 26 +- substrate/client/network/sync/Cargo.toml | 68 +- substrate/client/network/test/Cargo.toml | 48 +- .../client/network/transactions/Cargo.toml | 24 +- substrate/client/network/types/Cargo.toml | 20 +- substrate/client/offchain/Cargo.toml | 74 +- substrate/client/proposer-metrics/Cargo.toml | 2 +- substrate/client/rpc-api/Cargo.toml | 20 +- substrate/client/rpc-servers/Cargo.toml | 22 +- substrate/client/rpc-spec-v2/Cargo.toml | 70 +- substrate/client/rpc/Cargo.toml | 72 +- substrate/client/service/Cargo.toml | 110 +-- substrate/client/service/test/Cargo.toml | 58 +- substrate/client/state-db/Cargo.toml | 6 +- substrate/client/statement-store/Cargo.toml | 26 +- substrate/client/storage-monitor/Cargo.toml | 8 +- substrate/client/sync-state-rpc/Cargo.toml | 18 +- substrate/client/sysinfo/Cargo.toml | 24 +- substrate/client/telemetry/Cargo.toml | 18 +- substrate/client/tracing/Cargo.toml | 40 +- .../client/tracing/proc-macro/Cargo.toml | 4 +- substrate/client/transaction-pool/Cargo.toml | 50 +- .../client/transaction-pool/api/Cargo.toml | 12 +- substrate/client/utils/Cargo.toml | 16 +- substrate/deprecated/hashing/Cargo.toml | 2 +- .../deprecated/hashing/proc-macro/Cargo.toml | 2 +- substrate/frame/Cargo.toml | 56 +- substrate/frame/alliance/Cargo.toml | 34 +- substrate/frame/asset-conversion/Cargo.toml | 30 +- .../frame/asset-conversion/ops/Cargo.toml | 30 +- substrate/frame/asset-rate/Cargo.toml | 24 +- substrate/frame/assets-freezer/Cargo.toml | 20 +- substrate/frame/assets/Cargo.toml | 22 +- substrate/frame/atomic-swap/Cargo.toml | 18 +- substrate/frame/aura/Cargo.toml | 22 +- .../frame/authority-discovery/Cargo.toml | 26 +- substrate/frame/authorship/Cargo.toml | 20 +- substrate/frame/babe/Cargo.toml | 44 +- substrate/frame/bags-list/Cargo.toml | 44 +- substrate/frame/bags-list/fuzzer/Cargo.toml | 8 +- .../frame/bags-list/remote-tests/Cargo.toml | 22 +- substrate/frame/balances/Cargo.toml | 26 +- substrate/frame/beefy-mmr/Cargo.toml | 36 +- substrate/frame/beefy/Cargo.toml | 42 +- substrate/frame/benchmarking/Cargo.toml | 38 +- substrate/frame/benchmarking/pov/Cargo.toml | 16 +- substrate/frame/bounties/Cargo.toml | 24 +- substrate/frame/broker/Cargo.toml | 28 +- substrate/frame/child-bounties/Cargo.toml | 26 +- substrate/frame/collective/Cargo.toml | 18 +- substrate/frame/contracts/Cargo.toml | 84 +- substrate/frame/contracts/fixtures/Cargo.toml | 16 +- .../frame/contracts/mock-network/Cargo.toml | 64 +- .../frame/contracts/proc-macro/Cargo.toml | 2 +- substrate/frame/contracts/uapi/Cargo.toml | 10 +- substrate/frame/conviction-voting/Cargo.toml | 26 +- substrate/frame/core-fellowship/Cargo.toml | 22 +- substrate/frame/delegated-staking/Cargo.toml | 34 +- substrate/frame/democracy/Cargo.toml | 26 +- .../election-provider-multi-phase/Cargo.toml | 50 +- .../test-staking-e2e/Cargo.toml | 40 +- .../election-provider-support/Cargo.toml | 26 +- .../benchmarking/Cargo.toml | 16 +- .../solution-type/Cargo.toml | 16 +- .../solution-type/fuzzer/Cargo.toml | 22 +- substrate/frame/elections-phragmen/Cargo.toml | 32 +- substrate/frame/examples/Cargo.toml | 18 +- substrate/frame/examples/basic/Cargo.toml | 20 +- .../frame/examples/default-config/Cargo.toml | 14 +- substrate/frame/examples/dev-mode/Cargo.toml | 18 +- .../frame/examples/frame-crate/Cargo.toml | 6 +- .../frame/examples/kitchensink/Cargo.toml | 20 +- .../multi-block-migrations/Cargo.toml | 16 +- .../frame/examples/offchain-worker/Cargo.toml | 20 +- .../single-block-migrations/Cargo.toml | 28 +- substrate/frame/examples/split/Cargo.toml | 16 +- substrate/frame/examples/tasks/Cargo.toml | 18 +- substrate/frame/executive/Cargo.toml | 38 +- substrate/frame/fast-unstake/Cargo.toml | 36 +- substrate/frame/glutton/Cargo.toml | 24 +- substrate/frame/grandpa/Cargo.toml | 48 +- substrate/frame/identity/Cargo.toml | 24 +- substrate/frame/im-online/Cargo.toml | 26 +- substrate/frame/indices/Cargo.toml | 22 +- .../Cargo.toml | 18 +- substrate/frame/lottery/Cargo.toml | 24 +- substrate/frame/membership/Cargo.toml | 18 +- .../frame/merkle-mountain-range/Cargo.toml | 26 +- substrate/frame/message-queue/Cargo.toml | 32 +- .../frame/metadata-hash-extension/Cargo.toml | 30 +- substrate/frame/migrations/Cargo.toml | 36 +- substrate/frame/mixnet/Cargo.toml | 22 +- substrate/frame/multisig/Cargo.toml | 18 +- .../frame/nft-fractionalization/Cargo.toml | 26 +- substrate/frame/nfts/Cargo.toml | 24 +- substrate/frame/nfts/runtime-api/Cargo.toml | 8 +- substrate/frame/nis/Cargo.toml | 22 +- substrate/frame/node-authorization/Cargo.toml | 16 +- substrate/frame/nomination-pools/Cargo.toml | 30 +- .../nomination-pools/benchmarking/Cargo.toml | 38 +- .../frame/nomination-pools/fuzzer/Cargo.toml | 16 +- .../nomination-pools/runtime-api/Cargo.toml | 8 +- .../test-delegate-stake/Cargo.toml | 36 +- .../test-transfer-stake/Cargo.toml | 34 +- substrate/frame/offences/Cargo.toml | 20 +- .../frame/offences/benchmarking/Cargo.toml | 40 +- substrate/frame/paged-list/Cargo.toml | 26 +- substrate/frame/paged-list/fuzzer/Cargo.toml | 10 +- substrate/frame/parameters/Cargo.toml | 28 +- substrate/frame/preimage/Cargo.toml | 22 +- substrate/frame/proxy/Cargo.toml | 22 +- substrate/frame/ranked-collective/Cargo.toml | 22 +- substrate/frame/recovery/Cargo.toml | 20 +- substrate/frame/referenda/Cargo.toml | 32 +- substrate/frame/remark/Cargo.toml | 20 +- substrate/frame/root-offences/Cargo.toml | 30 +- substrate/frame/root-testing/Cargo.toml | 16 +- substrate/frame/safe-mode/Cargo.toml | 36 +- substrate/frame/salary/Cargo.toml | 22 +- substrate/frame/sassafras/Cargo.toml | 24 +- substrate/frame/scheduler/Cargo.toml | 26 +- substrate/frame/scored-pool/Cargo.toml | 18 +- substrate/frame/session/Cargo.toml | 28 +- .../frame/session/benchmarking/Cargo.toml | 36 +- substrate/frame/society/Cargo.toml | 30 +- substrate/frame/staking/Cargo.toml | 54 +- .../frame/staking/reward-curve/Cargo.toml | 6 +- substrate/frame/staking/reward-fn/Cargo.toml | 2 +- .../frame/staking/runtime-api/Cargo.toml | 6 +- .../frame/state-trie-migration/Cargo.toml | 34 +- substrate/frame/statement/Cargo.toml | 22 +- substrate/frame/sudo/Cargo.toml | 20 +- substrate/frame/support/Cargo.toml | 82 +- substrate/frame/support/procedural/Cargo.toml | 22 +- .../frame/support/procedural/tools/Cargo.toml | 6 +- .../procedural/tools/derive/Cargo.toml | 2 +- substrate/frame/support/test/Cargo.toml | 42 +- .../support/test/compile_pass/Cargo.toml | 14 +- .../frame/support/test/pallet/Cargo.toml | 10 +- .../support/test/stg_frame_crate/Cargo.toml | 6 +- substrate/frame/system/Cargo.toml | 28 +- .../frame/system/benchmarking/Cargo.toml | 22 +- .../frame/system/rpc/runtime-api/Cargo.toml | 6 +- substrate/frame/timestamp/Cargo.toml | 28 +- substrate/frame/tips/Cargo.toml | 24 +- .../frame/transaction-payment/Cargo.toml | 20 +- .../asset-conversion-tx-payment/Cargo.toml | 26 +- .../asset-tx-payment/Cargo.toml | 28 +- .../frame/transaction-payment/rpc/Cargo.toml | 18 +- .../rpc/runtime-api/Cargo.toml | 10 +- .../skip-feeless-payment/Cargo.toml | 12 +- .../frame/transaction-storage/Cargo.toml | 28 +- substrate/frame/treasury/Cargo.toml | 30 +- substrate/frame/try-runtime/Cargo.toml | 10 +- substrate/frame/tx-pause/Cargo.toml | 32 +- substrate/frame/uniques/Cargo.toml | 22 +- substrate/frame/utility/Cargo.toml | 28 +- substrate/frame/vesting/Cargo.toml | 22 +- substrate/frame/whitelist/Cargo.toml | 24 +- substrate/kitchensink_runtime.wasm | Bin 0 -> 2462034 bytes substrate/primitives/api/Cargo.toml | 32 +- .../primitives/api/proc-macro/Cargo.toml | 12 +- substrate/primitives/api/test/Cargo.toml | 32 +- .../primitives/application-crypto/Cargo.toml | 10 +- .../application-crypto/test/Cargo.toml | 10 +- substrate/primitives/arithmetic/Cargo.toml | 24 +- .../primitives/arithmetic/fuzzer/Cargo.toml | 10 +- .../primitives/authority-discovery/Cargo.toml | 10 +- substrate/primitives/block-builder/Cargo.toml | 6 +- substrate/primitives/blockchain/Cargo.toml | 18 +- .../primitives/consensus/aura/Cargo.toml | 18 +- .../primitives/consensus/babe/Cargo.toml | 20 +- .../primitives/consensus/beefy/Cargo.toml | 28 +- .../primitives/consensus/common/Cargo.toml | 16 +- .../primitives/consensus/grandpa/Cargo.toml | 16 +- substrate/primitives/consensus/pow/Cargo.toml | 8 +- .../primitives/consensus/sassafras/Cargo.toml | 14 +- .../primitives/consensus/slots/Cargo.toml | 6 +- substrate/primitives/core/Cargo.toml | 76 +- substrate/primitives/core/fuzz/Cargo.toml | 8 +- .../primitives/crypto/ec-utils/Cargo.toml | 26 +- .../primitives/crypto/hashing/Cargo.toml | 16 +- .../crypto/hashing/proc-macro/Cargo.toml | 2 +- substrate/primitives/database/Cargo.toml | 4 +- substrate/primitives/debug-derive/Cargo.toml | 2 +- substrate/primitives/externalities/Cargo.toml | 6 +- .../primitives/genesis-builder/Cargo.toml | 8 +- substrate/primitives/inherents/Cargo.toml | 12 +- substrate/primitives/io/Cargo.toml | 40 +- substrate/primitives/keyring/Cargo.toml | 6 +- substrate/primitives/keystore/Cargo.toml | 12 +- .../maybe-compressed-blob/Cargo.toml | 2 +- .../merkle-mountain-range/Cargo.toml | 14 +- substrate/primitives/metadata-ir/Cargo.toml | 6 +- substrate/primitives/mixnet/Cargo.toml | 8 +- .../primitives/npos-elections/Cargo.toml | 14 +- .../npos-elections/fuzzer/Cargo.toml | 10 +- substrate/primitives/offchain/Cargo.toml | 6 +- substrate/primitives/panic-handler/Cargo.toml | 6 +- substrate/primitives/rpc/Cargo.toml | 4 +- .../primitives/runtime-interface/Cargo.toml | 34 +- .../runtime-interface/proc-macro/Cargo.toml | 8 +- .../test-wasm-deprecated/Cargo.toml | 8 +- .../runtime-interface/test-wasm/Cargo.toml | 12 +- .../runtime-interface/test/Cargo.toml | 20 +- substrate/primitives/runtime/Cargo.toml | 42 +- substrate/primitives/session/Cargo.toml | 14 +- substrate/primitives/staking/Cargo.toml | 10 +- substrate/primitives/state-machine/Cargo.toml | 36 +- .../primitives/statement-store/Cargo.toml | 32 +- substrate/primitives/storage/Cargo.toml | 8 +- .../primitives/test-primitives/Cargo.toml | 10 +- substrate/primitives/timestamp/Cargo.toml | 8 +- substrate/primitives/tracing/Cargo.toml | 8 +- .../primitives/transaction-pool/Cargo.toml | 4 +- .../transaction-storage-proof/Cargo.toml | 14 +- substrate/primitives/trie/Cargo.toml | 40 +- substrate/primitives/version/Cargo.toml | 16 +- .../primitives/version/proc-macro/Cargo.toml | 6 +- .../primitives/wasm-interface/Cargo.toml | 8 +- substrate/primitives/weights/Cargo.toml | 14 +- .../ci/node-template-release/Cargo.toml | 16 +- substrate/test-utils/Cargo.toml | 8 +- substrate/test-utils/cli/Cargo.toml | 22 +- substrate/test-utils/client/Cargo.toml | 40 +- substrate/test-utils/runtime/Cargo.toml | 86 +- .../test-utils/runtime/client/Cargo.toml | 22 +- .../runtime/transaction-pool/Cargo.toml | 16 +- substrate/utils/binary-merkle-tree/Cargo.toml | 12 +- substrate/utils/fork-tree/Cargo.toml | 2 +- .../utils/frame/benchmarking-cli/Cargo.toml | 78 +- .../utils/frame/generate-bags/Cargo.toml | 14 +- .../generate-bags/node-runtime/Cargo.toml | 6 +- substrate/utils/frame/omni-bencher/Cargo.toml | 14 +- .../frame/remote-externalities/Cargo.toml | 28 +- substrate/utils/frame/rpc/client/Cargo.toml | 12 +- .../rpc/state-trie-migration-rpc/Cargo.toml | 18 +- substrate/utils/frame/rpc/support/Cargo.toml | 22 +- substrate/utils/frame/rpc/system/Cargo.toml | 36 +- substrate/utils/prometheus/Cargo.toml | 10 +- substrate/utils/substrate-bip39/Cargo.toml | 14 +- substrate/utils/wasm-builder/Cargo.toml | 40 +- templates/minimal/Cargo.toml | 12 +- templates/minimal/node/Cargo.toml | 64 +- templates/minimal/node/src/chain_spec.rs | 4 +- templates/minimal/node/src/command.rs | 4 +- templates/minimal/node/src/rpc.rs | 2 +- templates/minimal/node/src/service.rs | 2 +- templates/minimal/pallets/template/Cargo.toml | 12 +- templates/minimal/runtime/Cargo.toml | 26 +- templates/parachain/node/Cargo.toml | 100 +-- .../parachain/pallets/template/Cargo.toml | 20 +- templates/parachain/runtime/Cargo.toml | 114 +-- templates/solochain/node/Cargo.toml | 70 +- .../solochain/pallets/template/Cargo.toml | 20 +- templates/solochain/runtime/Cargo.toml | 78 +- 527 files changed, 9320 insertions(+), 8549 deletions(-) create mode 100644 master.wasm create mode 100644 modified.wasm create mode 100644 substrate/kitchensink_runtime.wasm diff --git a/.config/taplo.toml b/.config/taplo.toml index 2c6ccfb2b34..7cbc1b07512 100644 --- a/.config/taplo.toml +++ b/.config/taplo.toml @@ -33,3 +33,10 @@ keys = ["build"] [rule.formatting] reorder_arrays = false + +[[rule]] +include = ["Cargo.toml"] +keys = ["workspace.dependencies"] + +[rule.formatting] +reorder_keys = true diff --git a/.github/scripts/check-workspace.py b/.github/scripts/check-workspace.py index 1f8f103e4e1..d5197100ad2 100644 --- a/.github/scripts/check-workspace.py +++ b/.github/scripts/check-workspace.py @@ -135,8 +135,12 @@ def check_links(all_crates): if dep_name in all_crates: links.append((name, dep_name)) - if not 'path' in deps[dep]: - broken.append((name, dep_name, "crate must be linked via `path`")) + if name == 'polkadot-sdk': + if not 'path' in deps[dep]: + broken.append((name, dep_name, "crate must use path")) + return + elif not 'workspace' in deps[dep] or not deps[dep]['workspace']: + broken.append((name, dep_name, "crate must use workspace inheritance")) return def check_crate(deps): @@ -154,8 +158,6 @@ def check_links(all_crates): check_crate(manifest) - - links.sort() broken.sort() diff --git a/.github/scripts/deny-git-deps.py b/.github/scripts/deny-git-deps.py index 4b831c9347f..622fc64c488 100644 --- a/.github/scripts/deny-git-deps.py +++ b/.github/scripts/deny-git-deps.py @@ -19,6 +19,7 @@ KNOWN_BAD_GIT_DEPS = { root = sys.argv[1] if len(sys.argv) > 1 else os.getcwd() workspace = Workspace.from_path(root) +errors = [] def check_dep(dep, used_by): if dep.location != DependencyLocation.GIT: @@ -27,14 +28,23 @@ def check_dep(dep, used_by): if used_by in KNOWN_BAD_GIT_DEPS.get(dep.name, []): print(f'🤨 Ignoring git dependency {dep.name} in {used_by}') else: - print(f'🚫 Found git dependency {dep.name} in {used_by}') - sys.exit(1) + errors.append(f'🚫 Found git dependency {dep.name} in {used_by}') # Check the workspace dependencies that can be inherited: for dep in workspace.dependencies: check_dep(dep, "workspace") + if workspace.crates.find_by_name(dep.name): + if dep.location != DependencyLocation.PATH: + errors.append(f'🚫 Workspace must use path to link local dependency {dep.name}') + # And the dependencies of each crate: for crate in workspace.crates: for dep in crate.dependencies: check_dep(dep, crate.name) + +if errors: + print('❌ Found errors:') + for error in errors: + print(error) + sys.exit(1) diff --git a/Cargo.lock b/Cargo.lock index 22f89fe4577..22564aa9cae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5194,19 +5194,6 @@ dependencies = [ "regex", ] -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.10.1" @@ -14694,7 +14681,7 @@ dependencies = [ "sp-keystore", "sp-runtime", "sp-timestamp", - "strum 0.24.1", + "strum 0.26.2", "substrate-prometheus-endpoint", "tokio", "tracing-gum", @@ -23953,7 +23940,7 @@ dependencies = [ name = "xcm-fee-payment-runtime-api" version = "0.1.0" dependencies = [ - "env_logger 0.9.3", + "env_logger 0.11.3", "frame-executive", "frame-support", "frame-system", diff --git a/Cargo.toml b/Cargo.toml index ba52b0179ff..60459500a89 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -565,19 +565,782 @@ extra-unused-type-parameters = { level = "allow", priority = 2 } # stylistic default_constructed_unit_structs = { level = "allow", priority = 2 } # stylistic [workspace.dependencies] +Inflector = { version = "0.11.4" } +aes-gcm = { version = "0.10" } +ahash = { version = "0.8.2" } +alloy-primitives = { version = "0.4.2", default-features = false } +alloy-sol-types = { version = "0.4.2", default-features = false } +always-assert = { version = "0.1" } +ansi_term = { version = "0.12.1" } +anyhow = { version = "1.0.81" } +aquamarine = { version = "0.5.0" } +arbitrary = { version = "1.3.2" } +ark-bls12-377 = { version = "0.4.0", default-features = false } +ark-bls12-377-ext = { version = "0.4.1", default-features = false } +ark-bls12-381 = { version = "0.4.0", default-features = false } +ark-bls12-381-ext = { version = "0.4.1", default-features = false } +ark-bw6-761 = { version = "0.4.0", default-features = false } +ark-bw6-761-ext = { version = "0.4.1", default-features = false } +ark-ec = { version = "0.4.2", default-features = false } +ark-ed-on-bls12-377 = { version = "0.4.0", default-features = false } +ark-ed-on-bls12-377-ext = { version = "0.4.1", default-features = false } +ark-ed-on-bls12-381-bandersnatch = { version = "0.4.0", default-features = false } +ark-ed-on-bls12-381-bandersnatch-ext = { version = "0.4.1", default-features = false } +ark-scale = { version = "0.0.12", default-features = false } +array-bytes = { version = "6.2.2", default-features = false } +arrayvec = { version = "0.7.4" } +assert_cmd = { version = "2.0.10" } +assert_matches = { version = "1.5.0" } +asset-hub-rococo-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo" } +asset-hub-rococo-runtime = { path = "cumulus/parachains/runtimes/assets/asset-hub-rococo", default-features = false } +asset-hub-westend-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend" } +asset-hub-westend-runtime = { path = "cumulus/parachains/runtimes/assets/asset-hub-westend" } +asset-test-utils = { path = "cumulus/parachains/runtimes/assets/test-utils", default-features = false } +assets-common = { path = "cumulus/parachains/runtimes/assets/common", default-features = false } +async-channel = { version = "1.8.0" } +async-std = { version = "1.9.0" } +async-trait = { version = "0.1.79" } +asynchronous-codec = { version = "0.6" } +backoff = { version = "0.4" } +backtrace = { version = "0.3.64" } +binary-merkle-tree = { path = "substrate/utils/binary-merkle-tree", default-features = false } +bincode = { version = "1.3.3" } +bip39 = { version = "2.0.0" } +bitflags = { version = "1.3.2" } +bitvec = { version = "1.0.1", default-features = false } +blake2 = { version = "0.10.4", default-features = false } +blake2b_simd = { version = "1.0.1", default-features = false } +blake3 = { version = "1.5" } +bounded-collections = { version = "0.2.0", default-features = false } +bounded-vec = { version = "0.7" } +bp-asset-hub-rococo = { path = "bridges/chains/chain-asset-hub-rococo", default-features = false } +bp-asset-hub-westend = { path = "bridges/chains/chain-asset-hub-westend", default-features = false } +bp-beefy = { path = "bridges/primitives/beefy", default-features = false } +bp-bridge-hub-cumulus = { path = "bridges/chains/chain-bridge-hub-cumulus", default-features = false } +bp-bridge-hub-kusama = { default-features = false, path = "bridges/chains/chain-bridge-hub-kusama" } +bp-bridge-hub-polkadot = { path = "bridges/chains/chain-bridge-hub-polkadot", default-features = false } +bp-bridge-hub-rococo = { path = "bridges/chains/chain-bridge-hub-rococo", default-features = false } +bp-bridge-hub-westend = { path = "bridges/chains/chain-bridge-hub-westend", default-features = false } +bp-header-chain = { path = "bridges/primitives/header-chain", default-features = false } +bp-kusama = { default-features = false, path = "bridges/chains/chain-kusama" } +bp-messages = { path = "bridges/primitives/messages", default-features = false } +bp-parachains = { path = "bridges/primitives/parachains", default-features = false } +bp-polkadot = { default-features = false, path = "bridges/chains/chain-polkadot" } +bp-polkadot-bulletin = { path = "bridges/chains/chain-polkadot-bulletin", default-features = false } +bp-polkadot-core = { path = "bridges/primitives/polkadot-core", default-features = false } +bp-relayers = { path = "bridges/primitives/relayers", default-features = false } +bp-rococo = { path = "bridges/chains/chain-rococo", default-features = false } +bp-runtime = { path = "bridges/primitives/runtime", default-features = false } +bp-test-utils = { path = "bridges/primitives/test-utils", default-features = false } +bp-westend = { path = "bridges/chains/chain-westend", default-features = false } +bp-xcm-bridge-hub = { path = "bridges/primitives/xcm-bridge-hub", default-features = false } +bp-xcm-bridge-hub-router = { path = "bridges/primitives/xcm-bridge-hub-router", default-features = false } +bridge-hub-common = { path = "cumulus/parachains/runtimes/bridge-hubs/common", default-features = false } +bridge-hub-rococo-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo" } +bridge-hub-rococo-runtime = { path = "cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo", default-features = false } +bridge-hub-test-utils = { path = "cumulus/parachains/runtimes/bridge-hubs/test-utils", default-features = false } +bridge-hub-westend-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend" } +bridge-hub-westend-runtime = { path = "cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend", default-features = false } +bridge-runtime-common = { path = "bridges/bin/runtime-common", default-features = false } +bs58 = { version = "0.5.0", default-features = false } +build-helper = { version = "0.1.1" } +byte-slice-cast = { version = "1.2.1", default-features = false } +byteorder = { version = "1.3.2", default-features = false } +bytes = { version = "1.4.0", default-features = false } +cargo_metadata = { version = "0.15.4" } +cfg-expr = { version = "0.15.5" } +cfg-if = { version = "1.0" } +chain-spec-builder = { path = "substrate/bin/utils/chain-spec-builder", default-features = false, package = "staging-chain-spec-builder" } +chain-spec-guide-runtime = { path = "docs/sdk/src/reference_docs/chain_spec_runtime" } +chrono = { version = "0.4.31" } +cid = { version = "0.9.0" } +clap = { version = "4.5.3" } +clap-num = { version = "1.0.2" } +clap_complete = { version = "4.0.2" } +coarsetime = { version = "0.1.22" } +codec = { version = "3.6.12", default-features = false, package = "parity-scale-codec" } +collectives-westend-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend" } +collectives-westend-runtime = { path = "cumulus/parachains/runtimes/collectives/collectives-westend" } +color-eyre = { version = "0.6.1", default-features = false } +color-print = { version = "0.3.4" } +colored = { version = "2.0.4" } +comfy-table = { version = "7.1.0", default-features = false } +console = { version = "0.15.8" } +contracts-rococo-runtime = { path = "cumulus/parachains/runtimes/contracts/contracts-rococo" } +coretime-rococo-runtime = { path = "cumulus/parachains/runtimes/coretime/coretime-rococo" } +coretime-westend-runtime = { path = "cumulus/parachains/runtimes/coretime/coretime-westend" } +cpu-time = { version = "1.0.0" } +criterion = { version = "0.5.1", default-features = false } +cumulus-client-cli = { path = "cumulus/client/cli", default-features = false } +cumulus-client-collator = { path = "cumulus/client/collator", default-features = false } +cumulus-client-consensus-aura = { path = "cumulus/client/consensus/aura", default-features = false } +cumulus-client-consensus-common = { path = "cumulus/client/consensus/common", default-features = false } +cumulus-client-consensus-proposer = { path = "cumulus/client/consensus/proposer", default-features = false } +cumulus-client-consensus-relay-chain = { path = "cumulus/client/consensus/relay-chain", default-features = false } +cumulus-client-network = { path = "cumulus/client/network", default-features = false } +cumulus-client-parachain-inherent = { path = "cumulus/client/parachain-inherent", default-features = false } +cumulus-client-pov-recovery = { path = "cumulus/client/pov-recovery", default-features = false } +cumulus-client-service = { path = "cumulus/client/service", default-features = false } +cumulus-pallet-aura-ext = { path = "cumulus/pallets/aura-ext", default-features = false } +cumulus-pallet-dmp-queue = { default-features = false, path = "cumulus/pallets/dmp-queue" } +cumulus-pallet-parachain-system = { path = "cumulus/pallets/parachain-system", default-features = false } +cumulus-pallet-parachain-system-proc-macro = { path = "cumulus/pallets/parachain-system/proc-macro", default-features = false } +cumulus-pallet-session-benchmarking = { path = "cumulus/pallets/session-benchmarking", default-features = false } +cumulus-pallet-solo-to-para = { path = "cumulus/pallets/solo-to-para", default-features = false } +cumulus-pallet-xcm = { path = "cumulus/pallets/xcm", default-features = false } +cumulus-pallet-xcmp-queue = { path = "cumulus/pallets/xcmp-queue", default-features = false } +cumulus-ping = { path = "cumulus/parachains/pallets/ping", default-features = false } +cumulus-primitives-aura = { path = "cumulus/primitives/aura", default-features = false } +cumulus-primitives-core = { path = "cumulus/primitives/core", default-features = false } +cumulus-primitives-parachain-inherent = { path = "cumulus/primitives/parachain-inherent", default-features = false } +cumulus-primitives-proof-size-hostfunction = { path = "cumulus/primitives/proof-size-hostfunction", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "cumulus/primitives/storage-weight-reclaim", default-features = false } +cumulus-primitives-timestamp = { path = "cumulus/primitives/timestamp", default-features = false } +cumulus-primitives-utility = { path = "cumulus/primitives/utility", default-features = false } +cumulus-relay-chain-inprocess-interface = { path = "cumulus/client/relay-chain-inprocess-interface", default-features = false } +cumulus-relay-chain-interface = { path = "cumulus/client/relay-chain-interface", default-features = false } +cumulus-relay-chain-minimal-node = { path = "cumulus/client/relay-chain-minimal-node", default-features = false } +cumulus-relay-chain-rpc-interface = { path = "cumulus/client/relay-chain-rpc-interface", default-features = false } +cumulus-test-client = { path = "cumulus/test/client" } +cumulus-test-relay-sproof-builder = { path = "cumulus/test/relay-sproof-builder", default-features = false } +cumulus-test-runtime = { path = "cumulus/test/runtime" } +cumulus-test-service = { path = "cumulus/test/service" } +curve25519-dalek = { version = "4.1.3" } +derivative = { version = "2.2.0", default-features = false } +derive-syn-parse = { version = "0.2.0" } +derive_more = { version = "0.99.17", default-features = false } +digest = { version = "0.10.3", default-features = false } +directories = { version = "5.0.1" } +dlmalloc = { version = "0.2.4" } +docify = { version = "0.2.8" } +dyn-clonable = { version = "0.9.0" } +dyn-clone = { version = "1.0.16" } +ed25519-dalek = { version = "2.1", default-features = false } +ed25519-zebra = { version = "4.0.3", default-features = false } +either = { version = "1.8.1", default-features = false } +emulated-integration-tests-common = { path = "cumulus/parachains/integration-tests/emulated/common", default-features = false } +enumflags2 = { version = "0.7.7" } +enumn = { version = "0.1.12" } +env_logger = { version = "0.11.3" } +environmental = { version = "1.1.4", default-features = false } +equivocation-detector = { path = "bridges/relays/equivocation" } +ethabi = { version = "1.0.0", default-features = false, package = "ethabi-decode" } +ethbloom = { version = "0.13.0", default-features = false } +ethereum-types = { version = "0.14.1", default-features = false } +exit-future = { version = "0.2.0" } +expander = { version = "2.0.0" } +fatality = { version = "0.1.1" } +fdlimit = { version = "0.3.0" } +femme = { version = "2.2.1" } +filetime = { version = "0.2.16" } +finality-grandpa = { version = "0.16.2", default-features = false } +finality-relay = { path = "bridges/relays/finality" } +flate2 = { version = "1.0" } +fnv = { version = "1.0.6" } +fork-tree = { path = "substrate/utils/fork-tree", default-features = false } +forwarded-header-value = { version = "0.1.1" } +fraction = { version = "0.13.1" } +frame = { path = "substrate/frame", default-features = false, package = "polkadot-sdk-frame" } +frame-benchmarking = { path = "substrate/frame/benchmarking", default-features = false } +frame-benchmarking-cli = { path = "substrate/utils/frame/benchmarking-cli", default-features = false } +frame-benchmarking-pallet-pov = { default-features = false, path = "substrate/frame/benchmarking/pov" } +frame-election-provider-solution-type = { path = "substrate/frame/election-provider-support/solution-type", default-features = false } +frame-election-provider-support = { path = "substrate/frame/election-provider-support", default-features = false } +frame-executive = { path = "substrate/frame/executive", default-features = false } +frame-metadata = { version = "16.0.0", default-features = false } +frame-metadata-hash-extension = { path = "substrate/frame/metadata-hash-extension", default-features = false } +frame-support = { path = "substrate/frame/support", default-features = false } +frame-support-procedural = { path = "substrate/frame/support/procedural", default-features = false } +frame-support-procedural-tools = { path = "substrate/frame/support/procedural/tools", default-features = false } +frame-support-procedural-tools-derive = { path = "substrate/frame/support/procedural/tools/derive", default-features = false } +frame-support-test = { path = "substrate/frame/support/test" } +frame-system = { path = "substrate/frame/system", default-features = false } +frame-system-benchmarking = { path = "substrate/frame/system/benchmarking", default-features = false } +frame-system-rpc-runtime-api = { path = "substrate/frame/system/rpc/runtime-api", default-features = false } +frame-try-runtime = { path = "substrate/frame/try-runtime", default-features = false } +fs4 = { version = "0.7.0" } +fs_extra = { version = "1.3.0" } +futures = { version = "0.3.30" } +futures-channel = { version = "0.3.23" } +futures-timer = { version = "3.0.2" } +futures-util = { version = "0.3.30", default-features = false } +generate-bags = { path = "substrate/utils/frame/generate-bags", default-features = false } +gethostname = { version = "0.2.3" } +glob = { version = "0.3" } +glutton-westend-runtime = { path = "cumulus/parachains/runtimes/glutton/glutton-westend" } +governor = { version = "0.6.0" } +gum = { path = "polkadot/node/gum", default-features = false, package = "tracing-gum" } +gum-proc-macro = { path = "polkadot/node/gum/proc-macro", default-features = false, package = "tracing-gum-proc-macro" } +handlebars = { version = "5.1.0" } +hash-db = { version = "0.16.0", default-features = false } +hash256-std-hasher = { version = "0.15.2", default-features = false } +hex = { version = "0.4.3", default-features = false } +hex-literal = { version = "0.4.1", default-features = false } +hkdf = { version = "0.12.0" } +hmac = { version = "0.12.1" } +honggfuzz = { version = "0.5.55" } +http = { version = "0.2.8" } +hyper = { version = "0.14.27", default-features = false } +hyper-rustls = { version = "0.24.0" } +impl-serde = { version = "0.4.0", default-features = false } +impl-trait-for-tuples = { version = "0.2.2" } +indexmap = { version = "2.0.0" } +indicatif = { version = "0.17.7" } +integer-sqrt = { version = "0.1.2" } +ip_network = { version = "0.4.1" } +is-terminal = { version = "0.4.9" } +is_executable = { version = "1.0.1" } +isahc = { version = "1.2" } +itertools = { version = "0.11" } +jsonpath_lib = { version = "0.3" } +jsonrpsee = { version = "0.22.5" } +jsonrpsee-core = { version = "0.22" } +k256 = { version = "0.13.3", default-features = false } +kitchensink-runtime = { path = "substrate/bin/node/runtime" } +kvdb = { version = "0.13.0" } +kvdb-memorydb = { version = "0.13.0" } +kvdb-rocksdb = { version = "0.19.0" } +kvdb-shared-tests = { version = "0.11.0" } +landlock = { version = "0.3.0" } +lazy_static = { version = "1.4.0" } +libc = { version = "0.2.153" } +libfuzzer-sys = { version = "0.4" } +libp2p = { version = "0.51.4" } +libp2p-identity = { version = "0.1.3" } +libsecp256k1 = { version = "0.7.0", default-features = false } +linked-hash-map = { version = "0.5.4" } +linked_hash_set = { version = "0.1.4" } +linregress = { version = "0.5.1" } +lite-json = { version = "0.2.0", default-features = false } +litep2p = { version = "0.5.0" } +log = { version = "0.4.21", default-features = false } +macro_magic = { version = "0.5.0" } +maplit = { version = "1.0.2" } +memmap2 = { version = "0.9.3" } +memory-db = { version = "0.32.0", default-features = false } +merkleized-metadata = { version = "0.1.0" } +merlin = { version = "3.0", default-features = false } +messages-relay = { path = "bridges/relays/messages" } +metered = { version = "0.6.1", default-features = false, package = "prioritized-metered-channel" } +mick-jaeger = { version = "0.1.8" } +milagro-bls = { version = "1.5.4", default-features = false, package = "snowbridge-milagro-bls" } +minimal-template-node = { path = "templates/minimal/node" } +minimal-template-runtime = { path = "templates/minimal/runtime" } +mixnet = { version = "0.7.0" } +mmr-gadget = { path = "substrate/client/merkle-mountain-range", default-features = false } +mmr-lib = { version = "0.5.2", package = "ckb-merkle-mountain-range" } +mmr-rpc = { path = "substrate/client/merkle-mountain-range/rpc", default-features = false } +mockall = { version = "0.11.3" } +multiaddr = { version = "0.17.1" } +multihash = { version = "0.17.0", default-features = false } +multihash-codetable = { version = "0.1.1" } +multistream-select = { version = "0.12.1" } +names = { version = "0.14.0", default-features = false } +nix = { version = "0.28.0" } +node-cli = { path = "substrate/bin/node/cli", package = "staging-node-cli" } +node-inspect = { path = "substrate/bin/node/inspect", default-features = false, package = "staging-node-inspect" } +node-primitives = { path = "substrate/bin/node/primitives", default-features = false } +node-rpc = { path = "substrate/bin/node/rpc" } +node-testing = { path = "substrate/bin/node/testing" } +nohash-hasher = { version = "0.2.0" } +novelpoly = { version = "2.0.0", package = "reed-solomon-novelpoly" } +num-bigint = { version = "0.4.3" } +num-format = { version = "0.4.3" } +num-rational = { version = "0.4.1" } +num-traits = { version = "0.2.17", default-features = false } +num_cpus = { version = "1.13.1" } +once_cell = { version = "1.19.0" } +orchestra = { version = "0.3.5", default-features = false } +pallet-alliance = { path = "substrate/frame/alliance", default-features = false } +pallet-asset-conversion = { path = "substrate/frame/asset-conversion", default-features = false } +pallet-asset-conversion-ops = { path = "substrate/frame/asset-conversion/ops", default-features = false } +pallet-asset-conversion-tx-payment = { path = "substrate/frame/transaction-payment/asset-conversion-tx-payment", default-features = false } +pallet-asset-rate = { path = "substrate/frame/asset-rate", default-features = false } +pallet-asset-tx-payment = { path = "substrate/frame/transaction-payment/asset-tx-payment", default-features = false } +pallet-assets = { path = "substrate/frame/assets", default-features = false } +pallet-assets-freezer = { path = "substrate/frame/assets-freezer", default-features = false } +pallet-atomic-swap = { default-features = false, path = "substrate/frame/atomic-swap" } +pallet-aura = { path = "substrate/frame/aura", default-features = false } +pallet-authority-discovery = { path = "substrate/frame/authority-discovery", default-features = false } +pallet-authorship = { path = "substrate/frame/authorship", default-features = false } +pallet-babe = { path = "substrate/frame/babe", default-features = false } +pallet-bags-list = { path = "substrate/frame/bags-list", default-features = false } +pallet-bags-list-remote-tests = { path = "substrate/frame/bags-list/remote-tests" } +pallet-balances = { path = "substrate/frame/balances", default-features = false } +pallet-beefy = { path = "substrate/frame/beefy", default-features = false } +pallet-beefy-mmr = { path = "substrate/frame/beefy-mmr", default-features = false } +pallet-bounties = { path = "substrate/frame/bounties", default-features = false } +pallet-bridge-grandpa = { path = "bridges/modules/grandpa", default-features = false } +pallet-bridge-messages = { path = "bridges/modules/messages", default-features = false } +pallet-bridge-parachains = { path = "bridges/modules/parachains", default-features = false } +pallet-bridge-relayers = { path = "bridges/modules/relayers", default-features = false } +pallet-broker = { path = "substrate/frame/broker", default-features = false } +pallet-child-bounties = { path = "substrate/frame/child-bounties", default-features = false } +pallet-collator-selection = { path = "cumulus/pallets/collator-selection", default-features = false } +pallet-collective = { path = "substrate/frame/collective", default-features = false } +pallet-collective-content = { path = "cumulus/parachains/pallets/collective-content", default-features = false } +pallet-contracts = { path = "substrate/frame/contracts", default-features = false } +pallet-contracts-fixtures = { path = "substrate/frame/contracts/fixtures" } +pallet-contracts-mock-network = { default-features = false, path = "substrate/frame/contracts/mock-network" } +pallet-contracts-proc-macro = { path = "substrate/frame/contracts/proc-macro", default-features = false } +pallet-contracts-uapi = { path = "substrate/frame/contracts/uapi", default-features = false } +pallet-conviction-voting = { path = "substrate/frame/conviction-voting", default-features = false } +pallet-core-fellowship = { path = "substrate/frame/core-fellowship", default-features = false } +pallet-default-config-example = { path = "substrate/frame/examples/default-config", default-features = false } +pallet-delegated-staking = { path = "substrate/frame/delegated-staking", default-features = false } +pallet-democracy = { path = "substrate/frame/democracy", default-features = false } +pallet-dev-mode = { path = "substrate/frame/examples/dev-mode", default-features = false } +pallet-election-provider-multi-phase = { path = "substrate/frame/election-provider-multi-phase", default-features = false } +pallet-election-provider-support-benchmarking = { path = "substrate/frame/election-provider-support/benchmarking", default-features = false } +pallet-elections-phragmen = { path = "substrate/frame/elections-phragmen", default-features = false } +pallet-example-basic = { path = "substrate/frame/examples/basic", default-features = false } +pallet-example-frame-crate = { path = "substrate/frame/examples/frame-crate", default-features = false } +pallet-example-kitchensink = { path = "substrate/frame/examples/kitchensink", default-features = false } +pallet-example-mbm = { path = "substrate/frame/examples/multi-block-migrations", default-features = false } +pallet-example-offchain-worker = { path = "substrate/frame/examples/offchain-worker", default-features = false } +pallet-example-single-block-migrations = { path = "substrate/frame/examples/single-block-migrations", default-features = false } +pallet-example-split = { path = "substrate/frame/examples/split", default-features = false } +pallet-example-tasks = { path = "substrate/frame/examples/tasks", default-features = false } +pallet-examples = { path = "substrate/frame/examples" } +pallet-fast-unstake = { path = "substrate/frame/fast-unstake", default-features = false } +pallet-glutton = { path = "substrate/frame/glutton", default-features = false } +pallet-grandpa = { path = "substrate/frame/grandpa", default-features = false } +pallet-identity = { path = "substrate/frame/identity", default-features = false } +pallet-im-online = { path = "substrate/frame/im-online", default-features = false } +pallet-indices = { path = "substrate/frame/indices", default-features = false } +pallet-insecure-randomness-collective-flip = { path = "substrate/frame/insecure-randomness-collective-flip", default-features = false } +pallet-lottery = { default-features = false, path = "substrate/frame/lottery" } +pallet-membership = { path = "substrate/frame/membership", default-features = false } +pallet-message-queue = { path = "substrate/frame/message-queue", default-features = false } +pallet-migrations = { path = "substrate/frame/migrations", default-features = false } +pallet-minimal-template = { path = "templates/minimal/pallets/template", default-features = false } +pallet-mixnet = { default-features = false, path = "substrate/frame/mixnet" } +pallet-mmr = { path = "substrate/frame/merkle-mountain-range", default-features = false } +pallet-multisig = { path = "substrate/frame/multisig", default-features = false } +pallet-nft-fractionalization = { path = "substrate/frame/nft-fractionalization", default-features = false } +pallet-nfts = { path = "substrate/frame/nfts", default-features = false } +pallet-nfts-runtime-api = { path = "substrate/frame/nfts/runtime-api", default-features = false } +pallet-nis = { path = "substrate/frame/nis", default-features = false } +pallet-node-authorization = { default-features = false, path = "substrate/frame/node-authorization" } +pallet-nomination-pools = { path = "substrate/frame/nomination-pools", default-features = false } +pallet-nomination-pools-benchmarking = { path = "substrate/frame/nomination-pools/benchmarking", default-features = false } +pallet-nomination-pools-runtime-api = { path = "substrate/frame/nomination-pools/runtime-api", default-features = false } +pallet-offences = { path = "substrate/frame/offences", default-features = false } +pallet-offences-benchmarking = { path = "substrate/frame/offences/benchmarking", default-features = false } +pallet-paged-list = { path = "substrate/frame/paged-list", default-features = false } +pallet-parachain-template = { path = "templates/parachain/pallets/template", default-features = false } +pallet-parameters = { path = "substrate/frame/parameters", default-features = false } +pallet-preimage = { path = "substrate/frame/preimage", default-features = false } +pallet-proxy = { path = "substrate/frame/proxy", default-features = false } +pallet-ranked-collective = { path = "substrate/frame/ranked-collective", default-features = false } +pallet-recovery = { path = "substrate/frame/recovery", default-features = false } +pallet-referenda = { path = "substrate/frame/referenda", default-features = false } +pallet-remark = { default-features = false, path = "substrate/frame/remark" } +pallet-root-offences = { default-features = false, path = "substrate/frame/root-offences" } +pallet-root-testing = { path = "substrate/frame/root-testing", default-features = false } +pallet-safe-mode = { default-features = false, path = "substrate/frame/safe-mode" } +pallet-salary = { path = "substrate/frame/salary", default-features = false } +pallet-scheduler = { path = "substrate/frame/scheduler", default-features = false } +pallet-scored-pool = { default-features = false, path = "substrate/frame/scored-pool" } +pallet-session = { path = "substrate/frame/session", default-features = false } +pallet-session-benchmarking = { path = "substrate/frame/session/benchmarking", default-features = false } +pallet-skip-feeless-payment = { path = "substrate/frame/transaction-payment/skip-feeless-payment", default-features = false } +pallet-society = { path = "substrate/frame/society", default-features = false } +pallet-staking = { path = "substrate/frame/staking", default-features = false } +pallet-staking-reward-curve = { path = "substrate/frame/staking/reward-curve", default-features = false } +pallet-staking-reward-fn = { path = "substrate/frame/staking/reward-fn", default-features = false } +pallet-staking-runtime-api = { path = "substrate/frame/staking/runtime-api", default-features = false } +pallet-state-trie-migration = { path = "substrate/frame/state-trie-migration", default-features = false } +pallet-statement = { default-features = false, path = "substrate/frame/statement" } +pallet-sudo = { path = "substrate/frame/sudo", default-features = false } +pallet-template = { path = "templates/solochain/pallets/template", default-features = false } +pallet-timestamp = { path = "substrate/frame/timestamp", default-features = false } +pallet-tips = { path = "substrate/frame/tips", default-features = false } +pallet-transaction-payment = { path = "substrate/frame/transaction-payment", default-features = false } +pallet-transaction-payment-rpc = { path = "substrate/frame/transaction-payment/rpc", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { path = "substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } +pallet-transaction-storage = { default-features = false, path = "substrate/frame/transaction-storage" } +pallet-treasury = { path = "substrate/frame/treasury", default-features = false } +pallet-tx-pause = { default-features = false, path = "substrate/frame/tx-pause" } +pallet-uniques = { path = "substrate/frame/uniques", default-features = false } +pallet-utility = { path = "substrate/frame/utility", default-features = false } +pallet-vesting = { path = "substrate/frame/vesting", default-features = false } +pallet-whitelist = { path = "substrate/frame/whitelist", default-features = false } +pallet-xcm = { path = "polkadot/xcm/pallet-xcm", default-features = false } +pallet-xcm-benchmarks = { path = "polkadot/xcm/pallet-xcm-benchmarks", default-features = false } +pallet-xcm-bridge-hub = { path = "bridges/modules/xcm-bridge-hub", default-features = false } +pallet-xcm-bridge-hub-router = { path = "bridges/modules/xcm-bridge-hub-router", default-features = false } +parachain-info = { path = "cumulus/parachains/pallets/parachain-info", default-features = false, package = "staging-parachain-info" } +parachain-template-runtime = { path = "templates/parachain/runtime" } +parachains-common = { path = "cumulus/parachains/common", default-features = false } +parachains-relay = { path = "bridges/relays/parachains" } +parachains-runtimes-test-utils = { path = "cumulus/parachains/runtimes/test-utils", default-features = false } +parity-bytes = { version = "0.1.2", default-features = false } +parity-db = { version = "0.4.12" } +parity-util-mem = { version = "0.12.0" } +parity-wasm = { version = "0.45.0" } +parking_lot = { version = "0.12.1", default-features = false } +partial_sort = { version = "0.2.0" } +paste = { version = "1.0.14", default-features = false } +pbkdf2 = { version = "0.12.2", default-features = false } +penpal-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal" } +penpal-runtime = { path = "cumulus/parachains/runtimes/testing/penpal" } +people-rococo-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo" } +people-rococo-runtime = { path = "cumulus/parachains/runtimes/people/people-rococo" } +people-westend-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend" } +people-westend-runtime = { path = "cumulus/parachains/runtimes/people/people-westend" } +pin-project = { version = "1.1.3" } +platforms = { version = "3.0" } +polkadot-approval-distribution = { path = "polkadot/node/network/approval-distribution", default-features = false } +polkadot-availability-bitfield-distribution = { path = "polkadot/node/network/bitfield-distribution", default-features = false } +polkadot-availability-distribution = { path = "polkadot/node/network/availability-distribution", default-features = false } +polkadot-availability-recovery = { path = "polkadot/node/network/availability-recovery", default-features = false } +polkadot-cli = { path = "polkadot/cli", default-features = false } +polkadot-collator-protocol = { path = "polkadot/node/network/collator-protocol", default-features = false } +polkadot-core-primitives = { path = "polkadot/core-primitives", default-features = false } +polkadot-dispute-distribution = { path = "polkadot/node/network/dispute-distribution", default-features = false } +polkadot-erasure-coding = { path = "polkadot/erasure-coding", default-features = false } +polkadot-gossip-support = { path = "polkadot/node/network/gossip-support", default-features = false } +polkadot-network-bridge = { path = "polkadot/node/network/bridge", default-features = false } +polkadot-node-collation-generation = { path = "polkadot/node/collation-generation", default-features = false } +polkadot-node-core-approval-voting = { path = "polkadot/node/core/approval-voting", default-features = false } +polkadot-node-core-av-store = { path = "polkadot/node/core/av-store", default-features = false } +polkadot-node-core-backing = { path = "polkadot/node/core/backing", default-features = false } +polkadot-node-core-bitfield-signing = { path = "polkadot/node/core/bitfield-signing", default-features = false } +polkadot-node-core-candidate-validation = { path = "polkadot/node/core/candidate-validation", default-features = false } +polkadot-node-core-chain-api = { path = "polkadot/node/core/chain-api", default-features = false } +polkadot-node-core-chain-selection = { path = "polkadot/node/core/chain-selection", default-features = false } +polkadot-node-core-dispute-coordinator = { path = "polkadot/node/core/dispute-coordinator", default-features = false } +polkadot-node-core-parachains-inherent = { path = "polkadot/node/core/parachains-inherent", default-features = false } +polkadot-node-core-prospective-parachains = { path = "polkadot/node/core/prospective-parachains", default-features = false } +polkadot-node-core-provisioner = { path = "polkadot/node/core/provisioner", default-features = false } +polkadot-node-core-pvf = { path = "polkadot/node/core/pvf", default-features = false } +polkadot-node-core-pvf-checker = { path = "polkadot/node/core/pvf-checker", default-features = false } +polkadot-node-core-pvf-common = { path = "polkadot/node/core/pvf/common", default-features = false } +polkadot-node-core-pvf-execute-worker = { path = "polkadot/node/core/pvf/execute-worker", default-features = false } +polkadot-node-core-pvf-prepare-worker = { path = "polkadot/node/core/pvf/prepare-worker", default-features = false } +polkadot-node-core-runtime-api = { path = "polkadot/node/core/runtime-api", default-features = false } +polkadot-node-jaeger = { path = "polkadot/node/jaeger", default-features = false } +polkadot-node-metrics = { path = "polkadot/node/metrics", default-features = false } +polkadot-node-network-protocol = { path = "polkadot/node/network/protocol", default-features = false } +polkadot-node-primitives = { path = "polkadot/node/primitives", default-features = false } +polkadot-node-subsystem = { path = "polkadot/node/subsystem", default-features = false } +polkadot-node-subsystem-test-helpers = { path = "polkadot/node/subsystem-test-helpers" } +polkadot-node-subsystem-types = { path = "polkadot/node/subsystem-types", default-features = false } +polkadot-node-subsystem-util = { path = "polkadot/node/subsystem-util", default-features = false } +polkadot-overseer = { path = "polkadot/node/overseer", default-features = false } +polkadot-parachain-primitives = { path = "polkadot/parachain", default-features = false } +polkadot-primitives = { path = "polkadot/primitives", default-features = false } +polkadot-primitives-test-helpers = { path = "polkadot/primitives/test-helpers" } +polkadot-rpc = { path = "polkadot/rpc", default-features = false } +polkadot-runtime-common = { path = "polkadot/runtime/common", default-features = false } +polkadot-runtime-metrics = { path = "polkadot/runtime/metrics", default-features = false } +polkadot-runtime-parachains = { path = "polkadot/runtime/parachains", default-features = false } +polkadot-sdk = { path = "umbrella", default-features = false } +polkadot-sdk-docs = { path = "docs/sdk" } +polkadot-service = { path = "polkadot/node/service", default-features = false } +polkadot-statement-distribution = { path = "polkadot/node/network/statement-distribution", default-features = false } +polkadot-statement-table = { path = "polkadot/statement-table", default-features = false } +polkadot-subsystem-bench = { path = "polkadot/node/subsystem-bench" } +polkadot-test-client = { path = "polkadot/node/test/client" } +polkadot-test-runtime = { path = "polkadot/runtime/test-runtime" } +polkadot-test-service = { path = "polkadot/node/test/service" } polkavm = "0.9.3" -polkavm-linker = "0.9.2" polkavm-derive = "0.9.1" -log = { version = "0.4.21", default-features = false } +polkavm-linker = "0.9.2" +portpicker = { version = "0.1.1" } +pretty_assertions = { version = "1.3.0" } +primitive-types = { version = "0.12.1", default-features = false } +proc-macro-crate = { version = "3.0.0" } +proc-macro-warning = { version = "1.0.0", default-features = false } +proc-macro2 = { version = "1.0.64" } +procfs = { version = "0.16.0" } +prometheus = { version = "0.13.0", default-features = false } +prometheus-endpoint = { path = "substrate/utils/prometheus", default-features = false, package = "substrate-prometheus-endpoint" } +prometheus-parse = { version = "0.2.2" } +prost = { version = "0.12.4" } +prost-build = { version = "0.12.4" } +pyroscope = { version = "0.5.7" } +pyroscope_pprofrs = { version = "0.2.7" } +quick_cache = { version = "0.3" } +quickcheck = { version = "1.0.3", default-features = false } quote = { version = "1.0.33" } +rand = { version = "0.8.5", default-features = false } +rand_chacha = { version = "0.3.1", default-features = false } +rand_core = { version = "0.6.2" } +rand_distr = { version = "0.4.3" } +rand_pcg = { version = "0.3.1" } +rayon = { version = "1.5.1" } +rbtag = { version = "0.3" } +ref-cast = { version = "1.0.0" } +regex = { version = "1.10.2" } +relay-substrate-client = { path = "bridges/relays/client-substrate" } +relay-utils = { path = "bridges/relays/utils" } +remote-externalities = { path = "substrate/utils/frame/remote-externalities", default-features = false, package = "frame-remote-externalities" } +reqwest = { version = "0.11", default-features = false } +rlp = { version = "0.5.2", default-features = false } +rococo-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/relays/rococo" } +rococo-parachain-runtime = { path = "cumulus/parachains/runtimes/testing/rococo-parachain" } +rococo-runtime = { path = "polkadot/runtime/rococo" } +rococo-runtime-constants = { path = "polkadot/runtime/rococo/constants", default-features = false } +rococo-system-emulated-network = { path = "cumulus/parachains/integration-tests/emulated/networks/rococo-system" } +rococo-westend-system-emulated-network = { path = "cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system" } +rpassword = { version = "7.0.0" } +rstest = { version = "0.18.2" } +rustc-hash = { version = "1.1.0" } +rustc-hex = { version = "2.1.0", default-features = false } +rustix = { version = "0.36.7", default-features = false } +rustversion = { version = "1.0.6" } +rusty-fork = { version = "0.3.0", default-features = false } +safe-mix = { version = "1.0", default-features = false } +sc-allocator = { path = "substrate/client/allocator", default-features = false } +sc-authority-discovery = { path = "substrate/client/authority-discovery", default-features = false } +sc-basic-authorship = { path = "substrate/client/basic-authorship", default-features = false } +sc-block-builder = { path = "substrate/client/block-builder", default-features = false } +sc-chain-spec = { path = "substrate/client/chain-spec", default-features = false } +sc-chain-spec-derive = { path = "substrate/client/chain-spec/derive", default-features = false } +sc-cli = { path = "substrate/client/cli", default-features = false } +sc-client-api = { path = "substrate/client/api", default-features = false } +sc-client-db = { path = "substrate/client/db", default-features = false } +sc-consensus = { path = "substrate/client/consensus/common", default-features = false } +sc-consensus-aura = { path = "substrate/client/consensus/aura", default-features = false } +sc-consensus-babe = { path = "substrate/client/consensus/babe", default-features = false } +sc-consensus-babe-rpc = { path = "substrate/client/consensus/babe/rpc", default-features = false } +sc-consensus-beefy = { path = "substrate/client/consensus/beefy", default-features = false } +sc-consensus-beefy-rpc = { path = "substrate/client/consensus/beefy/rpc", default-features = false } +sc-consensus-epochs = { path = "substrate/client/consensus/epochs", default-features = false } +sc-consensus-grandpa = { path = "substrate/client/consensus/grandpa", default-features = false } +sc-consensus-grandpa-rpc = { path = "substrate/client/consensus/grandpa/rpc", default-features = false } +sc-consensus-manual-seal = { path = "substrate/client/consensus/manual-seal", default-features = false } +sc-consensus-pow = { path = "substrate/client/consensus/pow", default-features = false } +sc-consensus-slots = { path = "substrate/client/consensus/slots", default-features = false } +sc-executor = { path = "substrate/client/executor", default-features = false } +sc-executor-common = { path = "substrate/client/executor/common", default-features = false } +sc-executor-polkavm = { path = "substrate/client/executor/polkavm", default-features = false } +sc-executor-wasmtime = { path = "substrate/client/executor/wasmtime", default-features = false } +sc-informant = { path = "substrate/client/informant", default-features = false } +sc-keystore = { path = "substrate/client/keystore", default-features = false } +sc-mixnet = { path = "substrate/client/mixnet", default-features = false } +sc-network = { path = "substrate/client/network", default-features = false } +sc-network-common = { path = "substrate/client/network/common", default-features = false } +sc-network-gossip = { path = "substrate/client/network-gossip", default-features = false } +sc-network-light = { path = "substrate/client/network/light", default-features = false } +sc-network-statement = { default-features = false, path = "substrate/client/network/statement" } +sc-network-sync = { path = "substrate/client/network/sync", default-features = false } +sc-network-test = { path = "substrate/client/network/test" } +sc-network-transactions = { path = "substrate/client/network/transactions", default-features = false } +sc-network-types = { path = "substrate/client/network/types", default-features = false } +sc-offchain = { path = "substrate/client/offchain", default-features = false } +sc-proposer-metrics = { path = "substrate/client/proposer-metrics", default-features = false } +sc-rpc = { path = "substrate/client/rpc", default-features = false } +sc-rpc-api = { path = "substrate/client/rpc-api", default-features = false } +sc-rpc-server = { path = "substrate/client/rpc-servers", default-features = false } +sc-rpc-spec-v2 = { path = "substrate/client/rpc-spec-v2", default-features = false } +sc-runtime-test = { path = "substrate/client/executor/runtime-test" } +sc-service = { path = "substrate/client/service", default-features = false } +sc-service-test = { path = "substrate/client/service/test" } +sc-state-db = { path = "substrate/client/state-db", default-features = false } +sc-statement-store = { default-features = false, path = "substrate/client/statement-store" } +sc-storage-monitor = { path = "substrate/client/storage-monitor", default-features = false } +sc-sync-state-rpc = { path = "substrate/client/sync-state-rpc", default-features = false } +sc-sysinfo = { path = "substrate/client/sysinfo", default-features = false } +sc-telemetry = { path = "substrate/client/telemetry", default-features = false } +sc-tracing = { path = "substrate/client/tracing", default-features = false } +sc-tracing-proc-macro = { path = "substrate/client/tracing/proc-macro", default-features = false } +sc-transaction-pool = { path = "substrate/client/transaction-pool", default-features = false } +sc-transaction-pool-api = { path = "substrate/client/transaction-pool/api", default-features = false } +sc-utils = { path = "substrate/client/utils", default-features = false } +scale-info = { version = "2.11.1", default-features = false } +schemars = { version = "0.8.13", default-features = false } +schnellru = { version = "0.2.1" } +schnorrkel = { version = "0.11.4", default-features = false } +seccompiler = { version = "0.4.0" } +secp256k1 = { version = "0.28.0", default-features = false } +secrecy = { version = "0.8.0", default-features = false } +seedling-runtime = { path = "cumulus/parachains/runtimes/starters/seedling" } +separator = { version = "0.4.1" } serde = { version = "1.0.197", default-features = false } serde-big-array = { version = "0.3.2" } serde_derive = { version = "1.0.117" } serde_json = { version = "1.0.114", default-features = false } serde_yaml = { version = "0.9" } +serial_test = { version = "2.0.0" } +sha1 = { version = "0.10.6" } +sha2 = { version = "0.10.7", default-features = false } +sha3 = { version = "0.10.0", default-features = false } +shell-runtime = { path = "cumulus/parachains/runtimes/starters/shell" } +slot-range-helper = { path = "polkadot/runtime/common/slot_range_helper", default-features = false } +slotmap = { version = "1.0" } +smallvec = { version = "1.11.0", default-features = false } +smoldot = { version = "0.11.0", default-features = false } +smoldot-light = { version = "0.9.0", default-features = false } +snowbridge-beacon-primitives = { path = "bridges/snowbridge/primitives/beacon", default-features = false } +snowbridge-core = { path = "bridges/snowbridge/primitives/core", default-features = false } +snowbridge-ethereum = { path = "bridges/snowbridge/primitives/ethereum", default-features = false } +snowbridge-outbound-queue-merkle-tree = { path = "bridges/snowbridge/pallets/outbound-queue/merkle-tree", default-features = false } +snowbridge-outbound-queue-runtime-api = { path = "bridges/snowbridge/pallets/outbound-queue/runtime-api", default-features = false } +snowbridge-pallet-ethereum-client = { path = "bridges/snowbridge/pallets/ethereum-client", default-features = false } +snowbridge-pallet-ethereum-client-fixtures = { path = "bridges/snowbridge/pallets/ethereum-client/fixtures", default-features = false } +snowbridge-pallet-inbound-queue = { path = "bridges/snowbridge/pallets/inbound-queue", default-features = false } +snowbridge-pallet-inbound-queue-fixtures = { path = "bridges/snowbridge/pallets/inbound-queue/fixtures", default-features = false } +snowbridge-pallet-outbound-queue = { path = "bridges/snowbridge/pallets/outbound-queue", default-features = false } +snowbridge-pallet-system = { path = "bridges/snowbridge/pallets/system", default-features = false } +snowbridge-router-primitives = { path = "bridges/snowbridge/primitives/router", default-features = false } +snowbridge-runtime-common = { path = "bridges/snowbridge/runtime/runtime-common", default-features = false } +snowbridge-runtime-test-common = { path = "bridges/snowbridge/runtime/test-common", default-features = false } +snowbridge-system-runtime-api = { path = "bridges/snowbridge/pallets/system/runtime-api", default-features = false } +soketto = { version = "0.7.1" } +solochain-template-runtime = { path = "templates/solochain/runtime" } +sp-api = { path = "substrate/primitives/api", default-features = false } +sp-api-proc-macro = { path = "substrate/primitives/api/proc-macro", default-features = false } +sp-application-crypto = { path = "substrate/primitives/application-crypto", default-features = false } +sp-arithmetic = { path = "substrate/primitives/arithmetic", default-features = false } +sp-authority-discovery = { path = "substrate/primitives/authority-discovery", default-features = false } +sp-block-builder = { path = "substrate/primitives/block-builder", default-features = false } +sp-blockchain = { path = "substrate/primitives/blockchain", default-features = false } +sp-consensus = { path = "substrate/primitives/consensus/common", default-features = false } +sp-consensus-aura = { path = "substrate/primitives/consensus/aura", default-features = false } +sp-consensus-babe = { path = "substrate/primitives/consensus/babe", default-features = false } +sp-consensus-beefy = { path = "substrate/primitives/consensus/beefy", default-features = false } +sp-consensus-grandpa = { path = "substrate/primitives/consensus/grandpa", default-features = false } +sp-consensus-pow = { path = "substrate/primitives/consensus/pow", default-features = false } +sp-consensus-sassafras = { path = "substrate/primitives/consensus/sassafras", default-features = false } +sp-consensus-slots = { path = "substrate/primitives/consensus/slots", default-features = false } +sp-core = { path = "substrate/primitives/core", default-features = false } +sp-core-hashing = { default-features = false, path = "substrate/deprecated/hashing" } +sp-core-hashing-proc-macro = { default-features = false, path = "substrate/deprecated/hashing/proc-macro" } +sp-crypto-ec-utils = { default-features = false, path = "substrate/primitives/crypto/ec-utils" } +sp-crypto-hashing = { path = "substrate/primitives/crypto/hashing", default-features = false } +sp-crypto-hashing-proc-macro = { path = "substrate/primitives/crypto/hashing/proc-macro", default-features = false } +sp-database = { path = "substrate/primitives/database", default-features = false } +sp-debug-derive = { path = "substrate/primitives/debug-derive", default-features = false } +sp-externalities = { path = "substrate/primitives/externalities", default-features = false } +sp-genesis-builder = { path = "substrate/primitives/genesis-builder", default-features = false } +sp-inherents = { path = "substrate/primitives/inherents", default-features = false } +sp-io = { path = "substrate/primitives/io", default-features = false } +sp-keyring = { path = "substrate/primitives/keyring", default-features = false } +sp-keystore = { path = "substrate/primitives/keystore", default-features = false } +sp-maybe-compressed-blob = { path = "substrate/primitives/maybe-compressed-blob", default-features = false } +sp-metadata-ir = { path = "substrate/primitives/metadata-ir", default-features = false } +sp-mixnet = { path = "substrate/primitives/mixnet", default-features = false } +sp-mmr-primitives = { path = "substrate/primitives/merkle-mountain-range", default-features = false } +sp-npos-elections = { path = "substrate/primitives/npos-elections", default-features = false } +sp-offchain = { path = "substrate/primitives/offchain", default-features = false } +sp-panic-handler = { path = "substrate/primitives/panic-handler", default-features = false } +sp-rpc = { path = "substrate/primitives/rpc", default-features = false } +sp-runtime = { path = "substrate/primitives/runtime", default-features = false } +sp-runtime-interface = { path = "substrate/primitives/runtime-interface", default-features = false } +sp-runtime-interface-proc-macro = { path = "substrate/primitives/runtime-interface/proc-macro", default-features = false } +sp-runtime-interface-test-wasm = { path = "substrate/primitives/runtime-interface/test-wasm" } +sp-runtime-interface-test-wasm-deprecated = { path = "substrate/primitives/runtime-interface/test-wasm-deprecated" } +sp-session = { path = "substrate/primitives/session", default-features = false } +sp-staking = { path = "substrate/primitives/staking", default-features = false } +sp-state-machine = { path = "substrate/primitives/state-machine", default-features = false } +sp-statement-store = { path = "substrate/primitives/statement-store", default-features = false } +sp-std = { path = "substrate/primitives/std", default-features = false } +sp-storage = { path = "substrate/primitives/storage", default-features = false } +sp-test-primitives = { path = "substrate/primitives/test-primitives" } +sp-timestamp = { path = "substrate/primitives/timestamp", default-features = false } +sp-tracing = { path = "substrate/primitives/tracing", default-features = false } +sp-transaction-pool = { path = "substrate/primitives/transaction-pool", default-features = false } +sp-transaction-storage-proof = { path = "substrate/primitives/transaction-storage-proof", default-features = false } +sp-trie = { path = "substrate/primitives/trie", default-features = false } +sp-version = { path = "substrate/primitives/version", default-features = false } +sp-version-proc-macro = { path = "substrate/primitives/version/proc-macro", default-features = false } +sp-wasm-interface = { path = "substrate/primitives/wasm-interface", default-features = false } +sp-weights = { path = "substrate/primitives/weights", default-features = false } +spinners = { version = "4.1.0" } +ss58-registry = { version = "1.34.0", default-features = false } +ssz_rs = { version = "0.9.0", default-features = false } +ssz_rs_derive = { version = "0.9.0", default-features = false } +static_assertions = { version = "1.1.0", default-features = false } +static_init = { version = "1.0.3" } +structopt = { version = "0.3" } +strum = { version = "0.26.2", default-features = false } +subkey = { path = "substrate/bin/utils/subkey", default-features = false } +substrate-bip39 = { path = "substrate/utils/substrate-bip39", default-features = false } +substrate-build-script-utils = { path = "substrate/utils/build-script-utils", default-features = false } +substrate-cli-test-utils = { path = "substrate/test-utils/cli" } +substrate-frame-rpc-support = { default-features = false, path = "substrate/utils/frame/rpc/support" } +substrate-frame-rpc-system = { path = "substrate/utils/frame/rpc/system", default-features = false } +substrate-rpc-client = { path = "substrate/utils/frame/rpc/client", default-features = false } +substrate-state-trie-migration-rpc = { path = "substrate/utils/frame/rpc/state-trie-migration-rpc", default-features = false } +substrate-test-client = { path = "substrate/test-utils/client" } +substrate-test-runtime = { path = "substrate/test-utils/runtime" } +substrate-test-runtime-client = { path = "substrate/test-utils/runtime/client" } +substrate-test-runtime-transaction-pool = { path = "substrate/test-utils/runtime/transaction-pool" } +substrate-test-utils = { path = "substrate/test-utils" } +substrate-wasm-builder = { path = "substrate/utils/wasm-builder", default-features = false } syn = { version = "2.0.53" } +sysinfo = { version = "0.30" } +tar = { version = "0.4" } +tempfile = { version = "3.8.1" } +test-log = { version = "0.2.14" } +test-pallet = { path = "substrate/frame/support/test/pallet", default-features = false, package = "frame-support-test-pallet" } +test-parachain-adder = { path = "polkadot/parachain/test-parachains/adder" } +test-parachain-halt = { path = "polkadot/parachain/test-parachains/halt" } +test-parachain-undying = { path = "polkadot/parachain/test-parachains/undying" } +test-runtime-constants = { path = "polkadot/runtime/test-runtime/constants", default-features = false } +testnet-parachains-constants = { path = "cumulus/parachains/runtimes/constants", default-features = false } thiserror = { version = "1.0.48" } +thousands = { version = "0.2.0" } +threadpool = { version = "1.7" } +tikv-jemalloc-ctl = { version = "0.5.0" } +tikv-jemallocator = { version = "0.5.0" } +time = { version = "0.3" } +tiny-keccak = { version = "2.0.2" } +tokio = { version = "1.37.0", default-features = false } +tokio-retry = { version = "0.3.0" } +tokio-stream = { version = "0.1.14" } +tokio-test = { version = "0.4.2" } +tokio-tungstenite = { version = "0.20.1" } +tokio-util = { version = "0.7.8" } +toml = { version = "0.8.8" } +toml_edit = { version = "0.19" } +tower = { version = "0.4.13" } +tower-http = { version = "0.4.0" } +tracing = { version = "0.1.37", default-features = false } +tracing-core = { version = "0.1.32", default-features = false } +tracing-futures = { version = "0.2.4" } +tracing-log = { version = "0.2.0" } tracing-subscriber = { version = "0.3.18" } +tracking-allocator = { path = "polkadot/node/tracking-allocator", default-features = false, package = "staging-tracking-allocator" } +trie-bench = { version = "0.39.0" } +trie-db = { version = "0.29.0", default-features = false } +trie-root = { version = "0.18.0", default-features = false } +trie-standardmap = { version = "0.16.0" } +trybuild = { version = "1.0.88" } +tt-call = { version = "1.0.8" } +tuplex = { version = "0.1", default-features = false } +twox-hash = { version = "1.6.3", default-features = false } +unsigned-varint = { version = "0.7.2" } +url = { version = "2.4.0" } +void = { version = "1.0.2" } +w3f-bls = { version = "0.1.3", default-features = false } +wait-timeout = { version = "0.2" } +walkdir = { version = "2.4.0" } +wasm-bindgen-test = { version = "0.3.19" } +wasm-instrument = { version = "0.4", default-features = false } +wasm-opt = { version = "0.116" } +wasm-timer = { version = "0.2.5" } +wasmi = { version = "0.32.3", default-features = false } +wasmtime = { version = "8.0.1", default-features = false } +wat = { version = "1.0.0" } +westend-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/relays/westend", default-features = false } +westend-runtime = { path = "polkadot/runtime/westend" } +westend-runtime-constants = { path = "polkadot/runtime/westend/constants", default-features = false } +westend-system-emulated-network = { path = "cumulus/parachains/integration-tests/emulated/networks/westend-system" } +x25519-dalek = { version = "2.0" } +xcm = { path = "polkadot/xcm", default-features = false, package = "staging-xcm" } +xcm-builder = { path = "polkadot/xcm/xcm-builder", default-features = false, package = "staging-xcm-builder" } +xcm-docs = { path = "polkadot/xcm/docs" } +xcm-emulator = { path = "cumulus/xcm/xcm-emulator", default-features = false } +xcm-executor = { path = "polkadot/xcm/xcm-executor", default-features = false, package = "staging-xcm-executor" } +xcm-fee-payment-runtime-api = { path = "polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +xcm-procedural = { path = "polkadot/xcm/procedural", default-features = false } +xcm-simulator = { path = "polkadot/xcm/xcm-simulator", default-features = false } +zeroize = { version = "1.7.0", default-features = false } +zstd = { version = "0.12.4", default-features = false } [profile.release] # Polkadot runtime requires unwinding. diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml index 783009a8c89..d69a064aab8 100644 --- a/bridges/bin/runtime-common/Cargo.toml +++ b/bridges/bin/runtime-common/Cargo.toml @@ -11,48 +11,48 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -hash-db = { version = "0.16.0", default-features = false } +codec = { features = ["derive"], workspace = true } +hash-db = { workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -static_assertions = { version = "1.1", optional = true } -tuplex = { version = "0.1", default-features = false } +scale-info = { features = ["derive"], workspace = true } +static_assertions = { optional = true, workspace = true, default-features = true } +tuplex = { workspace = true } # Bridge dependencies -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } -bp-parachains = { path = "../../primitives/parachains", default-features = false } -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-relayers = { path = "../../primitives/relayers", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-xcm-bridge-hub = { path = "../../primitives/xcm-bridge-hub", default-features = false } -bp-xcm-bridge-hub-router = { path = "../../primitives/xcm-bridge-hub-router", default-features = false } -pallet-bridge-grandpa = { path = "../../modules/grandpa", default-features = false } -pallet-bridge-messages = { path = "../../modules/messages", default-features = false } -pallet-bridge-parachains = { path = "../../modules/parachains", default-features = false } -pallet-bridge-relayers = { path = "../../modules/relayers", default-features = false } +bp-header-chain = { workspace = true } +bp-messages = { workspace = true } +bp-parachains = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-relayers = { workspace = true } +bp-runtime = { workspace = true } +bp-xcm-bridge-hub = { workspace = true } +bp-xcm-bridge-hub-router = { workspace = true } +pallet-bridge-grandpa = { workspace = true } +pallet-bridge-messages = { workspace = true } +pallet-bridge-parachains = { workspace = true } +pallet-bridge-relayers = { workspace = true } # Substrate dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } -pallet-utility = { path = "../../../substrate/frame/utility", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-utility = { workspace = true } +sp-api = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-trie = { workspace = true } # Polkadot dependencies -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } +xcm = { workspace = true } +xcm-builder = { workspace = true } [dev-dependencies] -bp-test-utils = { path = "../../primitives/test-utils" } -pallet-balances = { path = "../../../substrate/frame/balances" } +bp-test-utils = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/chains/chain-asset-hub-rococo/Cargo.toml b/bridges/chains/chain-asset-hub-rococo/Cargo.toml index d9afe2c8bf7..b765fbc57bb 100644 --- a/bridges/chains/chain-asset-hub-rococo/Cargo.toml +++ b/bridges/chains/chain-asset-hub-rococo/Cargo.toml @@ -11,14 +11,14 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } +frame-support = { workspace = true } # Bridge Dependencies -bp-xcm-bridge-hub-router = { path = "../../primitives/xcm-bridge-hub-router", default-features = false } +bp-xcm-bridge-hub-router = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-asset-hub-westend/Cargo.toml b/bridges/chains/chain-asset-hub-westend/Cargo.toml index 4b3ed052f13..ff89864fb2d 100644 --- a/bridges/chains/chain-asset-hub-westend/Cargo.toml +++ b/bridges/chains/chain-asset-hub-westend/Cargo.toml @@ -11,14 +11,14 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } +frame-support = { workspace = true } # Bridge Dependencies -bp-xcm-bridge-hub-router = { path = "../../primitives/xcm-bridge-hub-router", default-features = false } +bp-xcm-bridge-hub-router = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-bridge-hub-cumulus/Cargo.toml b/bridges/chains/chain-bridge-hub-cumulus/Cargo.toml index 4b900002a4d..5609398385f 100644 --- a/bridges/chains/chain-bridge-hub-cumulus/Cargo.toml +++ b/bridges/chains/chain-bridge-hub-cumulus/Cargo.toml @@ -13,19 +13,19 @@ workspace = true [dependencies] # Bridge Dependencies -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-polkadot-core = { workspace = true } +bp-messages = { workspace = true } +bp-runtime = { workspace = true } # Substrate Based Dependencies -frame-system = { path = "../../../substrate/frame/system", default-features = false } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-system = { workspace = true } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-std = { workspace = true } # Polkadot Dependencies -polkadot-primitives = { path = "../../../polkadot/primitives", default-features = false } +polkadot-primitives = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-bridge-hub-kusama/Cargo.toml b/bridges/chains/chain-bridge-hub-kusama/Cargo.toml index ff6dd8849ab..605643b0a4e 100644 --- a/bridges/chains/chain-bridge-hub-kusama/Cargo.toml +++ b/bridges/chains/chain-bridge-hub-kusama/Cargo.toml @@ -13,16 +13,16 @@ workspace = true [dependencies] # Bridge Dependencies -bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } +bp-bridge-hub-cumulus = { workspace = true } +bp-runtime = { workspace = true } +bp-messages = { workspace = true } # Substrate Based Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-bridge-hub-polkadot/Cargo.toml b/bridges/chains/chain-bridge-hub-polkadot/Cargo.toml index da8b8a82fa7..97e36a19c74 100644 --- a/bridges/chains/chain-bridge-hub-polkadot/Cargo.toml +++ b/bridges/chains/chain-bridge-hub-polkadot/Cargo.toml @@ -14,16 +14,16 @@ workspace = true # Bridge Dependencies -bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } +bp-bridge-hub-cumulus = { workspace = true } +bp-runtime = { workspace = true } +bp-messages = { workspace = true } # Substrate Based Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-bridge-hub-rococo/Cargo.toml b/bridges/chains/chain-bridge-hub-rococo/Cargo.toml index f7672df012f..5c918470322 100644 --- a/bridges/chains/chain-bridge-hub-rococo/Cargo.toml +++ b/bridges/chains/chain-bridge-hub-rococo/Cargo.toml @@ -13,16 +13,16 @@ workspace = true [dependencies] # Bridge Dependencies -bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } +bp-bridge-hub-cumulus = { workspace = true } +bp-runtime = { workspace = true } +bp-messages = { workspace = true } # Substrate Based Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-bridge-hub-westend/Cargo.toml b/bridges/chains/chain-bridge-hub-westend/Cargo.toml index ec74c4b947d..0b429ab9a0b 100644 --- a/bridges/chains/chain-bridge-hub-westend/Cargo.toml +++ b/bridges/chains/chain-bridge-hub-westend/Cargo.toml @@ -14,16 +14,16 @@ workspace = true # Bridge Dependencies -bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } +bp-bridge-hub-cumulus = { workspace = true } +bp-runtime = { workspace = true } +bp-messages = { workspace = true } # Substrate Based Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-kusama/Cargo.toml b/bridges/chains/chain-kusama/Cargo.toml index 66061ff2793..ec45c1eddce 100644 --- a/bridges/chains/chain-kusama/Cargo.toml +++ b/bridges/chains/chain-kusama/Cargo.toml @@ -14,15 +14,15 @@ workspace = true # Bridge Dependencies -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-header-chain = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-runtime = { workspace = true } # Substrate Based Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-polkadot-bulletin/Cargo.toml b/bridges/chains/chain-polkadot-bulletin/Cargo.toml index 700247b7055..ea5f4d2e775 100644 --- a/bridges/chains/chain-polkadot-bulletin/Cargo.toml +++ b/bridges/chains/chain-polkadot-bulletin/Cargo.toml @@ -11,23 +11,23 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } # Bridge Dependencies -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-header-chain = { workspace = true } +bp-messages = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-runtime = { workspace = true } # Substrate Based Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-api = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-polkadot/Cargo.toml b/bridges/chains/chain-polkadot/Cargo.toml index c700935f308..50f637af425 100644 --- a/bridges/chains/chain-polkadot/Cargo.toml +++ b/bridges/chains/chain-polkadot/Cargo.toml @@ -14,15 +14,15 @@ workspace = true # Bridge Dependencies -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-header-chain = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-runtime = { workspace = true } # Substrate Based Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-rococo/Cargo.toml b/bridges/chains/chain-rococo/Cargo.toml index 5a5613bb376..49a1a397ee0 100644 --- a/bridges/chains/chain-rococo/Cargo.toml +++ b/bridges/chains/chain-rococo/Cargo.toml @@ -14,15 +14,15 @@ workspace = true # Bridge Dependencies -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-header-chain = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-runtime = { workspace = true } # Substrate Based Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/chains/chain-westend/Cargo.toml b/bridges/chains/chain-westend/Cargo.toml index 10b06d76507..5e27bc647bf 100644 --- a/bridges/chains/chain-westend/Cargo.toml +++ b/bridges/chains/chain-westend/Cargo.toml @@ -14,15 +14,15 @@ workspace = true # Bridge Dependencies -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-header-chain = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-runtime = { workspace = true } # Substrate Based Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/modules/beefy/Cargo.toml b/bridges/modules/beefy/Cargo.toml index e36bbb615f2..cffc62d2908 100644 --- a/bridges/modules/beefy/Cargo.toml +++ b/bridges/modules/beefy/Cargo.toml @@ -12,32 +12,32 @@ publish = false workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } +codec = { workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, workspace = true } # Bridge Dependencies -bp-beefy = { path = "../../primitives/beefy", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-beefy = { workspace = true } +bp-runtime = { workspace = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -sp-consensus-beefy = { path = "../../../substrate/primitives/consensus/beefy" } -mmr-lib = { package = "ckb-merkle-mountain-range", version = "0.5.2" } -pallet-beefy-mmr = { path = "../../../substrate/frame/beefy-mmr" } -pallet-mmr = { path = "../../../substrate/frame/merkle-mountain-range" } -rand = "0.8.5" -sp-io = { path = "../../../substrate/primitives/io" } -bp-test-utils = { path = "../../primitives/test-utils" } +sp-consensus-beefy = { workspace = true, default-features = true } +mmr-lib = { workspace = true } +pallet-beefy-mmr = { workspace = true, default-features = true } +pallet-mmr = { workspace = true, default-features = true } +rand = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +bp-test-utils = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/modules/grandpa/Cargo.toml b/bridges/modules/grandpa/Cargo.toml index 0ca6b675035..307c7ddaaff 100644 --- a/bridges/modules/grandpa/Cargo.toml +++ b/bridges/modules/grandpa/Cargo.toml @@ -13,32 +13,32 @@ workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -finality-grandpa = { version = "0.16.2", default-features = false } +codec = { workspace = true } +finality-grandpa = { workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } # Bridge Dependencies -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } +bp-runtime = { workspace = true } +bp-header-chain = { workspace = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa", default-features = false, features = ["serde"] } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false, features = ["serde"] } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-consensus-grandpa = { features = ["serde"], workspace = true } +sp-runtime = { features = ["serde"], workspace = true } +sp-std = { workspace = true } +sp-trie = { workspace = true } # Optional Benchmarking Dependencies -bp-test-utils = { path = "../../primitives/test-utils", default-features = false, optional = true } -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } +bp-test-utils = { optional = true, workspace = true } +frame-benchmarking = { optional = true, workspace = true } [dev-dependencies] -sp-core = { path = "../../../substrate/primitives/core" } -sp-io = { path = "../../../substrate/primitives/io" } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/modules/messages/Cargo.toml b/bridges/modules/messages/Cargo.toml index 71c86ccc036..573d0ba4766 100644 --- a/bridges/modules/messages/Cargo.toml +++ b/bridges/modules/messages/Cargo.toml @@ -11,28 +11,28 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } +codec = { workspace = true } log = { workspace = true } -num-traits = { version = "0.2", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +num-traits = { workspace = true } +scale-info = { features = ["derive"], workspace = true } # Bridge dependencies -bp-messages = { path = "../../primitives/messages", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { workspace = true } +bp-runtime = { workspace = true } # Substrate Dependencies -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -bp-test-utils = { path = "../../primitives/test-utils" } -pallet-balances = { path = "../../../substrate/frame/balances" } -sp-io = { path = "../../../substrate/primitives/io" } +bp-test-utils = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/modules/parachains/Cargo.toml b/bridges/modules/parachains/Cargo.toml index d3152f8d0a4..97bad724a78 100644 --- a/bridges/modules/parachains/Cargo.toml +++ b/bridges/modules/parachains/Cargo.toml @@ -11,32 +11,32 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } +codec = { workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } # Bridge Dependencies -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } -bp-parachains = { path = "../../primitives/parachains", default-features = false } -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -pallet-bridge-grandpa = { path = "../grandpa", default-features = false } +bp-header-chain = { workspace = true } +bp-parachains = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-runtime = { workspace = true } +pallet-bridge-grandpa = { workspace = true } # Substrate Dependencies -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-trie = { workspace = true } [dev-dependencies] -bp-header-chain = { path = "../../primitives/header-chain" } -bp-test-utils = { path = "../../primitives/test-utils" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-io = { path = "../../../substrate/primitives/io" } +bp-header-chain = { workspace = true, default-features = true } +bp-test-utils = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/modules/relayers/Cargo.toml b/bridges/modules/relayers/Cargo.toml index 08e1438d4f1..27a28546afb 100644 --- a/bridges/modules/relayers/Cargo.toml +++ b/bridges/modules/relayers/Cargo.toml @@ -11,31 +11,31 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } +codec = { workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } # Bridge dependencies -bp-messages = { path = "../../primitives/messages", default-features = false } -bp-relayers = { path = "../../primitives/relayers", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -pallet-bridge-messages = { path = "../messages", default-features = false } +bp-messages = { workspace = true } +bp-relayers = { workspace = true } +bp-runtime = { workspace = true } +pallet-bridge-messages = { workspace = true } # Substrate Dependencies -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-arithmetic = { path = "../../../substrate/primitives/arithmetic", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-arithmetic = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -bp-runtime = { path = "../../primitives/runtime" } -pallet-balances = { path = "../../../substrate/frame/balances" } -sp-io = { path = "../../../substrate/primitives/io" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } +bp-runtime = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/modules/xcm-bridge-hub-router/Cargo.toml b/bridges/modules/xcm-bridge-hub-router/Cargo.toml index b80240c974d..ec7c3b56283 100644 --- a/bridges/modules/xcm-bridge-hub-router/Cargo.toml +++ b/bridges/modules/xcm-bridge-hub-router/Cargo.toml @@ -11,31 +11,31 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } +codec = { workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive", "serde"] } +scale-info = { features = ["bit-vec", "derive", "serde"], workspace = true } # Bridge dependencies -bp-xcm-bridge-hub-router = { path = "../../primitives/xcm-bridge-hub-router", default-features = false } +bp-xcm-bridge-hub-router = { workspace = true } # Substrate Dependencies -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } # Polkadot Dependencies -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } +xcm = { workspace = true } +xcm-builder = { workspace = true } [dev-dependencies] -sp-io = { path = "../../../substrate/primitives/io" } -sp-std = { path = "../../../substrate/primitives/std" } +sp-io = { workspace = true, default-features = true } +sp-std = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/modules/xcm-bridge-hub/Cargo.toml b/bridges/modules/xcm-bridge-hub/Cargo.toml index 9b22770061a..092df477265 100644 --- a/bridges/modules/xcm-bridge-hub/Cargo.toml +++ b/bridges/modules/xcm-bridge-hub/Cargo.toml @@ -11,33 +11,33 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } +codec = { workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } # Bridge Dependencies -bp-messages = { path = "../../primitives/messages", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-xcm-bridge-hub = { path = "../../primitives/xcm-bridge-hub", default-features = false } -pallet-bridge-messages = { path = "../messages", default-features = false } -bridge-runtime-common = { path = "../../bin/runtime-common", default-features = false } +bp-messages = { workspace = true } +bp-runtime = { workspace = true } +bp-xcm-bridge-hub = { workspace = true } +pallet-bridge-messages = { workspace = true } +bridge-runtime-common = { workspace = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } # Polkadot Dependencies -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../polkadot/xcm/xcm-executor", default-features = false } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } [dev-dependencies] -bp-header-chain = { path = "../../primitives/header-chain" } -pallet-balances = { path = "../../../substrate/frame/balances" } -sp-io = { path = "../../../substrate/primitives/io" } +bp-header-chain = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/primitives/beefy/Cargo.toml b/bridges/primitives/beefy/Cargo.toml index bd68076ca48..404acaff30a 100644 --- a/bridges/primitives/beefy/Cargo.toml +++ b/bridges/primitives/beefy/Cargo.toml @@ -12,23 +12,23 @@ publish = false workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["bit-vec", "derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive"] } -serde = { default-features = false, features = ["alloc", "derive"], workspace = true } +codec = { features = ["bit-vec", "derive"], workspace = true } +scale-info = { features = ["bit-vec", "derive"], workspace = true } +serde = { features = ["alloc", "derive"], workspace = true } # Bridge Dependencies -bp-runtime = { path = "../runtime", default-features = false } +bp-runtime = { workspace = true } # Substrate Dependencies -binary-merkle-tree = { path = "../../../substrate/utils/binary-merkle-tree", default-features = false } -sp-consensus-beefy = { path = "../../../substrate/primitives/consensus/beefy", default-features = false } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -pallet-beefy-mmr = { path = "../../../substrate/frame/beefy-mmr", default-features = false } -pallet-mmr = { path = "../../../substrate/frame/merkle-mountain-range", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +binary-merkle-tree = { workspace = true } +sp-consensus-beefy = { workspace = true } +frame-support = { workspace = true } +pallet-beefy-mmr = { workspace = true } +pallet-mmr = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/primitives/header-chain/Cargo.toml b/bridges/primitives/header-chain/Cargo.toml index def1f7ad4df..081bda47949 100644 --- a/bridges/primitives/header-chain/Cargo.toml +++ b/bridges/primitives/header-chain/Cargo.toml @@ -11,27 +11,27 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -finality-grandpa = { version = "0.16.2", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { workspace = true } +finality-grandpa = { workspace = true } +scale-info = { features = ["derive"], workspace = true } serde = { features = ["alloc", "derive"], workspace = true } # Bridge dependencies -bp-runtime = { path = "../runtime", default-features = false } +bp-runtime = { workspace = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false, features = ["serde"] } -sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa", default-features = false, features = ["serde"] } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false, features = ["serde"] } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-core = { features = ["serde"], workspace = true } +sp-consensus-grandpa = { features = ["serde"], workspace = true } +sp-runtime = { features = ["serde"], workspace = true } +sp-std = { workspace = true } [dev-dependencies] -bp-test-utils = { path = "../test-utils" } -hex = "0.4" -hex-literal = "0.4" +bp-test-utils = { workspace = true, default-features = true } +hex = { workspace = true, default-features = true } +hex-literal = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/primitives/messages/Cargo.toml b/bridges/primitives/messages/Cargo.toml index 20337873c2e..4a9037342bc 100644 --- a/bridges/primitives/messages/Cargo.toml +++ b/bridges/primitives/messages/Cargo.toml @@ -11,24 +11,24 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["bit-vec", "derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive"] } +codec = { features = ["bit-vec", "derive"], workspace = true } +scale-info = { features = ["bit-vec", "derive"], workspace = true } serde = { features = ["alloc", "derive"], workspace = true } # Bridge dependencies -bp-runtime = { path = "../runtime", default-features = false } -bp-header-chain = { path = "../header-chain", default-features = false } +bp-runtime = { workspace = true } +bp-header-chain = { workspace = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-core = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -hex = "0.4" -hex-literal = "0.4" +hex = { workspace = true, default-features = true } +hex-literal = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/primitives/parachains/Cargo.toml b/bridges/primitives/parachains/Cargo.toml index a6e71876cef..173380c8224 100644 --- a/bridges/primitives/parachains/Cargo.toml +++ b/bridges/primitives/parachains/Cargo.toml @@ -11,22 +11,22 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -impl-trait-for-tuples = "0.2" -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +impl-trait-for-tuples = { workspace = true } +scale-info = { features = ["derive"], workspace = true } # Bridge dependencies -bp-header-chain = { path = "../header-chain", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } +bp-header-chain = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-runtime = { workspace = true } # Substrate dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/primitives/polkadot-core/Cargo.toml b/bridges/primitives/polkadot-core/Cargo.toml index d4b2f503e9e..acae2f431bf 100644 --- a/bridges/primitives/polkadot-core/Cargo.toml +++ b/bridges/primitives/polkadot-core/Cargo.toml @@ -11,26 +11,26 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -parity-util-mem = { version = "0.12.0", optional = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +parity-util-mem = { optional = true, workspace = true } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Bridge Dependencies -bp-messages = { path = "../messages", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } +bp-messages = { workspace = true } +bp-runtime = { workspace = true } # Substrate Based Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -hex = "0.4" +hex = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/primitives/relayers/Cargo.toml b/bridges/primitives/relayers/Cargo.toml index 5081dddce1e..3448e8a4096 100644 --- a/bridges/primitives/relayers/Cargo.toml +++ b/bridges/primitives/relayers/Cargo.toml @@ -11,23 +11,23 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["bit-vec", "derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive"] } +codec = { features = ["bit-vec", "derive"], workspace = true } +scale-info = { features = ["bit-vec", "derive"], workspace = true } # Bridge Dependencies -bp-messages = { path = "../messages", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } +bp-messages = { workspace = true } +bp-runtime = { workspace = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -hex = "0.4" -hex-literal = "0.4" +hex = { workspace = true, default-features = true } +hex-literal = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/primitives/runtime/Cargo.toml b/bridges/primitives/runtime/Cargo.toml index ac65ad538b4..5fa35e68899 100644 --- a/bridges/primitives/runtime/Cargo.toml +++ b/bridges/primitives/runtime/Cargo.toml @@ -11,28 +11,28 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -hash-db = { version = "0.16.0", default-features = false } -impl-trait-for-tuples = "0.2.2" +codec = { workspace = true } +hash-db = { workspace = true } +impl-trait-for-tuples = { workspace = true } log = { workspace = true } -num-traits = { version = "0.2", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +num-traits = { workspace = true } +scale-info = { features = ["derive"], workspace = true } serde = { features = ["alloc", "derive"], workspace = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false, features = ["serde"] } -sp-state-machine = { path = "../../../substrate/primitives/state-machine", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } -trie-db = { version = "0.29.0", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { features = ["serde"], workspace = true } +sp-state-machine = { workspace = true } +sp-std = { workspace = true } +sp-trie = { workspace = true } +trie-db = { workspace = true } [dev-dependencies] -hex-literal = "0.4" +hex-literal = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/primitives/test-utils/Cargo.toml b/bridges/primitives/test-utils/Cargo.toml index 99f5ee0d1ae..0b7fb3fec07 100644 --- a/bridges/primitives/test-utils/Cargo.toml +++ b/bridges/primitives/test-utils/Cargo.toml @@ -11,19 +11,19 @@ repository.workspace = true workspace = true [dependencies] -bp-header-chain = { path = "../header-chain", default-features = false } -bp-parachains = { path = "../parachains", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -ed25519-dalek = { version = "2.1", default-features = false } -finality-grandpa = { version = "0.16.2", default-features = false } -sp-application-crypto = { path = "../../../substrate/primitives/application-crypto", default-features = false } -sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } +bp-header-chain = { workspace = true } +bp-parachains = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-runtime = { workspace = true } +codec = { workspace = true } +ed25519-dalek = { workspace = true } +finality-grandpa = { workspace = true } +sp-application-crypto = { workspace = true } +sp-consensus-grandpa = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-trie = { workspace = true } [features] default = ["std"] diff --git a/bridges/primitives/xcm-bridge-hub-router/Cargo.toml b/bridges/primitives/xcm-bridge-hub-router/Cargo.toml index b94e7220245..c3cf3356184 100644 --- a/bridges/primitives/xcm-bridge-hub-router/Cargo.toml +++ b/bridges/primitives/xcm-bridge-hub-router/Cargo.toml @@ -11,12 +11,12 @@ repository.workspace = true workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["bit-vec", "derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive"] } +codec = { features = ["bit-vec", "derive"], workspace = true } +scale-info = { features = ["bit-vec", "derive"], workspace = true } # Substrate Dependencies -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } +sp-runtime = { workspace = true } +sp-core = { workspace = true } [features] default = ["std"] diff --git a/bridges/primitives/xcm-bridge-hub/Cargo.toml b/bridges/primitives/xcm-bridge-hub/Cargo.toml index 27881bc99d1..932e9ade019 100644 --- a/bridges/primitives/xcm-bridge-hub/Cargo.toml +++ b/bridges/primitives/xcm-bridge-hub/Cargo.toml @@ -13,7 +13,7 @@ workspace = true [dependencies] # Substrate Dependencies -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/bridges/relays/client-substrate/Cargo.toml b/bridges/relays/client-substrate/Cargo.toml index ea267ea5e30..6db4f3e9ef6 100644 --- a/bridges/relays/client-substrate/Cargo.toml +++ b/bridges/relays/client-substrate/Cargo.toml @@ -11,51 +11,51 @@ publish = false workspace = true [dependencies] -async-std = { version = "1.9.0", features = ["attributes"] } -async-trait = "0.1.79" -codec = { package = "parity-scale-codec", version = "3.6.12" } -futures = "0.3.30" -jsonrpsee = { version = "0.22", features = ["macros", "ws-client"] } +async-std = { features = ["attributes"], workspace = true } +async-trait = { workspace = true } +codec = { workspace = true, default-features = true } +futures = { workspace = true } +jsonrpsee = { features = ["macros", "ws-client"], workspace = true } log = { workspace = true } -num-traits = "0.2" -rand = "0.8.5" -scale-info = { version = "2.11.1", features = ["derive"] } -tokio = { version = "1.37", features = ["rt-multi-thread"] } +num-traits = { workspace = true, default-features = true } +rand = { workspace = true, default-features = true } +scale-info = { features = ["derive"], workspace = true, default-features = true } +tokio = { features = ["rt-multi-thread"], workspace = true, default-features = true } thiserror = { workspace = true } -quick_cache = "0.3" +quick_cache = { workspace = true } # Bridge dependencies -bp-header-chain = { path = "../../primitives/header-chain" } -bp-messages = { path = "../../primitives/messages" } -bp-polkadot-core = { path = "../../primitives/polkadot-core" } -bp-runtime = { path = "../../primitives/runtime" } -pallet-bridge-messages = { path = "../../modules/messages" } -finality-relay = { path = "../finality" } -relay-utils = { path = "../utils" } +bp-header-chain = { workspace = true, default-features = true } +bp-messages = { workspace = true, default-features = true } +bp-polkadot-core = { workspace = true, default-features = true } +bp-runtime = { workspace = true, default-features = true } +pallet-bridge-messages = { workspace = true, default-features = true } +finality-relay = { workspace = true } +relay-utils = { workspace = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support" } -frame-system = { path = "../../../substrate/frame/system" } -pallet-balances = { path = "../../../substrate/frame/balances" } -pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment" } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../substrate/frame/transaction-payment/rpc/runtime-api" } -pallet-utility = { path = "../../../substrate/frame/utility" } -sc-chain-spec = { path = "../../../substrate/client/chain-spec" } -sc-rpc-api = { path = "../../../substrate/client/rpc-api" } -sc-transaction-pool-api = { path = "../../../substrate/client/transaction-pool/api" } -sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-rpc = { path = "../../../substrate/primitives/rpc" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-std = { path = "../../../substrate/primitives/std" } -sp-trie = { path = "../../../substrate/primitives/trie" } -sp-version = { path = "../../../substrate/primitives/version" } +frame-support = { workspace = true, default-features = true } +frame-system = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +pallet-transaction-payment = { workspace = true, default-features = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true, default-features = true } +pallet-utility = { workspace = true, default-features = true } +sc-chain-spec = { workspace = true, default-features = true } +sc-rpc-api = { workspace = true, default-features = true } +sc-transaction-pool-api = { workspace = true, default-features = true } +sp-consensus-grandpa = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-rpc = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-std = { workspace = true, default-features = true } +sp-trie = { workspace = true, default-features = true } +sp-version = { workspace = true, default-features = true } # Polkadot Dependencies -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm" } +xcm = { workspace = true, default-features = true } [features] default = [] diff --git a/bridges/relays/equivocation/Cargo.toml b/bridges/relays/equivocation/Cargo.toml index 5a067b62e07..09bdda23f2c 100644 --- a/bridges/relays/equivocation/Cargo.toml +++ b/bridges/relays/equivocation/Cargo.toml @@ -12,12 +12,12 @@ publish = false workspace = true [dependencies] -async-std = { version = "1.9.0", features = ["attributes"] } -async-trait = "0.1.79" -bp-header-chain = { path = "../../primitives/header-chain" } -finality-relay = { path = "../finality" } -frame-support = { path = "../../../substrate/frame/support" } -futures = "0.3.30" +async-std = { features = ["attributes"], workspace = true } +async-trait = { workspace = true } +bp-header-chain = { workspace = true, default-features = true } +finality-relay = { workspace = true } +frame-support = { workspace = true, default-features = true } +futures = { workspace = true } log = { workspace = true } -num-traits = "0.2" -relay-utils = { path = "../utils" } +num-traits = { workspace = true, default-features = true } +relay-utils = { workspace = true } diff --git a/bridges/relays/finality/Cargo.toml b/bridges/relays/finality/Cargo.toml index 5ee4b10fa63..06c4a5dcc43 100644 --- a/bridges/relays/finality/Cargo.toml +++ b/bridges/relays/finality/Cargo.toml @@ -12,14 +12,14 @@ publish = false workspace = true [dependencies] -async-std = "1.9.0" -async-trait = "0.1.79" -backoff = "0.4" -bp-header-chain = { path = "../../primitives/header-chain" } -futures = "0.3.30" +async-std = { workspace = true } +async-trait = { workspace = true } +backoff = { workspace = true } +bp-header-chain = { workspace = true, default-features = true } +futures = { workspace = true } log = { workspace = true } -num-traits = "0.2" -relay-utils = { path = "../utils" } +num-traits = { workspace = true, default-features = true } +relay-utils = { workspace = true } [dev-dependencies] -parking_lot = "0.12.1" +parking_lot = { workspace = true, default-features = true } diff --git a/bridges/relays/lib-substrate-relay/Cargo.toml b/bridges/relays/lib-substrate-relay/Cargo.toml index 077d1b1ff35..28fee5b167f 100644 --- a/bridges/relays/lib-substrate-relay/Cargo.toml +++ b/bridges/relays/lib-substrate-relay/Cargo.toml @@ -11,52 +11,52 @@ publish = false workspace = true [dependencies] -anyhow = "1.0" -async-std = "1.9.0" -async-trait = "0.1.79" -codec = { package = "parity-scale-codec", version = "3.6.12" } -futures = "0.3.30" -hex = "0.4" +anyhow = { workspace = true } +async-std = { workspace = true } +async-trait = { workspace = true } +codec = { workspace = true, default-features = true } +futures = { workspace = true } +hex = { workspace = true, default-features = true } log = { workspace = true } -num-traits = "0.2" -rbtag = "0.3" -structopt = "0.3" -strum = { version = "0.26.2", features = ["derive"] } +num-traits = { workspace = true, default-features = true } +rbtag = { workspace = true } +structopt = { workspace = true } +strum = { features = ["derive"], workspace = true, default-features = true } thiserror = { workspace = true } # Bridge dependencies -bp-header-chain = { path = "../../primitives/header-chain" } -bp-parachains = { path = "../../primitives/parachains" } -bp-polkadot-core = { path = "../../primitives/polkadot-core" } -bp-relayers = { path = "../../primitives/relayers" } -bridge-runtime-common = { path = "../../bin/runtime-common" } +bp-header-chain = { workspace = true, default-features = true } +bp-parachains = { workspace = true, default-features = true } +bp-polkadot-core = { workspace = true, default-features = true } +bp-relayers = { workspace = true, default-features = true } +bridge-runtime-common = { workspace = true, default-features = true } -equivocation-detector = { path = "../equivocation" } -finality-grandpa = { version = "0.16.2" } -finality-relay = { path = "../finality" } -parachains-relay = { path = "../parachains" } -relay-utils = { path = "../utils" } -messages-relay = { path = "../messages" } -relay-substrate-client = { path = "../client-substrate" } +equivocation-detector = { workspace = true } +finality-grandpa = { workspace = true, default-features = true } +finality-relay = { workspace = true } +parachains-relay = { workspace = true } +relay-utils = { workspace = true } +messages-relay = { workspace = true } +relay-substrate-client = { workspace = true } -pallet-bridge-grandpa = { path = "../../modules/grandpa" } -pallet-bridge-messages = { path = "../../modules/messages" } -pallet-bridge-parachains = { path = "../../modules/parachains" } +pallet-bridge-grandpa = { workspace = true, default-features = true } +pallet-bridge-messages = { workspace = true, default-features = true } +pallet-bridge-parachains = { workspace = true, default-features = true } -bp-runtime = { path = "../../primitives/runtime" } -bp-messages = { path = "../../primitives/messages" } +bp-runtime = { workspace = true, default-features = true } +bp-messages = { workspace = true, default-features = true } # Substrate Dependencies -frame-support = { path = "../../../substrate/frame/support" } -frame-system = { path = "../../../substrate/frame/system" } -pallet-balances = { path = "../../../substrate/frame/balances" } -pallet-grandpa = { path = "../../../substrate/frame/grandpa" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } +frame-support = { workspace = true, default-features = true } +frame-system = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +pallet-grandpa = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-consensus-grandpa = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } [dev-dependencies] -pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment" } -relay-substrate-client = { path = "../client-substrate", features = ["test-helpers"] } +pallet-transaction-payment = { workspace = true, default-features = true } +relay-substrate-client = { features = ["test-helpers"], workspace = true } diff --git a/bridges/relays/messages/Cargo.toml b/bridges/relays/messages/Cargo.toml index 570e11c0da6..96e441fc673 100644 --- a/bridges/relays/messages/Cargo.toml +++ b/bridges/relays/messages/Cargo.toml @@ -11,19 +11,19 @@ publish = false workspace = true [dependencies] -async-std = { version = "1.9.0", features = ["attributes"] } -async-trait = "0.1.79" -env_logger = "0.11" -futures = "0.3.30" -hex = "0.4" +async-std = { features = ["attributes"], workspace = true } +async-trait = { workspace = true } +env_logger = { workspace = true } +futures = { workspace = true } +hex = { workspace = true, default-features = true } log = { workspace = true } -num-traits = "0.2" -parking_lot = "0.12.1" +num-traits = { workspace = true, default-features = true } +parking_lot = { workspace = true, default-features = true } # Bridge Dependencies -bp-messages = { path = "../../primitives/messages" } -finality-relay = { path = "../finality" } -relay-utils = { path = "../utils" } +bp-messages = { workspace = true, default-features = true } +finality-relay = { workspace = true } +relay-utils = { workspace = true } -sp-arithmetic = { path = "../../../substrate/primitives/arithmetic" } +sp-arithmetic = { workspace = true, default-features = true } diff --git a/bridges/relays/parachains/Cargo.toml b/bridges/relays/parachains/Cargo.toml index 8d38e4e6bd0..ed03bdbb0f6 100644 --- a/bridges/relays/parachains/Cargo.toml +++ b/bridges/relays/parachains/Cargo.toml @@ -11,18 +11,18 @@ publish = false workspace = true [dependencies] -async-std = "1.9.0" -async-trait = "0.1.79" -futures = "0.3.30" +async-std = { workspace = true } +async-trait = { workspace = true } +futures = { workspace = true } log = { workspace = true } -relay-utils = { path = "../utils" } +relay-utils = { workspace = true } # Bridge dependencies -bp-polkadot-core = { path = "../../primitives/polkadot-core" } -relay-substrate-client = { path = "../client-substrate" } +bp-polkadot-core = { workspace = true, default-features = true } +relay-substrate-client = { workspace = true } [dev-dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12" } -relay-substrate-client = { path = "../client-substrate", features = ["test-helpers"] } -sp-core = { path = "../../../substrate/primitives/core" } +codec = { workspace = true, default-features = true } +relay-substrate-client = { features = ["test-helpers"], workspace = true } +sp-core = { workspace = true, default-features = true } diff --git a/bridges/relays/utils/Cargo.toml b/bridges/relays/utils/Cargo.toml index 4765730a0b4..93e42763967 100644 --- a/bridges/relays/utils/Cargo.toml +++ b/bridges/relays/utils/Cargo.toml @@ -11,29 +11,29 @@ publish = false workspace = true [dependencies] -ansi_term = "0.12" -anyhow = "1.0" -async-std = "1.9.0" -async-trait = "0.1.79" -backoff = "0.4" -isahc = "1.2" -env_logger = "0.11.3" -futures = "0.3.30" -jsonpath_lib = "0.3" +ansi_term = { workspace = true } +anyhow = { workspace = true } +async-std = { workspace = true } +async-trait = { workspace = true } +backoff = { workspace = true } +isahc = { workspace = true } +env_logger = { workspace = true } +futures = { workspace = true } +jsonpath_lib = { workspace = true } log = { workspace = true } -num-traits = "0.2" -parking_lot = "0.12.1" +num-traits = { workspace = true, default-features = true } +parking_lot = { workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } -sysinfo = "0.30" -time = { version = "0.3", features = ["formatting", "local-offset", "std"] } -tokio = { version = "1.37", features = ["rt"] } +sysinfo = { workspace = true } +time = { features = ["formatting", "local-offset", "std"], workspace = true } +tokio = { features = ["rt"], workspace = true, default-features = true } thiserror = { workspace = true } # Bridge dependencies -bp-runtime = { path = "../../primitives/runtime" } +bp-runtime = { workspace = true, default-features = true } # Substrate dependencies -sp-runtime = { path = "../../../substrate/primitives/runtime" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../substrate/utils/prometheus" } +sp-runtime = { workspace = true, default-features = true } +prometheus-endpoint = { workspace = true, default-features = true } diff --git a/bridges/snowbridge/pallets/ethereum-client/Cargo.toml b/bridges/snowbridge/pallets/ethereum-client/Cargo.toml index cab2b06b093..666ac3fbc8a 100644 --- a/bridges/snowbridge/pallets/ethereum-client/Cargo.toml +++ b/bridges/snowbridge/pallets/ethereum-client/Cargo.toml @@ -17,34 +17,34 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { optional = true, workspace = true, default-features = true } serde_json = { optional = true, workspace = true, default-features = true } -codec = { version = "3.6.12", package = "parity-scale-codec", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1", optional = true } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +hex-literal = { optional = true, workspace = true, default-features = true } log = { workspace = true } -frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false, optional = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-std = { workspace = true } +sp-runtime = { workspace = true } +sp-io = { optional = true, workspace = true } -snowbridge-core = { path = "../../primitives/core", default-features = false } -snowbridge-ethereum = { path = "../../primitives/ethereum", default-features = false } -snowbridge-pallet-ethereum-client-fixtures = { path = "fixtures", default-features = false, optional = true } -snowbridge-beacon-primitives = { path = "../../primitives/beacon", default-features = false } -static_assertions = { version = "1.1.0", default-features = false } -pallet-timestamp = { path = "../../../../substrate/frame/timestamp", default-features = false, optional = true } +snowbridge-core = { workspace = true } +snowbridge-ethereum = { workspace = true } +snowbridge-pallet-ethereum-client-fixtures = { optional = true, workspace = true } +snowbridge-beacon-primitives = { workspace = true } +static_assertions = { workspace = true } +pallet-timestamp = { optional = true, workspace = true } [dev-dependencies] -rand = "0.8.5" -sp-keyring = { path = "../../../../substrate/primitives/keyring" } +rand = { workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } -hex-literal = "0.4.1" -pallet-timestamp = { path = "../../../../substrate/frame/timestamp" } -snowbridge-pallet-ethereum-client-fixtures = { path = "fixtures" } -sp-io = { path = "../../../../substrate/primitives/io" } +hex-literal = { workspace = true, default-features = true } +pallet-timestamp = { workspace = true, default-features = true } +snowbridge-pallet-ethereum-client-fixtures = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } serde = { workspace = true, default-features = true } [features] diff --git a/bridges/snowbridge/pallets/ethereum-client/fixtures/Cargo.toml b/bridges/snowbridge/pallets/ethereum-client/fixtures/Cargo.toml index 858e2513a96..bd417687573 100644 --- a/bridges/snowbridge/pallets/ethereum-client/fixtures/Cargo.toml +++ b/bridges/snowbridge/pallets/ethereum-client/fixtures/Cargo.toml @@ -15,11 +15,11 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -hex-literal = { version = "0.4.1" } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -snowbridge-core = { path = "../../../primitives/core", default-features = false } -snowbridge-beacon-primitives = { path = "../../../primitives/beacon", default-features = false } +hex-literal = { workspace = true, default-features = true } +sp-core = { workspace = true } +sp-std = { workspace = true } +snowbridge-core = { workspace = true } +snowbridge-beacon-primitives = { workspace = true } [features] default = ["std"] diff --git a/bridges/snowbridge/pallets/inbound-queue/Cargo.toml b/bridges/snowbridge/pallets/inbound-queue/Cargo.toml index d63398770f2..1b08bb39b43 100644 --- a/bridges/snowbridge/pallets/inbound-queue/Cargo.toml +++ b/bridges/snowbridge/pallets/inbound-queue/Cargo.toml @@ -16,35 +16,35 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { optional = true, workspace = true, default-features = true } -codec = { version = "3.6.12", package = "parity-scale-codec", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1", optional = true } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +hex-literal = { optional = true, workspace = true, default-features = true } log = { workspace = true } -alloy-primitives = { version = "0.4.2", default-features = false, features = ["rlp"] } -alloy-sol-types = { version = "0.4.2", default-features = false } +alloy-primitives = { features = ["rlp"], workspace = true } +alloy-sol-types = { workspace = true } -frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } -pallet-balances = { path = "../../../../substrate/frame/balances", default-features = false } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-balances = { workspace = true } +sp-core = { workspace = true } +sp-std = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } -xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm = { workspace = true } +xcm-executor = { workspace = true } -snowbridge-core = { path = "../../primitives/core", default-features = false } -snowbridge-router-primitives = { path = "../../primitives/router", default-features = false } -snowbridge-beacon-primitives = { path = "../../primitives/beacon", default-features = false } -snowbridge-pallet-inbound-queue-fixtures = { path = "fixtures", default-features = false, optional = true } +snowbridge-core = { workspace = true } +snowbridge-router-primitives = { workspace = true } +snowbridge-beacon-primitives = { workspace = true } +snowbridge-pallet-inbound-queue-fixtures = { optional = true, workspace = true } [dev-dependencies] -frame-benchmarking = { path = "../../../../substrate/frame/benchmarking" } -sp-keyring = { path = "../../../../substrate/primitives/keyring" } -snowbridge-pallet-ethereum-client = { path = "../ethereum-client" } -hex-literal = { version = "0.4.1" } +frame-benchmarking = { workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } +snowbridge-pallet-ethereum-client = { workspace = true, default-features = true } +hex-literal = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/snowbridge/pallets/inbound-queue/fixtures/Cargo.toml b/bridges/snowbridge/pallets/inbound-queue/fixtures/Cargo.toml index e84246fb5a5..b66b57c3620 100644 --- a/bridges/snowbridge/pallets/inbound-queue/fixtures/Cargo.toml +++ b/bridges/snowbridge/pallets/inbound-queue/fixtures/Cargo.toml @@ -15,11 +15,11 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -hex-literal = { version = "0.4.1" } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -snowbridge-core = { path = "../../../primitives/core", default-features = false } -snowbridge-beacon-primitives = { path = "../../../primitives/beacon", default-features = false } +hex-literal = { workspace = true, default-features = true } +sp-core = { workspace = true } +sp-std = { workspace = true } +snowbridge-core = { workspace = true } +snowbridge-beacon-primitives = { workspace = true } [features] default = ["std"] diff --git a/bridges/snowbridge/pallets/outbound-queue/Cargo.toml b/bridges/snowbridge/pallets/outbound-queue/Cargo.toml index 15c6c3a5b32..78546e258da 100644 --- a/bridges/snowbridge/pallets/outbound-queue/Cargo.toml +++ b/bridges/snowbridge/pallets/outbound-queue/Cargo.toml @@ -16,27 +16,27 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { features = ["alloc", "derive"], workspace = true } -codec = { version = "3.6.12", package = "parity-scale-codec", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } -frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } -sp-arithmetic = { path = "../../../../substrate/primitives/arithmetic", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-std = { workspace = true } +sp-runtime = { workspace = true } +sp-io = { workspace = true } +sp-arithmetic = { workspace = true } -bridge-hub-common = { path = "../../../../cumulus/parachains/runtimes/bridge-hubs/common", default-features = false } +bridge-hub-common = { workspace = true } -snowbridge-core = { path = "../../primitives/core", default-features = false, features = ["serde"] } -snowbridge-outbound-queue-merkle-tree = { path = "merkle-tree", default-features = false } -ethabi = { package = "ethabi-decode", version = "1.0.0", default-features = false } +snowbridge-core = { features = ["serde"], workspace = true } +snowbridge-outbound-queue-merkle-tree = { workspace = true } +ethabi = { workspace = true } [dev-dependencies] -pallet-message-queue = { path = "../../../../substrate/frame/message-queue", default-features = false } -sp-keyring = { path = "../../../../substrate/primitives/keyring" } +pallet-message-queue = { workspace = true } +sp-keyring = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml b/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml index 1b1a9905928..00cc700fbe8 100644 --- a/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml +++ b/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml @@ -15,18 +15,18 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { version = "3.6.12", package = "parity-scale-codec", default-features = false, features = ["derive"] } -scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-core = { workspace = true } +sp-runtime = { workspace = true } [dev-dependencies] -hex-literal = { version = "0.4.1" } -env_logger = "0.11" -hex = "0.4" -array-bytes = "6.2.2" -sp-crypto-hashing = { path = "../../../../../substrate/primitives/crypto/hashing" } +hex-literal = { workspace = true, default-features = true } +env_logger = { workspace = true } +hex = { workspace = true, default-features = true } +array-bytes = { workspace = true, default-features = true } +sp-crypto-hashing = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/snowbridge/pallets/outbound-queue/runtime-api/Cargo.toml b/bridges/snowbridge/pallets/outbound-queue/runtime-api/Cargo.toml index b8d704f1cb9..d35bdde5a81 100644 --- a/bridges/snowbridge/pallets/outbound-queue/runtime-api/Cargo.toml +++ b/bridges/snowbridge/pallets/outbound-queue/runtime-api/Cargo.toml @@ -15,12 +15,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { version = "3.6.12", package = "parity-scale-codec", features = ["derive"], default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -snowbridge-outbound-queue-merkle-tree = { path = "../merkle-tree", default-features = false } -snowbridge-core = { path = "../../../primitives/core", default-features = false } +codec = { features = ["derive"], workspace = true } +sp-std = { workspace = true } +sp-api = { workspace = true } +frame-support = { workspace = true } +snowbridge-outbound-queue-merkle-tree = { workspace = true } +snowbridge-core = { workspace = true } [features] default = ["std"] diff --git a/bridges/snowbridge/pallets/system/Cargo.toml b/bridges/snowbridge/pallets/system/Cargo.toml index 5bbbb1d9310..f1e749afb99 100644 --- a/bridges/snowbridge/pallets/system/Cargo.toml +++ b/bridges/snowbridge/pallets/system/Cargo.toml @@ -15,33 +15,33 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", -] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } +], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } log = { workspace = true } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } +sp-core = { workspace = true } +sp-std = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } -xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm = { workspace = true } +xcm-executor = { workspace = true } -snowbridge-core = { path = "../../primitives/core", default-features = false } +snowbridge-core = { workspace = true } [dev-dependencies] -hex = "0.4.1" -hex-literal = { version = "0.4.1" } -pallet-balances = { path = "../../../../substrate/frame/balances" } -sp-keyring = { path = "../../../../substrate/primitives/keyring" } -polkadot-primitives = { path = "../../../../polkadot/primitives" } -pallet-message-queue = { path = "../../../../substrate/frame/message-queue" } -snowbridge-pallet-outbound-queue = { path = "../outbound-queue" } +hex = { workspace = true, default-features = true } +hex-literal = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } +polkadot-primitives = { workspace = true, default-features = true } +pallet-message-queue = { workspace = true, default-features = true } +snowbridge-pallet-outbound-queue = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/snowbridge/pallets/system/runtime-api/Cargo.toml b/bridges/snowbridge/pallets/system/runtime-api/Cargo.toml index 42df5edfb7b..7c524dd2eda 100644 --- a/bridges/snowbridge/pallets/system/runtime-api/Cargo.toml +++ b/bridges/snowbridge/pallets/system/runtime-api/Cargo.toml @@ -15,13 +15,13 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", -] } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -snowbridge-core = { path = "../../../primitives/core", default-features = false } +], workspace = true } +sp-std = { workspace = true } +sp-api = { workspace = true } +xcm = { workspace = true } +snowbridge-core = { workspace = true } [features] default = ["std"] diff --git a/bridges/snowbridge/primitives/beacon/Cargo.toml b/bridges/snowbridge/primitives/beacon/Cargo.toml index 18123910c35..9ced99fbf3f 100644 --- a/bridges/snowbridge/primitives/beacon/Cargo.toml +++ b/bridges/snowbridge/primitives/beacon/Cargo.toml @@ -13,26 +13,26 @@ workspace = true [dependencies] serde = { optional = true, features = ["derive"], workspace = true, default-features = true } -hex = { version = "0.4", default-features = false } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -rlp = { version = "0.5", default-features = false } +hex = { workspace = true } +codec = { workspace = true } +scale-info = { features = ["derive"], workspace = true } +rlp = { workspace = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } +frame-support = { workspace = true } +sp-runtime = { workspace = true } +sp-core = { workspace = true } +sp-std = { workspace = true } +sp-io = { workspace = true } -ssz_rs = { version = "0.9.0", default-features = false } -ssz_rs_derive = { version = "0.9.0", default-features = false } -byte-slice-cast = { version = "1.2.1", default-features = false } +ssz_rs = { workspace = true } +ssz_rs_derive = { workspace = true } +byte-slice-cast = { workspace = true } -snowbridge-ethereum = { path = "../ethereum", default-features = false } -milagro-bls = { package = "snowbridge-milagro-bls", version = "1.5.4", default-features = false } +snowbridge-ethereum = { workspace = true } +milagro-bls = { workspace = true } [dev-dependencies] -hex-literal = { version = "0.4.1" } +hex-literal = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/snowbridge/primitives/core/Cargo.toml b/bridges/snowbridge/primitives/core/Cargo.toml index 573ab6608e5..f9bee1ff495 100644 --- a/bridges/snowbridge/primitives/core/Cargo.toml +++ b/bridges/snowbridge/primitives/core/Cargo.toml @@ -13,28 +13,28 @@ workspace = true [dependencies] serde = { optional = true, features = ["alloc", "derive"], workspace = true } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1" } +codec = { workspace = true } +scale-info = { features = ["derive"], workspace = true } +hex-literal = { workspace = true, default-features = true } -polkadot-parachain-primitives = { path = "../../../../polkadot/parachain", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../polkadot/xcm/xcm-builder", default-features = false } +polkadot-parachain-primitives = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-arithmetic = { path = "../../../../substrate/primitives/arithmetic", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-io = { workspace = true } +sp-core = { workspace = true } +sp-arithmetic = { workspace = true } -snowbridge-beacon-primitives = { path = "../beacon", default-features = false } +snowbridge-beacon-primitives = { workspace = true } -ethabi = { package = "ethabi-decode", version = "1.0.0", default-features = false } +ethabi = { workspace = true } [dev-dependencies] -hex = { version = "0.4.3" } +hex = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/snowbridge/primitives/ethereum/Cargo.toml b/bridges/snowbridge/primitives/ethereum/Cargo.toml index fb0b6cbaf3c..764ce90b813 100644 --- a/bridges/snowbridge/primitives/ethereum/Cargo.toml +++ b/bridges/snowbridge/primitives/ethereum/Cargo.toml @@ -14,23 +14,23 @@ workspace = true [dependencies] serde = { optional = true, features = ["derive"], workspace = true, default-features = true } serde-big-array = { optional = true, features = ["const-generics"], workspace = true } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -ethbloom = { version = "0.13.0", default-features = false } -ethereum-types = { version = "0.14.1", default-features = false, features = ["codec", "rlp", "serialize"] } -hex-literal = { version = "0.4.1", default-features = false } -parity-bytes = { version = "0.1.2", default-features = false } -rlp = { version = "0.5.2", default-features = false } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +ethbloom = { workspace = true } +ethereum-types = { features = ["codec", "rlp", "serialize"], workspace = true } +hex-literal = { workspace = true } +parity-bytes = { workspace = true } +rlp = { workspace = true } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } +sp-io = { workspace = true } +sp-std = { workspace = true } +sp-runtime = { workspace = true } -ethabi = { package = "ethabi-decode", version = "1.0.0", default-features = false } +ethabi = { workspace = true } [dev-dependencies] -wasm-bindgen-test = "0.3.19" -rand = "0.8.5" +wasm-bindgen-test = { workspace = true } +rand = { workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } [features] diff --git a/bridges/snowbridge/primitives/router/Cargo.toml b/bridges/snowbridge/primitives/router/Cargo.toml index ec0888dd41b..d744aa7f1d4 100644 --- a/bridges/snowbridge/primitives/router/Cargo.toml +++ b/bridges/snowbridge/primitives/router/Cargo.toml @@ -12,25 +12,25 @@ categories = ["cryptography::cryptocurrencies"] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +codec = { workspace = true } +scale-info = { features = ["derive"], workspace = true } log = { workspace = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } -xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm = { workspace = true } +xcm-executor = { workspace = true } -snowbridge-core = { path = "../core", default-features = false } +snowbridge-core = { workspace = true } -hex-literal = { version = "0.4.1" } +hex-literal = { workspace = true, default-features = true } [dev-dependencies] -rustc-hex = { version = "2.1.0" } +rustc-hex = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/bridges/snowbridge/runtime/runtime-common/Cargo.toml b/bridges/snowbridge/runtime/runtime-common/Cargo.toml index 2372908b86a..d47cb3cb710 100644 --- a/bridges/snowbridge/runtime/runtime-common/Cargo.toml +++ b/bridges/snowbridge/runtime/runtime-common/Cargo.toml @@ -13,15 +13,15 @@ workspace = true [dependencies] log = { workspace = true } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-arithmetic = { path = "../../../../substrate/primitives/arithmetic", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../polkadot/xcm/xcm-executor", default-features = false } +codec = { workspace = true } +frame-support = { workspace = true } +sp-std = { workspace = true } +sp-arithmetic = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } -snowbridge-core = { path = "../../primitives/core", default-features = false } +snowbridge-core = { workspace = true } [dev-dependencies] diff --git a/bridges/snowbridge/runtime/test-common/Cargo.toml b/bridges/snowbridge/runtime/test-common/Cargo.toml index e19c682de45..6f8e586bf5f 100644 --- a/bridges/snowbridge/runtime/test-common/Cargo.toml +++ b/bridges/snowbridge/runtime/test-common/Cargo.toml @@ -11,38 +11,38 @@ categories = ["cryptography::cryptocurrencies"] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } # Substrate -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } -pallet-balances = { path = "../../../../substrate/frame/balances", default-features = false } -pallet-session = { path = "../../../../substrate/frame/session", default-features = false } -pallet-message-queue = { path = "../../../../substrate/frame/message-queue", default-features = false } -pallet-timestamp = { path = "../../../../substrate/frame/timestamp", default-features = false } -pallet-utility = { path = "../../../../substrate/frame/utility", default-features = false } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } -sp-keyring = { path = "../../../../substrate/primitives/keyring" } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-balances = { workspace = true } +pallet-session = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-utility = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-keyring = { workspace = true, default-features = true } +sp-runtime = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../../polkadot/xcm/pallet-xcm", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../polkadot/xcm/xcm-executor", default-features = false } +pallet-xcm = { workspace = true } +xcm = { workspace = true } +xcm-executor = { workspace = true } # Cumulus -cumulus-pallet-parachain-system = { path = "../../../../cumulus/pallets/parachain-system", default-features = false } -pallet-collator-selection = { path = "../../../../cumulus/pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../../cumulus/parachains/pallets/parachain-info", default-features = false } -parachains-runtimes-test-utils = { path = "../../../../cumulus/parachains/runtimes/test-utils", default-features = false } +cumulus-pallet-parachain-system = { workspace = true } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-runtimes-test-utils = { workspace = true } # Ethereum Bridge (Snowbridge) -snowbridge-core = { path = "../../primitives/core", default-features = false } -snowbridge-pallet-ethereum-client = { path = "../../pallets/ethereum-client", default-features = false } -snowbridge-pallet-ethereum-client-fixtures = { path = "../../pallets/ethereum-client/fixtures", default-features = false } -snowbridge-pallet-outbound-queue = { path = "../../pallets/outbound-queue", default-features = false } -snowbridge-pallet-system = { path = "../../pallets/system", default-features = false } +snowbridge-core = { workspace = true } +snowbridge-pallet-ethereum-client = { workspace = true } +snowbridge-pallet-ethereum-client-fixtures = { workspace = true } +snowbridge-pallet-outbound-queue = { workspace = true } +snowbridge-pallet-system = { workspace = true } [features] default = ["std"] diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml index 410ac8b983d..9b6f6b73960 100644 --- a/cumulus/client/cli/Cargo.toml +++ b/cumulus/client/cli/Cargo.toml @@ -10,15 +10,15 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -clap = { version = "4.5.3", features = ["derive"] } -codec = { package = "parity-scale-codec", version = "3.6.12" } -url = "2.4.0" +clap = { features = ["derive"], workspace = true } +codec = { workspace = true, default-features = true } +url = { workspace = true } # Substrate -sc-cli = { path = "../../../substrate/client/cli" } -sc-client-api = { path = "../../../substrate/client/api" } -sc-chain-spec = { path = "../../../substrate/client/chain-spec" } -sc-service = { path = "../../../substrate/client/service" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-blockchain = { path = "../../../substrate/primitives/blockchain" } +sc-cli = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +sc-chain-spec = { workspace = true, default-features = true } +sc-service = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } diff --git a/cumulus/client/collator/Cargo.toml b/cumulus/client/collator/Cargo.toml index 39cedf87a0c..6ebde0c2c65 100644 --- a/cumulus/client/collator/Cargo.toml +++ b/cumulus/client/collator/Cargo.toml @@ -10,41 +10,41 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -parking_lot = "0.12.1" -codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"] } -futures = "0.3.30" -tracing = "0.1.25" +parking_lot = { workspace = true, default-features = true } +codec = { features = ["derive"], workspace = true, default-features = true } +futures = { workspace = true } +tracing = { workspace = true, default-features = true } # Substrate -sc-client-api = { path = "../../../substrate/client/api" } -sp-consensus = { path = "../../../substrate/primitives/consensus/common" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } +sc-client-api = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } # Polkadot -polkadot-node-primitives = { path = "../../../polkadot/node/primitives" } -polkadot-node-subsystem = { path = "../../../polkadot/node/subsystem" } -polkadot-overseer = { path = "../../../polkadot/node/overseer" } -polkadot-primitives = { path = "../../../polkadot/primitives" } +polkadot-node-primitives = { workspace = true, default-features = true } +polkadot-node-subsystem = { workspace = true, default-features = true } +polkadot-overseer = { workspace = true, default-features = true } +polkadot-primitives = { workspace = true, default-features = true } # Cumulus -cumulus-client-consensus-common = { path = "../consensus/common" } -cumulus-client-network = { path = "../network" } -cumulus-primitives-core = { path = "../../primitives/core" } +cumulus-client-consensus-common = { workspace = true, default-features = true } +cumulus-client-network = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true, default-features = true } [dev-dependencies] -async-trait = "0.1.79" +async-trait = { workspace = true } # Substrate -sp-maybe-compressed-blob = { path = "../../../substrate/primitives/maybe-compressed-blob" } -sp-state-machine = { path = "../../../substrate/primitives/state-machine" } -sp-tracing = { path = "../../../substrate/primitives/tracing" } +sp-maybe-compressed-blob = { workspace = true, default-features = true } +sp-state-machine = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } # Polkadot -polkadot-node-subsystem-test-helpers = { path = "../../../polkadot/node/subsystem-test-helpers" } +polkadot-node-subsystem-test-helpers = { workspace = true } # Cumulus -cumulus-test-client = { path = "../../test/client" } -cumulus-test-runtime = { path = "../../test/runtime" } -cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder" } +cumulus-test-client = { workspace = true } +cumulus-test-runtime = { workspace = true } +cumulus-test-relay-sproof-builder = { workspace = true, default-features = true } diff --git a/cumulus/client/consensus/aura/Cargo.toml b/cumulus/client/consensus/aura/Cargo.toml index fad30e59e86..c473b2113dd 100644 --- a/cumulus/client/consensus/aura/Cargo.toml +++ b/cumulus/client/consensus/aura/Cargo.toml @@ -10,44 +10,44 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.79" -codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"] } -futures = "0.3.28" -tracing = "0.1.37" -schnellru = "0.2.1" +async-trait = { workspace = true } +codec = { features = ["derive"], workspace = true, default-features = true } +futures = { workspace = true } +tracing = { workspace = true, default-features = true } +schnellru = { workspace = true } # Substrate -sc-client-api = { path = "../../../../substrate/client/api" } -sc-consensus = { path = "../../../../substrate/client/consensus/common" } -sc-consensus-aura = { path = "../../../../substrate/client/consensus/aura" } -sc-consensus-babe = { path = "../../../../substrate/client/consensus/babe" } -sc-consensus-slots = { path = "../../../../substrate/client/consensus/slots" } -sc-telemetry = { path = "../../../../substrate/client/telemetry" } -sp-api = { path = "../../../../substrate/primitives/api" } -sp-application-crypto = { path = "../../../../substrate/primitives/application-crypto" } -sp-block-builder = { path = "../../../../substrate/primitives/block-builder" } -sp-blockchain = { path = "../../../../substrate/primitives/blockchain" } -sp-consensus = { path = "../../../../substrate/primitives/consensus/common" } -sp-consensus-aura = { path = "../../../../substrate/primitives/consensus/aura" } -sp-core = { path = "../../../../substrate/primitives/core" } -sp-inherents = { path = "../../../../substrate/primitives/inherents" } -sp-keystore = { path = "../../../../substrate/primitives/keystore" } -sp-runtime = { path = "../../../../substrate/primitives/runtime" } -sp-timestamp = { path = "../../../../substrate/primitives/timestamp" } -sp-state-machine = { path = "../../../../substrate/primitives/state-machine" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../../substrate/utils/prometheus" } +sc-client-api = { workspace = true, default-features = true } +sc-consensus = { workspace = true, default-features = true } +sc-consensus-aura = { workspace = true, default-features = true } +sc-consensus-babe = { workspace = true, default-features = true } +sc-consensus-slots = { workspace = true, default-features = true } +sc-telemetry = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-application-crypto = { workspace = true, default-features = true } +sp-block-builder = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-consensus-aura = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-inherents = { workspace = true, default-features = true } +sp-keystore = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-timestamp = { workspace = true, default-features = true } +sp-state-machine = { workspace = true, default-features = true } +prometheus-endpoint = { workspace = true, default-features = true } # Cumulus -cumulus-client-consensus-common = { path = "../common" } -cumulus-relay-chain-interface = { path = "../../relay-chain-interface" } -cumulus-client-consensus-proposer = { path = "../proposer" } -cumulus-client-parachain-inherent = { path = "../../parachain-inherent" } -cumulus-primitives-aura = { path = "../../../primitives/aura" } -cumulus-primitives-core = { path = "../../../primitives/core" } -cumulus-client-collator = { path = "../../collator" } +cumulus-client-consensus-common = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } +cumulus-client-consensus-proposer = { workspace = true, default-features = true } +cumulus-client-parachain-inherent = { workspace = true, default-features = true } +cumulus-primitives-aura = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-client-collator = { workspace = true, default-features = true } # Polkadot -polkadot-primitives = { path = "../../../../polkadot/primitives" } -polkadot-node-primitives = { path = "../../../../polkadot/node/primitives" } -polkadot-node-subsystem = { path = "../../../../polkadot/node/subsystem" } -polkadot-overseer = { path = "../../../../polkadot/node/overseer" } +polkadot-primitives = { workspace = true, default-features = true } +polkadot-node-primitives = { workspace = true, default-features = true } +polkadot-node-subsystem = { workspace = true, default-features = true } +polkadot-overseer = { workspace = true, default-features = true } diff --git a/cumulus/client/consensus/common/Cargo.toml b/cumulus/client/consensus/common/Cargo.toml index 09c2f58d45e..4bc2f1d1e60 100644 --- a/cumulus/client/consensus/common/Cargo.toml +++ b/cumulus/client/consensus/common/Cargo.toml @@ -10,42 +10,42 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.79" -codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"] } -dyn-clone = "1.0.16" -futures = "0.3.28" +async-trait = { workspace = true } +codec = { features = ["derive"], workspace = true, default-features = true } +dyn-clone = { workspace = true } +futures = { workspace = true } log = { workspace = true, default-features = true } -tracing = "0.1.37" +tracing = { workspace = true, default-features = true } # Substrate -sc-client-api = { path = "../../../../substrate/client/api" } -sc-consensus = { path = "../../../../substrate/client/consensus/common" } -sc-consensus-babe = { path = "../../../../substrate/client/consensus/babe" } -sp-blockchain = { path = "../../../../substrate/primitives/blockchain" } -sp-consensus = { path = "../../../../substrate/primitives/consensus/common" } -sp-consensus-slots = { path = "../../../../substrate/primitives/consensus/slots" } -sp-core = { path = "../../../../substrate/primitives/core" } -sp-runtime = { path = "../../../../substrate/primitives/runtime" } -sp-timestamp = { path = "../../../../substrate/primitives/timestamp" } -sp-trie = { path = "../../../../substrate/primitives/trie" } -sp-version = { path = "../../../../substrate/primitives/version" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../../substrate/utils/prometheus" } +sc-client-api = { workspace = true, default-features = true } +sc-consensus = { workspace = true, default-features = true } +sc-consensus-babe = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-consensus-slots = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-timestamp = { workspace = true, default-features = true } +sp-trie = { workspace = true, default-features = true } +sp-version = { workspace = true, default-features = true } +prometheus-endpoint = { workspace = true, default-features = true } # Polkadot -polkadot-primitives = { path = "../../../../polkadot/primitives" } +polkadot-primitives = { workspace = true, default-features = true } # Cumulus -cumulus-primitives-core = { path = "../../../primitives/core" } -cumulus-relay-chain-interface = { path = "../../relay-chain-interface" } -cumulus-client-pov-recovery = { path = "../../pov-recovery" } -schnellru = "0.2.1" +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } +cumulus-client-pov-recovery = { workspace = true, default-features = true } +schnellru = { workspace = true } [dev-dependencies] -futures-timer = "3.0.2" +futures-timer = { workspace = true } # Substrate -sp-tracing = { path = "../../../../substrate/primitives/tracing" } +sp-tracing = { workspace = true, default-features = true } # Cumulus -cumulus-test-client = { path = "../../../test/client" } -cumulus-test-relay-sproof-builder = { path = "../../../test/relay-sproof-builder" } +cumulus-test-client = { workspace = true } +cumulus-test-relay-sproof-builder = { workspace = true, default-features = true } diff --git a/cumulus/client/consensus/proposer/Cargo.toml b/cumulus/client/consensus/proposer/Cargo.toml index 42ca4e06f8f..ce91d48bf58 100644 --- a/cumulus/client/consensus/proposer/Cargo.toml +++ b/cumulus/client/consensus/proposer/Cargo.toml @@ -10,15 +10,15 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -anyhow = "1.0" -async-trait = "0.1.79" +anyhow = { workspace = true } +async-trait = { workspace = true } thiserror = { workspace = true } # Substrate -sp-consensus = { path = "../../../../substrate/primitives/consensus/common" } -sp-inherents = { path = "../../../../substrate/primitives/inherents" } -sp-runtime = { path = "../../../../substrate/primitives/runtime" } -sp-state-machine = { path = "../../../../substrate/primitives/state-machine" } +sp-consensus = { workspace = true, default-features = true } +sp-inherents = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-state-machine = { workspace = true, default-features = true } # Cumulus -cumulus-primitives-parachain-inherent = { path = "../../../primitives/parachain-inherent" } +cumulus-primitives-parachain-inherent = { workspace = true, default-features = true } diff --git a/cumulus/client/consensus/relay-chain/Cargo.toml b/cumulus/client/consensus/relay-chain/Cargo.toml index 7c3a901db6c..f3ee6fc2f7d 100644 --- a/cumulus/client/consensus/relay-chain/Cargo.toml +++ b/cumulus/client/consensus/relay-chain/Cargo.toml @@ -10,23 +10,23 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.79" -futures = "0.3.28" -parking_lot = "0.12.1" -tracing = "0.1.37" +async-trait = { workspace = true } +futures = { workspace = true } +parking_lot = { workspace = true, default-features = true } +tracing = { workspace = true, default-features = true } # Substrate -sc-consensus = { path = "../../../../substrate/client/consensus/common" } -sp-api = { path = "../../../../substrate/primitives/api" } -sp-block-builder = { path = "../../../../substrate/primitives/block-builder" } -sp-blockchain = { path = "../../../../substrate/primitives/blockchain" } -sp-consensus = { path = "../../../../substrate/primitives/consensus/common" } -sp-core = { path = "../../../../substrate/primitives/core" } -sp-inherents = { path = "../../../../substrate/primitives/inherents" } -sp-runtime = { path = "../../../../substrate/primitives/runtime" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../../substrate/utils/prometheus" } +sc-consensus = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-block-builder = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-inherents = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +prometheus-endpoint = { workspace = true, default-features = true } # Cumulus -cumulus-client-consensus-common = { path = "../common" } -cumulus-primitives-core = { path = "../../../primitives/core" } -cumulus-relay-chain-interface = { path = "../../relay-chain-interface" } +cumulus-client-consensus-common = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } diff --git a/cumulus/client/network/Cargo.toml b/cumulus/client/network/Cargo.toml index 0dd7c4fdb0f..bc67678eede 100644 --- a/cumulus/client/network/Cargo.toml +++ b/cumulus/client/network/Cargo.toml @@ -10,51 +10,51 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.79" -codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"] } -futures = "0.3.28" -futures-timer = "3.0.2" -parking_lot = "0.12.1" -tracing = "0.1.37" +async-trait = { workspace = true } +codec = { features = ["derive"], workspace = true, default-features = true } +futures = { workspace = true } +futures-timer = { workspace = true } +parking_lot = { workspace = true, default-features = true } +tracing = { workspace = true, default-features = true } # Substrate -sc-client-api = { path = "../../../substrate/client/api" } -sp-blockchain = { path = "../../../substrate/primitives/blockchain" } -sp-consensus = { path = "../../../substrate/primitives/consensus/common" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-state-machine = { path = "../../../substrate/primitives/state-machine" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-version = { path = "../../../substrate/primitives/version" } +sc-client-api = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-state-machine = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-version = { workspace = true, default-features = true } # Polkadot -polkadot-node-primitives = { path = "../../../polkadot/node/primitives" } -polkadot-parachain-primitives = { path = "../../../polkadot/parachain" } -polkadot-primitives = { path = "../../../polkadot/primitives" } -polkadot-node-subsystem = { path = "../../../polkadot/node/subsystem" } +polkadot-node-primitives = { workspace = true, default-features = true } +polkadot-parachain-primitives = { workspace = true, default-features = true } +polkadot-primitives = { workspace = true, default-features = true } +polkadot-node-subsystem = { workspace = true, default-features = true } # Cumulus -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } +cumulus-relay-chain-interface = { workspace = true, default-features = true } [dev-dependencies] -portpicker = "0.1.1" -tokio = { version = "1.32.0", features = ["macros"] } -url = "2.4.0" -rstest = "0.18.2" +portpicker = { workspace = true } +tokio = { features = ["macros"], workspace = true, default-features = true } +url = { workspace = true } +rstest = { workspace = true } # Substrate -sc-cli = { path = "../../../substrate/client/cli" } -sc-client-api = { path = "../../../substrate/client/api" } -sp-consensus = { path = "../../../substrate/primitives/consensus/common" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-keyring = { path = "../../../substrate/primitives/keyring" } -sp-keystore = { path = "../../../substrate/primitives/keystore" } -substrate-test-utils = { path = "../../../substrate/test-utils" } +sc-cli = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } +sp-keystore = { workspace = true, default-features = true } +substrate-test-utils = { workspace = true } # Polkadot -polkadot-test-client = { path = "../../../polkadot/node/test/client" } +polkadot-test-client = { workspace = true } # Cumulus -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-relay-chain-inprocess-interface = { path = "../relay-chain-inprocess-interface" } -cumulus-test-service = { path = "../../test/service" } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-relay-chain-inprocess-interface = { workspace = true, default-features = true } +cumulus-test-service = { workspace = true } diff --git a/cumulus/client/parachain-inherent/Cargo.toml b/cumulus/client/parachain-inherent/Cargo.toml index 85619e84034..9d346ce17f5 100644 --- a/cumulus/client/parachain-inherent/Cargo.toml +++ b/cumulus/client/parachain-inherent/Cargo.toml @@ -7,24 +7,24 @@ description = "Inherent that needs to be present in every parachain block. Conta license = "Apache-2.0" [dependencies] -async-trait = "0.1.79" -codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"] } -scale-info = { version = "2.11.1", features = ["derive"] } -tracing = { version = "0.1.37" } +async-trait = { workspace = true } +codec = { features = ["derive"], workspace = true, default-features = true } +scale-info = { features = ["derive"], workspace = true, default-features = true } +tracing = { workspace = true, default-features = true } # Substrate -sc-client-api = { path = "../../../substrate/client/api" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-crypto-hashing = { path = "../../../substrate/primitives/crypto/hashing" } -sp-inherents = { path = "../../../substrate/primitives/inherents" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-state-machine = { path = "../../../substrate/primitives/state-machine" } -sp-std = { path = "../../../substrate/primitives/std" } -sp-storage = { path = "../../../substrate/primitives/storage" } -sp-trie = { path = "../../../substrate/primitives/trie" } +sc-client-api = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-crypto-hashing = { workspace = true, default-features = true } +sp-inherents = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-state-machine = { workspace = true, default-features = true } +sp-std = { workspace = true, default-features = true } +sp-storage = { workspace = true, default-features = true } +sp-trie = { workspace = true, default-features = true } # Cumulus -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } -cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder" } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-primitives-parachain-inherent = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } +cumulus-test-relay-sproof-builder = { workspace = true, default-features = true } diff --git a/cumulus/client/pov-recovery/Cargo.toml b/cumulus/client/pov-recovery/Cargo.toml index 539802d6938..a95b24bc293 100644 --- a/cumulus/client/pov-recovery/Cargo.toml +++ b/cumulus/client/pov-recovery/Cargo.toml @@ -10,46 +10,46 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"] } -futures = "0.3.28" -futures-timer = "3.0.2" -rand = "0.8.5" -tracing = "0.1.37" +codec = { features = ["derive"], workspace = true, default-features = true } +futures = { workspace = true } +futures-timer = { workspace = true } +rand = { workspace = true, default-features = true } +tracing = { workspace = true, default-features = true } # Substrate -sc-client-api = { path = "../../../substrate/client/api" } -sc-consensus = { path = "../../../substrate/client/consensus/common" } -sp-consensus = { path = "../../../substrate/primitives/consensus/common" } -sp-maybe-compressed-blob = { path = "../../../substrate/primitives/maybe-compressed-blob" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-version = { path = "../../../substrate/primitives/version" } +sc-client-api = { workspace = true, default-features = true } +sc-consensus = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-maybe-compressed-blob = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-version = { workspace = true, default-features = true } # Polkadot -polkadot-node-primitives = { path = "../../../polkadot/node/primitives" } -polkadot-node-subsystem = { path = "../../../polkadot/node/subsystem" } -polkadot-overseer = { path = "../../../polkadot/node/overseer" } -polkadot-primitives = { path = "../../../polkadot/primitives" } +polkadot-node-primitives = { workspace = true, default-features = true } +polkadot-node-subsystem = { workspace = true, default-features = true } +polkadot-overseer = { workspace = true, default-features = true } +polkadot-primitives = { workspace = true, default-features = true } # Cumulus -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } -async-trait = "0.1.79" +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } +async-trait = { workspace = true } [dev-dependencies] -rstest = "0.18.2" -tokio = { version = "1.32.0", features = ["macros"] } -portpicker = "0.1.1" -sp-blockchain = { path = "../../../substrate/primitives/blockchain" } -cumulus-test-client = { path = "../../test/client" } -sc-utils = { path = "../../../substrate/client/utils" } -sp-tracing = { path = "../../../substrate/primitives/tracing" } -assert_matches = "1.5" +rstest = { workspace = true } +tokio = { features = ["macros"], workspace = true, default-features = true } +portpicker = { workspace = true } +sp-blockchain = { workspace = true, default-features = true } +cumulus-test-client = { workspace = true } +sc-utils = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } +assert_matches = { workspace = true } # Cumulus -cumulus-test-service = { path = "../../test/service" } +cumulus-test-service = { workspace = true } # Substrate -sc-cli = { path = "../../../substrate/client/cli" } -sc-client-api = { path = "../../../substrate/client/api" } -substrate-test-utils = { path = "../../../substrate/test-utils" } +sc-cli = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +substrate-test-utils = { workspace = true } diff --git a/cumulus/client/relay-chain-inprocess-interface/Cargo.toml b/cumulus/client/relay-chain-inprocess-interface/Cargo.toml index 7629b6c631a..6f1b74191be 100644 --- a/cumulus/client/relay-chain-inprocess-interface/Cargo.toml +++ b/cumulus/client/relay-chain-inprocess-interface/Cargo.toml @@ -10,39 +10,39 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.79" -futures = "0.3.28" -futures-timer = "3.0.2" +async-trait = { workspace = true } +futures = { workspace = true } +futures-timer = { workspace = true } # Substrate -sc-cli = { path = "../../../substrate/client/cli" } -sc-client-api = { path = "../../../substrate/client/api" } -sc-telemetry = { path = "../../../substrate/client/telemetry" } -sc-tracing = { path = "../../../substrate/client/tracing" } -sc-sysinfo = { path = "../../../substrate/client/sysinfo" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-consensus = { path = "../../../substrate/primitives/consensus/common" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-state-machine = { path = "../../../substrate/primitives/state-machine" } +sc-cli = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +sc-telemetry = { workspace = true, default-features = true } +sc-tracing = { workspace = true, default-features = true } +sc-sysinfo = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-state-machine = { workspace = true, default-features = true } # Polkadot -polkadot-cli = { path = "../../../polkadot/cli", default-features = false, features = ["cli"] } -polkadot-service = { path = "../../../polkadot/node/service" } +polkadot-cli = { features = ["cli"], workspace = true } +polkadot-service = { workspace = true, default-features = true } # Cumulus -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } [dev-dependencies] # Substrate -sp-keyring = { path = "../../../substrate/primitives/keyring" } +sp-keyring = { workspace = true, default-features = true } # Polkadot -polkadot-primitives = { path = "../../../polkadot/primitives" } -polkadot-test-client = { path = "../../../polkadot/node/test/client" } -metered = { package = "prioritized-metered-channel", version = "0.6.1", default-features = false, features = ["futures_channel"] } +polkadot-primitives = { workspace = true, default-features = true } +polkadot-test-client = { workspace = true } +metered = { features = ["futures_channel"], workspace = true } # Cumulus -cumulus-test-service = { path = "../../test/service" } +cumulus-test-service = { workspace = true } diff --git a/cumulus/client/relay-chain-interface/Cargo.toml b/cumulus/client/relay-chain-interface/Cargo.toml index e8603693ac8..a496fab050d 100644 --- a/cumulus/client/relay-chain-interface/Cargo.toml +++ b/cumulus/client/relay-chain-interface/Cargo.toml @@ -10,18 +10,18 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -polkadot-overseer = { path = "../../../polkadot/node/overseer" } +polkadot-overseer = { workspace = true, default-features = true } -cumulus-primitives-core = { path = "../../primitives/core" } +cumulus-primitives-core = { workspace = true, default-features = true } -sp-api = { path = "../../../substrate/primitives/api" } -sp-blockchain = { path = "../../../substrate/primitives/blockchain" } -sp-state-machine = { path = "../../../substrate/primitives/state-machine" } -sc-client-api = { path = "../../../substrate/client/api" } -sp-version = { path = "../../../substrate/primitives/version", default-features = false } +sp-api = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-state-machine = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +sp-version = { workspace = true } -futures = "0.3.28" -async-trait = "0.1.79" +futures = { workspace = true } +async-trait = { workspace = true } thiserror = { workspace = true } -jsonrpsee-core = "0.22" -codec = { package = "parity-scale-codec", version = "3.6.12" } +jsonrpsee-core = { workspace = true } +codec = { workspace = true, default-features = true } diff --git a/cumulus/client/relay-chain-minimal-node/Cargo.toml b/cumulus/client/relay-chain-minimal-node/Cargo.toml index 0b541092a3d..1d89316d400 100644 --- a/cumulus/client/relay-chain-minimal-node/Cargo.toml +++ b/cumulus/client/relay-chain-minimal-node/Cargo.toml @@ -11,44 +11,44 @@ workspace = true [dependencies] # polkadot deps -polkadot-primitives = { path = "../../../polkadot/primitives" } -polkadot-core-primitives = { path = "../../../polkadot/core-primitives" } -polkadot-overseer = { path = "../../../polkadot/node/overseer" } -polkadot-node-subsystem-util = { path = "../../../polkadot/node/subsystem-util" } -polkadot-node-network-protocol = { path = "../../../polkadot/node/network/protocol" } +polkadot-primitives = { workspace = true, default-features = true } +polkadot-core-primitives = { workspace = true, default-features = true } +polkadot-overseer = { workspace = true, default-features = true } +polkadot-node-subsystem-util = { workspace = true, default-features = true } +polkadot-node-network-protocol = { workspace = true, default-features = true } -polkadot-availability-recovery = { path = "../../../polkadot/node/network/availability-recovery" } -polkadot-collator-protocol = { path = "../../../polkadot/node/network/collator-protocol" } -polkadot-network-bridge = { path = "../../../polkadot/node/network/bridge" } -polkadot-node-collation-generation = { path = "../../../polkadot/node/collation-generation" } -polkadot-node-core-runtime-api = { path = "../../../polkadot/node/core/runtime-api" } -polkadot-node-core-chain-api = { path = "../../../polkadot/node/core/chain-api" } -polkadot-node-core-prospective-parachains = { path = "../../../polkadot/node/core/prospective-parachains" } -polkadot-service = { path = "../../../polkadot/node/service" } +polkadot-availability-recovery = { workspace = true, default-features = true } +polkadot-collator-protocol = { workspace = true, default-features = true } +polkadot-network-bridge = { workspace = true, default-features = true } +polkadot-node-collation-generation = { workspace = true, default-features = true } +polkadot-node-core-runtime-api = { workspace = true, default-features = true } +polkadot-node-core-chain-api = { workspace = true, default-features = true } +polkadot-node-core-prospective-parachains = { workspace = true, default-features = true } +polkadot-service = { workspace = true, default-features = true } # substrate deps -sc-authority-discovery = { path = "../../../substrate/client/authority-discovery" } -sc-network = { path = "../../../substrate/client/network" } -sc-network-common = { path = "../../../substrate/client/network/common" } -sc-service = { path = "../../../substrate/client/service" } -sc-client-api = { path = "../../../substrate/client/api" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../substrate/utils/prometheus" } -sc-tracing = { path = "../../../substrate/client/tracing" } -sc-utils = { path = "../../../substrate/client/utils" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-consensus-babe = { path = "../../../substrate/primitives/consensus/babe" } -sp-consensus = { path = "../../../substrate/primitives/consensus/common" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-blockchain = { path = "../../../substrate/primitives/blockchain" } -tokio = { version = "1.32.0", features = ["macros"] } +sc-authority-discovery = { workspace = true, default-features = true } +sc-network = { workspace = true, default-features = true } +sc-network-common = { workspace = true, default-features = true } +sc-service = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +prometheus-endpoint = { workspace = true, default-features = true } +sc-tracing = { workspace = true, default-features = true } +sc-utils = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-consensus-babe = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +tokio = { features = ["macros"], workspace = true, default-features = true } # cumulus deps -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } -cumulus-relay-chain-rpc-interface = { path = "../relay-chain-rpc-interface" } -cumulus-primitives-core = { path = "../../primitives/core" } +cumulus-relay-chain-interface = { workspace = true, default-features = true } +cumulus-relay-chain-rpc-interface = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true, default-features = true } -array-bytes = "6.2.2" -tracing = "0.1.37" -async-trait = "0.1.79" -futures = "0.3.28" -parking_lot = "0.12.1" +array-bytes = { workspace = true, default-features = true } +tracing = { workspace = true, default-features = true } +async-trait = { workspace = true } +futures = { workspace = true } +parking_lot = { workspace = true, default-features = true } diff --git a/cumulus/client/relay-chain-rpc-interface/Cargo.toml b/cumulus/client/relay-chain-rpc-interface/Cargo.toml index ea6bc2ede4c..6c0730a56a2 100644 --- a/cumulus/client/relay-chain-rpc-interface/Cargo.toml +++ b/cumulus/client/relay-chain-rpc-interface/Cargo.toml @@ -10,39 +10,39 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -polkadot-overseer = { path = "../../../polkadot/node/overseer" } +polkadot-overseer = { workspace = true, default-features = true } -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } -sp-api = { path = "../../../substrate/primitives/api" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-consensus-babe = { path = "../../../substrate/primitives/consensus/babe" } -sp-authority-discovery = { path = "../../../substrate/primitives/authority-discovery" } -sp-state-machine = { path = "../../../substrate/primitives/state-machine" } -sp-storage = { path = "../../../substrate/primitives/storage" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-version = { path = "../../../substrate/primitives/version" } -sc-client-api = { path = "../../../substrate/client/api" } -sc-rpc-api = { path = "../../../substrate/client/rpc-api" } -sc-service = { path = "../../../substrate/client/service" } +sp-api = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-consensus-babe = { workspace = true, default-features = true } +sp-authority-discovery = { workspace = true, default-features = true } +sp-state-machine = { workspace = true, default-features = true } +sp-storage = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-version = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +sc-rpc-api = { workspace = true, default-features = true } +sc-service = { workspace = true, default-features = true } -tokio = { version = "1.32.0", features = ["sync"] } -tokio-util = { version = "0.7.8", features = ["compat"] } +tokio = { features = ["sync"], workspace = true, default-features = true } +tokio-util = { features = ["compat"], workspace = true } -futures = "0.3.28" -futures-timer = "3.0.2" -codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.22", features = ["ws-client"] } -tracing = "0.1.37" -async-trait = "0.1.79" -url = "2.4.0" +futures = { workspace = true } +futures-timer = { workspace = true } +codec = { workspace = true, default-features = true } +jsonrpsee = { features = ["ws-client"], workspace = true } +tracing = { workspace = true, default-features = true } +async-trait = { workspace = true } +url = { workspace = true } serde_json = { workspace = true, default-features = true } serde = { workspace = true, default-features = true } -schnellru = "0.2.1" -smoldot = { version = "0.11.0", default_features = false, features = ["std"] } -smoldot-light = { version = "0.9.0", default_features = false, features = ["std"] } -either = "1.8.1" +schnellru = { workspace = true } +smoldot = { default_features = false, features = ["std"], workspace = true } +smoldot-light = { default_features = false, features = ["std"], workspace = true } +either = { workspace = true, default-features = true } thiserror = { workspace = true } -rand = "0.8.5" -pin-project = "1.1.3" +rand = { workspace = true, default-features = true } +pin-project = { workspace = true } diff --git a/cumulus/client/service/Cargo.toml b/cumulus/client/service/Cargo.toml index e03e20fe5b4..8e9e41ca89d 100644 --- a/cumulus/client/service/Cargo.toml +++ b/cumulus/client/service/Cargo.toml @@ -10,39 +10,39 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -futures = "0.3.28" +futures = { workspace = true } # Substrate -sc-client-api = { path = "../../../substrate/client/api" } -sc-consensus = { path = "../../../substrate/client/consensus/common" } -sc-transaction-pool = { path = "../../../substrate/client/transaction-pool" } -sc-rpc = { path = "../../../substrate/client/rpc" } -sc-service = { path = "../../../substrate/client/service" } -sc-sysinfo = { path = "../../../substrate/client/sysinfo" } -sc-telemetry = { path = "../../../substrate/client/telemetry" } -sc-network = { path = "../../../substrate/client/network" } -sc-network-sync = { path = "../../../substrate/client/network/sync" } -sc-utils = { path = "../../../substrate/client/utils" } -sc-network-transactions = { path = "../../../substrate/client/network/transactions" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-blockchain = { path = "../../../substrate/primitives/blockchain" } -sp-consensus = { path = "../../../substrate/primitives/consensus/common" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-transaction-pool = { path = "../../../substrate/primitives/transaction-pool" } -sp-io = { path = "../../../substrate/primitives/io" } +sc-client-api = { workspace = true, default-features = true } +sc-consensus = { workspace = true, default-features = true } +sc-transaction-pool = { workspace = true, default-features = true } +sc-rpc = { workspace = true, default-features = true } +sc-service = { workspace = true, default-features = true } +sc-sysinfo = { workspace = true, default-features = true } +sc-telemetry = { workspace = true, default-features = true } +sc-network = { workspace = true, default-features = true } +sc-network-sync = { workspace = true, default-features = true } +sc-utils = { workspace = true, default-features = true } +sc-network-transactions = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-transaction-pool = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } # Polkadot -polkadot-primitives = { path = "../../../polkadot/primitives" } +polkadot-primitives = { workspace = true, default-features = true } # Cumulus -cumulus-client-cli = { path = "../cli" } -cumulus-client-collator = { path = "../collator" } -cumulus-client-consensus-common = { path = "../consensus/common" } -cumulus-client-pov-recovery = { path = "../pov-recovery" } -cumulus-client-network = { path = "../network" } -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-primitives-proof-size-hostfunction = { path = "../../primitives/proof-size-hostfunction" } -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } -cumulus-relay-chain-inprocess-interface = { path = "../relay-chain-inprocess-interface" } -cumulus-relay-chain-minimal-node = { path = "../relay-chain-minimal-node" } +cumulus-client-cli = { workspace = true, default-features = true } +cumulus-client-collator = { workspace = true, default-features = true } +cumulus-client-consensus-common = { workspace = true, default-features = true } +cumulus-client-pov-recovery = { workspace = true, default-features = true } +cumulus-client-network = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-primitives-proof-size-hostfunction = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } +cumulus-relay-chain-inprocess-interface = { workspace = true, default-features = true } +cumulus-relay-chain-minimal-node = { workspace = true, default-features = true } diff --git a/cumulus/pallets/aura-ext/Cargo.toml b/cumulus/pallets/aura-ext/Cargo.toml index daff5ef8f48..1b6ac4cf07d 100644 --- a/cumulus/pallets/aura-ext/Cargo.toml +++ b/cumulus/pallets/aura-ext/Cargo.toml @@ -10,26 +10,26 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -pallet-aura = { path = "../../../substrate/frame/aura", default-features = false } -pallet-timestamp = { path = "../../../substrate/frame/timestamp", default-features = false } -sp-application-crypto = { path = "../../../substrate/primitives/application-crypto", default-features = false } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-aura = { workspace = true } +pallet-timestamp = { workspace = true } +sp-application-crypto = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } # Cumulus -cumulus-pallet-parachain-system = { path = "../parachain-system", default-features = false } +cumulus-pallet-parachain-system = { workspace = true } [dev-dependencies] # Cumulus -cumulus-pallet-parachain-system = { path = "../parachain-system" } +cumulus-pallet-parachain-system = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/pallets/collator-selection/Cargo.toml b/cumulus/pallets/collator-selection/Cargo.toml index f30802fa5d8..206700b7d60 100644 --- a/cumulus/pallets/collator-selection/Cargo.toml +++ b/cumulus/pallets/collator-selection/Cargo.toml @@ -17,29 +17,29 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] log = { workspace = true } -codec = { default-features = false, features = ["derive"], package = "parity-scale-codec", version = "3.6.12" } -rand = { version = "0.8.5", features = ["std_rng"], default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +rand = { features = ["std_rng"], workspace = true } +scale-info = { features = ["derive"], workspace = true } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-staking = { path = "../../../substrate/primitives/staking", default-features = false } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -pallet-authorship = { path = "../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } -pallet-session = { path = "../../../substrate/frame/session", default-features = false } +sp-std = { workspace = true } +sp-runtime = { workspace = true } +sp-staking = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-session = { workspace = true } -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-benchmarking = { optional = true, workspace = true } [dev-dependencies] -sp-core = { path = "../../../substrate/primitives/core" } -sp-io = { path = "../../../substrate/primitives/io" } -sp-tracing = { path = "../../../substrate/primitives/tracing" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -pallet-timestamp = { path = "../../../substrate/frame/timestamp" } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura" } -pallet-aura = { path = "../../../substrate/frame/aura" } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +pallet-timestamp = { workspace = true, default-features = true } +sp-consensus-aura = { workspace = true, default-features = true } +pallet-aura = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/pallets/dmp-queue/Cargo.toml b/cumulus/pallets/dmp-queue/Cargo.toml index 687cda164fb..052a2547e78 100644 --- a/cumulus/pallets/dmp-queue/Cargo.toml +++ b/cumulus/pallets/dmp-queue/Cargo.toml @@ -14,26 +14,26 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-std = { workspace = true } +sp-runtime = { workspace = true } +sp-io = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } +xcm = { workspace = true } # Cumulus -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } +cumulus-primitives-core = { workspace = true } [dev-dependencies] -sp-core = { path = "../../../substrate/primitives/core" } -sp-tracing = { path = "../../../substrate/primitives/tracing" } +sp-core = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/pallets/parachain-system/Cargo.toml b/cumulus/pallets/parachain-system/Cargo.toml index 1a6a19f2ab4..30a232f01b3 100644 --- a/cumulus/pallets/parachain-system/Cargo.toml +++ b/cumulus/pallets/parachain-system/Cargo.toml @@ -10,62 +10,62 @@ license = "Apache-2.0" workspace = true [dependencies] -bytes = { version = "1.4.0", default-features = false } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -environmental = { version = "1.1.4", default-features = false } -impl-trait-for-tuples = "0.2.1" +bytes = { workspace = true } +codec = { features = ["derive"], workspace = true } +environmental = { workspace = true } +impl-trait-for-tuples = { workspace = true } log = { workspace = true } -trie-db = { version = "0.29.0", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +trie-db = { workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -pallet-message-queue = { path = "../../../substrate/frame/message-queue", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-externalities = { path = "../../../substrate/primitives/externalities", default-features = false } -sp-inherents = { path = "../../../substrate/primitives/inherents", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-state-machine = { path = "../../../substrate/primitives/state-machine", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } -sp-version = { path = "../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-message-queue = { workspace = true } +sp-core = { workspace = true } +sp-externalities = { workspace = true } +sp-inherents = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-state-machine = { workspace = true } +sp-std = { workspace = true } +sp-trie = { workspace = true } +sp-version = { workspace = true } # Polkadot -polkadot-parachain-primitives = { path = "../../../polkadot/parachain", default-features = false, features = ["wasm-api"] } -polkadot-runtime-parachains = { path = "../../../polkadot/runtime/parachains", default-features = false } -polkadot-runtime-common = { path = "../../../polkadot/runtime/common", default-features = false, optional = true } -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } +polkadot-parachain-primitives = { features = ["wasm-api"], workspace = true } +polkadot-runtime-parachains = { workspace = true } +polkadot-runtime-common = { optional = true, workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } # Cumulus -cumulus-pallet-parachain-system-proc-macro = { path = "proc-macro", default-features = false } -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent", default-features = false } -cumulus-primitives-proof-size-hostfunction = { path = "../../primitives/proof-size-hostfunction", default-features = false } +cumulus-pallet-parachain-system-proc-macro = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-parachain-inherent = { workspace = true } +cumulus-primitives-proof-size-hostfunction = { workspace = true } [dev-dependencies] -assert_matches = "1.5" -hex-literal = "0.4.1" -lazy_static = "1.4" -trie-standardmap = "0.16.0" -rand = "0.8.5" -futures = "0.3.28" +assert_matches = { workspace = true } +hex-literal = { workspace = true, default-features = true } +lazy_static = { workspace = true } +trie-standardmap = { workspace = true } +rand = { workspace = true, default-features = true } +futures = { workspace = true } # Substrate -sc-client-api = { path = "../../../substrate/client/api" } -sp-keyring = { path = "../../../substrate/primitives/keyring" } -sp-crypto-hashing = { path = "../../../substrate/primitives/crypto/hashing" } -sp-tracing = { path = "../../../substrate/primitives/tracing" } -sp-version = { path = "../../../substrate/primitives/version" } -sp-consensus-slots = { path = "../../../substrate/primitives/consensus/slots" } +sc-client-api = { workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } +sp-crypto-hashing = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } +sp-version = { workspace = true, default-features = true } +sp-consensus-slots = { workspace = true, default-features = true } # Cumulus -cumulus-test-client = { path = "../../test/client" } -cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder" } -cumulus-test-runtime = { path = "../../test/runtime" } +cumulus-test-client = { workspace = true } +cumulus-test-relay-sproof-builder = { workspace = true, default-features = true } +cumulus-test-runtime = { workspace = true } [features] default = ["std"] diff --git a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml index 0a90c30e033..da6f0fd03ef 100644 --- a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml +++ b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml @@ -14,9 +14,9 @@ proc-macro = true [dependencies] syn = { workspace = true } -proc-macro2 = "1.0.64" +proc-macro2 = { workspace = true } quote = { workspace = true } -proc-macro-crate = "3.0.0" +proc-macro-crate = { workspace = true } [features] default = ["std"] diff --git a/cumulus/pallets/session-benchmarking/Cargo.toml b/cumulus/pallets/session-benchmarking/Cargo.toml index 62c923de59f..df671566cdc 100644 --- a/cumulus/pallets/session-benchmarking/Cargo.toml +++ b/cumulus/pallets/session-benchmarking/Cargo.toml @@ -16,13 +16,13 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } -pallet-session = { path = "../../../substrate/frame/session", default-features = false } +codec = { workspace = true } +sp-std = { workspace = true } +sp-runtime = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-benchmarking = { optional = true, workspace = true } +pallet-session = { workspace = true } [features] default = ["std"] diff --git a/cumulus/pallets/solo-to-para/Cargo.toml b/cumulus/pallets/solo-to-para/Cargo.toml index 17b0fb2a016..ced1b24f1d2 100644 --- a/cumulus/pallets/solo-to-para/Cargo.toml +++ b/cumulus/pallets/solo-to-para/Cargo.toml @@ -10,21 +10,21 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -pallet-sudo = { path = "../../../substrate/frame/sudo", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-sudo = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } # Polkadot -polkadot-primitives = { path = "../../../polkadot/primitives", default-features = false } +polkadot-primitives = { workspace = true } # Cumulus -cumulus-pallet-parachain-system = { path = "../parachain-system", default-features = false } +cumulus-pallet-parachain-system = { workspace = true } [features] default = ["std"] diff --git a/cumulus/pallets/xcm/Cargo.toml b/cumulus/pallets/xcm/Cargo.toml index 178d981702f..1f0cef70e3a 100644 --- a/cumulus/pallets/xcm/Cargo.toml +++ b/cumulus/pallets/xcm/Cargo.toml @@ -10,18 +10,18 @@ description = "Pallet for stuff specific to parachains' usage of XCM" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } +sp-std = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } +xcm = { workspace = true } -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } +cumulus-primitives-core = { workspace = true } [features] default = ["std"] diff --git a/cumulus/pallets/xcmp-queue/Cargo.toml b/cumulus/pallets/xcmp-queue/Cargo.toml index 87602978521..c542fa373b5 100644 --- a/cumulus/pallets/xcmp-queue/Cargo.toml +++ b/cumulus/pallets/xcmp-queue/Cargo.toml @@ -10,45 +10,45 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"], default-features = false } +codec = { features = ["derive"], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -pallet-message-queue = { path = "../../../substrate/frame/message-queue", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-io = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +pallet-message-queue = { workspace = true } # Polkadot -polkadot-runtime-common = { path = "../../../polkadot/runtime/common", default-features = false } -polkadot-runtime-parachains = { path = "../../../polkadot/runtime/parachains", default-features = false } -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } +polkadot-runtime-common = { workspace = true } +polkadot-runtime-parachains = { workspace = true } +xcm = { workspace = true } +xcm-executor = { workspace = true } +xcm-builder = { workspace = true } # Cumulus -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } +cumulus-primitives-core = { workspace = true } # Optional import for benchmarking -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } -bounded-collections = { version = "0.2.0", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +bounded-collections = { workspace = true } # Bridges -bp-xcm-bridge-hub-router = { path = "../../../bridges/primitives/xcm-bridge-hub-router", default-features = false, optional = true } +bp-xcm-bridge-hub-router = { optional = true, workspace = true } [dev-dependencies] # Substrate -sp-core = { path = "../../../substrate/primitives/core" } -pallet-balances = { path = "../../../substrate/frame/balances" } -frame-support = { path = "../../../substrate/frame/support", features = ["experimental"] } +sp-core = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +frame-support = { features = ["experimental"], workspace = true, default-features = true } # Cumulus -cumulus-pallet-parachain-system = { path = "../parachain-system" } +cumulus-pallet-parachain-system = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/common/Cargo.toml b/cumulus/parachains/common/Cargo.toml index 2b943b6dca5..6eac9a09672 100644 --- a/cumulus/parachains/common/Cargo.toml +++ b/cumulus/parachains/common/Cargo.toml @@ -13,42 +13,42 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"], default-features = false } +codec = { features = ["derive"], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -pallet-asset-tx-payment = { path = "../../../substrate/frame/transaction-payment/asset-tx-payment", default-features = false } -pallet-assets = { path = "../../../substrate/frame/assets", default-features = false } -pallet-authorship = { path = "../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../substrate/frame/message-queue", default-features = false } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-asset-tx-payment = { workspace = true } +pallet-assets = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../polkadot/xcm/pallet-xcm", default-features = false } -polkadot-primitives = { path = "../../../polkadot/primitives", default-features = false } -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../polkadot/xcm/xcm-executor", default-features = false } +pallet-xcm = { workspace = true } +polkadot-primitives = { workspace = true } +xcm = { workspace = true } +xcm-executor = { workspace = true } # Cumulus -pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../primitives/utility", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../pallets/parachain-info", default-features = false } +pallet-collator-selection = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +parachain-info = { workspace = true } [dev-dependencies] -pallet-authorship = { path = "../../../substrate/frame/authorship", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } +pallet-authorship = { workspace = true } +sp-io = { workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder" } +substrate-wasm-builder = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml index 8100e681348..7bd91ae6774 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml @@ -13,16 +13,16 @@ workspace = true [dependencies] # Substrate -sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } -frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } +sp-core = { workspace = true } +frame-support = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../../common" } -cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } -emulated-integration-tests-common = { path = "../../../../common", default-features = false } -asset-hub-rococo-runtime = { path = "../../../../../../runtimes/assets/asset-hub-rococo" } -rococo-emulated-chain = { path = "../../../relays/rococo" } -testnet-parachains-constants = { path = "../../../../../../runtimes/constants", features = ["rococo"] } +parachains-common = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true } +emulated-integration-tests-common = { workspace = true } +asset-hub-rococo-runtime = { workspace = true, default-features = true } +rococo-emulated-chain = { workspace = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true, default-features = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../../../../polkadot/xcm", default-features = false } +xcm = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml index e0abaa66c5c..86d4ce3e7ac 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml @@ -13,16 +13,16 @@ workspace = true [dependencies] # Substrate -sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } -frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } +sp-core = { workspace = true } +frame-support = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../../common" } -cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } -emulated-integration-tests-common = { path = "../../../../common", default-features = false } -asset-hub-westend-runtime = { path = "../../../../../../runtimes/assets/asset-hub-westend" } -westend-emulated-chain = { path = "../../../relays/westend" } -testnet-parachains-constants = { path = "../../../../../../runtimes/constants", features = ["westend"] } +parachains-common = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true } +emulated-integration-tests-common = { workspace = true } +asset-hub-westend-runtime = { workspace = true } +westend-emulated-chain = { workspace = true, default-features = true } +testnet-parachains-constants = { features = ["westend"], workspace = true, default-features = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../../../../polkadot/xcm", default-features = false } +xcm = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml index 789f10a35f2..f3c0799ad0f 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml @@ -13,12 +13,12 @@ workspace = true [dependencies] # Substrate -sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } -frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } +sp-core = { workspace = true } +frame-support = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../../common" } -emulated-integration-tests-common = { path = "../../../../common", default-features = false } -bridge-hub-rococo-runtime = { path = "../../../../../../runtimes/bridge-hubs/bridge-hub-rococo" } -bridge-hub-common = { path = "../../../../../../runtimes/bridge-hubs/common", default-features = false } -testnet-parachains-constants = { path = "../../../../../../runtimes/constants", features = ["rococo"] } +parachains-common = { workspace = true, default-features = true } +emulated-integration-tests-common = { workspace = true } +bridge-hub-rococo-runtime = { workspace = true, default-features = true } +bridge-hub-common = { workspace = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true, default-features = true } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml index d82971cf55a..ebcec9641e7 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml @@ -13,12 +13,12 @@ workspace = true [dependencies] # Substrate -sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } -frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } +sp-core = { workspace = true } +frame-support = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../../common" } -emulated-integration-tests-common = { path = "../../../../common", default-features = false } -bridge-hub-westend-runtime = { path = "../../../../../../runtimes/bridge-hubs/bridge-hub-westend" } -bridge-hub-common = { path = "../../../../../../runtimes/bridge-hubs/common", default-features = false } -testnet-parachains-constants = { path = "../../../../../../runtimes/constants", features = ["westend"] } +parachains-common = { workspace = true, default-features = true } +emulated-integration-tests-common = { workspace = true } +bridge-hub-westend-runtime = { workspace = true, default-features = true } +bridge-hub-common = { workspace = true } +testnet-parachains-constants = { features = ["westend"], workspace = true, default-features = true } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml index 4c2a7d3c274..87dfd73ab05 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml @@ -13,12 +13,12 @@ workspace = true [dependencies] # Substrate -sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } -frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } +sp-core = { workspace = true } +frame-support = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../../common" } -cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } -emulated-integration-tests-common = { path = "../../../../common", default-features = false } -collectives-westend-runtime = { path = "../../../../../../runtimes/collectives/collectives-westend" } -testnet-parachains-constants = { path = "../../../../../../runtimes/constants", features = ["westend"] } +parachains-common = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true } +emulated-integration-tests-common = { workspace = true } +collectives-westend-runtime = { workspace = true } +testnet-parachains-constants = { features = ["westend"], workspace = true, default-features = true } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml index f7fe93d2777..1549d6a2ab6 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml @@ -10,12 +10,12 @@ publish = false [dependencies] # Substrate -sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } -frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } +sp-core = { workspace = true } +frame-support = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../../common" } -cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } -emulated-integration-tests-common = { path = "../../../../common", default-features = false } -people-rococo-runtime = { path = "../../../../../../runtimes/people/people-rococo" } -testnet-parachains-constants = { path = "../../../../../../runtimes/constants", features = ["rococo"] } +parachains-common = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true } +emulated-integration-tests-common = { workspace = true } +people-rococo-runtime = { workspace = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true, default-features = true } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml index 57a767e0c2a..9c5ac0bca9d 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml @@ -10,12 +10,12 @@ publish = false [dependencies] # Substrate -sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } -frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } +sp-core = { workspace = true } +frame-support = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../../common" } -cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } -emulated-integration-tests-common = { path = "../../../../common", default-features = false } -people-westend-runtime = { path = "../../../../../../runtimes/people/people-westend" } -testnet-parachains-constants = { path = "../../../../../../runtimes/constants", features = ["westend"] } +parachains-common = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true } +emulated-integration-tests-common = { workspace = true } +people-westend-runtime = { workspace = true } +testnet-parachains-constants = { features = ["westend"], workspace = true, default-features = true } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml index 2ac508273c6..9e6b14b5859 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml @@ -13,14 +13,14 @@ workspace = true [dependencies] # Substrate -sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } -frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } +sp-core = { workspace = true } +frame-support = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../../../../polkadot/xcm", default-features = false } +xcm = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../../common" } -cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } -emulated-integration-tests-common = { path = "../../../../common", default-features = false } -penpal-runtime = { path = "../../../../../../runtimes/testing/penpal" } +parachains-common = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true } +emulated-integration-tests-common = { workspace = true } +penpal-runtime = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml index 113036b4c00..9376687947e 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml @@ -13,17 +13,17 @@ workspace = true [dependencies] # Substrate -sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } -sp-authority-discovery = { path = "../../../../../../../substrate/primitives/authority-discovery", default-features = false } -sp-consensus-babe = { path = "../../../../../../../substrate/primitives/consensus/babe", default-features = false } -sp-consensus-beefy = { path = "../../../../../../../substrate/primitives/consensus/beefy" } -sc-consensus-grandpa = { path = "../../../../../../../substrate/client/consensus/grandpa", default-features = false } +sp-core = { workspace = true } +sp-authority-discovery = { workspace = true } +sp-consensus-babe = { workspace = true } +sp-consensus-beefy = { workspace = true, default-features = true } +sc-consensus-grandpa = { workspace = true } # Polkadot -polkadot-primitives = { path = "../../../../../../../polkadot/primitives", default-features = false } -rococo-runtime-constants = { path = "../../../../../../../polkadot/runtime/rococo/constants", default-features = false } -rococo-runtime = { path = "../../../../../../../polkadot/runtime/rococo" } +polkadot-primitives = { workspace = true } +rococo-runtime-constants = { workspace = true } +rococo-runtime = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../common" } -emulated-integration-tests-common = { path = "../../../common", default-features = false } +parachains-common = { workspace = true, default-features = true } +emulated-integration-tests-common = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml index b952477c47a..010bfc57002 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml @@ -13,21 +13,21 @@ workspace = true [dependencies] # Substrate -sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } -sp-authority-discovery = { path = "../../../../../../../substrate/primitives/authority-discovery", default-features = false } -sp-consensus-babe = { path = "../../../../../../../substrate/primitives/consensus/babe", default-features = false } -sp-consensus-beefy = { path = "../../../../../../../substrate/primitives/consensus/beefy" } -sc-consensus-grandpa = { path = "../../../../../../../substrate/client/consensus/grandpa", default-features = false } -pallet-staking = { path = "../../../../../../../substrate/frame/staking", default-features = false } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-authority-discovery = { workspace = true } +sp-consensus-babe = { workspace = true } +sp-consensus-beefy = { workspace = true, default-features = true } +sc-consensus-grandpa = { workspace = true } +pallet-staking = { workspace = true } # Polkadot -polkadot-primitives = { path = "../../../../../../../polkadot/primitives", default-features = false } -westend-runtime-constants = { path = "../../../../../../../polkadot/runtime/westend/constants", default-features = false } -westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" } -xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +polkadot-primitives = { workspace = true } +westend-runtime-constants = { workspace = true } +westend-runtime = { workspace = true } +xcm = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../common" } -emulated-integration-tests-common = { path = "../../../common", default-features = false } +parachains-common = { workspace = true, default-features = true } +emulated-integration-tests-common = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml index d9ec8132323..7152f1dbc27 100644 --- a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml @@ -10,37 +10,37 @@ description = "Common resources for integration testing with xcm-emulator" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -paste = "1.0.14" +codec = { workspace = true } +paste = { workspace = true, default-features = true } # Substrate -sp-consensus-beefy = { path = "../../../../../substrate/primitives/consensus/beefy" } -sc-consensus-grandpa = { path = "../../../../../substrate/client/consensus/grandpa" } -sp-authority-discovery = { path = "../../../../../substrate/primitives/authority-discovery" } -sp-runtime = { path = "../../../../../substrate/primitives/runtime" } -frame-support = { path = "../../../../../substrate/frame/support" } -sp-core = { path = "../../../../../substrate/primitives/core" } -sp-consensus-babe = { path = "../../../../../substrate/primitives/consensus/babe" } -pallet-assets = { path = "../../../../../substrate/frame/assets" } -pallet-balances = { path = "../../../../../substrate/frame/balances" } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue" } +sp-consensus-beefy = { workspace = true, default-features = true } +sc-consensus-grandpa = { workspace = true, default-features = true } +sp-authority-discovery = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +frame-support = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-consensus-babe = { workspace = true, default-features = true } +pallet-assets = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +pallet-message-queue = { workspace = true, default-features = true } # Polkadot -polkadot-primitives = { path = "../../../../../polkadot/primitives" } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain" } -polkadot-runtime-parachains = { path = "../../../../../polkadot/runtime/parachains" } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm" } -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm" } +polkadot-primitives = { workspace = true, default-features = true } +polkadot-parachain-primitives = { workspace = true, default-features = true } +polkadot-runtime-parachains = { workspace = true, default-features = true } +xcm = { workspace = true, default-features = true } +pallet-xcm = { workspace = true, default-features = true } # Cumulus -parachains-common = { path = "../../../common" } -cumulus-primitives-core = { path = "../../../../primitives/core" } -xcm-emulator = { path = "../../../../xcm/xcm-emulator" } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue" } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system" } -asset-test-utils = { path = "../../../runtimes/assets/test-utils" } +parachains-common = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true, default-features = true } +xcm-emulator = { workspace = true, default-features = true } +cumulus-pallet-xcmp-queue = { workspace = true, default-features = true } +cumulus-pallet-parachain-system = { workspace = true, default-features = true } +asset-test-utils = { workspace = true, default-features = true } # Bridges -bp-messages = { path = "../../../../../bridges/primitives/messages" } -pallet-bridge-messages = { path = "../../../../../bridges/modules/messages" } -bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common" } +bp-messages = { workspace = true, default-features = true } +pallet-bridge-messages = { workspace = true, default-features = true } +bridge-runtime-common = { workspace = true, default-features = true } diff --git a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml index eb0a8a850d0..298be7362ec 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml @@ -12,9 +12,9 @@ workspace = true [dependencies] # Cumulus -emulated-integration-tests-common = { path = "../../common", default-features = false } -rococo-emulated-chain = { path = "../../chains/relays/rococo" } -asset-hub-rococo-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-rococo" } -bridge-hub-rococo-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-rococo" } -people-rococo-emulated-chain = { path = "../../chains/parachains/people/people-rococo" } -penpal-emulated-chain = { path = "../../chains/parachains/testing/penpal" } +emulated-integration-tests-common = { workspace = true } +rococo-emulated-chain = { workspace = true } +asset-hub-rococo-emulated-chain = { workspace = true } +bridge-hub-rococo-emulated-chain = { workspace = true } +people-rococo-emulated-chain = { workspace = true } +penpal-emulated-chain = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml index 744cbe4f8c1..cd0cb272b7f 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml @@ -12,11 +12,11 @@ workspace = true [dependencies] # Cumulus -emulated-integration-tests-common = { path = "../../common", default-features = false } -rococo-emulated-chain = { path = "../../chains/relays/rococo" } -westend-emulated-chain = { path = "../../chains/relays/westend" } -asset-hub-rococo-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-rococo" } -asset-hub-westend-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-westend" } -bridge-hub-rococo-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-rococo" } -bridge-hub-westend-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-westend" } -penpal-emulated-chain = { path = "../../chains/parachains/testing/penpal" } +emulated-integration-tests-common = { workspace = true } +rococo-emulated-chain = { workspace = true } +westend-emulated-chain = { workspace = true, default-features = true } +asset-hub-rococo-emulated-chain = { workspace = true } +asset-hub-westend-emulated-chain = { workspace = true } +bridge-hub-rococo-emulated-chain = { workspace = true } +bridge-hub-westend-emulated-chain = { workspace = true } +penpal-emulated-chain = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml index 64bc91f442d..37c14aa3035 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml @@ -12,10 +12,10 @@ workspace = true [dependencies] # Cumulus -emulated-integration-tests-common = { path = "../../common", default-features = false } -westend-emulated-chain = { path = "../../chains/relays/westend", default-features = false } -asset-hub-westend-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-westend" } -bridge-hub-westend-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-westend" } -collectives-westend-emulated-chain = { path = "../../chains/parachains/collectives/collectives-westend" } -penpal-emulated-chain = { path = "../../chains/parachains/testing/penpal" } -people-westend-emulated-chain = { path = "../../chains/parachains/people/people-westend" } +emulated-integration-tests-common = { workspace = true } +westend-emulated-chain = { workspace = true } +asset-hub-westend-emulated-chain = { workspace = true } +bridge-hub-westend-emulated-chain = { workspace = true } +collectives-westend-emulated-chain = { workspace = true } +penpal-emulated-chain = { workspace = true } +people-westend-emulated-chain = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml index 9abecbecc48..19d3bb3cb29 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml @@ -11,32 +11,32 @@ publish = false workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -assert_matches = "1.5.0" +codec = { workspace = true } +assert_matches = { workspace = true } # Substrate -sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } -frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } -pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } -pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } -pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false } -pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue", default-features = false } -pallet-treasury = { path = "../../../../../../../substrate/frame/treasury", default-features = false } -pallet-utility = { path = "../../../../../../../substrate/frame/utility", default-features = false } +sp-runtime = { workspace = true } +frame-support = { workspace = true } +pallet-balances = { workspace = true } +pallet-assets = { workspace = true } +pallet-asset-conversion = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-treasury = { workspace = true } +pallet-utility = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } -pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false } -rococo-runtime = { path = "../../../../../../../polkadot/runtime/rococo" } -polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common" } -rococo-runtime-constants = { path = "../../../../../../../polkadot/runtime/rococo/constants" } +xcm = { workspace = true } +pallet-xcm = { workspace = true } +xcm-executor = { workspace = true } +rococo-runtime = { workspace = true } +polkadot-runtime-common = { workspace = true, default-features = true } +rococo-runtime-constants = { workspace = true, default-features = true } # Cumulus -asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" } -cumulus-pallet-parachain-system = { path = "../../../../../../pallets/parachain-system", default-features = false } -parachains-common = { path = "../../../../../common" } -asset-hub-rococo-runtime = { path = "../../../../../runtimes/assets/asset-hub-rococo" } -penpal-runtime = { path = "../../../../../runtimes/testing/penpal" } -emulated-integration-tests-common = { path = "../../../common", default-features = false } -rococo-system-emulated-network = { path = "../../../networks/rococo-system" } +asset-test-utils = { workspace = true, default-features = true } +cumulus-pallet-parachain-system = { workspace = true } +parachains-common = { workspace = true, default-features = true } +asset-hub-rococo-runtime = { workspace = true, default-features = true } +penpal-runtime = { workspace = true } +emulated-integration-tests-common = { workspace = true } +rococo-system-emulated-network = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml index e0f29cd801c..185f9db196e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml @@ -11,38 +11,38 @@ publish = false workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -assert_matches = "1.5.0" +codec = { workspace = true } +assert_matches = { workspace = true } # Substrate -sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } -sp-keyring = { path = "../../../../../../../substrate/primitives/keyring", default-features = false } -sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } -frame-metadata-hash-extension = { path = "../../../../../../../substrate/frame/metadata-hash-extension" } -frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../../../substrate/frame/system", default-features = false } -pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } -pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } -pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false } -pallet-treasury = { path = "../../../../../../../substrate/frame/treasury", default-features = false } -pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue", default-features = false } -pallet-transaction-payment = { path = "../../../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-asset-tx-payment = { path = "../../../../../../../substrate/frame/transaction-payment/asset-tx-payment", default-features = false } +sp-runtime = { workspace = true } +sp-keyring = { workspace = true } +sp-core = { workspace = true } +frame-metadata-hash-extension = { workspace = true, default-features = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-balances = { workspace = true } +pallet-assets = { workspace = true } +pallet-asset-conversion = { workspace = true } +pallet-treasury = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-asset-tx-payment = { workspace = true } # Polkadot -polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common" } -xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false } -pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } -westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" } +polkadot-runtime-common = { workspace = true, default-features = true } +xcm = { workspace = true } +xcm-executor = { workspace = true } +pallet-xcm = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } +westend-runtime = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../common" } -penpal-runtime = { path = "../../../../../runtimes/testing/penpal" } -asset-hub-westend-runtime = { path = "../../../../../runtimes/assets/asset-hub-westend" } -asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" } -cumulus-pallet-xcmp-queue = { path = "../../../../../../pallets/xcmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../../../pallets/parachain-system", default-features = false } -emulated-integration-tests-common = { path = "../../../common", default-features = false } -westend-system-emulated-network = { path = "../../../networks/westend-system" } +parachains-common = { workspace = true, default-features = true } +penpal-runtime = { workspace = true } +asset-hub-westend-runtime = { workspace = true } +asset-test-utils = { workspace = true, default-features = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +emulated-integration-tests-common = { workspace = true } +westend-system-emulated-network = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml index bed5af92f6e..23dee370bf3 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml @@ -11,40 +11,40 @@ publish = false workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -hex-literal = "0.4.1" +codec = { workspace = true } +scale-info = { features = ["derive"], workspace = true } +hex-literal = { workspace = true, default-features = true } # Substrate -sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } -frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } -pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } -pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false } -pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue" } -sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } +sp-core = { workspace = true } +frame-support = { workspace = true } +pallet-assets = { workspace = true } +pallet-asset-conversion = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true, default-features = true } +sp-runtime = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } -pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm = { workspace = true } +pallet-xcm = { workspace = true } +xcm-executor = { workspace = true } # Bridges -pallet-bridge-messages = { path = "../../../../../../../bridges/modules/messages", default-features = false } +pallet-bridge-messages = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../common" } -testnet-parachains-constants = { path = "../../../../../runtimes/constants", features = ["rococo"] } -cumulus-pallet-xcmp-queue = { path = "../../../../../../pallets/xcmp-queue", default-features = false } -bridge-hub-rococo-runtime = { path = "../../../../../runtimes/bridge-hubs/bridge-hub-rococo", default-features = false } -emulated-integration-tests-common = { path = "../../../common", default-features = false } -rococo-westend-system-emulated-network = { path = "../../../networks/rococo-westend-system" } -rococo-system-emulated-network = { path = "../../../networks/rococo-system" } -asset-hub-rococo-runtime = { path = "../../../../../runtimes/assets/asset-hub-rococo", default-features = false } +parachains-common = { workspace = true, default-features = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true, default-features = true } +cumulus-pallet-xcmp-queue = { workspace = true } +bridge-hub-rococo-runtime = { workspace = true } +emulated-integration-tests-common = { workspace = true } +rococo-westend-system-emulated-network = { workspace = true } +rococo-system-emulated-network = { workspace = true } +asset-hub-rococo-runtime = { workspace = true } # Snowbridge -snowbridge-core = { path = "../../../../../../../bridges/snowbridge/primitives/core", default-features = false } -snowbridge-router-primitives = { path = "../../../../../../../bridges/snowbridge/primitives/router", default-features = false } -snowbridge-pallet-system = { path = "../../../../../../../bridges/snowbridge/pallets/system", default-features = false } -snowbridge-pallet-outbound-queue = { path = "../../../../../../../bridges/snowbridge/pallets/outbound-queue", default-features = false } -snowbridge-pallet-inbound-queue-fixtures = { path = "../../../../../../../bridges/snowbridge/pallets/inbound-queue/fixtures" } +snowbridge-core = { workspace = true } +snowbridge-router-primitives = { workspace = true } +snowbridge-pallet-system = { workspace = true } +snowbridge-pallet-outbound-queue = { workspace = true } +snowbridge-pallet-inbound-queue-fixtures = { workspace = true, default-features = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml index 6aebf8862d6..9ea8d0b81bd 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml @@ -13,24 +13,24 @@ workspace = true [dependencies] # Substrate -frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } -pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } -pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false } -pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue" } -sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } +frame-support = { workspace = true } +pallet-assets = { workspace = true } +pallet-asset-conversion = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true, default-features = true } +sp-runtime = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } -pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm = { workspace = true } +pallet-xcm = { workspace = true } +xcm-executor = { workspace = true } # Bridges -pallet-bridge-messages = { path = "../../../../../../../bridges/modules/messages", default-features = false } +pallet-bridge-messages = { workspace = true } # Cumulus -parachains-common = { path = "../../../../../common" } -cumulus-pallet-xcmp-queue = { path = "../../../../../../pallets/xcmp-queue", default-features = false } -bridge-hub-westend-runtime = { path = "../../../../../runtimes/bridge-hubs/bridge-hub-westend", default-features = false } -emulated-integration-tests-common = { path = "../../../common", default-features = false } -rococo-westend-system-emulated-network = { path = "../../../networks/rococo-westend-system" } +parachains-common = { workspace = true, default-features = true } +cumulus-pallet-xcmp-queue = { workspace = true } +bridge-hub-westend-runtime = { workspace = true } +emulated-integration-tests-common = { workspace = true } +rococo-westend-system-emulated-network = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/Cargo.toml index 297f68de621..c546132fa63 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/Cargo.toml @@ -11,33 +11,33 @@ publish = false workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -assert_matches = "1.5.0" +codec = { workspace = true } +assert_matches = { workspace = true } # Substrate -sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } -frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } -pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } -pallet-asset-rate = { path = "../../../../../../../substrate/frame/asset-rate", default-features = false } -pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } -pallet-treasury = { path = "../../../../../../../substrate/frame/treasury", default-features = false } -pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue", default-features = false } -pallet-utility = { path = "../../../../../../../substrate/frame/utility", default-features = false } +sp-runtime = { workspace = true } +frame-support = { workspace = true } +pallet-balances = { workspace = true } +pallet-asset-rate = { workspace = true } +pallet-assets = { workspace = true } +pallet-treasury = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-utility = { workspace = true } # Polkadot -polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common" } -xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false } -pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false } -westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" } -westend-runtime-constants = { path = "../../../../../../../polkadot/runtime/westend/constants" } +polkadot-runtime-common = { workspace = true, default-features = true } +xcm = { workspace = true } +xcm-executor = { workspace = true } +pallet-xcm = { workspace = true } +westend-runtime = { workspace = true } +westend-runtime-constants = { workspace = true, default-features = true } # Cumulus -parachains-common = { path = "../../../../../../parachains/common" } -testnet-parachains-constants = { path = "../../../../../runtimes/constants", features = ["westend"] } -asset-hub-westend-runtime = { path = "../../../../../runtimes/assets/asset-hub-westend" } -collectives-westend-runtime = { path = "../../../../../runtimes/collectives/collectives-westend" } -cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../../../pallets/xcmp-queue" } -cumulus-pallet-parachain-system = { default-features = false, path = "../../../../../../pallets/parachain-system" } -emulated-integration-tests-common = { path = "../../../common", default-features = false } -westend-system-emulated-network = { path = "../../../networks/westend-system" } +parachains-common = { workspace = true, default-features = true } +testnet-parachains-constants = { features = ["westend"], workspace = true, default-features = true } +asset-hub-westend-runtime = { workspace = true } +collectives-westend-runtime = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +emulated-integration-tests-common = { workspace = true } +westend-system-emulated-network = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml index 29a939951e5..5221b782ac6 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml @@ -8,25 +8,25 @@ description = "People Rococo runtime integration tests with xcm-emulator" publish = false [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } +codec = { workspace = true } # Substrate -sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } -frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } -pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue", default-features = false } -pallet-identity = { path = "../../../../../../../substrate/frame/identity", default-features = false } +sp-runtime = { workspace = true } +frame-support = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-identity = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false } -rococo-runtime = { path = "../../../../../../../polkadot/runtime/rococo" } -rococo-runtime-constants = { path = "../../../../../../../polkadot/runtime/rococo/constants" } -polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common" } +xcm = { workspace = true } +xcm-executor = { workspace = true } +rococo-runtime = { workspace = true } +rococo-runtime-constants = { workspace = true, default-features = true } +polkadot-runtime-common = { workspace = true, default-features = true } # Cumulus -asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" } -parachains-common = { path = "../../../../../common" } -people-rococo-runtime = { path = "../../../../../runtimes/people/people-rococo" } -emulated-integration-tests-common = { path = "../../../common", default-features = false } -rococo-system-emulated-network = { path = "../../../networks/rococo-system" } +asset-test-utils = { workspace = true, default-features = true } +parachains-common = { workspace = true, default-features = true } +people-rococo-runtime = { workspace = true } +emulated-integration-tests-common = { workspace = true } +rococo-system-emulated-network = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml index 6eab6f52aa7..58dbf82f222 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml @@ -8,25 +8,25 @@ description = "People Westend runtime integration tests with xcm-emulator" publish = false [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } +codec = { workspace = true } # Substrate -sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } -frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } -pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue", default-features = false } -pallet-identity = { path = "../../../../../../../substrate/frame/identity", default-features = false } +sp-runtime = { workspace = true } +frame-support = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-identity = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false } -westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" } -westend-runtime-constants = { path = "../../../../../../../polkadot/runtime/westend/constants" } -polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common" } +xcm = { workspace = true } +xcm-executor = { workspace = true } +westend-runtime = { workspace = true } +westend-runtime-constants = { workspace = true, default-features = true } +polkadot-runtime-common = { workspace = true, default-features = true } # Cumulus -asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" } -parachains-common = { path = "../../../../../common" } -people-westend-runtime = { path = "../../../../../runtimes/people/people-westend" } -emulated-integration-tests-common = { path = "../../../common", default-features = false } -westend-system-emulated-network = { path = "../../../networks/westend-system" } +asset-test-utils = { workspace = true, default-features = true } +parachains-common = { workspace = true, default-features = true } +people-westend-runtime = { workspace = true } +emulated-integration-tests-common = { workspace = true } +westend-system-emulated-network = { workspace = true } diff --git a/cumulus/parachains/pallets/collective-content/Cargo.toml b/cumulus/parachains/pallets/collective-content/Cargo.toml index 92e0a546313..61cbe785009 100644 --- a/cumulus/parachains/pallets/collective-content/Cargo.toml +++ b/cumulus/parachains/pallets/collective-content/Cargo.toml @@ -10,19 +10,19 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive", "max-encoded-len"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive", "max-encoded-len"], workspace = true } +scale-info = { features = ["derive"], workspace = true } -frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } +sp-io = { workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/pallets/parachain-info/Cargo.toml b/cumulus/parachains/pallets/parachain-info/Cargo.toml index 01ee12bf4e7..7369c3a2c15 100644 --- a/cumulus/parachains/pallets/parachain-info/Cargo.toml +++ b/cumulus/parachains/pallets/parachain-info/Cargo.toml @@ -10,16 +10,16 @@ description = "Pallet to store the parachain ID" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } +sp-runtime = { workspace = true } +sp-std = { workspace = true } -cumulus-primitives-core = { path = "../../../primitives/core", default-features = false } +cumulus-primitives-core = { workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/pallets/ping/Cargo.toml b/cumulus/parachains/pallets/ping/Cargo.toml index f51946e9ebd..f74328207b8 100644 --- a/cumulus/parachains/pallets/ping/Cargo.toml +++ b/cumulus/parachains/pallets/ping/Cargo.toml @@ -10,18 +10,18 @@ description = "Ping Pallet for Cumulus XCM/UMP testing." workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } +sp-std = { workspace = true } +sp-runtime = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } -xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } +xcm = { workspace = true } -cumulus-primitives-core = { path = "../../../primitives/core", default-features = false } -cumulus-pallet-xcm = { path = "../../../pallets/xcm", default-features = false } +cumulus-primitives-core = { workspace = true } +cumulus-pallet-xcm = { workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml index b8670c2957d..0af83744ae9 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml @@ -10,97 +10,97 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.1" } +codec = { features = ["derive", "max-encoded-len"], workspace = true } +hex-literal = { workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-metadata-hash-extension = { path = "../../../../../substrate/frame/metadata-hash-extension", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-asset-conversion-tx-payment = { path = "../../../../../substrate/frame/transaction-payment/asset-conversion-tx-payment", default-features = false } -pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false } -pallet-asset-conversion-ops = { path = "../../../../../substrate/frame/asset-conversion/ops", default-features = false } -pallet-asset-conversion = { path = "../../../../../substrate/frame/asset-conversion", default-features = false } -pallet-assets-freezer = { path = "../../../../../substrate/frame/assets-freezer", default-features = false } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } -pallet-nft-fractionalization = { path = "../../../../../substrate/frame/nft-fractionalization", default-features = false } -pallet-nfts = { path = "../../../../../substrate/frame/nfts", default-features = false } -pallet-nfts-runtime-api = { path = "../../../../../substrate/frame/nfts/runtime-api", default-features = false } -pallet-proxy = { path = "../../../../../substrate/frame/proxy", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-uniques = { path = "../../../../../substrate/frame/uniques", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } -sp-weights = { path = "../../../../../substrate/primitives/weights", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-metadata-hash-extension = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-asset-conversion-tx-payment = { workspace = true } +pallet-assets = { workspace = true } +pallet-asset-conversion-ops = { workspace = true } +pallet-asset-conversion = { workspace = true } +pallet-assets-freezer = { workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-multisig = { workspace = true } +pallet-nft-fractionalization = { workspace = true } +pallet-nfts = { workspace = true } +pallet-nfts-runtime-api = { workspace = true } +pallet-proxy = { workspace = true } +pallet-session = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-uniques = { workspace = true } +pallet-utility = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-inherents = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } +sp-weights = { workspace = true } # num-traits feature needed for dex integer sq root: -primitive-types = { version = "0.12.1", default-features = false, features = ["codec", "num-traits", "scale-info"] } +primitive-types = { features = ["codec", "num-traits", "scale-info"], workspace = true } # Polkadot -rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants", default-features = false } -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +rococo-runtime-constants = { workspace = true } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { optional = true, workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false, features = ["bridging"] } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["rococo"] } -assets-common = { path = "../common", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { features = ["bridging"], workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true } +assets-common = { workspace = true } # Bridges -pallet-xcm-bridge-hub-router = { path = "../../../../../bridges/modules/xcm-bridge-hub-router", default-features = false } -bp-asset-hub-rococo = { path = "../../../../../bridges/chains/chain-asset-hub-rococo", default-features = false } -bp-asset-hub-westend = { path = "../../../../../bridges/chains/chain-asset-hub-westend", default-features = false } -bp-bridge-hub-rococo = { path = "../../../../../bridges/chains/chain-bridge-hub-rococo", default-features = false } -bp-bridge-hub-westend = { path = "../../../../../bridges/chains/chain-bridge-hub-westend", default-features = false } -snowbridge-router-primitives = { path = "../../../../../bridges/snowbridge/primitives/router", default-features = false } +pallet-xcm-bridge-hub-router = { workspace = true } +bp-asset-hub-rococo = { workspace = true } +bp-asset-hub-westend = { workspace = true } +bp-bridge-hub-rococo = { workspace = true } +bp-bridge-hub-westend = { workspace = true } +snowbridge-router-primitives = { workspace = true } [dev-dependencies] -asset-test-utils = { path = "../test-utils" } +asset-test-utils = { workspace = true, default-features = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index f310b2e0313..f0520a1726a 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -10,96 +10,96 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.1" } +codec = { features = ["derive", "max-encoded-len"], workspace = true } +hex-literal = { workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-metadata-hash-extension = { path = "../../../../../substrate/frame/metadata-hash-extension", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-asset-conversion-ops = { path = "../../../../../substrate/frame/asset-conversion/ops", default-features = false } -pallet-asset-conversion-tx-payment = { path = "../../../../../substrate/frame/transaction-payment/asset-conversion-tx-payment", default-features = false } -pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false } -pallet-asset-conversion = { path = "../../../../../substrate/frame/asset-conversion", default-features = false } -pallet-assets-freezer = { path = "../../../../../substrate/frame/assets-freezer", default-features = false } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } -pallet-nft-fractionalization = { path = "../../../../../substrate/frame/nft-fractionalization", default-features = false } -pallet-nfts = { path = "../../../../../substrate/frame/nfts", default-features = false } -pallet-nfts-runtime-api = { path = "../../../../../substrate/frame/nfts/runtime-api", default-features = false } -pallet-proxy = { path = "../../../../../substrate/frame/proxy", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-state-trie-migration = { path = "../../../../../substrate/frame/state-trie-migration", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-uniques = { path = "../../../../../substrate/frame/uniques", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-metadata-hash-extension = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-asset-conversion-ops = { workspace = true } +pallet-asset-conversion-tx-payment = { workspace = true } +pallet-assets = { workspace = true } +pallet-asset-conversion = { workspace = true } +pallet-assets-freezer = { workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-multisig = { workspace = true } +pallet-nft-fractionalization = { workspace = true } +pallet-nfts = { workspace = true } +pallet-nfts-runtime-api = { workspace = true } +pallet-proxy = { workspace = true } +pallet-session = { workspace = true } +pallet-state-trie-migration = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-uniques = { workspace = true } +pallet-utility = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # num-traits feature needed for dex integer sq root: -primitive-types = { version = "0.12.1", default-features = false, features = ["codec", "num-traits", "scale-info"] } +primitive-types = { features = ["codec", "num-traits", "scale-info"], workspace = true } # Polkadot -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -westend-runtime-constants = { path = "../../../../../polkadot/runtime/westend/constants", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { optional = true, workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +westend-runtime-constants = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false, features = ["bridging"] } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["westend"] } -assets-common = { path = "../common", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +pallet-message-queue = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { features = ["bridging"], workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["westend"], workspace = true } +assets-common = { workspace = true } # Bridges -pallet-xcm-bridge-hub-router = { path = "../../../../../bridges/modules/xcm-bridge-hub-router", default-features = false } -bp-asset-hub-rococo = { path = "../../../../../bridges/chains/chain-asset-hub-rococo", default-features = false } -bp-asset-hub-westend = { path = "../../../../../bridges/chains/chain-asset-hub-westend", default-features = false } -bp-bridge-hub-rococo = { path = "../../../../../bridges/chains/chain-bridge-hub-rococo", default-features = false } -bp-bridge-hub-westend = { path = "../../../../../bridges/chains/chain-bridge-hub-westend", default-features = false } +pallet-xcm-bridge-hub-router = { workspace = true } +bp-asset-hub-rococo = { workspace = true } +bp-asset-hub-westend = { workspace = true } +bp-bridge-hub-rococo = { workspace = true } +bp-bridge-hub-westend = { workspace = true } [dev-dependencies] -asset-test-utils = { path = "../test-utils" } +asset-test-utils = { workspace = true, default-features = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/assets/common/Cargo.toml b/cumulus/parachains/runtimes/assets/common/Cargo.toml index 4664e0cb9a7..94612506f51 100644 --- a/cumulus/parachains/runtimes/assets/common/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/common/Cargo.toml @@ -10,30 +10,30 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } log = { workspace = true } -impl-trait-for-tuples = "0.2.2" +impl-trait-for-tuples = { workspace = true } # Substrate -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -pallet-asset-conversion = { path = "../../../../../substrate/frame/asset-conversion", default-features = false } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-std = { workspace = true } +sp-runtime = { workspace = true } +pallet-asset-conversion = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } +pallet-xcm = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } # Cumulus -parachains-common = { path = "../../../common", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } +parachains-common = { workspace = true } +cumulus-primitives-core = { workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder" } +substrate-wasm-builder = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml index af5b4a64680..a7aad361e84 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml @@ -10,42 +10,42 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive", "max-encoded-len"] } +codec = { features = ["derive", "max-encoded-len"], workspace = true } # Substrate -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-assets = { workspace = true } +pallet-balances = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-session = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } # Cumulus -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-runtimes-test-utils = { path = "../../test-utils", default-features = false } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +pallet-collator-selection = { workspace = true } +parachains-common = { workspace = true } +cumulus-primitives-core = { workspace = true } +parachain-info = { workspace = true } +parachains-runtimes-test-utils = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +pallet-xcm = { workspace = true } # Bridges -pallet-xcm-bridge-hub-router = { path = "../../../../../bridges/modules/xcm-bridge-hub-router", default-features = false } +pallet-xcm-bridge-hub-router = { workspace = true } [dev-dependencies] -hex-literal = "0.4.1" +hex-literal = { workspace = true, default-features = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder" } +substrate-wasm-builder = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 5e8639eed36..bfe705be8fc 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -10,124 +10,124 @@ license = "Apache-2.0" workspace = true [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", -] } -hex-literal = { version = "0.4.1" } +], workspace = true } +hex-literal = { workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = [ +scale-info = { features = [ "derive", -] } +], workspace = true } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-session = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-multisig = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-utility = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-io = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants", default-features = false } -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +rococo-runtime-constants = { workspace = true } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { optional = true, workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false, features = [ +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { features = [ "bridging", -] } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["rococo"] } +], workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } +cumulus-primitives-utility = { workspace = true } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true } # Bridges -bp-asset-hub-rococo = { path = "../../../../../bridges/chains/chain-asset-hub-rococo", default-features = false } -bp-asset-hub-westend = { path = "../../../../../bridges/chains/chain-asset-hub-westend", default-features = false } -bp-bridge-hub-polkadot = { path = "../../../../../bridges/chains/chain-bridge-hub-polkadot", default-features = false } -bp-bridge-hub-rococo = { path = "../../../../../bridges/chains/chain-bridge-hub-rococo", default-features = false } -bp-bridge-hub-westend = { path = "../../../../../bridges/chains/chain-bridge-hub-westend", default-features = false } -bp-header-chain = { path = "../../../../../bridges/primitives/header-chain", default-features = false } -bp-messages = { path = "../../../../../bridges/primitives/messages", default-features = false } -bp-parachains = { path = "../../../../../bridges/primitives/parachains", default-features = false } -bp-polkadot-bulletin = { path = "../../../../../bridges/chains/chain-polkadot-bulletin", default-features = false } -bp-polkadot-core = { path = "../../../../../bridges/primitives/polkadot-core", default-features = false } -bp-relayers = { path = "../../../../../bridges/primitives/relayers", default-features = false } -bp-runtime = { path = "../../../../../bridges/primitives/runtime", default-features = false } -bp-rococo = { path = "../../../../../bridges/chains/chain-rococo", default-features = false } -bp-westend = { path = "../../../../../bridges/chains/chain-westend", default-features = false } -pallet-bridge-grandpa = { path = "../../../../../bridges/modules/grandpa", default-features = false } -pallet-bridge-messages = { path = "../../../../../bridges/modules/messages", default-features = false } -pallet-bridge-parachains = { path = "../../../../../bridges/modules/parachains", default-features = false } -pallet-bridge-relayers = { path = "../../../../../bridges/modules/relayers", default-features = false } -pallet-xcm-bridge-hub = { path = "../../../../../bridges/modules/xcm-bridge-hub", default-features = false } -bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", default-features = false } +bp-asset-hub-rococo = { workspace = true } +bp-asset-hub-westend = { workspace = true } +bp-bridge-hub-polkadot = { workspace = true } +bp-bridge-hub-rococo = { workspace = true } +bp-bridge-hub-westend = { workspace = true } +bp-header-chain = { workspace = true } +bp-messages = { workspace = true } +bp-parachains = { workspace = true } +bp-polkadot-bulletin = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-relayers = { workspace = true } +bp-runtime = { workspace = true } +bp-rococo = { workspace = true } +bp-westend = { workspace = true } +pallet-bridge-grandpa = { workspace = true } +pallet-bridge-messages = { workspace = true } +pallet-bridge-parachains = { workspace = true } +pallet-bridge-relayers = { workspace = true } +pallet-xcm-bridge-hub = { workspace = true } +bridge-runtime-common = { workspace = true } # Ethereum Bridge (Snowbridge) -snowbridge-beacon-primitives = { path = "../../../../../bridges/snowbridge/primitives/beacon", default-features = false } -snowbridge-pallet-system = { path = "../../../../../bridges/snowbridge/pallets/system", default-features = false } -snowbridge-system-runtime-api = { path = "../../../../../bridges/snowbridge/pallets/system/runtime-api", default-features = false } -snowbridge-core = { path = "../../../../../bridges/snowbridge/primitives/core", default-features = false } -snowbridge-pallet-ethereum-client = { path = "../../../../../bridges/snowbridge/pallets/ethereum-client", default-features = false } -snowbridge-pallet-inbound-queue = { path = "../../../../../bridges/snowbridge/pallets/inbound-queue", default-features = false } -snowbridge-pallet-outbound-queue = { path = "../../../../../bridges/snowbridge/pallets/outbound-queue", default-features = false } -snowbridge-outbound-queue-runtime-api = { path = "../../../../../bridges/snowbridge/pallets/outbound-queue/runtime-api", default-features = false } -snowbridge-router-primitives = { path = "../../../../../bridges/snowbridge/primitives/router", default-features = false } -snowbridge-runtime-common = { path = "../../../../../bridges/snowbridge/runtime/runtime-common", default-features = false } +snowbridge-beacon-primitives = { workspace = true } +snowbridge-pallet-system = { workspace = true } +snowbridge-system-runtime-api = { workspace = true } +snowbridge-core = { workspace = true } +snowbridge-pallet-ethereum-client = { workspace = true } +snowbridge-pallet-inbound-queue = { workspace = true } +snowbridge-pallet-outbound-queue = { workspace = true } +snowbridge-outbound-queue-runtime-api = { workspace = true } +snowbridge-router-primitives = { workspace = true } +snowbridge-runtime-common = { workspace = true } -bridge-hub-common = { path = "../common", default-features = false } +bridge-hub-common = { workspace = true } [dev-dependencies] -static_assertions = "1.1" -bridge-hub-test-utils = { path = "../test-utils" } -bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", features = [ +static_assertions = { workspace = true, default-features = true } +bridge-hub-test-utils = { workspace = true, default-features = true } +bridge-runtime-common = { features = [ "integrity-test", -] } -sp-keyring = { path = "../../../../../substrate/primitives/keyring" } -snowbridge-runtime-test-common = { path = "../../../../../bridges/snowbridge/runtime/test-common" } +], workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } +snowbridge-runtime-test-common = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml index ba8e4cdc814..ab0c15ce300 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml @@ -10,101 +10,101 @@ license = "Apache-2.0" workspace = true [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1" } +codec = { features = ["derive"], workspace = true } +hex-literal = { workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-session = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-multisig = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-utility = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-io = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -westend-runtime-constants = { path = "../../../../../polkadot/runtime/westend/constants", default-features = false } -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +westend-runtime-constants = { workspace = true } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { optional = true, workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false, features = ["bridging"] } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { features = ["bridging"], workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["westend"] } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["westend"], workspace = true } # Bridges -bp-asset-hub-rococo = { path = "../../../../../bridges/chains/chain-asset-hub-rococo", default-features = false } -bp-asset-hub-westend = { path = "../../../../../bridges/chains/chain-asset-hub-westend", default-features = false } -bp-bridge-hub-rococo = { path = "../../../../../bridges/chains/chain-bridge-hub-rococo", default-features = false } -bp-bridge-hub-westend = { path = "../../../../../bridges/chains/chain-bridge-hub-westend", default-features = false } -bp-header-chain = { path = "../../../../../bridges/primitives/header-chain", default-features = false } -bp-messages = { path = "../../../../../bridges/primitives/messages", default-features = false } -bp-parachains = { path = "../../../../../bridges/primitives/parachains", default-features = false } -bp-polkadot-core = { path = "../../../../../bridges/primitives/polkadot-core", default-features = false } -bp-relayers = { path = "../../../../../bridges/primitives/relayers", default-features = false } -bp-runtime = { path = "../../../../../bridges/primitives/runtime", default-features = false } -bp-rococo = { path = "../../../../../bridges/chains/chain-rococo", default-features = false } -bp-westend = { path = "../../../../../bridges/chains/chain-westend", default-features = false } -pallet-bridge-grandpa = { path = "../../../../../bridges/modules/grandpa", default-features = false } -pallet-bridge-messages = { path = "../../../../../bridges/modules/messages", default-features = false } -pallet-bridge-parachains = { path = "../../../../../bridges/modules/parachains", default-features = false } -pallet-bridge-relayers = { path = "../../../../../bridges/modules/relayers", default-features = false } -pallet-xcm-bridge-hub = { path = "../../../../../bridges/modules/xcm-bridge-hub", default-features = false } -bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", default-features = false } -bridge-hub-common = { path = "../common", default-features = false } +bp-asset-hub-rococo = { workspace = true } +bp-asset-hub-westend = { workspace = true } +bp-bridge-hub-rococo = { workspace = true } +bp-bridge-hub-westend = { workspace = true } +bp-header-chain = { workspace = true } +bp-messages = { workspace = true } +bp-parachains = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-relayers = { workspace = true } +bp-runtime = { workspace = true } +bp-rococo = { workspace = true } +bp-westend = { workspace = true } +pallet-bridge-grandpa = { workspace = true } +pallet-bridge-messages = { workspace = true } +pallet-bridge-parachains = { workspace = true } +pallet-bridge-relayers = { workspace = true } +pallet-xcm-bridge-hub = { workspace = true } +bridge-runtime-common = { workspace = true } +bridge-hub-common = { workspace = true } [dev-dependencies] -static_assertions = "1.1" -bridge-hub-test-utils = { path = "../test-utils" } -bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", features = ["integrity-test"] } -sp-keyring = { path = "../../../../../substrate/primitives/keyring" } +static_assertions = { workspace = true, default-features = true } +bridge-hub-test-utils = { workspace = true, default-features = true } +bridge-runtime-common = { features = ["integrity-test"], workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml index aece34613e6..fd0eed1c05a 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml @@ -7,16 +7,16 @@ description = "Bridge hub common utilities" license = "Apache-2.0" [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -snowbridge-core = { path = "../../../../../bridges/snowbridge/primitives/core", default-features = false } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-support = { workspace = true } +sp-std = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +cumulus-primitives-core = { workspace = true } +xcm = { workspace = true } +pallet-message-queue = { workspace = true } +snowbridge-core = { workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index 80f0114cc4c..90af4dd8f3e 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -10,47 +10,47 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive", "max-encoded-len"] } -impl-trait-for-tuples = "0.2" +codec = { features = ["derive", "max-encoded-len"], workspace = true } +impl-trait-for-tuples = { workspace = true } log = { workspace = true } # Substrate -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } -sp-keyring = { path = "../../../../../substrate/primitives/keyring" } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-tracing = { path = "../../../../../substrate/primitives/tracing" } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-keyring = { workspace = true, default-features = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-tracing = { workspace = true, default-features = true } +pallet-balances = { workspace = true } +pallet-utility = { workspace = true } +pallet-timestamp = { workspace = true } # Cumulus -asset-test-utils = { path = "../../assets/test-utils" } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -parachains-runtimes-test-utils = { path = "../../test-utils", default-features = false } +asset-test-utils = { workspace = true, default-features = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +parachains-common = { workspace = true } +parachains-runtimes-test-utils = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } # Bridges -bp-header-chain = { path = "../../../../../bridges/primitives/header-chain", default-features = false } -bp-messages = { path = "../../../../../bridges/primitives/messages", default-features = false } -bp-polkadot-core = { path = "../../../../../bridges/primitives/polkadot-core", default-features = false } -bp-relayers = { path = "../../../../../bridges/primitives/relayers", default-features = false } -bp-runtime = { path = "../../../../../bridges/primitives/runtime", default-features = false } -bp-test-utils = { path = "../../../../../bridges/primitives/test-utils", default-features = false } -pallet-bridge-grandpa = { path = "../../../../../bridges/modules/grandpa", default-features = false } -pallet-bridge-parachains = { path = "../../../../../bridges/modules/parachains", default-features = false } -pallet-bridge-messages = { path = "../../../../../bridges/modules/messages", default-features = false } -pallet-bridge-relayers = { path = "../../../../../bridges/modules/relayers", default-features = false } -bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", default-features = false } +bp-header-chain = { workspace = true } +bp-messages = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-relayers = { workspace = true } +bp-runtime = { workspace = true } +bp-test-utils = { workspace = true } +pallet-bridge-grandpa = { workspace = true } +pallet-bridge-parachains = { workspace = true } +pallet-bridge-messages = { workspace = true } +pallet-bridge-relayers = { workspace = true } +bridge-runtime-common = { workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml index fe4de3114be..7cfd115cea4 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml @@ -10,88 +10,88 @@ description = "Westend Collectives Parachain Runtime" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.1" } +codec = { features = ["derive", "max-encoded-len"], workspace = true } +hex-literal = { workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-asset-rate = { path = "../../../../../substrate/frame/asset-rate", default-features = false } -pallet-alliance = { path = "../../../../../substrate/frame/alliance", default-features = false } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-collective = { path = "../../../../../substrate/frame/collective", default-features = false } -pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } -pallet-preimage = { path = "../../../../../substrate/frame/preimage", default-features = false } -pallet-proxy = { path = "../../../../../substrate/frame/proxy", default-features = false } -pallet-scheduler = { path = "../../../../../substrate/frame/scheduler", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-state-trie-migration = { path = "../../../../../substrate/frame/state-trie-migration", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-treasury = { path = "../../../../../substrate/frame/treasury", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -pallet-referenda = { path = "../../../../../substrate/frame/referenda", default-features = false } -pallet-ranked-collective = { path = "../../../../../substrate/frame/ranked-collective", default-features = false } -pallet-core-fellowship = { path = "../../../../../substrate/frame/core-fellowship", default-features = false } -pallet-salary = { path = "../../../../../substrate/frame/salary", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-arithmetic = { path = "../../../../../substrate/primitives/arithmetic", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-asset-rate = { workspace = true } +pallet-alliance = { workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-collective = { workspace = true } +pallet-multisig = { workspace = true } +pallet-preimage = { workspace = true } +pallet-proxy = { workspace = true } +pallet-scheduler = { workspace = true } +pallet-session = { workspace = true } +pallet-state-trie-migration = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-treasury = { workspace = true } +pallet-utility = { workspace = true } +pallet-referenda = { workspace = true } +pallet-ranked-collective = { workspace = true } +pallet-core-fellowship = { workspace = true } +pallet-salary = { workspace = true } +sp-api = { workspace = true } +sp-arithmetic = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } -westend-runtime-constants = { path = "../../../../../polkadot/runtime/westend/constants", default-features = false } +pallet-xcm = { workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } +westend-runtime-constants = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +pallet-message-queue = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -pallet-collective-content = { path = "../../../pallets/collective-content", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["westend"] } +pallet-collator-selection = { workspace = true } +pallet-collective-content = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["westend"], workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [dev-dependencies] -sp-io = { path = "../../../../../substrate/primitives/io", features = ["std"] } +sp-io = { features = ["std"], workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/constants/Cargo.toml b/cumulus/parachains/runtimes/constants/Cargo.toml index 561e8276b5f..d54f1e7db6c 100644 --- a/cumulus/parachains/runtimes/constants/Cargo.toml +++ b/cumulus/parachains/runtimes/constants/Cargo.toml @@ -13,20 +13,20 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -smallvec = "1.11.0" +smallvec = { workspace = true, default-features = true } # Substrate -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } +frame-support = { workspace = true } +sp-runtime = { workspace = true } # Polkadot -polkadot-core-primitives = { path = "../../../../polkadot/core-primitives", default-features = false } -rococo-runtime-constants = { path = "../../../../polkadot/runtime/rococo/constants", default-features = false, optional = true } -westend-runtime-constants = { path = "../../../../polkadot/runtime/westend/constants", default-features = false, optional = true } -xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } +polkadot-core-primitives = { workspace = true } +rococo-runtime-constants = { optional = true, workspace = true } +westend-runtime-constants = { optional = true, workspace = true } +xcm = { workspace = true } # Cumulus -cumulus-primitives-core = { path = "../../../primitives/core", default-features = false } +cumulus-primitives-core = { workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index e43a69482c7..1620924496f 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -13,74 +13,74 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1", optional = true } +codec = { features = ["derive"], workspace = true } +hex-literal = { optional = true, workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } # Substrate -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-insecure-randomness-collective-flip = { path = "../../../../../substrate/frame/insecure-randomness-collective-flip", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -pallet-sudo = { path = "../../../../../substrate/frame/sudo", default-features = false } -pallet-contracts = { path = "../../../../../substrate/frame/contracts", default-features = false } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-try-runtime = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-insecure-randomness-collective-flip = { workspace = true } +pallet-balances = { workspace = true } +pallet-multisig = { workspace = true } +pallet-session = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-utility = { workspace = true } +pallet-sudo = { workspace = true } +pallet-contracts = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +pallet-xcm = { workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +rococo-runtime-constants = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +pallet-message-queue = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["rococo"] } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml index dc99fe331f7..8f4ccac100e 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml @@ -10,74 +10,74 @@ license = "Apache-2.0" workspace = true [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -hex-literal = "0.4.1" +codec = { features = ["derive"], workspace = true } +hex-literal = { workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -pallet-broker = { path = "../../../../../substrate/frame/broker", default-features = false } -pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-sudo = { path = "../../../../../substrate/frame/sudo", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-broker = { workspace = true } +pallet-multisig = { workspace = true } +pallet-session = { workspace = true } +pallet-sudo = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-utility = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-inherents = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { optional = true, workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +rococo-runtime-constants = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["rococo"] } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml index 78018537f5d..690bcfa8eb0 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml @@ -10,74 +10,74 @@ license = "Apache-2.0" workspace = true [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -hex-literal = "0.4.1" +codec = { features = ["derive"], workspace = true } +hex-literal = { workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -pallet-broker = { path = "../../../../../substrate/frame/broker", default-features = false } -pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-broker = { workspace = true } +pallet-multisig = { workspace = true } +pallet-session = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-utility = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-inherents = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -westend-runtime-constants = { path = "../../../../../polkadot/runtime/westend/constants", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { optional = true, workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +westend-runtime-constants = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["westend"] } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["westend"], workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml b/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml index 92a5bbbd137..c201c8375be 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml @@ -10,54 +10,54 @@ description = "Glutton parachain runtime." workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-glutton = { path = "../../../../../substrate/frame/glutton", default-features = false } -pallet-sudo = { path = "../../../../../substrate/frame/sudo", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-aura = { workspace = true } +pallet-glutton = { workspace = true } +pallet-sudo = { workspace = true } +pallet-timestamp = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +pallet-message-queue = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["westend"] } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-timestamp = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["westend"], workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder" } +substrate-wasm-builder = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml index d4e65da3cd6..61dedd8bbb8 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml @@ -7,74 +7,74 @@ description = "Rococo's People parachain runtime" license = "Apache-2.0" [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -enumflags2 = { version = "0.7.7" } -hex-literal = { version = "0.4.1" } +codec = { features = ["derive"], workspace = true } +enumflags2 = { workspace = true } +hex-literal = { workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-identity = { path = "../../../../../substrate/frame/identity", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-identity = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-multisig = { workspace = true } +pallet-session = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-utility = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { optional = true, workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +rococo-runtime-constants = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["rococo"] } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml index b040613d19e..2c5a51e8235 100644 --- a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml @@ -7,74 +7,74 @@ description = "Westend's People parachain runtime" license = "Apache-2.0" [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -enumflags2 = { version = "0.7.7" } -hex-literal = { version = "0.4.1" } +codec = { features = ["derive"], workspace = true } +enumflags2 = { workspace = true } +hex-literal = { workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-identity = { path = "../../../../../substrate/frame/identity", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-identity = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-multisig = { workspace = true } +pallet-session = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-utility = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -westend-runtime-constants = { path = "../../../../../polkadot/runtime/westend/constants", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { optional = true, workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +westend-runtime-constants = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["westend"] } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["westend"], workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml index 910944f54a5..8a7c5922362 100644 --- a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml +++ b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml @@ -10,41 +10,41 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-sudo = { path = "../../../../../substrate/frame/sudo", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-aura = { workspace = true } +pallet-balances = { workspace = true } +pallet-sudo = { workspace = true } +pallet-timestamp = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-solo-to-para = { path = "../../../../pallets/solo-to-para", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-solo-to-para = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-timestamp = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/starters/shell/Cargo.toml b/cumulus/parachains/runtimes/starters/shell/Cargo.toml index 7a7fad537ac..4a1271ca658 100644 --- a/cumulus/parachains/runtimes/starters/shell/Cargo.toml +++ b/cumulus/parachains/runtimes/starters/shell/Cargo.toml @@ -10,45 +10,45 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-aura = { workspace = true } +pallet-timestamp = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } +pallet-message-queue = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-primitives-core = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/test-utils/Cargo.toml b/cumulus/parachains/runtimes/test-utils/Cargo.toml index c081bac4bab..5e895271ab1 100644 --- a/cumulus/parachains/runtimes/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/test-utils/Cargo.toml @@ -10,41 +10,41 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive", "max-encoded-len"] } +codec = { features = ["derive", "max-encoded-len"], workspace = true } # Substrate -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } -pallet-balances = { path = "../../../../substrate/frame/balances", default-features = false } -pallet-session = { path = "../../../../substrate/frame/session", default-features = false } -pallet-timestamp = { path = "../../../../substrate/frame/timestamp", default-features = false } -sp-consensus-aura = { path = "../../../../substrate/primitives/consensus/aura", default-features = false } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-tracing = { path = "../../../../substrate/primitives/tracing" } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-balances = { workspace = true } +pallet-session = { workspace = true } +pallet-timestamp = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-tracing = { workspace = true, default-features = true } +sp-core = { workspace = true } # Cumulus -cumulus-pallet-parachain-system = { path = "../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../pallets/xcmp-queue", default-features = false } -pallet-collator-selection = { path = "../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../pallets/parachain-info", default-features = false } -cumulus-primitives-core = { path = "../../../primitives/core", default-features = false } -cumulus-primitives-parachain-inherent = { path = "../../../primitives/parachain-inherent", default-features = false } -cumulus-test-relay-sproof-builder = { path = "../../../test/relay-sproof-builder", default-features = false } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-parachain-inherent = { workspace = true } +cumulus-test-relay-sproof-builder = { workspace = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../polkadot/xcm/xcm-executor", default-features = false } -pallet-xcm = { path = "../../../../polkadot/xcm/pallet-xcm", default-features = false } -polkadot-parachain-primitives = { path = "../../../../polkadot/parachain", default-features = false } +xcm = { workspace = true } +xcm-executor = { workspace = true } +pallet-xcm = { workspace = true } +polkadot-parachain-primitives = { workspace = true } [dev-dependencies] -hex-literal = "0.4.1" +hex-literal = { workspace = true, default-features = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../substrate/utils/wasm-builder" } +substrate-wasm-builder = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml index 3262233053e..4e921ad884e 100644 --- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml @@ -15,70 +15,70 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1", optional = true } +codec = { features = ["derive"], workspace = true } +hex-literal = { optional = true, workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -smallvec = "1.11.0" +scale-info = { features = ["derive"], workspace = true } +smallvec = { workspace = true, default-features = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-sudo = { path = "../../../../../substrate/frame/sudo", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -pallet-asset-tx-payment = { path = "../../../../../substrate/frame/transaction-payment/asset-tx-payment", default-features = false } -pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-session = { workspace = true } +pallet-sudo = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-asset-tx-payment = { workspace = true } +pallet-assets = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -polkadot-primitives = { path = "../../../../../polkadot/primitives", default-features = false } -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-fee-payment-runtime-api = { path = "../../../../../polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } +polkadot-primitives = { workspace = true } +pallet-xcm = { workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +xcm-fee-payment-runtime-api = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -assets-common = { path = "../../assets/common", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +pallet-message-queue = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +pallet-collator-selection = { workspace = true } +parachain-info = { workspace = true } +parachains-common = { workspace = true } +assets-common = { workspace = true } [features] default = ["std"] diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml index cf734345a97..7cbb614babe 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml @@ -10,60 +10,60 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } -frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false } -pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-sudo = { path = "../../../../../substrate/frame/sudo", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } -sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +pallet-assets = { workspace = true } +pallet-aura = { workspace = true } +pallet-balances = { workspace = true } +pallet-sudo = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } -polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } -polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } +pallet-xcm = { workspace = true } +polkadot-parachain-primitives = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } +polkadot-runtime-common = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-ping = { path = "../../../pallets/ping", default-features = false } -cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["rococo"] } -parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +pallet-message-queue = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-ping = { workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } +cumulus-primitives-utility = { workspace = true } +parachains-common = { workspace = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true } +parachain-info = { workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 890cf519916..d12eaa5c0d4 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -15,113 +15,113 @@ name = "polkadot-parachain" path = "src/main.rs" [dependencies] -async-trait = "0.1.79" -clap = { version = "4.5.3", features = ["derive"] } -codec = { package = "parity-scale-codec", version = "3.6.12" } -color-print = "0.3.4" -futures = "0.3.28" -hex-literal = "0.4.1" +async-trait = { workspace = true } +clap = { features = ["derive"], workspace = true } +codec = { workspace = true, default-features = true } +color-print = { workspace = true } +futures = { workspace = true } +hex-literal = { workspace = true, default-features = true } log = { workspace = true, default-features = true } serde = { features = ["derive"], workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } # Local -rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" } -shell-runtime = { path = "../parachains/runtimes/starters/shell" } -glutton-westend-runtime = { path = "../parachains/runtimes/glutton/glutton-westend" } -seedling-runtime = { path = "../parachains/runtimes/starters/seedling" } -asset-hub-rococo-runtime = { path = "../parachains/runtimes/assets/asset-hub-rococo" } -asset-hub-westend-runtime = { path = "../parachains/runtimes/assets/asset-hub-westend" } -collectives-westend-runtime = { path = "../parachains/runtimes/collectives/collectives-westend" } -contracts-rococo-runtime = { path = "../parachains/runtimes/contracts/contracts-rococo" } -bridge-hub-rococo-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-rococo" } -coretime-rococo-runtime = { path = "../parachains/runtimes/coretime/coretime-rococo" } -coretime-westend-runtime = { path = "../parachains/runtimes/coretime/coretime-westend" } -bridge-hub-westend-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-westend" } -penpal-runtime = { path = "../parachains/runtimes/testing/penpal" } -jsonrpsee = { version = "0.22", features = ["server"] } -people-rococo-runtime = { path = "../parachains/runtimes/people/people-rococo" } -people-westend-runtime = { path = "../parachains/runtimes/people/people-westend" } -parachains-common = { path = "../parachains/common" } -testnet-parachains-constants = { path = "../parachains/runtimes/constants", default-features = false, features = [ +rococo-parachain-runtime = { workspace = true } +shell-runtime = { workspace = true } +glutton-westend-runtime = { workspace = true } +seedling-runtime = { workspace = true } +asset-hub-rococo-runtime = { workspace = true, default-features = true } +asset-hub-westend-runtime = { workspace = true } +collectives-westend-runtime = { workspace = true } +contracts-rococo-runtime = { workspace = true } +bridge-hub-rococo-runtime = { workspace = true, default-features = true } +coretime-rococo-runtime = { workspace = true } +coretime-westend-runtime = { workspace = true } +bridge-hub-westend-runtime = { workspace = true, default-features = true } +penpal-runtime = { workspace = true } +jsonrpsee = { features = ["server"], workspace = true } +people-rococo-runtime = { workspace = true } +people-westend-runtime = { workspace = true } +parachains-common = { workspace = true, default-features = true } +testnet-parachains-constants = { features = [ "rococo", "westend", -] } +], workspace = true } # Substrate -frame-benchmarking = { path = "../../substrate/frame/benchmarking" } -frame-benchmarking-cli = { path = "../../substrate/utils/frame/benchmarking-cli" } -sp-runtime = { path = "../../substrate/primitives/runtime", default-features = false } -sp-io = { path = "../../substrate/primitives/io" } -sp-core = { path = "../../substrate/primitives/core" } -sp-session = { path = "../../substrate/primitives/session" } -frame-try-runtime = { path = "../../substrate/frame/try-runtime", optional = true } -sc-consensus = { path = "../../substrate/client/consensus/common" } -sp-tracing = { path = "../../substrate/primitives/tracing" } -frame-support = { path = "../../substrate/frame/support" } -sc-cli = { path = "../../substrate/client/cli" } -sc-client-api = { path = "../../substrate/client/api" } -sc-executor = { path = "../../substrate/client/executor" } -sc-service = { path = "../../substrate/client/service" } -sc-telemetry = { path = "../../substrate/client/telemetry" } -sc-transaction-pool = { path = "../../substrate/client/transaction-pool" } -sp-transaction-pool = { path = "../../substrate/primitives/transaction-pool" } -sc-network = { path = "../../substrate/client/network" } -sc-network-sync = { path = "../../substrate/client/network/sync" } -sc-basic-authorship = { path = "../../substrate/client/basic-authorship" } -sp-timestamp = { path = "../../substrate/primitives/timestamp" } -sp-blockchain = { path = "../../substrate/primitives/blockchain" } -sp-genesis-builder = { path = "../../substrate/primitives/genesis-builder", default-features = false } -sp-block-builder = { path = "../../substrate/primitives/block-builder" } -sp-keystore = { path = "../../substrate/primitives/keystore" } -sc-chain-spec = { path = "../../substrate/client/chain-spec" } -sc-rpc = { path = "../../substrate/client/rpc" } -sp-version = { path = "../../substrate/primitives/version" } -sc-tracing = { path = "../../substrate/client/tracing" } -sp-offchain = { path = "../../substrate/primitives/offchain" } -frame-system-rpc-runtime-api = { path = "../../substrate/frame/system/rpc/runtime-api" } -pallet-transaction-payment = { path = "../../substrate/frame/transaction-payment" } -pallet-transaction-payment-rpc-runtime-api = { path = "../../substrate/frame/transaction-payment/rpc/runtime-api" } -sp-std = { path = "../../substrate/primitives/std" } -sp-inherents = { path = "../../substrate/primitives/inherents" } -sp-api = { path = "../../substrate/primitives/api" } -sp-consensus-aura = { path = "../../substrate/primitives/consensus/aura" } -sc-sysinfo = { path = "../../substrate/client/sysinfo" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../substrate/utils/prometheus" } -sc-transaction-pool-api = { path = "../../substrate/client/transaction-pool/api" } -substrate-frame-rpc-system = { path = "../../substrate/utils/frame/rpc/system" } -pallet-transaction-payment-rpc = { path = "../../substrate/frame/transaction-payment/rpc" } -substrate-state-trie-migration-rpc = { path = "../../substrate/utils/frame/rpc/state-trie-migration-rpc" } +frame-benchmarking = { workspace = true, default-features = true } +frame-benchmarking-cli = { workspace = true, default-features = true } +sp-runtime = { workspace = true } +sp-io = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-session = { workspace = true, default-features = true } +frame-try-runtime = { optional = true, workspace = true, default-features = true } +sc-consensus = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } +frame-support = { workspace = true, default-features = true } +sc-cli = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +sc-executor = { workspace = true, default-features = true } +sc-service = { workspace = true, default-features = true } +sc-telemetry = { workspace = true, default-features = true } +sc-transaction-pool = { workspace = true, default-features = true } +sp-transaction-pool = { workspace = true, default-features = true } +sc-network = { workspace = true, default-features = true } +sc-network-sync = { workspace = true, default-features = true } +sc-basic-authorship = { workspace = true, default-features = true } +sp-timestamp = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-genesis-builder = { workspace = true } +sp-block-builder = { workspace = true, default-features = true } +sp-keystore = { workspace = true, default-features = true } +sc-chain-spec = { workspace = true, default-features = true } +sc-rpc = { workspace = true, default-features = true } +sp-version = { workspace = true, default-features = true } +sc-tracing = { workspace = true, default-features = true } +sp-offchain = { workspace = true, default-features = true } +frame-system-rpc-runtime-api = { workspace = true, default-features = true } +pallet-transaction-payment = { workspace = true, default-features = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true, default-features = true } +sp-std = { workspace = true, default-features = true } +sp-inherents = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-consensus-aura = { workspace = true, default-features = true } +sc-sysinfo = { workspace = true, default-features = true } +prometheus-endpoint = { workspace = true, default-features = true } +sc-transaction-pool-api = { workspace = true, default-features = true } +substrate-frame-rpc-system = { workspace = true, default-features = true } +pallet-transaction-payment-rpc = { workspace = true, default-features = true } +substrate-state-trie-migration-rpc = { workspace = true, default-features = true } # Polkadot # Use rococo-native as this is currently the default "local" relay chain -polkadot-cli = { path = "../../polkadot/cli", features = ["rococo-native"] } -polkadot-primitives = { path = "../../polkadot/primitives" } -polkadot-service = { path = "../../polkadot/node/service" } -xcm = { package = "staging-xcm", path = "../../polkadot/xcm" } +polkadot-cli = { features = ["rococo-native"], workspace = true, default-features = true } +polkadot-primitives = { workspace = true, default-features = true } +polkadot-service = { workspace = true, default-features = true } +xcm = { workspace = true, default-features = true } # Cumulus -cumulus-client-cli = { path = "../client/cli" } -cumulus-client-collator = { path = "../client/collator" } -cumulus-client-consensus-aura = { path = "../client/consensus/aura" } -cumulus-client-consensus-relay-chain = { path = "../client/consensus/relay-chain" } -cumulus-client-consensus-common = { path = "../client/consensus/common" } -cumulus-client-consensus-proposer = { path = "../client/consensus/proposer" } -cumulus-client-parachain-inherent = { path = "../client/parachain-inherent" } -cumulus-client-service = { path = "../client/service" } -cumulus-primitives-aura = { path = "../primitives/aura" } -cumulus-primitives-core = { path = "../primitives/core" } -cumulus-relay-chain-interface = { path = "../client/relay-chain-interface" } +cumulus-client-cli = { workspace = true, default-features = true } +cumulus-client-collator = { workspace = true, default-features = true } +cumulus-client-consensus-aura = { workspace = true, default-features = true } +cumulus-client-consensus-relay-chain = { workspace = true, default-features = true } +cumulus-client-consensus-common = { workspace = true, default-features = true } +cumulus-client-consensus-proposer = { workspace = true, default-features = true } +cumulus-client-parachain-inherent = { workspace = true, default-features = true } +cumulus-client-service = { workspace = true, default-features = true } +cumulus-primitives-aura = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } [build-dependencies] -substrate-build-script-utils = { path = "../../substrate/utils/build-script-utils" } +substrate-build-script-utils = { workspace = true, default-features = true } [dev-dependencies] -assert_cmd = "2.0" -nix = { version = "0.28.0", features = ["signal"] } -tempfile = "3.8.0" -tokio = { version = "1.32.0", features = ["macros", "parking_lot", "time"] } -wait-timeout = "0.2" +assert_cmd = { workspace = true } +nix = { features = ["signal"], workspace = true } +tempfile = { workspace = true } +tokio = { features = ["macros", "parking_lot", "time"], workspace = true, default-features = true } +wait-timeout = { workspace = true } [features] default = [] diff --git a/cumulus/primitives/aura/Cargo.toml b/cumulus/primitives/aura/Cargo.toml index ef96f334d63..f17c2035edd 100644 --- a/cumulus/primitives/aura/Cargo.toml +++ b/cumulus/primitives/aura/Cargo.toml @@ -10,17 +10,17 @@ description = "Core primitives for Aura in Cumulus" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } # Substrate -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +sp-api = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } # Polkadot -polkadot-core-primitives = { path = "../../../polkadot/core-primitives", default-features = false } -polkadot-primitives = { path = "../../../polkadot/primitives", default-features = false } +polkadot-core-primitives = { workspace = true } +polkadot-primitives = { workspace = true } [features] default = ["std"] diff --git a/cumulus/primitives/core/Cargo.toml b/cumulus/primitives/core/Cargo.toml index 595aa5f72bf..f41213e9485 100644 --- a/cumulus/primitives/core/Cargo.toml +++ b/cumulus/primitives/core/Cargo.toml @@ -10,20 +10,20 @@ description = "Cumulus related core primitive types and traits" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } +sp-api = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-trie = { workspace = true } # Polkadot -polkadot-core-primitives = { path = "../../../polkadot/core-primitives", default-features = false } -polkadot-parachain-primitives = { path = "../../../polkadot/parachain", default-features = false } -polkadot-primitives = { path = "../../../polkadot/primitives", default-features = false } -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } +polkadot-core-primitives = { workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-primitives = { workspace = true } +xcm = { workspace = true } [features] default = ["std"] diff --git a/cumulus/primitives/parachain-inherent/Cargo.toml b/cumulus/primitives/parachain-inherent/Cargo.toml index 0156eb02e2b..c07fe075456 100644 --- a/cumulus/primitives/parachain-inherent/Cargo.toml +++ b/cumulus/primitives/parachain-inherent/Cargo.toml @@ -10,20 +10,20 @@ license = "Apache-2.0" workspace = true [dependencies] -async-trait = { version = "0.1.79", optional = true } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +async-trait = { optional = true, workspace = true } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-inherents = { path = "../../../substrate/primitives/inherents", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", optional = true, default-features = false } -sp-state-machine = { path = "../../../substrate/primitives/state-machine", optional = true, default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } +sp-core = { workspace = true } +sp-inherents = { workspace = true } +sp-runtime = { optional = true, workspace = true } +sp-state-machine = { optional = true, workspace = true } +sp-std = { workspace = true } +sp-trie = { workspace = true } # Cumulus -cumulus-primitives-core = { path = "../core", default-features = false } +cumulus-primitives-core = { workspace = true } [features] default = ["std"] diff --git a/cumulus/primitives/proof-size-hostfunction/Cargo.toml b/cumulus/primitives/proof-size-hostfunction/Cargo.toml index dd584ce86b2..e61c865d05f 100644 --- a/cumulus/primitives/proof-size-hostfunction/Cargo.toml +++ b/cumulus/primitives/proof-size-hostfunction/Cargo.toml @@ -10,14 +10,14 @@ license = "Apache-2.0" workspace = true [dependencies] -sp-runtime-interface = { path = "../../../substrate/primitives/runtime-interface", default-features = false } -sp-externalities = { path = "../../../substrate/primitives/externalities", default-features = false } -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } +sp-runtime-interface = { workspace = true } +sp-externalities = { workspace = true } +sp-trie = { workspace = true } [dev-dependencies] -sp-state-machine = { path = "../../../substrate/primitives/state-machine" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-io = { path = "../../../substrate/primitives/io" } +sp-state-machine = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/primitives/storage-weight-reclaim/Cargo.toml b/cumulus/primitives/storage-weight-reclaim/Cargo.toml index bdfb83ad72a..af32fb68d8b 100644 --- a/cumulus/primitives/storage-weight-reclaim/Cargo.toml +++ b/cumulus/primitives/storage-weight-reclaim/Cargo.toml @@ -10,24 +10,24 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +sp-runtime = { workspace = true } +sp-std = { workspace = true } -cumulus-primitives-core = { path = "../core", default-features = false } -cumulus-primitives-proof-size-hostfunction = { path = "../proof-size-hostfunction", default-features = false } -docify = "0.2.8" +cumulus-primitives-core = { workspace = true } +cumulus-primitives-proof-size-hostfunction = { workspace = true } +docify = { workspace = true } [dev-dependencies] -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } -cumulus-test-runtime = { path = "../../test/runtime" } +sp-trie = { workspace = true } +sp-io = { workspace = true } +cumulus-test-runtime = { workspace = true } [features] default = ["std"] diff --git a/cumulus/primitives/timestamp/Cargo.toml b/cumulus/primitives/timestamp/Cargo.toml index 7a6f4787ba3..f7bf53a9d7d 100644 --- a/cumulus/primitives/timestamp/Cargo.toml +++ b/cumulus/primitives/timestamp/Cargo.toml @@ -10,16 +10,16 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -futures = "0.3.28" +codec = { features = ["derive"], workspace = true } +futures = { workspace = true } # Substrate -sp-inherents = { path = "../../../substrate/primitives/inherents", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-timestamp = { path = "../../../substrate/primitives/timestamp", default-features = false } +sp-inherents = { workspace = true } +sp-std = { workspace = true } +sp-timestamp = { workspace = true } # Cumulus -cumulus-primitives-core = { path = "../core", default-features = false } +cumulus-primitives-core = { workspace = true } [features] default = ["std"] diff --git a/cumulus/primitives/utility/Cargo.toml b/cumulus/primitives/utility/Cargo.toml index 85e3ac2f760..a2fa2dd9806 100644 --- a/cumulus/primitives/utility/Cargo.toml +++ b/cumulus/primitives/utility/Cargo.toml @@ -10,25 +10,25 @@ description = "Helper datatypes for Cumulus" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } log = { workspace = true } # Substrate -frame-support = { path = "../../../substrate/frame/support", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -pallet-asset-conversion = { path = "../../../substrate/frame/asset-conversion", default-features = false } +frame-support = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +pallet-asset-conversion = { workspace = true } # Polkadot -polkadot-runtime-common = { path = "../../../polkadot/runtime/common", default-features = false } -polkadot-runtime-parachains = { path = "../../../polkadot/runtime/parachains", default-features = false } -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../polkadot/xcm/xcm-executor", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } +polkadot-runtime-common = { workspace = true } +polkadot-runtime-parachains = { workspace = true } +xcm = { workspace = true } +xcm-executor = { workspace = true } +xcm-builder = { workspace = true } # Cumulus -cumulus-primitives-core = { path = "../core", default-features = false } +cumulus-primitives-core = { workspace = true } [features] default = ["std"] diff --git a/cumulus/test/client/Cargo.toml b/cumulus/test/client/Cargo.toml index 120983eb939..fbbaab73ce7 100644 --- a/cumulus/test/client/Cargo.toml +++ b/cumulus/test/client/Cargo.toml @@ -9,43 +9,43 @@ publish = false workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } # Substrate -sc-service = { path = "../../../substrate/client/service" } -sc-consensus = { path = "../../../substrate/client/consensus/common" } -sc-consensus-aura = { path = "../../../substrate/client/consensus/aura" } -sc-block-builder = { path = "../../../substrate/client/block-builder" } -sc-executor = { path = "../../../substrate/client/executor" } -sc-executor-common = { path = "../../../substrate/client/executor/common" } -substrate-test-client = { path = "../../../substrate/test-utils/client" } -sp-application-crypto = { path = "../../../substrate/primitives/application-crypto" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-keyring = { path = "../../../substrate/primitives/keyring" } -sp-keystore = { path = "../../../substrate/primitives/keystore" } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura" } -sp-blockchain = { path = "../../../substrate/primitives/blockchain" } -sp-inherents = { path = "../../../substrate/primitives/inherents" } -sp-io = { path = "../../../substrate/primitives/io" } -sp-timestamp = { path = "../../../substrate/primitives/timestamp" } -frame-system = { path = "../../../substrate/frame/system" } -pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment" } -pallet-balances = { path = "../../../substrate/frame/balances" } +sc-service = { workspace = true, default-features = true } +sc-consensus = { workspace = true, default-features = true } +sc-consensus-aura = { workspace = true, default-features = true } +sc-block-builder = { workspace = true, default-features = true } +sc-executor = { workspace = true, default-features = true } +sc-executor-common = { workspace = true, default-features = true } +substrate-test-client = { workspace = true } +sp-application-crypto = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } +sp-keystore = { workspace = true, default-features = true } +sp-consensus-aura = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-inherents = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +sp-timestamp = { workspace = true, default-features = true } +frame-system = { workspace = true, default-features = true } +pallet-transaction-payment = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } # Polkadot -polkadot-primitives = { path = "../../../polkadot/primitives" } -polkadot-parachain-primitives = { path = "../../../polkadot/parachain" } +polkadot-primitives = { workspace = true, default-features = true } +polkadot-parachain-primitives = { workspace = true, default-features = true } # Cumulus -cumulus-test-runtime = { path = "../runtime" } -cumulus-test-service = { path = "../service" } -cumulus-test-relay-sproof-builder = { path = "../relay-sproof-builder" } -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-primitives-proof-size-hostfunction = { path = "../../primitives/proof-size-hostfunction" } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } -cumulus-primitives-storage-weight-reclaim = { path = "../../primitives/storage-weight-reclaim" } +cumulus-test-runtime = { workspace = true } +cumulus-test-service = { workspace = true } +cumulus-test-relay-sproof-builder = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-primitives-proof-size-hostfunction = { workspace = true, default-features = true } +cumulus-primitives-parachain-inherent = { workspace = true, default-features = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true, default-features = true } [features] runtime-benchmarks = [ diff --git a/cumulus/test/relay-sproof-builder/Cargo.toml b/cumulus/test/relay-sproof-builder/Cargo.toml index d775c61f780..454266c90ba 100644 --- a/cumulus/test/relay-sproof-builder/Cargo.toml +++ b/cumulus/test/relay-sproof-builder/Cargo.toml @@ -10,19 +10,19 @@ description = "Mocked relay state proof builder for testing Cumulus." workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } # Substrate -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-state-machine = { path = "../../../substrate/primitives/state-machine", default-features = false } -sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } +sp-runtime = { workspace = true } +sp-state-machine = { workspace = true } +sp-trie = { workspace = true } +sp-std = { workspace = true } # Polkadot -polkadot-primitives = { path = "../../../polkadot/primitives", default-features = false } +polkadot-primitives = { workspace = true } # Cumulus -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } +cumulus-primitives-core = { workspace = true } [features] default = ["std"] diff --git a/cumulus/test/runtime/Cargo.toml b/cumulus/test/runtime/Cargo.toml index b14e3b7f040..fc0eb3ce742 100644 --- a/cumulus/test/runtime/Cargo.toml +++ b/cumulus/test/runtime/Cargo.toml @@ -9,48 +9,48 @@ publish = false workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } # Substrate -frame-executive = { path = "../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -frame-system-rpc-runtime-api = { path = "../../../substrate/frame/system/rpc/runtime-api", default-features = false } -pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../substrate/frame/message-queue", default-features = false } -pallet-sudo = { path = "../../../substrate/frame/sudo", default-features = false } -pallet-aura = { path = "../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../substrate/frame/authorship", default-features = false } -pallet-timestamp = { path = "../../../substrate/frame/timestamp", default-features = false } -pallet-glutton = { path = "../../../substrate/frame/glutton", default-features = false } -pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } -pallet-session = { path = "../../../substrate/frame/session", default-features = false } -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../substrate/primitives/block-builder", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../substrate/primitives/inherents", default-features = false } -sp-io = { path = "../../../substrate/primitives/io", default-features = false } -sp-offchain = { path = "../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../substrate/primitives/session", default-features = false } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-transaction-pool = { path = "../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../substrate/primitives/version", default-features = false } +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-sudo = { workspace = true } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-glutton = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-session = { workspace = true } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-io = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-std = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Cumulus -cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../parachains/pallets/parachain-info", default-features = false } -cumulus-primitives-aura = { path = "../../primitives/aura", default-features = false } -pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } -cumulus-pallet-aura-ext = { path = "../../pallets/aura-ext", default-features = false } -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../primitives/storage-weight-reclaim", default-features = false } +cumulus-pallet-parachain-system = { workspace = true } +parachain-info = { workspace = true } +cumulus-primitives-aura = { workspace = true } +pallet-collator-selection = { workspace = true } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [features] default = ["std"] diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index 732d884528f..c40863b90b5 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -13,96 +13,96 @@ name = "test-parachain" path = "src/main.rs" [dependencies] -async-trait = "0.1.79" -clap = { version = "4.5.3", features = ["derive"] } -codec = { package = "parity-scale-codec", version = "3.6.12" } -criterion = { version = "0.5.1", features = ["async_tokio"] } -jsonrpsee = { version = "0.22", features = ["server"] } -rand = "0.8.5" +async-trait = { workspace = true } +clap = { features = ["derive"], workspace = true } +codec = { workspace = true, default-features = true } +criterion = { features = ["async_tokio"], workspace = true, default-features = true } +jsonrpsee = { features = ["server"], workspace = true } +rand = { workspace = true, default-features = true } serde = { features = ["derive"], workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } -tokio = { version = "1.32.0", features = ["macros"] } -tracing = "0.1.37" -url = "2.4.0" -tempfile = "3.8.0" +tokio = { features = ["macros"], workspace = true, default-features = true } +tracing = { workspace = true, default-features = true } +url = { workspace = true } +tempfile = { workspace = true } # Substrate -frame-system = { path = "../../../substrate/frame/system" } -frame-system-rpc-runtime-api = { path = "../../../substrate/frame/system/rpc/runtime-api" } -pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment" } -sc-basic-authorship = { path = "../../../substrate/client/basic-authorship" } -sc-chain-spec = { path = "../../../substrate/client/chain-spec" } -sc-client-api = { path = "../../../substrate/client/api" } -sc-consensus = { path = "../../../substrate/client/consensus/common" } -sc-consensus-aura = { path = "../../../substrate/client/consensus/aura" } -sc-executor = { path = "../../../substrate/client/executor" } -sc-network = { path = "../../../substrate/client/network" } -sc-service = { path = "../../../substrate/client/service" } -sc-tracing = { path = "../../../substrate/client/tracing" } -sc-transaction-pool = { path = "../../../substrate/client/transaction-pool" } -sc-transaction-pool-api = { path = "../../../substrate/client/transaction-pool/api" } -sc-telemetry = { path = "../../../substrate/client/telemetry" } -sp-arithmetic = { path = "../../../substrate/primitives/arithmetic" } -sp-blockchain = { path = "../../../substrate/primitives/blockchain" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-io = { path = "../../../substrate/primitives/io" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-keyring = { path = "../../../substrate/primitives/keyring" } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-state-machine = { path = "../../../substrate/primitives/state-machine" } -sp-tracing = { path = "../../../substrate/primitives/tracing" } -sp-timestamp = { path = "../../../substrate/primitives/timestamp" } -sp-consensus = { path = "../../../substrate/primitives/consensus/common" } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura" } -substrate-test-client = { path = "../../../substrate/test-utils/client" } -sc-cli = { path = "../../../substrate/client/cli" } -sc-block-builder = { path = "../../../substrate/client/block-builder" } -sc-executor-wasmtime = { path = "../../../substrate/client/executor/wasmtime" } -sc-executor-common = { path = "../../../substrate/client/executor/common" } +frame-system = { workspace = true, default-features = true } +frame-system-rpc-runtime-api = { workspace = true, default-features = true } +pallet-transaction-payment = { workspace = true, default-features = true } +sc-basic-authorship = { workspace = true, default-features = true } +sc-chain-spec = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +sc-consensus = { workspace = true, default-features = true } +sc-consensus-aura = { workspace = true, default-features = true } +sc-executor = { workspace = true, default-features = true } +sc-network = { workspace = true, default-features = true } +sc-service = { workspace = true, default-features = true } +sc-tracing = { workspace = true, default-features = true } +sc-transaction-pool = { workspace = true, default-features = true } +sc-transaction-pool-api = { workspace = true, default-features = true } +sc-telemetry = { workspace = true, default-features = true } +sp-arithmetic = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } +sp-runtime = { workspace = true } +sp-state-machine = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } +sp-timestamp = { workspace = true, default-features = true } +sp-consensus = { workspace = true, default-features = true } +sp-consensus-aura = { workspace = true, default-features = true } +substrate-test-client = { workspace = true } +sc-cli = { workspace = true, default-features = true } +sc-block-builder = { workspace = true, default-features = true } +sc-executor-wasmtime = { workspace = true, default-features = true } +sc-executor-common = { workspace = true, default-features = true } # Polkadot -polkadot-primitives = { path = "../../../polkadot/primitives" } -polkadot-service = { path = "../../../polkadot/node/service" } -polkadot-test-service = { path = "../../../polkadot/node/test/service" } -polkadot-cli = { path = "../../../polkadot/cli" } -polkadot-node-subsystem = { path = "../../../polkadot/node/subsystem" } -polkadot-overseer = { path = "../../../polkadot/node/overseer" } +polkadot-primitives = { workspace = true, default-features = true } +polkadot-service = { workspace = true, default-features = true } +polkadot-test-service = { workspace = true } +polkadot-cli = { workspace = true, default-features = true } +polkadot-node-subsystem = { workspace = true, default-features = true } +polkadot-overseer = { workspace = true, default-features = true } # Cumulus -cumulus-client-cli = { path = "../../client/cli" } -parachains-common = { path = "../../parachains/common" } -cumulus-client-consensus-common = { path = "../../client/consensus/common" } -cumulus-client-consensus-proposer = { path = "../../client/consensus/proposer" } -cumulus-client-consensus-aura = { path = "../../client/consensus/aura" } -cumulus-client-consensus-relay-chain = { path = "../../client/consensus/relay-chain" } -cumulus-client-parachain-inherent = { path = "../../client/parachain-inherent" } -cumulus-client-service = { path = "../../client/service" } -cumulus-client-collator = { path = "../../client/collator" } -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-relay-chain-inprocess-interface = { path = "../../client/relay-chain-inprocess-interface" } -cumulus-relay-chain-interface = { path = "../../client/relay-chain-interface" } -cumulus-test-runtime = { path = "../runtime" } -cumulus-relay-chain-minimal-node = { path = "../../client/relay-chain-minimal-node" } -cumulus-client-pov-recovery = { path = "../../client/pov-recovery" } -cumulus-test-relay-sproof-builder = { path = "../relay-sproof-builder" } -cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../primitives/storage-weight-reclaim" } -pallet-timestamp = { path = "../../../substrate/frame/timestamp" } +cumulus-client-cli = { workspace = true, default-features = true } +parachains-common = { workspace = true, default-features = true } +cumulus-client-consensus-common = { workspace = true, default-features = true } +cumulus-client-consensus-proposer = { workspace = true, default-features = true } +cumulus-client-consensus-aura = { workspace = true, default-features = true } +cumulus-client-consensus-relay-chain = { workspace = true, default-features = true } +cumulus-client-parachain-inherent = { workspace = true, default-features = true } +cumulus-client-service = { workspace = true, default-features = true } +cumulus-client-collator = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-relay-chain-inprocess-interface = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } +cumulus-test-runtime = { workspace = true } +cumulus-relay-chain-minimal-node = { workspace = true, default-features = true } +cumulus-client-pov-recovery = { workspace = true, default-features = true } +cumulus-test-relay-sproof-builder = { workspace = true, default-features = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true, default-features = true } +pallet-timestamp = { workspace = true, default-features = true } [dev-dependencies] -futures = "0.3.28" -portpicker = "0.1.1" -rococo-parachain-runtime = { path = "../../parachains/runtimes/testing/rococo-parachain" } -sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa" } -sp-authority-discovery = { path = "../../../substrate/primitives/authority-discovery" } -cumulus-test-client = { path = "../client" } +futures = { workspace = true } +portpicker = { workspace = true } +rococo-parachain-runtime = { workspace = true } +sp-consensus-grandpa = { workspace = true, default-features = true } +sp-authority-discovery = { workspace = true, default-features = true } +cumulus-test-client = { workspace = true } # Polkadot dependencies -polkadot-test-service = { path = "../../../polkadot/node/test/service" } +polkadot-test-service = { workspace = true } # Substrate dependencies -sc-cli = { path = "../../../substrate/client/cli" } -substrate-test-utils = { path = "../../../substrate/test-utils" } +sc-cli = { workspace = true, default-features = true } +substrate-test-utils = { workspace = true } [features] runtime-benchmarks = [ diff --git a/cumulus/xcm/xcm-emulator/Cargo.toml b/cumulus/xcm/xcm-emulator/Cargo.toml index 0ed77bf5b70..ba1097fba07 100644 --- a/cumulus/xcm/xcm-emulator/Cargo.toml +++ b/cumulus/xcm/xcm-emulator/Cargo.toml @@ -10,36 +10,36 @@ license = "Apache-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12" } -paste = "1.0.14" +codec = { workspace = true, default-features = true } +paste = { workspace = true, default-features = true } log = { workspace = true } -lazy_static = "1.4.0" -impl-trait-for-tuples = "0.2.2" +lazy_static = { workspace = true } +impl-trait-for-tuples = { workspace = true } # Substrate -frame-support = { path = "../../../substrate/frame/support" } -frame-system = { path = "../../../substrate/frame/system" } -sp-io = { path = "../../../substrate/primitives/io" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-crypto-hashing = { path = "../../../substrate/primitives/crypto/hashing" } -sp-std = { path = "../../../substrate/primitives/std" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-arithmetic = { path = "../../../substrate/primitives/arithmetic" } -sp-tracing = { path = "../../../substrate/primitives/tracing" } -pallet-balances = { path = "../../../substrate/frame/balances" } -pallet-message-queue = { path = "../../../substrate/frame/message-queue" } +frame-support = { workspace = true, default-features = true } +frame-system = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-crypto-hashing = { workspace = true, default-features = true } +sp-std = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-arithmetic = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +pallet-message-queue = { workspace = true, default-features = true } # Cumulus -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue" } -cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system" } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } -cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder" } -parachains-common = { path = "../../parachains/common" } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-pallet-xcmp-queue = { workspace = true, default-features = true } +cumulus-pallet-parachain-system = { workspace = true, default-features = true } +cumulus-primitives-parachain-inherent = { workspace = true, default-features = true } +cumulus-test-relay-sproof-builder = { workspace = true, default-features = true } +parachains-common = { workspace = true, default-features = true } # Polkadot -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm" } -xcm-executor = { package = "staging-xcm-executor", path = "../../../polkadot/xcm/xcm-executor" } -polkadot-primitives = { path = "../../../polkadot/primitives" } -polkadot-parachain-primitives = { path = "../../../polkadot/parachain" } -polkadot-runtime-parachains = { path = "../../../polkadot/runtime/parachains" } +xcm = { workspace = true, default-features = true } +xcm-executor = { workspace = true, default-features = true } +polkadot-primitives = { workspace = true, default-features = true } +polkadot-parachain-primitives = { workspace = true, default-features = true } +polkadot-runtime-parachains = { workspace = true, default-features = true } diff --git a/docs/sdk/Cargo.toml b/docs/sdk/Cargo.toml index ee603f8c494..7d3d2da51ab 100644 --- a/docs/sdk/Cargo.toml +++ b/docs/sdk/Cargo.toml @@ -15,101 +15,101 @@ workspace = true [dependencies] # Needed for all FRAME-based code -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.6.0", default-features = false } -frame = { package = "polkadot-sdk-frame", path = "../../substrate/frame", features = [ +codec = { workspace = true } +scale-info = { workspace = true } +frame = { features = [ "experimental", "runtime", -] } -pallet-examples = { path = "../../substrate/frame/examples" } -pallet-default-config-example = { path = "../../substrate/frame/examples/default-config" } -pallet-example-offchain-worker = { path = "../../substrate/frame/examples/offchain-worker" } +], workspace = true, default-features = true } +pallet-examples = { workspace = true } +pallet-default-config-example = { workspace = true, default-features = true } +pallet-example-offchain-worker = { workspace = true, default-features = true } # How we build docs in rust-docs simple-mermaid = "0.1.1" -docify = "0.2.8" +docify = { workspace = true } # Polkadot SDK deps, typically all should only be in scope such that we can link to their doc item. -polkadot-sdk = { path = "../../umbrella", features = ["runtime"] } -node-cli = { package = "staging-node-cli", path = "../../substrate/bin/node/cli" } -kitchensink-runtime = { path = "../../substrate/bin/node/runtime" } -chain-spec-builder = { package = "staging-chain-spec-builder", path = "../../substrate/bin/utils/chain-spec-builder" } -subkey = { path = "../../substrate/bin/utils/subkey" } -frame-system = { path = "../../substrate/frame/system", default-features = false } -frame-support = { path = "../../substrate/frame/support", default-features = false } -frame-executive = { path = "../../substrate/frame/executive", default-features = false } -pallet-example-single-block-migrations = { path = "../../substrate/frame/examples/single-block-migrations" } -frame-metadata-hash-extension = { path = "../../substrate/frame/metadata-hash-extension" } +polkadot-sdk = { features = ["runtime"], workspace = true, default-features = true } +node-cli = { workspace = true } +kitchensink-runtime = { workspace = true } +chain-spec-builder = { workspace = true, default-features = true } +subkey = { workspace = true, default-features = true } +frame-system = { workspace = true } +frame-support = { workspace = true } +frame-executive = { workspace = true } +pallet-example-single-block-migrations = { workspace = true, default-features = true } +frame-metadata-hash-extension = { workspace = true, default-features = true } # Substrate Client -sc-network = { path = "../../substrate/client/network" } -sc-rpc-api = { path = "../../substrate/client/rpc-api" } -sc-rpc = { path = "../../substrate/client/rpc" } -sc-client-db = { path = "../../substrate/client/db" } -sc-cli = { path = "../../substrate/client/cli" } -sc-consensus-aura = { path = "../../substrate/client/consensus/aura" } -sc-consensus-babe = { path = "../../substrate/client/consensus/babe" } -sc-consensus-grandpa = { path = "../../substrate/client/consensus/grandpa" } -sc-consensus-beefy = { path = "../../substrate/client/consensus/beefy" } -sc-consensus-manual-seal = { path = "../../substrate/client/consensus/manual-seal" } -sc-consensus-pow = { path = "../../substrate/client/consensus/pow" } -sc-executor = { path = "../../substrate/client/executor" } -sc-service = { path = "../../substrate/client/service" } -sc-chain-spec = { path = "../../substrate/client/chain-spec" } +sc-network = { workspace = true, default-features = true } +sc-rpc-api = { workspace = true, default-features = true } +sc-rpc = { workspace = true, default-features = true } +sc-client-db = { workspace = true, default-features = true } +sc-cli = { workspace = true, default-features = true } +sc-consensus-aura = { workspace = true, default-features = true } +sc-consensus-babe = { workspace = true, default-features = true } +sc-consensus-grandpa = { workspace = true, default-features = true } +sc-consensus-beefy = { workspace = true, default-features = true } +sc-consensus-manual-seal = { workspace = true, default-features = true } +sc-consensus-pow = { workspace = true, default-features = true } +sc-executor = { workspace = true, default-features = true } +sc-service = { workspace = true, default-features = true } +sc-chain-spec = { workspace = true, default-features = true } -substrate-wasm-builder = { path = "../../substrate/utils/wasm-builder" } +substrate-wasm-builder = { workspace = true, default-features = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../cumulus/pallets/aura-ext" } -cumulus-pallet-parachain-system = { path = "../../cumulus/pallets/parachain-system" } -parachain-info = { package = "staging-parachain-info", path = "../../cumulus/parachains/pallets/parachain-info" } -cumulus-primitives-proof-size-hostfunction = { path = "../../cumulus/primitives/proof-size-hostfunction" } -cumulus-client-service = { path = "../../cumulus/client/service" } -cumulus-primitives-storage-weight-reclaim = { path = "../../cumulus/primitives/storage-weight-reclaim" } +cumulus-pallet-aura-ext = { workspace = true, default-features = true } +cumulus-pallet-parachain-system = { workspace = true, default-features = true } +parachain-info = { workspace = true, default-features = true } +cumulus-primitives-proof-size-hostfunction = { workspace = true, default-features = true } +cumulus-client-service = { workspace = true, default-features = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true, default-features = true } # Pallets and FRAME internals -pallet-aura = { path = "../../substrate/frame/aura" } -pallet-timestamp = { path = "../../substrate/frame/timestamp" } -pallet-balances = { path = "../../substrate/frame/balances" } -pallet-assets = { path = "../../substrate/frame/assets" } -pallet-preimage = { path = "../../substrate/frame/preimage" } -pallet-transaction-payment = { path = "../../substrate/frame/transaction-payment" } -pallet-utility = { path = "../../substrate/frame/utility" } -pallet-multisig = { path = "../../substrate/frame/multisig" } -pallet-proxy = { path = "../../substrate/frame/proxy" } -pallet-authorship = { path = "../../substrate/frame/authorship" } -pallet-collective = { path = "../../substrate/frame/collective" } -pallet-democracy = { path = "../../substrate/frame/democracy" } -pallet-uniques = { path = "../../substrate/frame/uniques" } -pallet-nfts = { path = "../../substrate/frame/nfts" } -pallet-scheduler = { path = "../../substrate/frame/scheduler" } -pallet-referenda = { path = "../../substrate/frame/referenda" } -pallet-broker = { path = "../../substrate/frame/broker" } -pallet-babe = { path = "../../substrate/frame/babe" } +pallet-aura = { workspace = true, default-features = true } +pallet-timestamp = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +pallet-assets = { workspace = true, default-features = true } +pallet-preimage = { workspace = true, default-features = true } +pallet-transaction-payment = { workspace = true, default-features = true } +pallet-utility = { workspace = true, default-features = true } +pallet-multisig = { workspace = true, default-features = true } +pallet-proxy = { workspace = true, default-features = true } +pallet-authorship = { workspace = true, default-features = true } +pallet-collective = { workspace = true, default-features = true } +pallet-democracy = { workspace = true, default-features = true } +pallet-uniques = { workspace = true, default-features = true } +pallet-nfts = { workspace = true, default-features = true } +pallet-scheduler = { workspace = true, default-features = true } +pallet-referenda = { workspace = true, default-features = true } +pallet-broker = { workspace = true, default-features = true } +pallet-babe = { workspace = true, default-features = true } # Primitives -sp-io = { path = "../../substrate/primitives/io" } -sp-std = { path = "../../substrate/primitives/std" } -sp-tracing = { path = "../../substrate/primitives/tracing" } -sp-runtime-interface = { path = "../../substrate/primitives/runtime-interface" } -sp-api = { path = "../../substrate/primitives/api" } -sp-core = { path = "../../substrate/primitives/core" } -sp-keyring = { path = "../../substrate/primitives/keyring" } -sp-runtime = { path = "../../substrate/primitives/runtime" } -sp-arithmetic = { path = "../../substrate/primitives/arithmetic" } -sp-genesis-builder = { path = "../../substrate/primitives/genesis-builder" } -sp-offchain = { path = "../../substrate/primitives/offchain" } -sp-version = { path = "../../substrate/primitives/version" } +sp-io = { workspace = true, default-features = true } +sp-std = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } +sp-runtime-interface = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-arithmetic = { workspace = true, default-features = true } +sp-genesis-builder = { workspace = true, default-features = true } +sp-offchain = { workspace = true, default-features = true } +sp-version = { workspace = true, default-features = true } # XCM -xcm = { package = "staging-xcm", path = "../../polkadot/xcm" } -xcm-docs = { path = "../../polkadot/xcm/docs" } +xcm = { workspace = true, default-features = true } +xcm-docs = { workspace = true } # runtime guides -chain-spec-guide-runtime = { path = "./src/reference_docs/chain_spec_runtime" } +chain-spec-guide-runtime = { workspace = true } # Templates -minimal-template-runtime = { path = "../../templates/minimal/runtime" } -solochain-template-runtime = { path = "../../templates/solochain/runtime" } -parachain-template-runtime = { path = "../../templates/parachain/runtime" } +minimal-template-runtime = { workspace = true } +solochain-template-runtime = { workspace = true } +parachain-template-runtime = { workspace = true } diff --git a/docs/sdk/src/reference_docs/chain_spec_runtime/Cargo.toml b/docs/sdk/src/reference_docs/chain_spec_runtime/Cargo.toml index c6dd3af9d90..9cf921a492a 100644 --- a/docs/sdk/src/reference_docs/chain_spec_runtime/Cargo.toml +++ b/docs/sdk/src/reference_docs/chain_spec_runtime/Cargo.toml @@ -10,44 +10,44 @@ edition.workspace = true publish = false [dependencies] -docify = "0.2.8" -parity-scale-codec = { version = "3.6.12", default-features = false } -scale-info = { version = "2.6.0", default-features = false } -serde = { workspace = true, default-features = false } +docify = { workspace = true } +codec = { workspace = true } +scale-info = { workspace = true } +serde = { workspace = true } serde_json = { workspace = true } # this is a frame-based runtime, thus importing `frame` with runtime feature enabled. -frame = { package = "polkadot-sdk-frame", path = "../../../../../substrate/frame", default-features = false, features = [ +frame = { features = [ "experimental", "runtime", -] } +], workspace = true } # pallets that we want to use -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-sudo = { path = "../../../../../substrate/frame/sudo", default-features = false } -pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } +pallet-balances = { workspace = true } +pallet-sudo = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } # genesis builder that allows us to interact with runtime genesis config -sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false, features = ["serde"] } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -sp-keyring = { path = "../../../../../substrate/primitives/keyring", default-features = false } -sp-application-crypto = { path = "../../../../../substrate/primitives/application-crypto", default-features = false, features = ["serde"] } +sp-genesis-builder = { workspace = true } +sp-runtime = { features = ["serde"], workspace = true } +sp-core = { workspace = true } +sp-std = { workspace = true } +sp-keyring = { workspace = true } +sp-application-crypto = { features = ["serde"], workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [dev-dependencies] -chain-spec-builder = { package = "staging-chain-spec-builder", path = "../../../../../substrate/bin/utils/chain-spec-builder" } -sc-chain-spec = { path = "../../../../../substrate/client/chain-spec" } +chain-spec-builder = { workspace = true, default-features = true } +sc-chain-spec = { workspace = true, default-features = true } [features] default = ["std"] std = [ - "parity-scale-codec/std", + "codec/std", "scale-info/std", "frame/std", diff --git a/master.wasm b/master.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7ebb14371243afa4956a107374b27a4e686f0360 GIT binary patch literal 2462034 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

V?W3+S>c7t2jg^ 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�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 z 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⪙qF{L8I6Z;8o$<;1Yf4O(+9BXh1L& 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�|M&NZt&lyH-v&`>1WzS$lSK2fk+Mh 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 z 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

3xsscljZIzPzJ(JL@t1 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�spjUJ0{T4kpnHFg*v$s6R3Shw) z2~s#ynt?iyijOx;VE7RQFjFdX+8oGX6H?5x7L7j+?UD+A1&azvEkawRdPRUrj{}~1 zlzOwf)yS??AZX1ePo?V#>3L5-qy?Y~puhFp0x=-31u-v$zu+^^sBbfAKpi>+O77Uw zHepv&D!>#Ku-j)a`1*Gji68*3RS_71_Jo?Gy+1R@6`86LwW-)4F9%P+EZq`D3^d_` zQ4I|f86@KcgW}bZ)?h>Ci1~06Powo{L5^TShGF8%bwL_+9kTqI!sq06pPUMX(i{fnW&Kc42D4&@shbwy zL+6g(rI(>^rwjtuyuQVu@WVbb9MG4#4Gp1KJDkI-!O0vt9=^;$ipP^a`$T6#FA%_{ zA1T=DxW)4bik;9XXZc0e?k3v=kYTjt`y3cj9!$#eCV2145MAn71W+#gMVGZE3R5sp zbn(a4pxKOVAFTxtMAkEA`Q1V(OR$2v-?~+>w(WTduQ_C128}}|NoQ_F?~L19SyS<) zaM<1trRSkR7-9&OCkDLEYap#TSl^|HlaCK5gZ#(YQIAsHI8VLZq3oio*29|jWpRW& zV-9L`#J->bB$&1E@waNd*YwSgTZ=+MM3702=}i^hhb|Y3<1x5AB8#uu%M62`g;*}V z`*{5X_B0|2-)%a|L$k||eye37VdjNKUKP4SWg%zF8#GDwE7HK+6rWEdFU7${ET=N! z_jF%oaSRq8z21MNaIGR_4<$Daj8x8z=>5ae>yYW+FJs$2)Rd@;_E|lPNc|6wTDtep!ejVh)V=vE?+OFGcSTbM@+w@XN>bb-)}J`-fe*{ z9a+U5X_VXV+$U4C+u$zgrlGWPKa0$JWI|ZG7g513#@8w0ZraE>i2Ku52?XRqOK>k^ znCp*k0$~gOgjtD?6H*Tibd8c89MZC{p`=4Ns3tHSE_vrJFMU)DG?!2qjRYlUfyI3| zB<&+CmC=X#+U>0?*3%(lA$YFU*{Fx&-%WoTzFM%ViwAYa;J)e>5U;8l%`v|f5Fmn# zoF07(dE0m+;OBAjSs|Bb(cw8rme9GE*tsKRBLbQUKHRulOB;5Ab5I`9nM#=%ef$2| zfPX1}!-w$9Oj!HQTzV@!knqRTB~9O^OrwGxz+xJPn2y1Tq%Il0p=8Cf?ug*)axM>4n_?(^I#-pj%NK8yTQ|9 zY5@IvL8BlJ^{S6B*d;)K;SYS_zVZX~e70Q)s0e5ieoW8VEs8(G1(4fW zt-mAqSk8Gn9jn+e>zs*4an+)8SOvCQAmtFc&3`K{9$( zo?;XF(%wzQ?>OFK&#d?_*{Ii6c@I|=`=*Q(iV-G(c!c!fghP1F1A$}?t^b0jE5;LU z4?g%ffIm@Zj$sSr{da_FPd5x5a4j7r?nOE66y3}yjT_47kt#9~NW26nfp{7WyUhzS z#c&<1gy$uV?;v}cNa{f|Pg)7hu|^QbQ6w~X(l`^|sE&HZ;wgQP{`)=m$(Kx}1(96C zlF;P76+@6`vR~<9#RKyBIkOD@x?0LhNQI!r`VX?d(ZxwHkyFldN{cwHyw@r4dWth^ zHAnCNpXkJud#mh8`MGg$q?|!0#pI2C!+R^Eq68R>LrCMt@Vg)_$Aw+~6~y+wuILF7AHI zUvo+vO`jJ!eR6<(tdx$py7{JQN-TkHtLS#~@f=u=5Jo#4Ew!LY>RW`z>R<>d|78p{ zlvj=}!l2LBRv`%Eswqq_ovI>fh>2=K|6mcEli)=(-AzsSv!uY`X@#lERXDoDn1>I6 zyW%nJQvr;GbO_*wo%;E2Bce7iT#Y&z!@->uCRsZ@Tydv_4sJ8^fY%zkr{-mhOmhaz zi3$s~j!mW13$8Z4vad&O@no?N-R-zonMU1eKXXM>Yd#OPUXh_Y+LmnY!6W4!ifs|N$_6sslMdYg&nEpu4!a^ zu~IsRn7WE!SEjj{Y@ICJ!%i?;6b2@IH+%|+^JL?Z@`%ze$;DHWc@Urdq^sJub@%-? zN4eq*oT(%*GZ=UyaI{=yeE|R0+h3Bx-vobSIkm9O`3fi(AMRMLr7K#snTa@m)yB5v za(8`>416`zTqf$5y{k8gag7wWu(hyIt(1c#$JSSmyY5-zA95=svLZ1nx~iM2kPQpM zau(ozFM$>ywR*aZyC8D(|C1rmhI$hj<*3$QU`@{mCXZW7S@Hh~6Ma2el{4N4rm~1= zg-Q}JIrfY?-Z(DZI%x$E5WCu3mKOyZC~8tcE<(c`@gp^dwL}_~YGvud&n;b!z-G0q z=}dsNz2cTT&|(-2joTa+evAtUY;kJ@(zvPvv#NZn>v;K4@Db{uV zFTE91(?QcUy`U^O_OYcnVXRx-*(*PP*-cq8@JAfo~w&&;PgdA z%Sg?9N&h+j&E{4tCpv_Qub;A0elE>z+&IyHHSA}%jb-8*;&2<^_MMPR+(wk> zrIi@WzICUxyCJT0`$g*ak+Uw?@Ey2E@Uvq0kvb_d?9Q_g0eOXo)x+6#M*fp1H}PY% zbZ9OU^OSJ!m1y1l8d508osg4~WHooH>q|4{p~SZ04{GQF(UtqUu1r;>XRxM$Q=+)? zz^qGno71gMB~Z|!y_@gOw(eMHk8)y$I`WG}{Fq=yP_YRUSDN&LsGzjs>;OQ#@5SYC zw(DzNp5k`;P;8vgD%-@fb)Y+TzE%wS@Px$lpl)%%J?j`^Phq%zrjS8ppqEFrOa^}+ zs#@G3(HKMiw^&>RlsLt(u%I5O8YdTD_BdH;6*<|rE~pkZtwTUJNZ}EXd!9JqsoC76z=E(vx$7{snu1}CY ztk*&weU`im6~mUbwx1PaoKnC`)RUUP0X38CgbNfzp7s2M8YFj08-mB`JI-Jb)2FcK z5uk7g_awnRSBhIscO2Bv%G^&>c2`qX+`UfBSb;+jI9+nEP00J9oKw)HL7dlYGy-8+ zfNr)aYtm+g$CcfKA`sQPqwjKnrviIK^>?N|5@K@JDLierKYV#As0>uH&$02t>ACd8 z1U6rb;9RJK6hK_Vb|(s&ytQCkI2p;~xnEuHG)6hTNqsq4n8`D`E{8A_Tfw~1~(4*2R?u90_bkW>TLBFZq zc)f}{oPA4*E+@@fo(w#6;bRlcD`C-F%^SCF68~A_fvS6Qe-WJFPA6UJb zQa1p_2)VTJGYnMp&x4#jv*$R+n6QFMRKgSUkwdffw8fpk$6(XM8R9m-uTM&om-jZ( z(ppPJizAdj6!0?7i~A>L5cbX-IUe3%CMD&>^Et^$A$eN;?qKd(A7=T(fwGei?Ub>w z{F#7wVH6l8x7|1L9lBuGw84JQ=K^e%@;(k2!#X(HE0kSO^&Dk2r`abpVPJ=={)lh()NH zfdroR-_|tU$igGFQR7Hl_rWg^g2B?)?})_K*( zN_$k?sS9kI_?t)kQy}y?JZ^@@H8UUp5I$$SXgO6n=4}W-aR6bZHIoHYdT1_3L8#(= zm|~95j>7gLs~?- zUP}!$1PTkzFSfAwDtKiv3~W|u9+@aqK7+dNWb!Z~~C8}lh0+C#0 zf@1>1`eTf-k`ROusy(zW@tiL&AzQNWIkfHdR*RFGED~d57r}Gx|4`T>07`Ww;cP2{ zxg}luI0>$wOi;)RzV$~bo&TtqW^aAsJ9V96prefzl?aZIn;ud{h0&R!&5twh z26RW$5~JyH%eraI+@-_G<_Q&A6il1`Z%|vq>5LafuRa!^CjTTQCA0fX%fqQEZAP#O zyuhX`6Y^8S&BG582fE52<7Zs8E{MvoaECqF*1H0)B(cW};kSnXqb-wq0udzjW+5M; z-JjRxQ?I5Tj(CJ-OY}&lq8s%Ml0&-vbv>$kFHIjTb6=9uIfN2=*l1C0Sc56~;6V6~ z1My~XsosUxl=wcPMdLw%JT1ez-`2(!02>!B1JDqO;~@YsxIkIF<;HTr2>&#rO4XU0 z*nmW&GHBbPpCD@U&1r6+a^H#YCt;B(gNH|`b>W#Ar+OWcviw|0ZTf7IRgaOt+GP#F zDQQcz^@;{TuM`bJq5&0xl_!~+k14;7dQAEt%U%b3_ag~&W>o^D8G23Uog)6I=G{%T zV95fMTU7>XA!0#UPiI?xjre`Z3gV27+qEe5k=PN5)T&EhB@)(TQyKiGPV7(qSV`T@ z-5&QCrFUy)Q8Lm$6nZsCU9iJz7#!?kfBPh@(G=SxI)S`WS4vM>z#-|qa`%}%3nzd7 zOHCJ?F=Fw0u!w!Qo0$oHdX*u5*J#q~t-)<1NG4GD&H%VTE^{AMrUOllqqs~+u_bhQ zGe+P|Qu#b$Jq+~yGoH17C{S6W$V%x5z$*ay(VV5jMni2^y25?$xRV)i1}IoS}y){k`5R+gOH$I!6@(m_PngM!u}T z&?FgZ!e2g%76m)Opa%CUc%^b%l=-ZAD=MJG&qhSVfz;WW0@G3ymauY_+2z_?p~{dP z>GyS;KtS@#c^LtLs>@ysi0`IqtsiwkEf=pl6InLF+?I#v3;mH+ASWb6`ezAEPSd-V z^dlW?t4IghpiJm;F$SS}@x!aq#0H_R8A^ed0GM%vHt4h?AD^(Qi`XNT;VKf4_tfRq zOpQu9VK*fn+uN}vOa`#w0n?~ZY(>@)DsxkCDJMSATJNRO+UdV@ZN-8<0&3;^u$d?c zAfh%5_6TnMz?gc(&jQ^VC-K+^A3m|Hx!IQQsRd$B?KFl7NwtlWWno2Dp^`c(D3gD4 zh)n@^|NK2-{@{q?;(I-VZH_B5YzzykE=A-we*dB4P9c7v{*)}>XX-f%KA&TibK%6U zX!ovhu;#Op7>H5%C-AN;eup>$?>u-3GStC2LF&$*g;~E99Hy^~M-=d5pJ=>n6<$9w zLSH+yQe`JWu9W+FT%BYQM})0S)mmpn!_we0q@R8(8rg>dUB+U(5rITNMe6f8-$-I+ zc7La^N)us zlQk5s@nt9N_BP=WRWQqq^Ocyxlf19tX$G`{0MvE!eIX&rk5>=S$)sQ`JivlDoX?c6 z?;EsAUXOXRv&=rE3qe0-8!Tbxjhan>v7&UWVGLOUcHzb^fbhi|>XbFU2J|bz7ntpAjMBWFN-EniiHc#6F27zq+!<7QvA{(zi0O zZYUHhG$jadtb7ROnw$X~VhvFW%(ec|#?47`4xj)9m#9a@QPDXE6r}CrIaMY+o+rvo zdU27&ooFlqjS5{30>O0=WU$9|w3m-XVcE+_LtAH?XLp?&<-Fz);|vLRv*r+APr$Iw zR=GVhMEyjB=0Bq>7z7rn1ws&G`hX6eEakkC+Tcoi2?U&ytN=4%zCSF0qmeUVM^|Cc z4hDW28ta7r;n)K>B7djOsqNDey3WRqU9L)z6Qb$1d7(TKbltGm_I7cv{-bddL0_d^ zN=h3=F@O-fN5ss7E@{PSL+V+!jb~^=l#yGObs&9Uvow(vg`5*?7JuuxNMY5l*iUR& zIC0@sb$E<%6T+X6y>KgPGe+2sdD9FbfQ#_D!=@`#hqP=)7gUz4-9G_o`KAXW-!em1 z;@>r%dV-u997qna`}J6H^dKWr(meuFDs#G@W{XKT%G7MiIG6RGH=(!;%6>C-in|F# z>b)9YaAn(Mo0uPZI->zwn8vy5@AFc#BMxYPJ3q-QvBg3{co&b$xyQm2D+az5>rTf% zbH0SPJ@*Q}Iv(*r3L%XSfS1M!rlIz>MU;x_lw#doyGhPRcAZV6uCxleF)ciH*%CLY z7Nd-iQU6v!56-uUO?6-n;h8{N@Bg_tVyV({Mx~E;5lz+xf)wYF2(xg86j zvCO)1=`AvMj1JkTUHz``^HK!w2=NJ6u7U$mhBVGj%w$p;CD>fpZ&bgmCYF2)XyC)(^Xs&B>+ysUm?nMwbS z7Q6s!eMUE;E#Ln}3uBLno}J#yG-TqN1m}GV2JT7ctri^q#zwpgJYJYAWTHp|@bXgL zXY<4OCoAr(zZ$yl^vAx;dMys_jcw}*!|Pc%9Z(IjME-PZ`?Of=e z%bvh?bXLWGi?Ni*RKWo7reiaClNK;Hekm+Xh9kgIL3Az53K5-n-9_pZ%zX#^)JOey zFa`YF*WN)1K3MkoHbMhZknzh}399(vo^;uZnI}Yhv-4K7Med$3ctYHZL;jo&&Sq@} zbQYCH#6mKk##xz9*&yY7zt1-4q<-TJuO|$8fn1)n;Q2{KOPso^`=*TqW0D zq(jRcuax4y@0KK08N6oE-2l>|xs(1Gs#V}_Jd$6# z_o3m$JJni&D3flssK_C34oT6ZXkpWY0cQPLlav$}5H}d`d*PcaQhyYSi8+a@clDm; zExU3;Mu@eK{qM8)X*7CGoO4M(2t>ZjTc4~q9X}_yku7j8h(B&4aD~Gh_*b2bH2+ig z+yhw@@FZt$YH+VO2M4O>Lym3O5$YpySzw#h>!5~BgduEy1Mf@rm~yLCQWI?moKGUM zSdE0Jn!I^ZZqT|cpPMS%JYdTIC-$jTl(6{>0Ipg_6Dz8D?b$!W)Al-2VCKjLt7oVw z_*JVe1*DoLK@=3HiD;=eI|{^qBGFE@N2&sY;Z8MH=zcyUL9LbuS8bwdc-|}oU^RvyW;#f(2baY8vdn5r8*YBY?L?^a;xg()$c=^OMYWYt! z7=f=Sjir#3W@ba;ps+nG(jiEQn-X$~`4=jigR zGRmV~tGkz^0Dm2}Ey%S93tmrMW*RH7Z(@(-`~&woif6pz_gW7_CX2|JP%SG$A0tm1 zcw?BqD-!SEsN+2@Fue>3cV_<^8XC&gswvt{FJ${pyqG)biqMa$ct!WEdhE24ZA;7> zQC6CPQ}-2wg$n+oz&TA$X51MQZ^PjeEr4wDb~K8~7Y8op>~Ega6fH7j4SVKbc%Rqp zNA>C)aR76$KMz&d zL%$W%O!6a4fG$OS)&d0wX!@j4eMUyq?-)MHIF2&Hc*{3ALbF(}$}fjp5l8e@&&T2Mghdk>4%kjYrLo~331 zY`#wDUiG)1o|Dp31+o!K4N&BdKa8R|0JmH=8MgSKXBQdBE;%pzt)<;waO3=ZD`Px} zOH=bH0<^EtH$6c2-H5=USo9yehT<*O_hZ+=P~dT}?V!1!?Zz4(+k=ua z%8(d^pvyBvay5C}NU05oN|-w^FuHWQmw)PQ{=Phc#{!rzEJY{o9&UigoacO;%>R(Z zRPtgc>vG3-`+(2D5Qm!yxQ%{#bAy8J{SPOAM-!Zd`N2+;uj$z{hB*mKZ*oPj06I#+ zn(^Rev+W+iKXw3PS&;_dl1M#@iXI#Py*|1EY;*)`u|1|%`6Bce1$yVa6wWe|2EqArq^#-;>j> zX1eo@k^3FXnv8vgi;Q(TW%8u)PRXcuRPiX=5(&2x8}SI%|vVvv~@UC5Y9gY>!bzt$3Ji((QepI#I1;8uMN#uU5`Ti z{JBwgn-O#Vyk}5M2W*2#mgR89E-m(JGFpLxzQuIo7%kH@@rX~46j+QYWuu*ELL!_l zSfycjovO9!T!UqNP3dJZ0nOT2moxmi9#cSq0+KvR3TQ`T%X-3Kpv#FuJ0RCTtbmrc z^|f?-J$tQ5J0RdX*dq(rIi|Y{onQx30XlgY-1c3BwxKHmPg3(aU$%g2FSknAp(EVr zV9s>Uo6@bI3mX8Q;bsIIDFN%k?Qf~tkW3SMw}SnosR}Cht%CW1-NyS={lZs6wEnPW zJ}A;X%17pY0k9Ct)Oe{RVGQ26m9!;>1(IQ>{`zNEckunS(eSwfTJlWgu1#q<~?X5gRXg!gV z!*2kpxMnXt2+C`_ieQ+l*iYaNOpL--_+#E~fi?`0BeZ?i`Bj?qhQ<1AY^CWhgmvYT z0AGKth0oo`>&%*F)7l%!!!fyZxvA%wlQFX(gbg;l@TsrWTIF<3W2OA!mpkg7JpA*n z!HAPROV=`Et+#1)Bqeu{kdO@_Fn|m!A4_(x%xg{(QX$FP@-XciH~RA3zHxWwxwC}m zkoiSq39$5iIR$`du=(Ol_tE}AN+n@*;6$;;&V|FxnO9yY7dV!7=lVpuaN7dMC=$bn z`Ii7>qV*;c`56mC919xk^z&x@P|`Ute$;qYfFdaD>E}-y^I`?#(G{VECtS81&|V~( zOphow3#N<&Q74N?{_o%uBvX=1+J`|UTdcm~9<3d44P>^(K#C02RS4&AjFBU!W#mr( z&`ti39;y?jwyC4hJ6Wyf@5@SMQ~|S$TGuM$bM)mo=>zxhe0DCq`jK{BR?QAXInRL6 z9OYA}Ql;=kGYhWR4mrB99k)w6N6oLZoEKc;i^&*G7pp5cL_oFpOmW)Y{*totMm{9I zdm{M-e#h-t2vO{922IHMOreQ=Y4W+lW<17@%~tR4^)iwgI@yu$crf4umbr2&PmWS} z3OV;F2VGDQ*d^GfyllI&b@K87uruf)0dmG`r0d7{RJ#HRp+EYT=4ndP_=VjBzxz0y z2rfYL6zp4VTN_tESx8ic`9We%zD2CO%VfYUEX?et*U+dL0epC<^_YAz%k_$)G<8>i z@nrjV%1#bx3n5d3-hb1??Y_ydJlDsntIr2RUsa{o$U0+_fnD%IsQs#zYc&8}z?!cR z*P}WyJ(pCSr58{+CTfE#3}e89r3N{UL`DRzPrwCc@cK6M4y9Fb<|q!a-x0@9s9IxZ zb6b0S7I|reifWAtP!+pml<6RJSGc{G)|zk%H$^wOWLGl9lQ-~lGt}K&qjde(OEixB2%oR zoD}z|ec!nYP$3mBbUYC9N%kN;(&!ckE@^k@l{V8DJZZ8qxPxazt13pzjLts9#! z2!ayol#^kL^}ULHr?dflh^nIFUAOqgsvQ@`ISRPc&N-y&it<>m*54p3G;cr%un#^&h~S$lpe6GZ*<4+(P%IJda<#d06P$lC zg#*SLzXEltnxFkbkatgAr6uC`n3n$!3a5z#rlR270cD+h8i)5TsP)FiPku@d7C|4II) z;lB%AD+d7!xNZsP>_9BvFklPMEWpKFzPAZ6~!bQrsB*w&bL6?_-BU!vR$g*5-!*I$L3iu;(F+j%_vZ%3rs{I5b z2E2P~9yCiAz3FAG0cQ`yE$qZCq@l*9YY@_)jowmt5Z>Bq0`%l?N58a;f2m7r77*%< z)_Pg`xo8Y?pC0|lNgDj;$Xc_sTSzjwkS&k4(SllYBFEF3NmX!iCK9B^(t#bfY$ZH;3d# zS7L%ZSIi<7pv6wj9ypv!(?JzkKo&8(#=f!3z_=!^shVJae3Iohho!u{9hCq+Ko=-I zL9K8iA<5{4C}BjYcB^|)hED*hB+kO?UgO`APQi0MHUzd&7vFZVoMvRMHb;m+F>SOq*@@sh#uL%0zp22>L;@mMRld~rYfQ9>EJ0i4rAS&u=;3}m$NSFT+VD3?JN zno9%6@)2O+Mz*C>*oYC#0-76svG192wQM9iCYB=7@yj`>GKk>yF_Rlq1PByjmG;IV zvo?UKRx*&NG#@)(j+eWj`GdX(Dpnl(2A)WT;@R04Nz6Dd@roxe$=y)M=>-b0X^cgN zTc_MAa`P4v5~6(qnkb{ALsrtxgtxT`W+&szErcVb{!K)nkeYjN`IG=I17#%h)GW$S zMmGftkuW2H1fvL;ub{@hT?#*J_Hd4J5xXUqKxzVo;6ZPD)Gi|D-ab!jO;dY@D(wf+ z?x6u*!g>b|h04|f7uj;*GqND{JN}{RAzm{umik6pW9?m&HQ*`=N|=`!i7tx73Okz| zGjE9%9D*%*FIMpSbZ`1g+K^#Cgb>OR-nA2gzW7Zs-a5|kGz{{^HI?5LGSm=_E<0r+?SUGK7s&zqpOU6 zBv(@(S2liDj81E`jVMF}T{1D-kGM!JXq8L7kJ4c-8OZCz7&6JH8t{lQ&9Zj&=mXSc z6wG_Q+VsJgpr;5F65&w<;kUnNPlo`cKwH0;%g@I;E_w#6V_UlCgWX&g9aKqvtgG_ z>-)%P;Fl;5?+fZa82PQGKEP&EAo?raAh_EWu44*|-ZVu71X_Ow+eh!Ve|nI9v8~6}yPH!VQfY&rgDkIy!bp zS!Mw`wrdXFr_k?>IA)6j!xc543^6?1sG^Mc^FWz+lg`&w1*Y@QnRrtR>$IMU_r)YF z{cMIWQoyAAcmonqyftkI^YFI&x8g%F#I;Imi0E{$#<5PU}%*UcRwKvf$3}I zY)97&`)G!Mgs?I}WC5A=Ot6?q{d*p6Pt8)eQ_u@Kdt>99&>Do}t2SI_8SN9pk=a zQq=TlJ?oyaPl`*j?%*Zg%H>BB3@r*a@&8>9TIVH8%;mg>%_d4i2ob7Qb%kR&@5un0 z+pxx#+1?nwAM^=pl!ZZaO6H-Q(8p!pAkR3KJCA8m{e3HuDgH!0VW$7Ux>=aZI z6V8(GK&>0<0VG)jtrQgGp~;ZIU>9w$WC&3e53kGeGtM)%luWikrrGzI|2L%kJ?On@Y)8_Ssfl0izQtsCWp!E4TdF{UMj6X>Vq z<+AOO2to%@+#W{j)mzcyIx((UKt;?k^D;UIXKh4`Kt=$Wk^u6gSKqiFI?&8C_Xs@>C|=8Ya3c(V(gWy@x-npY(I0=be6beN+EI{BkQ3}C)r#-8n#Tv> zxl+dl5Q3z|-<^!x0;rB%ojL|Kt-D+ApVRfKk#vqog2raHLASKP79nFpZ)HS-%?tH7luE}Yyi*xGcNO| z^VPjSp;H{WVI-4tu&40BN{e8P9m46cI6_W+cTbNJ(F^k;a*-y2QKJ*hC$!0Y@y~T!By3DQv&Y!-rWfrrsB zP%tnNbYll;|@ueO} zu+!nKmEY(ew!d*7>*)o&5tgR7VrwulalgIH*1IXPZ7N0M3nV`_jseiM-vjB&y{}uV z(km}FZ7jj~{X9!}pD*l(uJ>5C^(M0+)f4z;1+p?4OX}QPbgNz7JY;${r^@)eT2;`h z3Z8rQWv;47HmmYg24}-^IOhucX9IjrS?L&$n(eNtP}cWSUSs1bkR4m-H=ZQ~eLAX> z+GmK6f{xUa@rSjB*v+_poDqcz2;?sljdka@0SIpTi!2can8WlIb#2@y_G3N%i4&#=ME>W@)%`+Ag-+uf|< z_e^Vn2ZI`63n+>kHzY~&L9^i%Tsnb`SU$TDG*#dkLJ%+q`|EF}HEt1q6aDS(n&ssu zp$k!-I_;PSCM(o~fV?0u_PYz0!X8R*C#I?YU}3M}X-ATud}u#vk2P(Y7h!!3vjDAU zP8`MFBL1lGilNuK#xb`SqIdivE}BZf7_`Qql~xeUB7f87I%p%Y_@#0q$e>G5Z@jdN z?X}ejRWKL`eM74`-umRb@sq%gAa=IKgG*;7=2%Mxor6JfNni@CCxAOF?SK zfF55U^l~1;93?=p*?oav8Tx3kn-~s{C4&22G=UZ?W`WO=7W&hINxSn!+?{5-_bddO z!Y(Qc%8PGiZNw^MBPuDom_LOG*kq%wOt?bKhQ{*%LZ4guAn-mx=}MC3Lpa(LW}U)y zdjGxPNCDa^I8c5K9@?s3G|kbYHm*UVs~UL#9G;~M-0(S0@uhHR8Y!_k@)?D|TVTO- zcy922!mY`4lzvg)hfT z#GgY}>~#}dt#8aM(K=|qk4J?v7(JuV{=eU}0TGRwfH?V@?gcLG29A<122P4*?&K?o$Q&^!fZh_|rNPbcOB(*(>u zDx~k@l8nsQh)dLu`oUUoXDuD2jqUa$5cXZJu)om{k2~yW#zWZdTjfr9MYN5PGjjO6 z3u?>lm98WW^<)M8HxCkGKnQVCRHUNR@w#_q&_>idpss5oJTr8Fj-^}=o4ff>L-|)q zd^Bp)jV$$xlbW*!M`AzTc?_{UHI(OL86`)d8v+xcW}FBL^$=Vam>qpTZD{sX2B^W2 z&WoF?2!D?QLB0Om8G8)8$^oQpj}C`D^}I9rwnfBjKhMdyPOdS7aeObu^sD?;t5ak< zQg_N)&V$xlg0ZCBjBAyYtfUucC4Mo%Ll1e+#JBYWu1lco{DC6`yhzjpAwfjR2%&x( zWIz~$QQJ&dq9(BcehFzQ$-NSWqp5G>je9QKfHc_gAk!j}T;^Ej!Pp0L?zaU}Z{NH6 z|Nk)<0W(~3ubI{;dZQ20Ac#H4*6IJ|RqrE{yA@CX{2Pm9pB_Pw<-M6eb(fA#E7j}T z=fy$VQ0R)JEAaz~5$&A>{y9B(6qLoKW40tS$gL`FZ+C%OS0G5_MAxae(`a;=6Z37* zRe_V$j&cm~bS5fQ?;LuDS~1~OF}aAPHo9QaiOHG)JT2+wsUee!oXIh&-#v?w{3^BE z+0L)WtfyG8%nh!P76Asc9{(!*FqOFMrrqYn>L0aV0L=*?>u>E> zf7e6sUXJ+||G@KSD3aRGD@#hHtzNg6Qpyn=@qdMu-<%4PFYEwyV*)M{0n1MmE6U`B zY(dFT@~cqkrR&#Y1-@WfAmq8`jHt3wbVAhcPyj)HA+ct5L!um-I+5dS9>T{SxzaEE zNTswtO43gj!lXAtH`7;l$(pnYoaH`diB;UJb7rv@y{_|N$P33J<=D5HV$_IEL_l9w znx<>q%tt^A=pY3%%}jYLH!H7sD`fRE+a~6t6Ud1WIe!kKzS{ z<0(QgmMi=n7;Kp~yY^iW-wT@v!g7U$?UaIT$`MNhlkXoe1ICeq1`Y|121DS>?AbHv zY$ZcE`SyLSyY4VSFC5ru&j5&^lJjp`8LX@(XTQH>AyMnt3b-pMo%@$RZjcUb#3xJM zsMkRPCCHvxn`X+l==2S0=JI=7L6vV&X2*TG^ejFS7+V`+&4YX~H2luru2QbY`|u9> zsp*a9G-C4LMpgCZID`I?fI)zDLb5j4aLE7_DM&idA)({UzEMW4lV0-M%zVHbl@3(k z`&k`k3^1h(b2nkt6npAgFD%s({;U{d|7y-Evjg52++fHLQBBfpgA?xE64?^;;#|g~ zFCs+c2_=WY{$NZgEqXo4pc*RQ(QSRMYjmlPT;1vYX}p54+W)jygeREIihBwZ@<*aB zNK3yYgDg-ObTwU-utMruya3iiEk4hzT` zEMA+ry&Z1of>xMX{k}EpsrA+zhQAor;-CnNVO!vCl&&Cyck*9>A8tSM=0%L>sLs5t z%wx2o=4XTHAaorSkpqkCD)MsKrEQbT=XFZ}$}=n1qT##SuF52(K;HP^t<0)v85{@4 zZ$2Iz%uAH>{ObMI{rPtwy!BkRV8O_fi7-0d=f|R#JIH1U%16^}uar@(6~)c5xj{6C znaUDl-hwm%-0B}?JVRT_7`lfqLjbNHO-gOir$ry4@U5w{A7T<)-N}$@$v8NE>N|lF zWoF12Q*9Nu)_8QCE!9dSGW~D@W>~L0iV#8ArLqTv-{uymrfR@LnZ$w>^^2kBTltX4}m~C84v<;3)QZ%ebQuI%aq?_G9axg*u z-%L=e9J%&-z74EO6kv=igyQ8Di~q-=r@GlLgNlKo+Z$acDhb@3mwq#G^#2dS8;2jr zZB`d!(Ud~dBn(tnvgXZ^(#h^kS-{i=?^@*m&_g-6{_-18+u)Lgga>wqc~ZpEW=;Mla6Pb-O|U*PZva|bP>#%X zWOm4N>lJ6yKBDTJoqzMiKEzxcJV-)bT4Fn5Ri*-YsNFLew0AvMvWT(^0E-$O7cPHh zS_kBQx>@5F|klbg#dMgXH?DmbboC=BX)D82}YYNKf9dM1%05%zMm3&4sGq3^6) zcT_5|`uQ;q+M()^o^?7C-t=bf$mT}`TIJtE<+Q$ROJUfgysXJeXf9HVE!ceI0>Kzf z-Q=1IuBY`CkR!{eDSM83;cV<)*S3R|Z;^|}4=`^@Jc2&gmlN={5v!??L?#+nq+}y7 zQ|O~mSplL2Q^wR|4LPP)hSiJ8u984&)c!syX9N7f%IOi|sCL_0TG}mnZ;U!#C;iY+ z9N8PnA}Me~$Xe;}>TWl1)Kih4rz6nUgxwZaP{9zf)Xv25zo2FL7Nv+4=UO2=D~(wz zY9>4_?ShL(Nv8l#u{)-sVVCQ9jun+18~>)yC=1Ypkzj+PjryP>YAPkTElIR$Pz6N( zn>{w+haeZY6aT)>6*@Tj{S@Ee{YN9>1u#@71j@aVf?R+YQKbW@EMkSqL+e0t*H#vP z$=}%v6iS5LZFUNP-qmc69DDcncjn0|gYZtmBi7DSTCPh6lV1q~=_2q=Tk%R)*+LIT zbYOWp9#Lpy2_a(3N-0xHNe1Z${0B)0BGhIwCtSH|=QL37&(z|jhZ4Wo7LIEN z|2@v3%9`*8&1m5g<`ym;p_^I26n+6;)>HTew?JNDmFK*|J^y;b9g0)1f)zq`XND^L zVn>`Grl@GzWoZ|+G*;Oe{Zu`X4_!XhwClaI_n%*F6lkN`HlNDv(G@Hs4tH%(2sbwu zt4yiGU0ck-!Qp|EpYh` zR&F<3D7dCr4YS-`$LFk`U&x65Ib@v7 z6~`AjdgK_FzkjZ{B2X&@KY6bC{NQdz$HjWve(OW6syo-1KOg24fk z`Yz-6&AIEoySwh|TdnA3=RE@+4)2ATLyp#!C}9Ev3@|jaU>$R|bB;+#>Rlw7B9Z8Z zlP`b3Nm)A`D8|7#UBfT`NMIeBNA~k>LAKwXVcQM?RDtsFb?0LzF379RPnuFUH^VW z?_*WE0-M7vIB-dK zcX#*ijqY|FZg7jg=j%zZhyh5}-Tk#(o%U?Dd%L^4yIbz=?(Xg#;zpQwY$DzY{Glym z^j6>pZ6h`Ss1Sg+0^@8>%WfL7@9ke5Eq40nJ`RgBbv$$FdqV}gAo^GBd+)vX=D*%r z;)d2)9BO8lQIh;??%a<=?-$_n>7dZ(*FCV)g`qWN`@0yd(?}gCI z-}i#Yf4uyzi&JeBhrL0$Q(#9zi7twA)9R!JWK^@3+pXD7EwVo?F#PYbH=CDa+Uw{-y1u_sg-$gb-3hl z$(a->rM3~@7e%QXwDUZrlwwci2lHT*RwyZp>MpEyJ43|v2oj-jHa_Sqc zol_9*XrZHr9r}wyHwOo6M^TchC^)Hqzd1I?4oCgHZ}o|wb=LFm=Muo(es8P^>)p9`y?^D^(=9}^t$O-s25mr_8qWV(!4|fy4R>vlv$lw1gY%zT z#{)M%JL0cx9(`wUiNF8K z+|Yro@drzUdGEa!9_PeJv5pwGZgJ@7Fb){Tk;8J*z@Rh)Zk&s&3 zrbuVVOdovk!3Ur99(>UHfF1-rC?yC=DL*)rz-Voo;(!YUWTv}PR)F(|+pL|_U_EsA zp+&psVF=FQPtID7ckDOHnmZkb<1EBk-mBysC><7p*7psedp&)Zw7JJC%U=)HSPERWW7-!zG-Q@K%79X+|by zMPvfb60p;aO$`swIS9XF9mqM}3J^ZSr(7}PnC|ZKXN`;lbfK6e_|aX5b&&WKP_F`q z20#d3&X+bOv$UC$+9VKPg;13a&qhAgFM*Ii$QlX6j&yA!Z1YJQZtm_*7u@Xc7etI) zq=8GGwCM{)tZzLh9+0Vza@<&kNi&$VQc5Ab`5=svk`jm*ql`=AyWt)Vw_C>px7T;C z=B7nj1VU*;N}C7ce%z?qISupU!)YOe9&WgONxifYWf0uH2ssJFnwT;OE}8#=;NExg zhI?es#*W0_ZjT_VtXWy9c6WDocXz9<)8X0B-=)=dvDzMIiX>Pml~yq1 zV&j-5306v_6)~pjBQ%bwb$Ez-BY}uIJR5HJJ6Yo5cX5Y%HQ+k70T)k_+G@D?5{NbN zfLIf;>hNqh_>pS57Ic*6;tm%x3B-=X4-=b}d-k0EoSVjc54rXXlU(}@iZrXcI|#F? zsw(ZPj3%eQLurhvs;bgz)9gt0+0)FTm6SLzTsgf+VUjn^izS?vmF#q5Q`0o>YO87G z*w#L@3s2QoTTQ!ann%6Iy{6fo;S!oPv0R^etBKuh0{g`n)u;GRVtc#CO3Xq3>HoZhq*87ULK#GDC z1s^r1HD`6oA;>?R#W?g_v8`Lk!w zp4G#-`K(%Y#Aj%0=qpU}3nb!N>&f+HQ5*;%tf=(q{_32XCKAC3AABN7!P7~Gnr38T zRxmuBWLm^$IRDEuBNMYC+TfgOIRDK5TLxt74^PqVRX=IXsc9mS3q|?dNd7WH=VB_h)0fh!Dvah>-ObY7EIG|Wb+c5lirrRUrWu)-72QKHsXy!Prd%<_oztG~ zZkBEq5_HblW@!oS=YS&>ccPAEisO#SJU>PuCKY$05IrOAh_PG7Y}M1avpx7Y1b2)( zSjNQX$}irwGZaVZ1AC18@}mxpk&4V$+`;k7t4bMVmbW$W-pE{;8O+Mm zdD72ree7qsb#Vt5Ir$2BCT@5es?`hN?&kPW$BuBX411vC&JAnA<9s*7+Fn(2)~>2v za>VH#LR{(Et%%+NcR}OuurMnVuZ39?y|ZoLp0&gf=9R$enSh6zu{(39XgQBY7m8ySR(5xC@+tmne#g zUgO@fCRRkEmt|isamjkkGBcmnw8I3L#J}6?Fz@~g6;P1?r!hy?)uB^ZHFBe z8YL2GnzyW%zWSzETuLRTKqUw4z|wCmEwfD~jQX zY8h&VX$6fLnV4vUbD}j)JlMFgsUf*E7pm99b(9L(mHsGk$RMCrOmvZ!q6VqOs^>cpM6gHJ1X z2k)>B&n{++ zInyyDQ}?A#w1UGa5JD3UdgSEyG|d<_%osb;Hoy}+y_)xK-g_jtH%&7}j0`14AT#W; zpqxAD^E-qx!*ZIXrdcX(BuFV`*T{cr{kn6>l-%r+lwCt7rQa6{D5H!r$|#?dQDz?> zjUL~H9>XGrVVEX8DhhL2J$WCh8irxidnz|->oP5FqHV-Rf=TePO|+4;2z(LSi57vN z2ifF>B36<0adRtTal>loG*BO9ObeJEOc>UbZX87|`sBYzDZgtI%NMu$OoG3H5;RML z5Ms?ND3xDP`Z3D4;#)70QWRFZE?qA{+EWQavv~46ky83vyCC9e?Xai+E(B2jHW?`; zU!>olt$WV1y~j8oDW&{epX@)?zn9td-h0)GAE}D31XTY%FRxGb@k1V9L;LvFhj>0d zwml|YFJcpcY}kKnuSGta^|aa^UBT4`InTyJaM~8RY=bhU_}2>0)-E`0lU%k%n^U!Q zJaE-#Jh=7Q;(IpU!D-H6(FGU(+B{Oy+N~9<%6gpjp$mmYH!FS>qjdSQx=_d%JuJEa ztYI5g4Lak-k%?{(un{W-LvoB@Ko_lqk%^n`?jsv+ZXr6O(g>zuh|UPc$TYH%`riQ^h+gGr2iXF(TCN?{U3jY=aEHRqFQA)|*FZa+k4 zR2sol)Ck6!7{PE!^zTM6-1}}6!@cL38WOU@y^tJSQoSl`lAv|2!+i)JVvb}~6g4W1 zV5q7anMN>Zhdq@&RlAXi^Z&Pxy`5H<)ywAy#;CL-{l6hPry1z=?v=i~MV*r_RxoDc z17*EfB^M(Y(UX!wu^=#;kq;vn(8UM_&y=|S*Nt4{;ND*|xQ@zkLE(f90b>MX1S5oJ zxTyor$dDXdhv6a1qhvXQ+2+`q^H!?jDC2+Vaq7}dJU4bs)vx=-$WffN8 zloP8|+&bWule^F07Umb6!YaISg4-|L-QC^Y-P-N)!y_Dl88T=iby~K~7~0lhA3Y@4 z7b@Bb_K@qIM?N-P_>e-qXJ2lYRy%4xP8m#^T(Yt)B`&#M7ABh$W=F2at~x(%mQ~Fd z)8r)ZIAiQctW(B}l}YP1W>OVxV^)UD43|_DrRtm;vodCk2~$l|HDf@W6!GKV#2LfH zgoK1d`WK1f4v2F)nsu# z;)I!|3CtKMEZEd8+z?_B{*X<^rY;oHM4=CnLL?y;rZr>C8DqwDKyx2bWQeN~XxDV? zT`S~3Tb$?B!xeO(txJ}dO2W`O4X$9LtrilEcoG(^RVCt*&Hy8{5X+7%6|#Om-&A86-#sAo+N_ zwp#6Ma7~R+rD-9L&v#n=c#q%LG$ER%ebdm|1_jYH`k`+cAq_t)5v-zYns2T zt(!)~+G=yMrm;xG|2@+uo~*HmpXZF4i|iS4Yc4!4J}y2UE%T<)Gbl~7gAO?`sRrg6 zuHhOOPBaY+P17e0TufmAO|;Bd^O-Pc|g`?y4)G|7ff-uj_h#aq-K% zuKAwl7oO|#czoqi>(sLEP-69TNCds~T$PAzincdDFP~Q1XX~_I&V)XCZ|{<@W?9MGOZJ6oyo-l1DD8IS^lgtr%4VI7+B?n#VMA@=(BdRvdWt+;vmjc zKskk1rly&+3)GDL)V4A`AAZFuoWd_yWk^j(ypTD|rlt*V}vPvhp< zy6pGkqMc-{0|eSh_K@3;{7l}o4)(pDEqe^})K2^D6fUXi2!=^Ic*o<~1(#qx^oxjH z*#?200#>Qt?YbgGO^bTy(Z%Bk#*V}~f~i^v1zOiDot1$2kOdHEyHuMRrek8Ys!CD4 z(m@;CORsdx2*!@=sI((4Lv)zrvFj>+jPSkRzYE!!GFFE+pv`nDQ;5#Uq;VbNM8G+X zgIzlvct+}Q9A9o-NRAL41dL$pNLOg8FouN-Xk8Wr-;7}F0eS>uWV!(3R3;g;i0??; z^&ys3!I)kw%d#pjSze-|x3Kq?&S9u?7X8nAizO2MyA<&8c*}!&w14YoyD;Ld&~Nqm zA5oAGkB`U#`S7r|5UjWhrS9S{Orq5C7JB*0^+K;J1lQ#*{z9)8YF*a~wXVyml)4M8 z-g5cM>l&-qC-Ou*M$O&D zTYP1GsMz*)a4EVgoB3+g;4U(_i_I97I*0zK?NPC}Kwmw*Hqh32Ueai>P?8o49?(ua54jCh z#^HGwNK8tc(Bykw+xDwX1J&+R8HWlkvA*Ai6gObn_cy=+Cpc$EwD)YQRqN%J{fW-j zvQoHJ;T{lFu!DP^0P7=^ER-GxW#t?dZj=QRXdhYdfVMeU-;XkZ{_TIVVs!^D=||xl zF2-?Lm2)WUDhafZuQjE8Y{mon;)0`VJsj5Q6mH`l5KfTe{xol)B0`Zizp@;Dou^k@ zgu;z;;&+#L*8&*Fj(8=hCMwzmjYasYI$7+HfscW4>;YKR6a8X~9ysVz(7IMJ-wTgp zZ$Vi$;UvDzn%HiaQO@6y4rRF*qfMliq3~~`f=3b_-v&|;LMS8jCozDNoJ9OdVrLbl zFu4Rav*>mLz9!fJPJ)6TIXy{H#?U9mk5G&sEylRJJ7e4t*7~&_ ziSJ36ED|w=+f`M~Cz)|$n_3{X;M-QBB2}bE(qZG|Q?-THf(;9F=F030DpET$W1K&@ z*B^eknVFdrLYDepT$JI&K8;b%bcDRY$Ny?t)aYSl zx(X}}?)8*WzWw3f(xAb0bJrT8pgjo^iAzY!JEI2dov|kR=rp-t-vzwiI#A9lu$ zaHKZZ`t1+ZgRr9Zhn76y205G*6bxdnh&w81PLBPdzxSQv6C~8E9R;}kVNIZ%KxYa2 zLeW3$2tV%+JEMiH1t~(@Vc4fW(csX{acF3IW`_o1pii7vRV90e^DTSYG?>C*K=m!CLY-HdPkZogt zTSvml9jJ<4JDJA=f^08_9U@gxD~9S(I}$fRo-BqPx_@e-r{0dKl1L_#$pk@uO>=6R zNHp67QfG_UAVbXzv9>cO48m>N2G`K2(K9qoq4;~6o%ZxG73z@46#zZC5cMOr_gon9 z)B|7>aiP%`LWu~mR=I}YzH?eVv1%w(JI2`$8mgXrynk>G{o(qFX7-Hbzt+#mQMW=g zJwu~sXihslLvy0hGc>0inx3KA)M0g=zml>PM({B2D|uf16TEkl^CSI0N-@ zQ+iHK6P17=0?u`l#e+S1Fa-D91H#M7d;SZ!P)Nx-eWBPGolBtWlrT%mx*27`13R1u z?g0U&euztSrl>Lwx&R7yo;VS;xTJedcDt~iUfB1uU{pctRb{Q#taJYUCSOH&vlF$& zB`XqX+RLXadMjA56TvkLPQGsyzJCh{0a%?$*$f?4j>Xv35iLZF({b}UhulE3;rc5i)u15O$*T(m9P=arD>N3!7uQu?{E}VQ3yfQ`3&XVC$FN$f{i%7JRak{pxE{C##_94(H$;tiw1M2jgHIGNrp4wzoKpuXu~U_=}hPy1YH0c6V_Xci|3hLZG=!+kK5em6mOt^=Y-^j3o&^{{MfJ9i&p$}0=0e-~43SWSK z0{jo)pTxfa{_FOh$hN&F^0f;GKB`656(Kp*MRGG?o)Au9lU-LMX& zlKy*5Db;ED9;K9aO)0G;H8uGd{fxdwDP$ZWt72IL@=FWFFSsYK{Dc+NQSH<7Gg}06 z&7xUVQJPg)r3UlJ#LUdh9GO{LuN@3Ck6^6tD2k$}P4oa9%%|daI_X@}l=f(#kfmiGpFPNjM+n3s-84-TvNWDK ztHUDxgR4W+v6F+Y%;Id0>sp=by4)|zsaHEAz80~H!q-(PRlA)LL)OI-2U12UrIb>( z$ZpO%zRNjZyTAAeey{z7>)Nx-vn-<`m3{oLJlSPkmV8h4pe)O>EXy+ZxjY)JD9%-t za+i>WG4%lmC9l9JWeUHLQSu9vuz7`J?K>-b8YjhO!{=rdR$&$B11ZDFIWqa2J$;U3 z%#q2fk!enm^^~0QUq}var|46@a0FunLnfwp$zh~>X;#c)%<_=0&Hrp~ekcU`c(g6s zUc0-yySR%~0fY=&%GCj7uTJ*31k*gbEZ8UQeq(P~dn42>GKNH8pE2DXTd;W3G+|zI zamqIy*@yZKQ&4OBakr*u(SG_gtv&@$b1H01^ZE(ZA;c0UiMJ1Mmdc<_}<-PhxvdL;!XB zM~UA7s4CRX1ORnJ?MOy7M*eTr&UTC(H*$Gy2)T6D<08>Z5}v?)uM1eg|R9|B(AHdi_9E2hVXE0m|M#U|vR1%jV%#Dzt`~0|YZ|R}&oPX#8eYlb^q~U<`M$$n1MAGp ze6{15HeYKRN58eL22J)d8?83RgT>_xo8&Q+dU5i$=9= z`zshwBtX^c83l6}?_PC?%-sqCN4%R0WULB}A%!U-H~c$NTtipwzk#>d@Io<+_mCa% zyddl?%U!GIZEg@PI5(hnt*^imOXk-@>(Au2H_CU$b&w_%1>jP)Pdns|pdPqxQVU88Y;8D0wHHUeUX?Yw7e)H7i^NC15#!ULZCvv zr)9SKKwhPTy1xd+u3AP}yV*71iCs-1^^E&vDj;()sw*#9;5ucn6TUp}OCC<%=JLpV zD->s1O$jQfpY56k&uE<01QQ#Fdc48lglQ4O&iig~rrfJq1YC@)2n?ajGo2Pe-6KGA z1RrVo4NnC+jkv!JY;~Do4b{Wm?+X32jNx+;Re*~QVqG88YJ+7#-sYWtfd&9K9nFcB zax)X3H5RBMk26CObOSt+vKk)*8~M3Lrm7pnyu6pDOxbJ}|=j15(C2A5BB5N=LDWa%~S-L&-;TrK}ej2`LtRSP4=Gbw+I?1VNLs zT}C+2B+F@PYMd}d4bZr1hVs?Ko_qd^q|zff2WZm1$#sn-!qVdJLats6c_y3GC62iN znWt{xE$G?8V2_QiR_;=mybh7&tm|1~IIt|gDSuto7p3GE68%_O>W53-Mn}Uzj3!%Pu6LCI%t7$B^*AdJys!!LQQH@hX<+|J9?vs=608*uEZC|$7#{`_GmF0h#g zYb^Kh?lCXmeaoz`k-M9e?i_Gd!*E1qzFv8y;hS5uhSjOaR{IcKv(be<6w}JAx%N!y^MFdDquErSNX~Cq_PXxcl z^qn9m5Z?*yorLOfdE_m%^s*@mQNe6OfR>AqvbIW-nDgJPrf}>8kP13mULaA0Fx=!N ze*_vhca$yy36??U`Ue9>3kVRLuPF{V-3s9#OgroNO zq7A{LnI-M^hJC$G-LSdZQ%pv6B{Tw9>l!eBrJ=Dj zZ4yAKXp{>|cX0m**Jb?=K=|Jyt_k7qo)x?R-W(N3J`DPfc+Rj~ z+tp2gkqADc=z7cgk)qu((#@HuFR`>C3NwkWtnhs4*`B3n7Zgk2L>hwJ+`W1;%p#4I zB>?AqF?)82rx?b&x%Or=hi%vz-Z~NONXybXAo5TX$|b8Qs>p+*t3BbV*5C$3CIbkN zdui!E5r8~o`v!n_O_Cz}Umnnmk%9=ra@~Ml=>-Jsuf9FBp877FWni!mus9QCXOfj4 zUm?@)vE>X=*Cy(dBk#VG*%DyR%jFJdJ|)ffR%hVGauteF3K zDSte?EQIb06Mt&1P#J`7Mo3bjwXi#um1Gk#?xFrQhtOyYUb*a$KyqdEzDKnBu;`IU zbT}qfXiCa^hEUx)SmRjvJ?(V#R#G+OM=10JCP6vnEFwVhbL&Bwkj{Q%^hALJXMIkp z;qWZQ{>70kE_+c$9p|Si8zdG#N&8|yG1qxLc~yo=SBf*AuKEa;xJBR9`#=cRMnkad zoWX=#3ng*ZIbG8uC99Ucn-BtZ4}9M=w-DGde;1*kgrvm1`oS|*p#F%x+9X?+&{SsV zScn5UKt_HONEdu#&b>V_IEzv-_Q7-@u=C4{(j{GlkVQ3?n{5Eehovj5;1Rmlbo#6& zp)uJK;DHc!SKZ;C#8gt&JLysS$szcBR%ocxcA0}N47l2>+NurPBiymNZm(PBWGew} zdu2GdQ0nzwZ#Jr08$rXXmR~0HUD0?W#73Kg4iOG%HXBR%t1D&lWFistOD7VXs zA&F0D_E|9-tO9-!ZR&Fcn&R0lluWaeqIKi?A;hC%6Yg=8lt_R++dom9Uz0nNuLeH{ zjmhc5RmJ)Y9LMbFCc;G+;Xf>Pz3GZ1B&)#9)Eh~aKypX_4?;D;r=XvHVLp}=b^)2?j2*Ls zKUSc9LZCf(w&4NoMZch(-OtsU?Z2?OB?es+KM+RZ%u4n97pm?Qnox6ghIaDCT+Ki> zVI;v5-c3|ogF=}ku;s`omzm-07t3?@ow`$Qv` z!nW(Fq*SF83~l4xUv)9W2$F+q{E_v2A&z@bpOGQ$g#Ceji%3!y6GDSPGaZ_}Kt8>}6;u zD94a@RDEyo)cUDL`F&+aHLZh3bx;-QFn8e&`Ypl_DjP!(U;IsPk@Its&>&d>ToTU2 zX+Ee5qN~+)FEd2xBy`(i_sEx;meT{I)LV;Osm{|EP<_NvC*wojKv#?~Y?WI>&Lo!J zK2;ULJJ2dr2k-NW^&jaomkP*K-k5(1trWH59U!@+LqQtju3#(JQ8`IBTXeN@LJ*hj@!c^lY#9=#Aj1sgKVq9vfx&bNP|#J2I^5_oA6?QRET*c27l zR4ll7d2Ru``vmT?Jcxb zG6pGZQNqGI3cfUlxrp;dX%46;U3$p}-eZ^?Wxnzr!}j_s}Ce z@2X8Po1<)qc=@P|q#3=YEeYw!d^D5t2>M2oD#dp%lk(}23h(`><2@Ds!jZwF=NuiH zk*i8OT~DatKwL8(f=G`lcm9|O*EWUfkaL4<05g6`IyYLt8LT-5rWOjUg*$*q9KOUl zu#N!Js+{m7a;MoMc_XfFV^F5Trz!K825`^DsU5{>$~#QqE6#NL9C?)An7rJn0Ch?O zSZXXvetaw21ROHO!J*)oqq)|OvDL&EpO<%{4d;Nv19|h5J`mVeHan{fp3i7<6|X*6 z*u;MfeDHsqtO1`dH)iZX*Xj_22^j;@Ekc=FbC?9wFx%^FZ)Wf_c%b+9PQ3UT87{nc z92jmh_&Tv1!{6?G-W4{o9wEBB6CGdY(Gwj44lwweQaY0?unU02sG<<`8A0~0rJ;Nw zxhPa+BKW#z`*>198eQZ@AUy~o(NFwi?f7*r#vevRZX*`vCY&{IQWS>xobOMgP4%EQ z@Tf9t}XDfO_idFdYU6t(fV@|vK1*cC9C-DI*eF@{;m!n0j- zj^mb7?dPvK3rXUyW34C#SHC-pa?i$NVT`jl`4=2JK=c{?YtJdC*EmK$-bhyAZ@|_- z+tqLPW9}q4tlXjXixk!lVoVzBP-pKK&(%Q2f*>iYs?qVXqHSFlGFcprJe@K=^s1s{ zzkPv#h^{DbLu?Zne2ARixiGg6ZWd1v+2wNWj}2CTw0DJP37HO6EYn8is$ssmOwT=- z$+4(g8)y*`s9@#NbN&X>|H%gRXQ2^)pf6}5q!Dvg+-LGZDM;h;CEQclSr z9J}h|>V6>DBdCB{5&_0~b4xS?d!j`8fc`g%0fou>Q zn4>e>5L@oJr0r&$-=w`E*uw-KQ%7j4ovRS`!kX%3A?zk)TxokK*m=*(=05~k64}m& zwa!9sT`l@<4al=uh-#LNv5ce!;*&cNv=TVA5A+S8#{%6hm#BJRs*DJRfv>ZwB1KG| zvSJvjJp~VXrvxM}x=kEI-|EcahaP@tDzuEsL-RNI;YP{+(eT46--!dshfd)^Z<=u- zORN!Y)-Sdbp_zje-8nsGGByu-74IE8SA7Sesf7Upj11BT4@n@ceGh>1pqoA$b}a{e ze3j`CTUHG$NV$fh&!wTnFhXj(Jm@VmJd;x3$VMS37^_ym_}orU{l0?^1r9&gYi6i6 zHe@>EQw_(P>?SZhytnUXXpdJ3M9Nc54A!5gC4pGWU7)aFSQM)-S&eTWsTlqt-hmoe4C)2W>UAI!B;1f?c0IEte6Fis zoS@mrUuS#a^P1Ye(GpL*FQ9}?sTe=M41xG*O?coW1uB0lUJ3{4dvdqSM>TOaDo zP)^J=E9D5&XI#9-WGRr(`iYN%Y6pI_L@=2Ni5FXE2kwy{Gl&v&oV{D^X9x@2)-Au7 zU8Xd3e}(d7ET3nogORCxPw#NZ8Sr+FDf;PzUACp@gem)%Oe@8Nrj-geQX>_hN=_Ry zg#e!)h!8O0oR^_^l&aEnRWU0z!8p3>+l~mc{r2JB!6nFh2US(O0!6UDv^j7RZq^6! zPyBA__5upIJWmmTyh#1#223e|TUbvo6nKim$|vIN$szVCCBbFykl$alAH%>z4-o_3 ze5)c>-q#i*q`WFXO^T=_mT09`@tRnel$*%l1LXY9jamC3vv?x5(@CU}@0bohVik6H zq=VehF&zu>n`+MYrRHzw6ps_Jn#R+vhfU1DW{es$E^7QOOVexQY2)OHAY@1&o%99Q@*C5aB|!U+%YWIO+!E!UZyl0IU>%rl>ao8*A3N!f)ve5Niv2CB2fRbh>wR03KF1@U^H)lA?`_+`gwLfBwCq%?S(i8^p&&Ulvg#oQzqc(4x@cF35O$8c0;y{|Y8e2Djx;f< zB0w7SSjJ17=YBch+8jQqS2#FkJ(^>$rgj2e21gAmzT?YBCmS$^&MY9VN5%2PQboc!=Y52eHVqCBY4B@?((AQvS9&luTJNAK(aZ;-OsICNi`{Qvz#xMFp(l|VX<&An zT*LrG5Mu25Fw!yX4YjmL^H&di`5b;hOLZ|l&+)^Ry%|<2Y1%p3fuaT^XH?cN5Rir0 z`BALQWsr0{w{h(wX$~Czu)63{fC*p`xg@55QVhy$cSXc^-EiE?lc!%$om!IgO06VG z`gmdc>2cE?wSmK*n;i^RkQo$MDDbDZ)nc z<@A&fP~D~{Bq^Xe6mhu%QG)FZ>;=qSJd)H*)Zl5Zs23qu){?j26Z);eqWjVohLRlM z2OzPKRmx!#{vxPZ2h@vK6_j*WM1a_+o_7lQc>NQRgJSkC&8eE=_@#8l1P>aCQM=DP z=Ps%YOngmB%AwmGYRz3?)n%4;aSu8fE0c)yO9d4yv^*L$rhvnZ$+8t3mB6b4nV2zr zamKPiqe~LsDCKGBSmGkD-6aaCLeDaRB=)UI)ofJaDmN~hs_3ARugrV}MUr1H3D`4+ zGK6MfNvbd?ykb_E^h&~7muWOeZ5rV&WjGtPmc5N25xm#0&ROOon@%wMkn^IOXZY_U z5oVM!>Q^8vC^ey1Fl>r5u`(8T;3U1E$bl{gnxNCSfH)g%Y7+U5*`>;Ts#B3QeF{(S zEFS%>>k!>Zpf$kU>TrqlmCvCwxF7yTs8x6?604>cXy!d(8I)@7K29zZ3diY^Ci1M; zf{ScFknU!mLNfIL*{mR1i3-W$C1;cZ!Li0Exi4)kck6=Rbx&<*I6UkJr$Iq}J1Csd z3EtQVV~)6HT~y-gqd_qB_eZmG>QdqGLNd;5kqPUjhr;S8o@;>vK3kU+42ahbdv_1p z-b)BQ>D~-(xxVH0o3;eDS`W^%%}qnd$CdD{j@#Taxds(LfUP{a3{8LJJTmN}$@~Re z|6s%YO4OzM2)&6DN+w{`Zb|5sr3Ga!>}evp82{#|f*&lV5L8sl5ht=y8%95&BIKi| zYb;cf?1U<&4IK=Bb&xJOzX_&H0f>hgup-9{wMlYVy8_-mJ?<=opZic7QHE3ur`G44 zK=>j?a%Sr6p|a!;7YaD@@I++dxiqH4Ut*nd%KUx)$<+|f=Rw`QI5@k~(0i>ioMZgn z=OX@1XwvZLFEDGW)+^*78l)?8k-J}{kfs%tJi2f%bHDo#EVZ{FDxyjhJt{x-7cT_Q zX7@}~)G}CZL)bSUlKM zDHE758fW;yCs_5jEcgVHe`i+|NjocBxOvqGG3|v1rnC};2egzW^5l7?XDy5229mU< zEE?R2!~sJ!;meV#VB$5psFqTUHf38jGOn?WaHpRNO=%>YaXBFJWtC{Bg#P9iI4tul zY`(2}DnZr>+flc6f~7ZF=Vg`(Ap$bR?iXznn~r7bVc~8A_IQ9UL+SJEGlCF`kvEeR z4DxkL%!a`sSRzz7F;>I*>BjAv+uP+cl?@Y{tQ(}X_~OHZaWcnHOD2@Ih~%N|3T>B6 z01a>iC)Fy9QK|Y30+iyq=GlQRY9&3*95n&nk@dk8dVXd5u;)A31Sz(T9BiRXJGZ%E+=L?N^Z zg-QT864(s5E`8qQ{zDJQrD$9F`PZ?#>zbmAXp$W;y61z)D#7)yc=ZjC+eQ;k+jwyX zkW$f{p-YU($nw>MkAi3-2_u``2TuSDkgmx{oWAY#R{Odr#L0lPF{d{)_YfN2OCV`i z*y2>Y{J@>oM#mvgCAPx3ZyHrjPjk2&_965SrY9uP1k<;bX(?Y!63ap8m+w;doMl?e zp$_7VVriWocZa%|H2HN=0{nMG2g}ifC1j*pTc(1-^@Uol(ZrLNj5fqT6I#UDc%j{N z!Hk$oa-FZqTQzaUf>&b_0f|&pwHV2sKonuc5@yjR7f~>+m2hy=%O&h$nQt;V%Lr~) zg>Wx+S|kQd@$U$4>aJO#RC%*nyjcI2Vgyx;J^Wnd=VE)cXn79hH0dPw_WsRkLS9r>YS|+Vo;7k$)l)Q;tjv@; zY>~)j`|&bpo*y~S;%7`z`_}=ug>WTr$W6}0URh0p>YW45_U%AeH0vb? zAtXg==&1EMCP5dHRFwqa_xn-zW=Q6c^p-MN z_C8{$7lMYMrGDgqha&%%o%Auhm!u47+QKB_ zq^66pTV;{j!~066)c|=gBJRHQ4&Y>yc57X`xo56&U&q`|1lou1x_UfDN4p-AzKcl$ zuJw{p>9pckusk6rfGxA5Owkwc*fkDSH+Pf%gQ898gK>$F^`k*Dj){)IBwWOn3&rTT z0?%Pq`D7qI;Q0R`SE7SmyKlE)5vwL!)qi|40HLXB6yIjh^dj8?$p#f zL7GY-SoJ0xb51N6V*~ROL}%2Zqy4_;*1!rp zhyIROO;Av^ys+V6Se>JEOAt#5=V~aqrAb*igc{;H6{Bi)vIW{UcENrLlIKYYHYA37 zZU_|a&dhicMRqU=Xe=(wk{Xd-nmX0x*n-RoqW#Fm4E#9uQAvbD;(NWGAUM61Rif=N~876mT> z6y1b=#9!QbA_<+y1Y4MKgc@j&NEN@H_XzEeZKL~UcB9UU`Y%nV9mujyOZ&W_i@pHW zC3j$VaX}|DM)Cy(f%t3 ze)v%UiCc_kY!&TS@Ash}0nn5GN4feR&Sm)uzL6QO|4}_|z0hh0NkzlucFRMkJj6ne zH8y@?m@t_^F}d#-FfYo$m(TimpSN2%3rT+-K8|)qMkmh!$3NaU!CG5M0@0B^&MW*q z;H(HM^L0&=r#CObDd_MYqS3KdSTyT07sjf7hOAXxCdhJO%qi+|%*ulDxr zDNsWU#2!dXqXuKz62B79FgE5AA*oEgr}YjO?^P2?WZ#Tfun}x*5L+nXT-mmR6TvPm zPM$k9z<<1`)!dsvV9i~Ds=9aq)SlYY-!q*!lybO)^@(|pU20=f!WCX@WkpSpICxKRD1Nh2I$M#xM2sVThdh zY8^mlu7=&CdB+0BX^^o`Etd$*Bd%l~+^F+G%!!cI&k(Z8FgIy)<8;Wh8qJx<35RJ| z`UEa}wS7*Pa^?ev>5zj(dSV?KVZZ$yLLRej^Pe&)h21jp3o4P}!~~pxM<7dNPH9z+`xtOLZ0>FC>!kl-0`Pjs%x)LCN_D&##*rAW}|%pu4MjQVGYE27)nI=?vM z-yZzD*dKJGhgPNyc=)m;x<4R?^?wk=y-|iNy8i(pjoG4n9^{MSsweSbnGeYR)XqtQ zTp0C9Y5Cb=pE_K_vpC~WzewdpMAFwC8x*!N-byu34)6QCk9j^?OIZu5;NWXp1^t{5 zx`zFSHJu(eK&(qHFzLsP7l6smGd|SrJtIdUWuZosb%hqxVIy1^QH`k~S0`^Oe>6}= z+@SC9Wss^|91Fk!lF(?HOhNd(MWoXfh3VVAM7eecLuv3huYCYQA!EpjwEoEl=?(*l zCN>t#i$zLNT--QY+R<28Hd#qglrKixf9XUo#X=|-b+S4i%srQ4eO zguV-%Q$RQiI*WGy!9cB%%dBM_GFu)IYPmP_s+ zMsW>)TMjw~yM~+zNYZEpaWaP5p_vtoe6{p+?MKGYbbz|>Es@eIHL%Sy(%DMdy}XWKpi zkzO6m5lYLG3K6Rb)gvJBc{~Ppp)FbJsl-Ig;ueggK$qXJ04ae5v}8Ih=nsc6a1di= z6TJ|~W3;o-WcVR24+%C{zmQ7G0EvT(d|-p^RYd=iNxv*)X%T0ifD`|T%%_}G@LX#m z<*Z6Nn3=Y;{I(LdMdE;YvNCbH8jj)-X(ewrf0vjvAC1(Eb>c;{nmtA!oSa1JSJZ+oB8tGc$sF*mnV zr$_nby=3f+FEdsBZ};$ZtYfzY$LBUAI<7rqhPf+^(;X&|WL&b53vZa=$yo0~ucjkb z!j>9~zI;o7HDUr$Y!|@ka-fLTR2V?RM$F6ADtCp|Xf?{A-Wpsvr@V=5FPOhQBAj#) zj^wNlUVrP%mw(V08tN$dQ5u$g9*}xe_AY@o3$KQAXloi{D-`OdL-%GYuXmtkw;MyW z);!t>{V%ym!XzKy>g2Sjc-j|{l>c|CxHIVgKMT!8t4V1O&4UL9foYdr0)XaI9uI|A zqgntAnj3HCUgPhD$0CcHmL}JnLhE(+GRFqi&vgefWKr~HjbglHWRXnDZ=*^66tE=@ z@p{_-a)@V4vX+?}(=QXQFOE+g<;E0Cz#Ln(je;Jicc;(v1o4gziGdif9foQg0CT+| zXdesA+-9BB-T*5u@PUgtc8;!ZQuZV$ogOo18gyub2vctew!Lr_vyXadL_ z?yx}vCUc`ZwkwsK>|y=v1Zs(_1tl$m#@>n0=N@rl6qBrE=X4Z~67HCdM3I8qHIaBa zN6WHK$H9%hBn|5h0lxwdSfAU{?<;dUqzy#sIM;g=1e;2@Au}ov*n^3qu;`wjD2kx4 ziMFo=a2&}87+Qi-P$*%cSoMII4=f20l$uL9(p;(K@HCjR(=v(_HMCDRQZRw=eN2Z#T1M0I zkc{$FdFsR>B{nN&4_5TB+3?bqb}Q&a%?}Mr6WE$z$|2WGcqMRBbnlvB(s;MB&4D5# zsVpKvs+WegE5G$dLcbw*08Rmpw^&495qz!&9yj&r!^u61MZY8MWb!!l%wy&MT0p~_ zzGJ7lB}3~DE3m5QD<966=P7n1g@#mOtyzP(DM{fWgISLE@e`R;Tl;JSXmVghSIfL+ zljJFy#blF54Z`mV$|>|6CF=b^g3bu^){H`vwkyuIp{PwhI48i3VzRBtoTI7l@1H>m zlQK8Qr-{T>z)2qHA=VeBRY86!tcWGBEqyG(+TzeJ;HWerP7T#k#K8mt+HvkA&@4ot zui8w7&zaM&V)wIfW1?g+pWjaTx7XXy%u13;Et$ErWFk!Wnnfpq+FzCK3*3=#(m$qE z5jlMEdC(gB?7;{0-NLA88|_uTn#Bt=O)C!5WEDo3JMivN2Z_T=#eCY~ND5_{32YuY z$UdFi0#{6|NONr=(k4n33}^6@=F2o3`ReyQeE7#oc+C(DZO&YPTr($=K?O1zp=nar zSL}gx%<%#8Ba}`64bV#ohEP!e3ZJ^Gr%-wsp{CCBg{EN*vH{`wDLz=y!MMBtEU!A12JG^7aW|W5p1>;~e-vx=lc{B*S5NbknASV#OpWVT&ekBk6N2CTf|* zw$vijxb8XJ7-pdiB8U0n<9Icc2o6)r=+ZvhVjr>iR)6M@HK0JBU~f=UUkU7p$$U}w zgod~1P78d$#KYk&u4&1Rrq@~rgZ<(geti`bb^%3Pm`^nfbefSlp<|-9yyvjIgp~uq zsYOkfY!w5})68$~@9309hLKSHq(yx+95qWi0gD)AIt79K-noRJjI1E*Cj*4fAnCO~ zNoX=kpZw11MO~1-GI!Q$rAM3dHzJQ)g7YLe0?1`B7^2K6qmu9v`1mtP(-AJ(yW-0-5Fu);(RIU)`nzo{^Y;a1r*7T7Hg2hAru;K9w*4?VaI4{6>d!b>fB-6KTWvBD4d4hv5@ZrHxrzuDIxCMT{3 zyAiK*C~eGJHc^h?Uf{R$2j6gQ+DhZgSAF(;6{VWuLXv(N!`(J~aH@%TBkF*_vG})h z50W^BL?2-o;Cbf!Sqm9|%Xc9U7_Q};^~QNLPOH;k`0G0G((J-FKM{KC+17m1N?e(n zAxoH#0j}?y=ig-WhPnup67=N4nY;GV3lenzTq1J!o&^rI;b0XfWSkGVqp3DuFiKy0 z@d&VT6)k6%+2K!k-OqRU83Z$N*Yw<*4UeD*;Ku+sg^AVfVe;W0EHh=y7UkHm@0Lu) z{$^Yezn@1K$)h?pp;8u7ED6LUz5Gt!zoi#&B-879Je`r5^1#T;XA|h*2tNiCHY2Tg zq!LARo+G(pU)q#XdZ;$YLxwANd5rr-OxP2RDg~CFFpeO1Kt15h6jo~wT+}u`@%#PQ z(Hw-hxM%vDH3y$lT}KK~)F(`xrR<@sVhK0KRKtf&vv5aLK-(;o8-l6zDFox*;F``J z6)XCZHi6&|X90Ven*=7S-26*~u2qZrgM*tL*SEynxC>k(^Bf(Bx)TgMmM_9?LLboM zc0+e=On(JiNMz*9=yhp2gB3C7@FMbjF9Y>YIX>L}3ZpF_!TUdOD0V_Q=pg&UmsiH_ zB*oS3{uWHqfyV*KbwQJj3F#{^#n9&dy>wvul#MAfDWwcI7)@55UY#HZgHCRYa}rNa z4!x53yH)DuAJ|?ie&3)Y;K7yZUPn9{%EaIt8vcvd>Dy4?I}xUZgnISie&)3-L-P@U ze1BrQ8&{Y~N52soE+Au!c2d}u;MaQDmtO`_cfj17p0H?%2tOdFEFtHSl&TC(bW}&` zgt-uu@~1S!lahV|Fi!o|SYWxDT)-S?F(Un1(dh=$`Ug}`aHp4t=dXi_d92eI5rV6~nat}yE* z2#~O73LkJbnkYDrL8dZ7voVgj_l%&zxtqHP-3Y7e z7h-zmZD6Gme!RJo7CMz~gdcY%btTlqVPRw!;|`)7-kw*2!Jp9(-jJw3d}9P-6*S;r zR&|=75&uj~n`L+oO09zPe5g^diqyr?1%HX8p>nx6_Qj=HsF#eJb3n{MlmOZCCMdIbdb&|HeJ=N5=Mz&PsUA85Wd(83U|OncoX zaG^CE{9B*hFY#Bi8sQf9{*-bEOMP5h>W0afOSK5E@p!480!0>1T+gxr9d&bf%h;iF z#Hs7Dksv&`$Z!#EUsX9Y*@uhDL`KM_P7f`{PH}t40jxSW-VwzXldtPSbctXT=*+dv z-p{*_lx&91PX;=M8tq)7{@;@|O5=fIyAIS6mbNP0Wjz+zVbS+dJW#lw z&+ZtSOfG|T12SBL*J|A+3~DJ>tVFK5A|+gc#uzEi_DXQrbqs$s^bXX4*TE1?vlK^{ z!FCv(&SMW0ce1twQd%zCZ|8-d_gV1{MZ}T~R5LaS9Pn@EA1k&7rde)6ckIF_@_{G?DOeNTf5g(HJm3Rla!N6GO0 z(!TR9bK@T2ziR@>i=^BJ7$cQgqg^k*9;?VKilU- z2#6dF1FZ&U`NT=oNUlE~pn*~kIH*^WAi$T;?aR-%u_PKmqJ)?wG*I*t#kZ`=_LOvZ zKk7lRC8HSP{TTL)yT@4i8;dKnsTsdtsE(e9Tte3U22RO^a0QIRX4vJl1mi0XojK?> zF=*gLpT!5dqhSKLVVd=Ci={FolAB2;Y_}d?(plxO-GAQ_o#RnV1AJmtBI;z*Y1$rT zAo5Xyf5#G=e_snjv*bAsBX=}S#x04c#S@&1u)q=Oy<%h_H<307)++jRM~+yiTBD$kGsT#zne*My4n zJC$?#NB}0OM%C{8@a>k9f}rs3Voa<|$eT*vyfo*nIPT(gB1R=Imj`njc4dQs&@doo zARz6VCBFuye7xdh?~vieSuoV12r1Tg;XM>xJ6(!_jTT~Ig09~QOkmx}eLT4yM3n80 z3>JLhzYI;pU`Np#?E;Q0dbkx-MvYi?a(V4yF>Yxx)R^GM47qbbOoWm${n6dHbcvIc zdz;&Jm>fwP2`UZZLUu)-P6F+wO`lUY>vb9d-rh0OI|I7Rj-ol^i!NE_XN@(bfAojt@a0MS<)E(1 zp)0nlaYHL5nvP`(I+R_A^!^6K`9XYHP9 znB8+;?1I6caQ{%b*_Hs2=|k%q9fu^Ubo3yi^JYOFyu*A>IRv`PA+UO~tR zH|{5K&B)qK`!QfQ+?_hOM9S~zZC#RN!4mxZISQ}|3@L@y0fhvw_zE=mUf-NI#WzR7rh@d3dDZmFZa&8`sqdQ4ZVexevYrMFh)!QleY5G`7Ri5- zviyifB-BA}7|Nr|2Xp?bIC8^7?g7xdjdaHT}LX*ait#@G~3sqjpP(c8L;gn!5UDF zO2<~bZaTBe27wH&6H()t5+nc270*}zhK{}>QVUihRRXmZGEfvOJ4JSpQs(-}YD}kB z!cMqe;QjPPaH$Z?z9EV>UhVojd1jz|JZLsac1UH*m*CH3dzp80QN25m4LntWJSSnw zy!LXmiQI4}Ezwnl1nkJzP$PcQJCY=54>pgM%uUy=RVfce)&g>rN;DG~*2G}~9j0&k zy?AW~Tu*$qa_6J)c%X+ltW&sP%EUYa&+$>F%J4!QoE zP+S@SwC56Fm%QriJ`a27PCL#*qiaqycBA6Cb#eVVcCoHo*YAfeLsp~N?)od7X(Bm; zqs9K;^>Nr6h3tV6q-!zTha84sgw5PNgFNG7Q;>(Ky37WaA&g_~d)8$bJ>Wye$g@eP z*)?nQ;?j2V`-{)m(&%PY<-HG_$t1$x9V}W20FBn}8NEon0`E)h4=ChV8c26PXAqcN zggPGHlww-vKe(VSG#QXb6Mvm}B)Th?*6Ge2xVjMux@aL$g^}VvQ>pm69HNxMpUmNx zuuIL~^px;zSlJE*x7z7@`CmGh7C~kd?<7gg(I%p#Bv8j4FiVM?@%hVxDUM)JFuc z5l@8)$tFM4#>V_sH$r!2@d`g|8v|Wm#T^!=FX=B43s_O{%8hog%TXuv?XTSV&%)^+ zD%BR9YM%Fx2qm}Xp?<7}J{XdDo;=3%))mfu78bqZ7IN3rpSn<;U@{$y%#d*|h~$Fo z*7BjLRb=|n6|PBR1as_Jtpv24#B|i z9Q|zTFbt}t5W{WEB}O546M@sm#+sM*u%pkTo1p0eMraz&^&^E^R?LiZKjw3(GBK-Z z$ua2S?G|%eFw9=xgNx@p3}(QgiSHcfSgaymEEkRM7t?%RjML&e>j4FM>WsmfS;mod zP3faf5J03li}L(y9GL1OkRnb{+-Un^HcK%mhmMVXR%$4Wh^6!qiPJ7DR{99CA6tRA z4uVcto8D!3&1VhEQ>o6r9epFGQe#hv0_ON}+E|x=m<~QdVAFQGEW-of;`|=hyH_FW$RC-_ zN7csA(Z{Hy3(#1jo|x`3U@Mx*pAi}R5|zwxdfS?}N2R4JcKEw1C|N}rrof(GFNr2! z{kCV^1>t7Ui=%_B#$qrhv#vBs+T-l>ZntrZO%$t4F_2OVoi|?m3}(5*+M0yHT)s?K zT&%e{5cZ4iDEZ9MfHxcKTTD9jNoucqgJ8Gbm3gFJ5ttqga_db1{4eSb5{TPMR&Nk_ zQvtaTYn_6+H%NG#$(3Km10(A5Xle`cK_sE%rpM9}ELd%|`r%!vha3+xwfS|aTh}gj z(+(ufOl~tzG{4{ZknJP~`pw|;uNvD+M81JqR~O$5D>MSv1WldbaSEGc3I*mpMDMuG zEJaNt`k&)T)n%#?yyXK$3?gMRLWWLG(aNHRyIa%2U+^i7lr&61VCV@kv7fRB8;nK} zQplsEazK`Bu(TY8EDz`5(7<)A1qC#~1X7B&wz^I%0wBz-gsN%GwTgARlF>&uk3;Ec z7iz{@#0p0YS{TIIZx3w$xeE>V5(!BZ7Ui!TYi9E(%<-?BwOZZhh7+zd#zR^UI4#=? zB9llLz{2|60D=JP8^Bl?;u^}tTDIZ#uEhpg0aqVleGCiPHv5DE1q3N@P1q~|RVnd2 zRr6I#pnZG(SIiaz9;gvGkyomifm4l`HpzE92xMM-iZaUkLOAIMOHx)$2eVhT;L$jI zM~3q4YFO4XkUbauzOaW3>8!kvgSB|$U>HC)e+$tY6&w2xNu{M8RQ_D0=zP$&Dcs8d7OIpgI~lA(k*FY zEcsE?hU!OD<2sRP_#q(Q zmI18~E+Ev~lY5R8h_G=8f#F9l!l-iuBRfMo0m~La3zN-)XHH$_(8;{WXXxi+BRv}q z&Z+88OLURLWtmhhT`EwqR&e4m-b)ZqUM!Z+03`0NAo#`X>H7R0^z%}7l?v>?_2vvw zT&1ul57otJc!;q0-B*2Bk}UolxcYuVX6wI@_F$Lr=dw}^D@2w`r29kCH)M*66woZw zV5WjX#lxPeBsTa03$ns@_bo={uM+hlE{#8@&4ruwjk*|g_}>(DaDXWmFoyMZf~((b z5Nzx*0dEGO6DB4~r-1_Q{_xn*7i*U54xR@m>Lrz1(HRnf(G5as`w7B z-Y`{z9x0JqnoL`>>u#iv&21VFUe^`^X7`JhHy$|ScP_!OIwlAA5xoyMpaZKlBE;LF z6|&`G?7jYYSoY1vJ_uS6@cDzA_$MPk2$@Jz|4GOI4i9-gmLpLbuH|OtJiW*~NWAGk zo#ro{gpnx6nW= zS-ln`D^q~|kl|H3#Dw+0VH2_kbn%A-GMbKCa@*A5JTzO(OPu#B#3jLugd6@xZ}$Xv zpI<~SF?t-|UR%pPug3xA{`|L>KAGVbYgDPLjElK)mwAm;davUaiPU`17C>x zJ7p)oi9(}I-b5M%wu{i&RXhfCx$$oUEU?t;(<9X8jIOksF}>l03Du-=^6+U(LP&}6 zkDWC?a-;M%B?oG2R5CfN#)Tgfo!UXak`zgngT~+3N{fE!UUflA^+gP{Daie*g3jLC zXDTQUkE0D96QsG){cE$$rPz-AcGJNXxM?Fwd8Wd7;u-)htuO%MyE21Up40CI^mEpY z#5C*Njjny;9l5b>X>yr%@@DcA<43ng8=trx^h2+#_UrV7+6v~GwHnG~QtgPQkmt9k z=a?`*ZIjZlSzY}CNp3Cjt9PDs!`M8XazyIZFa$L`P`|65@F}qlWs{KjHcx;!nzx)Y zWSv}S&^FevvF0C7ZX--zwj+^-&HKH|A;m|!*REdS2mAUtMJ9z)gmuQ*1Q*VAb#dWql`C<9s(eRV%7~%= z&r~#Y*zSDO&h`TI!jE=Q$nt)x`Zw9ThbtX13-e7wlOwgdC@wMxJiHZV4@&QNl@yoJXt~%6%AQowbIhS_?h%Ml5?0|6WINEVtPS#{ZqGz&;rf2dr_eV?+L#L*< z%M0TEy;gYuKSOf5qBgYqndE_Sh0zxhkHU>ERL-y9`gP|WkDqHHz6cI@rk@wCB3rqh@cEnn0>e~rUF=TU;8{={T>$_D2%O|F zd?-&p@|b=8Lf`Xx?`9b6*F4M7ffeB_0D^kVpbp7d1lfm3}t9TQyxM}iLGg3vmI^4 zjU4{{c0=K0f$;%XFg<|?bUguv037ZFxwzOPSd=vjnIbU#JdJ%yJ3+z^<^vZ`=C)L0 zYHmD8;zgNIwy<+6-NtABmmXg_axu!(WhAuy{R8Z{gzRI^e-QfouWaD1`e>gdn;?MK zI{;!poxg+95w|*hIfS8U81v~3VUH`8fz?tl?Ucdwl`Aw}PIW+_eJ@FHAQ~QoS6X*zG%+r^CCDR)lDFe^}7BNC3PG0;0EZvl3lfZR`|t|AbR!lGbGbK-|^K z96m=kKgmZqyr>v2EuTJpxYm^Jl>T20H~sFl&cciO|GD66S@65QN*;P_|IqohOKQkkbDB_n3Fs9DlTPO@TuS`b(Q0Z#H0ip{%5U?Qn}v& z_14eCv2%SMBf4s6kx-7+lZjG6&^DO2G@6vo!b-#zNUXqdgtXpT*Y$Ei_dA!&ZZ5KS zC4;w?lYc^v9kJpS!yylfgCJ(oHFy7>#c+)M4936sSPJi-5(4<(C^ZWywgo0NMFnAq zC0(T>b@Rag2I|q<{!7&?;1barwqs&Xih36gPP8s&a^o>@HCBO%LttPorv#}4N4mv- z9W5ttL4wS_kTwUvU15p|(Oh1Xz5=erg!{BgwF1pEaR4V-2tSMFR-hiRQh&?G9l%!b zIbE`Pp5#>zusB=UYE>`&m23(8);!T-02zP?y-s(ol^)d3*A4Kt2>TF#w7Px&V> zzuIk9LLUN~)vQt-mK_v18?O&T5FvX<)MZ*nGmO0lZnzcK=>06HEz8yc5)2^)%LwQq zj9e-UTS?)kz_HaSAsm!fqe6MQP$}yJN}sa8OjKD)pq5ZSq?D4$FMF=eFypg|rk`uV zRsi$x`XMb)xZf+;H_H~5m@wmX%7-AUjI+a6(ujDeg?yko9qdxzhGJEGM+q< zdLT|_rkAlr>dC@T`wyy0JBQg)9EGo+IQcR$B|}Z7n9hAdv`a|K_hnVkkcI&-`LYIl zIj}*f^=pWXku;`FV>#OYFZ~BnrfKP!gcwNr5*-|;P zce24u_jdWN(HV&>$R6$d^&HulbZC}2zD=`h(8_VdIyL-fG>)EE85VAr1H8vlvfT9U1ZW7(ST)Ul_Trx+sfFlksJI)!p$O%2$K29jSP7K$ot%k7jM=a`jgT zW^jZ3344l&@kEblcZ_+}gc5&AM~spzAg6YM4`2v4RI?^I!SQU^5gsD|G1QF2ki!zi zkldyW{-r!BhKy{m2iG&YiUcnPBbF2rcj6_mGz5SN^ywm`%B#_G)*wl1So+q0@bDzA zK?4v6+TJRbn_*1@iZU!Xk$uuOjs_-sXT64j{Ms6tqw-hCV~d$za;}Zdp=-3xuHX)Z z6WHf)d}}3##5(eu012bc+}nd|tS0(DBBIfA^KXJ*v|XzC)$M8l6VNvq#4xel921+@ z*#EXGz!gpNl#MyKud&}+Q(-M;Oh0$__K%fRfdu>vC*#btrqd&rDTG{>(Xa(G32Gu) z0HSw<6A&F&5{*5rB3#?>Kh`}B=$AtyZ$gm59rw$7D5KTLdNY6|R`q0;=JLVt*~b^Rief`F(9k(cF} zv5OjO@!Z};>0z`Kc$t!W@S7h%&hcOoSEO$?`9$c#sjU^V*r=3mWPB>;MMTmcGNGy_ z;v-};1sN&3Vt; z5cn=y* zk1v2WF%8pzDbkYX%^cxDG1vg$K#*ai4hL{zHR!cS!RM%v9WT0kR6mzhCScjZ_;A=D zOM#TFVV%q0>K<{tl+Pw|S()}|!#F&)4@u=Ut2Fj$l0EKWVDfNND$zGVZ_;LHS`Vta%+?=<4tIAV_m?g0@WzH0o5Mr0q3qs1?1!B9PUbh_&8!;7dF6!7kxO4(&B zZ$kngg#r~7^AhGJmGd`GVzBoHLykS=tv{mANi-Mz?mB&Qzsy}A#-(_nIB2g<6>ro1 z5^{%(lcY$Ld+ys`!5w*#OV$UiB$()r-V;^L>gNpFdmakt{FZ-Gz6B6^hg-;Z^;iQq zvtsJ}zGF}C=b1x`)Y#r4g2{{LzIaVhk^&c%psY8!51yumDLOHy-~CLz`Oe>6xt!n5 zkMglHEQSPc^haC8(|uP zM=wR#2MF+L`Ys35BzNJpx_HhDP-Sj?nvxZ@ClFpQ(DLF1*#`1=@dBt(>S~#D`yEeA z)J~8OgbR?F1H~{^=>)naZi~lZj^CfL&7`IS1UCPxs}JS@b6SHP;D8y0rVd^IMcr06 z@%;dH-fh%fMVqh@G*Db9ki#1C79;RyXDS5O`}*$XTus<9rj}%*OWP;sfH=3*J|9?Y zliO;W+U7H)ucrk`pqxU8KGdCO;Bm~SCkhH)Zc(t;RqsAdd#&Iei>P90!i+Mu{4Xc( zIrWiF2LdX`nI~6S`d*wyl&{v_+Ej)G`v8@@_hUJr(Wr?BN%=Oh-bm zsrP#Vp~&C0Xthac;ZwUOH1Jua%DjAIiFgI@7^$nFEspWqrg64g)0fe&@vSMT+?oB` zrbKk5Mo+*sIAD0m10W=jaP7vMyGIugL_wpk5+uOpqT>E46f!AlFrzc(R7%D%;Pj?5 zQUFw9ss^0+F+42J7viJw$Uby85 z8|^8CEgP$Yn^w6oRwIN?wF4QR|H%*6n#V|0fgdbjXwy~gl0pCB$7j2wE(BeC)U_=+ zdYWcTbU6}Y%*r~C{+6@whzfnqtUy%`X8cQ*KrT&}sYItBezt9CT6;q@o}^#QR{E_? z!!^?`*qF>sy zurE!_!w2L!%qzxo3nmI?hqbw5_Z*%iku$yAfqB~o{3Vtl7PoBaPpe*q^L~Ccfjtt}3 z7$YuWpnF^Q7(i6w9Kyqaw+r9uOEx5A%ZMcYrW&g3ODQo+`V8zvC%T3s(pE113`xN4 z+64Z859FOYpWkO0lf!JKd>qIw0&>;kns3U%t_Tnk^I zBTfi0oW&YrTwijyX|t+ZZ>e{~8*x4Z&b~5SvT^#f4e!|50H3UAU_z7lX#j(FQsEpY zm%m_En2a@s0P3{S{L-Ifs8r#{aFkOU2yRqe@Q*y zH?U=vz=s?&AM2{+audkwa zT%pkvi$2ii8w0wFsy!Ug%I9^<;Fa;C+hbL=GUZek9K$HNa+6&1M3f`MfYcXxoXIE& zxrL@b_*HESgE;EqgrG*xtFbYdy#-$|VU!N9w-dkIVoS1mbEl~RcntJ>;!l9wL<_el z;BZ3+8B&ox5V{L>=l*PLYT6Bo!or~CE3U{_Ki`TlZ0V0MAcG+77ksmR^>NCW0filDFv>09xvdpN!Gy2 zsK^_IEWHcYpT$oZSX&@Kf{e;zBLLuTU~o&9o#?1*_HlT!{UKOCaMzVB8G_c`D8mqp z_bG$+{jcp4-$0-P!A^JXr?g5B<>ZlbKtS2tqjSi|_e$$nlYVsy*xT|}a~uJ_q9n=E z?$Lr3znYzi3E^eMp`BCiIP!r$+@O{p%6H=T?Y-)P!Y}pSu|4aeMZt=Lhi`KD5{Q?7A0dck6Zexr3~i!;ro)EkC4w zCb&h^GIEzaJg_d(e%xzf(sr~=ldwV>tLIs~&R!v@mz%ymE|D7qu_a0s0~J*IraBe@ z6QQA;k3J_B2Pyq_I)rA7#OT~Atis%poO6=HL!I_*|3~H@nUi*sy&B)sJ$2-2r)HOd z9DfjPN%^Kwd94?K6yC_$V7DeEC}6`ln9t(d2I`ecs#l92J6K2X%I+uP=r8I`lDpn4 zZ$+XTi1+%yd7FE6$Qw^lSLnR#vA1Li8lBJM@DmncZ$N2!vjwlUuqa}qAWa!<@%43x_Fh6Wzh z17t}*g>K1L&a}u|tG|MT0|F<}V~-f#|HmVMBSc0tqsEv66L)VJbmBlZCYvwLZQr=> z+U>VJ)Wji^mfkh=;`<_+Hew~%EWw#`LUh-^g{SM%*F7*5a(#+Tv8yQng20dR3#@ijpndPjSO%azun0N|2PA^IQUNRsI2*%^OI!K`a zDusPfG)FV6e>I>APHgB*VHX0D8VQ>Em_2Fb>`u6S!QtPE%6K*!BQe(kedXIQ^iV@VGRSQbqh%Z;s$uiPADhb~`(9Oiw9xyabmu z)NTz^+BPAS*&GPx#tXv20v^PrgLZR@%`S)70f$pG2V!ZFJk*NZ|2DcO>quJZpzdAN zXb#K)ps30cs*kJAuj~5JZ%xshO#<}>)5LAGm{if+km6D4zcLW~1r#_2-yGV<0I#He zWO;xiD4o{5aIc^!Va;o9Ho8bqihx4ijG)u5IsK`Q>}v~;&_)jC1?j3z#;=cyA)QF5 ztEep3Q(r)pM*HxJ6VWWV0y-P=q-BO=sB|tK)kqa~i8&L&_sij4|HBe-S_~HiAgIXE z4H}&bh!^6@-M@L$P^^$B%L>kS)nAn&MI(xjg~FwxaEI$9^gXBS4ZKp8qVn*Sfd~Xe zqd!He!wo$+aS}ERzJW_@{DPPf?|&rWa)KPKsK8NhTOq&=32shHs59`4;)+?c%`vFd zY-ZnjV&rVT&Yutj-j3ZpAPpIi) zF7dg!#?6#naygl6U}HX?0cKyP%cm7#c*7>mPAJfFYUW1}#W`C#Lz4MfGPui0)m^4U zso|*&819T=#92r?JO&de_6{1o>i~^kUg60783~y(Zn2!Rwk*D`kR~;K)8P7q`I<>S z49{1pySagR3u!T(ER>oBiD{(+>xSTi9uf%ikvuCMmQ*;*4FUMtfn7G^2JUkgF7*E~ zqLvsNN~^ASJ{MF!NBJDlYM$dP9v&(pw1JGiAGf*<)1?Oz6OSlx{Qh2pSXfBVxaf)8 z;C*nABMNAp8PRz^Lu23KDjfS3@l8%Q`sVlH&kbC64eotY;6nKPlSQE0UOz%15B*+$ zZKQ&$)I?J$!td?_J9aP3KBk>kyYmGzHUz#Y5x#;hrbOg2vM)sMP}KKc;(S!l371+T z3%WVk!OwX?hWM+VC`12{`bmCpYzwd3;apQlm^ga71==chxZ(uP5zw(1&py>M3qwYB|SLd^&_*{9th4IT4xqgdXC^ zjd#>Vu72j1!!b54o88m(OiSQFW|WBIeb8c{B_GH1b>$0?68{I;DZku>a4|6klJ16(cnfLSF!$mDH4QG0jy>L}qChI#$jy!FJb*+)3{inH zL+Im(FPjdFC=9;A9hq**{|DK0h`H@N5}61Mqe5OkF)ew;=)%% z>gKUF4u{Rf^6)?agd_&-3qkAm4bB-KImJPjq!wx6fhc}{ahKwyXQgRsf`ev&13$z- z#+kQXeEx7I?b3~y$#T`Z2%(KBt&oJnp)yz1?joo}*F{HhqW_T=4y}|n2EwYxR*;bb z_5J^Wv=Omcq3=aTsoxSx1m%O}cslzfUp=}`%W_^x(^1KeBGr?YGrJ11CJC`Fkpd(K z+h=ue*1JW;W&c1rcN9rd`T@O3Vk8|zrX!fbW(EF-4Uf(>D{49&*zuvI0Y-)<<}**Pmz+2ZTT!VK-L3QO+R%z z_#>@4#jJ|+cZ^nd8>FSFUQVaPvKHlz)RHNZ6fo{Q%9mSzXl1GmdptSIR1%hhYN?Qccu(dlU&uPXS{agXyAV6O5biq0B1!{Bm zdASQ>nHJm&BLCcLpbR9gwUQ9B<=%TsDP>ABdkSg`Q48!&1Rw(N_78U3;-UoFi$x4# zsz8gAB?}a2bG#%`1q!q{kf@>tv^t&iVis9yU;=H97tk=HiGmisgke)bC%t|lj4P19 z_I{i|>xuyhDJRfc&`FP7xB|oyXfNob7ssR_vjo~#C%t)e)WZx&V0)~zqy}hrI_YIx z=x}uO1h&UNJRt>WG5CU}2(&sn=|wM6&?o}!4rhf#Mn!9?!1i{$0G%|?4_HmcXn4|u z1SXMT#1k098*P?AE5neYX0EAH6$Ka`I08BNl5_;NXSD!rrm?!XaRUi#Zzl}sq?v(G zLJ8@#J*3o?P`{$NP`CE!bkCfX0);*srb(AmXT~|g5|=##FE`YgQODIlU#L+Pc;@U` zWC9pxkEVBfwglz<+36Q%ej7GFoy^-~+h53&!sgdoUK9S7ys zOiu6F{VD0$)9<8{Qc8manUzvXDa~k>eHl2_IypDkr5g}XmH7)kf`E#NTD@7Y?Wv$W z6M2H7r#vq`^V)ZO7FLi&pw$L!>Z~nuTb-^#@XxCA0?xS8=xg@z(*|N@R>EOB?Mms_QBcN> zQ%M?#PVNTk>veFYYglzn`*a#sJ%caz^~Imh-*J{Tb4n@Y6)fM)SOllk6)QhI0nsCl zkBsI+9ugRH`{<>IJYG`im{ArhYXfZ==ku+1h2@$@nW$dg*DS?iCtYe-{d86;XiV`b z6BJKnrq)n4Mo3hav^a^OYM_4UmgN~`shU$PVQgeEH%eU*V`&3+C>FVDz;x{kzo*V+ zLZq$T7h{i*IyVbX>-=cD_DyQL|?TVUbuO-%04Dcu{2Clk4XH?TfGwEQrwVQsT^y^Tbv!weN1*dbJf#l z!c$K-=M_%lbXIPY=17X8%baeTYuze@cFMnb9K6LrgtZkB4xam%aPZWl(FRN*%7_+jVd-S>K+*WqmtqNBpK9zxnn;CoOyz zapWjj(cP1tlKA>S0pFfNbo%(cJW#;5D~eMs zUTy|n?v5)0>7PC4oUa0ZdlNWQU%OMFFuSh3Ah_ zI=K0&yM2_>L5-(=^G{Jk@nLr6>lin@PToqoNHP||q$Q@W-csW&r=)Hr9euq;Ut4Ux zwyM5L0EecjuM)t4sTK8A0yr!MNdO0>?uj4%XkjaX>DcT~q`zy?WO~ zjMLNU}=XEAPgoxVDwxgl%mtFw+|jEj;z z)mcYheS|b_bjm(T>9FR*E=tBCXunY7zVN!-7R@jGiC-A>Ar}QT0tv21eMRC8q=fT{ z!$hCy?C}%#n65=2T~qX_UL6*Juvgz=tZM?NYub*gvzX{py(h+aOzf$S=4-8C-0EGE zrp2sl!kKD?ae96kVX&W{prFk)r{6euC0mRzj~?_LJHn#evTf5c*S?u$J6=il)i2a& z^!W+Jp6F8Yw3Gc9D-w0)qX&r!=z`b)_->YD6DiBgP&ZKk2NX{tM-w0Rc33NjssVnxBs3f1WP+dC3isA8mk=4uH7)Ntt#^A-xj9Vp(Td)@rW2B@yad zUuC27S=n$Q3t_@~?B*$n(dRRcz7q zC9NB-l2*>gXZPn!0FQ)j-x)tRN^|I!(tZ zUf1+&M$JwwD9GCC-S5N2)37YN-X|N0WKril%`;Ea?yX!TGuMz+y@u5=Rf`q2 zsD|)s;q~cpi&S5?t$tx;d5mBDzSt{|EZ2OpsL$_D$!b#9TCQbT%QM>Y>8#eLgt9so z6{o3OWQC%lA{VkHIzOFq&9Wt*o$#5*H*emY;42N6eCGUFK<740YWF$EwTk07GRMg> zrygI)$t(`9=6GFi&ho0KJ$0eR@#?WW^QcFb8)aE_E+lb0mbdb{tK-_CqN1XrVl_?_ zlhyE@tR-V6o?mOzaU32FgPEtvPm`Lnya>89R>yMbLQ-QjoW{1T`YH0$!H>{Ske{F* zA6?XZSnv3Kw(B&|pmW>VPXinJ&_IJ99~wxfnyMXC`R=d^8v(B>Iu{!G3tL)UR$G&|m?YAtxU3oUtR^D6<$$S%% z4SiF_sR?io84~@RGeRy821?wQ5PK2!pP(x_#v*R`^FG)c#y;F!zp;1)5nG_4;))h; zJb~;*WQ^#ElozTisvHpl4}k1H>_Of@I^R6cNjOn`lyWNbJ3dM|ZTT62M3>Jee7hrE z*GG?kPN^db*~X38$1gTe@gJ9Xd7*-l|_tH6jNo;GM_^O6Kk_64U$KP3^#(? z6&nCEKz109j@hqB2Sqvnf%C3dmojFZz3U#{I_(;<;f71RZy1ly+TRlITL3=1Va5|S zu6TOkhay1!VFodPpprogDXzsa*q{P~8!@VAxB=uYMi?Ej1`8D#Aq3z9EK+^*YW|3V zj0d3B0AU0L43IrY#xRH>%^4r4%5dWX$nLPMN*AUc-$jP%&y_w$pvmq0^dq~AJ+f=; zag{;UWhTK7OI7R>Ti*5)J$(1X4Nrj^pCf|5V9Z-5zP#0(K;rGz8S$JGK)kh1^zc$n z)bKgjyk&LM)1i9XGV?f8yv1qaS6Dtr6FR)>&ExnrZ*z2D{KmyosJ9k8y}h8Dp62xS z)lClviMKo5^ePc=G3chp{qRLh+40hgQcXR48XFmhJ6%RJQM$-O5wN|I=+a}1F~%4( zSaYM9BZ{J#ENs4`nJiV`AI(^q^6fgd=f?)pWKY~)i6o(mK%P#0enUX|9R>A|giQzO zOBYDpa?QM>3sU*1ApeR6jx><^lyBa2eDemR@&O!x^rKpcAqExIogQ6x3~m#QxDg{# zsDmOhw!&exF1K|a6vO$F$etn*%DBA5So%kM68Twq;j)Kp#d>jbk#X5WS4Zht&k{%~ zu6SX)0?Mjg)5wHTLkrVJ)8ZOdoXLTQ7h1RygON1Ah;oJ%QDG>dk!hkq3!@1K9BiId z#+(tz2oW@bf%dmvXLi7wXQWUt`>dTGoZTEtFz0V9+DvM1|(jRl7KZOKq8AXQdL|yAtA$= zEKfXT@rH{dxTdIGR}kM;EY5Z6gNsSQIxghCdYA<<0{8-%yAsYX&10UA}djfi6fr#h(6rBSu7>2xC%30 zu~@4jLblcMYRDD>D~!I0VI|4Nr#>4-X|yqZN;a3Sg!;AufhdZPkw>_B`&>0(bGb$5 z+Bb;-qW?bpX0%+_H+s?^f;BYkB9foUVkl zzE$@JOM&wyuGQx=$VbN$Cw+&s5>(t&n1D_L;B_=0YM4TN4k-z8&3YgM$USau^||U zzztkyfdkiLVDNrJ3|6;Z#%bB~*+l*XBT9L@JJPf-tkN4g!GxF2#L07&*4wZMgwj}r zLIXAFs(v1Ao1a7<9QooT$I14g)ZN|f#8IG-pYZ4>5s3UZAqkr$uHQU*N;HpeYRMt~oU`K9rcjm=V)JAuI9IoMs}BR+6zJ9WS|}&-Bu_#E9i75#8=Qfx?g4<_w6y^&pZlkvu?D~ z&Fi3ul>hxD$w1TEls2usLIZ`djh9nHT71}j7};bXiHsTP9$7tZJYd~jr#E><5%|Mlxz78(un7QRhS`^-afq3abLLC(8JQg@$Jq8A?1voL* z@-JM%^VB!4qf-KY_yi#2f&EkqaK5*1W_g{Ld3#&Su6mi%{+MuI$ibU8Z~9xZ`e3Jt z1Y!Jiq2A`VBLb8gb}z#w@?i}WF5!{heVtANX$^}!ensRq3@YaX_KXf`FoEsuumRep zYJ$xNW@sY`JmQQfCMrb<1r64-Id=9P^X7~lj=V0+O>&PJl4h$hf-H$gDN8)_sNH8{Zr z7EpRY%$NcVK!g}5I>wEaCs2B?B|uxXDDqO2b<=AoHEK|!b<-On02VB;fKC+Pg&1Q1 zKn&=lf-@Tx^F$U@fKGmjs9_0i3?H;u!gkV|Lbw4=Z)mDZ4Jf@hMHaAv?G<;hUPmwhsq6TV{|bdc3L)5l(hC3;kea~8k330Gb@vjR?-8WO z)dO}w`3*S%m)OW7W0L~Gi9j}>AqOSU367Yqj2Do4L;V7j8Err(7W@EGt$(<_p}0mE z;B+GJey<07Lv7^7%oFIO0yp4v`VDa#RrpW@I>BHEaDH0-o3l*S~77`%+c=`v^$+1SC$b}Ul2m+j5EYk%T zdAeI}@xjR{@`y^$Xs8rDe@#3Rz_M^>WM>idM<*WCteDK-i9Y;A=2i4*@2F%!daiP# zRFz6w8!J!VPf9$xa&JPX7ovK1vlK1_@@=7>Qygh^SqipC6^nRQb^LQ-^LK zS9s-|bIzW^MRU$M>lbQs&WwgcAG0za^7zc(U~zdfM`gk!NpV4Sgj5%8q{Ll?1zGvSt^ixe5Zl5@iVP1zzAJ7xxtCdd805nUCKjQ* zHuci43yU{ix@U34ONT*KdFek;X1w$uE-zh3i!I*O0ic!^-|dp9${H$6Aj1t%j&R_C zh6gECj0l5_AsPfBXn~6jpgaOWE|)t{OKU*fUgRr4f*7DMqKXi>umw2ug^UwC;em)M zUbHXVD8q)48q?qX*dWkEQ3HvECI>JY8l55*8XaIoMMXh??HYR$$@1$;<`Jwuf_wzg z*?G}9zt^+7G%>I#+hNz`)FiNxC+v@{3?*?ovcn0qF4Rg>GFxdFb?Na^!>H?!;o6Xu zq7OE-tCi3&N;v>#+@S`$nEg13PGKqyqs~*1l#rxh)Q4bkYY{mZweXaR583Fc3xJ9n zveJ=K1hTYkPQB=2=UPZ*?}HsLRCW1n`>w3KNyk>6Em@t=uq7)YC!k=Zown1U_JTBw zQm6JCVzB#O?Gd!zp37YWSfhqIH&JIL8k7Wyj1@65=L}NCW*V6e^zwizNXB5Yr_x%V zZoovHmyFm+OqnJMhO(ZD0rRv$>XrKhN~xZD@s#R&geG8BcZ_uISARqLTShfd$8=Ol zComl|l1aRDDMmtFAqI_=mn@(tbp;i!>Ym&@X^1c>j~o_(#29(Vwj#o$OYYn5)m*OZ z^A9DG0jLy#p;m#H8+KHalGN!bsokg#UGhoF2+9dcms3)WmX|m$i9iWfk6#ZTZm4m4 z(`Gq&^5n^rB}?bYL0lANQVL=Iun zJjWPAp65QAf}*IMdiZc%Q;NQ*32tg)Vp4jUG=(|>UV4at@1U11rH3%-MUqMOaJvXy zF7>7eU2f60lM6MNQ8byr1hH}gGer$%0oD=Yt$Ya8bnke&xYrPY}10jYw-bMbizZD+y|4R!W&A zG9iNTBj{BhK;DHE5c|pV`&IByrj{_ksBGJ7cE%~5k*7?m~cahF}?_5 zi6hE@A?bU$oUj5ah9KD3LF$b#ZeRgHnK5qC-~ciNp73IgFC&n`i8VkrfteD>00Wsf zXkY<(eos?NG0F-On-!>rqE9QRKCbam>Z$6vRRc0L&(kn=&V(KvSibU>udp!3xX5kn z*s-rmZ*?c&=LgIu0F84!dM)o(jx$$6S{_#}SM!;(EEdb{N(hTnk_6yF_1qRlDN^y0 zLlJ?W(XCv06nwu38{mX-oAT*5GVN-6%No1rY5B&2SG^o_-LTX`jC}U=p3Gr zoQi_Y>v%?-Qk17&xFk*)If8*MsOW;!MGG)=(P_4ZHzTOxWd}B{VEOS8f;huXlp-6p ze2FHYiaNuD2&zOuNpf*`4yPGHi7iJU(X@0$Y6?piW5RsF;a$lLFe8HvO4uO9mNqcp z#t>0FIgy2o=o8t4pxh!2i{3%QB2fp7u$UkWFIBc^0hx$P)0qxP;RXpEiYTFB(WeqK zv2znUEAbMNhDDrqFIXSH+^}@R5{uj9kRg-9Q;HZlppd#aO=V$2iWnIcRNQWR)%1Bq zWX?$`9nukrRYu8@b4H&U_D658zpjWd5stH;sJX+?pe4y5WyuRM#C*Hvg&1JIeNHQ- z`%6uuUcDytxw%)cHrKB!YCk+sQRYLJnD6oAMky+$ypD?sD9^s*JpH~ca%C` zC&Y@|&Sj*GQA!!3RAG8>Kf07r#)kC|GtncD$APOPdJLm?l&WWby3r}h)N|3x7K%Q0 zRhU1$kmz3?aAtmb3O|w$;Dz0sewouKd${AgelP7C(!4qmNMy@pw;jLbfyE84n0lJecfZAHbU%`m^j|XMmPVhnNR9OE`f}vb-2TG`}YN?L=Gz#T#TVB@d-J zrG>?!4J?|lP?F3-9cWR{W~wuFetHVSO4Jof&>)12xp)|J=8GpSPDOz1TvR{$J@M$` zg`@;ViZPrR(%8XB2^W@_0@*n!#*()E+X^x_IE&(2c~6ul6G1q~M; zGF96WR5^ikNTmR8(BBUvE`PZpO4V!%h+w1W6Wz!NE=T{7<@R^GJ)R(YqH|tnS;pD6 zc~4i@jP`8VS~oS~mXmhUv#!VrLtMm0C&*Y%j6eV5(gIoTaWMi2RBUJ`jawwyWA8bft3uwd|KS;@-MAQeA0K-@n^(b3qVNGL=jP#P(z6c*qopPH4GsFDQRGV0U0`$Fd(CL4C`>t+4V#p?%8#Bccqlp z`n@~|r%Qf39yUV}eSl`1O+eJ=7gu_^} zBxxWM8i?K6RR}nrIrX5uzgI?A*=Gc&1gFON@g;k;x!p^I9B(-i9M9oGaB#k%EZyIc z>q9txon|^N)Xh!21XQJWoVeBd2oBfzhO%Tnl;b!&`;O@N5RU7(Tn*{(vd(KOohACP z>#*nW8p-=%#qGW%4GZI%XQLdU4v-WvB4asUdm5YPq!9KyOM+a9f{#*OpdJO6&in=G zqtut8cYT!dGRC9OWCd$$$15V;r_~Y~#;euWgn9;U+)$$ygEg*Y|1rRhYsY!KrR7x! z2Uul2L!A#ac-h{nNaXk8C$;1 zct$!)1j5sDZqvF^pp@2HT{v`fIt_272(laTJq$ra567?%I5c^Q0@CEAG zo7@j3dn^jw3ifN_bS1aavulh*tCj>YU8$8)l@ee$DNzC&sK}wZGUka898qy1i6@3Q zq74vW={BGhCoG1+A!siHG$Ui&C@h6;+L zCg#+v^dr-yv;BswOCREVI?;+c=dIj&*W1(H(k{!gjMA=Z&9P>g^p>+Q@5h4lmS_K> zUY|ev_V}&FD_?!BugJ;+B+)0k7$Di&aU(}`H8b`qo}os+8}b>l3{vXv0cC3`Yj zMoUilaT$l=GSr)Bx;bWI!5e52DFSJ)eu3D=*C#Pn5214KHC7=45SWPrz`2#VWIVCp z9+k^yT^3Lj40DM-E#}E}B!S@>s(W*kvs$-<%MB$`*pgI`mYAd#O+L*k>y=110$F+G zGGA|H`R3Xz)37?n$TAWs`cyREjA~e|TA8nIx6Q3@p5}8UM02ZgUJ9H$DSFQ5>H`g) zI%l0%LM)BHvDS(}=$tyi5jvd6aN)v*3l}n6JkaI|E?l^9;ld?M7hJd?GuK@)MV_~Q&bHGZIn{Gn&zArK|6c0WQ9)t zigj*g-j%T**&|(}QW`-LeWY_<1Y(cWq-WB9WbA|}fvU(Taex8}0AN5y>Z|^ad3t zcxa)^7jMAoLe+~@7l50p^HmNN6#)`Vezs$K*HF>v_mN09JW zH=*dOpU^-!zWR~|ie6Bu`RXV%ko@W^RNu5L)X}M5{UVLA(Z=r9*&G(LUD>4p(Q#<)q$=`-pshL^9tz{^oXeDi7|qXRPyB+&xa{mj z%G8JP3?`z^SVD%_J$v^k$rjjSbm|Y7&L0cx)9GYkdi-88MxIo}m-OjGU^^1_=ttPU zp)B${62F(6KEz*iB2dcP-QE?K?1|yB$DRTJQ?y_(wb6|-x6w+eyLOyXI(JB+)mKgg z(%ShE07F2$zuOIQ-hHn+w7LCWwGx5Uv)b9rb$c*zEq9x9eq?iQ`u4pt?K{HxQ1($C z<84$&((Jhf7cN}LaM9tUHS6o%d&%hE3K)5 za}1_ln|rVAdu@JXy7eP=@&?(*xO#1$2-B^TFx`Hy%_B&Hbnbg?-))%YF4?0Ab&n=4 zk4B*Y!wDTuwboi|^%X)a9pjtF?03X;@uTt5?_I zbZf0PV;&}!xYgTDIUJ$jXPLuZHw9VIy9{1kuNdK0Wc`4}ZD{#-v9b`R#O1=GpgUF4Q}W?oR`SnvVtwYM^iiX`t}+ zia@^b2KDO4i#xfF{bZSkIuFI&Sz|`@;qjm8lB;GK8+juCv&YxPo{sdkx3$ZR$R7!S z&obXpBd280Qx7dy-X2Qa>de`#+dTf+KpXeuZS7V<(A>^C_8JNGl_Qzn>gYXMq(z} zlldz1F7qE&+^%6+<`|H1Gml-Rp`p~SvC$MSG{M0(k4N{ozHo;p2uu{4?~skopz$xh zT?mYCPXdB(=b|%HO4sEB_$YN|%j0~MI%DNS7!6}14^OZD0Lns^Bbrl>APbq#8bOy@ z#!%vGIb0uJP`bNK=9U0lu=%Q@nr7K6Awyue?QLlXn{q?#vut|iC&(D}%!48j>Cz%v z@mb~^$CAjN%rpPVT;IJQ%=wI&If!jK^tnSupXk#*n}{6&3E0OYf*Uuy&Dsi` zCMEUeC#M;fKZf1MZ%OyJVe#cbJ3D_N^VeiPBlY+4Acgtu(&ZP%G`_zk^KZkL=;LaL z{Maxe$qdEXn*F3+Po0|0?Bn-pvq&w_z1Bvn!Nyl-DW!~Re09rc#5BG-hq3CbPY<&> zo4U>DeEC9B^XBI5S#8t2`Ln(0am6Htm1WOtC4_pdT36q^k>5ST#t0OBPTAevtrr)U z1)#;{?(Sxyv*mQ7W|B%NrDRDz%8#X#Qc9MzQYkZyGp8)O(`JMXxj}{KIbU|mDJztt zC^?&UPR^n;Gc(J`gky}Z+hraTC!b{@%-6n&1WbDT*xcDHSuy&|%bLNOxjG-EqQ>~} zC(5PZqf`_W37WDVuIr;zlu}d@tun%EYrPs`QZoVo0006r6aXMF5Dth$0+CoeB9w(W^%MXLm$FD~MihyoAc#Q- zAwviN1ONaC05Aq%hGw=3PIY-(CiA|-M^T;IQ5SAEh3Cal8Y4o^kBTidUYn;lU->X! ztKfu9Hy{K-aFVXi^o}U`hD7% zTQQ9mnX>r#A(nUiKjFrXzukRQNX>qEcF~4npo$Uqj8l8g=zQ$f@bx74v5Ue*9-P-e z^1$>z>q*{Cf{|@Eu*XDEMTk+FB1Ni5#VeHbG9PECYV66G7IjpjHPS@nitUMy=u{l7i%=)GmaxyO9DsvwDrGkTcuhD~KaC{O%zVKqt);z}NzQfuja+W01PN zaYe;Dch!2bPCyxv`H$I7lb~MhQ z#HG!lu!fKdEJ(E!@njPsnh#@EqYFs-LLngxXt_jqC}Uic?yeM#Pu^yL0olXN(S$>h z5T`#I$=wB@70IDV#Kjg}f|AeI&MwPTHf4hQC2p_sjo=gzPQtLMn(ehDkI-b(tG1eX zHLFv{RfdkCaH>FTKoBMv;FxjRb>`Y7hZ~bfw_fIyXT=aIY{XvcloQm?Qfmu3Zm%D_Zg0y z)N3n_?3`RAoweJRdeoH@c^CN*$-WbpmV0tQD9mXky3I=7x^)ScHpZ+m3*nd56oq{o zX^U5QRy-S4wva|CmPzBe_BFgws&vtcU@vexAn&|Y3FXW-0@ zSq3D_CbE>@t_&0fH}j-stuusRSSp8Ky>TXYV?n;;pA(&+Fe>Aa7I8Of{5`228R=)! zyL{A38!ZE}F!0g&hLszFZjSp0kgsyZ5WRJ51hHFfv?JRS{jU_s4aDUj%|U{{Ug@%? zhl%ImBCxcLxQRD6UQ|>xh+L|*Fg8BwpDSh_R+^OfY&|?oOReDcTYI4B48E7A#pheC8N0~?swO}{|4i-mnoP6c$h?@h0c=6+q*4eDsqr~AO~TV&xIB| zp{SE!c%H|B8C8eippgJ~d;tJ*LY$m!5nS+#pso<>8Oq1nQZRzB`G`4Tyu92JBu&Qf zaDD5n!mt@bv%4_iO1A|z-&0l-nwlt++dDH6m~XKo+=c~QP_DzScGUkJ=8EbfK`Eay zz)cyO89)-Gv0Q4Z`d18wyxW8u;+G}3)8K2LrZglq64L-POVw-UD7kfktMD2jSIu#t zRPpAj0wS(J3JB9!>sZ1uc0h_w&_KC?^e+HwU$IDNL;?nmY{QRM;0%^Kl#aYERlc>_ z0B0&YQnWFBE_x0)(lr6A&zkCxjZ% zSOpF7!%}eRdh2{UAnZV^J1U)^ms&NXD5q%2F+%w+e7%SA|PRdfPL;FK>9hp{W=G&K-^Wd^_{9`pzLY%l8YqhOf%Hl+nPxrQ@rF-35C z-E%sps)~V`5f6&9PPma%jcbsah0|J7rJu9q70ES!s_prbP!Qzs0Fx!tz>f|fW$c5m zOifLLh{F80WX77I2S(tPOhR|nyu{!9v=~i|q7xzqhRZVXyfH@?m#}eVI5N_e0&Oxv zR{&PxUzog%dw6*E6pOj`XWk!=PPiJ=+6P-v&r{Sa5z`c<0frx0-r`Iqi)t-Mk(nzp z2ZFIn#wuL;@r-z^&Es`yJOkVv9~G7m0k_2_qL*uw4=NZV4TOSjr_(HC^tSUz6^J8WqVPku zu_=7`BKKJoGu*!+f|vU>5T?I3Y)h9JgCYN{wYB5O5B@R$_vr44G9ru6{N)!Sd3tu2 zax^Kqc>|cqHaGU5wi>p%@Do<%h0_kBEw2=k&4UH5b3zu}cO~Ylxa4dIZhfG?>HN>5 zI}Bp+eAR%nCj%Yzj3H1EHt5(m%C(BL-GqVqsp&J({Zof(lQwyQ<}BEw6l`u5OY^}2 zB^O8PjgKM#>`TdgyLghBduo|vA8^~!Rg}@Lef+@3x{8FtE!^b8N-1}`nkgB*t|A18 zpp#t>y`xIp!z5=j%}d7uUmS_=y~wcetRYBgUJwODNGH;`EcD`ssvDAK(zIU1ORzk4 zt5$JkT|aU$8^y|#lrsfKI-?jd^C9jQb|ZwCfnIr)*){+?N2)I;)tvS9H}v|zadAtq ze~Ap?syn+`&gcyzk$l2Y@F?JLf;tX4-9fSPvB??tjY?4DaaBG;BK6l-Z#Y$$5dDUG z%_+#zfti7@mn&mX$8?N8vRaHg#^Lt(mfXHjrBJQ^KSgf37lK;Z=-B{Ajvn#g;A@qx@7SPR7w8aS`HFkpD zgby251WW)SIY}cIN1l*Doq_{Q{o;?ptN~!TS`K@fm?xbgFD&J^E`_DgtTYcnT#pQ%4-ew=LxKmXc~!{~(dPA~07_ zJ>YTR$t;JcnhdPdu>OC^VQw?IbH6(*kGm|KR*%^K84A_xjDnO`9EYgc;otqyD! zsI6lh21KeP6bG(oSrn0(HQ6h%RlnhNiyx3c=IpPjHGnNCkCh6aJjoyadrCV>crTb{ zS#%8LMpC|LKDDBKx-%9I1kiN@vyEC?SKaksy(zNTJ`xo=FH>p7xILLrNSKN#6)1-+q*Cd zXUW?yom*O3hLlxr1eQD;%M#-_7;i?SEgL_KDmHP;V5g~HO<`ZNs)#2ugrQrkGTq3a zSvRbF-0~gWy)H}cVNkW7VMalx!#w-4ZR<2_&cOQXtXS~$ByocbbRNVb>~l*{`r?97|FG$U?8YO*~>FMIi|uDjaT9lfRasTzrz$U|MVBZD>JN+aH^^#(+gT? z`k;8U5FZ+bW3(P|2Sen#P;}Q{9>SkLCUglMSyy8X;r+%ZSe_Zb!szj?6LkLWpq#H+ z#&j9p#Ts%9ven$7z$!^7J*m-{O{5P};hv3@|4o9SJbV$b$q;;kX=EV@6AIZS+gH^V zBr#nWi8D`RfqwW!x9NW(`UxZE4`HUI#=^y<(f~1mzZIEX)W-OEehevsOW*My{s4r^ z&io#FG<*M9xM#Dy7a<1I?6JE{ac{p!pM{%C(p9GAh`G?NvG}Hc`MD#2sb!G56uhpJF_JhqBUo>o)^Lk z>3`-6JdeGbZYcJ{2KT0r3Kr+=sOvS~3#romADeCWrk32Ny=q6IBIH;?%V%m6+`RrY z%GPWu-=fe^Ya$QPc$jGYZ6z_CUBk+p2Y9Le8{Yk_@xO`*i|>us?n!rAlo0M{Zg z8!=|vK_4``^a12JrCVR>s{w48o-kbmsX2y^PWB%}G15b66Xvq3Y$tta$gM{{yyEp^ z_?o9pFph;*qsd?(DvZ)o%!q2(Z1z4a7<>VJ9IqejXngU5RSTQb;qz1rUG2CUYAUmw z>Xit!9TLPDX6UNr0v<5H%gT+S{O2O2_Rb*vR7phccEg7(_Ac2>Ii3T zv)s&HG`ZB7#0%3IOxx~r#0kQdA|?9ue>LsPCM$LP9&2`Ey>nuF`y{#jgfzt<`+D7t zfn`~`7LcwCvI$#+j~9|1#XbedTy8`=cR~X<)b!~eo6^+}VCB}J-fJII*3d?XM@|(D z(#C8b<>e`&8Fl!HvII0uZW(oe0!U<~RKW{DDzF>9U;ftt`1$~`d!Sy%bAY1MvGk1u zL(t1K7|?`bhNccKLk_!PKKBL>of0`x(_YBE+0PlltQ3b$>6X0O5FX)ok7jzZc za|t{tI!8qe<`6SqlP8;?)*GH2yW?fuKiD3Hq5g-tie)3Tl#P6bgF3H|z+EmZ_Q4{U zXXbCTb&^C{eVHxC;m{~R)VTbP^$;kkaKI;+VYOYcf)?4t`R}7Ky`2^WdGdCJ;pRGGdqhVrVTe`bt8ELt|{Nd)K?B&{dyN45Vhsic;Gho z1I(OVb(RIXQ=eH?(dRP$<17|Nl^qqEG~+9~)qYI?3Co z^M9_g1%vc1!kV+lq@+6u^Nz4B813Vb3O!X*D!HpdV*Qrc1 zKh=*K)G%x;6J-m|NU0UF@4eUr*JiCig__?c6%N()*|g=LCdqL^Q1d%>NMnuSv$Eqa zewIaWz3VixF*rt)(VFxJk0o2InJ6FA*qEu}mAOU)udf0r3e9<`_<#uZ&^0|WS89kQ zYbDb_`U`Z62H0C|Aorc^RIm0Bx^mQAa3RJ46zH8KLi=kjy-PHWAB!GO^=LxmQyRg8 zwXyThNS|Fwtc#3Pd+5xHO1Q5IRIyt7n6+ktL=J_b9W3l;Z562t7#zf#DG~>tstakl z-&{za<8czU;|zwEpEYJuKI)s7en=4C@h-E?y{iKvcle}|*&($B7^K+1@#NDEPy?T6 zS=QcO!5pPiXA1*zOnAQ=erSrqnJGBuFk)Yf0-LDjIeg@+)Q|n37!El+pSmX-w)O23 z>GMEniTq%jG3l;)69nb2I$&=_Wbogrix`3SD)A8Ew?3A#9Ss8@{P=KA*9r-g7*bc+ zrVv|zOIt2sR(Wv|UigU%T5b4S^g*omn{vlQEY6(#6$+TJr}jY0D)oU%ia?emLB!ej zqrJ7lD>;j4v80!(A#O0n7rik}iDW(Sm?C?ZL;g@! z(OhtwBq1SDlsj}rYy2F*6wtj+Cp~T-gM+Fn@z~m&_pri*IKI=mU*?z`5t{^ z976ttkz7$)h*U32JuLO`3)bWIEyXGG;JBn;67)s$7aC>t1YZVEUq`>tW0MPa5sDey z>ps}w=h*01e7L@Ui-5Q6`$_yGJ?5fe=0jFOu?h&NJFTFaD}Yhi=l2h!)%^;M$xp#G zUxKRTM6r5v)4ykpzk zd?RkrC{_+cRcHC^ue{a~?9E^)#jqUH!Uw|O59H@O1^iU}x7`&=ejXeoWUqfY;l6)u zsZgSN!jcz@Gk`P}8#Y={6x$a4%v#-|F|HxdEy!OEG)3W*6>lasJ8-8S7TxJvaU{`6 zRdHY!#+4@o3|Gcc4W?Zh&eUlwJZJz7qFBZ!ErZNQZmvM zIM=OS_BV_??oR-q#>S+;dBs2+nbi?}8b9UeIhcMKQiu*$Rm5Z{Y<`N5si7#> zpS#wMG{{cy`fW>CO9b?4-58==|J+2H-3jNP5H@xl{#9}ORMdb=a=-H!5=Q&-j(bA@o$u%4!v>@0Psk~w8-oPJLA0RIH{&jg|&M+?6QW3wa0ib+p zHrDM3qED0jUGy8P@rcF5lUu3auPpq}syRn?>=vB|3ZI$ro=YOOAS(Im4?gH0bLskn z3x(sXjv_}HC>Zm$9Ly~W@BoGRD>qeM)LvY+dnl*;QUBdLKZthQ6VOVHLJ^4YEDHx! zqcQ&xC02a7mx9CsI{}4`V=p8&&{XOI5`{xkYRbL=p$jxcHibsi3a# zakVZ}PnCK${m-kZXi<7vRKxo_T?V3`FV z3QwoA$MaKsn;z*%EPaSpumAOjrL(F<#FRuUKsh%iDHZ+ra_@fpF?P(XXz>yzIA)ZkAQcv+E{f8^su!6aeI4(o)O6XL_VE>wk z1ClIHFltT7NzYp^A#iV_Lf#s55Sb=9;&vaz<#U~77pffwZ{5*NgRk;LwVHy-@`)rq z0iG`lt95_x;h45KH8&~_I>F)Hk0Le9=PMc~LAquJwyAq?61Y;;w@qZSQ?m4rQc@<* zuw#wTJzqRFa0VJt@d2N6PWF;$WsG&yDRtji?cT%VGZVf@zuK8#C(_(ru>rP?}pPC?{%YBtFW{s6GmP$ zKv=xBWuG^P%K>2vIIWSQ39N{VSE1rDk*J#pru49`^YG)P|6$p+m^42K6*XeqaV01NbvAdw)(=V4(BZZU{393~^PqaFJl%xX09mvz-p z6HAZgi}f^qDc)7-_wnG424l&aL<3M7WYt<#3X3Z@`O9*woBmrLriZCt?u+Yv4UBuI z*yVb@kcX4m~tW*|H^TNkdWB*am4{Woe%D`@Mpn}U5f9c23QfOXh z2N)gMrm~M*x;wp`w_l`!5FlOR1 zh#cG>>K2o{5PM*kB=!Lmmujx4i$oNa**&HTcUGc8RItk*`vg|h^w150E=<_NUH;p4 zQ~Jxbbs#ZJpKY%ujQf9a7{f17e0>2+CW#gh!r+o+WW-2( zUzKg%i91*M?kw3~fuTs41R1rfod$)--0?grXK{Zg_!S_PT68*c>w?wo*m7flE4Q)e z6XZB3>KHWogBr7g%ws8`n*^UU?<=+ME2SlX ztsUJznY=RWa)K>Ed{Pe#DO>YfmcY`962;>niNePeoPaAzyOa$@6r^3Zn#KHgf5zu7 z8;_xvM%|DY{W{5W?(R6EM^dd_zySLIo^t3ln5v3Uqxu2+RzamcO;}0#ohWu*gcVR~#Yj!Pm0E-{ zw}gk(Q3Wr|k$pE~iTi2i(xs5XX;Y}^EoK^qOod5ut&6sSLO?)N7^+fzdf*`DbD;97 z;uEd8LLIL68ViEho?UKLL?19| z_@vnPnxvtSTlS(Z61R~=DCe?BQZYJIYB2oj4UAW0Ta?Dqj{ zwKd4Tlw>&r5wtfU$rWaedPCs+CA3#IM6~cAIZN>^ zSaMW>aR4T3n_1*BrLuteu>Or!!GUevewGvIaF$vQZboeVR+KE1@n_NgB~_$!;zQXe zN}tD9 zlmQhBLU_wH@+CxQWb%}HdOSV7BZ*m_wlDEmzIg8=Ez!3M(+J$Ee@NKk{x8qla3br-0eS8OoO zWwienoPQDi;`bctRNSXo9EThOy_#u=KA-tD>Wx}$+zyo-3T$H@cN_`2^?xN)dM{cAz9aXES8D-#qmga~pi<>Su+s(>Ko@ zw^(G>$#V`6cFbq~9*~dY&?8ENY_I)YOFDwFQxZmSt(l4z1i*_JTa@^ON0_z-dT7FUs&| z_N10nAcjjHw#fzZtT*17kby)O6M7|-T`3^|`BBxJTfM&MK`W&(*Mff9nB?N|nkx3N zmF3+pO89|x}2Apq`moKo91zz4h_e9G&BahJggq1)icJ5 zr09}p4Fm$8P_eACMw(5{I$|6?(Trvu%B~RZbx9_4q2v)A!99I)&QazE1$S}Gu!NTx z#-;h_NqWqh`C5ZPU3%IQLl=NWNa=NBT;&-}4Z4F(^n)4tzTDdN0qZQ5H4%_V@@%^K z^0?(?fR+U%#D2Rx{BCPyosOPURlC3&;aMOCrg2h!EN%bs7|Bt=GeNqnes*^%1yY_Ul%t1Vx44}ctWLS`8O)!_?Yt0DP*uKSVAfKAd1&4OWOq= zzvS2nI5P=(6LbU}uPB!a7`X+iB3Qv}d%^{=798!}$E zM0rH-5ktaOzM;-0Ur7V}m%wh#N|MooUPLh=YtgJcWSTA`B zo%@3ytfE2C<V8tdyXdZqZ|?D2h+AR9FX{RgQUa3yVPM z3+w+|9dWuGPy)hT=Yt1Yb;dNH`~uEyzS?c`UIPGUQ30xrMpNp~WAiSPTUv%H3HP*o zej`zptL4HE-XpLYRhO7#%QDQ)VdPHPn z8O?zVGU~J$27FBq8549f4EMEK5W_z3@(r=Dfj^VFu7&4)kdNsVX! z_17l>oHuc}ti$c%hQKwsgRAo15SyNf&gvT3^763azA{(S@BJEf2%2vuKj?g~VWR^( zB>yvWU_T?LE52O2kW7JjE{1&(fCACF`BtYRwv}D4KZ_|Ov;V)0*nOSBKqW|K24rq} z(g0OS;C)XW{0KspA?e(aRN-YLP*#;V9vwqZ>l4*=5=#8lv4@l_WlU)%-0Af)e{oNH zKU~Rb5pHF||NJY9sKD;(N?XMkXI(x@Sd5SPoLY_YIR|x8j(fHj+6x`a(4w~m{~zuz zs9hI~T}IN$8yQJS>7F!-oXMp87}W7GMG-jSWea$57x+8&=BMYEox< zR>wg8(3SFGsZ>ZNz3=SHGy8o-!?cY|Sm?=5`3{qQ7)=XTNWiPnuSIop2xVJO-Vja7 z?V}nkS{u=PG~AmLHx;xWqCb0bf$7pF_O7Du6=x4(J7eT_KUSV6zcFvP{A;NR#}G|B zn$A6cmU#V@)=D&TI-L|(tdPfIF?d}z{d(Lv2c5B@w<1TLaMv|y+uBPK@zg9YV1#2r(Jr5LWc5P+NE=9+2gf1ACHN`NK*`JL4l@T^iSwP;(H^0pj`sfvf7#5 z0chly3#c=@ZomI&K&?KaKvYkCi9?1ie6-E!Vj56@vrEfIN3DBI^vTzSJvf))thygn zMdoPG&@!jZwIg2I6`MyW&SdBjBaC#gr#1Xql}jZ!u&J110BzVy z7R{(U`oqWOV}7+EtD=186Lr)o8;i53@EeES91Bv|e;L7zOtD7*^e0h8jMh1f9@mitGipu3V5JF;s>{)#C-_lpTuSfCVv8)K=f z!|h1#>vtTK#SLkBQ3jA$nmpDKEY7k4ETX}vp>pvjokwACUVdg{vbPU`-#M9*cf!4f zLX<7HioDLg4>-Jc*QioEKYIT1p%;0L+vblFcab~D8;b1d{E2rFqoyC|fiMuPCG+Bz3)9p(XQ}7PARhcs? zBcsKWXHkxex>yMDh+=@Dom=&XZX1g+3FT^q00ZLzTa?UaRb7sZ-O7lsindi5-^ zXYCiTOo*3~M~vVqW>NwQq!67eXK4s&cw<>k)BO|cY4X7Sa0=ui0rWirYcPv5?Y+Z~ zC8FVKBUXcV(#xRYqSp)&N8fR;(Tb1bks-)zgVd_9V1rB+DH~Mwm0VS6{qz^G6uS=X zb=!<~6CEz=;EqFZ5%kAlcd{uLX$Mnj#ihN+>asr5y?QsXC+Qf?c=1h`c+-+}#G zrr>V=zi0Y1cS1$N8jqqy_XChSB^AVPhm!J#1WG8Ps)`V!L`M>Q2AB(Y3`Cp+C*nmr z6o}(>>jxvC`T%P84K<2K_W&cJaVGui6F z4V*`i8}vD5H^y;XMEe;D(eMkvF$V!nV@E5o8S2C@9`nb%H8d zWBO#boMAHu!KD|EK@q1)4pUfNMYvv*5C~kip@?9j*JWoc44P-uu(WK%-(fP$Wn{?p zJ5D52^ZI{Rz^{=;EZ%+%zXzF-MJ*^;k0fIhIU{@lX*p*^6Q*jfKk8bJ*d;Z5yMo z4`C!Or>n=P7)A`=zE9bS=ZR$Ng-^Y``}iB>E>V=cUX-FMLUN-qR{H{tZYM;9IFExp z=x>!a> zNhZ(*>)uJ)`%5lr+NMj^680f015iv2;PC#&Zs}}P_P_vQ>&LQ8tzkscc1CK=Jo#pE z4lzb~XYo{#O3tFl6H$QrPE+l`G>ys9i48sj*XC5OL-5AIO%MYB(DQI%Aq4}cAqfq^ zA;MC;Ze{|g^y!=hl+?_+Sw-G-aW$d;_F1C~K>H`Eq1k1;oD$iJAIT&FcIGb~XjxJi z0CZTE8eu!D+SERY4Akjf%N2P{&IM1iN;wX$tvv`SYT^R#q36%|l0_n@n0dnt$}lgnWQZ5P>lKsK5*U6Ugzy4pKoR?F)yW^sWAM2e=76eolBS_*ENG>Ks zDM3&^+N)vp|0V8pYu#QLV9&cX8FeP+OQV0|F%ImDGc%TV7j8sv{ROz`UP-#-_VO_i?$`jjFCeAOL__(STS>CU;PVYj5zQME1j4iU z@p+C6Gb_l_H{=z0^&C<_Z{cED?0KNEi|K7XYlhdx1q5o*-skWV!i=_pk7-P4(+bq3 z#v&kwG~tVO`l}f1#EoUQ_{xv0vv+|bt1dieFuOyk*94~n?n)~r*y(V*wPw^9v(p~? zDMo3l!xanEERzoC;odh0h8+b|4O*8BA$=7Lr)jR>nROEKAZuI`KH9p|4P#sUbyk@1QiM{{!`fHLNq#)} zVsUI>?%p4=0Y*xT5{R?btn32oy82cC$2Ut!>RQ)6FM7n)CQ>LZnRmn~YXR20szj0& zIYdHq=4(7jJ9651_5K<{5&N~Knbt>n-CD6i3lL_ z$XXphiGbsQk~&!W7$`k&jKPfQY^wwcDxJp#mI=n4AF?%^)b)h?OXjyuD071ZN*GZO zl@x4HU`v$zGa?!2Mw;BZKvD#H%V5QPw)0^yGn%@afU_prfy~{v9xcK-8*v4a?X7W6drQSUZC%x1Yf|OIR!EqF>;1wqhaJ z6B@GH|HSG91Z}2>rEVwF0J`g*$S#BXxz1IUd%$Qz$+>-J<&=zmwu*9=6HFQ_1j2hY zZ88OpUOw)%e*A|HN`AWt3*s0s_*KLooPZmpuQ}E9H4QUOQh9%tW1<<92bTgZ9gCTO zqFXLTbcbc0`xUsFh@A;yC>M}=z??WP7?TN}fhdxOu^iAva%#7^&gqf}q`~}^Da&ce zpB@NeBxhy;fU_PA_TDG%!aKk?)5o!U(n<@#XC=1TM-|7s95ZT?+J3$0TGGlV# zbX{L-SBg~m?thz2IvMBvgkbT#xENi}4J|{}f#Zv)`R85%7A&$PypC9#+fG4T|2zS_-I-M#5OnRNqDc76G4v3k?WNJO;toW71aEg-o!iI1ssbV zFU1$QjP%C0Tlp2~{TRxezIFLZbb3#?X72%2*3cSs8$C&--1|MokadxgGRK{-x)x&| z0)(&9a~m11lB9XifwAz@LuV#|C2QcJ0UM1O)nK4S>0O8*yOaxcHG<#KTXdn1tMAmY zQq)#-Ju?7#ip0%$gt3{$JTdDm#@q^9tIZUv-8@8_fgzacz`}qk3gb8Z96Y^6dgj+_ zZc*QRc^*lt@l2?bEIzFEwCiR+y2;tVh);NTsE_K=Yf&*%ZHPFiMFg#skhMXhwaF+# z6nKD$KuGRN$41;pc z1HgF>(1CYw)(?y#yn5gcNQsuZ=&HBON*78WV%Qvx^{yijt^K-6)aj#Jy56UZbE|C*;}EjGPDL*R@%}hpeB2 zVXN>QqljUrViX*9Vi$0TJv{M<#2&Gz$;f`$-Y)5jws2Z_il>+(j%2}wCHqWN9sn4w zC$_i0^_KZBzW`!w??R2{TyyU%%`kT*77+R&7*?7)^tI96w_EJYzX34C9GZI6i-4}o zX9Y6JDrM&>i0k^PGJSYJkM2P$pGMCKY#y}l{9zv#ahCP_jj>pTBr+bId|!h#K;m;L zAswgUn+TO`2AVzTtcq}-RNS`3O+jI;1~8g-v6{4l0Q@7DgzBtMPE4fS8a7276Vr51 z2HEpCddq6q3R;MpBg_pZgbN-f$@}MqC+^plv|t-WW>YLBb2OZ-gP7W7NXVgw941*M zu@U@d7N!HR?cg?~RjOs0Q(MnAVF@>oCbsOFr=4RJv0-v<9Q2D&c@w(gla9a0Z~E<>X(7&fY~t3~L~ zTjPH73|iazbAfj=$!S0@W_}&_B08N$g9o8~<)29b{Y}CTQbd;Yy2k)4@PgoxCJO+& znprFH?F2t_5PU}$2&?F6*rLhQwdqyC3!KS;RX&CsmV02Db$6rJ5IMfV9$ z$LmCF*y+3kk<=K!GX7k?)l^%G)Ity#`rCpNd<2AUgYu0(_M=XDr<Xfs3>m}HCwX6qx%OB^%aW(#-jufqq8ja0QHL0Jb@NzOr!@KG^OVwYwjf z3Fp?^T-^JUlQw@{pp0N&UOF;7F7tmxoe{1T$Rb>egKC-v=+@Z$(#949ZAZ%tvb(Ll zR@367Ex9YqVQ}Iwx-Jf`F$*bn-42lx~Z!L zRhVC;TH*IFTxys^h#&mya^BEf)M6m!un1W4+!z{Cm!RB)hsP$)%SoxE*w^$(YHu$m z#g5V5vAoGajqWG?&z5nRrI7Q!^A+6@svH7jw-@KV31830X??LZI-H30geK9*i+66M z+eK7&(`z;I*R}^h8a-&UjRgl=R&OFj0+=I?!kmj2V%`_JY!r?QT)kCmD^>bg7oagNT@IY~V!QfKzdgX3i5L5bsy_|~x7{j;MB?$^B1W5W%u&cZVh zz3U04!sbX6)b0bN#kJ55u=0?W6{@%baG?(0pP{aN4$^mM9jgp>K(WkpJ%BvJDHY90 zN5PB{^FF5!&D}fQm`-e}tIWL%;-qSFB1(zRe%E>(2fn*u7*+v@n`&hknnT0(H{@Kw zI@=)nyM+{AG^8kw4%~5&W*_ie{NzOnM?2~W5{QN6x|cHlGuid5v_@dJcm|Q}bItQt zb&?R*UI&2`Y|^5in+TTdR&*~*OKz!SAoIo!ycbOJ+KN!Sx#J&w?|m2sxUzL`q`%VE9i1y5LkEc}7YAL!7aCsYDDWp)|y$UU8B8*)3lj zsc2kCroXPg!Y|uCUAsU)0*_MzgOLTAkr;Sv-46GOE2S#UQ9Ge<#EY7a|GW}J*aWA8 zDLU_##JY*Sf{%jMZOCnzVjpP@@{HOGML#tXS;O(Y~5hD_>_x<{8DKDT|;QoP-!t`N=T&&Wi3bdFg#?GCb5HcSKFI#s7 zGD)K+KBu+=2SSW8Lrd8?4o-48W)P@VFQ!Zzb+Z{I0e-!yUx9G>H)#!2~ z4dRw}cnQc7A*li#OTcI&eH;@%hNScntG!6i93j3TCoG#430a#?)>M9a;SpKrgRwgcK7ZpZk4{7_(5hr_Xbt zk{UIbB+5NbnQlE~8gFuKkFOR8JZ}X0ugIH09x))WzVIGz40Nrh78#L2ys;q>p`rIg zJu`lG2A|uaPH%EY6&bg2pg|>w-Wc_f=w>;vBFF{b+da*i8ubpZSl(z^If{{-Bx~i3 z=}RwlQ9X_kWm_CJvgMBlpP~M@# zva7A|w~OLC4_SlSQ(DLpS`Cc+^*1L3b+~fID;b11k(U#!z1-cCM=>JA=PqILpxP*g z(pB}Z6mPk^Fp^EMd$dc7AStikZ8Y?))nUjQRlG_ucylK|C^L;VPI??9Jvhn1DV)F~ z3CG+ZtzmmX?I|Dr97Vali!pp|GV>9vUxSLFV7wV%Y;GZEe{+^wh6XAPU$FDFs%~-s zt%S9q`4SYDox#(yB1^ZX1_X9@6LXqAfq;JlscxB7-p^fqWYwC=CFeBI>`f5 zRy+gxG|302)&oWo1YTpn9cWAnVDUj-2*JnFd39LL45oj8{I3yS&v|Wkz^{BBh zSzB#!b@tU3FUB3_N0Up+P7LV#58(Y*A{0LzBa=m;?q}9}scnV=8&$N{Q?S}bt zR%_fUk^hYnGqh^rT&Zw0%~rq{WUnP=Z**lDf`>9)rprR!9mwTSsyLkpemtM&={sIj z)C6&vTfdV)yap%cBoe_vkj4M;IRk<%r5M*EzUo;0x7LP)Cq9on_kE-W0+WlG^s-0z zkT1I)BAm=YgMD{Zv6(Sv5pgSyBL+b`NR#~;q2Qf>z~2PLO7@n@tW&H~n+M$rU3E?F zaXmvyP2K(6!e-JPYlN+tBE`R8`OPo3tM89z4#chfzG+ZD)t539_I{VNb$y#IhfhqT ze<$mh`8hysuM_i?BEPYVWwAH2CT2NsX^2Gbva=ordTM?sbY}tR)GNe^!w8__3M6@C zBzw4i)=%7p4TP>LOGSdQ55pu(imNH8An=&}NcPt&6M8TF;_me>e-Mm(N@OnAGC)C| zSn2m@$%5D1WQ^IZVf}o$<|wRVD4}I}K^x)UrsuICy>XM!;Xd8+^GOUJQ&~Z&ul@Rm z%&8`T$mMs~9=<9*e5W)qhCmGRg5j|R#EhKWw*P zrJAqm&1Nkzr4Fkv$p_dCB#-o20~a6%71e%o$!u+f`OlA%gaO2m;p;)9 zhRojFZj7aL*I#}4NLS9ZHhp@Q=RJ9zPXh%Wr`Bl~0o@1smwMWjboc>(w&yWhj!}QR_DCTm4V*$E7eQLkeO#Cm8K9Pd7ps)?{ zG-XVZMN@k@HkEsZ#2S81Nl5CQe?6dw`hK)qzjDOgg?KfL0EPR6wu^|ntC*f`kNVI~ z`(+E{tkaE7C=wg_PgAa%s)@20ppQZWpls9G_)Q6|>}wAO2`(@r+E%z7sCUZFWQVr|;7+c1)%ZLkLRD$nm^imq z`Q_KCx!OfMIQ6WL>KR$o3>~7ul>|fvNIlvRT(*O+T5if=Q9%KLU15$LPE*;@=zPtd zFibQkaMCrvraE!-Et4ARshx&>V;%=uE=&ZXrbVa*b|jHOfWaKd>Xh!`LJ^%|EB>89;M5GwmqzPLd_?NU z)nW+Nh{EQAo>(>l_qil`MAZ?o#npKZ|7l^JAg%*SS127hTTi*$Y5Xa7c#I~eRaV5c z#fOE@i?aov2M9PvB;uRA91fUrs*{03c1FtwXCg&yc*!p+b-7VCbHDtLf7wXQG*B?E zEq<6Ym@apx@|`C-p~`dk-P_tof z3{1}bP^E(b!Zv-!eNYySwhG5J`ckmNY@2~)INFzMu-u7JS+@YBlNrT+$`*S=rd?Yu zb>uvt)o^GA9f4{f;aCf zib3lQdx#zQPLtE&TQkxg?{Om@%YCQ$HFHy!j#w<|ZQo3ui5t!0=&j zK#fG4*{HS|=>jNW8;UGH-E|hgl)Lm#I@numU!yYVJEN*=*uw`hvpos|UD(#fQUyK$ z@CKak+zYjAn6Qn-Y@BPCwI=t!{wJpURv$@KDPj6ajF9cB&1}8fkY%%y{Uo>cb09}u zjGxcGAYumbxds+|S!GqJfW}WyDNK&L5- zi6OKsfq9u7aw#0mQ-MGk;jnVIc3G!`lW{s`?pzCgWPa!*&kBnlom~x!*rard_Ug_i z1a9xFi{LRTGfqFvkjh}mE`i4s!glBPj?dG%@fPSYB8|71hlQ%t0?ws(ytOp5?Xbeu zt)?=LgH{-%i(z^iL||Vnfe%ObKsMIysV2~xr5>E~^Xw-e!V^rcraV2y72qU6Q4t;n z;;+*U)wE@*9WtCe;X-N6F8n2P)i}g4kL*zqL1rNC%I-(d+>!DEwVyM5ceuv@uf zqp((KEX}+O^Whcz3YA$$x?4X8C}cSbB=WYCHYgoMFEH*=0?;SU_unk`BF*A+k7lQ( z$n~BlR{7cC*{AE{ezdv)3{F&8-7@b~?Bo(~EkgJ|sgqO1O2X8pjAxleA~nSnY(~B? zf|2Yox-YA&j(=2UgD;mjn!8SN=7|9iYqQHsZP5&smf_Ywyt}6kCe7#k_aeeGgx9Ed z6R=3s0z19y=dv`%3*}}@{WpU4NO6#wo}xAFO&NG75ui#X;1-GgO_Tr-Qa+GWe&{Rd zoFsBB>C)uV>VA)Y6%@Hr*uyAR#!1w{dJBGvd9N3=xnw(U=%(;?gA`B*8=jIo$F-4( zT3s}}#Jh7egk(|dJv9$Pn9|*H-(dv2cKk(SsxYui9@5G+TRQ(`^Wq>vjksF_wpn$pywO6R&>6rS|1`>Yv66!#_^zeH zQWTk8MkoSno0un(YMqO?k@-*x$14eKAsu`A_YkWSEunMY+JKDR6l8yboiE$lV|;BLk|;pBB9inWgZcRc!o? zREr-f5t_49aVOk3WL2+i0&B|QTmLjNgjxCCW2p3eVYB%V0{sJz_;Daaxd|KZw}Y|y z(w^^_g85OrZ>b86{8Euk^yzk@QCf)*{}CxV3ViRGkD|qTTo2`t->F%kN9B`E6|bTt zPLU;LL<5gj$Yz*Us(QkDMqVUIaEwn&@F`%Xo!EH0W(k6$wazEBD&<`)P6HA+alOfa z>v+IO&L6691&{=(=R$zIvg%6Soh@W2#4-YD8bvf7@Sp>IYQ8?}lF|$T>KGeTo5?+7 za-qeq3Sfl{F%&9F;D_xq9=6Hv;Dl;%0(3k^oFoK%f6fFG!X;4q!kH~T!a21w(E)DX zqSAj^zxK_j+w;Gd903imySz-RXiS`G|Ldm~8Gok2=ihGL6$T5@{qtjH0CgRp=0`Zg z&Z2O^eu$U7fP@TA*@%iTs~e7UmTj7L*p^FwgiY5{?f77YH;}Y}HA^u+GQP)^z)yAq z5u>HS&_Pberm)TV=kR^Aff2CCsYy_0b6_=sIt4cOP}5EiHs z3?XN`1S*6l>QSoa*$f3sE%Kz&^%MtDujh#W5i!>J19=6ICV~r|n)i`$l)Q_=Cnf`cN|pLvjAa zMo1qw10h~9ILXu@(L}3j6uSiX`Yxze?kgk~V+8JZU6 zmx9Y-QpsosH6+E09f5G(&SJ$xU0bLA{HCQeZZ691xcohGaAF{XlZ1f)PD-`7v$G^4 zSlZ?=&BewBul^PQ1_V@74J!@_T#~iW2n~d+0^feADpnUGt2p5SDeOE66%Xm;2I}!C zMqij4%gs22;`Qv9QFF*_Spc31jf=R_2!>c`!<~2+isS6yxy6O5rAx?Kd^t-PHf4?X zyYxXtb#MTQ)v!C7z_Sl5xRIKwTfP-Ra#L0p5~A`_c#(JS`;3Z(KW*rj?YeVTB80=T z?0u1sAJVPU7vLnX=vxCuu1T3fSn={^`mnd@E?HXY?;-y)hG$Og0#yich!W*WwkXV{ z1u&e!a_-7EVmC@M672Zi>vT%(@!yy`o%j)y@6~Ymp+<>$1K#;PJ{_M1)gPZYmGqUu z@}NX2E@pjtb4O8Dz+%|6@y{c8e(QY>FP)5jAQ2wL2W`nnnUQ6p)d74C#DM1-m!0-| zPILOkN`P;FpBf;*mT{d-23EAxEq+A?hxP>vGBeA%+zDLE%=)L z56D5XAq@DtCg&)@>Or>|C6!!DmeE@X+E~|l30l_1Yj0%AaN2v~>;-*T8++gO@Lsrh z2dGFG?F$Pj*iQEtFl2jI3>)_32?Qt|Unti~F*yKqWA@WY(BMN)~>iDUS^55G@( zxB}e3dykLMh5EDvoO$HynB!N6FzUTppaguqIb6nv zRTa!h`-4@AUFxPK?@jQE3WQon)zVg(Nb}ANs=8=XXTlx#YbEYfaTh@|1(d;d5r z1-K5D1&!xh$_)VP9Lm3)a7Zr74#*MFWW$dJ6^^xO{6Wmm7oazhkcCqP(E=@vABdO_;>Trfe`_7P@vv_;o_2q%n3pfjfb&sc-x+kZuU7s?p@ z|JVhdLb?q~!xt3ETEQaCHM6v6$w3jP>W(Rl`;(2|0a+;GlfBd`jBLkVk`sNJ!+~ig z!B?rkvR2i_3}+cq1D)*BL;P`K72~~%K>ZO~E&Q${PEEdmphx{gef3Fogs!m=k`p0r zP~w3lWa&4*-^ws0Nu_?025$3P_V6Kxb-e#hbCHAx@~<`yn`~p}M=)(qk4!}-EQMH^ z@f1($1-dAj@P)=Y9fR7l+Gd{Gt~r(B4dcLm>>#Mid$-FClWKjyD3aDQ7LPy*e|jQw z19|$Z9Er9^U=!rNyxX(e;sxN>6bz@D8|)(=$QTxmSoKvTUKqqM>tcAJ;N-N3KWph5 zAt>{n^6ph@nR!-;YY%j&4l>Sr)8E|-zu{FtV@gE#Ziq(1Lqfgito4sssN+^ec_Tss zI)=}}r-B0=0Opv@(B0!%u*Wo%rp`l<&Rdi}yx9yAN!h+Tu8r~avCGWlTtOI@c8UK- z#kx-Nf>%Q85@5DRAv1vF!NdUR!nevTWMuY{x{f+7I^~>wQ z59C0RrJz+F)VZH9&rD8=*;;y&6ooE_NlNR)8GIzT@+?_r4+ZgVq)zl z(M9pZ&d4OYQa7khEXvY#&3wgTFYs>oK>wwGK)#z-bP=;-Wl;gGlSyY`;~vXppHL%_ zNiQAU?AoI{J|q%Tt)eGc0X;G)+y-v}Wg*`Dxk>b;bZ_{y{IJ$t$b8!l;8JA$gjr>X z*C(Lyv5LQdzI0L-nVd%T(u5(IvbZRslxI+kEFjhf zZNXYXdYmi-Bf5pA)du}PLr60DmMg+G#z#mQpOboB17$n$zk#r1J8+LQvE~08kIAYu zafC3rhwUAaDlNj_8yqQ90ov4!1qRbb$gwi`tr!5Ap6Q%=AZHmIlnRqUx1i(I zT!}E9NJas2T+^CwtP#`s=*C}Q1>oM*soH!Li)}}bJ4F?7IFq6?Qu)vuGC&NPy0NpV zTsI`wkXH8<(u8yqr*`g!CzSgog+G)mf0=>e`Wdajs?2)jugptWyLS~2f_|beEvIb7 zmwdY`F}H_p`p94=`Ri$5*mui+k=Q`M`^q43WDW~nhBaaE4=BH?8(#4>QH|Fgtp;!J z{sUUiI%ui{Gh7#nX!v4{1Y#>CK}ti`)r87~dZunlAzuXa%qCu!(y70gN`Nrr+`q>! z-TApzU3sZO66bsuJOk25h@c<~-y3!#iHLxG`~DJxQDUh_n&B`HWs{cLP^W6S$NDmL zX4&~zop2rM6nBOTOAu>jJjKUv1k{R0CF7x3hGqOw_)c!do1@4atvh*uvQ7||Ix9QQ zfjy5HVq5RnGaO+I=ZUJtNBV@7(a6w>-?8xBN(|yGU9>?zO%ik^CLBQ$kE&9zv&-bX zk5+j+s?s8CQSi}V2A(itEfawM6*dCGF!;L5^zlP_M~9;$MEZ{?eeXAGAt7Uu{z1^9 zD7!*SEK7Nh-)fE%^27%gZ0|xd;X9RX}S%%&x?rMrvj9O1d@07 zICOR)LZLeY)(d{uOtCO&>E#UHxH*{JMLnX1uX@K@l`?3p!0kt`lIuZNo@GHmUmLJ< zkmVLnW!u!3@0?0c7@5Yfx#IC}W^lLMn~)}%kF9EY(9~hK^R&4Bls%oLbjpp00+(e$ z1v#QHYBgUuv2v`lBX^|fm4kcq!6^o6bv|C+?VBwbO)CtsS}M^$8C`g)Zjm?je`dQ? z>hRA1Vg9;~fu}I}gxga+^ZAoB5!NVyenS|Iw2B2zL(sR?lI%rR`o#}9`&aG)#khzv z!H@-9V8PH{w`lT+KK^ZVCR1JUkMOe)#}Ohr2gXv_hxPr5bYUl-$P)^Xjt{p|_Nf zDU+YLO%;m3Xmvgc<#>)q098E7G9}}JTPzq=q%Io8bJFtVq}Zvxw@jjmB)gWy+1rAE zbr+6zTXOLZ78seG!#N|+{HH-mq}sA41CTt}(Zwf=BOE~t$wfzg8PE$|1ar$@#Fy6& z*Rh=i_M7be_F&zCdLDF|@utf479bzZ*@ zlIk;=j-#ictTybgRAq!Xo$g@>&f+zyz*NVftVVfs)6~gzD=Ntu;VCDr*TZslnYmBG z*T_Z$5(Rf_2h>|8QGu(nf#F&XmX1&W>S?arsy3$hyN{v+7%JwjjO%Jc7u)ehE6-BiI54LoE z-Wg{~6ZN6d_!6k$bAouTgqDQ1nuqoRH-2?+2CdA&As*1ATW<(+vVuv*kLa#w?+p=;JvGqh`oFL&Yrrs_IF z3U-Saqq+PaUsYK@*Ml%CR`=(pU5_Ajz#YVyo>|x|T3Tg>0koH`n}{Ema9}8VH@l&u ztksBDU6yP7tsi?CqN{4?YdaEqR1@WSZy$)u`16s;FWI?btfiadB{5PvBm=Z(0t%Fk zQeHq%I!*_g5Z4q=PxXsadR6#ve^kw2iaI8kAk~s@^tAw}@ieo2nvgBdE0c>HIFMt) z{4ub>P&0;g(f3w0K!KIuKapX!ykM8eq>=uVui_t(kdU@_w=LzCQl^vwLj}+TF$Gc@ zh_D3V3n2-@BH;+SuY@89iG)MK5QHvtUkO|2z7h%vSqMSUeWm+K_<=A;xIzddR3ZEk zrqF$*`%3qf?kgb*;R!K%Z(|+?PV}$w#dR*+a`)~SV~m?*AU8v%%#Z`c)d)1<;&Y90<&MgrVawPtw zg`CJ`DDoqI#95A#fzFt|e`d8s@7Z~n#^fE-b2mA!Ev1yQ>p24N_#AKCX!RWAx<ep#2JIn12tsjz8_=E<@f!b!atIn+zG^gvrnl z4^O;_(bCL`kf9+drQ}jzKN|R4=XLHeUhFaaYm68%#z>1{x_Be@*yp33XCv5*oR$a; zyK+X*e_|}kt58sEBhM{ykclHs$15))VH7VGRx8|AL#W@l=yLIIaj z%DIBBPUkkynx22;(|6M=N5lMIM>R?n(82nkuk4S8bWrw;;1Xb%f0!Q%h(IZ&Tawzw zGu|)jZmVJL>Rdhz^SAZ8WipvO*j%wc0K7#Hj6Tn_{1rKCTqwbfc{S1|~sMl!C#wcFo?zi^nKAVu295}7OOA)+U< zHkx9)ro;UBAh&;r7jY)Hi-rKneAeB5bh};Yw(KvrpJPz`aT^LNY#6NsQNw{q6e-+( zH*)3nJI#3*2@8|kAH~u|`CQbWJ{qV3+|z#_jgySR1otzlp7-5H!!vbPmfVhs+g-t; z2IX=~)W+gO3L9Xs-j#WmT0ugIS`yo{St}`YP(9hq6G}i)!-^^exv2i0@M5al<=4tz zFFXN6&GnBvMqrE|et{EBT&GgSNfj>F-&Y$P5xQPqCAcx1V1eek-*%5P=;(K}%GGL{ zQ*PT!*=m!KUpiP{-gEx;vQIKf81P-*ZLzDQ+>Y{8EfzSHV^fe4O>p$L%-9jGt^5+ax=;s_KXl@rpH z)q~#>R~FVxL$e&4+m@SdL`b>x2UJWz>{Y|TBHLX?LUM9twuT%l7D=_zU{khM-`S6b z>?Iu`%w{=o%F%EKy1Qw-DKnU!TsNXl!@hPOtJD>KE*U< zDYfktBUYnyu}U*C)!3|D+-$7bk~0{d47@A^N1g7;5q12zxN@*nrE@sw@3};fdCf7b zAB^qtRe5IuATYq~PynF09g4xU!0&fE6aa3A;w-mAF%!2#aSLw8-{*Cv6IbbJo2QeM zr&Em4zy7+rh>mk)cIBeu%A-w`Qbs9djf^ytd1gD3QifJll_`$d#%N-R>ZCly$ozfG z-l;>$=s6gxlqSo}#mHP$RA!s0ani66SY=I&Ha>C{BfDhw##M~W@&(2iql_`$oPJnv zv9hUgugtAN?Z$87O^&+#lrfnabz-Y(rI3&i%MOaO*{oKp&1SRNY}T_HEkc#@7;h#j z%2{7C{KGR`bt-w)>X~ZAXJ$T*;M7G=dMu^1A)wow|NsC0v#w$mdCK-^{mvAVuh?p3 zx5-r@A)#8WCL|;zBqSs>+d>e9ZkQHLJ`r5`+j>`Tz1CJi-a$W=gxAz{_OV%PHk-ws zhhqyZC)4_(wa76RWq+MD9Xg!Hg^qJ%_9i3>orF1rO~N5Mg902*(Akhlc*A%4PM!@l zsJI(Xdd|b)65G$Al8}aQhEOP!Axsh?;qO>CC(oNnI$6(n)iq$R%X;(N#mrJl%H1{O z+DO#l4=RC&2smz-Ja_S{>pXX{_O2u}-01F(9a~EIolu^;xZB?Fu_2|DQvOY; zWM*hQcfG#_I1sn_9oRl4gMwHc6a=*4;2F^L_i^20jNS2XSL3;hWy8B`*NlVRe{F0$ zo6f}9*x1{yFEI(`M!3hP85W!)m#pxtVFb@NVP`%US)p;S<9cgLnAn zoO4cAO{>*fy?F8B1_uX6wqQ7nhB0wI7XJjIAIFRVdY(REj8RG{qm(kfXKCil{5Ye` zb>~;!;di+_S7+i}E|<&YYW`E)?wqc;&FJ!gicCr=rA$gGrS~F69hONcrDRP{#>~u{ z3+kdx*FPERDoAF%Ad@ANsYt_=hj#5e~J!@rBN-0yGjG38Lo{X89WxN?r zCZ&{;#;aMfZK~mH>PjZ1l+uMvN-5>dWXV>1;W0Dgcr{BNrIb>_@R%$2Y|M08H<4yU!8-`E&fBV?1sAz*NP81c@?_v&Co%&tM zgBnq%(p0y8bcL={U%IM}SPc+vxI71A@J@Z4By7xs8Uwg7S3c_xfPZ{dV-C`nU$tG^ znHU?@7%ir?kP$i<<3`$~Xoe#C-8Nq!1$St$Gi(4x*g=BxNH6Ar^F$r4LlXe{5l6y1 zVGOPXpn7%{dp4mQ6iA=1STtS75iL6yW4sgJ1{=Q>=~ctjvkWhvuRAJ9ZvLMccNbjWfk|>c%(4T7rYyb1oh?z^Jnc`Ej@Az=QOF z+XUJ`-q{|<3ftd6&4css;NUN@{S8F|)mW>w95)BzuRqeDL=Fy7w1E*tLN0Kk=mnP? znIyXPJLx&vzcPE6TRrI3XAg2~E8!oXUq1)`_*ag*N4!Iu z)_@5#UoU)OPZR(8vDo7Q`QLxP{&=AsKRNL1~34l!8=6Y{8SeQbV zUPem#@dZnmBd~axLtx1=myYUehF}LFC@(t%rM}n>%;v2!)mLxI#&rOR}T+T<%$kERG1R_#|FBHQVXeF z(Shm3gNyk@`HA_^jD9#S=0h|3c^Nq{9v&GX$WvP$PHn9$PHn9$PS?yqGi*kcN_{dk z&iP&HqY(@gLls68MUes(RPlvM3|>B9Ll+=YW=0<*(W8@C`C@|-P!AIbK!PJzfNI_Z z1pI)73_v#D1BMbHKqj!L0P11$BEb#dU-RPO2JrW<_1d5+9z0IoH}lbapZ!nfztn%T z?{qqyXl7J1uTsrUJl^~1NpK#PeIM7pWPM54VgDbr_St?PP!aptI6e3M_mX{Y-^cB2 z*KrfEti^>R*TrQmE)d<$z4q(Y)%UY+UotjoBdV9o3x!IhQqQSRl^}C^)hE9N@R%`v z=Vyaw-K$)EXIv~Bo{Y7C)U#};e&&5#AJ=;yx1(MSgxbpwmC#a{(`TPJkBq}yDvn$^ zgCn!Zc_xzUPwl5>)+qJrDAw!GzI4gjMt%AAW5E0!4*IiBpJZZBC;PqB!&WTu?P2}R zON&&+klR51r_Xj#7s(;#sYiEaX-6|7H<>;f_FcGGI9zta$XN|;>w5a1sr_$OW(=EgjTF-A8EAtcC+ zk%#jz-&C2){Cno#M*cJ2nxW$y zR(y8JpaE!CjY9R?RsvpOWlVE`2VMULNP*?LPq&n^t%oc_6>-CL92Ej{6MW@*ltH(B z4j8(Lm<$=^fMI6`9qvv)*tQ+v)d2t!SpOG7*nXJ>C4d)L_X^&ql~P(Or7|)YBb4C- zg{=Evd50681Hn9e`+&^ZoAjLoqb*(-423ob{*Y4y1%Y_ z$00g)k1um~kCCN=GJ3nav%9Y32i)(FWkW%_oZZnK?i<55LEjhh{T-`QKR=UZ$$>=?0tYX?d_J9?X zwOYGcy^N1|YOvi!+ArsL+|p5}%(Nrzpla&wu6;unxsQ{%`0UDn36$g6db(#WIx65g z{s0hT>Bk<8ga{Q!f`EFMz)JM61k_}E6HrxxFal~a-+zRtW5)<8*qqMs4uU*T7s~Ki z!E!j9C(8NGL;Y7oR<^@O>2j|Uboh_(K@wILhG3RvKuenp(C2b5xuqH&+-*jxhg9P3NIBhYu703}%crYFs#%$s&;?22m6SK@7tH2w)IEfFZ;%w<(O153jj~kojk(jg_I2;bVb$Fl{h8lvV%LDU+}Q4aBHymL4tvJ#2uk! zRXj{M%D~XCrO09BwKYGTvD()P4S29(o`PmF3wOPdv`j%u z2-oF*5Id$m2=&^3ol>#Lq|09qn>s*NuCE&!LzF+tM6cSX+Nb`IOu=Pe6d8d@og@>a zE%P9XTEikj#|R->#SkO&N^E1HZe8u{cI{i^a*U0_A_=u0&_Ukq*jQP3!WM^XwnPSLpfYV zGvoVaD1@(L`dJdq){)M$0jQAmf~>-IhZnx7M>&|2lRo&JjUfheQ4YDjQ6+tjo@Wyp zG1+J7q`m)gyhdd#^q3k`IM84;)vv54sqp93fe}u|JsDX9>4fmqh6cH z^MEtj>1@_%07U>wdt~xgBaoopU!onVGXK^Fhj)y6unkliWu7=uTLMg{aL4PFtIt6R z=!$nh4oyjfy zV@_ej7(rq39p!azY)wN8@DZ{Ta-S*U4Bh?M zh-na5dKU~Sg~K&L%otP@aiUSi&xYs z{F-j77_5L9LrQB|1g~sune?Kj7f9))SE4#vA>YYZWpYoDnfS)RuGWh@%`Z72!Z;(= zXBtFX`kkQk6sm;|(&vZPeYw>_Ul z%+gOt`yvv`YO>^Da%VZhxcH;aQnD4YK(X@CIUmC^5Ul*zRV$!n@8tVYyS0;QdWS3X zJ;xBZV2etuGPtJNi~qR&f!0q4X}JN^UNcXtn^lEmha(r%u`oBDvsLC?Um+uu@G5>% z6f=<$f1VIH)I9d)u5Ea_lbWce=B6S}O$v16hh^mRi~P9$xIWlFZZ6o?D+rWmYS;}d zGoAD@EVS%LsEM!dpV&D_7bjPc&mEN~P0P8zt6k*1pWM!1T$ z{yJu`OQp7c3EV~sRN6D*)k9rK-XsDzGB!4+@%T-4)lT;smmlzgb4?C}TaiWQ8)dDz z_4A4XM*2g$TX9bk2-?jeziLnw1_B@}~wRF)&NfK;XNJiODx1uaLTTs{{ zG9LVxT#8;7fbj2S$@W?hfMTm)o|LX+xBpJ_vyw_}$d;b9F=awNGHZ=->7Opv!2hXJ zFxlEjd!n!8!$(Gw?znU8o(1yf0)oyUOq)Xm#;HgI(SFm!zFX1kqGJb^Nc70e)Ryo> zZQcR%CfrkiBIFiFUe)=K>teKuQ0!+UXv*D20!)b%KmJz1VJIpYOa)yrkEFsS%rpb; zA9EEmX}DU+$PMP0X>9_Z9HMn;1o8IB7N7gG8XAxSeY+A zs$bXfUqXb0?7Dz)ov}C_vQT`{gylBVX!ryfMi~xRXzUX(3}UOR2}ZXJ{}>Qc?O2x~ zjkOf@3TCmH>cuoThb6}mpL_TTnt-ep2;FOQ`yIRV8t>RU&K9o)Nai1R$B6YRKdY1~ z%F}JXl1v;sVVfdYiJ;==)~XMGkpFOnTjblz8E&u-4XJELob^6AwhFgjx3EeQ5;N#k zCY)+CZsubJ$y78HKC9hp^pqL9E!c<2M8Fua6>37blkfKkdlbfC%>f#&w zzKg^Iz*RY>V74!cdrzj}DPz69{MBvz9?}YUFm!yuo;}H6W2KlEB{WzoZ46OrFfaBm zd=RXO39;G5nxqF8&AL%3#%PKdDJ}f_w-KF**=i{uwOjAgmu18 zz}p@NjGaW{#>!kT0ylwP9uekm!abf{zqz6asB05Y0bX(95ok6%ohWa>9pvt8mPEjzC$)J0(?&;%T2 zNhf28=-a?gv|02+570kImk2?+h<~Qvp+qIv+n{Y7pK!qEXk*K5INI8h#lzOMK`J zQ(=#kxAModpXGGpn~4=CfRgd8jegV?35p1a^h!1_$}QdQ8V*OCy1Rp7KY$mm=%p!- zp#EK2m5Hs-fDF-+WlKdw`&`S*=Is|gpB)@L=BNQpJ0L`;_-_||)1KScPmxFUqoH|q z=^&dZOjtMwQScaCnq(Cf)bgEbY+KfH>7KrQqncoW-V0kFioVLvisHT!T4N?u`$yl_R7e1*~kPQE9R^voWb6>*QqpN zpOZ*bef74#Gaoq=9^Jj<_uwYkp>RtlRg+=^??=;F=wujt51C4z;*t@6N?AHFBXkLZoLoo>v~qQq*=LS--7p`VhFj?=EC`q zmwx60EX?k9r?@Vgy z<2A%(tysaElf*7n3<=5udMwjd_Efc6HVkVrhxuHZ6Rtc}gWoePsegMyQ0%3=mSi~}u#`HA)b!n|gK>=q#^%D(Xce8kyU(f%}(YyC^yew~{KLTC;lo-6X2ma+> z{)eV-OrCFf=QnLLlY$b3NdZ&|&f?o9ofds9cIleS5k(WQ1L;n)oR1iQ4pr`NqQR<~ zi^r}6fM>5d3cqn|dNHQIeHVZ!`Mu&5f_iXJdiy_uHAz|O|BDL1gktMWi)CPX3Y(n$ z%i8uono~jaG=-nUNv|EU$S7SQU47O?2Lny&7C$NT9C{dM0)`^kVO7jS3WQ-b+s=~V z7==l7&>CDaHEp~OW5;RAcuTn{SE^XuE=$~PP_MJn&h|ur7?p+ zPb!x~i03U$+Mi1GEoEe*F2GBH_rl2LD_#PrkcyZWzkIO&KTZbOb5kA54biZNH@(Kp z(~|av$O3xPeK_WyzjDkUWWuPh5CP1@uhHVSC{npv1k`w{M_yl*+{*)1>uU9f3L)65 zHKn-8auICE%C3!Vd#IYJHL08ISmII}D&(Q^N>@PmpCzM-6H|#UJ+A9TpwMs$cZQWE zv_SNY9?!A|cj+SQg{E6serJML8+BuCWEH~KJ0@}7y^j{Va~)SeMwm+F{ZOS6?`Wt$ z=B~rfb~zV(Xm@{<$*6RR_l7Uef7_#v zB{9DcQ9CeL<4&h^u0i8m5VIW++hOWrxI-TgdNrIC7F!XtZgpBh#C)VgJo+CGjqk?3k3X&Ft!lA zsc2*fwF9yH*WCaSqN2p)N~kT^zTrCy1sUvy<|kMzevq%1>S>HZq0j27me4^| zLr!uQVudS-|BK;={fQoExQIjsX`6-Q0ld=gjhKW6J58E48I6Dxp)L8~d_Iu(nMUwR zv@XJbW}rhhUec7F{4=Fz5fzl-IJ<~WF=$}&wjOmxdfIHb3d|F-qXP1wkRIy;X8|}dOkn5?3R(`ofbxUG z6WmtpIx)(*_N9YF?CTAx-a)$G5RH9^gKBClw~}WWzN4OyImjRs@N3Xv*$(<$WW-gnofEV~3_#`u7@RXQu-8}u7HQH8Hkp(jq7~F% zKn7TuC5<41l8&KqpiA9!e79)+d|ZmW870c3y^1ihaCGwKDupnH7}2ozpQX2*;GFJ9=x}x@@_|h^kg#_!xx6gAkf-hrmqQ7`NuGb)CslM(X)@oG^Q1%w3=2~Y8{pp|s7}+Ql zXzx$|zc?Ex@#z3R*Fnx_r`);cbQbD>_G=*<5PJjvyVzE6?MFjD9%^rfXd2@=_C6*7);jPQm2T7f@f(&?^_A zjH&BujYk1e#<^dqy=p3D(-rMhF4zlEg9zR<*tKbX!J2Hy(+C@pgm4;$ZmY8Ane`A( zld$UE$76r0(io*VL()t>(PC=9o(vYTEXbh;?Pa&6KAzFX@2bG9p%Vm*tbqSfau_5x z{Xk5`E>BFhQipP-8WoPwngDVkU&Vlu64aQnHhpHiqARld)rF&@{1Q4TRDQu9y*aXO~wdB%&FN@sA4X_n@$} zkHtpKm^U1@;gesHR(jt@OPij^Td*({R(>*7v_9Jjn46bHT$)Vhi|#d<#|2dsjH<=1T4em*tgBc6;rYt!b-&>&ocBy3nG55a{$Tri$$|CND zao^J|U7vkGDmfVL_bG?JsHGV|Nl&_6KlD%0@q!+@SPZg0FN2#}j)lN_{pM2YA_V?c z(fj};lK9;p|K4Dxvo~2rinN+ftm#yU=WpS|Lz~phxR~7$4g`+0VD&iSi!%uOj9}mA z-B2@6|M$l8F^qw(bN|cBO1ST728uEijfvOh>u7o2OfbqA; zPFPE*ILE8%=o!{7-?VZlpgQt%Xr_7G84KhuxA6Omj|0b>^5PSeK$W(SaIH?O65`Q) zV@sVXeWv98ytsmg`G6EtS#+5R7otD(7Q@2w%WJ9~$(Ip4c~=5Kx+mW8Dphj&Ho^j_ z$yhG_j@gYx6Iq6#H`wa7&n`nRkrCh}vQpwzloW}fXvxX(n zYbSUz2|-sc|d>*RgB<~`6ENqFdN^ml;Po3uq6I$;C)TYWeX zHzQ%MxD{c4>m+Zb`!=67I=>FUb%KI@3zkI zOSWm&#ZBp>)^ZXVU@!Ko*IFjH08eA1r8)7Bgr|>?LXs9^@Z)h83hdX1c*dF~?>Zrf z#Sv#T$6~v_L-UF~X(xW3kmn(e9XJgJqHvO4S1VP!bD?rAKWrP>E>zLMwVqA!f0AOH zg9l^2_RH`SyrSS{h6TSF>Wm@oz|fCZr#%u4U!4PCk@1kjqI%$y4*&AZKJY{kEiE_~ zz~JeKbpgy7YB(k<&}|Nj!;9CvrW>F?2)0ntlndP>GBgR!K(Xf65b}u%htY9?_fP_Z zvNt*!Ayf#=vY@Xl-8DQhHO?R+Q1n{@fNY&W?{LNUVq9WgJB2JTteA^fCrcs_$G{Oq34q;vV*ONcDaZ;zPeQv*Es;fx)t>iwZQIKqtJHdiw$! zcsiO-G)gTTd2W&C&l)^ljVvWUwzh3LY)U{T3Dvg{8VO6(OpCvd9_wc~J)wotH#tBN z!_+?dT*;9e4nG*&oaCTCK;_gkkWQssKSF)?)W#mSjVeS1oee=Q>I`~&yNAH*MmXO z^DW|HutqHCC`1GE(;P9NL^7^>`mYh*0j{5ify2_@WA)V&W226f_xdT4A`K z{8uN`gxFijp)?(swmfPvto7xk%dCz5=?CEhBuEsU%p?SY>FmCmQ-U|!x}!#!b$G!kt*T_`bKYcv-9UU7%-P0MG4@|q4R%m{ z#3xuXVZGtaqURISOXz$VCb`V8_$x3Lg!+Bi>LK1C+B`?h{Cs(rfLduTn$Rft%XsW{Ufz*>@kvB?sSu zt`{FprAp8HsAJHR(Iy1%dL>r^xj|sN0?^EL8;&``V8?O|vfc-urV8 z{768wJ-y*XE)e*YhaB|*d@bBfwQ0u6XOSo>aG&JGKD;-7JkeiHgE*7!V@=DQv`a$= z*Yf*c%1Nz&{qogCzkjuq&A=+KBM1`D88)Y~^sE((f^a*G2ADcWo})Qh(+?-oh4X}# zaFrz_6A)iXL1pHX9p&kifc}t|PCGyT0-i#Hc5Ng&CAkSYT#KMK2(^KL)RyR*W*LYfQum7BrSznm-;8 zYYg^9@}18x z?idlPv#U_dGLkCCuc{D*?t$gPi&i=I&cs-=#u&Nai5LnpU$zB-vlAWz~I+L%4~bTsa@XyJREsxQXzg^WZMsM7UOW z#t*8~a`K$MxMz^n#2}E~2>`9)BK~9v?5bh{X)T~{>;+FAV);riG!PP(?Ux`D*~c*d z8a7Di%MCBM`B&6J2~tHQv6ZJmk;y9^d;>ykA;aO(6}I#wI31$#QIJi%ZUz-*lg%X) z1yVO~QCQwz2AElLVOarGiCZ9{(b7Eg_C8DWG9(W|OP9_=&fvCv2+6pP1**n_JctvR zfANfLRgdAXZOc^K=@KxLiA0HF)<+yH%*xYPOmA#C#Iwa^v7ln)PvvdLXD?$uion^N zRA;93>Te?Tu2DVs2Pa7)_MjyEJcm!b1XUgpw#ZS~g0ZLy=35m2n2&~Xh<9apAhP<`@FyIlz$uf}*Ei2!&CdYefxnDLan4BA_3Oj^? z6}DuoJsHeE89mEv>xJLVgaqwEEgzYC=+Ae)qR;pr&WLkkg**8(OI8CDWLUXEn! z6lwwRQX}sboL7jor<}d&fA81|dR9vLRUA@4{h=Hv3N=P{-m2vjO)Df3V(nR~TFBf_ z9655{70lRE+A6#}3nmrX|I2)4-pIPHK-{$%xtSxC@^Iw{Y|~F-~ZNj!@d!c56K5gMNL3`wQ12_E5KI;@R0#Z2QP<}33pnM?0f$}>~ zu~9A(@WG4jSnfD>NL&x#?j57c^)i<$d3wIWqPW6lZ#zyVl#!FgKD`gEU)Ka%%sGWm z-Yb&aJ8{2AZ1<*`W}xLWKt2)2jDc3`ZqV6lpp2WT zyLfBG6`QFrgNU0`T<~-gtP|6;)&HVQjbUF27tR`M72^PY6WNC1Cb){kAM;#t6t}FkWqEHvqL@B? z*ZlT|je3TM80$1OA@p`O7-t6!A*~&VLTC&>t(DsGG$r#73E+`(4EOjPt%knL7LI<< zE(PW&6XYJ<_(#eBH>x8tsUCX^c)Uq28iGcW-!!#4Rzb0?uR;qs0Rz^;HuNBdalDL<37HY0dIpI z2+zzSQ%pA!LM9G;Gwqi_Z7@xb0lew9j`x*prDA~H=2fg9oDTXiiX>SOk-#DdyN?C0 zwHwqAc~LtJAlODp!~XQ+gshbk-ym0#_+xkmia}`Q%7gYJ3&7$y3)X;g6*E|9rKyuR z@LB+`fJ9rtQGKy474m`9F`!L@8Qb~p z$2>25?@nFRee*rs$||$>6JJ&>#q|4lxo+Jt0mSrvNPfT!gTiD_Qn*4<>AJz2YpclaO+5gmeAEj zkxbB(^f7FLbk5cwMgS5Jp@O^JnOCJS6jKowjeR1I)+-?jLCo9ZD)IA!+Xfh+rzZj% zPbljvVJwFlz(gt+DUXRU<6B6Pi9Ay2+GY!RnD69_JaVX0E_-OkTf=D|m79PvYK0Cm z6RulRwm5$ROoO*o6m@a|^wH#@*Jtt|QEqUN?KTM*m4irAl&TNqK*kIa{ahk%VqKu8nyuoUb>{;#nSq5dRwkxo6 zn>mw-wzMT1fcNqTtUj(-?%@v1+#Q(Y4o8W6(Xc9(LUn@ea9qtF1ZZi8?rqrgJfYSz z^<^Maj&2&62eEq$6a{eA;eo6i_89CXX34&l9KH}la+c|ip0X(5u@t`4pMM%jJFuci zpy$}677D)23v9;nntK%V_Sm{65oRx)pFN&p=c8og9_vvg+y)d_%iZH5!1C?_OS z1ul46KdelZg=`9jXM^HAxA)qU`xfq3Xk0MR```&JyDmKCvRiy(V#`FBl;Q?1**JNO zTw}sDF+s5&S_*uSgUUm{$&DBJm*C3p$Q+Qs^F@12_S>oJLkM5v3?(08dBlSY45jMB zJ;)D3#?rAOLHn@!LVfpC8`_*_fF;TZ@j#r4UCR#Ek?tzXPAT59e=no!#wNUU?rQu# z-C?1##K-hz371kTw+~xp55&u7#g+-D%D7pZY{+SiXLwhG5 z1E?@@h^tl(=;2-HpG2bzj|=g}tHf6&phVXr6VB>0R9P43ByJMz)t}!$-&zu>Udc18 zDqvxhzk{&mM&6zr)eew*RX9ci9T`5=Bs_$H4sbWCQj>x>QrG7;E2UZC_4hZiI^kJ; zWy}2m9t5Q;N^6et#yY!pvzPGU3IWP{&U5ektn`k4ta()2W#JebYOi$4oT$;!b>@j8 zVnI<(zSRX`{tJVc zUIFmPcq<+!kG?D7oL7-#p;Y;?dr1NFv_$f0E75&QriN7zvMXuIS0wKXK5S{8EEqe< zpIMzRjX<+SwULw-0aws)Qqt;u(l7UGCk7JGO&1fpx&>5*cw+8 zQ~W2|o6z_mZ8t-e_q&whtUztJ*b%LaWCrL$SbqcIB73YW5fyGmlsA%{9bu5;-gFnL~KI+NaNwm@m_5#S1>6HD=z(%TLU;ak^6dVBqUfPlOzdY~YLDJ4ij zbzMj*{8RorRdxT%(yO_Saf2ZoKV*K^mn!S9S)oxu2%<;~BxkHlW4O5F==>)x#55zw z@;^fqpSL*C5q%AGe$+nSz2Ai+;{4JL!9>6V0A~aX_QC}u{eEd_EV#ZV z$7qT!K&yd4X5zg#5Sp9HeQ;OqI@eUE-Vt0suxFgUyTxbG ztbE`gVi0F4udY%WIUyBY0C97~J0n-;)SaT9AepDXGk8}Qt|NDoUT>WY3iMEL%=eBd~9_IB-1LgmLY3F*i7YSh`~i^sp<+Jex|Fh)20 zG_^AN)U2Y?SdN{tjdCCA?8}c}pF$}d-_tWGTrilcCWRL=g{L_e=3!7n%xJ0f!&-1j zYQq^W=6zvkZv>qMip2mF+Zk|a(@TmO`-KF6yaiE(hS{?f_`R?1pQ@)#z>TMzh8>$W zp-=OTZbgq@ve$9@TVEGLq+vLU%r*R65$ykRE^f%^f~e7js3~1=h1w4dVB%L9?kHb0 zbB{FTwV-JFRT{VQ%9lc`iEcy~MVtX!aVpjKt!&0=r-M7 zmMPv;17iW=ih(t|f@kJR5bp1nTlrcb{L9A30L_l7@5isbLhyt7 zkDlWrs|;9GV)6m*PFzMQtKMUEo6^$&Rr^z{yz2lOPA*hT;VpLfzsC9=*~6|r*L11p z|A{xlVs`;IJI+0;AZ7AFqY(MV{8!N1pXm?pmv=nD+^U~d1m+{Xq@)jie!UtRETwB) z6haK_K9FiH6DoJr;{ijD9dWpjyOrNmo#e!1A zdx>@WTRbCoyqEi#WDrbIPF|akQ$kW5L_q^_!gC+z56d+FW5GdzpX;_wgN&L^5Eb!f z6df!OJ!2vyvj=O_GcgF88COVhC3-%Q9FD|&bY(|yoZ>j_mM@=fkZyO-##wc2)9!* zDd~J3U*}MMb8_SC?sK2q!ys zEYuCMnXaRM;bK0(f~VVJ^)9HyWKu*+Yeob~@R+Ie<3!zvvPQV12onRNX^jge0AT~| z4ez9U1_sk7@!$x>7?ML7bwu(m;#FP5adRANo~hABC|}I5NL3})yc*FnI{d^2wZuhPRxIekSEve-Y~95^eE)ZZBUJW z`6En*BCnDD(pY~MB#w9?afOx{55M&l z7VAE-jM@#nGNY?gL4^vi<~SI_t`bgreOQ?c(eipIrf5G+Z*}?Lf@)mo6Cjxy^Tjtg zH5B!c=kC88BM9xr4pGLP1Uo9rm^{ z4_mV`a7{b@kt9|ql&n)-CWOVJ6K<(L)cpvPfu;^f)x5D4m_!awCO|Vg=0%5GrS=!` zblemhGMa^z3L}6X1B+~Z+)+1gfCJ198)Nn4h zQEK7V!yrvxxDt*8#tvFj@wWJW%xQt)4`TdgIV(5h(+h_CPnCx3wW08YW!jZJyX<*^ z=*V$mk|xxWjYT7b&@iayW?y*BZVtu*YWKhMu&@}-L%%=etaVI%CURT+uI3hGqWuWi zTJ%m?Y*wV5!`=r%Qr`0ah)@^#r=`hk6`xd>DpuP^us8ygr>+3?M^51;o|G!s@7>j@ zUBPE#fPG=h!&*kKNNA8CBXqDmUEWd@;P7o_FuV+@E-f({#ACn7G#2g}l(0BbGNB%b zZ9oDdUwn>UyEpCtO-p@MvSBBIQEoU6hG{Gq*UWcW@T*%(r*`9}$dh^*RIHmnY^0DP=WM z;#V!9Vy`Os)u2*9^EOC=G+&Q(4hK+bQP}x4%Ek9z&pTaI@U#rP);Yl8b)m2l?2P!K zYBtkq;BRO1`0N*5)pw_b_q&cpYxgGbvL8`4NjOy_UKJG(c{%&U?J@+{`q_m1A=XFI zTGzrrWU(XyR8#ntoGI>He)(36jMoV+pYo;9ZK`|RSSVRmvk1 zRw$T*xUv*S7O=buIC~X#W}7t>jgmqjRxF|oBj_QEkhM~`7A|>8@=WCr>;}J(s>S@W z^^+D_K&XW5e}@{D_RFia7Xo2Z7i8;Ql6Knh9QG8JnX=eh=#Y0N$gg;r>}D$@&uf`C za+&b}V=+mgwi7II7uGU?P)LoI`P@n@wGS$0eUI2ZECHhvw`V=3{Zzh9sI z+0U~(_6-L@SwP}#PHK306b+2aiqr*~riu+F!K*Ecd;=;6BZTOo_f<>y*UOmYqD^K6 zzYIJ`$ca=w@tgKT=2ip?>Fwx47GLvXV~7#E`7s)0+@e?8AZh~t4Gu*Cuy(2 zW47DRMh~Dpj!w!K=x=E>$38-bsSMJM=cb5q6$Vg+n?05|MOMNIJ>o!4n9MU|7l+H> z&7pB!9Pu+19F#-z3(LhS0e%V7xHXuY0NbI2`+g~4K~}E&iJ z$e36wU4-V$$pov`|L`hkf!UpY&zM*@8{bfNfvf(U>}ht;AttJZ`puBhKQfN-g^?a4 zKEZf))G<|MQw}Qfv0Ouq^vi&T6V666>$2Ku1=Y%8 z5%-m%%yvsDfnLgR0Tmdick{xMRpWJ4=zgS>bmC(NNleyyw^BioMF1!H8bS0QUX%IE z1ZO6Yv1j30r$?_xYbZ0|K>Z>tg49oD0SbWozW<9`jUC3=2m2b5Z5^Om3e$~tlrYUCLOAvb42sI7HlMj3-|~qF2&c=zP-!iLlO# z!g>-3^m`?14r{sRjiGTi?}u#Q%q!qg6l+zECj&K?LY?MDM%S=@YL)4IJ(!Y+`f!l6 zz7vhw_$eflnm>1Kl4rqWsTpG*QltdDxjLQ<^rINs6%DM;Yc_QxT#=Bps%z&9 z*?d8MRA<}3;f{-hk9@l_ReM=P|6hq$pCcY4cDBZ|tEwxHiCpcwd|JCfE-xgb3ttV3J-uCO81w%v5+Sr=G-hMp@a*@|YkBU59mE16pd&wmdh!^JVt+lkI zyI_=spnLS7`V4_esYvm$oRVj+_b%70jEUNIN;pe3zQg$=KJ0v`ZA!Z2593wzmS4Dc z&SB2cD(nKv<4*ZKESpyEmA@3OCfyjwK1hR3u2;co9xSdLI$2_Jej}Hc7SWt55>di5 z?2!P$0{~x5m8P@d;__%C>5GTmpe4Umk&$1bhkdjXrgqUUdHRjxn4Rvhsu3KYC$0!@ zR4w@9=I}bn+s(F;ZXpOm8^6tuNvGQ!pPC1J0XCTn_v6>PHz+6(VU9q30CH06P zfhz1mRbT}JE3*Da^gHgyZL@uA%EWcS~TGA10=Rp2F{-V8Vo;4G{PNpOH?rgy9S^`;;6EtvaQl98%=^3 zIByMUP&)raH@f{Bo$T#l$lCRbZwWNW7_~;4D)fnRVY&T)6JU&B8yyD9 zl8f$fQXB?EJ|ONyBY0!Ra|Ie_KzIDYt^NsuB5fpaW+S}jk+ZGhH@{mD6%>KmBZ9cK zE=A|I5)HQXdWq$<(5ti#Hd*0(LLU}I;leZuImdp0Hrp3&&@3kpQ-BE+TozS}SGs8D zH+ecS`V{H!&=wI89u+W%0l|652xwRL$!nuwbG^MGyAItk5T#stgwmS9oxXqH3&fdE z@w=NF`U*?$NGjH8&`Kc_)Eiw2311F}a0B=eeFG3P)PfYK%HjlDzISL#U)$yu4QZ!- z0lD7GpvwX2hjz&hsQ$GKWi2G0QCyteoY7n_1cs`v-fON(#>9l^<>kfxqzDKp79&^& z>GwzV7S^THzcLKtx3E?EB?k$oJp7rEViHbq9N*9+d=ox^TdkGMXV9j@95qZqml13a z85ZNT?4_k*TJFZEg}1@zX@I{>*xq&yAQ{&bN>@e&#vw6%4YCAr<@1I^Kse1rosa<% zqNN#BI+6_qPpzkqIoIiy?%B)Qqb`9kZR8*c(BZTYw$_HVdLR#IUfB z2DL}Z&&?Ft<^o>SFp>v3c(doE^c6ynP(WWzqQ`ZJ7eUFUV(!Q(6yWQ zc&w_qUqb_8l8c?ED9_}(e->%+@M$A_K4K2>I~?i1zlE|g^b0fzFd}%UhPH=J3Uq(qXfsQ| z!pLJ__p?i3#?`F8?=bSIJH+{h?jq>hTGc5r;f}P|2F6NXsj4RmW>2gGyM z^_H7jAdbSC4!wA_(?3^&9qXYI-k-zl!H&Iny?}jWeuoS1(}t(6JX{~GOQg)-5|#%9 z5ghE8-$HC||RH?Cyb9TqarFd@PKH%18j_FAYX?u6ua&IY9k}`t{#tEDW7O21+ zGsny^++)G>&?Mz42F;O{JjJj;OK$&q)TB5sAcM<^Ci_n@V>snG29`X@$c^t3VfJlcAGF@}MXh(eeV6NPTyJC}Q-Vt>B~qzXQ@Yfo zQzfO5F45Y@hT-bVyZX&p<2Y9Tv90ep(R)|fO7eg2>PMnZ#3A!3_ehi4b5N)^Zo71& zmr`y+!lLT#&cP%Mu8xBW{59N2E7*xrD;iok4va<`ahWDvs>v`uM-1#emPmNWD$lBs zUb%n_E@{)1@y8E!3!{0gjpeN6atPOTcUQ@6xy>7?ogjfrswDd#EvY#XouTAY7TIdO z$t}()!lcPZGX3uE?f~t;k-VYFwTryHl*@=bHZ=3G#;F7&AZNS-&P?{!d(Wm)UX+wb znNboFLYZ48m-LL3l2a{8U2xe*RScR^%V-p(r75k}8?~%u-(#-DKcwtPjnuL!MHDIR zv($~H1zEB?)rN^Mq)E3>ylkajYNSr`uGOS+WLld$UT{fkwDy?5%Rxz=uLCX5`7fR( zo_jB@6>rUD+nm~`bM<)=1BR2H)!!_QA|?zqHI2(Yn6diZeM*Bv)5vVN9d5N!FLhFr zpFh?AFvPfaQsp=drdml#ZK~f`+9yl>uGMcXU7y?9r*td1e*KP;)2OLRa_uF#x|In; z-=oZsD*=+yG!5VHHzG%){`=pTKi_Ed98gcBG$K!A{WNK&rp%a;l7fPAs_s>mL+G*k zF4h;C!v0Ni9If7V3ek+!zZYXNd)W&aSWzmoyuDf_=`0h>VmKC^=9=UBnC zc27)QpwxRqRbgI?Q@~>2D@Jm8F#xO9-%*&p`kXrVdI9#RO54ZFUGSgyYBDmS4FGU z7^DVI-d>~8k{wNMeKdjG^JG*ot&g}R?L#895BQr-C$*33x7L566*&-ukncpBuicLJ z;l{1Yc9OTZ5sTOi>u|(Sbcrw^71pt6?m5G|5hoT_l+b2m`*h!psDq4`+RXbKaeg5M zO>IWDj|X<}eJ7SB2z4Lis?Re_^*>E+KeIQ&R3lH#K27l0Frntd3a&`=f)`@K7~w?^ zYp!r&3U%<}7KI zONIQmdGi!!wj2ccSiy6oN>Q53!2&LOc5J`}4x*HYr+s#`&jwJKJ~>q-dwGClu}A-nSKd9lW6-;N-3o}?K7V?fhKrUhw^}7tF^Kp zQdI?IY~5gCPUt(byDIw!nLs%EOJD*yr7a#{?)Z;wlg%^!A&B5lq=@6}Vy2vAKWd-y z0NEdwzaS^$-$RBFe-ZqN{Db%bCeZXbVFwQwxSx6r0@*UG13H3zN}X<_&k6Xm5T887 ze1RrgA}hYgz;!HY(sMAuIzs$K@F(&QqJrvPNcJbBDN6yD6v>50R|}71Hy8&HF{(bLE`l zkSRuj{u_BbcE5BeCLX76oE|GPQ;o3NjrVSE1gqa|V-feNI>J6sefJ=!z8j4&6>;Ca zkvkeObw51@LT7~g?%w-%JYs~>JjRViOyv~rjT{+i+;iiR`$p)~NaVSik&+Qp2?7lx z2qhX4l7j;e?hs5jLNGC&K2~OKX-qv1=D}!86Z# zleI7<%Ee^`(v?i9_32IY{fZH;h{%YkNcH!T%!seLG{)3h3oLf@Yp%4_cAO16G^@nA&$NM`jf2Ws}`2>XD}{6R1> zt50X4fAuzT&gN4jB2JeyNuz+Ziynnkre-qz7Rl)`A8Ux{2caKCf5^djFd&moIr^FE zr>Mpw)M>_4JD?-Xr(;Hf1O_CJP)Aq?b%Z*z&E9O|X zgBf@TV@;JcQ)*f4paU5uaA6D~!kp)!|3m-Dx}*!Ie3L2If&Hs$c~5&N_tc4ymQfR= zXf#@qAw^1{DZyC`3#wd>_B45+VE8q)OerEI2od4u2L(Z>pu_CQ%E=L2W-lX{5U-Jm zZh(b|Fo9S;Ui~Nt{ZC<(0Z%KzxnO6^H^d z_t_<`9!dUbjhHo-p^&-LE%3dsN!5R15it}MFas{b+{2As2EzS)?(YcOo*QBRuJ)`5 z;s%%kb05TIA-GpstC}XqD=1^@tiMv9s8Qh*DP%NGH1nZtt#Pw=oM_lG>7 zk^2V#3ia!t(H*?-$n|$_7cqSAzz4|XN5#wCVTRl<0G!4ZF({!v0jLI85|g{BB<23t z0#evgh80Rsn24bwj3SVTf(eBo(r_heNIX7C*c24pB`3KbFIma`00>KXQliERF=|m! z)=8Bneo#S|E?(3tq|hMa2veE?DC9J1$`BZULVcO|OwfY~R*>uK;8BTwB9~tYeCWyb zZwa=@^>yHpjQezwa>JG=DP83H!$&T6 zC^5mKGzJb{a!4W9zaR*VtKbqQ08Su)id;@GWu}@M&SVg!Nt7>aIKd4r+;D;$(#Z9P zh)7UGt{+5*Qj=U?1R^Em0EMcKE8q9h*^z6{k6fn~E)&cglZ3(ml7M*f!jm&ln#lEe zeuAKgk?Ri;1*suQu8%`X2b6nz?CAL+gAzGpkeUI@3^Wvx>*s(%bws09s2{n^iJ^*I zYjx5?t}>*M>%%~yTI)1{QxqjGGDtDuf-bB;NdcECEu3(-xT5=U!X@q*{V)P(l7mkZ zs2F<4{WsEJkt++cR&icAFf_Tz-7rwe-Nc04AN~qWZjhR=0SdK_CfgP@rrhCz5Cw3- z3=<|^ctK6BUjr1XJUX1%*yL=7*T-QBQsnxtlK0TsHFHoo^)mq6MnNVx3{x+bH({3zsbIILNDDaT`U7%3w zSfYeU3lyqh(g{=Kib0_oI#KJiA}3ccyhNFBM6OXM)R615J_9K@BFqs^Thz?(1yYh0 zkjm_E1QMQvl$sQ{z~l8}$o;jWl61-aV5lUECSMdDjf@IM(Nw6F%n3fon&tsft+m!# ztNUM2$nhE^a`zq2z-7fR&$Oqeu_f19u60cd^|O$n`q-OTGnMOW&^{pPGHk;OT;lAu zeo@l`G`ghmeKaH)a0P@+p!=0Ie?H~u`=rw7!sNTvs~Q>ra{s(}0ad)IQ`!mp`PidN zH$TJ2c@VXw>2UEuyNN5mk?3?>>;B&MiL znH_N$P%vZaQ6>eG9e@!P2@#p@ubQq}8gd!V*h#LpxtRryQ%epyK+N3~11=lOQueZ) zWPcC;=KZ_Azut$0xyDyoHcbF8yt>6i%at)nOG#srj!F?^AFB#h zn)v7Vl%EGVIwViek01?(il$HLeK-V~Ge_rha%JZhUJzbQi1~cDA1bH zA3aiMo8+`s^3eqDDorlYF8JHK4q-$}y1#FeJ8xVLLvZm!?%pAjIxk@F{*FfXJELyf zHvetT?gq2Z{mn{6O?HqQa5r70T;J=}YOF}~CQn?Sx@|2>leOtHIzquHL7E?CH$Ptt zso4=6N6c=X07u}}hwt5pOx%0^WSvT)?B8N2!c^~qsYcibt7pARH5P^88?k=%NM_r% zZIn{#VqKeOy=!EROse{x%A=o3oWlAE3gsf!XoKv4agApxdOhn|qY)GA1J=8~i1n@_ z*4G$~@W?ab&(+0x5b(1`5L)jV-(yPfx3;A6V*5n4UgY{N4ncBR`1J`dsFz%;$dyd4 zUF5o%kZWnppmqhhekj(bT%}fX#`6U>Vk&a|>W!F+SnqnH=`kawqVV-bDD7RNQIN-6 zZ!;PZG75dc6X+Ywbe1MxModLEU*nBlZ{ur>Mm65%VIO`uYp`&nNVM9ozNAR5k?BRn z>udat$N6$TIo%j>Mj{@gHO*rc2nZbh>Rr!zBSyk^F~L3v-}Ms+Mq8SRO-WDb(U~s zqOK{*f!gX>H{zVRTqBLi+NZCC$v=gkx!$uD6!P8%3o!UN97k9a>?BvDCN`Q?(_{_T z5bcx4ER;2q(X@{`C500pl`BiEQ1!`U)uw4u1=*2|1?*4Oz86c80hc{B!gfa=?nfxn zc^jc$rFw50Vf*gjc7Wy)`c)s)oa((6K@L>2MXxnkUCUIbahl6qU*C@=(EZL=m@=Od zW2!HC>UNV$pUQO`9STZH%8Z$*DO;PeXzIH}`(&ML8jsbtRX92EaASEBQ;nsqiF7un ztTt&A^(~UXJ*tkRN_$10sA zR+@r8sJnKO$Lh0IKGtCCWVJL|KZgyt>?~C(*NQ8QNQqRA)gJAcCabM^tdaoN@2P%j zr>-@HbzrMx`)|j-;?d70LJ@!WAb zfo4l_OWxEeCsMfCZL>f0Iy-oNegtViRIR_eyM4Fr?zY+-D_%|#ra!B#)>a+;L|$?K z*W3iE-*ue*fO)dO^ULsFuS_`8k4+%jw1b-T<_`UzU*!Jej-H<&4Te0RPZY$bPniRo zn1=c1Ne7x=bMU6lcBzun`t)c5ZMptZlT$1}R6xu0s0qxI1*T8EeljL7eQHOU6ns5a zqgtrbQ<6D>?BlObE2$<|G~pRsMpkPSv|3BLLay~|3;gek!2iJa#v<0YMx%a~_eTET zd!teR>S5luVBQG(0Kb1xYc#ULZsS5(v$TJFx8mN!~7olna3KzI0@Rny36e@ry;8hu6@C__nNMKM3 zmJnN*;G1XE6HC}|!CanEPh{DiU~cQ|*4->J_$E&=XLP|~aYhv80mJeXb4E>yGnl+F z&UoTgaR!qa(r`1tXx;GqBwb0$(y^J#D|9E17&FGSY}7k%lp2sIPS}M7<2=Qf!6k|r zOYC4q5GF8#X$CWBfMSLTcZ@Pxa6%bftjZ{ZiV~Dz1cssv9=0pWAOUwq8K4biq#*-y zRXR4W0ErKv zhKSlH=v%2U%Om}pq&=H~BF5Nf^F3QZ4ZIv~?d@)NyW6?#R2au>z6a*4V5}P$|D@3XdkbxVs< zAa`$;S6|gR$*vW&wYvL8-Q&tR=e&Ob?YeqZA?MXv!@9ZKT+TTsSXb4jI&02aE1vEn zW)0O^YaMf?t?+AgpRQHT6STeMa?z1aAiJ?PZpGbChXhymdi_em^t#OZz|S5Xb*j}* zPso(2s_!!Zk1S4Zvp+xgXl(kPZoOKsA9$&rcWLFwFR9&ZBuWkH&HX zn`KOnj#_^-fm}7_hcnn8rbiShSC@@zMUUvwQP*M(-kg+rED~%U66T;LCydCym1%}) zFn8vQc_xvOkpBP@NVqK>&-0434hc0Eu{2*+IYcMhP|>qZzh18zAZ&`Xr0$OI4eNEe z*K4y;<7HpfZ<@|mt)tPAnU6;rNjHZEPzmsl5178S)`mEm=Ctpy*4i7@ajXrky&;N% z`+J4?(oMl-sL59tFGO=ED2yLJaH{}Qq9~XWMZq)EzfI1!(cR9zR5qSvPQ=Pi4c433O#JOrQ+Z1Y?k&A^6^HsUy@RoxE0~_BBC}h9Bck@lrMp&)A;KiQp(>^*Fz&7wqvzRj&KLCJ2wRL<` z9Cfl+>*N;;Kn4O309mK40tkS&qx+!tc6@Ft?#8<_cP?1Lig3*C=g6bckr_Ag;DF&7 z*1;^Zd7Jpen-j=>2eVAxMw&f$rYg9{ec+09RUK;uex5&7uXLvBTG{$GXItGiTWhVg zzL4MAa=~r(=J*XmcW*E}5Pz&{H%@iC`Cbz|n^et7dY($9Qh7Jd_VN4o-i_O~ZSzcX zHL5Jk>KUD_DiNG#6$#g5<7MpwT6ooJRE_8^ry^_DKF+VT)~4cSmO#3GJqwN(oK|n# z%W)jHT_!Hvd+#-~qy-k1+_&xBx@+OCg{SJSd#djG3)ind0E+vQZL9a*d(GT??=`c+ zs)*2v`9jmmzMpf3s*weXB6O^uhL8eGf97$o;=aX!ym8<8NbO7l2@>_kpF5WOX`kR` z^QovaN!wj+vsL_xaiai3U;@=uE1b>$`4ObSkOxE`JYWLRXSuq$L&pn)1>$4AaFQhZ zNGG}3@f+#f>Go8c-MrRrq?5EGu-u46I&*E`+U(}FZsMHH_OV-iQ0$pUSt4z5pp|{j zyxw@Q@%mT$xXo;Qy`)}7wVPrg!`b{6f0B0e#%`Soa3j}EgU2H_#h1Ou-ovm`N~v9S z+vws5720#?q~SQ~$0G$yT?U&?I?_qn?FNT4n{!SP17ddXemqc6-SAL?X^kLHMBm5b z1WbSOFu`T6*?f=n@koMk3wzO;O_!}^^F5pCGH^zpj;|V@2Sd}T#%-UO20=DdH{pzq zbjh4CykyDTks*cO^l)x)BV9t5Of9+b(QWqAWdE2uGAOWXZ6*J4eA8u|&!%%1%xrX# zMQn{ zCK`>V#0iv4J4#ie(P&CkUj|JTDD}6 zi4`))#1k28f`tr5HNho=PPp*&+4DZfbMl-#m*>4V!K|<&dw+2)i0pk>Ta&&2BwEN` z5?`|SKQ&}e38w5VaROA+vg$ifNL9Xamy^4nR&w{X>yA)C?vVH)cTbn{eGU}5MsSh2 z>tmI2jWWWBoGn)%C6e$m4UhmHUgiMqOt{k}O!yBE;*9J!WdBeIsO z!uk{5i*XHaNao5z`^Vv}7}qsHFiA3jerOmduBedvYe!v)${iJi54m3k3UyHsE_XK$ zpK`wj-QDd23U!?#Dn~ARnxqeUN{u%s$%L!(QNRhxI?E|}8&~kaVpyjVfMrZbiv=2AJ?$2xg0xw2z{Cc|4 z39NgS`07NAuNd}_L8UZltNjh0;96-En&d;z#XUV8`5v>6u}GEZQWB<09kY*BnJRgu zap46HryNgKz3Nnd$>g9-p;CEwedLKowpZN8DfheoHqZk5&nU2eIZG%4g?;<-Cy73p zG6~F>ea{PBz$oB6Cm9^Fwbni-S}~}7*yqHWS7E;6kH_qn?KgpFp4t8@?6KRnZA3g~ zznfFpe&CBtpw1S|_OErppS-sxl2&acDMOn(~8G6Xj z!%2@AdNhFnmlsJ1F6#?DPUyj;hYJNrqsNjSE%aca#|k};x{8$jz5c<|L+*H;Fo&my z-0?cOq)lZ`<|)4{^aWQjWj=zKbV{aXlE_>mFcXt@`C!JpitN716$&ornIRL%vp5Gz= zSpnQ=9h*lD@PZUZ;nf-670f!*wSYk^z$-p0w4fqiAih_Q5|9WeRy86}fN`EtTI|5e zg2hA&8-~z=hPy=zBs&%5g|X6v3@aya(ZdvrhaOU3r3W!!^Z*8b>EVe>hL|3-gn5d& zl7tGpIe|#>f9nyAH`|A9xyN|{kDGH&Ter7A$Jt$m*}c2FySu$rO}yG_tG(Ohwoaw$ zZWwYK{`Xp~wsD`60COLE2}~ytS8veVX)2{!!Q-lXySJ_G?cTO}(|KsO5p){>7v4bm|C&I6-!uj$s!Caq_X$bllmchk3%v_ zviDC$O!l7S$-+tY{wIqqYIORz683ck5lUR4#?Hzv-}`jFGWU~)%zfoJE1*Kvtn7fM z1%++}-Ca1r{s;yRpbi11%+nih?Lx~@6EX*&aX6YKP1fER}prt4eI%^i9bzd9~vHN62})@;(BR!-D(`7 z{viE9{X_k(gyhj~YV(w`JR!(t6SSWnEmP7oC?&aHgQ0$+qW&OX0U;tZrBU&e`$;uA zxp(BYkHYpp9&4U7_P1~Xaao9n<7tu`uf<_X9!IKQy#A@<34OsO50L`0|IY-f*}C)m zc+8!CNdN*&ATIki17JYrS0!k9j!3o~G{p1M{zLB19 za@ghOZ{+^Z?DXb>@y9$?~?~e&0PiNp4!^02kZ!xA*9L-6n6q)0GfP zp@|o$DKIjaVAf*LoKz44jVePp6P*?{LAV?7c|UYgQc|Z`-zQ z+h$Oc^GB1L-Rx$qwVSQmbGB|?v$eKn`5lU|4)tY+9lReWl-A`L1qKNu8_GbF#tUVh z;2}w6L5D?$217w%6GtuRu;}i{H3f!X!3k(gVPS?AGbC74$ik(I8k$P*gFDd#5i6)$ zu;gHa`_ba`^kr{}C@?^<@{9r_1xyqa==?B(fWoWZ`l6=#lbh>3>dP3HhXiw;SV1Aq z<#G+#ylY|el;f&buU=K}UV}oO+qjL*2X$va1?Ol1PccUpc06ib=b8GWzzlRQu92mR35 z(Ua*@Q0V&_;!B*fO9BkYSlW!RRUO|)nD-l!>>6SIc7!<=Va^g^s~2IbaRb%U42m%C z?bG~;FmD7R0=r1$L6hB$u=?E35mw)WCh4n=MAXG0A|N90%v_#PQFxh7`Kz_4Co7`7 zB;nGEdeY+U)Mkwl7$?uDElqOCgICzXf~^9>RIq)41Ea~Pl+3qfO)C|Z1ONa4lNA5} zC=d#Vgd&kpEDQr}GanQH4Rn@7cvhOrqhXfAFvuW73;}=u0002Q7(!D-TLt(dE36xI zH^&>x)x=j|DGrVG@S5U|oD>B3?fy^=C!EzD|4^#$w)Q{NayDnZZ69KcBwO^-kw8|Q zmX(PLfpSDED!MfMxtKN~ytj@<9fKEQFn;`y%pGE)t1@AmIrpSS8J~TjI0i5sKj4OUZ z89|Qj0SrVD=+798pau@hdYYACY;n>rGxv?+O>P16uc>xtic+o;5x9rPZML_WhqMgJ zO>XTTOg)+ zVM(4aLL4nBwGi10bkSo}%$WeOgk@Ou%2>HPw%N z0Y9~+U94f4Jd}~XBEkFXejgK1Mh`fV$xR;>+t?MAS(3PzdB_1WG#9y09_l9JPp&Q* z5fxAi{le-J7O_$rt2r@_jIsU_p2qD83|T0>qW5?3+}v$|lXwngV~jruYJ+5 zFYQBEVt_qAXySRNpkR;rZx@zg$%GUI_xYJrCO~zpF4E2R?wd^O8vn%XM&&;~H?g*> zNO~++YNh3f(KnLw^WP`;lUe+UYQ1d?X;uQwBXkP5oGaVNujvy+6tE%oC?~jD2`JJO zgkbLA)Uwa#nWQY{oh1Syn^BrQejfKbNM&o(=gfOzD{~tO66%%=hN2qV$vL1Bj=lzB zf}Y~+Og2=1a}?U{BD_4_X;*OED*#0P*S&=vQdPLmaL6*KcpZN|qHjQIHxPW2?|+c? z)M!_coURM3aZ_6uALRYe(R+}AoKFhUnE^NB3EtIG#R-8Nbcvz9B{=Qjz5oJ${{9!Q z7rf06f;uuoc<+}IN*vw9^DNBFEqVxB9DV+ZtuQ8DXQ!hiyO3cp|1?x1~AE3%+u-mC& zjz9nm>($_%o`SdZG01QN0MZR1>GSAT^*PZRJqA56=cqwJNTD(2>~QgMOg_-lK4LQ86aTWeeRL> zx{IU5FiQ!*IzkFMN6K(jM1(z;vRgLyXC$cz^dK!t0tw6mI1kB?n!}&YS)8k|O4eH> z^(ZEoftOvx$p*;euX5H5bZw}rL!e3vA(8Y@Ro->cHH&3jn-RtYd1Nhd;p6IbLRySG zDW9iCP&x|(16HgG(h^+cDRcFRY_NMxpiw|bhbEI886}aW*ag$Nd~JlCg$Sev`VGYv zJynCEC1rzkNCun23@8x(&rL|jRCm5x`2DyDodrpTmO>RBri2Em6ifSP10~eQWe@*( zT=Gs&v8qUHy~L44Q2|acc!HCQFjvPo1h>|>)RM14=7Nv_!n#bJ$9(|alEQe8A`ik^ zlvC`7GLUz+eHCu|1Xg`;zKD%N>c4n`^E*240@q@nmf;*Q3HJ&SFw=+ z#ZuhJ#kS4C5!y3k%~MQV*IjGtEOo0DHJ=mTTQ=AXb3>QAw!R1ZfAAZDlYMo`3OO$; zM{Z)@a{axW7wOwz}lF(JBL9AMJXRxnJRv}f!!nY}n#y`_KexImAgVqC-Iunp|=KvK6 zVON|XLV{+Q-uDhypTD9;Dp|2(3;k@r7HWy*d*hwA|aI zF8ZOaX2NdS&;quqsgGQ%+71hiOsP;-mDhCr^WLPGtbcTeK_ij6h}Ut5M+a_C53bZA znORLu_pl;b#3&6y9pUvuwCW7Xlsp1zdFOfT52R?GqQ)$%0lq>bS_!gA*XS0mnBQTn zK99TRInFGscVmLapov9a<*)p!Qv6NVBAXan(}*nG+t;i_nQn1(8-@UVscK$R%ggcM zyuCF6Jpaj4wi?qTjGUm&ef$X{qO76axCemzFr%N(zmUgSuo;z_Dbj+fJ~a8iHjh7M zspw7w#$U^?zpXyck54`bo&ss5xOvlWy=JckmSd0Z81)7dSp-lgoEB<5t0QzH-Datb zt%!kGa~Q*Q60}R9%N`p$)f{l4!F;@SQ+au<6?BEf#2Wzphas8D(GV^9`li_^Q=z$o zV8z6)U+~g{$Gipd=hM&T&++>Yb)3^0mfgnJIy!iXOFQH>NTf05j0pObOm}FkVt>4V zx&);R%3t^B+&So1Ja}!g66Z_=5c>5X(U1`V?=^gUq7KrEc=nXg8Qv^T2$wX)p&|Mj zWIt*-goA!XRO1vbWZOK_$+eY){akwvn|H5CKQNa~+S^*wswz?2kf$0OF}!#0gqdyg zxjBJ0IpnP^H{0B)(gu4L#k?+jh%z$v|A@4)4s#d3t*@nRh}E0+LBArkEtv8Y7!{AU zk_dvgUEMowRR940ex2%;{~-+3{%Q+Xsoxr%*NYwIY}RY9`8m^{O{AM^p$ zXsH1rxbfk5aeHhLGHL_5r)szJPa- zzo@t~c;w0fg2Z3=_>cpWO_nfk>jr+X45bU&aKbMQZNXNe60Eq*76eXa8T$t-UsU9h z6BVs0O$~QmgPzmou*5%lKkOb``8<7B=iZk81izSPsFwe*yiDKOxxip8X&}>>D}_8|K1aDUg`75RNw$z z2*3Bfy*RaF*&_*Z)Kx-u0(#0$Fgcg0>xRNe;J6`!$NCrBmZ+UpE?&11B{^Hr@C2l( zIzMu!?mB6#ALqnfMkvWzRt3ITS0E5i2T|6-(4PIoFPvkWU|zIo>A5h*JgAn<9=CiA zZAfIkb8qRtQ)RRAcwaXwZyUl~*5jVv?8WwM%9QZxU*=NR~iNI_$Lg(j3W@=U+Fd2a~`D;k6nv8L_RR$ZFYOEmR z@S_Tt%R3iMC$zeS;7=2 z!bLQ+v0p`3ZQe7-cVKlU4*4$`o<04Z906>|*a_M{_V@oM)IuLo`Omgf8*LcoEMR zK_}|3_)^9LUPtSEQ66p*$uLs{5u~{w^A_RhOa&LFQzw=Xi-#9ri!=QuY~H1@ijN31 zmmZF6S?*0(<}XetBrQ1t9fR#z%((0?$ZSHNuGY^m1)YAWAxDO1Z#Y8sS0hW*2rZO?qalO@I~zo9YixN z;w3#z{-0?LPd=AeR})vkt5lO2I20OIRw{ zY!9v;P@d=vf{oTTdUtV3c3uhmZ?Kp`J15= zVemMzf(h+lgn4gpj&}<& zr7(7aJ+m%{016hCSOC4lOmIL{v^qrMLCQN5Ui@}z8=7Ij($j3zvKu9t4ABo-Uj|&K za~*#kw$uEnJZ!vj-SgrlOt96LKpLn)YHm+XN(8AB29hIwXiT~XZD!W-@p(;c1FDen zQg0V^+aG|(y+jUC(H$@9L=l*6{AW*(X0uSPD%t=|!c?cCp98|%i7O<(8>E&iS}#Dm zl9`%`1BG@d#xKVdzZ6TpTZ_DYeTR2TxJX6UqY@s$5*eYAW+!klMC|xzoE@wM_MuPk zyPrPHL)6fiGw+uoX?wrkFI_|bD%~$pe8iq)M0=}yfS^}Z<8vTB7YRUxshaX1G(F$q{dEH{$FOE1RCvZ zJ*4QE$mjXEU0By85DEBr}Y7TM_; zbOy|bVmPYMhX`_g05OJy^t#^O5zrFvEnI(ZIZ?%Y7pZ*PapQq4&Wg4fJ)B@OaYXZP zt{G+r5$u#kfJpjdwreP&r5330NJH!Q-j`wxr!A0+yY)V2@ zF|51-9`f9WzzGmqDM4PGq(6uO;5$h0V5pYmj4N|*z_#?5s<=msZR9+7EA~Rm3oy`C za{5t5ENXv9Y(jjE#&V-k>#>LtAEl%1VRNF#vMs%;LCQ_04r?8Z)%Etf`W64ZF0Mzg zHEozM+{Q9D0p=pDN2G35R-4^uGi+xf(couo%U$qQ*on<{UtGvbKCHq+&29k98YO-R zA~&U9*3j@&%c{7UGV#ydg~(MH;%$xSw{)C*9Z-_)ut#hhYJ-~$0 z&li-GiG1{!=u@9kP2NltnlERQIv-j6QJsW1l6G_4;juWN!Qok1KsGuZO$8r}d(jI; zlkJ~OiLU3R3g}sVY(t=i9YTWLm{7uWu)76N?w6M>3vMxGve^kgSxkZ5 z8~Md^CqSyg5bLk+S_pRIJ_UA89S}$H5-($o_=%aYu6~JE6t>yqL^m|=dO?%E4S1nC z_7c!QE@B^yZ^-bG;(9Gp6#;6RJbieNY`t?`s{x2OG#LM_Q$%;byv%G3r`!NP5#S2}jLwzXd&4n*4H=R^1{sFEX^zy=@b^#I2{mhu9N0iqo#o zsK`c2F^>hS;Q3k4`Iz$bvKyL3&JPT52zyzW6l4|iqy+Nd;X~&YFDu-IlU1xXQGtQ? z{P}>;UXy$E@&wlkv{FjphW3knI-5SqEz`)2RrSV=4XmMYQM7>aF^*c2?W+{~7m<0) z3UN0T8v*U#YX&L@@#}tRe1+BrEVz0pF2lL=c7+SEU|#TF9HqCAXdmQ=4pa8t=^KoJ z3XM;Ne|^5JN8{qyl)6!iw&0%z9fks4R6)*U?1x)h*@TpgQ;#OlhnQN$giYC_ne@q` z9NKJM_pjgU(>~UTOcxTiUaZ&E(so$AnS~oZ8^u5&%1B}QqS8-W`!fnbyEkSXN<LdA#Xz(TBR?7;klYy-fi5D5h$Tn@8g~eQR6R$Zbe53vJO_WH}bm4 znQjl)!nK#%#y+ZItKgxpcGLI?r>|GoLNdj>uJ;a|_Bnt|ogzG1k-<2l8^H|XoRssE z;uUN>1r4I$STixfM!CVy*|*(r<2D)xSst2BU^0XVxT}N6?vEyx{`elf30w}hioGTT zCp(oQpUczz1+=HR@d!KZ$DPscISGf?e5MH10psb`Kp~aPtqz^YeOZ1rWP^ZV1Kn9> zf<9|?MZ1~6uKTCA?x+jdowbJY#4&&6!*ZK{Iq~&*J(Qp792ut-e=dEtjLP@^KXMGf4 zY}ki2lFI?MPH)~X>Z|jAtIR8u%S$(Ki7n(MD_$Pcjh;|B_Af2jCN-8XY3MY#-N2*G zv_1-Po*hG_3-vQl7d@cJXG=IBVGYoj0l_L+^(Zq>f;bjJUNrKB+fnt)*0K{r4OcLi z)7krAi!tzZp=Vh!CrZ=P=q9{`?K4g7PQeXV z-H(&8E|xIxRr<&ZE<7B5pUyx{{0)LbZEI2s83pnD-~wZ|2KwZ-4So0h0()ObkAzAKf+>X%6W_E8LE0#s)x&Z zOyR_>0QZfYIV%q7^EUC>^L(C;>910vpPmkFU#p zY=>ieysdod?8T^*Dil>zD|Qv&KEbB;N7e}{~o+@ zq>hcqLHM05u+K19>i`;hse^`NsFvJkO}KA0nStPdXuv{rGG_#%L9r=jAcw>&&z4z> z(BVxOX5yPqqc|Zei+DuSyJBD?C@j*<0!+Rrk*fgK56%y?+qT%@`%8f6=A-UPN>4i= zr1Q2k5U={QJ`=^%UIx&Jr8=mmxI2py!%YcYe_X}?npy2V&F8Edg8#XmSHwo&uSpR~ za7oXUk9oNTs?69WfFeNPR(s@ zUej)PzH={_z8Y-^V0y1z-vVao6<1jCY0HF}@c`^CZ;z54{6v}3vl?VcFN1TQ^A08Z zF5)sVDu=xUDoMb0lfeW}`5JRzCemJo;_*3Dbp(D(j-XSREfqVwunjU5{`Dtdic)}v z7ll$No#XnhwS@IJ1=1!5ksUj7Sz8D~Fq}GbHoW9%SEV$VJlZxg=x|VkY65VUVR`v5 zDZ)nU5YqunC1jnFaP`y!A+!*E9?9V|HI-TkcKuC1H8d(oYpXj55=O3N)uA7o7olHI~Zi zO{LV9Urbs2$SvM%n;o)arAVNT5qZX2cDc1f@v-F}O0tPBS!AbEG_hrzS0(I<=#eq< zRNP#VJ0#g@Dn>ZyU=T2A9jNe&nnbJgs2_Sdw>1kBp)NO ztWd|J$3%|B9`J7&W!_t=KbXIM5~)g6mJCJl61b)3SIrBNe{_}! z1}FZ&G5JNtu`OOYH;$SAUet_mPuTmvbpES0%oecY0u@jrA8dZy5YrZ*cCpv9U9=K+ zFTOw%Uk)zS=E5pd91tyQ7CV#*de!D#Rzi}p{|84Xm;#N%oi(IG z?YKWL>d*0xq{B#=LO#dU2maI~bF%0($ z`tjo3_ksNBn>}6_wm=XtO~?M}wMwU;EAW$fKErn1Q$Z`H)zXu`ccSkC0O3kwEkoY1 zXE})3^QY3~YK%+J2$K0U51Wc5xERdj6>zay{t5*7)6iL@l=c?en>uwJDpxRA3(m%f zzax(uk9drt+#@}RU`Pz8^4C6Is?F-dGg}Y^fwM1yfhk+0jvoqy>HyIHLa9%T`C$_S zpv2`#A3K`apOzQ82_^%Z~gUe1F7w4n?d%IN8DMG#!+AQDG(=;|X>Mf9)@ z-fdfGCY6S#`zSZK;%|Ih6czo-pwP*_63Qcih7&MP^N4DNG+4=OuPi7LPhAi)n!E~s zCA+83Ko>OTAO&w}8*0Tn=U;e1X6QE@u7K0VVHGP~oGLnQZ>b^or3gjWBY=wxd!hmR zfJ1Jei9--Cr=o7AE#?zLIffXh4z4ing4U8&vI%Hooe*;Bz0{}JZaz{%W|;f_Z*;J! zDY;6vQd-R(Q_Wex<~FqlO_Ybd%?9L*45$n?axd(0cIMszwylEviZ3#s=B!4EMd4Im zK_GQXF5=OH7q_pcn97+pp=waHA?pDKr5I_w-*XOLl`fbGuDRp z=my&LKyV1K0ik697h(?@HQFd3+tgIH-l!?49O&@!+bbOQGDx@=C?@8ubCymUb=qAM(hMPWbLowNSJh})l1yYqw86;Y(Baa?|1B7y^{ zz&DELnpovGm^>r_p=|(hW-+M8(f{Bv;1Rmb_=XC2cp=(PQ>x10Fosc;L|y6~sRFwD%N7kE8ZE&rdKVtaB3F_`u|9sp={20 zYOGyGo3<|3HFXg>hg*RAqw&QNTl*C$XRtY#Yr z@rzCj;uyHjj+TcX6VFVtFh6!Om0uMJ-4DO_4y?6LCxcV>V}uJ-OwZW~Njm0vEJ=Q_o zP~!R!4N|AowcEeWWj$_Uq$uW*>_B`=2)=30SE=yFKfF_pw0A?Kkv&t_VJbczt@L=? z*4+9B+mwTa`M#3&q?}}WDC&MdSUSqP!>{;PUx0g7!Gf62fS10u(O?i zwc+od{at;iUz{VW5u0@p2*B-%C@a~@7SfmvH4rjgLCU{U;D5@dNoSM}ix&}?1Q^C` zgfvc+UKj8>ehW_O=nAw1pc3=dv|=}3Zj{s;G2GA@8%+F0G0CuXFmiPG=T|4c)x!?% zO&(}gl=S6c+O%-Tghz(AL%UmBT=p zPWtIiyW^cB@0%HHpnSE?pgMQTn|hosio*kcG{3?D@@2} zEhoe+Kysv{f{@={@_;d!EajMrK_nOtqV@3o17i0Q_L$|aAwKX5sKw{5C-y%VFDv2dwqW248|H$Kk+GF}i$HwIalyv}Gl7Qun9;x^<|h@^ zfp3dDR)@|pIf`3e1NDxF(z&8hBQPH0ne`Qmoz(5=@oJ*UDsO4_!GuTt5{5P)hBcyz zGDJGopxsqG*QATDi6zD^UYuS=0y)xW!7|}|Gh8dcX%y4j4x%{+RLt7SHRKB>gthD% zA782wx-J?3mhvM!D8y7N2rOL3SVnNT%p!d1z`^Yo44f4_u}0u~Dh&iJ-M2oV-a7J`>d>E|8A7 z(j;}fZwU*rtYuc`!C?#|)%k(kO(JtXJF;Y#YE>_=y15>;2zEAbaV#=a^HR%lrwK*S z3k=W*i8rv;?I}0MCI4w~0SY{mzDjrUOj8aHuv7j0&sd`n4dDamfO5_xCIWv^aqj#X z0vu$6O*sW|4ku@DzDs~v#0DwMNkOpb#aKed6l^|fFj@VJXADOC3OAOoO)i?jW#U(j z9&iE*rX8^q)BupKXc?%xDM=s)#hAvsoAQKmFGr3SoB;vFTz1-T>hktlndQ@-aR?Db zD0yFiD&H{?|NS-p<+J|FTM|gVywlcMetaFV)>%drLPip#^I7?;xn+g;6ub)p#a>EN&3& zM(J=s?>_5l8zW5a3x^4b-cu#l-YNoaZl;~=X+)7Z3pHOAR!p!<@c z_4I-6b}7aZn!9~$5565NeUhyVzjlwfevDo+anos`Dm7#BG3qj2ROadSha-l+KGGob zkR zO6gAuRK!9%nFt4???=FDjUhCN&6S{>0 z8SE^r(mJu!0Kw(zDDK#RirEl`twhx7$^3$RJI_gyrNiOL?U;_BdNCUm%aRUaQ+ZZm(Yc2iYp z@NO++G94I7FzkyejrbnKZX}c3Fe#oSzQCBryCV(+U&0ZT8V;{mc=>a7q;BAa^;GiJ zQcAGiCBDG1B&rKyy}E+bTadVLX%9Y{*CP$to|r4j^k;9m(c zxpdUP1WIBwqgH!D4uDiT*8|i2H%y7R21vE09d`m}MNVZi$;R?+xb3)b{;{WxcPKr! zqZV4#d&V|Ie3Ul@WWZrsWlSG+T%B@NKlAq!XO+7ac>{=7TU(Gk3D9YUt>l zFNbL$^8c|~-Tn{XReFU5*z?ITnBQ!dBz>6?=K#F(bVwd8)A|(TqIbIbDX<(CD!7F-R;jH)Q3;%jAZisfE8c%4-&qsG z&1ud-L9tCXLfH4SvbiB->T!8pGu*I;h~1LOH^n!-KrtSI)L z)%4nFhs2=8BrO0-K(xO^u?vSh@Nfv*L_jUtAociBTWECaSQ3Jdt3D*Z>@C89fC+-C zO{}PEf$slF4E7N-T`~+X4jy4|H&BonHo|T$cm?L=GriMmtfXzngNTNr%dA{4H_ZXO zGA#xYa_RD`l^2l|z`?YhzuuJ^J8tM)HAs#wuqSLq|Je01d!p&ky8FROaCj>>n5gKET_*Y?I~QO?Go7y?mfkj)8^cW!ZYsfL;QL8JQ&>T8-3xY*K0g z^vg7-kH^RAEulv!v1J2r$oq|X?Iv$FHp=`ye*l8TooXZYfC$|0RrnFKaJfP*3V0Is zg~2~fGrB*+tB{(|j-FWy5MN?&=@IZ7FZrQ|Hg>40RjvTcbgYmA9AP}HKS^#doJkOI z!W5qgbogeb+30L6E`H4ODEYN!;?K%aW>eL$v zlzDnt1wA1Q5}CB>xT1Fl;j^NxHEP4`xy!1ws7HyK3WJ|I905#!Q6Z zi6p2eoD0iU_{6R)}x=59dak~|TPLzwJdg!GY7^WjROM9%e4+o%CWNjN<`DzqJ&A{CLJ zgJPEEIfKbbiR(w7;7h|=hD?|ya#wH4YSHPtD)Qg5cc&9JcGk&IWj!=xA#s_MG#%qT zQWK$H;#N~xz)7&M;$?$%id%0}grdgp6%B7_GZDi&gfdH{G|QE6g#ykrr!LCMR<7&; zEzEtxu_I|<@fd?DV~Pka0m-g&?1+E@1p%xo!5Lab(tkPGIvFL&-tpHl0u;Kb?JC#Q z3#3GvJ_cZ;5Co+>gr_Ehv`}->M1$XfMYv~FX+&l{L6<5SZLn+PSOIHKsM1JoKr?bU>@UVr|vjS@a!e6F$b7HsiPU+j_9PW{|D%tg;FX9?2!zmZ{g&(dW%)GcRtg~EP zflypXH}^udxzW?!G?s>pc^nljB8kQE#ZR3Zl{&MGkOnuDevfE721ix(E5dM9uFBz7 zpwxQmCrG1kUdLb5GrQ)K+AjDb&=;RwV|K!V!M^$;RIyyA>v68-3x#G&&GS--eZ&mB zO%I^xXp%!nfmFn%D!<}&3RtSUV*3fy;5PI=86gf0H>QE&kAd)bS(mC*!NptQ-+&w> zoS;xAgcg%T44tMS%a;Fo5ZKeCVZRMqh{f*{O*wfXucPWKM^S@R_9ei{C>{=jW-UrL zaO^6iPAdn3MR36F!#DBZm%4X<2WE}HY!BRs?@Ut!vYcXrCL<}$n_z@26}G!{jBY&t zXk6GyrY82WW~a^KT*Uj3cs~WG?0awWr?d*rFq&wegY1cXSWE$>TrJJmQgET&=2t2C zjDZR;nmC~HLRj% zn4inW)G{MPi2c5D&Y`Z{P<2C@%VOUZx*E*1Ll4pSqi)mniJ$bw*0`=&JAA4)s%;;zbsbt*E@5JTM7O-yrs-yJ{< zv5-&#v}|SYmCljSo16EBj$tNH688)Uj$h!|oCD(I>!6c9BEG|1OO0uk4Zsu_DV4c9 z!JV9uX1uj$R`iFS7J$ChZ&Fk{#1IixU|qVLA(|W3Z-Z0_k}#ux+>?76$~5TePkyLG zZiDV$>@FiEaW>f-#82^7&uZLyj-3}xI4X^VlqCCeG`?gqhmyROJovD9rxZHsEC+NJrK6SDM0r7%Z79PC881&j>LR|fg z1SBLEbi1?llO02n(sm_2d?K0Ar%#@%aXqZC?9t5OvJy8AK`9$Cu~~6 zCJ6DGGzX}DGXWp66kQ>H%&Q9>_13;m!)JUiaU^cX8-X@=ows=~PSdXr1bn%(Y+H7u zaoK5MK_-re926osQI{hB3)aG`omXYeD0{PrW2h(@+C&Iu{3S1Un>(pG1I7?~^SlHJ z9yo^H%_}&Ql_E#SxOT6VHBvSm&=ku9_X=L-;wO1%{mr7`QKRSTV`&O4A=ea#L_$k} zm9bSV z@V_R7C68r%>;-yiZ4fH(0;uO=q>JlS`N<*XtmU^DYD}yd-PI)zn-ny@-QV7jyu=67YB~nTKNS$m3L-Ym*Gxs5_7`Xo^jh?@AXz``2=rrl`>?qT zd9KeM3foswS;Dqk7=3HH#w(3ji@YYDb9zX;r9lOhONt_aQX8313cHoVpzZqy%l6coC5hg8Sbq=#9q75g9b z{%s7}$w?m6F4n9DUtTBe_5tH?Sd1V>8Zn#Xnjc%c5qNuJ_KV`=XUr?Pw^GURr5AdvnfugGr(wnZcW!@Nx+&y5C~2OC)hhC5*p2$A}i^I z0q}JzpFs%2$&}>e1fkuVFF0$EG=dqhoHi^qE>m;k%@2;rJD-*+7hwW=MwQE;!vSTZ zR4*6X(#aN9^*d}RwzuhrTtA&`*+Nluq>U5y+6lfG8aCw*_MzAoya^BIhT3Y>eH+B_ ztl{9SN^#e5Jry72tSZ`@sej3jojb%4R}Yb>)h2A1OJvXca+c9A0vTVcu0C&TbWBH# zJLzE$G?toyS@2;Gv{oU>!qWpJOEF=vKwk#L`!U$%*5-BlZ1yOc%9@fw@a336X zcx7{vqftaHblPY!C5gb~>Jm)-Vm=)=em)%Yhr(85ax4jrlyeH z7qOb^ib^^tWgSK)OsYfYXYN2UO6+%-%;r5)1QQ4l^Ql_uH>D4x zx04@L!51s8HtMa38e^CgM>@3J1&l1o{Rd00bAVG8B|k%u1A^j&@Y6ZEzw3OTNR;MM`at9@py((w z)XY}=>yCAmgCEiNoO0C6^hMx10Mr$*!h7G`G@5Y*py45DCWI+X+z8-`Z8u zfII>ib!j~wdhz>~#|b%8VH;5tCOorP`GOcyumGrKD{YsqORD+2GVOUdKmgK$_p1|` zIMH(S{OOKi$3f-7LN_wRRI50r8kL&%s^r4&vuU=twVD@qt|M=jl_N@fx6kH%3P6+^ z=K~>_Hvg5<=cK97yEkgrCm*=Tt|SFG)B;bZdWLm&5P_xm+=&Np_<75HX=&58K>s$Eyl=K>>325PrM_K2&_4Qq#y&Ecml z>aAFJg95CR8*vaO@sQeubZb@PgP3he_OlRL4p=?UmHbn`^NB_b0!%joNLW!`8vQ>< zY0ly4WySWZg@BkWfSRLpZi7CsvX9K1U(R)$@waxX>N85Dqt^jwA4$rWBRXDF>GwfV zj5xX;SOPtT=$$8yqrnGhD?@f|C2v&9u|dzM;?-g~+D>U58A{7(sEG{;jiS&pL|H<5 z27Y9N9EHS!szQ8iN(!}+>!#GeYu#nD|3TN`&t3whh!qq#!dyUBaw(@$dbDh)T&|sx z6fVO>+FAn$MD5nh@?eW&HZ-zRwLSZW`A=6b>fnGXsyTig;vYT^V7BN_l9RV8rsv(3 zq!sY*(mL~};+=ej4t=e)$z98kz!bpxP!S-}TU*r1&9Xt!f`jr^VW=!A35)kAb~zX( z5{w+N`6SE4uv?RlhsoL@O5+H?=KSzaQCiYtHz1y$E)%0OV7ACgg267qM@i62mx;u? zAj@yFILUkaXfo62{oQ+6Lz;kd)9*E2?@So)$7G^>;|HJ|t$R*<@y$YUUM?YPv(U)# z)aogX;3k<5RON~yU!9BPI`XfH+1WNSTH6Af+`7NHlI%XU$mfFAph$W;1zA90SY=X| z05f1n3=4K_L3#>Fguu}<}c zA&I90e=>l8O}c*x<(nfysL`(EF`~t6BZ}n2zJN5Lt_kwz2+rWn%nEg2WxZ0RhW>o_zGfZFyO#- zgFTUj#++z5?Kp0Rq3~>-UV9_thbhiMkf&;PxrwN92F>VbBSLa|DH~_9%q{794#ccvBAp7p~9CAk2cBLT?7gg#_H0E&isa+uf}N zQ2*O)K)S?IxqgN`4EkMc`_sOIJ4(E4#z^$@S7b^p+EkTGkDb}az{2Udz~& zlZx+@aKkerlgE~l%PuP8yR*}k<6=5BaA3iPH>H&_fe+pY$K_>2K=d?f2lAzorZ3_2 zxkC_^L6I9C<8#-Fsa?8TmQ@l{rIYo^A;B?9du`K(DKFw$4{-g|-ZJ%@8f}=6r7L1e zIsJwOqDH#m!QSn?Yio{3_whtDOO`;=KBv48CZ`;dVA$o`2U2Yl;90bb1Drb1X{4Z= zXUjjgt}8?9yv?aC!FV3XUpuemdxXF%yE;8>O3+-et+=2ZgTCmpaoZA<^>VJ`3;PsE zPl-BuQ(cien8??sZA2tBD>9iqo`xF8BBf5qZ{5k@>Vy0ihJlRr8WyKUYS*3lYbGwt z%-1~@dn{t)24w~mWv%`e$abt#Pzh-KsFOEix-WI&u1bq_>NJGC1}7!N5^EVeDvaVH z^~jq_Hk2){dUBfF{lpoFRu$t~+d|2SL?$W_WtH0+?neADL3}rD%piYs-nM=2`3!y& zXl<-7zVB4tb^0U$juxHyb&IeCh)N2a@p;rvzKQ13mHx%F=R)u#m^iUp}j5WofaIgD1>A`y!DJsGSj3Gavp!#)=|;^*)Quv9lDd5L+)t2t4ZKOqFdTOL!hsvmNe1 z)Wk@8URR9T$JP*Eb5j2~rjO7VK&Ea*Jiaz8J`$m3)L;3^l1*(#g~{%0M*%e%EqIYd zVz?@X9`+oFSB7q}z3{g_W$*Kk__`I~nV;DM3+1#F>k*@E~B1$QZB?BJrG`dWjl zCO%Du)aqdUvgLrvk*I8!hzO+Dwyqy1h|y$*qp7WKu&wVx#3K*4PPPE2k}CyI>>bAeua9^l0)B^h_fG zD66{7QV1|$QoOMClOWav%19PJ-VRR%q4>?y`qA(_S%FBgU#%7y3&YLZNVloblaeeC zM%c~@*ZWNxZ&|_VzLipph?%A#C$}n{Eo0W-+sUi@)i)fg=q+R9L4qFIdc5oB!EY)s zMI%BJMMY*leq3}22u+Pp8o+z$!|{dX5U~s?*NYn&4I#**(=d#EveKdte*83mKDkm~ z^?bg{%{sUzf_#*U?85PzoE&c~$fgDqclv04vCvX1zWgC)tYbVvr7KF+{kJhv zRhc1T;^ z=E24P!Y|Nzo8Zz7rd}(9zOl*p=$J4O;wr(HwM(Uv1`j^f5tLqwf{k@N7_*y> zi~h4D?Z;$c_1SApi(BHqFFVlnlqyTkoKW#;jcmna%GH%kSbTa&%7ZT^MoMo~7 z(`c*2lD93P1<|XFzb>wEjjOMHo9!d(cTj9Q1|g2nT$rU4F*9n<{$L{ zCJ7<+ZAYs6!(?E6(b~+g0+CV+%G)F$pObK3&_K~Q=gVY$e}7oXSBqHSfx?-DxGOrU z0`Ow^bJU<1fIMxu&h^lz*_l9tEm_Ja05-m+iK4`=uOi-ZJqt%mCu~{)!$xv&9#|ZQh}iiAYJ!I@@8^#dhf7@7r`Lqzx(1A6rg%Nthv~ z*hU}+*3_QkED>5Itw*#Uuh3bgahmSag%Mkjg;PisgD7A?m%XAA?gi_>QUZI`4q148 zZb}%0h-@P7m*EJ}r!Km()GIqa);n?N#5y}Du+9}WOJhDc_nIMrB*G9MBW8bpAD7}A zu!3PsKllbV#$}jdztBM&puC4khGA)R3M+;i)sY)kz;C96GQn~HSLZ^55%+(JJ z#8-f9v^ z({w8K)g(<>J2e2Y&Z&%POeyHr5 zv~AMBoI~b0jqiz&u;Zwiwz8BlFMTHPw`tcd?St-#i-H44O3V%`sXyTsrO#6LPYr`5 zgHv8x`9;6oy_t<}`0KXpi29lbDP8~r+$sMIO`8;H7qQK&vh790l*rUa^IOjt#X@RalkZS#mMQC&v z1u}$ac{+qIs*;rVhezGggav{~r*9-p|GnA(4KBMG`nmvcL$7Iosssi&Fsnxw0Hy#5 zd5_UhiUOEz+Qa?UbCKMnt$bwEA#AN?B#>%dA zD+8)!c;ycjjZGkB!0|#-KSlmgEYAE}30kINMThi74nCrv8jS|rD#C>v*nq1yM_jP_ z%s$SLdd8_&1I3+tq8O}%FB_Dnn#I7uz4{<;1Nf*fwvwF4YoM>;NRF9f(kSG-WN(H` z2RMQ0=;;oZ397P3RbNEkIFU&t%}(T=q5^yZ18iCQdtc@N^9(A>S`oBb0X@(+q-Ahq zW@aBVwgF-%vHsl8v30Jhu*#Nkpbkr^d^o>gS6WbDU57=`$%kNFy!J>)3!r{HhCm)C zdEu6l$M{Y_W`s-q*or9&Kr38zfOgbih>#Z!{I@;z4_uT zi*wS=j~?5V8%cqRUN?&b&4}VCE9^}2qJwvOxPa5-ihz2IZrxo2PCjekx<6*;R$gQX zjTL25fT}EDW>wTNFWUXOf}*I86P3l_uWhY$4gaMGI5bAUp+e9QkhuXDOG0SO>6=GW z>nsp*fR-GDb0w(KI)2SkU?DJ8+ow)8K=`4%8cW_xfFK4NAWB#9EyOY^(lgzA zpio-e|Joog;FC=wO@A!yB9l*%3%jp0&Rjl3CRq6(sF{4vQt7eR?jt;k)5 znQ2mcA<6&=zBZMV+th(6Ln-5dupuH+EQuFgATQ0alb3>BbiZrdWkj|0p0L<1^)1)3 zF~j$<;3fiH`BO+7SYmyc14A-%<5*i97Nwttv<;hs$${ z5N1!1T{^Q9sTdY9!su74IE*Aj@iLvT>{@@vYIUq@?%B0q=f><>yK{6|cz`6vPy4$x z8=MoDDIM}VkJB~(yrlU~Acf!zJOc9#7p|;p2_{{x!-c)-anm7@C%)b9E9Q-sN#)SB zI#6q`30&PK)P$%bNf{99SYb)IN;PAe5CkMOk6L74A%U$q=C1JulVLC`ID;8C8qCBr z7!~bZqNRZFL5e*%>TRtQJYU0$2G0H%_?f)CO^;|m@$<(lCQhH`D$N!>teKeJ4flJ5 zVIPFiB;c$5Q|+YthI}m(7CO4 zuTP{P0^tFUV-wr#Zwn!SVIHC3l@cN8GTSF(aT>0i7V(?j_hKC}B`xdZbLkXXm)(N; zk@)?xchGO5fJ?O{mXd#-eUvPxCvoAa*}+jObh9d_rRuB&;JoMz43Y9= zO*uR0cWrPRr6riU50ti})BX%7#yD(v7=?+_1%3)Kn3{8H&n7!nPN123#&$n@hzz^D zd(7JsTCSd(QhMaT93Mx61?oG(U)`9;v6uX#;#|#+2UVettVEEg>6}sWgY=u=^6TV~}3E zI-WBG);8KYSUON`$8zW|KgfE^zDW-wxvOw!5+A~&2p^)LEl7k29H)6Y0r?yy{nG1b z#$7wqGCUvryLKH_Rzn+Z2}z3Jmv;_cWuiiYestS(>s3R7Y<1Pnvz`m^ZbX9!S1u2e z&dCv^`N?{ht2bZy zj)(noDriX73lR|Ey=@}D1mFHn;qnUV{eeTi2-mQvaF3oEGG&L@XgKfgBx+hZf+o@f zSyuQOTM>ym$05qWJ&=kzgv3s?M>|RbS+O>UTR67+>&yET~n7AAJ!WZk)`W z!ug)|TZjW(hD~c!mS_>FxuI{@1}9vE@$nw>u~mV!Ax>$ysfJk2sIDGM&1g@=HB;@) z*P;!dUqpX%! zC41N=e5-OH9_hxQyy`CM+(v5{5C{rb$_RwE&Ks*Z;lT_XaNp|8k*~lLDG|zr-PUBkP8%N<>SS_jf)HX|?^HekX)^Ei1 zn@FR|5io$C@@l$8$fA|;RBjEF7b5m2^ic`J;c{ORce(K+U6yJzt;w}?1$vkdiahy5 zrm{u7UHE&|hQC?TZbS+lLUN6#7BJVP;u;I_?$5u~iGzi6qvee!0~=zgc7t?i*PQs@ zia1)-l@p7AV)1o7-p5fcjtiwYq)^kfn`vNk5f{3Y`$vL?{$iE;lni|vQKG^ZE`7pI z8DVR8QdobZw~IbLt&CMdY$hY1z-sMtW3Onb73%7Vl1v=I>jD!Pkw=!DXGjy$Se$*` zrTGcAe>h`=zE6GyguVUcqTR;|1$|e`vzQkefGGypTdn`v%sviG+F!fy6puCP%GMoI zy1Ygp^wy6S>H2^<4&1Cn%d@ZNW7e51rXjo+TRsIOl_b01S6h8V`$+G@%>fYUL zx0Ibb#@IH;Y3tN`(yB%+g_=T>8e5Q?)0e~XaoF@Bw-ygsGvN6{({8?bFx0y+w6%KX z&Lq-2liN^}_7EEI9C{iWq8k=GBsX_A)Jq>>_4kg~-s&%j1 zWVdHDOG?;ZAB<1Z9r>jlR!q+ct29w9;*c(v5DLt@St1!)CMj zN^p5LA8>soR0Ytyd4E5YgdFYx?nY^zPPaQbj^nIFao2A21lm@!q?0)9GsoIWy?UEx zx>MQHYdZ)yROdO_G}Y$38AKqZa*BBmG(qp0(Zc@f-+_id8tyqYg9y;D{Nui>_B$Ti zwHiQx-VHd;TJG-Xv9iB`&iA_>UdnUT4K;v33Di@43J9fGe}h~fknz1CD03K>IrvNG^b(-Q_-%kZhv7Csm2PwegzsG@RDyN1rn3(8LqlgTWBaD`4SR^r7 zYVySl5K23QSyIFkO<*Jd=>%--Kt_`tw3ydL&l5$U1W$=sp2xc159Oi;(so%a_bcS+ zl3k=Nk=pOa-N^m4zp_~FGgOg131+c=C{3ej=1Lk)<1l@R>)|=Dct)bk$KPs9@_{%_amJZ zeFw_W>-y9m*l#KgBeHrsvfAh3o|{3Ego z84ag!a|AQ+NM{$!I&0}HOOc)}osw-8Nu?OCbfco?`5@b;M#vtU?NeIw;J4pfT7;Bs zNRzgr?p+7qe)X&H0^f7pV-BQ3En05YqNPUm>5+X}L}^8IHK|dymKOQT&b&|i^o;!# zNR5y=_Ay9lE!tOsREZYtr$B1dB9#{Hdmuf!0#c+FrAQ$5FL*?@&r<`YLNrN>_D5Qj z?O!mPZL^k;mJbRPC{VO4G4o>zXc7?-5&1}}(n*|JJ-mVnMRYt2GT-VP0r|bSJ#T3V zg}H$VRD=PthuUwA!D)~o>5#KYuAMXhmP|cl>DqJ7JsgqTaI0r^9mu->E!KKldE2}h zFdUI!1bF|wgI{OrI~ABx)k?p!6@wCkGt11SxRnZr-(tP#R`9nOC_o)`)R8|JYVN+9 zUWi+)6vu0x`zr~%J@P2lDwjN8rvg+&=G5157z1P&EOJF7*XOAL`<40^%&4T6fC2@I z408mLPzKN1oU=Cj#t8S{B!T;Hrr=S^nykI_O6Ba?{Fx3CCS`tG-Y0qb-KTw;Hrc*_ zbJ(0%u&f1PM22<491AL27+maYByb8m{kGf69!vaoEQ1=)kj_A%gs5r@^6 zGczmKHl4@|U^Z_b1|!qXWZPwEXv*wwF72yef9`Oi)$jP4nwo73T?b(O_9U==dn6g0 z0msiX8xJIz$By?MKLd^~YZI+5QM&;PGa=0t*zdf3pOZccwotIw{6T_J{$Zg(_jrkUdn)4tai$ zi;*Eu+0!RT60GAuFUnxodDagU90%CMir5^^HnXsZhw{82r?@8$Y9!ciFkp|`NJ#d_|Ma~0}oEM%CMOKGzp+|>(>$r)X1;=}r{Ft`elz~xS8#>=yczhiKQfEmasQWE=(vA5-LFw zB&b4Zj0)Be8UYep5b5wG)xvYe1&R3t88TZA8HN{JV3CBFCzPC|;EXGxKvBdNL`;k! z`{Fo?q74;Dkpmbf+_k2gX0_0mqKh$}x-`)Q4Q8D2g-g*IWx@#Ks$oUSXP75un4{cb zplI44ODh0)P3}7Hf<1EQc^7Qu?(;6lBX=q9f;)1j z@-A4DJM3MMmAjR9!I|96co$sdj>fwn&K=9UpelDY-UU;++u>dC%N-Bzf?n=g-UYkd z_3$o;%AJjOK`wVL?}9gXH$J=z+T2~>U9jd31Mh+~ckhAT1v_`4cfpyv48ja>QX`UF zpOvr6h8ZA%rUaa(C8*T?SZn9%{RASntyW5Dt#xDF*tivI<=4kRYgqdN%^1+hH)J&s zRc=yRYprduDi3avhA*@-3>62uZPsqM#UijWc=WK8+ix~Z;VGpt9e+vgeg`;f?^hcF zap6-lET!L%d@Fe_=uv8|rL}_IrP-62KDGZ5k*=|3`(+zmRF>Zep``8wy&>iPgDH5V z*&S!Mq1Puvk@85hM9LZ1>ZqfRCZzmV)WM;YsPM{{{Q4V6n}^azl4%L_>sJiuExZbq|!ad zPFrOUSk{~APcoB?q-%5%XLKn?R`w6aA&RogP|6(tDkYiwbI5vWGGy9)CTCuJR)u`V zgU>#No9j<9-fF!+)gU@4B~}8@ue7}wItbg*`ISH`$o)Km3!9SRHd7B+a7vL<97Bg& z%HZDt{0JM;G1_j`hSam|F%;qX<82r+eSd4M{b{q8<$KrNyXkT$)V5s@RCh-?%A>eZ zH=AqqtADaswxwu2(5cP2=T1=KNzmN6ZEIXn=cmLPNO|;v4AF^steZ8O$RiF?#exI| z)qU{>Q5Gt=P{K4um4b>WPoiXLLWUEeh4zN01&LY8Tcb`AR>+4MoG8KMNgJ{rqh!kr zili*I(D4P5mnD}qgxKPcbGx)!m&%DJd6Y;hp*3>AzXp@sPn!ti3pAQ2(Vi-BWd(7Q~^^46HawO;ZUkn;BJa)h7~&mm?mf&V3445 zY)Qa4p-*69s5fAmEV+CcL&p~~toVWgdIis9$>j?cDDamhmoHCjTYQ-U=1UNp8()|N zfw?TXd`VKDDv~XtN)UO}`JxIARf#G!gsC#~uuv(3YJ%de8k9(P!kulZlA zCi}=9(zR>-x_|GG)AIf5w2q-io0PBHq2__*`<6)d{LnnxU(OoYqkRA73EqCRLn0Wm zX(0i-!7jRW6{T&4m!YgGsblDJvl!8Jzp9rBf)$!TzAq_XdxOlm)l0rVE2?s!eImvC6tp`?@jj5lY!vwt znjqLAdxPw;A&@!uuchUCi^!<1)sKYEc4kUJdT9;=sVMXS6!X7s;pe8(!c(xkj*(xvbzLJOzi{|69AYTe~%XpPo}l6kkYaW|>JsV+>1{ zcQ)lgt~#F$a(($QBL4EPpa`fi2#GA{EieQZb3B<3!!-~DO{tH1DdR#Aa6fB^f=@RI zEWlEx#FZrq{KMHJ@eX#>wHhiH7 z>brm81Sxxe(SIQWCrH`-6QnGt6(W)Kk7AE4?xoCQK2F46^g9rV32_J(m$XisPAaF;F!z-N^+n3+0mDjjxpIIhJ^J|n~`a^k?9{P zQR|iVQl{2gYr7Vsf9dl)!QIp~`vqNf&-vb6jF?Fo(m*T2(8{h7a57Dn;n;yJWey3Q z#2L9+_U}Ni$!uUhb(o^&fyo|K_P5*n57h`FxYyR>Ny3d73 zWJ~wAog%0c+0&vtNLUZ~@^8IH>SV+~gz^JQa>FH`wm;e;OW!{Aep_UX{OysyExMo) zw@ySh2btq`OY@9&DEqs$cB!ag9ax$YM-8)BlA346-`1+lVaVS)@g?$Tf5>igkUc|| zmVE}bBWCHZ!VEJ{@s+5da8(hf9fPVwnet6sJ>H+ zZi}2)BV>-(&=$4mPaVb<^?>`wcH(AUm<~&+WXfES9`wiHz|vncG=hIz=te3d%}*ib1FpaVPzq1(#gF>s4eP#3;x|Iz(IVaafF-41 zJ+ep+vq*Cm1&=z}{m8F)ok70*{ZZj~cgP+kdlA`xOCpO)H9VT3A5GA&$Q=J2DAbQy zbVu?lExK<=U4|ISU3&m<3p~Sknf6AAn;)>h z6WrmjB~tbB#IRhSNOh_Xe)kUZ@w$L&Yu)}G=5qg_?yra3Qw}Ie7oy<6Tqu`_ z_^W=;&qwCekHvvqC2a34R_gNm+}o!*^<(wFzDRq5<$OfsjR;69>ZQ}Iw5^|zG?>p}o+K$5?=KX$M| z9@_}j;)26h+;IC1r!`;6Ir6x*QHwf$}~eea~K`#k`>Cb&2cR>vRyTTYkc@*8F9y=b(N1`A!tfL97gRm2iLi8@g_b z_C443GT&L7>{loIb;*9Mi2ycIi~h3Dfg;!!YK|gb_KUblIFap-VhOUv*_t5RE0nFZ zTUeJ`w7*5>*x!NDO%1#*^~)~RIDuRFJJ%(i8E~ytA4=HXr;iD3%JXlKz&B1{Se`Y{ zp3NGqU1`q|WEf+4`m9I=wKtXwHIb8USx1u_L~b-C=^o|NF4UZlpajb-mhsa9EVImG ztfS$AdnR*eQ`!O}+HEXpV@vl3lw|w+Sde66lO&z8t8Y9pG~ zO7u}z>eHxs#yK=;Q;9HnoKzeZ+fM3Jc}h&#*nB^=N5!;r-FPUAqE4MUz3=w>u_zCP z%A%wC`&()P5x>j%fw^lW1z%x>yL5rPrdn#VDV+;sNKO_kKy-A5C{OBVd0U&-14~VVQ+CaU5gXH^Sl-(eh12?+PLZHz`6%PX9DSfT3aSi2Nt<`3CLkA zoSocZ2CWv3cVok~2VTr}+8SLGr%Eg`DaZ%8`@ZknY)v(FtH!DkOq`SjDebr3O~cz_ ze_rRPySZ~QD^iBv-CNu4?(W(WX?J%&Zn;i&zy9j(?(W7a(WkuKy~3*0=Yeg^-d5Yi zms4>l52tzjzm)2wl-|Ve%qIkgJL7rY_oY<0qxFkMo6TBGg6DJeOQCR0ah^w2AxIdv zNiJDRD|+Tm*RomRVvFj+=kRY~PY*Qt>Ms1wJw4EDm9tYGq9$H>pK6;knyvq~QX0*7 z!1EoPsT9XTjX^y8+rnSf;^?9mE z>zKn-;hg!aKjwur(`Ymrtwl3K`z4$*x+$f!d4pWDH^G`;x!XK0948H-W({)nsOa-~ zDQ|)=+zdm_SfxS{pqS1NmUoTdPN5s9KX-SKA1%5{m=j;x;CD9}7glo43Ete%bnA%Y zoOt$~bWYF(bZfktYi+H$lQk@wnVOoK9V$9{%odNH5#a2gvPu?@Z=3urtf9Ou`sVK5 zgT(dKoO4o)a+MGpQl1M@VuCQs7oueHPzrcLXt-esNg`whcXz+dGrE*c9p&!aj3>WZ zDW#Ow)ty=TaeGJ>c(!G^OLuqo9Zw?l7GeXQvxhr${1EY_wFabA(jpQlR;hmt=#;XkKmCqUkAj?2O1I}~rL}IGl&H@8QY!p@ z=Ql!U`7RlD4)aW@xS7#)HOOA$0utwU?(V)L1Td62VC#m}V)dwxxMgW`XX81|_d_3? zVQo8h%#8H#didAhC>a<0B`@%#lv1*!Cocw``*6@*M;v#IwN_cHq~I842fYyJh9J$r zlXA4p1;kN=jdPP*PI*qLf2-DK$dfCkDPKeaXS+RGL#Mi@O$CDA`(VwKEhF zLsE)57FV1AiwUf#0*Q(#gru-xqw)wPaOv#^qw|`FN^y!_dwSDMkp|^pH~WEVX{A1C zmr?1plH2HZCn#mzebl`_?Izo1rLiGH+{+dzf}}tQvZsCv1Oa3a${y}Nuhi#r(q;GD zEUj~NvAps&&UP2|;aC04%iO7|_uXvio2W zS|??9-?tHm@px1>q$b8{oghH6{G1hD!CyDXZdZjgYh6vqq7hZE!USPnnLzqynDPow zmFlNzdYMfVgxSS=Lduh?P19+1DT6XGd1-R$LguLqCfu5FQJOZ}mAc?CnxFYml7Y2) zOEa~XAU!0@s``8~wOF@Km>=9P<&XyVd!rBdW5H}5v&KQ_djbh3~9-9WH5Oo4{@Znn};GPw`_ z^rw?f;!GRw;qAkRkK8`wt6|%>2(jEcEwQx3BC&`tBnf*vC8)N_ttRh8f#*vo@O-&* zgy*lav|uMaDMSXm^8{_4SySGQm7OX(R94=O6Eofp323~X9its4c9y{N<<1m5zlV3Z z7E%MA-#bc38<(t&dZTIHJ8AASSxltaY!*WpPl$;;^9=HZ9ACze(u5XRWOD~5QpNz` z1cw_lSfML41yd6t@?>JNl(&1cwX}j!F{nRs9g+c1v*aqbWXYpsdIAd}I&%G%4PWH? zFWTTnuCH^07P)?`C|4#N%H;Y)fQoWuTH;2obP6@ep8ak{e?{wdMf7h}XQCDX?-z>(>Dts2PSp$kAA zOH4B)GJO;cJv8AuphFBV>PRBfze42xmfQ4NFlG!ok}#!|mg$lylP5|krBsaYN08id zbdg)k-Ex%4J%<;$dyY49w}6ZP?v?{7ci()=F&8;Tkm(P-Hn=e~G$+0(gG25zOT=+Q z98Eo{-0y1L)J*kSBG5W%GIprRG#T$`O&;w~d!X;AWUbgFHR;fh000005Cn4-03aX` z35JCt6fEZ(lGDS300AE)6H`a$C z6rUJYSOu5&=NAk!-ukXdE?TPS;#-^= z`c}T*1Tr+8E-@wx>K*1J=iuMMniMj4bXE&UU^~^YK)AG>XEi8 zc4e3Y!Vf2n)xLDWEPj>~x8hsU5vE{`6^ps{%(xZpPfVd7Ag!|EhtsoPJhwBA?D~U` z{29p3f#E`6cn0F(3i(t(deI zL;AcC0A2R9HGb>|S{X@8&J8LTj3^jfpGiHGeOI@#sM|O@$a=o8PmzrYp=Ja`>Y*Ye zXM%3>;BeI$v2%+0`%~fK*`QEIz+>yE6E3x^q&QXH{dhaa0;O~>kO|+n^+>}9Ho_u1 zH9^~*`0u7U+FPlO@hdl;?CGo#WvO+LI{LWMW{GrVwv9{7d>J{b%#fs9rGST3_%Lg>LvXIIE?2+x@M-iR)p#*15*_(wC}36!BJyazVfgAiR)K zN=^3ORrn=l(g1KWGQnx!M0o3M8l<*`mz|*YANBXbjVX`ha>(~+Xpj{=&%3_*4@x6o zJh3C8aR*#aAZ|3uN0HXWl(atTrM9B8}8~^>|h6y2fePvmVkZD+JM9%!NPaNtwTZP~TmVjM$?*u(G)9sS+cFtvw0G%fAwxy5WXzi!DL6=bQ)h%L&a95elbI(sHb| z&HPAiA&*|nd&a$5&Nb#Y-Y|AqvTM|~E0+f1nDe_|XIoC>U?pikE%!e|EsOWc-3{+TVxwp_O;sVK&qQdin7J?04LCosH^Xn}7g|0H&jp|A( zuwzgYeOW?ml+s#*r~=?f5?9ziIAdF}JhSUH^tOszxy4iQOhxVAMt?C%nPfx66GKWZ zQsH1`Sxd@+`)U!4bF8S?Xl(}i(M`LM(NVH{F3E#zSG|}C7dG72UjZ|WT*{-%hrn1N zPsi_XAjgP3HZxN?_(NZH_(_}&;8!cC16M9cSoGD%h+g*ukes+@nn0kP@mrs|`X;TDQBODcSG0H@Em0J)Q?w96CuQjE zfmPM|8)$q%eJ{r(DpPq{d52F)UDSJjFSVMTykpD+&cQPqY^dnVX|>4`FB>UgYyC2@sLftyVdb#M)17`bA zf9N(KC69S4a=R9(>%g7SunBb~-*FP28ChUSj5$mw<6ojZQo)?ZcVy@nF?_U^7v@PRnL@od4?f(kb&9-I%67d7E6fl=lr%UR4SkZQ}qGf3&q zYzRSt?rT&K31)#G!R^kbGA1fx7Jvz*Zh-|sct`vrsDsi1rK|-YIO3Tso@mgLIr{9N zwfUJxBDW{4%Qaug%qUC1TfdI`qZYLLRHb|MYPpb++TMDU~2FGU@`I>5B_g;*CVVX4J+D$_7*(9YN zepXfhn2h9KqHH(WXCTJji1k?RR`a86mJrO8WXd|wMji7`+T>ut{P?+g{ZrT57}LJ%E9JV3lkF(; z_SCURxMe;P6X=#lHF;4c6ho%zj>xLTV(ZG}jY9o@&QZUZ7{qP)2$)0YQj@x(yVY6P zI#3gn>V6xEk=n}Qx2yYjKJw>_2)v&rzMvk5Xd1AzadV+XoO?KZiiD7#L?#VgN8!_}BU<`kDXvl!LUw6rBdELA{pI1h9kZbp#cWZeS=#i_7R$(9lstwsnUV zQnrES@iv7AlJ~IqX@}c@w2)X;9R9il_B+6|-$UBIOl4ZxNpPf+{Re`1B4ev3i8P!E z@Upf|9Au;fK-y)^vvubyw^w3o%lXReoyDCzZHb@CYF{azehVxj!hxg+`i+h11wZdM3xHsO;d9;Aj4x?KJ)GxY325H#hi(~+%i0`k=g z#j9XlJQ}2WA#2`>D$qEUCBC31DzmP6ODhYpMF;i(vfv%NSABnrfoM4*Xw+dlt8{_< z%qehR5P>4H+r(wHU&wmbh^IY0G8?ya1JnDl2K zfGmg-PtcVpj#$^(3WmHvbv|VoXl|1*Lm}rWU|Oa$Cj{_bKd8kT??sFZLS*=`8IG4J zs)EEoIMS?M-GQz8Q{~lf%2>tjR3fBp!l=e+Q5@=clc@`}nszcIE0%x=^qzQhSz!{81AZta{#_cB!$6LV2th6$D$!pE%KXn>e zgAgnF!>#$0ra)CmZQ0iT_Mit*jr~;~=)-5^`7NwOS|47m*lnNB{-1wKAu81ah?SNB z5pB--lOL(xogzvl6Zk#xP^&7f$L(a{&CY-hRQj3_{CRub8Q^(V8`*6|*;Krv%gPz2 zajVQu$iat`AhX$s0Ks*^7w}F7!LJM4D;PX(us}a%ag7@CBn?n3p0pF4>_8YI%#~=b z-+{2iKI4R~_ob5z5P}54X;n3foAv;lde>?BYD|fZ@C~zdJjobPY?yo^m9D;F>jP>w zAV04g_zKRg5lf&@^9Q-{R+Rgg*a7=l*Ihth#%H!=xE_Ndpwe`y&LZJVlmM9!gSI{c z)PFwiR0@cN`mzohzYN*ZYf=t-PGSQ(SkKw52H6IKdM;DTDf%y@am|cIJAJac0<|-< zF&-VH(DTBX;<-^?<3=id1&Rkm3+;)c%@pu7zb(wjZsyh+wJ&f5>@kfHzAGvljLm$c zv|K=lS_n{Fh*v@OjXIG%=#LTysU>22=6Vx2(!Khmt1zULukInv{l}z;Fp0rookRQh z#hI_TvIA6(`zhEv`G7%p^4e|e=FkXgU6HBOb$;2A?8X?O`UOO0~KB8j#az5*EI=;ZLhQUClK1eZ{hxV|;kEt6lt?>~_%ocdG*sF`WotAAame3?3X&B2=W)?Ix zox)~Sp6)^;K~4Z;jR%ssRnm5{G9+Zi`~MOIdt|>$-;3zrk8+X_(7}g$IytH8i-uye z2L(|_yc?FxjmF=Bm5G#*@Gv1p|C7Bl;aPcRo_}&STv@IU{tjfgZwxn+f?1Kxk+i(X zJ!DlA&)S+U67zMx^P2Pe<#zidKu<3R;<6mZ*DS zpIEP3qgT0xqk@cPNxbD9<`d~T$CzPA4&n!F!8sIUt>;Y8n{wm%H{}$;nsCkyj>w77 zU3P<`o714XJsk}$uUE3ZKuXHuTX8xBG8DlsUYi$xOGE`wfQ_%cGsKA+uMN1qyhK9! z3$E3PDkpAl6_%f&i7MNianKI`m#7$`Er^c2bZE5I$J#CU*-&qVc- z5kcgx?CD@_I%FZ}hFiHH5a28*J)n^d^&cjMAkFYpAf0;4fefT(lEVr)g@l*j9u;bu zAz$nxl2)Q=kKA`}U}f8cVyb|d${mx5e6&N$8nwPr{+;Xiy`>{l1o3CLXh{H&;|Qc- zrbMxE!9dzIfOqDu^reQrI;FRva<;~mTZ{P7WmQa2M)bwOkKH4MI83x-YEe9u`-`H1 zTm6XW!w&9LbyO>au^tn>FxbOLFf+ccz*b4a*vJSDS_BsyKwug*4}552XnVHc5(xVu z{_DcDu}9UC=&Vh)SI>e#9j?QX-5A|~^NJ5+pXB79EN7rpD#I4={e}LB%IC`o4b*xR zLLBn+YsLzIYqb_*{ajaapZC`!0%zggTd~KkWnVf$eaSrK_WylKoXk=mV3fKH7N~FZ z0S2P+ZFM*J`&^@mwq3qi?PNpuUFavtrSGx~+GIC&F=~8M;~RPH)UbDK;Hq8p?KwrI zH}ncJB3x4Yr>otIwErbCJNSVt!_X6T<+KeooUa--*KM%blM!n$Kg%d#5k^(kLsJkV zcs^l;ZZwMvU)Vv3Tp#>fl5h{qlE?BbDYdNATh%NWzGRd(RPvG5UZbwSH94)l?mtDAC>zVJsP`%G7w@U9uE4HU;t0)`OS%aOsz zd(v{lAp%(i6&)x93u24oI_YtQ5Hyan87l!{4;FLI)%m1GlG(>#ri+wlYzv{nq?v0 zlqyRDkg;Z4t7~4=J3>@0QL1b^X~kBu5GisW*S7D!CFDO>i~zHlVZ+C8U3sg!iaaBS z!e{IPEkq|D*gQAD;@Qk=Qebu;CCdRp&fUA==g#!IO1AlqC|dXbP}uw~z2`#+5^EB|rs9}2+o4a-QwhT6u2mc^$scu6sN15M-`*B*8V>X~!`Y8uB} zaOy8+V6cn=KzE+NJpa}iA8~ZNaJWmnE_-Q`WIX62V07S(;Qk|j!68$ntR^@2;Q5IY zr6@QqxWgz!>#1Sowk#c&)L??A)H`e)P2}YKxbjh$Hw}3x(Q3iRTw>JEfJwz@pZ%d& z%zlwC+RWy9(5PrL#IGLcY!aB^JcP}|>1ioR;=r&1Kj0m#cDKJ1HY%z#{be8ZFxw#< z)Zt|Fey<1CCJE7<{Hj0F&OJDxS2&ZI zSFB3V^h56-Kw*gntPhwri~^8k4gOLoK*9dYZWcf^CXFPkq{`KQfZtX)0SpMDQ2h6N?H0nzxGG#NsYfTq=g~XQaD; z&57e)u5RTMNX+HxT~6aMyM+qv2r-!5Hf0+m-M=X$uzk(Gg&eg0LpAC}B{OI1psyOQ z`9s!ONOO9Ev+yrpJVEYJVG6*PG$vWLnPL_2=>VN#VyYHWo?3V!qtc0BmlO8uk^I3$ z5PMykPt?46pA(Pu760vLi_?p;sw|xNHA!bU>=y0hC5{WeA zJSAqH1DMNaR!Rm`{I)nmdejxrC&1Jk<#87t864to4E!vslJWy?MI6`fDfq9vdMX4L z)K*T)HpGQ^{q1Ha9^84anZD8s3;e;8xj%TMrm$U^*Y8$v)->g5dBJTdm3NOAU2zGs z#qyNBHCwO|W$i?6_WQoTp}*S5gBYTs@UP|NPpI!0wkTcMgDzqs?mBmrtUN!Dz5>VY z6doCQviPg}qT+*Wxf*_AF)tn;X9#RSf0g zGaK|PY`a99l_QDK4vyzeVOk(ICZ5igT)SfJ2rjGEbxvVU&r;Pch$zop2U#q_0H(&@ zcMG%n36jwE)EJH-TGEYSWe)7ug?XD^A87Kp7dS&f6&^Q-d~D5(Lgc7V-T zssw{qXzajVBF#TWM+$rXG;qa5!-9ZalYV@d7Q|4{4KqFm4E82AG<1t-bMk~QJ45sX z!p){G+#;z)uVRqlF6*c&UmkJfs1!VN+3F=F%31Y?Ml!<_tJz%E8(WR0KgV45gv@wI z-dhR0o{3>~1HxGsfYXpw;K1%B_h}UARljA}x>*jRfT46Hu31PPGqBa9DMHAkrOszk z%Fj>$ni}TV1V~bxO5GM-DBp0ckeQ{Hh-nub_5x+y4s*7pLFeMP9GOA{43Ur8#Ci|C z$_M`3KQ%m%qRpqxvJ=3sUS!*0slEOoGTeT`#tbUgaU_drmy{WuDHb$ga9ILgyD)$x zp%gmlT_kA8D%?78T3(wg27b_w_JAvt(!bgR#01I*&wGqeg6$|S0^fnPu^U1NhJq=o zP#Uy*-CW9~`L*!0t_2_?2PW|Si;R|7Z$wShqhrcQTvdf!B};@BsCCFLUu0;PLqkwS zI=ItP!u9->GYW9ITF{McCkNzItsP<^z^ag(k=lvf*9!7@OY&tzIO{56Q+SD;L64!= zNDP}|*bci^Jz67Me0oTK(Si}MhlLgKn1c`KhL$_+e_bhhjEV-=g=MS`jn|6|5l8{Q z|CCAM<#dK1`MNQdL|vnhHKo*M_q-Tji12U*AShklv26SCKg6AM+5LwtDJ3-=7k#KW z5FTdAJC2|)s zC1APO;D(eR4(+lX9jj74ehyeo{az5q4w(VLilcA%%9)AOAbnsxESvxG1tXT5$5@8kJ4H#xdLV^Cb>Xd}?_Xy84sX)Jdxa zu6X7y&&;0{P(XpjDcqxOX8hRq2Qy+LbZZClP_D&b7(Rf#AKa4>6gx?V6ZI&E{bbU2RdRXefge5pC~jO z-rqHG%@^-ne=&bY9V5iV3=ieiX|Tn1`b!DuH9oQm~kJ`4vEvCr{M8h}gTXTmONj0*Yz=l~*AQF)uj zoK~CxS7imDL)L$ff!9@!BI14!N0tptnB$Tzr(hC~BN|0pACwUvTL$LA4t)pYH;O|S z`^uDu`2{<~y9`PC69PSb=IX7SV7}7y9F~x_>918Pr6Y=_x4LqQf?to3pD0ZGuM79j zo|tYwk4afIqQb%;v7U}d_Mgiiv-Kmea_C!-xi2A!!^@qzQi2@OMHkX58F}*6m2>;$ zzDPf|0~fyz?ASD3n9U6m%++Yj31W#FTogH4QyG!#F zH)eA2pdrl&IjJWX0-XzJjg_L710;=wFC-NaD-itXTEg@B^4`2cwkfwCwXbp5yt)8( zMHME=VjS!>dCv^~ANNUne9I>f+>BdWiO+DA%Mlk#?QU+O`#eZ+5?X|@#lx30>z8fv zVOE%Uqz0acStWp(ldH2B!mWv+eqIhg3Fq*6;Op&ie81xV!ExOd zkA}|@ww8L9Eo8%#>Pe@IX>zK8FPx7^!KCVFJc@CL=xr4PSsHl}dIby7o%9hTJW5{EdgFd|wC3LV%~4hO#b)QAY) z&2o)y25C4QsOKOw1P`(h1J0}C4(95dIi1^#4?uvR^yf76HMKo5wk$;?u|7M+RT;Ec z{BQ<6VuyZODyBPwZ6ZjZ`xsL5V@Ik8BLZ2zMqFzX$cjfr+m8$w-g&4=B#C)8Bf40g^l0{ylU47Yv-qE-GPGW9Jp#c|XzNk+|E_oH;Fu)*Q3#5W}$c6fp z;cul}>B~xZ4jdbh_)tZDCGK8)B@4as z@SQ((?KpzHd#5V*&e$B)?IqKQX3JZ-ED4)uv0JcctZ7hc`v+pOCk0fB-!o<>(1mD^ zb#$?EgbWzYZ_WyppLCf9wtr)c+{CncH$>V#{p$`EODSh#l8Kn75-^%O8>6!t0})|7 z*k=snirjyEi8*ER5q4@OebLYrdUbOgfc0i1z-Zx%ILE@LqJ}M#?Rs1`(Q0A$Fqi3N$s?kB z#DlDC#OfZR6KQU<0I2=_z?V8P@{nH-IiWM^v}L}$_Hs1xQu)idsbDx=E3Fa1#u+mO zsRHNSX+R+MlWTino2ozZS+wCm^ivw+R}G0b7q4PFEPwK{kYWPYz$4{n@-X_6*~-Le zAM!T(V5~PRj=LJ5xfe$$RMeDoBqc}H^xRQ zMht1DRdtY8vE;~(hkxvagN9h9uO>m4#z;^YB(%XFcF^3!=kJU5+`%7@l|Q){hn3yf ztQ63iBXv}L)Cp#>RM613JSjw8)cVab>(d*mG_J9J3jBQ6lDsyUHon_*FyhdrXqD~A zdF^?+@7Xo-CW-HP{X#1rXYUFxhsur8-FN?-bVVhgZQ@Q?-DEeUH=*xB+HJ|?nTXmU zH|JCY1R^ssr}#!Af{>Tpf8j!+Il4x-VYH-`w_6~sRzX>jR}dNv-AhYB<5aVPDGCKk zfs)zNz;XOfL-G9Bd+cuTLi(&!l=GuAK{<$-tHIj08g4sjc_*}9AQ+{xRrEJ#Zc{B| zuBB_2(9!{qL}o1LQfy3%$bbN#PkbgI_)IZQDgT6LCOj#4so4cI&A{Sg`fFcUSIBOm zIdidoQf~q6ot*(2eLa)iUDAWL!Y_{sN`MkIs?T^*k=5+H&)6lesZ+i-Edl%H|wt8h`An^+_n$8T!D*j0mOoA=Z-T5->HLJP6Z{3`^( zP>HC+5fbigL2T*bUxWNLBWYhj8XPqAhL#pv`lD4Ra7MG#AOM$?fSvd`zQ*YOhCtBj z?pk;eg<*wx)xWl`isA>?ASH6<$a};l_Pu9-&gSB^jDR59rI?Nf2j=qTYUJgkhYYts znNH3Eb9<(Fe`+GvO6v`hMYbeS6Ezs%$Ys4x8Ef7D=S3M&M`@!c%e#`C2_Oi+XeYUC zh~RTk8tm@Xb8pg<-5E4f=-?it$3=T#fLr=Ne4{1>EEUgA`7Bh$wyc1X*hJ!Tx`7cK z)X&+9lF)nrxGEWkv`6eHlLPMerc#@Wg`Tdt7wmB_i;P130qd9Xt z4JNm!=YTHOJ{tzI;tp(lbP^>1p-}o}%n4VwP)vyT*pmpHeoK0Ud**a^p$=;!O_r0e z_uzH7JgPzp*nDste%s7h48@$~!CK^|^(l6)d)66ur|NxQ$AF5wa6X?#eH-nhjEQmq zPQ-N0cQFF=SdeERuI9Sd^LS9Ya=(psb-Ul>`t(jYIFmlp21eP;B6Rw+WWUN7ZAvR( z2zatJ$j^qMpuS$vX``s1ADUNR@~OKC{+S49FtS%*meTVms-l7*I-Ahml>*roF!NK0 z1Xw{Lktnbx63kC1E`TxGdAG#}CChGBS}G(wI3Xyg@=q)TM=-^5vy~QSW6TI`i#~lqkkLXCGn->dZ}9m$t#Do zRw{CGKs2#}>X`;AM?Cnu^Sh8J$in%8V&h4`UG5x%F99T9`wd7)sZ@XNgGE`6|Hs!g zqHchfy4K4IL$#nroaW6kNa(KAo%x?{|2}Oh3*czdCO&K-3J~30V7JeH*M(kx1qUBF zV0!i>DWip`ARh7?F>j-hkh#8?iXcz1Bl6_$h`nwuOJ6k7y8=Y*?)VMGuugO|6-|xs z28=~l7T$P7I`$^a)ZmG>X^Im=Y+S91KcVXHSX}E;23%(AI)4c^#Zp%R)rEk^zf?p< zX&Lp<3nUUyCoFZ>S)vKtv`^p(>^zDr4etw`Vxm`%VY(h7EOeft9C`303LL63UykB% zrF50f>0((7x{>Q7E2F@eY$#c3N>?%LylLiQ&xHch78+nAOBsy&YX9)6DIzKqD+CnI zdb9QCWs7XE*s6lBK)q*sU%k{&`TUU8bzR_$Co%?fMVz(qO)d#L%22Nu_*x)nAtqsv zi4KQo7_9Rc-738ykkB=<-j7gW8B)OJ3xmHI?Ovd&4p1Ybwa6sQGWL0d2p@Q_76{q zJtoumSz6=3Zx5~zoLQu#zmv#2mZ6CcldS@u`Jx}iDEptVj_~7w9LHcx3192^t$23Z z?viAUE=j!$Ej>qWh?&sTbW5pT8r=LKC;X*w3eFrI@2ZXSiU(473-QSaR+tD8d5exR zEq{n_zj_J{zj`_iL(L+Jcsp6b>Mu%5vDJr((krBu07DCDb3IQGyA-~C!hukG$g8Cx zy=4cL%ig+Wii3xCo?P9|-zLEDAs&NXNQ=hq-p6*|oN&a=A;Wy0XXr)8y6~Y^i zCd!hE=bLA9ZKo z1zDqnZbwgSkV9q@^uK-kiG341Xn!f&M#b8oUB05}mUJa;rRy;=9i?{T9APXNva6t00>jXeC(hG`lrvIcz=44U6)|^H+ zE?uc>=u-jB8rJ`9X-F1^DHj^Deb-Nesi_7U3O+#*=V>5nRrB`ocL)F&o9N5>lKn8k z8NB020bhnxP`0tndtN$d!YQg24#$03bddPs271pt;6#>Eqb-}#!ByygC8j!7qpK}}Z*Tv)g_=3I6{@~4WSE(l8;OOrx0|r4Wz zVC-Cd#N%OY=eK8~TA5x#x(jKGXT(uvPnj|IgR%l1Pz_ffxdaeLcctNApj4OK*__|B zDRZ@~oZsj!qCV8v8$F8Q6X=uli+(czd z|6H-rmCyDxia*=bl=g`%`{;r9`%Ri{^5#=5Q7N2Yx+ZU8D%uj*8oG#lPnUnKDjP9l zEU#-SEpM8xE-jB(!>r(y#5_)0aOrgzk-6Pxq&)3wY&sQg6KvmoYe?DUR;YcC7#46` z`rT1m-meEp#ZYklCh|n1k^y|9 zro!{@KunV2Y>`aeVT%64F)nW#uFsA!#aRvNl{>2qHWOaTx6ZT{Xt+x;H;Q)q0?0{v z)p=US_Kn3sae7yZ%F5r1x8}?`fdUr+CLw&n2vP!XO47-)QH%EbATk`_D?puQZGpc) zp#BoDO@dKE#er@Hg6s~2<1(~2ne1c9>v#!NHUNa=?*o2+ddzpU~d;sK=5QSob)@PIegs7{|{7P%|Fyai0B1RB~ zebo?@&`Jg@@$3L0`Ci;r3zv?~V92N(YqDa!pnT2(Y5+G%{#CPiu-NwJ%V$|Eq>OFv zdl{Rr=$f}xR_=ROJ|1=Z_7(_Bq+?lG1i8OHi7-^Yqw!VG`#ZHVV`LxCGcWqe_bjey zo$VT|mKaqC>Ns;Cq-ycmqoYM+p=4iyQIs{G6CP5VogL&^l5K-?Kt%I54yDL#ilVx^ zymB9K210;*e^(I@DRdae3R`mamY0QPkGL(rqRBp-IWB-u!Hppv=HGBie8g0b?U=~> zI8bFWB$hS>tL0Z#^3Rm~2(hlz^pVKn%I5}G{9UXmh|^_)WacD#GccOd>~<>`EAeJ5_tcqj z0X6ImD6z8iE#ZBfG=fWL@Bu1f>8>YU8!0`nL|z$?0h*!KItVwxpKX{m5d*;bNXNiQ za7j1kq~T zR|JsXF>jMY0Lhy*H`vl;RQ_M~J6mv_-E4UrAdJ={CYZi_$!futQn7p&(wCR~_b!|J ziET~(e{HCGg+q$}<$v&G!59^Ir2RZcZB*2fsdj_uQo{gZ#05P)KQZ099 z$r6|j)tEbD)itN!xB!cia_G#sqralkZlaKOtM(H0iLiUEMu@H8iXjGhF{9-Nx{~x4 zUu=6bVd5|3d3g3X3DKHpTx>u>8l*{80a@2sl+>me`y1>oF2Ivj&zcqT(GG`a2gr^V zd-;J)Cf7MmIC*c-m{}~HkfE;}zq`XHY{~ShxVmlm(!7+Z+d;(wXI+f$nz=;F0-l;5 z&p=O>bEAIz>i>oTGD`&Bm0k0(g+7;wR!U~y$3!Y{^4dEq;L+%`=*vDklRivZKvaE+ z4lHzLhd}X9_+~*SGKOWwH`YEV7L^;o@EbkJF?ea4u%ELf){IvKcl6XX6njp_e%7>1 zJKhPDE@prr#o>wvfR7`I zcMv{r&eCTZYL|}FN7Y-IL^AP&IVdw;G|rXz5YiFa7AN1lUy&AEYsU^?<>lFznLw&b6SXM;iie^e{ ztBq%WJT*%;1jh_yJFUKw2R>uxku`2`CmA{Qi|x`gi3Hvj5EX#n0Ts~}yO+T=EG-xH z5(DIEo6!hjJ4DTlYzf7`CI*Rl1dV>Ac83nL-?EZF&dKqtbxX+De)oj@SJXU!BdS-T zr$lLGnKYUxT`A7K@{OK3$>?jbr2pw=&!8JiF?Ca4dS8N;Xm}bQKkgM6M-thzG~wwX zeFaER$D!%|td?1bkVEiu`gQpV_TRDEKWTA4vXjD2rhigmz)Xiqc?x zt|sB%CUn;UV^{L(Ri=iN2wTt=KrmpWD1#Pm(4I+5zRWs zcq{~Fxs+#x+|%x!@sndjckZHy9$FKWFgF+@ivC|IOmqJ@lq%(f4yj~_=d8)36F7zQLJM6|Q%Au&KIGkvDupCvpG%F{AjVy{1+4`BS^vI#^yL%OEAthgO%fe5)yEl@VNZR*3j^51lw^{9 zq>`yCm1xd3kL)V@p$7o?_fVf!jW$t!d9@BjTxZf05NOQDDg*8IB6V)WK$vLaStTw- zDIT$1yUtid?f#Ub%R%y>P(iQrAa5m>@i0`7=u)~fX8&|8qLk1rd`IH?CaoQ=8>Vb+ z)c?Y10rVadUwKQ(o-|*4@0>B`>pB0O{hL|50AklYmFgp6zu}Xz zWsRy*tmp3@J`A?OTJm#ozP=*sR6C}O4;J>DKwMACa0AC-vn&fH#g5NiTkv9QyUHaG z@vP5k0FXd$zwL3PJCp*k?4V$20$b1uq8BxuiU#CGk}0^U?=(ikr4EuYDg~s7LzjiE zHW>cR51Y?V{Jk2`-)Tqa%}>!keHU=&8eYhC@|by8E1D*Gk)*9N*|HmPd2K&k)V)6K zz9lFvctp=JnC$xAimVAqDZoBE?ZP#+-;l|Qn-d`6-iIDVP2i;Xb~;SiwGhvzgiY2x ztED7VB5yq0>4^)Ak%29YP>_Hs#*&+%pjoC4CZlR#u4a+~`M+#!H(3KOKB&Z)sNT%jmCVtuBCxy4}qAej_-UhA$e8G%Z10U*m=a-D?6sHlg{|D(UK&FOv{LtwHy* zwtO~5>HoEF5W)*%!Xk%sAX8xHn<5fzLwNQVP3)zjpY)6!6e>}MvJ`^n*67+@D@dfT z5NQ%sDY?Y~(OmOj#Y^O@h{xj)mE%t4!x6jGkCr`XvlvOMg7S|_tJ^A-)+AhS=wvc5 z09$o43?R!1$PPU-TNUtyL3w35cjah%1OWr%{-;@QQIMtiYlN1fdw_AjqF7fWW;)U9 zQ%Hg`|3O!4R7*c=w+P=&kThVNf+?1GP3ER7z>hYv9ncT27E;-T?|5o1vbC&rVI4PN z>zox$=45CQ7su9z5t*jd-F7#?Svfm=Lvzzy81I_9IC$ctc66luc^Y zio1uZNOV503K?k=6?QcTqIn)6A_>(905^+#?=FnaYedlHBxKxflHCGJocZePn&_{G zrtQrUp;k$zfgSGHx|Qa{BvJ&#GkXnq=ieHH@<1mZYX=S@j5majkQ`s{?Zd&!HC_dL zDEXgdwOS?N%SG-Z0nyKGZwy%FxE)zuARH@F3Ho7nU6NxMR9#)LiS4O*@5OeTuO+}m zt(Fpv;ncx1N1IyMnA(8O+M6(}os*GeuJf{TFRYTM)Qu!h4$qnx1;TG}cq50YA9u9U z5IOosLEAo08eik(Eu3hWFlix|xT{2#8_pf<{0pLXc~&AV9u-fvh>+{a4^VOaW5M#e zQZuFNQn!;cpAU4dj_BATK5rc1@z)XLeiwgbCD>TTcO?kazO0!+UnFDkcL+zk`?QsM!JB~`RUu&ME;t5`( z2k3=LcdVo0vgc&vT$f1sfq-|Ili1DT~z8=uoFFr zdZgwMFV${{|A0+JyT`0620QsGa`$L`teuh8xAxsr@rPne-L^#GKB@zk)Wch!sgV8q zQXsA^hmO0$Ar!Y<=}0y6gXINurKai6-~dOG|6kIq{@i9h+R1pD_+~lfuK@izVxlw# zn34*doGiZ7x{5lKUm$%CkLC%Ll9y*r4N~|yNQrQ0rFcuqv-~JuSWC^}n}bS@j@B2c zs3-s_dIE9X6vNu*pGiP}1&6xwoi*>1s;8!;{&ztv;BWX)@3nxD>Bn3aqjYR>cJB;K zrnCF|Ie67VUr%A!XQ~D3`S(a=G%HeI^8p32=_lqI6jhyyPB|Bk1gLYs$kt`uMdO`5 zYlAk5N1`jGZyQMsQ}zo#Uc=N)$Oh~T%}Tpo2ll)Zhx)-O+Z5vv;99#c&hi@?W~}fc z3qO?2n6O!yxyi1y>sE1tx>-qts}I;5F;*fy{gBkSGiz}4B1cg~vtOK9!OK1Ts5Fy= zQfk2L7Xco);v38|DlBED3q&Yi-V9c!x8Mby5LsB zO8MgfhU*MFAON>bz2`CTHb7;U`>`r~AOxG`l|_VVGftdGCnBD3SH*}WgIiR@+XtGd zv?~FEWWKa@mqdy;msF0tWGFN*^Tw6S?14QLN;X2Nf90pjz|@j}W>JC)fJq%~_S+Em zYiA(+0z}-kIDx3#nc_F9jI+bVG>}EfuXDkOZ5Mg8mFniw;u^daQ~@H39iN{Z9M3WP zPJ*<-NTU*h=?gBEB&UI-y5FSUBUX2#gRw}+5lfFQ0mU3h9!N}t{-Ghc!7^(#N&1vTMOV>soyFOV zpSg%w1>s6V61Bn|yE=3l_}~r@UkSzVdCM(Hx?`qWt;^S8`R0NVXWK^9S9D{5o@S!F(i}zHZ3d{|G;5`mepts;3aeRWi z7w-!Cw<1whYFK6HXH;Ujaz{mLcAo5m{6HXH`U=p*M9~nlAoP(5G=~Yc#?w;UeyPag;whnA z%IZnV{(ZVX4PJ)IAjWImy2Kn!GPra8 z(`7JN8t-gejlX!g(ng6u+b?2-t#_fg+?g%IZsxT8M}6G14G#&Z9TJ@wTTeBdyEULr zK|u6#+xg>o;HI9LO;?FH3+6BGWv5eNjL91b^Y=bXlrFnK`6G$p1I)E2CBUsQA6i$Q zSO>za)>dG@vz?eFl4&7lsFKLTsHQ92-KhhNb@B%=gD8L8qX0XNOFfj(HQG4cb)sZX zMFauhPX=pOKWTbT`%x1HYR)666i_QcKrJ&sacPNI%^lbdm=(=}0(weI=R6LuPY!&^ z9=hI#+?x6y&kgDTfTGSeUJh2WpHKOu0c|Fyomz0%Xq{_n4bDl=tQ`^n>rs5G-lz0j z<2)3~j^kp~vR77Ks}p(-&34dC(yGJu8ot}G?tgpCb)|7#`9{j!77E)xM-~ce>{f1eO{)^InuG0 zzS|rmb&3*7E5<&R8SScl*x6p3Xa~pZX?oL74{wA`jqfPHger+Jo~&9Jw=ua=h)Wvb zn=X#nb_-{C<1nte5l_~@&B=D2H6k%XoNOt`4N7){7*4Sr8W;}rN*`h*tAyZasR`Ad z!+}%s-F2_MfdKph4e}PLv&Bag0tbGH5K3f*s|Z>d--^{2awsvUggQz?x&eNXV@gvF ziz-Jfo%ax%cxi?0gNrYwz?S8`C1I7k{g!0Rj-h1|m$?cGbKNN6=W>9bi4bjULt~*J z!wOiE@Kf&`p_-=?YzNKPTAj^`;?~)hvEg63#p^cH;eS{g^R?D$7H?xsPNNrfVaKl; z64Cy95WE&nsdOQ4?`lAV<<&2Cx9sSb4#Z;W#nV20OnNY&b`m%R`PlxIqqFLEk(h0J>CRv0yPZLSh1_aN3 zJ`=>C<}!{xp~_tN9aDisOX&zJ8Hvy8pGmkboKe*h^cu{=VS$lzaL}GQl|_ z#3oGd;4>wOCdC~9n5s^+s{8M)#E6w|m3SJ$$M6C*%eT)1YSvJ=*BUBCnvhy$Hdx zBM8I!`4GLKs&Okqmfoh5_Xb^oV(n7wAYR<#tr%H)X&N1t%(R;1`FjbbSBS`w;szp- z%Q<8!+f(s2OPS4-vM8vaVPBZ0Nl8BhK%;?#O{#2*6}1-lavsSu2N&R?4Y^iz4cj{o zWOhX9U<>8MM0oD1^bb40%7uo0Oi9yk&}G-MO!r za9;4+lW@bfP0OlibxyF3Xi|>AKMXNfKB0dIee0= zG~udK2G==VzFGl*BN3bC#Ec&iwoJK*A+hkqx{mPBgR1w%A152Sik|>1OTQ0ZWcAv^ zpYMlE-_th#PI>=4B5acQkk#lVO(QJ*_QATnMeQ{YDo`iMt+l4^Wd9`kJ$3 znm*#b)?pd%1(gQ6%ZL2fN1BZveD3=k#0W!**>l1j$d>Sc2EN39r0hMvhg*Jdm5DJy zjhjU+=WGDNvvM7ulePQ7aa^hZygS6YCcb7TMw?Dvyjg3tTnNt!PE|nWjbFyCG9ATD zML>mJXZi1g`!7t&Ws*5?bsnaeKJs~@oxbqV(5StT|Ek!&=fMonV%Yd-m@msP&A0gF z1no#mFQTTbzdU?ednJ}oZJ~jq9>lc7^=eSk*^L7>fu`f<t?0kglm@h{;mmn_H^&I)IrpW3}g>zP0FV`e4jvx)6?JBt( z7hjT7qrQiIA-hsGuXh-RA23qK?%X!ED-Are&b^o1I4n#l;RT}3L8(^49AM9^EkOVn zcA2ec>+W#U(^9hLS#kOsm^G-WIfJB|lLRj%|508wr-o?BA!s;7xj|C!@XBe%_+!EJ z;m~mE7+`>uJsZ&f;8HFGhRf}HKI24b7M9W=jR(JD43Ix^?ueM(zja9kapG-2(zBMq z$q|`rJ<09=Uz@D&zsZ3=LhFe^(r1&PaBsZQGv@I_{=i(xn?@S8O~dQ_d^M`po|t9L zfjIjq-RW+lzI9gNql?UBpb$(kCtdP)L(qYGK1NJ*jA5y%VP_`L3xqYE{8d$vmc>le zqnF0yH~)CC;0DG3(KF&W`d7Kr-JrhVuHd5|Gc)jk^)9%;Iu9KUI%ZfJYEWlN+y_0A zOuuJf_B6a`lQF$m(EMN-!C*i7UPQA@J-%k@R~SR`1+EroULJFkV@h=m?+h zGvuZI#7@;{uF63&HxX!e)uYX{K`b5`lEY@tRxGr`dl+sF>>odK0cP0Xq$qCd1|0dj z?QbK^3}<7=Dz-~Ao?qTf5~gUmw8`w18Lopn=$pC&)xKOz|3^kb2Pm}i-AE^}*VjFs z#X7XP5xZz{QTm)KPO1Q>5^*^`$2=&DmKsB|;pV?EPO$Bd4=-!?M_S2Gz1rXW&9qKJ z;yJ`KBgM%qW;6e-2tyz`_UY$oXCLRh~_abImAPeh(5RJU60N z@yw4>-U=3z$hBpRNeRZoLWSu_rW$~cCJ8c992#sn@tSW(rf3$KVmd%s3FYaal0e%2 zy;F^xCB*5MlnfOtjhV+8o(MYT+ga9V($1aLTiHM3+M>*zWxS3ZU9|n&dCHcYpSE~} z)2#|?&U^3UK`?sKhsZt@AD>1lfaz9SXhyTrCQbMD2t2mth5%qfe@#FL!2!jb;*Q_x zh_E~>%UH7+zeO+>V~a;V4kp971?w>tWgHSGrRnrUFJkO6Zb3Hba%3tF=%(IV;j&!1w!$?WjV?XooYPojv6E zoZQs0kPyNPN#USideBsWa}FhwA_#hzCwNXtjl;yFmb0v~L!Kql&s(4!RhB+mwu2@X zYMmMTA%5V=q5Jnn-VhV>!Z*pGpl!pl0$gO}nWdl5-k|2CmNP%}0j2vg>PgUF5g2c? z3BE&Ttv5-~`o$_S9LDSSWGyFt@CQowXXqy~>4BNwF(o8!^wx5Q3{pTsDj162(*j)W z00Mjf0!1*HgL%B}HoT|D@)-hq7h+LFoXaN|Ff(CHl7!#@8EuuCG2429aoUJ8J?11= zU6xAJ0<`>Airi6Uh*U@{2Am0}uWqmfQbz)~5fMb+f*1spD0M<^4;csI@$M)n9~I22lVn=aG8pG}{Hd8{^un zj|Az@5wss9c`GWMBiO%*X#kOC1urI=@$x(_%z~ zbfgN{X|yov34_X8sB|I7>-G^*C2qk8Ne@`RoY%l~P{MZrgIvn_dp27n!{f-Ez z?RI3eNUSgJZlrTuHn9sUedNG>gl$Hq0SpO-faSsCIoNfWF23pDo866bJ{7Xrpa{Gb z1Her2FZDql!V?>!wOgxfheL>vIxSWQ2{#$;498fHl0V&pIYlBZEq=MN+|_6266?U1-iE= z-l{;sJ2LhSgCZmEk#6?giVz_}goyjzw8Z4O9`58hueq&{hyu3NG7J+m=vV|08%y7{ z2i5jtIg*<(m#5K4&cvyH=TyIQs^2-)@0{v)PW3yd`khlX0(y5D$JYcW!0=qx>h6}E z{1>z`Gc)e3^QAsU05oIyJEq(AnH(wPE@C@zzT`~auIFKT;KWx#O-_LCZe>LyFT zW%Q-X_P1(qoSa+?L81$ZE=wf3$oZhffWml$+a4AViRb)j7vqEsl+eON2S&CHa@_1V z+Xvwd1i#b9fje}V9XfRA@ZK1xXxrhIGmz*)qRUr_LGH8GT5F{zkny$z{29Y<=Sg*K zy{U|LZ`$20&pj8y7>+7rRUGI9wWyK25{Wp#= zUSeA&Dvew)mR9M=b#0!UUdd<$XC8yz1OO8dmwiHh_=L~^KZu1M#?UmVQWKIAGq~&v z!s7~gE&!K(K+LX?=R{EyZ$Mi>w%hH4+wBGv^gwt%AWCdEpb%^?ka3x;Hjn_|E&*1% z?EA61O=M(W3uBjCXya?)>k5%%&IN-}h>MKu^TFkoLq0EKFbXmK^JEg|q___aHS!s# zr%O-Rxk62ac>^~i6I1MOC!G_eE4bdv-zq_ZLOOx#+yE=H0Lg?GTG1QaT~%m^1FVqbK$0cT`YI&qvS zmgXEoxFyQDHR`|w15|wf4d?SqOmr^a@TQ#~F`7I2kpr$@w_@AK(dNb>YrD;Os?v=% zHx6})JiDWaL)Y?&HZ(0`?Xr)@3`87`1GwCUb>wV{0C*PnJVXj<-9q4SDYest46qol zrWkL2pvz*qY#D80zG!=uq8}?*Sb&joU(|wx&)}Bab9b+EcK395pYGk=-0tq(-R|zS zaWpG-JFeQ|29{oV{9fr`T!$^U-U~Rv#MCiF+#&K@9_lWBNkMKY# zg6!ek4|BPk3ArN9k+^Ti&&{q;s)z0%2nHQ#k^*Pc;Igj?$^%nVjt*Q#A~&=mqlli( z&NxH`DvcOi_NgGG1Jx*W*{8w{AQeWDPhB%sqsH51-;OmjpKnK*F{=%o+Z7HvY$%N2 zW#5i1pGcO09lZ%wTCMKR=lAE9Mz=4cXcjcX7{tcIjS;BK?Z_C^^8mx|NtmA$o!^iV zYy`k%uip)@%;>?4!xb_#-l%~UTGS|j%U*bj*qV$(m%Z@ZxY-yp7^87U18lL~8EL$p z3^&|q0m&Vu@XH8v-Iq&M_B z8*;-i48t&Fv-2We3Y$hJFLE|eUc|SwxvMj#GiH0No6P~DMkd6>i22@3j0UsE2*0Nw zIc8XGnB2m~4wt>mplUPBdVnCU4gqa>@G%PDa+j4jO{|!yWwD}FbBrP`cUhTX%wpv! zq+^9CL}C0uW&`sDghCZCN2>6!R8gX)%F~~!Et-@nO+>0FjZokXRQQNSdK}D*9xiuL zdBee1qXCRUC5#a+RJ6<+!ZIo~h`8LvYr%;48xu2uO%My>ZS_PHD0o3U9uGy>)>`{0 zdRq^$IU^3oW)5QwEBHV}wh#;&qKzZJ2@^&}<7n;BkWq6064M{J1J_Jof?sa5IoH_RWYmF;MruVCkCcLo+H&C%;}fgo13+N(NCV)awg)KT!JQ<@BYMcvguJMcLU_@b zLt&(1!~q$7xOI0Ab$5%j+5@fI^qh0f$t4JGTb^^yIeYS)bIv*EoU?Hy18!(b5Cp+63_%Nm9fC)Iw!6EV zhdehqlmg_XyZf0Rw3B?IyFsm$b~BxKQc5Z9?(XmI?$X4ac6N7nm%uX8Zq8vK$_qRK zw9H2sh+>54>~dBa#)O&8OKCR~@rc>o-R(ZztGlb^rj*W}bI$o)YnoiQKk1zRKuoFD zSPpd=xr}dXt#$k-C7_INCk8}nIhm`AX@#x}{xA8-DA0;E4zzD4o!|=zQU6)TRZ3|k z|Nnp1%FN76|8p12-L{pPOY}zjMWD?y`ujInE2VpGT=r#VW~P)nSyeoCLx=cn}l z|BdRblw81XoVHR*DW(1#-b(45HL!Je_sX`*U1pSSX>*YSE)-&@kK0;nt+a6^2kr~p zZLozx4D|tRDdg^M8@cq@+JiZQPeE+i+Cp6R0ci?x-Ij1NzMbyw?pE05xmm;b7QE~w zMi#aQzIzskUaZXYD>MCRTR@)CMG9Dr0KRSc|LKxAtvJDHLAEuf)0WJ1PG&mYHs_p{ zna;U}1~_z5@IZHWuQde45DY=ER(d5e(T8$QO05B|3rdP0s%DLD$!~0uj2NK}Yb1@V zVPk}jW|utZLZe#>T@M$uv`TFWQd>@v*IY_QG4EkZaU|&4&PmCr7sz0(CLNPI)@srP zS)tpOZx~>$CS8*;*baTs3*ED)C`F=BeOYlgW!T{YjU!fcHEfK~wO#U{V_U<9>q5KK z09{)eZm9vfFve7iwlPYekxjOaIr#!h!q!;G9Bw~E$nWm zYx|*3Q!pmNA z^xQI}mKv47GP37rI2-Z_uC>-mYpu0XuvSXVM7OhR+xlHAJ9|G_%D9aC7kfL~GJ}>* zkUmKQ*0N=cJIS(kyLRiGbJ98g_l%TM%9NfFe`0T|wc2;;?(TgHdBn6|Yps>mT5F|5 zdSV`R3O049UQ`)6PAV`2;g%{=k8n(XCi%=s6CsxFKP)NZ|rz-umB_S{pZluoBn zBHyqnjO!mtL>Z^$hH+nfC=q3J8+-1_Ns^QMg1Imkp{p?Q45ieB-@tLD2^R(}t&WlImNwd|4K1T^55@m$Yl9+% zA6fVI_V#YKB6!5xU*Z$q^KtnRwYTTuNL}MHiTUwJyp$pmxFQX38f^KUUjm?cm*YpE zA65S$v3t+MeD_@p#my)XEo_Vz@E5fWT>%YavW{;ew6$3p&P9_T+Lj~;5`b)wwT%E| zgGl}&vTVD8zBDUZ8jbWVzaj|U^BfRv*F7Bw5^fgA0+BBOQUD(zDr3n!do*LTNmJY` zi8E&@%MLfX?`o3gh7@*Cf$|03ZKdkWkKTwY+~WTVKXN1vposj)r~?N0Q3@5`wsGjX zefzGpHNr1}Rm6O$smBwPloBc@4tDMZoAoHrNZbVm=W>#JLbPl_63mvFZAQKHNZ}Zg zxkm~;Ji!UKR76`uR&A=Q{r?jzL@cUj2XeoErYBIQR;)t+lC_wE0=@8?E9%IG!=k|DktPn7UQ zxO)r96W&IOCAf1rS99I3AO}u(`?S_<2+#2e4|#HMk)!SrS!CN7p3qPyeE37;ujF4t zF^ya7F;S%1Xf;|5S2md2)@^8{2Gd<&z`EdoiP^}qcelO2h&K98)J`XxIG^`OLDuc} zL|p$wxAl*E%ocjh_OzmpJ<^BaI1UZHQ|V()k2K+Qky|pTspq;=8rLmdg7UmKN~8Zm z(#@ER?pyeT4Pd&i4}rA+?iVNf3)4bTj0&oWUn6IY@q1(dw2VQvd|nW4X#64@X}f?Z zk~Q1~ns&?SbZKy|+gWngZQ|fV%gp=3J*dRRE9DvFYTuM?KUOI7QjIsOT zo9?85lQ75=Z0$kc2jihJ{5eJ7ExgFBFKlFifT@wcl%`xK3X-!wgv27Wu?XSKXy=?{ z`Qn@IlPQFZS8V9rPCL1TY#f?(y)EXtEZUaP7KI9%8;5R);UlrmW7I8PZ18k4YGs^s zQy@ebav9w%P*R2e-ahE3pA$yAyLW-RAY+tK~U(rof0F*$z3HGT7I0%0Vt z0=>?b*p@FVE-70y^kBH}JR|q5`>#d|Nde#(MO*sMZ|T1RfEmm2+HlYNDxZgo-qwM^ z$cR?~u{^eLj5F?A|NWqheM|p+RrzDR`)_}Y&)oSDtz*xM@s*<-Cr0XOpZ3Fl_z(Y4 zy=jaCPh=1xxZwHjE;@u3A~F$(I&mN>31S5Awok@*+aN-)hGC_YQc5YMl-dxil!6$+ z?X)f2&KenGTDO&K@muaCz6B8i+qRu_r_GT-Ky6^ufr%7!e#rK15Am&N1HhfJm+p6W zcX!ihG#XMv*=j=z+OnI%Y>)IcyrnL8cXxLPQW}j$``~wGU!#BbhUxzQQup{>k9O)Y z(95KGlkNTqP9aEXhagz1)oLNgy4b(`51kQ!2zKs0jL#f zgwFDS(1*@5gO$=bdySA3Q#$`GrIgZ1DW!D!j9Y!i|9R#cRG=BB{XXH8J}Z2T)BgYe z+b(;7>G}Wv|NnQP#FO#u1d$bh%VWAoUAFV`m@ZG3?aVQN8p1k4UudOt&MnXUP0sG_ z?(eq#9n@(H&N(Lv`nKnsbIv*EoRrcz=bX>>>74&GIoI9Y!CEOb6WOwmn9*(j|2tcs zKY#wa)9D_V=3r$sUNd70&%Nau`HRZ%mJz`;?Xu6ymOCxwz~{y4PWyoaHD03JX(Fl)Vj&$Nsl|N(6mjz!}SwmO3AOae*ORV|60Sz{5)%|wboi|t<{8oonNaH zm9R3}rq(CdT5J7(zw)Ltd;`JWCd%l-!P=Wk#p0XeoFAhkzg$H#9;J zciGqH$F*Jd^{IL?k|oWcM9ZER#4x$CBPq!hUm7JfMv@4bZGwWB$x0!|874Z&o{;c{ zsn3)qy&0~)c$m^r1C20eQ>vO%bkQyakUI+u{363^S4$uXw#tL?p zrnYP_t6w;bNtm7*TD;7#pgH?O6T`RavSryp!)VJ935_-uy6nTFLXX?mm@iylO0GB+ zi6bN`$P_CqGbL7KXCV`fGR100mMy6)59~(wHg#77$& zcCw}$Gn!QZ^30H=H%18AmkgZXEJ^8rlR}u8qfDG*2E>Q=r)v&Zl`dCHyctZC5UIh1 zui3+lqRBu1sBiPP28v{GhE z<8#bvOHHmM2`kgm^Oa#ChaWUqNV3vA8`{_(J5(>=@L|=JhYW`wvL!dL(BMrL&Ny_@ zk%w#s4Ocq)_(-bKqtZnNPmV1y9kqLykxN=ld>{@HYq=4Rr64V ziY7W>fDs%Ks0WWAU*!R$D~J>%UYd07M2gOwB2`|>$R^jEQ*A;a%6eU+oHIMf#KFQQ zjvq5Kbfk#rq2uO;3p0!cLj}O_;qs%$kCq!1U^9fsA0}$bR2DB$py(*6;)}>!6#i1oQ1KC=`~^o99D0iIu$p=@O_tPzj~*y9 zrm&{?34>uI2UV956>2!?+76YaNkRn2k|i=O5TW5q*PW&GG^dOQ6qTDfG@7*dVA-Hy1U|~}!hk^$QGvE} zg=GZVzR=)RGMh~(#GR&}(jBiVCvj#x$-o8cdkH|IhiAi%6~G`_^ZWUl+gTQpEF!h0 zBE^cVA0Ua#KCCuaTs1W+#fkMTQ&4s;N8hwRIOi4tVghU4#I!UN_S*anw5*}U1yx>sU(QM?n!Iq;8 zr9p_vi76|n{(x*$u@ThD;j>lM`H-eGwV0S}6)d|NvbhW{`^t`7+GSsvlv^6zuOJ{- zn80D8MGOxwF*9m}BTeM2d2>e#mB{PHnz5y+%n=(j_DK1AH}HoD7#PGjsdA!g?)Az< z%Y^ApmLFEUoZ!%L4J|O?`auJYELUor4T#-WNlsQXFkwT-#tJj&8n9)@3pIW`FL7u! zKr$(KO+f);^ZW6Fy8*KUriuj_xX1~^l4!)B!WkABsjfRBkfLIT1~^!vJ zHM_GYS&D2K0v2I0Ut`Gh$OM^_#oDJlDXa zED_m`zJ@hGmc@yWs;(?qQfM<&sA02J2C7R|3%c$yciXRxMF}RJEs9q$)P8E6jNpZrK}-GnsU6b#RYlxv|+)G3p4b*lHL(A-!q~V zor)=0l!O||7;Y%Xt0$uhs5xe4L-&Rx&1Q^3OFZ-s@ zbj^^g`KHXUmLyHwJejj)OC6nu>6!Vea|O*ECAu;e&@$G`zNs+t?2Hd5Gw$(qVLTC! zXf{KpbAZUb+dZgmlQ8^(P|?<}36Y7y7*n=V3szDFwUqR!YN?GOgOW1lw3BqHFUm7M z>mJ9t_C6!BU+uAZ)JA5uEU89C8?6A%}EI>#|q8XbGtgH@#y=Wa+(CsLl4pU#Tw zOG+n#Hphj)p?h46Uh{;Am`=u@>1@n2?vrN9m(Fn^rs!k@mc*#UELkgB$Ph{;0003a z761Ss5DbUIL6K0FgsCXH2NVDmWsp8_N)${)p(ICP7{ovfg8%>^0007zF~%T;97B2l z8jnrbEtDEjX3$~WxUKX!h)uScdPdJ_piiC;X2uO8kA5u941o}61ISvz_$uP#ATv+f zh!T}t`{LZU5(BBNaDPzRp|$z&{e%UDCoo6zd>iXm-ruh;kISP}_}$_GdLb3&&Ujxu zG0YoZfg;4!i&3g3VvzN@G-xbh*^WE*&E9g@kf$p1=i}btodpeT^y(eF8S8!<@i~gm zpzM)s%xIXR$t}10&ShlGf~fAvm+FiS^=NfQU9 z2ed%I^B1z(`t!Q7U9$>OIv8-(IyzaBEa2{q?Sv4?Hbi50$=Z_8z(e(MBAk!)kyX)( zMxN-UCq^AT)966sox@E!XPnQ*46zYA{r!R&VzRf)G_q41WJdN$7Be-d*t;1-oJA94 zwym-oD^?CdcHwBddv+;mq!Qcc87dakz!OaeXp;e$K~Of9Fub$6$UB^I34}-HM7ezSoYNo{KhEEtBY6F2CQ#oq^0XfxopmJ z6HOGGuhFaTn;;TparK7CUgEs#WctoRuNvC59oXw6mPA^?fvZ=CzVCHkX@T4{UY2G5 zrJF%2hU2t{C#ADbGk}vw??Q2OnCzmlp)3gCm6Mzim1gFD5HQCX-j3kJS@Cd;c+vky z{{2KDS$*5~79R($om8=0o8rKUSZF)XUBtepU}fX;P}*OQ9}MhePI37bmex=22Ex;- zU~4Eu5jV$sqSj&9^M~Z5MDOWQcCnb=cqbUM41mBa+!P&)XGOVd<3=CLxR1p8fl-Al z3S&>9kLtC}R((u=w{p0$JcW?JA=JB{SJEe!eC8m8a`--BgSR1LmYp!RD=r^o#9zRP z6%pOdX>x=1kNxe!4eBSLOqT;$F$dE}K3x3ybBpG8cxg1VB5A|(Py8p?nOW0Evu>{D zUayJYM*j1h+O^ZRGTpZq7uTU%! zgmX|>i35ra)1erG30B;&)Qdl$XmHHdNjnXXAm%gDt|tkm7RoQ6LbIPcILQ*z?V4CR zA{G>w?oUm|5#?GzX+&S>mp34ZK3QKLaz~AbboRK~NrK(*5N4zbN#8gsD4uAx4);Y@ z&3}ZUX6t9${2qVY>_B#tLFYJC?$vQBX)3t=(GyE4Mh77~3&0Ch%-qJfClWO+X$C+f zV9BvTTr@Ck1^d6t26aG1Hw^ybbdfd76b(2uK^KbHbi*|=jl7$ulpA5AMrCU)j!>ss z_SN@N1)M{CT_~p}I1|-BD#*t*FX}!#9JFCLw_Q|*&QLp!iEI*8)MxjZdtw1*C!-*( z+e@x@x+-h$30c@oSM2@XCBAoRzUzq-U*Y;YXCd1{ap|#j;JZ9!APH0(j@wBZO@Q5e zmxmKDo=^hlqIBiDE$Y(kM}^$vaqNMEr-E9cBJ#mHc#(?d4)=W~6E!U)kKhm3kS$-< zWLL@G%t~S*5;V_XeNq%QnJfNixotD~_86i|`C9zB&~m7s5^if>g5sygmqd2x#}vh` zm3oakt1$QES(c@|H%P>)K9{F=)}zZBsMfKwfkoM=L9K1@Cr{d+3fFk*nb;X8q4wzC z`^DqUl@&0&UzmGEY6~zgfnk&i{wv-k*rfI+y14#n*J$oY|J#UdJ zHtuo?36VSmz#`|qQe^`OK&y>5c&|!`;J;{P0gV|=@A;-JjV79=Ut%Z=4XI^VRtf-< z(sI&}^a|E`@DZo8L_V!|pdwoj-;l&1y>oLzP#F+#-2(n-x$`hbZ&(_AIAaAY)J6xT z|IPS?QGY|fVo)WqyY$nELA?P0l~n*gwEzmVhf9tarT%M zaUQ9@jJmO8u~ChtQz7oV(Dh!W-M&w3qKU}i!pE#TY}nE?UhS2tS*MIKF1{VndEfgu z|CY}cd-&(Z?}6KpjK)CaNS8fVYgn^cR+JhTQ(dr32-#00Jilg+>7h==GQJq683z27 z25(VS#S%qj{-n5#Gi@HEP@c8@?iYv0e9pcRW6Un2VR!~39VLW+d>u=Uk6g+tTPQIQ z3E7gp=k$Wi*7!O4J3#CYf$$H3XGS?{Kgfbu&PnPFH39iTCNKd7t&l=Sc8zJxng3<| z1)}TGGGMcTmC^WGh6#J}H&kz#Gc0`QBz<~S3iBF;En0Q&yRc>bG(H&c?`ddSO_p7$ z8YW{1=yi9xEjmmv5T$MbA4lv59~{4{@ZOQg8MP!BW=}N&?4-i$;it-;!3{oRCLrx= z!$wPaKl7@;*sVR>>e3iI5OUK=!#Ikl7Aq{b z0U-13YZN(YtOlRBgZKEGa~lKtmrRV!{V~LL89BK)G*avR9VY-wPq!ZkjJqp8r6YRz z3qgS#mToH31iMTNe5SK+JYC=L8Bgfu0_qxkL%IoADHWWb+$FL(76KM++ zw$Ln7r)-44v6}LLI0YH`#s=6rv-Dn-Pc;`m>ac?{k%}!i(8+UFP3b$m)>91jr4MKDXBkTk@ zKqf26#v*NzW|yCcs0(#`3ul%lf)sbsVw(fm7DZaF(VXEV+7gX*a=x4hK-I5+|SOz;Znpt3V~)H&sKe72$Uw zp23!j*MN1cVRftMDwCE12p`(H=N<-y!9D3u7%!}5kTQi(n8JWODdJySQ+FMzP;N?U0f z^$b=`^UolIiT+&?5~z~%$O6IJ!qHYU4?~HjBZIAB-Xl49m`?}=hX4gCMZ zY^m{MCyKOSxFemZIgSSA2JMY32g0vcn}j`0>M)^u@+kDnewl>K?fuP4m`n9P!;whQ z8k<;~l>+95^NEx}1ewtdSG~bB=6Y80eMJxJy{DU%Wdwo$X}RxZM84MbFS>#ZFf0F5 zmXTwQ`$Fh4K$Y@D@$9{Mb{_|tiTsVEvJD=-UXf?2Asok*I5EOW*~$Av49%+ozD487 zp_^o^Y>$CDTVLw12kDX31}WS@ad~B62q((_dI_ljyFZ&iF<+tB_u?eyb*pP|s!Ium zj`=9vk7dHq4nqcpb;Ba-P8%*|uz~a--5L|E$$LWJGO;HZ5xH|}5$G*518s$f1~p3a zIB~Xp)}j7%@%YYY#2+!WJhlX?42*`f|GqEf&un{WF_oTXb0v09slM4q3u-e~ky8Lb zJ{?1_ijKP`oDiv^O-O*CA8BlDwXIlHs)A;R4K9j%ppH~KNc$xh;JMq!KOK4Uw z`+zvwOqeCIjuwB&iOaOFKcm2e2>t4#0sxB3Z#oMDx^k@7yFzdVl_amkj$D&-2kffg z|F3=`f2!$5b`=Ht!O+V3`}{<1%y%j!Y4CxdJs3{C`1p1UOSBRwjg~88qne_Utw>=B zOc=i@2+HRuH>+-lJ2m7bYd%OugEu)Lsw2I^nVl^Uur_MzfZMINxN0rMH$*X$g~{jy zIS1qODxu^%lm@c}Hm`!S%dd0GIR9D6X~YRMm_~xVNH>9cpvLGYEx2F1K;QDoaL)WF|V+o2JZ1EK8Mwe=#Yr z$}fc4Ld;fQ8~qeVM$*OpMbdi3^4)@ML!sH3XVrL3L7Smx`N~I42Ww0x*ZOnZ%ccj?^AKo&Y$s5?DdEgxja)4 zC61y9YHkiD+mstcLTdlpQj+`!Grcn3{Jyc^kO6sw2h1=m9%cO6 z=LVpr6e)SI!={KeClyG%1!OOX0HYgkU1^35;^Bi#_s~32kMlsh@JvmQHC+IXP8S$D zngFUmRll=LPPdwUL^N@tJZ)iFW4IwHw2oowfzYJ!Ureh{n2_w9m+)v@g#=VJj zuIU2$`qG*9{*n48Moqaivo583_Rk0Z=jKLzMP0?+$b2~g zX2zMMgPt2SMg;^x4`I=QJ0FmN zp&%m!?vdss6{{AB_FV&&Sjj9Oq+W)0+DD`0#N5}-wPIjr)$!ZjmndB6S~HL8A@QHf z6P4kp_6vG+l$=6gtZ|jcz|lj-DE1nOEer;q3Id#^%DacEhmUnAN*h1(_Lm&xX*hl$ zdD52I5BUq?*9r;I?gJ-WlflDin&(ho$=gs``ezSp9uDqgKb5ZLWN<)y;aN2S8`LFz ze$$MWDB#r1FyGMpr@;pe2;lT6sF-2TE<@-r19&_q%FP}>{X5Fv`#a3>6&@?Wtp>PG zdmu0rAhpV6MSihU%>6H^MSYGx5^V)36??RIGreq~+wLBTc zp)nZ}!I^d}z;%mtl`jqpq+)Bdr^SAZSe}Mv6}{t$?VK*-&$zJ?TvUpc{(Fv^QkdFMo(gIyITf+u$Ut zoos9cA>}8`nThIYvn3(1qw#}tT#gL#LcHQM50hRz6JoX>5X3N|k`(>3!-8?w%KeWc zf4WJK>X(zw^_mm7GtfW1(vcyjE;P^Z&NjN5^5AcALQ0N>{Tdzy`pA!;L;(fLI$iWC z#ClqoCCH{;BbQ)L{2r%;?dG3sb#&o7)G*O1;AUGJ1*Ugr5_w{P(K5{CA>re)m5@vh zqIfc`K9Mj0fEl=hW`Gy3j-@_Uj;1q;-*xnF&PYYUEwD1Bl7m@fp_idiK0Nvn$#ZJR zZE_`z*8J$|`S>0AOz`UhxCc0jW;#Qz6DGEZ1b4nnmRZadf=g7|r$I2W)E8+R zfB-mNvWh6~aa{+SCuAIFi$uWnA24k#Vf0!na{$dvHRE^l`jA!iOX~sA!DNp-4Enc* zS3uk-4;A12U^%+)GLFg2nX45&!y3_ZsNRcDADcOq)KfF?(AQ@f(a)lGndxT5(IXF_ zOzMXfr@#i4zXFnu!-UmsuhupzAZh>=!1clu9oOFHi2U7&nr+m%-A<|iKw=?HbP!s1bLdNI%iJd2F1#pM12pc+-uQ7k4H)0TQZ| zogO&1qxOxRQm3{Kh>-dK72<>I40oGy2-dHR`D60XXt+qmv}w$OK`LJssEQ}CmI=a{ zQVBElD$#zZU-6G$ht)W5>pXr3+j}{;9OLquqIHimDjfY=#9hDVX+w=_JZT6f(B82_lKj@Cy7^Q zSmWm*mG)I=OY>HLhbXrt!?oWBfzrwEXY$y01_``mYivb6VOgFxQODQN|-#H%3f=M?UFu& zNZ7OC{`6E|A8uXOaynoas8kxC3v4IF1$aQ(Fi)(X`Qo{NzRH5&)oncmD1J?SlC<)Y z9bEMrU5`Hxw>63^!T~&j6F1-Z!OrRp*^wZ-K+1umc8;_+`7wDUpZ^9_vGc1|gD&}( zss^He7Q#tVA=cIH2r>mFAtFJQBq_Sc~pB{gQfTER9;dht6r{F#)vWt7reYlPPz#7UcZ z2|SHobA5!!3=9fs-4jy0^%xcB;K?Eh9gRn(pjMqM)8h4#g&$I4Qpvce# z2%x3M^6^xF8|H*{D+MmC7p4PKM&bkxK-#5e0dKn=V$2LP{gOPtPb2e?7aT2`qK^x8N3K`K z5#vlc@G`o~vqYV9s8R?0UhE=BBQ=LW#lBxMaKE>+nCY>#UJFQox5#@twOSTCfA!@B zqaqHe>@W!9#RTmgDP?`bBpMnzrEyh8`;H8d?F%4&L;e;mr5~gCGUM4mDls#)9`G;S zr_I-p97PxEqO>5dpbZ^|5+~yTXf9-qBcHRo!i4oH^$ZKNmPiB z#Q&@NuN1Zs7R>1h2xuFA*eEkBp@Clv9d9Y@1^yzk_+S+uk))%1AKvUaL!YVJ&Z@x( ztf;Hhbs7|g6om{-cMx-#RfXBHt?`t8-#%?UT_`MX2@#bw2_-TKMi|X{*%!DlDjv$N zPi74bE~n~Uk(96wNLLH9>-rP`T?)j5aO_)3we>(P8M5jL7rKjeDaLv6du$qs6yd|^ zKUrTqjg`V`Y@;E{LQ6TYI>R~sC0IG_&$X4A*^QW6I}<-csBpeiZzpvYbG#ptcxYhj%FEeSS zX$K<^FG!JMlN|H%CKUYCHt7U6Uja5sSfSjc`58Dm`#k_^9k`;gy<3_~N3ag@@O`uP zVJk;3@EMH|^TzAW>45z~5PJg@ZB zVW#g_T7=moGkD{sjL@@d7*66>s{}F;;E93a6}b0E=$YG~1V%3&TMtl^3aI_$>`G8t zhhmV&U!$Mp>iTURM^0pVWi*p^)?p+}*OdD(j1{&m|^!|9(y{ zM47M={9({zT8sv%AIq&ajJ}c9$b#43_uMsr=pRtY(;j=N&V$S5HZ7L)Zu)bpP%OIi z={#qo{DJr#2lr&L<724@K$ZmZoI}_YhC$gb^K^f9rwP<3e$hc#8mx8RI<`7ch|}Yt+mmkkiNeIGutOIJ z9A4$A?7gdpXk$F@W)ueqRjXBp1u=S|f3;1DE2 zl$F9q;trK)n|N_7WfY#!c=po}rx8?P<}&Mo4w`>&amL4)XTQcu(m#8yhC8kMEiz|C z0LO0}`fSrMC3`lp_yCBi1mHT5Z`eSgH?*3}pH}5qfIK9ldf*Krl`Y|}k3V&C3E*(& z$gozS($@gup6rBFSv-JMf7|J(C(PWyjQ~o(~2*z$I&`ifwb5LXlN;gX*)~k z`E|g{_bMS8q|6_GHrdK#E!cD%`IPkphB~BJMg5cJgoRkV^9|Z%cCwfKIcgq$ETy?~ zS_HyXJ)Y4Sl+ifjkv-GIO|!c}Buxjp=D^Et`5vR65c;&U1^r~ z#UTPbXnzNiM`JD+d*1Tu?hy9y+_<%`Dx?KsU=VY9=_e98w{0OwMa>v+P1UK?toblW zQdLQL#PBX+wG+Es94dPT;gufA?<*$_92mXw344e4;PH`DM0>kY#2wQEQ_?2P6UTor z1#tY^q1%PtEZ;n!@JxePuBddk#fA`EeTna0`U>KTC#%sx^|XC6a+0=;VJ`^^?Sx6` zeSLZtT4e5>zwTBv5ompCmuxXh1+Os0zUoN~FG4I+{}e8qc%*~}bicZB@xccv9)?dR z$g{Dt6Y5$m<$OV;|3mVb6_#gE03aLK{xVE(aqMw&4dbY;7_`ng6oPWnI!U37l4&Ho zZk;@2r9rt9f&V~+0op#|hy#lp!WAshs+b6tB3*g;SPu>#A6LKx6F+KZ;gTSg*rs-^ z%y2Rc;icc42ICzc41&@VI)Z74q2!gZ@=fhUJP{q}^np%r86<}y_kGfDg`$Qs|Md)U z_v@n>+f`>b$fPl02^tMF0pzmlYsceUI#hn zAq)eOB!9Ajz_aa?oAM|JHj=-kPI}lKFjz@#+F2t2+fZQ1aV%P%`%r~tBAZT_*obmUFZ@_=8#@4^f2e!MU>~Fc^ zGH!to&D7gb8eS|of~!vu0A9-GvoPJqH6IjYf3o&>nN1ApwRZ-hPSQ`J>CXzLII5C6 ztMY1LPdHuH)N-SxZj7BIfbAn(*)*HLhwv7tciDu049Lbou#Wa&3rbl-oZg)SD(te% z01YTuAeRsB)QrA}D)e)AqLS0Af+#LdS>bZ!vnP;Yx1f3@=`G7_meZ86=3EJ>X&xBl z8A*I2#D?^Q%}Pu#wv8-bf=GgT0i%q6>*-`pl5<(3Sgep@W9`d(hHNyO^vA(T@6XlZ z+*k%~?ja4SXX^`k!wXzGk{@ILRPxO^Us@6W675jmi^`4(wsGysseS1P-|`I;3%Tuw zL$S`{c~`3&tQDNE(2ZP(;x(18UNdm|!jk+)oq}=%gH1%KGN4?+rtyqUXhte;BkC?` z(3?4w{^K7+ZeL7^rz(M?8D&)0K$I>*a*1sS0Wlo{+T-m5W_0-j%n1h3LJ_9qn;d87 zXwg8&=!LYUnUUguApu;mYt@@%CYXT69m;^ms?4Ytij56s(Kss^(H7xQq;=~^Km*4> zp!agD8?`k1EB{+{TOc2gGQ91VckQN-*rv5dEVnbw9g04ST%!_yqWIp znQ`;#DN0=eF7AI`{!=zX@GDtGw$yqDu=-C%=p}~VEyLcIT|cp;>}fL-{wWu9%epFq zU$u)_sZT#o34WoOgPg8>`#g$4NeqSt|Dny{ZyIhYO6iLgCTXh=c28}Uaqud6(yJ4N zn&xw@+i^zm$%BTOHCJ|nuWJnrRgFNPb%OU$K}?Z3IT?~Nz&ys?K=<2NWPjm5_T@Kz zD^BJjr`%G9oI^SeLLgJAOz$jy1XjIDeHUp@yy@1oARjF-ifHL418lnb zxd`{&E#wdiHJO|Tj-(Cu0z(Y4(8C zP;9ZlyN1D6XVy0XpP9UZjHj*2o|_~2>JmACw1B)VdSsUr*Q@_LF&uU5kKvlW`P-Jz zy%d_$u-XR?d=`jsHtF6DT*(cr{FoFGsF#HLP*vM&S!;`R_IbPmK3w;jzWq&1RPGgDb0uF7y>1f4s3m8%n=gf#X zj7=x!#w1GdVW=GZ3ba0=#g+2s`NO9u1xw4_o~(9-Xx|c-V3Fb&BF%y(#%K>0ZvFQm z&tOprmf@^ZI~6y!*cH~e;`ks6MDgs?JQhHVA>!Z{DOc&8e<5^omIrF%FW0gZ#P#a> zVoHFw8vznku3Wytq+PD>j5=A+lH6v()*2udnU6iWn}V0HXv#4G^8S(gQUf+p;9?%o zSsjx{va+h-T>zTJAQ|9>Cd`f~}#cas(VXrrPJlyEFP^(a!8LY(_dE z{O^^bY_(ru7~Jd&5p9tf{^VI%7w>pEoPH4<7=G!O0^&f#MiFiM%q|@kz}-I4^WLP4 z_MyH>BG4bA&%Tm5x00ebjYEg~_A8#{8x$~NV9oKrMKw}z%ztqTCbZnsK_QQa=ZdHW z@kc=4r40M2jB(fH6%1P_ysR96kEbYb=~q)_UG4(?&%~Ywbf`Jwy#KfGvFk`G@*t7L zHa;2p2qn^&I<^QthnMTBO3rf;>`3ci4m~6J6eVj_-4*_ibZzbdM&G8P;@nDfR9Maac{g?*2lHwCL&QpaGeE6LVx07}l5uw2$>>&Ta&{#jLF!DAY zn)cHUeqAN9kt1nD!4WbGDbJ?hdt*n(kxo}_=6nkv>tVNdUzb%{D9AGa;B8aT)Br1? zX&H(rsFwy-`b+#Lv^9r}!@l@U94csri~TF5i4OlSP%m!X%^FqED7_BX1*kJ#ROii# z;?`&GLTqM}rA|H$Xv<9Swkrf9+|IX?Lv>YK(=K+uEkFQY)z4XNWqRO6q6iXJ`QYD6 z1$qs0hI)o1Zbiak%oc9^@b9DcI&svl;`A&7V;3>59w{`-uBPl==apJc^{Jb%cc0gbS+O_cJOy6B56QmPiv6H6Dz?Ihrwv zP$=cP&dp(2LnS%XjL=J8gkD5R=$QaX47osZKiqE+ap!zd1q#8vBYCK?iu}U=!;N5a z<(wAPoI!5lbHz+r-d1*xE0dPfxNphLCjdQjRu={VTWm)y!X7cRsM?eUCVH1%li|A;2=c@l19muBb#dxw)YVvzz}3oQR-W8tgT z&F(L(XDIshJsm-4kD*@~ktHSG@S|EqoaBDR;uInOZ6ASU!+i!{5J!B{Vmoq9yyx6+ z+~~nRp3#&NMM|i*nFw3t8!~39vsQg9D>U2ehbHP`Lxt6^_qMTamDm^vj#oLzEmvkQ zi=VS|ZqteJ*aOvdf12Ieg#s3{wVU{9(d&v^qUC%iM*hDuAa1Yscx9spJm4*q~W zCRIW?iC~h_P#6iD!j`1S>5i+zHdRPwWaL~gZnq*KDn7GXZkn-8%BA3ysxsQ5f;e?g z4&i(6gHh1nLg#EElaNR{K4r3|ox`#4Dy*cZWkRM+rk@gmG>CH!WQ;!3bT4Wz0{DF> z9e5J4!FhjL03)D^qP`cVVIM}7S_x;>rX5Nc>f1G(TY~(lv4?=PiBPI(=88opXL{sB z6|$MB9>+y96t}Ykg1~^>Z&(>&U3yShL46qML!X2$}+4`N$ z=dF|j??_~1OQM_`hPVRe%v&jX1ZRR2^30hpLCu-riqyAE79|cdI%AgQ3PxY}>j_t; zKZ=)=l9}rLW$S1vS_$@iyrkMbz^%rQnuVaa)j*LDkJ1ynTWtghEY^HIslusqZGrL> zma@jjc!@_T=P_IA&%K3V2l@Lbwa+zOM_cRLYJ){v3Z+bn?kpDpYNu8d5ZKflvZGub zcO8vPhJx-qY5G952*IrIPv+p`dX?KO$-362cJX zJG}Ld*M9{;N`K(FBO#P?FL=vyQ+X16nuMTod-NA4A+Y(m5nKwFK}t{&fB3vgeQr=%|*;zt4l-IfM>#c@#6&9@&b+GT_*}$h-0_w+0qK91fup9?rTG9_^L zZ&pZSX^t-2Sp((fwYbYH1LiPSfB2&D8%afJ1GKu|NN!3beQU9W$S<(Slqe_Ri{8xe z^|MR)&9>yTsn}X;xFvprR0KY>&(=w9okZC5S630t7J&y@FRXpMzHvlV(>=vdbb^^l z3Ybe;W`DdJ^jqwSAe$Iij|5_gmjRhcEVNLT^n)uCS}{odWagu8(mlAUwnU;p6gS@& z=jIv7i48~Zmif-MmT>eToF(n`{pvIf?u=@jQ@mTJNv}RD779y9Ps|uE!@SCoKBA!= zLU)!BjC&+#*XLff`s2UeRG@0qU{ zMekl_=sRhjH@GqXmW|cG@i6a|SISw|L!?dC(Tj|InRcD|xVh8M(29g-%tL7Qn33j; zru#GZz^}pU_j3;dRqE~lPEp_c5+x>n)>2FoFcm>8xVwve?G=w-Nng$)9!K?)NQUJ z1Lu@aKidIi&)MSTUdXR!uKh2W4ErP()33om8nQ)DQ-&z$c=KkHsM~K1B+DFn0JX^# zbLIk=hhQM0C<10^_)NiZy67k4mdQ{~ciP(yIK}Lm>qGpphE037Pg9tdw$Oq3u9Kx6 zUE5H|jYk6PyA@oh)ierrQm1U#*7|%*`lCoVLuH3!0GBJAyOGi*hhgR$C`2pkiG0Gh zEY2Uv8ChGV;dTy_h{ya9B;Kl1W8h`MM`McB#nBGu(k49RpH4m;_f%jEQ+HV=q*=r- zh|QiR(`aS^f}n6>-~ti*#}-$E{*3Wa@6@v}$oT&ztJ3)F+)<4lc20I?7Q4us(mT=^ zn1`TdLIPoezkEex2rHAq56|Wi4CfRRr(#gxY`7=dD06GX(Z9ry((eyBqtdr0q)yqO zuoI3~9tTiRf1~S1>Gsr$waKJVoYeA>b=uj?Kh#BzC7VV_^aLtN5V)^H&|jvJ?f~ww z;!&!|mI^^3JZ6<`9u~Ffq`}ZVkz5Atzck+|V7 zN`kX6r!(RLo6HIQ?GMB-n#uo_kLUZ-P|3NyRCB!UU3!<>x*A zip4%ZPbA^}_T^4pT!G{zD{{SAPw@l{@Pk`Xof-0zRFKM^8{QL20P8iT2!!p)q&`D6 zESwp`jn@(FPRX|TH=RYO4-x`tg+yU?No6CGtB}3I3;`gWv2{B*#~q8dx{UXO1on5W zKlNC<_dz(kc8nAd-ov_lRrtK#e$0PT?PPaw`Fj2a3@D#IDI3t@FKi~P%`Hd}|Ghnx zI=;3EfFknwDZW7SOWc6gXS|D`|%6Yp}PaL9spK$O|hEJ~dah{Lu8l%IN3 z1VTg4Y8tdTGZ!3W8A)QF)Kltixtx@9Oggm;l*3@TH5Q6~v}8(Sh&UjhXcy~%+LsR6 zo&!J;Gm0{?HcM5ESNw!PF{{Y3% zFa!dXGoaze>wM&em^J8_t)3wY(6KBu{e=wZVABX!5e^3~W)~DJk^oFHKVV4!(6q_` z*UO1Ry!0mo!?~-`_>JrYS_ZpxPopRGZ(@>OR>=2AI49j5d?--C$pFaF+Yto)CGL82 zvqavGILT3+TGy?9aRU@VuJ&usk+NNNT_c51)>d647>gPYF3(p6NaL%jjQHomlO3ZO zL$~xNnN9j=@yz7N0@8*D!?rR|@#wcWJ=!H>nkV!dGrKw?d zXghI0Hk%Krv#bOYn!-`zSfO5HnM;=8<>Lexi2kA*xTDh4VUE^gEH=xB-%z5zmKFT!;|4xXTD-X6 zfi4Mwu)8nI{HK2TUXd;P{1vj5>a1y#m%?(mX_U`d2Enl4Zm&yah!aa3XjeXiD)`+6 zyE^u90c}{}3s+>J0_wxTT3RqvvPuV)F)=4GSp1s-Y7>Joqiv}U5`(f^KbHhT^juoA z0g907BaAekPoX-G?Xbat^`@QZYe!AW878QyK_eWt5erxV_Yl6%H(1k=>g(IR_uf)U znNpH6S2u$a_Jyn}#?h~ocF_oIQQ5-ZUH&)}kzh0RxWV$}#U3nFlEKiG@7ncW z;sL_A`aTeFhiJJ%PFMZ~WYGtnA3N#Pr_Z(f>%afJ4#OD?~^LnnX}b_;tH;_(8uI0D5V=PwSucQMJs z@DqhTBJ;-hM;(ArfNf+K<9YYqMIcr|1onaWBNL&a`2HjL%0lRWL>>I2iq~FupGD$E z#1TI)`|0s%QGkdDq8nex5F$!4__^_oM4;xs@krcwBMvn;dU$?7A<2UdW*V7NrjZ>7 zBSjq;=;7iq-qFx55eI(_B`jYpawLJ~7d9!@*%~vsv%;0Xqes+1zgkqaQ3ril>vM&5 z+R5~}9o!Ckvx}JzrSI&pQH7Df)+(Pe8Hmb1je)gr?z|tg} zcxrX8p@h9|y*TQa@0EiA()ef1@VZYA58JG8{d*qZu!-{6sH4Y+z23qb3oe%j()b79 z$9{Ioj;Le4Z$2h>Je&g}4u9+KzJt2I3PAS94ts6`i)|w%Aou_TgdW0(I&_f4<3t^P zaiFSkpu@;80;Uh=!VD3D!#6HXH$ZIU#D;tQ81ci6AA?d8EGFEjv_zI0p9pWc@lP^J zP=apMp?Boq;A~(DAcmv}aRU=g8bE_8!Z_mxBd7oa3?T_s^?n|3s57tZim1~XgskKl zc}|{@Z+@_P8idVo!3+QkmFD6ywxl;pGeOe9fnay_mS_7#pb-LlR6}`4kA! zl*A9N{2@f-7g0*$=gJ_yaUJ=Qd&M@N4C=JQHc+Y&as=)hj~E!{U*AK&_K-eZ`93hm zb>#!;n`$FbjYA!DFRyk!t&%+Km9e@jm?O@oZB(zof$@)tJQHIKK!OMvLWCnbPUK<5 z!nsYmqAKeZsxqZOA%r9y=3)>r(8;3K{oGDa!Nidcb6X5rI^A(hKzs(mlpeIuVJ_wg zolI)Y#ibuDf}oR4=^d^3A&Vv*=3-z_C4+qv(}OP(I=~@FM;e>)YD5QxPJOct^SeV5P zv|N}47fS9|?{+~Nb|HzC?|9o!#3f83ewt z5JCvM1U#|u<5qMAGc$~r3Lx-><&B2{us8yU8)I6yY~|+0RRZA64p?<)s2WxQp1^8w zRxIr#<0K0!XzL^6UUq;060WSk1yc+GA;pT6B>bQTNhA@X$XhQ*K}$G1QR2!NNkl}T3?B5r z1V~Z3P{O6if@~`2?rz!L-re2Z-QC^o-QL~Z-QC^Z?cVL(-QL~Z-Q6vv^lm9XUdct2 zk@{Bj>T}LnbEbgxhTbOSo}MbM(>lkac(>=?0T8|*~>A$ zyYq-AX88ml!+zS0@Wyy`t+j%$79MGF8tbLiORHI`SEW{u`k_{9J*}?Gc6V33wK-4h zvFt4EO?Qtm#uzE3DTj4+gH)P=bX6BBO;J+2yIV$P>w#j=U;f*UU)ekLXV=D~GnwnU zEUV;46t4ebXYW^UjT~hrWhe8il>9HgjM~etNb8(c{{P8be-zt%rOt!CfA!vYcV5AaDYF27u275L>*-%Jre z)fG2FC|k|LFreN&;zTd=a_E!68Rw&BSIRh|0s3Mi+5H~-V6yAXKyjT?hv zkayleEBC{OxcuJ=ZgfA{bmP(vBMNGoSW|s6xiV8qu@;E2gp?srBui09k>Vu>DN>ZA z4BatfKW}evVhe?(2 zFe|TwYuk8K*SvZsgE~FT$}7Rjio>dPCIx?MX-_ijy>5N|g-$E8&DfV4 z8l;Kuw6X5^*%jUymSNqj3;(JtyQ`vD#_5zNb9c<_Vnn<1`w|ejJY+BhVZ6J$dj$m1{ZK~;-LIl#{(5+O_(unO+Z6#<1{qX!uCE*r5|+-@(GRLR zSXck5kJYO_<)F^R&95At&jI>&QopqJ%f0WbVp!~W=r^sBAUo=Pq z|7-URi*z_4g^*6?pH98HS2|rbSsWI3w{!@hlu}Y}*fMtG;6O?#Wrh8Hzph5R!5zaS z)0A^cj0tJZIUR}T$TTBsmp4cX#MP`eZN=WzjM9w<_H>2{%_~S>-BmZP!W#At0C7~Q z35ZR4$Sb=ku^Lb)YkRe7?=RQ?qirr;gY?Zyw{lr+E2h<|hP~CQhHdD?SQDeh>T}YF znghkHrNkOeHfl34K?&YY{M`6MoCpGwC!*Z=aY+P6H!2+kk;2_x+jwkN>4_UCpxQ6) zb$#7RZg;z*MByeG6x0^)qEBO@sRvC+x%|;~Lwp)!a+!)6 zm{=)g^TV@{ZnjH zyBZjN?AM>c-u+Saz3cUBm-;Jp{d4?x{8=6r=3q%h3oaFDRsRu-y<4Pjf;7`Z6@86^ zQ02jY%5&#u_F_fPyPqc{2#rR7m|}de_SR1Ux%2yb2I(6kKt*t%Aj_vT4F-Wq&CJxS zSSbADplbBw^IgcyK;g?CXV{%R@=VQ&1(}PgtV&+oAd91Cn;}A=(hrahLPJW3mM}4j z0Sg750K$YN#Wv%N^gG~){oobsxGE0-llQWwNf&KoJ5<*j{YKtmL2Ii;_dDyc&;|$NqGxAK$igo>{wWio6)p@fDOm)h`Fl$5* z>aQxwW9`@~W4Mz6p~@@N=_)d(6x%%Xppg;GZiiL&c$8OJ} z0b^fcV3n4*v2ZQf4>rs&468p@E4l=vF;tD7WPAqD1N1FcD^?8-UswiVCxlh~n9K}P z5FAVP^Sl`=gJKS>f@5SR#Ta9ZF~%4pf6+<|T0ku@M}65epY~|a{C-%wm|7_hPY-)0 zY+*mx!niLoVF)$`@jwaXj-Kmgb>Xa5Gz61p5`<=EYE~?dr9savRCzg2<^B!P?yT-- z9QhL?BO@ayPdtfYv;}Ut7>Gs=X%^rD`$Z;9n($G~!Shx#HIsHfx+^9a!G8bGHZoP3Gr$)6#V5CAC&M0;n8S%@}a6uS@_(d zQ-o-QD!;Cz^bUb2Ne7=FpdcY3SUKKH=i`#JC22{Ms-Vgr<5=*i2e@C6D=VaN%6%KS z@&Q|u6DgQzLg?p5r*;skYOR%tB+nq=3ab2BQ04FSU|kxD)Z95c8jK8iw^D+P%BPb7 z&2YORm@(>*m0{(DN>s?W%CLN)5*0Dnn?YH&s1Lw}N>p+{<%#=wEhI8-k4E5}Fvb{T zj4^(Z_%kJpF~+|za`Ae{3gM-a#aH14_Mr+s{0MtE!TtWiqaCvP-W-fN;DJ^tv8-;? zYLre&vr4b;uh%sxrIS+3_FvysuZw4>LMgqji(a$VN-3p((OPSjQr74HQWu@!xEteN z7rm~h^rBa#A1_xSjl5AxhdoFsrIhV*Rq4{DOP5kgDP?u((%q$$QcBq_UAmOgT}tWF zrMHw)N-3qklu}CBE#2MS-QBg`;li?O(>6`Zt_!=a>$67)yPmQ3gf zElZq2(8ClhMo?m@XbTrQ5r_#FMgVd$gfE1ypi@)-AYp=55mkb&>NdE$`@4U~TB}#C zr&`_J-CJJ&$>|T}>GGG^lrG2 zgONL9Cv&X~+wjJd$*5Nz2QRF%0EA2xraOV_n5LLr5J>Zb45l_(60J-Q&WzAZjSwr= z%?mKX>I2@)u&TR1rmC=CYA5D?6}z)`7Sc$V87}U+*#3)E&q5hutW^#7y{NRbqKRhT|!ap{A1Y)`T7JxSV^Fd&a`4I=`9l>&Yb}?ut z3j0ObC80D3%u(5w*jj*F;GmU*Gc)Ir73``^XWZ#*#|5g~U*nQ?j=t6Bp<)OBwyylF zr9|XaLzSOEz*;QfbwOlh;GA>H+>>^(E(TWhYbTbBj~Vv+Pq`J)euNRm^Bma3PJg0dHU)Qf$*~(o2#{QpQD{O`G9fSpcAc#?z!nZji2lpQrY zZ~u*AP?1syx-KnL^;ekC+aV#^1nDAGu*EN zI;eJ%B4cLGP0CK0DLa)ML#dB=X}9_C!2LRK=f|yY=2zCM1cs$aJ+jB>k$rZss76r& zBGwO3kWdvNs;oRMgPCC!6!v=`*3NaTyP!&b#$BHZG97wFs(UKSSVWbl6)>FPKQl8m zD;7`x7=RC6#ug}I7xZ%2N>GJepL5QaJGrQnalG=W5D?J_GJReUBR^3n$q%iA}B8YWWx$MWUE~nb;)a=udL{ zvrHWu9MsXIba|bV-IBW{yK5)T-DkVcmQp)$EhTj+sn4mMIM!M9O|4lB7j;bFIH-F0 z8r(|_P7-xs5XZ~+AK-;czir%?*X~Qd3>Ts55(to^%@s13fusSf?lV_Pp+tj0j_)=>V6&@7p}kj3lF{g?5Qxa%bf4RO`h3-`IV>V z1$pAAPIhU3Z7j?mFDmqC*vwi@(;y9v=b@2-t9=PiZ3Z(+2pc0R3Y?gTyh z%vtEsci}cJyRPd(K^ppS>w&uUbg!$U!N{%kGc5%gA1YjbpI*uBlcC1-XAfKqBa#8n zY|c3!(ztvi99ERKx?d3{+I3x5)v}BGG=Oz6*VRFqi|QHA;u763^K$ZWN69`Fnv%y?v%iTJ>b8bWZwZ1kyTrl%PH(hMqeviM|mVrkydNq zOD>V#sH5veS3zJWzU; z9=-K_3SrNOXl#5{*>?$GC&a5?gq=$MT;M*-{dJCgg%+Wxa2Ia*oAGvX=FGgMJceQc z1`Bcf2~!&K?bYstZOzhMMPtMF8%m3})zWAi(jABp-P$N7GDC#o6XsocQi&kt3vUVo z{8SmxZzS$NYO7QMnllrK&fg>79NtN{E?j@gOlEJ*6Vhe#lsW`4U_!Z#y@Gmk-lwH(y)=raJpo>Aw~NQ_h0D!n=4DL66EzhT*g{uv98wH#BD z@tk?wa2_f%%*WsViO!K0j4Y~(SHoQ)S8JpK+=0&fcCS7$%+*oj+1%I&)sL2+&y#ra z(5gjf!c&7xHTR@Qnd5+&A;Yed;zfOeF>R2cY_anf?Kmm`L~Sg?at!3~r))c&_g`|L z4BG-8Eif0;<`5DL(!(9PnZwcKRMLp z70AwO^&xPg^Ol_T;44-=OFcLSrEdJJviMIiEkDYBDU2=jFI!QFvwBw}i~4__6|os7 zE9N<4&1J1}JaZH=z3=_+C0 z(%ZhUKL|oZg$3#k#d2#pQMGJ#^O!V7#F{9{$Ck6^RvKKYW-oKxxmi6BXA4rFH;W?V z6D43q)xy(XG(E(-N-SbBx75%aGzZab08l`$znn=2T{g}GcC3*gXKUC%YBx&*?S_A} zQ@dF6Er&W!e$$@JL^w`!V)&MM*zKR9k7thDt3vJ{KI&M!6RX z(z}%DKq`P~IO+3YW7Bg@i+OF$EvP2EET--Pufu8Jb>!KYn5z6tvFTp5jQ0d`k>fMR z%%0OQ6}@+C7d`Y&2h>JQPgYgPq^MG}vhSkz5ey{cDh2Qen=i+f4oPlpPFOQpPUb3V zFt=!(XZpnbT}4S z6JyPh=cp0XwP*9~$$q ze>B+dO;8l9y;W|}Vh%^7tOUN+@gGl1HvSUb#i{o*81giGpAzGs>C~%wMa>!MG_2BN-6H255C z!-+Y6I|snF!9B18h|~u&aidppVU?2fx^u3LjV)o=J=|8A!NhG5c!r+_(9;bJ%;5lj z?hfqeubFkBdKXc!LYOl6U@!T~&|E%nl;H#QsaHVwD*PJjXJ%W_gIUB?uDbJ~RP;Li z;p&+`T>6b&X*`Pdu)w>6`qjWzy+)Tk^a)GY?BeR?c>>Aetz;cNh6=P@AMf+5emhzJ zD2s{r+_d5MpdO#?f_l8yseH7(SdS8q-z`D*eJ`XHa`o7Q9tWqaZM4~qCep7q6c?YCi3Wo)LB`yt(CLl)$cckeYB8 zU9tm(lNTx}H8+YL!{c&`*owcu16y`dsSFwJYbBbX@zSO5>>ZQ;+McuKUq0|-UQ>fY zly8{QB};;)pX+dXlG1^P3cN!rZI*K5eWH7T3++HYtzz3!AAzs)MW?%wy>ua+DlNXz z*&(?!B>%1AQZ+y>fbOKRUs#xKkq;fi-UTEiO(uATT=dntpHU*Nub`2ItC*yY5T(Vhxq<1YnFihlYG?=}xSW5J9QN{d=1|l6~m@v_T z+*Kv|vBevZ4|wUNsRqPDKcndz_t&SxJO(02GeR?&LWbXbi)tU`Xrz!f+5lS@LV;Q! z6Cf!<6(j7!6ex{1b;!@ak=yRRau#F8I zHr6-Zyts@lOR-=TmU<1eEkhYgEZbmyz|6|us!^@EspfLyTyY4EFd5JW!`a{+NYDC~Q%rnh8B28unt>gemJBxllg@vU;v ztD_h;V<*-S;6hLDxu3^F3UVNR;8*WRrZtF)a1YRuly5&KuM`t?_5r36FJ+YBzI!1x zkL}1jTLBeF$P|E2Zx~Dv;47YIDz@Gs6be4l=duhCGE`=zw{xITP`W-h%YcxeGAq3~ z7mb3_HFH>|NBG?MNc`P*5$zs~NTHMLI)j=Rs)Y6*n?~Vb=B76A+4>~|!3vi$botZ) z_Qj$|Yyxl96;(Y6)GGq!6{10b;45CHTPM_^PK^^(AV2XB1Qt5{o1Q@b|BAVCZV0r@ zg9wu;8+KC=dr+arlBRM8^)>6ZwPPwY(@3^R{#kLWfeOb1r{$4HLZZHC)#NZ`12A?Av~6&R64r}Ag&rHruw6>7Z84IEx-(B=E#U7}a z1>xZdvL862-4&w)YQ|z(;5Z2Yb!@(|OEf*kO&voqh=tS8cQFm>)jMbw)U<3~Oy{U2 zi+z=d+F_jnjQDSYXK=*e$?m_X*x4{8x~u{0ljMy%5Nfww4S;{oD-|EJ9L_B!9d)I` z-^OKhm=43|xb3Js=~q@4{&m9j)xk4>0qdc(Pzhvg0&dU{UE%s$=cKGu^CB;g`7!-e z=@z#max|mmQ1o0VicfS)%CZ@|&Q~C>OABZclP>_8WT@SNE-B2xG~B7?$~2x2gI-Uj zgBBRcrzV0UY<*RNyRD~)kD1kvFfnBvocxi%?iZW?^opx~L&3$L2{Ly5jM~suK(Xl0 zT`B*j-V!@EC^tO*1(YzC!_b=1O@hLVB}ZZ16X0C_TCM^AG$PbDEpdGu`n-#?F7WF+rxoWmJ^2(w403L$ntymiM~9Wa-8 zB9VrWg}`gCRI623XNcWy1kUdC;6CLBG)gsxoRZb1<&?l4N<74M)txD|YMyj8ocxW^PUkk0$O99|FOq6e*= z_7rJ>nBCGU)pOSqC>Iijp|QA^=s)+SRYK=oHZ#I`S33OQG?bDqjipoasxC%&@OCQ` zPw7VRB=Ky1*4}#fqSQMu;n8p=?WT04p6z9dxwj{)axR=l+@EpD)149i%jOZgH%Qt; zT*NVP78Qa*VWu=B{GMVpw2ZOPTv)IS&T)nP=#NmY@LthD(`oqrde!D411_R1z~zYn zVlE+edC!xs!h>p`Z}olm=u$ui1v})-<^5Y;?PB!6;F`6v@YQ>$Kr6nWm_F+Zr-4-K z`Ybn^gIo>S*ep`&)K@{z(LKRru*Gexx}L*r^tULKCnM)>7H*@9D1&c0e2~i)L|_}H zDG&i>;nzNgY0b&Y)NP|KjudBRlM`~<$-8$Vmd+CqRvwlA6=|dU60LD1+qeH%`e4!;yrL5yeTpJ2K7T zV;77$0?P0-)v&WoLu*vys-ir+XTj@1JTQ_OHE-g0edGXh7u%KwYn9z=n=s}#Bpe$v zyCPP;#aD(%$bHi8yfzIi!wk1@PU`~k*3ds;?c?-C14<&>wO~^to90q2)hUnP3~E;` zAUhB3bLriJ-LtJzJ=L6SV8ZxPyB>6hW7QafWY2{((r^!g97 zm@6=w<BvgjLImJBFtH#q2Y+h61OsgfpHf5o?c(lX zk$Z^nvgm_yP?;#1g$VcoUu;ywxiQL;TKfJ|a@LrK@*e%>(;i!7H=|6HrudCw3-T~x z-nY)q!$3{WT;Rl0hyhewQTl9`{)S%|40B)fnP8X#6c3cO?+HUi^~Od$8uJ-#n5|+DOf9@ba$O|Qqo4I$EB}=>& z6@=7%zdzcvGPh;ya;B)LY}LvF5B#y=lkW{j%5Y1pVmMaadAQEfs>%&B_qoE?SN3WM zJ#{vR$i*YeT4Kxw#(Ue5oh3xVO9N{fT@=7k6`bt{^L+iJ)5NHG=`*oMh10{rFfBw* z5@~~n0dml%ao)bhfA1fm@W(7=*u~d=R)S#dRyV$D#i8hPv?^>ZOAzA*O6ZBxf>5fz z^lLc0^U^P!#ZB~LALK4===>`ISnK;lqz$3i`+{tlO7^<#g)ob~k117eKK|rci1Y^n zz;@=iaebV2FyUx&_sN^GMSe%xcbJxT1xM6*92`9j7aWuXLmL`~c+w!W^ogDt4vop2 zsm=o*@RZ|$gW6*7pOYtPTA{T&Ak49192Rtc`>UDx{rM9c25PpUx#v3~u5cmFHTE@7 zjMaD?`9Kp-K)90PFxJS1t#h*NML-~UKSZTK(CcZkl{EDj(9RIy+e$p1~TfgUW)SSB7m?TT=Kmd&jcWuoOr zJO)Y?+wx@8pnhGIFQp-PmZM^%HwQvVQGci>p65faL;iq9FNOfFXcUO&>}U@SUq?+T znzf}!K0&)J5tTk04sP+fi6oLCnVUnXfX68p8E3i$SBjUo_Zuv}fOACdRMphatsn1ky1a6587*NnFyX70D>v~-ex=f-hx>9^?$ zB^yk;97cN2{Uw29Anth#*$f_BoX!xu7tbUk{Au9(zs{zOHoMP)ytw-O(XKb z$ldR=oCTpPZ#&f#sz8^TRPK(#|51!dYk z+ZwkM8k)_PE_f(dhDTf541jje7pKKTjvGpW?hukn!V@!*UZKMV)&DTjGHB> zXq7v#TxG>db#J3VEbSrKt=3rb)#ksQufm|Ui z@}ZjpT_W`o6DQ)@n~~{=^p_R|ma`DxVMT&E*ueAuC+=3>u?Ue)d1VO2GIe54F+XV?-7|QN=s7M?dVc#(XXo!T1{T=qGMZE*;^Ea0H~`_l>V=3XY8-tL z5pyIWvP1n+Fu^%JF1g#EB65_q8)YBE2u+DCj(kV6tle2{HD}iZ0q4m>wyb0#*tmz( z(JZE_WJkn+){pi>1a}9uzr@PepD zno(4moyxQ>2tz|*|2$}xb$}yH48)9P^CWIIs-W+DNf1_pg1y@+W%dQ6U+YdD1^pDA zDBf~zR#2UNP%yC`XUAQNnGTqI5V+MEsHY;oa6JkQ6}`~m;B+TaqxutJjsRx=-4QRG zNuRBS71cu2D1`TiYA#V@yOVjMJXTT>hWaHAKKU%ketO4Kg}YIh z+wrY~rV&IqENd>!dk0{9VAlw8y>1iGjFJPjSMdk!I?!Ye{9rMpfWk8^L-RJ@;zbBA zUGOL#`*esyve?bc%KP5~MD%Gp=sIhO@hYsqVk5_m)v^}5)=RN*3Et_Ifyi6Sf$YX< zEUtyMhDttnf(YjMekF?}c?|G_=Kp(EPCW|ToA*$t_U+s(bRUxs8v~3vJO1UQlNSJN zK@<^zO;$AWtDO@pf|U~#qyi~RNwh&I(sgzj=|AIRog{{#xdDr^6u@dap?QaeCmL7oOWAS;9~<%ixFVED8m_! z7H#p{R7Chdc(S3>@L4&r6XybwO03h-+DI;VmlzJv zDnZgm*mmPd)h(ps7Xj@kMfxcp{|?YQ`CbVS%CC< zvuEJ}uJ)0m3+_Yn@>c37LqpAuJ+zziK|0tZey?|4=meRus4_*2+BWx`fec$#^>vXT zRBH6$GtdC%YA!bmi@c=KjWM;#VAn$Oq+Gzykm^}jGxuCk`ftL&d6k849ML9;VH6wL zNe$M+N~=oq{gc&|z_@(ntqS8jl(Y{hjYjqZ3t!WM;cEs^paZ*J(_87`{`-){ z2Xd24+`c3<*R1MrYKz8+MadO7@Qq@cbI5jxgnNegirNg>^9p}*#T^-`;!qj>fCdYe z?^aIgcnWE?GUo`EL*hpbvL=vf0Zb-EbC*3++`h$q2fD((XfQy0Ak;P zh#`4jq+J%d(hNs|H{X#8YY`Wwo^!5G-IhdnH;yqMxKjuFVDYxS5rG+`D+7uf3 zQ?G|VH29I0S=b2?QWw}t5)!Cci4cjpNK+kvWa38+ECNKmf;ocV>UiIUkY7&_(83*c+gg7w-js2~ue|-GoOuK6jv?v0)iO zk4TTyxf!-U4LIU(W`Sd&Rc^#ZD;Pqk8~OlfkC@{UG!v>^S?O*AzmQZRe6>Z8o*sq9o}{{{c77C0u$kKB9wb z;$|QLkN+aJID}qx7syt)39Qa6diUs$y7C6;D9^f*LKTMIQNkhy&-zb@G7B4$6S-Ud zhFY(r1=nLATqpON2`)Mwv%DlGJ))F+&_^s}s@`-ZbkM@lC37TP9Lqvu0;2ihv~2E=^|j59Ig354I6$UX=JV`+lcG|B}8x*6(-@ zri59%9jN243k{L@Q+!bp7QS$m&#G9^aIy701$#KuE5%PSQoovV!E)XtSza^7y<|o) zU32&b2ayXaYmQ<|ONmEPXE!3z)6!u1nH?zbRCrV1=L2o1;dBo+- zkWZbV$iVh%$100zqhiqFESD32ME5`ecZLPEhblE7oCk)#g} ztDchNX)QD29D=eg@0f6ZmhMUczk{xVQ2XwQ8;9LTZ1Qs(aXc6v21gqd=y+mwp>T~f zMZ8)^!>Y!~*cJhHZfT$B)}+=laWUEODT-5YKNReyZ#ss0C;-8VibaQSdH2*@wM(yz0*z(ZME zIBOg80f><20>khOow(SJPXMX?MI__)<=JhuagRc+Ip$|ob2HrO3mqbkRG_4Oobd#Z zZFq$zA|ga-kRGn{%om+Fg*{tmC`s>Zz|qTxU4X;&-o?Ht827rfD&tSP(&aymzZ@V3 zOr!>j#oJAeJDs-PKxeO(Y3Nfd%@+ToXs~`+HmVF<2D(cv>QDugbE{O|ydNHkbU90$ zlv(lwn63CTxDDj~460R^he#7d!sAaTz46@W+>;daKC*|Wmu{jGe>$SZKn3#nRu`m6 z6=Sd0W(Ozawn(9>I_v$2bkzOAwccnpouP@r%36HZRPG;F$M-N$I~zLK;BUF6 zLw1WRN23qhSF-Q~ulyJ}!Sy{v9U9Y7HSALG{5ZD{Gb>it?YlHS7MfL#-UfP*a>i9*#$<8^$%0erBF zIgbinfPL}#5065`n@A2L8MQ2=Xy%fKSA~4%vUraU0>7k}I_x}KSe{-56r7&qH${I} zw!UBp|8j?w3MMdNLi;4wHK`+!VL1bd+ZXSMbqDlh zz&z1fU~IQ&T0^5Ph0IJ+uMo^=uiXGV?h`4eei%P=M3_gl1CJhe%bt z%B&FlC*A9+t1E;IZU903*4)rV_~Kq(kdKhl7!oXcY{Fc^iongPLo@Zte>3&CYjRH< z@Uq*e(Gwf;(3vMqYGf$?|5vag;JCi8PL+64)GnKFw(9!&Cfist=nRlSC?1}Ic5ImbOwYNJ zU`(#M_J*u;vTqL=*B$=#Hc}@d;*bSG!GP8CG26`K=lWTG2avtjPd&2k|1;GpQExsbm-kW#z}<-3F5E_Jc1glsES9Wmu)R zBnHQyP(G6&kcWI2N9}dOzdVu_N4T4M! z2hJE-b}H_H!g3mf`?HzOi8eSgYt&T0W*)1)19k3UjbJS;*<;y_*Zc=Cb{lLlLHiAZ%FcKlr~65Ah+(e51H&Oi6hz_%Z&D){}pJ4QdTe=G;gm zAIUY&1RQ`hK5pcr+QI^>Cm5azrZ`?~`8`w{AMfh@o zfgi=@zWJy-DzZ-pzzgx`I4Jw!n?`rI$Vw|N8sGI#SoY>s zie~}}z=g$j-(b(9&ky0ga&8d3e=2$Tf-9D)i9nwHr~kGC?GMYG7XX}91*yxO@Cu+6 z=QC-aPucvZBt|@2c*V2wNy^eeKguVa>bMDUQmjU))Y_CsX*gc2sB5*$ZNjF|m0ZQw ze{Y>_cY}o~-Ndvt>%U#l9L`POEK#3Y0g{bQRvkL^D7`Yddb)~hRX1gVVsQm}K`Tle zTa}?Op78rgg@6SW)SlYRu6cy*v4T0rQsL|q`3Gz92i(VZJj$uhp2lWtU40Uazi zvFo`gfzQEm>Tu{V676;XN`k)SZ(NRcnf#62Pg^*3`i~qvD2KBrIOkfq*dAE})Q92> z7U|2qZgV~L)Sk1uzO^(D-GCa*5;Hiyl8C1UGD!S_-ju0=`e!>L=&38Jo_x9{_<%4o z+KGgFi_GSME<;-&GO|>fvt+BwPD+ql+ofig!9ANWDxk_zGlNMN0E)w<8Sv52{53bY zvYTddD-=>TXd}O^=b0T%xkE0~NY#d8H4ahD$-R}#ZJU8sZ3Z&s zm_Q^Q4?VGQ7br5riC^k`yN*Zxvoy9xhakYT*ZIna*2)Xr;Sp-NY&{;BJk@B@`NXrA zO`c3Z08|&S+JuJH48_LOdC#sU$PP@4UFfX~%pDm~Kvf+F9x&A-q=?4wnbY|H&jPkk zBB-dbjM{p&n;RuyBthO;T}GzxcCMD}*U4l?q9d==K$$(1qm2+0Tsj~x5z?&)`K=%y zte5{BAA$q(m+Y--MNmm|ktVD<)Qwkk3ly>Hf3bUIqJv)`|$Ou;-rM92z6lt53%t=P~}`07nYdRXjH zKQ76ZMPsc|t{4Ef4ON^sB}JHNWov~HA&Gp(;$v{7WJ}}2k_{XGmK{0b{u+bHMa z1;e_^0%&gowG}Wt`N191PWH(sM`oDV)_I@7P6Irm7m+|!;m;x@Rp97ROO_#6H(3*p zTo@@by8`B12~#d6v5<#0%cqG1AL>BJNFIExz&vi%Qb*PzmakR?@FFqE48}2EXG0C? z29&RFv!dUeR890GNnvp28}0K_a8mHN&O4(?vs934>_Dsxtxh5cS%Cerf2ZhiondNs zfP#5{PkQH_y+ng(jRWk4mVz`5Sf*4ypml7-$A%ag&-OMm&lr_uup{|iTLDeU>)B`+ zpeBRLC*Fu&3f3e-g$C}@c-)PVN2p+fLh%xQ(l)M!I2nXqT$7Us2@E+Smt-9j2%)F$ z2f9P3Mu}8RZY_}h6 zbP}Jwb=8? zG{{vMY?lnsOi@gs90NjaJDq_n<^?~JM}xK?LExPM(ayl(UJ~1KPW>1#zLMlb%cpD5 z%J?7EUa(qqgcfaTZ*m9NL=?a;{J%BhJwo*Q9+Gy<6R6Li7Jw=PE;S1d1`gGZJRoC$ zw1Ozx#=0j@%1*Onp;)x|8m!INfJ9{Dzjp!S^szH*f!{b1@=JIYiF);s>_-oe2)Ae7 z8X<>|4n~26%ykogFQAfw-_=*&To@g&T2zmq3X+BnM0&u2xxj2T;VnjGf($hXBL#@j zG_~+0!q7j_h7@t=??Y`gIFt*9aaGFcM<;L2}p( ze{3SWll)iUDA9n`Bc(xK`RI4z1p-W0@jI z2BZe{jT`y1j-n1A7-jJ>!k{s{3b{vah%Pkf5|RTa=W&k=VwaE|ryTEOP@V^%Q#y5& z&j1;h{02GNQfELyE3WRD+&GaP-QT%|C!!7+8CYK3&|4fe)*|Dh1 zz>ydDHv?;`zjQQI`*wuuIqjdZ#QBMTp(sKBlz(j4-nG@S`g;GBpi#Y2^zOj*68drk7j=a?n)k%5oA{C%TnMkpiQ{| zA}FdXCF*}|auP8y_(oA;5Xcy%y(`EV zI}-p_fzsVpNG1}rQcd{M44ZnL|8V`xA1`gpzq^7l9E~VAgFgKjHmL0q$teM?aDIxN zM&dIhzh^cwC6%cr73|h^P5K5S-g}WgSUfT&&hZgEok7s z+)&|2q-CWji55pn0gu<;u4Q!$2oATw33o$&3=zbr$&i!eVwe)MglJPEh7PVNET)&{ zXBp^&a~n%a1r&yB3;CxLie#}s(;$FHm$jZ&{rTYOma~V}i#Xp+M`p;HM4zici(->=eSsWb5MLfjY2l7|ATd~U8gJ5>!x&qW zWkTe!u@BDiy?fQiZ3iROi*q$!jo_BdVj^&g>^=IZ+UOzQv{`lCu89EKB8Qm4KNZL) z#p){&8@WxTufX9kM0hCT!7!eGuTbEH^p%(lH^4mS0JKzVL=8BU|HmD$|DC@)u;GGX0Dy z0Xqv}CZTdoNyvo9xSV?7i%AB7sd$MsD7ZXvOaOwKJkyWygRO$lK_7A${&s_REly!+ zwKatZ(p(9E0cCzCVi(GL7H)h1yC`VGFuD9tqA};9R91*aH=O1W;QjdR;^>zFR8gAu z)^mmsN)!|h=#&+wkM)|5@3}jhaO3G5_RL%m+1@ ziBmW`B3C0gx1dO_AU(qm^HTmRPqmVa$%8Aa?`N?`5=6nINod!htk6VUv+S_&nt}eQ+F&>} zs^(p5cdb}naH%Y1o@7WG4`WvG4Sea@10;Mg{#ZU=G-4e;Eo)P%^h0eF$j~oB(1#eD zf670p+JpXmRcPVoywK|>ErysoPN;rRORU9gp2hubs!x(kBo$#9+cs$2{)EOo0Tgq% zvA9V)8UAbDx2YYaB3YJ=HhcBi+E-A@R4d>o;JkI(rw}1^d~#51M7G`lwuUV)5n^p> zlH7P&18^2Ooe*|dx<$J&#k{C`u?dZxplj(mQO_(f4oI3#LeG7ee&VF~5t>C+>C!!E zf)(uJ`-<8cv)!)^r%6m9lDq+nMF#G2ObTH&Bo&rJi z9KCemO6|8duW$!+=7+|vzrYXYk={(mv~m5EC(M;TQQpAxP}kH$19eCR-M~-HWr6RV z!2l;@D&Zb{2@ld6f`5KORFT_%O;_9y2uNJyF4V0_J%GS(nRn20;RdIp%`~;8N}0Vg zFbJ<7h>=$`AwfSHl7^zbNdS>huG1KK9?eRg-K)@Nkhr-8$*>t1ObbpZ5%KnzEuy^1X%TR%N`PHqBv8^}lzKTZhlJkM^f%kqvA;50wJYeZ`ZJx=4MPdeMm1YUf?S1bSP%+y#uL=A=pT}7N-^t1p zN=K8Jmz#&o62P+`dW(dbe9Se1%1f=%ZlwY-!XvEzGAM;F-Y8~Hq19nkSfD$@om*L* zQ-(BBRIuLoSk?W#2psG7i_-)s}L8M$V9|diS^o`K(D zm{@&pP=hEA(X>L&I<>exr#4A64GWiK`H8r-xaXIhea{BesQP6)H=9ql%C7*oc80+{ z_=x( zL>T;CCk%|NEUX-PNymmOr#L|E=@nbs9>RgHzwyjr@!^Cq$OS7qMZ5FzFVt0vSfcgE zzymnT6(>=#>q(ul**ClECnMu7NvG8>zelXb+1HxbibN5pm+)A+kqXbQ_K}V?o4>GW zFwtR-sA2IA(zZ!TSP6}5n|(e7hgv}EtZODfK%vW->6$7IVofC~Hx>X%Fzgn%%FDtj zS(q(c*XyL*v5fHo?8qcmCLQOFZPHTLQS9MiwavY03BbMQz~4B#t7$;nmaD$4S0*BP zrj&!fw-$hT0h66%(ngISPUXo=cOM?#ZOb;d)xF6@u0!2SH#PSen9tQ4o56d2z;`4H z1WWp4Xz&#HPwu|}N=cBebBwDsZ^bY@k>DL~?esec5;8yQoK64!uwS7U3J5b^qb>^x z#rCyL1ehqDc&JqWJT=gM79wG1!~QUsDd~pMfM`LYh|dUv4-Nu3Vh-Q@wThN5FWEHX zS`Ho?2jWKg`%MQ;1RKo;X=Np!=1109ig5)G`rd${0aB*5yonRwJHXGGa)ewjtU3 zJ!&k4-e6;78kFq=s-gezFg)}64akFwM{K;0MibhE#$JD98GES2%2lT30XriOwrWB5 z`?W3AA`<0YvP+Rh)tiUpTogki`&ZcwKauNc5quM#u~%~|Ko%Ts14?0ndRs7-rcs8TgsHA4A2Le2YCmweTcC*Apl*Y#|go^ zw6`xK0SG|fejR1V&O_=WNMkg1<1-F6SWpeIWTNNAdaZZg1D{1B)WgS*AUV8na){^{ zk!`sL^dP_tqEHQujs`6AVXms|DrJ>jji|L&m9T3Ak|l@-&FQpbpamwlRL@e%Z#bNY-zUzEC2r|vZL_Lq(Vh(4Ku^G zeKg{V1wIZr^!ROyPOxAceP{Bev#c}OFEA__`yh~P-*I^J=++9 zK-C;wB%?IL@rHB8rZ+*0#JjqkF8veW3+b za(z;XhR)nZ=hX15lSHCP43K0r+G)W~1#7J!>jlO}ZTpHtC0iaqK%G0F&OwzRAEx7btK z(FiUGvR+^`Ej9xK52{*qfbf7<%(5)It&U|2F;jWt4%CRH|&DGsf3suO6Zcm8i{hjLs=uL3ETR`e~w`!X&7P zf^dQSVIqj1At+!3HAzkou2c@IHP{1r+dIRsE9f*Z=8A0`>6YS3w7 zof*`zgtbRtyqD`Ut(qrT>cqu4Z;JJ@fd}}?A)-^n$W8{bZtw!r#Rzs-0%1p2^Xym9 z2o4=sJ+mnkh@J@P=yWTTR}=w43Sk>?094#i=Hy5s9u1LnLPf=^htrI!86?vw0xDG9 z^8d!F2JPs+yuh$z9MBnTFdJzqO}jt9fc(f_I7D=e0I_ofNe>hxIue#0Cxx|10a+~2 z%CK_qRTHGZX455`ts`yw;l8R`AouDN#rQyLwrUN6tQQy+kq(*$Un(S2niih`g&Kx{ zxTzNivR+`UHrhCD14l9`)r$|z!>exWp)v4D-IJG!UIgcyZ*3}-$}~IOYi%kD`|2TD zDb(P^g_dCAKR7tu3jN1Pj*kC?jU#%)fSzfCQYay^)!)U z3C*N7kwS@PD~*!aWCb*__%ZlLF zYJ;1SMtr&zzLA|HNqUMn0;VMPlMzY0!wsd5yQEI7(=~y>iZim8EPM43W2|uoixp)| z%9>47K}cuw;%Sy^d~?M(;nvjXFHT;hE70 zh6qy9jy(TG%a@HJNPp^>(a|6gsgo09+2+GO%ghMJpkFmiv!Br+W0Q2u=(v~rK+WOg zhX1M=f}MY%(J?~}A!x+5=UUpxhHZuwcl!|L^~xLOK>9E;9FVJhHV6kJ0|TRy;qJ$K za~7Uw*V#S0&gcO-qmw3%77C3SUUsqaNUSg&oKjGZp-E5J4*7K>RR(|1?9+yc_I zQA$z?SMr=!UcW!q$|txUjP zDvxe`&CC_oG`Nj49-0QDBhUdu4>JqilLSc*g&nJPh$u>t6LB3c;zoR@b__}X?6rcoct9b7(?Jme@-aQgT*aRy5OK1L$^VPpaTRQU=qMd8q17woyfI9G`T36fZQ-n~d-HfQUh zp`mRE+_tQR%tqUH%wtyIufQ+H*Meh|u?@+iAw)zda`uhHT5rUHVWNyIN3Oqpp$zpq z$75o=zwBf&zEfOfDV=$$^`noW*wAL00M4VALmm@=kMW^};ln$W{R8m9@WuE{SVkG6 z7t&eflX>M+A$>C6k4A9x+o%+JAa5H9$0%czeX+B#6{*>)3ps zAHnQtj2PB>5AGHlz^3epM6!_x5{r7QOo?=D=Uwi-4g4??g^>sriQHB36X3`VWsoR#06aL(@THrUxM(tcOJvO#m|lVodbW zlYa9U2*j2ACfF*n#Dd3Y^jh{>HnP~$>S;NaA04QnzMRq&$EN=T|61{Aq9qjQpIl+o|qgkq}|8>KjO_ev?Hl)AguNL#5#YdtSI z9>Eq>I$Q^hZqaPkFL52|dY+Z9;Th+Qjt2X?hAn(geMVt=%NSh=9BiH=%}slt*{WGu zXXfACl;rs36{KdXh(h!v)qunp$S9TaT}th<($z9#+Y0HSY^M370Lb#CYR;}Gi1FM= zXO$BasGI~Hfrm`xB*HXLCC4Bqihk-9TYY*%zJ2-;$IkZYhmuc!=82N{em4GQpW=wG zp>jm}8m0D=G!4p{2Ib#i+bq|;)V^bbHuU?8UuTqeU-mQ4AcGdJ#k0ZrDJ3(9fA-oZ zfApSVR1W#SecKoFC`h}uO%H>#yPR#Eo0pz4&!)50}2nYGFZ*P^8N5%Uu^&5s8a-e0 z2ODFIQeybl1xh0_Fu6g1_}qRPu5(dr%#U9Am0A#1{=v!>NQ0iU8b)0C_5Ka@f7A?d zaZRsWCDZDYOw+OyQRzv)B6}(Y=*wn#gGPo7ZWyKHVB@j$k-i_@l21RA@@Me2&tbLe z6Wjdxjecg?(ugbqM3zAdS4%0m@<#m8rv1e8M^D3P(4q}8FmWXiMwVQe@{vWtyCcQs ztu%@nDSIiU?2)AnS>hlBCTlo^QbrAK$eM8-EbWCPm&78GBnx_imI%4K{7EbrnIldp z$vy)O_N80deK-Be`Wn>z36_`)vhbvvCLAM<{4Tm&Y`+EX2 z{crhLzS9?dl|A?JyB~_uzdyvaW#8pqaI+8X4U27fD8)7R@6VLH|5U!{3bmKNeK*kG zey}pdC>;ID+fUC}-I76Qcq7i&fX!2-0c&%eGG$7xo@Fs8ni?B=`1k=N2$hy|u)*f6 z*!-huP=1Y-I#EDzZ;dGK^dSUL4sYf>cOiZ>C_A!xARXoIE|mm9ekNlt2;GRMl8LRa zRlglEfxcL??a_mmDGYH(|mQTCjmbjJ-fH4CQ3zr?7P+0*C8Q8!fCh^iC2kDo&yBw$7IJ^Lp z$s&b7kWf)UYl_@AHYmBH$n7Iin1P@A1RAmwcz1)cAbSxE$ck7fa(8#bkId_>?I_Tvi#VC}9Z^RGKhiPFdoEE$|G?h79D{tapfK>c!V1BMiXGf4M2dkDNJQM4W022} z&k#1hSKLyLK|VeB!H362;gWI;@)06dtCnR=AOR6Vkm7PV&{mLSw1aDN3?kyl6e3)( z1Ph1|p#l~mz>3_f*giR@`*d&jo^#qdu}pi6w=`$_XAk4OoJAas*rF-DPg zCI4l+yJE}i_3*=>(_6+EV-nK}rPy@ltj0=;-J(BaN=XGOC9Gcph%-7GiJ^qKgw6jr z!*4|}#*ny}?x)Ppo8X4=hlYp8sJy=qk14(Xge8eGJodw2FlUlIht5bJYQD-3ag9FI z{5f$A=~b{z=}B*6`q2+@#f}CCqvo4Fx>RsY=~cc|deiSHy$PHCX7nYDnqT_p+F`mO zy$Pdc>33*f!Z$oM-E)7lz4kk}o9;Ok98s@FrmOU&Pr|&3I3z?9nq)^pD|Wr8K`GrQfqWH% zO;{4{2<9ul{?o(Xhd+%!kI4LUK38T{}&+%C}Vkwz)p&Tj7}fS zm=yA~F>Mx>a0L-9a594}xaLn!PY*s=f(}M3q4A)FB81>d8H?rq$%6w3!J^!W89`Bb zq+6kk>={Hc21ou7At*<#MCn09V3OTN67CO?0|LnYIm8(=;^5N2Mjf*Mx8R2MdW_7w z_fMlKKtyz9WU|u?18K$X#6RMP@d=O|CJxe|{|gDCRS=U(%ht;OLFA9?iKs(v@n=bn?f za%6Z~w;V z?X4_6gk#aZYEQ#YU-Y5|v%jd%^zA^s3wHS%?@_iU3nV)E>FW(zS6sVbfLa})bEh*f^S@2J_^gf@xDL0R7wtXKmTzi4Q4s! z=ps?n??^q#!Zt4N;%&TWQ79KE?0KJhif>#ns(N43FW-Cl z9!6D+sv-3*U*kRM`@K&->Pvl}4Nr}W_ppr(&jX?h=Z2@odzTk~<6)WOtL$AK#=F3> z2w!Di#JhO!Ls-aNJxIu( z_z>!oE+^{N_HDAGK|KoF@X)wC>Rqsnbh!-W?5B{gvZv85-~91a_NWPzvyVJ#a8d8_ z-oNlXH7C!*{5*3z!!+!=<4r?c%lG;5jryKM}18{3ZrV| zySO~+Yg`_MdKa8M#WksSc^7Qs@+sUuG@3?l)+O~rTqxALd=2Vde)KLbpTairZBReN zHTrN)O`EWed7%^Y=@=KE{bT~vQ)oV!Llep*no=}wR5V|2>$g4Xi!PThx?Fgbe)YRy z`1VHQt;}fSifjMnuh)x+zkn#xLwF&$C|CXYHuY`xH>0ONam}{j8|||n;`*EJ?bpx# z4e9IKxZ;v9O8)lsJB*STRRj0-xwrKjy=D2TX?W(3>}xg9w_lUh8cWkOXx>-u-w#&y zpI?oc7$i474Ugz@^=OE zAarG5*%YZ##ThZ83>gDMT**&Bs+Hx3Eb_xH%im(e7zo5wd>QdW8KTTCU{Dm1T}%)c z0zBf3*n}9d$nrNLbGDjANd6BXFB}~mG)#DGHjZ2v@m~i^SfYX@>@Z{nm;8*zr_nrm z*wCP?g8V$k9Jv?pxl(?NG0ty33U0rQUN__S`wE7zU5EuyC(%gA-LY08iR@>;6KA|2 z#(;5^L~O|_BG}(8le-%V24q&^L|mtcp&pMqEXr_?fs)8q?H&V|@ zi=f70vD`6_v7onTac@haA++CI`cLaR4H9V(mP9WA2~Aw?-iGHN;GNlL>B=^ zT=loeO*Cxny|Eo)M(Lchra?-xP23`dA0P2dgRB;!dzvv$jKbmNnFi^Qtdh+vex1os znF*k(KR;|K{qje#^+y$rj_BRp-9@C42IY$$bYfm`rI8{H()c89$eHp6N*Se;67~yL zLtf#*X0lsFD$uHV!25jCEb#pB@CSyxdXWp^PZtmLpGCFmQQ#@8L@Y45SzPy zVCVGBBSoViGMV#73q_$Pu8>=<$Rn~9mU!5Z1Sz?Nv>sp(;fAc-Uy4xrEAYc+k(&!0 zW4D}0wCF#d^l8xAdp++TWU*jGI_FhrL~CC%2)+8Hiu~5;a!@t+lfK4lR=#^1(%-M? z@32kxE5FTPYQtl5Ki=@vti0)O?nhtQl{ewY@)#9tv+^a(+EzYPy&tOL5?;Y8-%WRO ze}(k^5$L|3r>6V#dZQFcbfq9$%QHI=NTX?0E-R-B2-E&S# zX-22)?v^cOtsRaClk&Ol_AbxH&5Tl-(ae9kQ+nOKTQNqO(Ml~nX>)S!USo_I9nle$ zVNvQQ>h74Ml*SP^KW*bC{WB2KjfslyIXgS z6b{K&h)T2SG|Q@}8O3h3SvQVKNt>urQc5Ytz@*Y&Qc9^$Z8X}p&H;1II_qy8X}W)D z{#Kf^P8E)>&=qQ;v!z7~&+}#`Q8JZEadKwAy?{Ys`1{O$Q^ly1PD$xYe>tnHmC`9? z6+CRR{byEXCZ&-G&~S~6LFNZ+%EM!1&P@@J)Bze2nPk;!Q*In3ad+#ojw=G%ihxE% zKsI&7R9Rw+^t$CTl9HxgXi90;fy@DuQXy3vjW%wyZ5!1(8(T+z>qw*y2PJu_)Hz^E zNjvMcT9p>=)Y77b$F=Z0uf>J)Tu`VKhf1YVoJ(0j^^`frJS^GFYN$LZJu{Dn7JNGr2lW#C6<=?>LhC zp(pVkl@Gm$BV38c{KtV-KJ+IzPUKOte3R)T2(n6+Zzax^KvHNDgcLwaP{N1|vi$ye zBFpz2n8{=^{Yq!UwDKyQjTIG@znu-0d%x7#xHqT=x%9JJsa$$eXQM>}<^_c37MW=*ypOeVM)l>Q)e?PhSF2`Y&Q|>&JW^ z1UK}&I3s5IQb+dqQz=MxjL_FU=K4P)Y{P?XMmV}gDNjEgqC*yvz?s4iJ6PcfE_%Zg zgn|IY2XMAf#6@5J(3e2;eUm@EqI8FwQJRQ_60$%653g62Bsc!D4+BANrZI+|J(UMr z_Hz0+nAJMx?Qh5w(%m3P!UcBgBUnFH`t8lnmBtFhHN=H@OD0M=2K~IGlc5c1^?!F?X@JSe zjoIJI*qY+%n0c|ok6rRbwlcxtxoZAQkM!vWfVHdw*H_ z?&)73R>IL&9sWzgsQO*^H=`$YtnN!+>bkD`4hx}q5@vmL8Z1~5I2^X&sp)?EEl0Yx z-|!8P?{E)a(M~AVVHm18jB1Rkf&1-uaKHVI?Yr;rjrQBNZNFh5H*&|j=djfA75zx5 z?C}+S8k`-rpT7h5zWw|i8%EXNKDy@b;4rFwhpH9Rj4B=S75$Dr_w~zHRHHA0liNVN zkj0fkFpt^Zj<%78y-&tk!c0Rq>>`;`&-81MmP9g2x9U@iXT>+e+|Gu?c586G2IXx< zufg~}VP?QGS={h;&F0E;ZtkGMRlT$itu@Y%bN&r+)(^S(rrbrjFLHw14@6d_-Ai|Ol~#vx56`2|n!FdRy0uxq^F&L~9 z!^47aSS)|S*CoT0+p&}pSAO?l!&^>#AoD`}VwLMvuWut85In;A(Hp)iy zL*KbDd-6WyS~13iZFs^VSXjQrpWdEY$rHC>F+^M%o`4c(VBki~4JFFx-!X;TK1g;N z>^BYF++L((KW)o#|1{XGi94uUVH4%#ZY3S#JHBe5Zasmr!=!z7Jf>ee4eNWuR+9T; zYS0s5vHoFFcN*4Uw~}6U`?RLGj>M1ba3}S0T!+Y|QZb();9VhZ~+9Zg?mThcNw)8zHYZoj$sN_^SUUq~&jpaG2 zp8w?{bIU2A&DCr8Tq4w8KC@MY$53AP-EEEF4<0({VFQQaH0Ltp^??m07GhLz)7T8)# zGmg9~i2+ztYuRuhFazDYUjzswghZqE)dP58U#}tS{8EykUTxV>eW7X+?!i|PqFw|D zNT`ZEr05a3D!;7DkzOO}Epq|RDwTL!1Gn!4<-qPzUf%VrM+km4`R?@$8}JhsbffXy z#zf{`3$QM8JsT+n1v^l%_%cZL_0@HI(43;X{K51EsKHJ$Z~7oR*wF#CCzmP33amf| z0;QCSfy|qAiEKNrq6IHNe<`)lAkJ@CJDBmQg>W01u;vG>V{;x}`3PpcTm0>|j|vj= zNLab4E}#W0_1#vE7%zNe-ORiORA^3ff!`4G#qC$&4>^z`m0uooRU)FO8=Iztw03bT zP_!r4EYi}4S}gIsg1>};jeJu&+z1%-yJCyj&ur{-4NVfUPh^lfYDI}`5q2)o;9E#A zP`~uZAPK2wldL36HtI!BxcHzS4%UdwikUKY1+`swnvfeaug zNxPeVzS$c#d@SK$x&g&2FwE!KGah75*#>D60CPYIm9010V^u$ zB=~`}*bn50d)-yk)n#f~EO58%vpL3J;?)>b|88G=%!oDe+$$HHL(}Y06SPp)-mDX3 zMQVm1jk)9X)P4o4hz2?4;l!!TK-?~zlR&KvKARR>a9b9FBBWCli}!rq&l%=*RW2p6 z*`Z+R@dL`mY~@>5$S|J7ft|l<^{#N0THB0()QkHAEFG$wX;z=ujp}x>OS91nWg_hRUUs zsfJXAAW51S(NHlL-wdF)N)jd2@UuK5`HM!xv@e5JT3&+K^apBYcWvrHm}ioV@%B}z zFtx+ijm8cX?fKVON%C&n&uizhxSG5dS{j$EVnhXOi09{twPV1rz?DvdQk8X5QyeVC z1B7efKnLXC;_I*BOWMD7>Kp_Gqd4v$0sA1#T^EDyy89(qO`vE9nY{D5=iNU?_sP@K zgF}N2bY39g5NhhW(z|yLoF5PFPQ(P;u~+D&8bDca3!@DadI?(J3fgOxt55K69~Au+ zNt7!VwU6!qWsqdfIi!KioK3*j!0QGGD`62>`N7Q6Y>OhxIjo152J*07cta>`hsN{7AL;P}TG*eMuk=y}L%vdCM(FoIo1D0(FRUGF=mM&4%l zMNNN=J8vdgHa9wJ_y>CZcC!vCf`hi)|OXAO$L6b;x(0cHlONlIr1f~I0m?JKB z;#u>hd7{2FH2SLNSLa2XZLH+@%B9$gnN2X}BuU9jwc|7E|BGS6g4s!w(RMOpM3(Q& zz4!=JjDAhX4JMiM9pumj(64;D6E=|7v?Eg^*Su&m3)EAUPc7>oJ?aY9c5j-)iF}FA zIm1RagiWqg%PU-89;`VVvRQIxLvZM>1)$Gkp`z9a1mB?9MGol5f=E8|&L>$pbu+E3 zMT`Twjk{$CPku1qlX588jB1~2_4jiQ;qDyi(tS;&F{2&ncidZ59)xUt2mvtB>iH;9s~FCk-A%2kb3i)G4^dg{{+*%hU#P5YI? z^KBkD5av00@#+hX6sjITiS2W{t0aILs5YMaob@oWW)>t@WzUfgm}v(BI1A!X~P+87Mqi@3+3E`3<;eI?L*pZ(jR=bo) zNV+C5BV9!5T9bpp#3ejCzxbP)XnrIH*aZ#TTooWch~5fencC2kG)(aaY>>q8Ea?e7 za5oNcx}(h$>%Y=5`7X9p`SKm?Fgyx)X@TsX3S!B8Lx;vSqyXGK3|*Kb7%+19?#p5? z=9qpfgPm~fUx<4gMB&l7gU8!B(}30wH_+Y*3fFR!#$me$wd`YBPcVfTk`th#j{m5+-RVpp0SYr_EUgC41byEJH9J>9-M&<3X@m*|>@*0s7 zj2@L#sNpXX*`*Qfw4|G!w|qXZ7q1sEE>iPT_7fBoGF z?OttK4zsBpUPprLX${I$#&TA2KyNpv7+8v?dA)*bEV^?<)Vpqka`F?HH03*$pMsq; zqXyk7t)t1#=xE*iGA6pERU;lM3DWr0jA_0(f-YbL%uF-VCGOVQbyFbBbQEPoto4?- zISVhg$yGNEK7(j z_X;DbzDNEx$^`QgBmaEJ*J2pi;m0e`{47&Z&4jMvHZ@4}M3f5&p%)c)J8&Lv(?sT` z#H)NtOEpu78r)GduVcQTMK*P?9$zQNr|5*O1FD+_2EYQ>-COc#-&||4e*ccPMo2tM z53dE8TvibQhht2fbaQyGdo_+oAVlouz`&sJa!@dfc}Pt{(&U;;mm()+f9QX>qo@=D zI&_V=jf|Uerl36vdbW98&+Yo6I>APELFgOxP2xTA+7*jiSGUQbr(&$WYltH)ZFoOk z%a~mWkF-!AJVRADTG}OSapWAQq1Pj$mc7hDns^u?lyGpD&I63CJDczu?$xtUfPFqN z4&!Z=-y2Mki|O_HeY5f@49CaKT)nmYrHlCv3>}&=gX*FA*c^o0s8w=jZp1ePyZnb{ zloczG4cMsByhz12GZv7i|9@aOQiD8X4IQIz;iqM{cWdQyaTn3nA=D@sjBB-dqe52i za0m0I;`^}W)#RCD0YMxF$*G~$sjjRj&L@UONdwlho;Q0v(q3T3&R+yk63`f35n>T)j@>EgnFL8gw95CUuZicnt@PCmFnzxe?_Gqt$6?IIve84sz%w^x>r+{< zqm^UyY*rO_5ALPU{*FnR@Kua^4D-R;Rcjb0v)DL2DgH^|kXKE}XydVG0T~)RLy_6$ zj|so1J)8jdZG@~y&pfhl4j2D|4qx>$vB1|*1+R+-7zY69s%@z!iPjH%yv3e$*Qi?Ztlq>pRPJVyY_I1Fezg6 zi^gn`zZAr`_gw`2&z(SZ<+uPR3^l{7aI3!05yGo#nQ#e+hMvp7^Yuei^DfghWZ~j# zK{`6vkum-mOqR5QrP!vpP!E>Vv{8+>5*l*^0LAl8EYqy!tb^0f>q8dvsBY+PELSiU zE1UuomDs&CnX${FCn8$~2;RcEz%y^LtA8__cd*g1Bl-|%MzOMl*uh~)yL(9kMn)hX zzH9t5Eu!|t)E7X;90dWt0y$KGD5Y`xQ}r_n1b*Mn#oLNtL&;CVWS;Fvp{?*p(ak|w z@5asJGxJ9Xt;E^Pu^!p#C`b^4gmQK{eEW-*`!}zts$AmvXNV7>yRIX(J?~0X_{UDu z1{kXqBOqIyuZA`*M$er6>F6jJ+K6XywRO^Ab5!*VG5Pd~Zh(zRcMYPRV?sUl@=b;R zolcm9SqH|k|wbj%E@ny7vGIa(7Pk6WVfSxm&B zFz)LO^^L00KlYodx*4X-%&wp5rGV0&=Dr=8RcuI7e8hiYeFKz66=uXZnOa_Gak8QO zOGCh77pVI}CeG>Lv2zRfJ)T0H&Nq^>dLB*hWX`%0S;y{N8BZv{cGH_Y(v5p&#Q$d^ zZf!Z?4S{IOCG>&Dx6|=~_PxB|Gb2OWgkc3e;MEaHjiC%^IXL{jB#G)&D@50>R48S- zFcHvS3`CT_^o!&CWGSQHrzfx%jwiWjE_Oyyh;~1{nzJVeo_gNli0MWSI-n0)LYbJO zbNswfLg-T{1aUMO?s(uwV2EfHA>NPXWmKDS_#ndP!AukEuo7S`AttP&F1_dmBnqyS zc7UFMOrzLf%q1XQMbV6W-KL65M;ir+wFI}K%v}$wYZBix;S6XvPRE9_Ns?&dXEiu5 z)drMOhXEvtaYG&`D9z|d9GM?s%x(BU0O3%hUH)36RA0AMB$lVK1bna{WTnTwkrc{& zY9XVL)u*S1V`Fxxvz3<#zajmQBdmbnQJ!hgEffo1s=15zPpQn<{bdp(yUXURM6cIAVuVH;xIA_p8)5Vu&LaIvt%bpj7o z88xScYbV&l3|w-;f7j4COFo>wTJiUZXDJ0w*sH;)QF0ZDbq7O5`eO9$9>zXl5SM8s z-q`($hQk|fSOL7iu?Yy(xB=1#LxE`*-F?30mhOjz;m150h^(q6$wJQzI-omV092c& z)gD}MfkdnMO3~%+6eBfz3csPy%m$3AVjB21G+06I-6ZO<7LK(}TQg?o`+E`C4|z~A z-G2(M0!5ey0b5eIKm!f*iHPH7xl++6uXJdR=Us4W{YzHZsj0oeTXyEJ4H?@$-5Ko` ze~*4qYxel@9Rg0{N;*0PXJP^h?c%S%p&neaJxgrw+eXPVmXJE~3tM`1tjrCVroX>= zKz}5uV_yCcj}~7yJEgtQE1lFsgUP>Q6(y|$SxAzSJ+RP3l)U{w>>B$Tjs)ZNjTd#^ zGq+U;J?LzUa$(S7c@QXvfTrf~Hz*rt6V)b@`qJ^Z5J|6o4C1v7^rk3C$Ob&7kcdmR zHRMvcdw{T6^K!%*Gsz`dZU+a%WIS5F;T4)t=Bs(6(A4QtjY9b|AiE!7@qW zqlC7zl~v<>mNG>8YMd$o@OF5>LK>BdPO#OZb zJ~^y{uJnTYJT%xQZCLFbPVI7kiT8=n=ql$K%OiU0z*Jxp{{qFoKY z0iz(ZGZcAKw0H_yY3I-GEtl2<;wew&RpL?p{^maEgl%IUy8pvf0(ka{GRr5SOtel1 zL%}41Y$3t;iU!D{3MBG(&m<+Mf;h5v=km6@aCs8Hiiy;p!+yET0dI%j!$F8PYi$>x zs;#qlW<-Tm(08b`?{Q7nMnQ;2BP2qu;KhnaaDhvDymAoNNt0}!)PTupoB;OMc4Mhl z>cQam&rp_?Vj5YrtT#t^&-BXsYBI<)h^NRgXt%E00We4H#;{jo~V{*xqONgWA7-gtJjj|z_Ly@d{rZsSmqHBYd&KM<# z$!tq8+W^{N>!vq3FMQ{D@=)gl($m{zUnR#C)7T$V(A0Np0tB(K(R(?ih)iHwAFSIY zroLQx*E?w>l4#M4(PU{k?FvOA3ROs`Pj35o@21a>i4KY9_HDL}TPNWCLWX_?GwMGM zJ91Ci242mRzmXR?L7Vzn0UshcT=D7m=eBv^+m#5rgolHO?^5WDm$Xb_yjGjUBzeqf z25~mSS=DAe!FNjsde~;cJOe$3$ror8U2&&ZN4Pws@2NIR*Fk+u8qySM?$FRUjx+iY zjD**wOx6U0-($!bC>_3^3d5Z`u$#rlK%AiD5G2lN|KzO^y|m$}(RTSIzHL3llzIc+ zehr>ZRo@a)joa8L>O|V@wDt*5WU5m{&gYI{MuQb9s|jY9A3@I#+)A^nhJ25?QC*`& z`?80gOrJKd#5f07@TAEvkuMna6@7Uow_UmjGn)~dVjy}x0j=U+&Hwy6o>$g)c6=RbIL$0S&ctBr93k(u&C7;B`#j(P@ z(%&rJnJEUxdwpW1jW6=t!m@+Ekmmo8<0dV9#5$rtw`_O6MC8g4W{kwT*Bb)w>56r$ zovt>q#4s#SB3R+v|7!dk;1C3pS^1;PJQqPP4fo>%s8+U6SU0tG?5lFKM#z)kN_?uE z%uIz+F)8YqEVjgWp6fuN!d=lUt)M{QmJRv+Z7$MFDii9yH%>a_CPI?M1{me5mD4r! zXT+3-3C&`J3K=wpzf5OLcLLPQYs z6dk7v^C3VVz$7LY+#Zkf1iBX|&|gs=X?l>c){)!T}`#80%P4gJ)g?c=}Kd6rYCw#X&?etuA?ZbWp$Jrm|2C>V?#o94Y~Mpjy-)ITEtT znv-x5R&f{U1xxWM8L+O7Qv_ zSWvDi8`H5VK~trawAG_YsJQl-hb42yc1+>!$`}T$%7-=EF-65s&rW?=A*py&CTN=d znrh9=){4|;9PGf>7ual1YY}9!y;@^iq-pKiOUIuX)8tIi&>PNR$#Br#=`vTf86u=c z$*x`LSr0O6L~IZR))x4AkAbGAsE=*_7rtg9k-*^u?x1X>oto)}8BVJRT~`29Q$s0g zCUzEBq$yl}pF)XyHE3kb1AuK&;#HS|*{i#VY}wFlVqzvHaL?~O@grK8?Zu=X>ofZb zy;5Vqpo701q-*zU)3n{cp_KWDa}w#mmFe=PZBTeEF*AYH`~^PiE`W8wr|#;hH$)^U zmE_v?Rkh_%ik}mM*M``jfm_I z>q|(G%%DHdGo`)aY5O{sr>E}yCnkY_M>52l^lLthvOL7ZNh+{Ov;$8$-eYj-P?Ay` zf)}9)tsawV2xz5~(zh-2^LgaM;qVlWRQ4~c;5 z!koiOp!=Fd8OKNdR12;J&fk~JAlppSFB8t3CiR{Mr}qmu{0CTrR4ahIoTT!U)+|}@ zHqt#WE_XtAscsy-X6!rq=X3V zksy#@Tz?TrIRdE=eFNvl$Y^Vk6S3LUE`~VgyU(RyG~4-rZVbI1sluZ3oK$%iP$dXR zw(@EdXEEKf>dbW$K0_a?zK|9=3CvPSCozrE$m;q%LXZ`t`9J1(QUc2}}tCPy{6hpm5t3QpBZWle`JSwXi^Ds<9c1#i}tuZc8tUd4Fjf+{%VTy}Zd>uxm}^9?MCy zEw=24_^LmtC;IW(;V@zu;!tAqB+v?S>9|PoII37KNFlaT)qzCu;nuctE-QPkortn7 z2!28nc^6HSE77Ggfjz5_Vow4x+K0F5mc9xmQkjjbQx@ibulrSCv_TJ!1|xMCLaHDA z7>UF?JDqdl`nWyq7B6bA_F_;UR4_4Hhk_#IJ0d$yy5_p}WdR>q1UYxG#{#b0y=$et zSaq%t^khN}<}UK|X%YE=q``BIL^eX@kqkk>CGKFO*;kyw*6M5JhA>}p3gk6tfaJj2 z3y#H-tb;_^!I?z(F~`Y~?ut7XuktzK-_;BsK+{X4;JUX4#)9TW;jUweoq&x(YfP!onQo1OD(>kKrwk4#jX`8xzX)X?)N@3H>G}BDki|jh@F}P{)43V*b-7sWem^yr> zN0=dxwfYE|tWTk{Y4g;fqN{?Ghk}WHVl=wVKnFsl$4}Cz*hJ9Ojk+-L z<@mv33B;sovI{Pake}ui{$Wa4XD%!~q7geG68Bg?w#IaJ+%blMxV)`4WnTipA(#DE0Dd7H0 zHcke{RRAJ@?8&u`F$VgO7iH8>@qFswsG$@kCsUF04)`ABtZ)2^i~ac@DPoj@yi8{g zD={c|;1(0gg*GYM@mNinF|UD^YT=a!?d+JIUlufc`KU1uS72~#KFZ`(Su6kaALcT7A@oZ#k_F3iJE+51Q=h6tF!8w3Z1D{1CvEbJhvEf5-*K8umHme^`bds z4wpTVfzlDA@t8TBK^vnULKHs2iDP&b(7nmfM#T3G8$45oI8ykR+&qum=KZ4Q@QXZ; zTfR@}O;fp)@#x<+y+*kA(~XDj73?6SI9%r1rSj(}#ZnpnS!hil^Nx3X+Cf=0JrBJH z_qMP6CWzPZ20Fr@Z%83^Z}>Tzzj$epr05*XydyZjU$_@-Wf1n1QHmMbwOhcav`Rpi zQ(nV{uBP{9;3eFU@`@Cj8X+zC-v>!RfS%)V9aXLI@EfH`qABjmex9hw2*I=+nzAE! z&jAAVxgjFmh|2L;-5UX1paT>Gzq$ zLsx=U+oNh^2|$VQ08$MfS8l1Q-b~P74iizfMx<|*Kt^woT2(RtXlIbbJ}*Y>DnFLI z9n9FU5t*I5vQWS0IC(|KF}5B;xhLk#lv&*lCNMtZ_ljB%Eg|~O;gwAsRyGBJE$Hbu zIJ~>qfga!6aS&1QE18n#Aja2XS4Eo{Co?wKSa#8zJc0=gDo6ILobmKdORY<6A;7p~ z5|q0FiLea|3N5jrN$at_d#*1ykeN~l*lhz#iXcTPz6W~B$5pcHm*gVcr#0;!e#Def z!ka`VN6bq^V{^v^Zgd~OnAn9B6m!rONvzdbV9SH7Wo67Elut)f9*sa{q}TZ*CIvi9edxcj!$Zl^Ot_?Hdm zW-s^b5qECs%#aRTdmM_LE%F8Yt<_}H0ogApWY*3s}Dm(=&Oj z1k&xyoy^}iqxvlHj9YI72`R9FDk(}AY%NxA3lZ&?a1Xw$`cO~EcV{PKQy1u69o6^l z&IBr<=rf#{xHnw08sFC?e$siL7Kj~Fky^>%92MZkkW>d^!OfE}LO6ka&t1~DHYrMh zqbZ&f_h$h|ls@Uzr}bH8+1VQfuMQ)nlh)-<(E&VMS4*HZkE}SpE)Oveu$TK^K5?bq zh~edMW6~xBhXpy!o$-_P(4f30qv-v{V6Ss)87=SxuhNr?Fl5O5&^&7F_hqWg;91f8 zI1>{qtwXsVpIS;L6R@L^+;}@<0?kS?+xrvSmlDh3>lYQ(Oa#o$xe1#IJq} zqhz}#Zof9Cj9j)mlI0>&*NP3?Y2KwE=NRbdg)m^XBl|2sC^+y1URq`I^;!w}6QY1J zC?&*OZEgX4*6Q`WgieX~7%OTtSn<5{y8miV0Gepcqpm5^Fntj@H1RZ&u=mxVxZY)G zKwJj}QyWas)yEEVdKfhAK$r$!J12c-m7&0JO1`BfXC;wAd#nnn~mOo5@EDX13NVY*iVa^nCmkPi|uw94+6=eCTtl*uGUKlTrxl)zCHcoTLu}SE&=gvYdeDMi%ixTT=_y|-BjfdM1yxv~}cHr@SbR)L*>;2(N4Z04Ebu$2K3mP^BK``YNiTyFsqA=IsG~i{K-NMzOR(*!=pM4a3*oo3`a~K%>#hDiqT~ zqr%d;fJ3keuEbJ~Wo3vQQZ65~DVAZqeaJn4A_*l!Ts z4c-GCn09lWG;;$0E9mHFb+2*c99Dx6eWRueon@b%+;G@WBAkDdE=#$nNkBmuEeJ`fd;&-9CZwlce(x zruU&vx>DIcGx>o#x@ZASPSWOfI#Clr%|CDY{vO?Ve?GP{xJ?tC1ctiQCenVOYeDV@ zQR7~QC>=fo5Q<+G!}b-=kqye;b(2GAK}NIc>7>CB>YVW4LtgAl)(B1Oi?Z6>wU3G`H)i zrGE8o3)7O%D5R+vpc^<~vAn-DGOiw&{og3Yi%$Q98qbW*t#cuHZltdB#GDLLcDKA8Wn2f8V>YP zBOG(EDx2I$=3e16foV_6F9V5`hA)O@l5&iZalaR%-+U=yUcct`DI^7+7M~cBkY`b4 zo%Ks4LD67~0!!fki8kRK}DA&W0~=WEXxx-(uUF?MN@|COU<1K{o{u6v-F4?uEIrR3OqV(7C0& zu<)Siq4Ky8@ZAIj#`4phtyAvBCV(k)B*jI}nZ}ePsl|`IS!YQM=}E9x3d)eOCcw{G4blau&SL(cdF)5 zwSZx`f{h?iCSx^epSXl_WJK%lzwqJ?(Sp>La~x9fV5MPF2o zwY7*uQ?wV_G3xyUR1)y<*|J@Y@Z*Ojcm_o2c@3i4f)=9nB`PrjW!~u4x%rr9A9RfI z<@)DozV)>gG@b3unCOQ4D3=X@<*f(%D+xxIfNs!!8p`a$&xj5M-+4YXiOMswp#_J| znStK40>gbj$1>?f8$4khjT(AlpQexXRSN9B-WK~{60{8(D~b!%JVe7f0@#(nOxMoU z1$y=vIedw1;hs~w$=l4E$QlPbz)!lCDJ}X5eOBHD3By$>@`E-IFg6gmB$5*}-|e{t zc(Z^XXU=r&Z6pWTGcP{&327Kg(@jI`RYK3` z=WvVmdgqQ(>3hOh)#=`|lv7#UuN`a5GH1OG4PN%e!G)1UoZu~096WR|Vsrj*3;R1% zX^V_5iF?9III@?Mnc_RcyuRsi8(&lDO~61cq=Z2~67RVH)ELyk_UFMs52fN?9>7&} zu+@79HvCASlXs~=zcLvfwUx}(5vmync{Dp7`v8{*>Y7U{qpK>9_}o$rG1PczM{~BhCqa6NA2GRAU2SIMV|6ONf|*g1>FZ^1{cjWO~IDqIQ<&bluewfbFdc za&}cBIWQXBmnSy{u+mgmt+S3OV;Oe@q<+^2>Vh09o{;N5fpKJYx^37|l-F#UpbpZf z;I^kq-yVj|hGW3|Nv=O(V9XWtRG^POS=a*_7~m*-va!5Q?XwY!dN4@O{anvQT*~&I zx?et27nrqdz?usvS`*pum@$%bZ#bN@-O3fev#~l@yBbVqgNT$f71@dtKO;xSdIz4y z`K$GN6W<}9N+ibJzLY-$C-d?v555?&X0}wEGPofwL4sXhTSa;Q3Bjoe&>LBbE?N@1 zM28d9xaD_Rp1yT6Mc+dXSO)1E7IaTXG%aS!SU-_4#|3EkL1CI;2<>&B+#|)cnV!0l z*C?BXJ@+seA=sX~;b#Nt=9}Jf6*3BLO#_nrDraCLVOK5SZCsY0;5!f&;y%3J$kxSse5e_Qmp6O9Uj{o*;WPT7f>n*P@uf32MA1#NzA(HUq#Fi>IzOn4vBsQH)_s|TAg)K~V-!Xc(9Ufrl zFBI_U?s_`#gapP*Y7SR|Q!yi$LL5&Wv%Auuh5Y^#H3nO+!9h^Pa){f7%sx4rq<_Sa zN7~*;tX}Zu#VqsY|I)bxNE2w52Xa|FMmvOGjZz~b8q^K$_GMxWUbIxyD6DDtKrG(0Kej7wx zR`6wAwf;ue;5IxZK($f(2@b_U+naeI z4z|GW1&q}`eMP>xH>9zC4}hYuW}~&vtzOlP_592M_M3&Jr48vBb!}G z#tL10-x40$a zUXHMovja5|J`@tKK*&H{rZFJ8freP1tVV(ND^>7;U~8sGOL38UzKRkhag-pimTL*v zfrArbt)p@7k(62*wmv1qgHp%nlD00xPW%$yyh4TWA0k`30>ILI+@6Vn1Z;x5qoau{ z8$d6>Lz)*C+?OSs*zh8T((8YmkQ9G#cx9&-TttgK3+bZCGeRWaOP`Is7zfVsF7jc9 z9Ys8Rbecr;8y88Ix)yM@Z_!Q+h4X+Ja(aCMZcC+#D$OszvHnP5+SAX?A8Cgbl&aVe zdQe4rr5+AF$}~M1Ch6&ynvb zTIF{z7qxiA2*lL2q~eUXuHafMSUd@puWd&LYCD242vHUY&?)`zR3CTsT7|n!HN^6p zRY?-n#Ga}k$@+h+ccc}hu8G*+0lk;@*^}EqZh&t$yC@|MQUd_Iut4;LV z@kH#Yz7l$b`POdqnKI9o7ri+NSUg@nM(O)g0Ej;b0Y9!Or}Z_k?>zSvL#+k2Z{HLgU7fE#wpF5M%iU z{)DoqudCM*#Z8gyLU)9gaBbMz@0i0i@I&AWa5ESfCH5qlhGf>9j6x0GI4-CL41iOg zMgM@Xh4gLx8T6x!DA5(-6XXcKY8cAq`T1yUsKDqX5h`19awcW~28;alG0#bOijk8;~I-Y)xEp&9(^|eDoOb>4&u6;tXFbpr#Fw&aN!DzPxm~^BH#6#|^6QgyASO7ZouNV<>o3N!z$h36)(f)=>S6l5fe(e1W@5{D9I|il-P>w>Fp@qEJe$itpTtmYakn;z!jiH|Dluxg5ONf@bruSjuAL zr9U3zIN@m(`Ee`1AKTb;^QE{y0oV;ERVO?o;D--FASuDT%Pjbvy;LS}L_Zyy(Wn|* zH&fL~0pooF)EcG{z6MFe3iN9kG~>3teHWMCIMDj`er%W+OnHrOR&o)T1?s0FLe?T& z>UFE_s8?WY9>f;c6^iJ{REW#r>X{BydUso|qWZ+5q%#Db#G=BOj$K=J&Ww=|TH=^A z@w6bCu6=CSmgxcS1ph*itnF!Bw-VH2g%>t1mDtzGV2n|JFx`VNV~lz=ztxH9_XC<; z(iQk5u#U8-jtqq@vu_?fd7Oh#-PWK+Yk(_&B0zu}3_~j!;`p>&1(XK`YS}StH2OpY zB0%GUoLM1jA94v(R9Uup3{QQbZ9Q^)DyVUhsxt<{n@rFc$9fEd;M!|owm=7}i5S<)^oY4?6dtY5n zydp%40)!h4CGb;*)`6ky9W81O`v!>n6MYyeRX%Q5G(|b%!IIrWrrl!-`N6ZF10VXw zm8RmGn8t=y;-Y&AZX)IQI8u*Sa}p1LuHGDMB$AF#TJgw#8F0Ng&iX1UC%UWp`}LZZ zF&=_fm+6UkM4hGua8EZJ8O6;2R8U}0$v`wN{Hq=ykhlA)3M`w-f5m9^M9ZTvV2(!U^Aib733}YOn-Q zbDCQ9k%!2Jh=bp2On?GJ-J-t7rIF~>zhB-8TJz%Hjs#db@;v=Kd!lLvbpw^;j`|VK zsN=+Y`pJDNB`q@>Q=;BCit5a;z%t_PSAT>hyk}UA5ye$fz}J5clPdvJXC0skUTfxG zN5$`dW-cduz)PYR)a5BwHD9;0df#X(-3>Wub@rf_K^W8#0Um-)FrW*bP&s<|U7Nez ze+M_gz|DFAKN+pn7_*Zj$m?OzvWf<%4@*UJ1Ismb%`uHla4Ba)#Qef%pyVDB$_RZ+ ztCBFp1Po$a9;rbc$ofA4Ywc?z=iCK>%C$J#CUoM`ooY~p`qwfJbXCm24}z@Da*Bxr zb5svDzHJc0P%6q3-{T09S?)jibkKmO!$<{BjRPdd`ZbeQe(?J=KLC`#B{N~T{pbq? z)<@ws=|_8N;z_YBd*Ff$K#g@Ary4sn0AVpWTX1PXywVN#$f&&{ZgK);mI$)|eH9JJ z&T1zFI3EbbCseZlcZoV-Q!?EFVuSZk5SM_(0Q9b+`{F$btVr(Q8C&8KH_(IqL}JVM zR#ftU$r5^=${v;$mZh2HW&w+_@Q`b{@QGzIiiFKqEu_o~7y_4{X1|9iISn42s}uzU zQkJA5iz>TY?I^OFDXF8OSA=&g;)?B-S=+gY{r7e`>>W#kV%@TqJ1XM;UfmXQ#{vhV z8_&VS$BjEkijcBXclbC5FMinEC|iQe2J}wfvA}X<3=Gp1-tcGY=PLb?9rpfu8%rZ; zP}KEXOz?Ql;H545j&{iMlXI(4?|(U?5)Gs^;)%(?ES6a;%6)?n{QhGo%HXD-f^~d0Ni!|fY<<1dGvLw;L!q&*-D$6%$PH))5n@(J8M@&`~##YOGPPe?IjpD`z8NbJOdWi7w8#^ zsLW{@rsq)bUoW*N#xvmYi53{51a$~Yj%J2x6UIy8pU_8GlaD3OAW z;7Rmia`?PBT+BNGbhuyA`6O%tDbeRCF-hdvwy`W z_sS4MXm{}ltmFg!$9$4CAF9YN{-zb1Jk2IHr&*VgtvvNfT@rCYctm*rrHAd*Mpx2= zHzUeQ7Uu-8gU>mkbz4egi@w;o`>2Hu9GSjXa-Jlh zVm@vvcvBypS;E2=f%rgA7-Rta{ViP}{8~1RI%;kat(Hf^NHN+R*BD)u+SckCGLr+G z@OJ1Y!|rq;8z{GoD^h;iH}Aijd9M=v2o{}J8(Hkls2x9*>|xs**@=m z1j7DFR8n7H_{K_go2@H8bSO*Rpi*s`NX0m1OuV+02SqjG z*#1fs`f60(;@SF0z3cd11BV+1iv(If^P8Po z>XD#4KoNQN2S37;{W79EW3l1{LhOMnzFy6tbw^w34q{y?w6gG|=;fh9Pr<-_*<-SA zDfHG-S0Bmj+!|`fbl5S@$r8CF;0E_ysrlm}0dY?C^^r3Zuo}DHOOlPQ*t2Qz4*F1a zN_~k4U&R#u8rpO;EeF)F@}eYYrPxI&%5Z2ZjFkV+s+K&!jyI+*6t>G29Qr(TKSF+% zE`h8z+zB{9_gbA47%|Q&l90pTkySb*In{tHb;h_1x_@;dxH1hJC#39?B>1S40CZfv z^8$_+QZG`1ALY@IA{Br)_n{4~PXy1Py>b$2hINDj!w$F>xQmHsCnmtEXcA%pf`{Nj z`m@&UZsQWe7IS8`W}6)}6$TLP$|jdBJNij#%FdMsj_2t!%sOpb+-D}ROOHL$(L@Ha zts5HjTxUs}1*@S*lK8{{(-4WdYvz@?n^pwRfMUILq}n0~z0T~U^X9@yTt9xTZ1pBC z8_hc!TqqRwee*H8EIaU0n9~%A%9nFJ#w7=P$-na)g>pbRkMv<6zuqOD)3nEP>dys~ ztgW6qGr^!u>cPErMdx(_Szr-wBt8iUU2G$YlQ|+cqVR&%30`-lo4mnAM5!%AOLGJ9 zfM4k_T;YBKj)W1aucEP2*`nU8<+YZGj)41|fsuKtz03AsssHq3DT-@R|-!Fr+M|^fNBMdZ4PaF zE-oCj2(3h$f)>QVER60GHKc?FMjM^gher7NJFFqRse#rPL)#u3;`L!#5ZT;jE!_+N zu4WO&-P_S#V5e3LzQJ=3~cg& zUpNpSJ)dezbQsqT;?V5M5Jk~!kuQx%a9Woo)oNOP-2zszvQV{gV8W}%EjkC)11K!R z>25S`Vgk-AHh}>XD$k`fLRvF#h7rsAP~N7NN>sNAhJE8+Z^s*a5=7Z+1YgWV#_2Lu zb3nxJh(fy7G=k57G{~Z~bMoGhXVEQjY4qE5a27ocSax##P};HFjRQdcxau&>GHkQe zSErcA>s_DgC)mnlR|E1fLemJ)VMP*zNIi=DHvUeFC}(-W!RY<$HMRv9+G96X6vyoH za&}url0ReCe*SUW{=F-$ymgw6gC8z1j{tE-w(?y37s-%vM_7d^OeJac-Pjs+W{`KU zi2CCbr{CC2ipjD_E9R#bno9KdKyLPGi^>E*6IKdbUTkH@+zu(vywBLi>PbRO2OUVj zqKW8qv{8T!j8c8dN?00451S5;-hm8KSb3uD-{ODYQsz6t+G5+`I?KS3G@5YTJQG^r z)Rp#Wu0?tgBTM-qx#aLqdYiLHA^1^Hf2HQ z!hNtGcztnh*C&iXe}w!FNq(g!t<0*{nWKxGcG@f#U@_3OCz5Iz;3M>$&RunGUYpYj z>z0rPGP$%-Q|%uJu1aXr^Zx|f>?~XC<2K&3xY}`B?b$32m87@du?H@G(!9ZF2lv}+ zm?HoU#}brQRv2kPO6Bis7U?8K11ds7PYYPSvvLQwhVYm(um9c2NXWsqHP4*N0n6We z9B)jv{RFP@9RBa7!v6(Pf|RBN9-`WM55^EHq3JG<4H)E@00pO!QfbjP1_uxt$8D-R z(a&nZH%CF4f4lDMhLWJ511g%QKFprg9}Lb+C(PO(CcTRpF)>zyS}CfdI2#Bq!Klj| zPTY4V>UoL`)9@6Mk*-|=DcIzY_CQd@n_VpOj-n_w`IWUOz+f*WMdu3BX>vF8h3?3ej?fd<>>B{zC*k zAU0*4dJ1Z7b7iV|FqF?AjO0q=Wc?Id4Pjm2$dXE};l4}JR{uP){pNpbMMNd$tT_Ba)LmE5DI{ADnUPnC=*cf{71aXzU2Rft3Y8;cRr}Y%!0G z>*nrV0B0^6uGwaK;oX0OjBx_u=Ez&oq4gMZu&rxWSvJ$+S5wTBZB~j3T#hA@zf-pM zLremdOcMjQy9tmh*Z~b0Xm)^qAr2XQ+f~IK1uRvx*f^Vc0d5}(GYLFF*YF5xgnw_oeY8EQy`>XDl!s{e$`m&#A|cR2<>LQvNy8-7T$5+F_rxmDD-uF z8(y-H-yCZhH&OnZMi0dMnl|chrTTAc%*8BL@^!D|_ld>^^05tUEpEWlD0avYTBP+8 zb7x$aLi)Uoz^FjpkQ<~KI(1|Im~xLgZoWXqJ^n-trhKW#i+*fACiX)F<~>!Nk5eM5rQ7!CV=sQxT$|^^u=5v^u<} z0(LYs-1nWHL5S2MaGU61rY50@trZ#wny$*n%XtJwm!XinQ^7HAy&LW*8Lw zpyCL$nD_)G7j~^eI&1Ey$!BNcs>FZ7UyWr%NdE)`cEwgclnn{316+kJG+CqH28C!~-g47ip8_JdG@20QK*t!RTwX=&*W5K8oa{v; z_us<+Qh|Xvm_3L2a~!QiSS*%Gf5wA|Md{lsqzAC|(o(8MD7nifO{`!Mew#*JfE}J^ zmgCPnl;^}^esSjJyG10x9{R0k!P zDN|~XB2U+ArL{b%RfweoiZ*o~W{{$o$A<$&m}0u+<-Y>R=485CpyoNsBCoRS(L-+_ zT9-n`sGbsz4U+Fe@C$vT>JP{U!tM@FeXu%B&cO~%M7!&@`v84{{{&1Vhz)t<2YF-; zn+vh`EFQa8l>Q~0%#j%oVzWx+$Syzthma5igH-cFa3gZaenguUWd02RqsD7ua1IbK z{q!GzGFt*bTA4pf2(IbWG^LIH9Z@&ylxc4Lvx!OL0eO8t%7O(kU$IFc!^KR__~%hB z95@H^Z)I;}$EfRw@~cZJg#o zPPE!?&eQ8XMDaFms|gzQ3EEN;Az_#TD)HD*gTTCw2#4~ziN$olwgw5o{YoTTvWLTH zVeoBD#$i#`pZF7OzxzunZi%^o5*1mQjqu_`bgnABv=p-#_1%rniiB9)L43heB5o`V zUBSpiHh1$R%YEqdELb=B+7-n%QYWo)LG<9YJ*5LjxLSX)_Ym29l8(8~>_ z?6!ZOhHk>3F=;WU`W+oZ7VblMXjhi}t2W|@dg1qV`IB`8X*aJ8CIEH` zoJ*J)6-HyU8i9*yKhF`2v*@4_!Rth1-W&k-wEFrC@wH@8muMY~Q3!~6RDdXivXqQX zP_`x@7yfDC{sjUO%bf;<_(y00Vk`cX&~w)$ZZ4hwzElTF2_uU;#z^Raoye1TPQiez zfYyqQ3mLq9F`l5-^lch@8u$iZL$`{n9E*0Ae`i@1r7SHX_9&cha|5eb7<=X9uAIy4P(|xrj*Hu2-b77A$Tfx3+GB3oB_n8T5oJ$?KJrGI=f^U!klTKwvQi&1_U` zbQ$B3mzfP^mdtei1oD@=Z0x|)l%;xn3B^3Kok@&C0q2H>0_zLLtUQmfVS_Y|%Yjd? ze$~&MnerMWlQ}R*MCvUih6Y+_Ly)0#Tm|{MvIA%cwOBxEKk|3uonht91ha#-rIPf_%ln#tJ(xUpUP?d3r3U zsc}jZX*E}?KWeVf7Ita3xX@WW6E#d}WR>zn&C4XE%LSC*pqGao%LDkuq_uuzQ-7l`ios3&s;mUwT3Q7DWLt zUx+=;^?S}rtqXpn0}*{SG!_c%2spwNgj6rVkk`i^Cl5Zv>{6@!uZm7OmxIt!>F{8k zhwf_|LR+ZmHI2yqFmp!_+A0wSW_1nPN_?O3VnCxS!Y2Vr-{KE3^j%ndtqs>e$IXh# zUjlKFX_-M}W2mi$Q%maaN$wPm!cBui(Pb`UUEAOTY_;0?$NKK&)N5-4@iy`5G3$@( z^Dr$DR2J&=wG19X`R)K04~;Y`+wmfAMB7MZk=wM#+|T2}|CMM=^goK6K&k}p=0nL+ zYhgw(Z^}5P7C4R%^^xy3yWBhrWfr2`()miOr<0Fj$?V|*ZhE*YmCea8^E7G1`Jko5 z<+lt6r90P@fk$due zhV<)ZclU?5a{vy$hrrS4SYsSU0}3<-a$7)5%1Q^h`ag@{V1UB!H#NhpnmseORny(W zS5t3QSH+!bTbu3f=9?&29oV-KsI3!X4}i_Ba8FU_PKYms=2w9I0QEJybfc0m3Yhz! zKur=t_9k0ODP>Ah24n~K2B8Me!mzk{r1`6#(bq66BCY1HFf3}ChG#7tTdlY~>u21z zwr9Z}?bUx5a-do(l(C?!bD)aBm79cpv{zwMT#LV0;SoO=iL>PdOR!0QFpLNDcT*Kw z9P7E?V)v2H-)}sFtRyAZE3y8F=UE@0<>K)qygE8MKlAzfn?s*(JraxOSbU4c&+hx! z@cH{lER>EY_}0g7b=@cVJO!^L`-r$0teCda_a5|M*vf+z7`AG) z_}lX=o&`=yf*3kb4~7mz0q*H=PYlXfuwcRB>3Sul%jyq@(QyfDnZlI%TLfngRa$y~30I=ZiOr1LMF zq=R{|(A~lBKrLf6>{Fc>l);Q(N3Vl#Jh@Qz6d$^gKh3`}C^M2jL7;DU#BjJz3F3(c zDh3kXa%@{S#MLqt!2L%gB=mWiXJ`9Wk<(|7H2z~zj*$IXRqh^9XxxQKihfN(GH&Y$jJ3Y z4V$m$!84wJ&0LWMv$6B8N7}(iFU*6j1G!u-o8(fGL6!_7mrm@)pyTgz%ibX|*Z+G7 zS*dxlo?L7Ndm&_+U)IM^Wc4VKT0X>l<}uSV4GAx;(;eK zUAPR9(s5-?lMphriJH^YM5ROnmlc3ykwbzCa$G#f0A$J#Y?>f}rb3!Eoz;#|A7Vc- zg>@y0sv_ZmAKtj(p~(wmWKH!%3Jf-+d4h&7vQBcvH3W+xUZB*84O5iNpyWy#3{J4- z1WQ(=!W==w1&k05iwZZ;x*aj)O$jK>kV6nB$UYeLB#I>$o=l;DgbYa=FIGkf;Ysr~5=<*COPLXjd7{df zDqdt7pvqx|Aw}lIASL0XK)DR@!^ORPdNQ19b3*=pj8r-4>V*;V2chJZHb0=x?Y`7AK;9oGLy^H%A z0Mx(*l&?wTQvd{bF}?r@SZP8oybIa|mKX&-K&4WqjsLJ0e%d{)ob-CTF<>&CgEqp-!; za%0CBTW);Vp1-8r_y-2Tk5x!IC7n^S(i!C*<<)Ff^3j zp{c%P_qVr92-&|YQ$+UvC7!asC$xkT*`J66Q?h?i3E6*!k(na0{|y{w*ku14SF-;O zA7{EOF~PzRCeARSk<#RZM#@PPG-Ilyu>mTCD5(^~HBpWlCzhIM8q!1+ zlM_>#o;bnj2@*KbAxf1saoB{AosAON!)WltjZqo;P(@VMj&$uqG;cXsswki$p{u}% z4`hnuZZb3ot(i+pOI2b+MYU6qNAaO59VRZxqTK$^S_*g&hwKtpP3)kX>{MD{$!NuF?e47xF=c8SFK7VQMGDR4vpQlR*ndiDmktIg@}{R6eveZ07VFo zm3!f|oURMa4xHOUg2m>xgqYzBlkLCj+-;?EI+kK$lu>gjC7sb$8l&AJ7h}8ukW(r?(Xhx zi8p{jMKOrlyFh5Vh|s&;Tl~$Z(x>mVAYI1Sb?>aZ<2hrDFKTVqQR@EH?WVcyT5w`_gao#Dr4Pu zb4NP=zNmySdTX8_8i8RZm01T2^JgS%&)waNT1p6iTnZ^UsKNYxF20DbcK0i#PYHSS z|01D?u6@m-Z`}xS$U(2=7(Dc$iWrIbctyaWGFN+~6p%{B}OZztuH@+p*3cEBNo@S{ukKEr>yrP!qO z8D)1%pA-9*t*9eWkhUCXpu>gsFPbalK>al4p}Fpco0H?XiMMTw?d~^r*{qbdR%>ft zi7Ab8&N(TpMOaY^W`seW8D?Zbh83|afHiKKR~F=`fE;mu{F!I|pgp)nCvuO@NiZmC z00zOA`6v5;LGa~6-(d|5f?oiq8~=+`k%$;3O2w(@#E+J3O79_@14hLn2ZAp|bmyFN z&N=6_K4yy~H_lm<0t~8>LnS5i3_>ZTlu}A*wg1iUA??jM=bW>brWYgaFKX#?!uKya zWh&i-Ib+O8|C@78X~T`Mn<>74Z|9s7b~I)FO&UW7;(#{+s(2GCesEKS03$?+8A33p z1`bX-gjsVWg(8{<+{B5Eu~Nb?O_)AnVBTs}tfuLu2n+R91qm$7DZ!A?G&`vNku$@T zV}qO`M$9D!K*AGqN-%_(7_Pif=1dkLN7hJjk}%Bar79;K;f;|N5N|qQk-PyS<4BRe z%Q6Cmo2<#{CCkcPkT78blpklV$V!k#h8#q&(!&%J`h>zXFb0W3B2&+%0*N?KWUMSX z(}L`aPFiT1LQWG+q>%wi_Qfbo#4m=)?dlPlkeZ=N6C_NikyXG=79MP%A_j#NWblh} zp!i}$?k|GTAD8+gRHTA}1WQo7AVtL%-@ps6_U#((gs}hY`p|6kReSnJ+EaYA`iidux%?S@J9}q&NA)+niounPD#^4MEMgu< z_B)((@k3d|AdlMYfBy0}mlg&^2xmw^#coVv5{CN+IA9R`8gXv8bD({G1~D~_oWYEo z8BRe_r1SX?z9^yLX^PAWWu!DYQK>-)9G++^1VO|I^NEU97$@d7#K{&VnrxBMbb_qa z6yXAyBernSBBy9ltbU8bmL?Nyml>jLmJ(F(jp#^R>TZTpZmL+hQQ{^}7dKTFLT%7N z(G2^QfWlOeB|-p2L;y>1<^<7%j0kKThw3KH?cPli`SYxFdCF4P)GkoC%9ZtWl6UE>ghWW)ruMe`aM!y`9+_# zUoF;ATe&CzP+VsfwFhM$qYVB~Z~A7)$H#}rZIM5poB@nvBwa>7&Q0PYjXL*md!)+Y znf9xh3?^#~CTp#DX1_j?CTpzz>W}KLUj7OvJ;_h9Uuo51_LDO9nGT7${a^i-Rh+~D z*_^m@pxiyT)ZhMl`7}`d80*@rzk5{0YbDu=Y6pEE^l{|qAux!(py75D70gYYgjhC%026Qdsj?;E9M%FQQD)=ibW<$sdA+HL2~OuN*{;U zSdNy`uxwF@+rgmzue-N1TFEc~mBWGP3=6~-at1Iu^-_D6MgF>21q_N%T&(T7f6o(g zApcIt73ww^^80;wlQ*^38K`;wd|qa?|8+wgft2&F+ zuC3bYgTxnNW!lqNkRe1e?S)tweIY`!`c}TZF0}fhHj=N&xALoeDqqNl;!+0%MQvV0fTN?FDBq6Q8`xb>+&G(Zj4&Ci=MI0M&Lw8n#>LT1aGyLN5!vzA!?R-?PdvgHB@C~t zl2m8P+4H*=k|nncSulx>tX*Ly>14=A^eMZ&i>=pXt5c^=sfE3Sj87y)j0?!E>!!PB zPt{AhyOi?NA@oyqt9m;2+`W@^PWp0UqiR11m(n_rOF1VO=NGk&md%G5&2MGu1dR}+ zeesZ42N9H^N(Df`C>ZriEO3EGk<$W(bXR`yav#f|^+77(zH%&NP5}Jr5WKKJEL^tG zg$)8Bl0rnqM{?4}{K1T>4-ATpWWri&?ONxYQ_63a3_9bykv%Cz%C7Sj%T6h!6<;ov z{WA#u^tw+OBVa*J;me${e4RSNGjce0cPnMKRnF!!bY%r0^-f8F5jji1q8^mlh#bts*&rqO5$F&mQW$5@x->S#IAM|-u_7-IuoL1G+2 zqU+E9-0Qp7x&7p}cd9T_?UM$K$ILofPL?p(M07#C*L&&o3^H3wqH5u_TcMoyP=N{VfiGR{x{ z5<18N*D!F6ICIvTy(Pb>^O$SpeCeNdSJQj85DZwFbIu+zPmIH3WXC#`vIThPiQ;}< z?zpBDPnVrj&PwC^$&PjWWTh;_sA4fgZSE(zhEZkn~J15k?MG%u!5ZJ_bOpOPDzrgu##N|M4CAVDE*(MFlHN z(IqJN%Ludeh!)I~Y<`T!1d;FQzBnxK4+K7*` zW;I(?;ZXYZlWg#ZzMQh#9jo32gJi&m8PE{211G|pjuX;k1t-J=*qtH>ATdkW2@qUNQxkGGA`sfr#c5g$>~cgrX%dL7ia55F#QY)o-Ls zB1l9h>I(9QObj8S*aQ+fCYXw21emEfTP(D80~>@eLI@$u8Dymxb419r&6dfkd@5ys zj560HAa#+ z0Z!r+g&8H#c=3r*RM7z_N;GkkB#5lx6k&oUV0MTCVo6)_qs?lFA5*Zp_u$0QqHL@c zPF0mx;GC&&rt_N!-Y+}kaNBM0=cgNrH2 zwj!Tl1O=&b?08S;wdZ0`23OBr8?BPJzhGa9t3SVPZ|OU=e`M`DPU^RxJ!bui;+EYzyt$xEq4n#k1i36;k&3KwbQ7f!rSg(*~8@~2eM@dDnKGOP=v^0-% zD9I@OA0IIaRkA^-m<|k@2guNeU@%!9$-iRwT7Ab!PxO=OQ%@>Vl3DrvN-`>4gI9}n zo&(K~v77r6Npa=R|3Px&$NUiy&4+R&QX^a!-j4u5K)%0=+dOP`b1uUAx9-=p-*6I4 z+BV4QIqj_WA*)In z{2J3StcHY6_K2!1fAhHk$luK|ir%}O4CxK!Ez9@umJjfsG+ff~ci}aR=)t)A@;&)i zekZHs2fkl>f27qno~?f7bBo#AT(z;Sv{hZjwAhTvD;vl4bSSAonI>1Al1z)@L)*uu zA@+7ssz%w0&S+2GAaWoH#es}NU+{bKc*vPxm5- zTYo1;w6j>dVPJb zs#HcnUcX}JdFXS0V?OI;tyHlHRX+~BP(NRxO4wGnEdaIF8f8lTSfzg4p?-v_AEWAT zE}QCH%Juz=L2`X>lJ$9FQH}%E->JXCzNEeCljM5+96qFjVX|VFY&{b9E!NNIb3g0H zAYH%u*RM?`L==dPa2^;w5@tbROU#!yUs4V0efC*9lPa-tE*Q|BaN4A+G zt)1L{lr|LO^fX&f#d7iFEX`>kMn>;w^pM@1Q+^I*TniVo`ROgnlGn7(CjIyY3eUq7 zQ{^7DLMf@%W>=fZ_kT+%;8-~sO;p9csG;?CS%p;5*5>-j-y-`9JFS2mBr_H%>jo<{ z57{wf*JYB_mQrLXQvf+I>_?P)6xvI}fv_Mt+|OIv+z;M+#Sw#s?Lv2`4jV~Mr>yO= zCJ>E|!B8P>!;+Nwb?+&41MQqeV8ECGX8u`-Hk^1oPm+-wj-ED z{g|buw|L8($E~aV_ zm?kRG%T(P)L;=(C1k{ehx#e5*RJ*~OxLDQh#DGguC@Z^sC%9F|H3sP z8)egroXbm?dOY{u_LlKM5S|X^TZ~&{j30lkh|+wgBZJ3e?-%;IKTVzn+U%YNmfZzz z1(2C$keG{Rp@-{)RVyKY*H_~vHmJkIl*e=a5KeBZ27=u8128mFiBO^4vQMYTAp_KH z(KBF)W3}BG^We6dzC=nhA?;oc0Z>Mk9o0)y+X}MVEnoA*EgC_q=dF@wRYnmZ#_zs} zHGXMK^(CgByRSmvCax7thCcV!L9zYe2_Ex)P_+bK(dPe&%|Bb2ZDz2ufy?nNbvA@n zGAbnwXx*_e-P!KX>xYX38lu~;5viRqNonKOH(Gcg1jvGcjR~YpH?m>&TuH)b@GqGR z4KIni+3)arhSGg0yrZJ{hw5^6?9n?@jJqff?RumaP|_X4S_(@q^p*kL6a108a1%|d zEx1>2@u1~8E&iToZCIAu)+~3#Vo(5AGh)`Rga)Px-c%nQu7mVE9Z&Dt;y_h6&}$%S zuD6)oT2W1Xpv5#lP~|h-5}ZeM)EL;R!_{j?y|Pt7xvM7^r?I*Mfk1(*?RJq1GR2mz z7?NOZ$R(5zJ5R*+QXsa)x=Jhlt?I;!B@h!bY+WRdN@rKkUDO}$KM0HL6tL7FvMbJ1 z2eJgJoo7;5niLUKis4hXF0~Hds3%8&7I3gclVpwb`d1DP~{~M#T`V3`I$3YwD z`IKU9%|gHRYVL?rc0*5shw*Tfw4)W7^yryv7U~2O3$1; z1l%S%!j!b~lwfbeL*Z~_LPn7DRYNx1PQJk|VEZ^jSD>Y|Kqw?X(7Iu+%j5ZBYxH>o z#r@(|dGfAemQyoDdV`NU4FLzfSZ6_^7_sJTYAo(}r-#CnDFosVa1dYZ$oUZ4ESChD zfG~;Vtijp%;biqa7IZ|ZNgsTy{>w;vUYKre5f_NcMtRmVfex%^t+0hPV(BQ$zS2w1 zO!jb!aKElGPWsT~?QeavM&|dsPLRT4PAx$J09mAR_pd`G4Jx6~+-33-J)E+nqEjAg zZ+&UV?Rv3<5X$W`y$k3Lv+DOXs02)$QqYWyTOwY2b#pIPd?7pa1;MI6*C8+%gd3U& zD6w7Q+Yygzc1`Zh5abh$0p&`t`9cOz!w6TV!Cq>ChSNnv$;rDdWwkc5mKsE&!H@y| z(vYD~TlgoWe3z}>CcdqW`|pEn48%?l6*_*5!lm#`_UKc9B$fCb1mHVU`z1or^m)gI zjMVz)L#g7>@g!Lzdp{S1VP>p%9_brd~ifgbcf7LzlYIJFyzIgJ!JdqvN6J zqfPc=%;>seS2!M%4CMSqU2o8Tqq^uCN@RKdZ*W)SJ1(n!?;1B@%jy*?6WZV$~ZxqDPQ{2jXQP2GrJg&t}5~AE64^3J~AB{97`M$I} zzolEqMLYPK!f~-eDS`tFY8r znj-W@9j-MU;!F{T^H&;V;9_=&$v@eRiCL_(*e_{0>jVm51AbwI$jGne;k0L7;-e;m zIF;Ot0NN!a|IC7;yZQxJpwBT3lBr0q(kRj^jKu+{=~ zQ#V&Q^P=sf-D-sGt!tjm9U4q;aY0@9Qwa~#mQ#voUMtp$Bzf87u$2~Wu2>Z?$N}t1 z7;$u{TR8#=vax9Hv$bAmLW(^9`3K)(O5{p3OUVL0fF*q3sUxXse~mX^%PYx>Rmm_Y z;!a4Gz$JYHa6@{|O~6FHD-6r$D&rHlwrDPJh}B;i`q52-2laEk5=EdgrQkGZ^-!GV zLrCn_n78^1AYn#heb1{@XqNzE438 z=gW1b7h~UtXer6`$rzrnC>#4BoeA!~s}p+q}nJT!f`+ZUoC@}agtfgf|o zrGt-o4!H1(B1waEf0yEBR1%V*(2M%s-)cq7G7;aH8HryGxQ|ek91-##4q&rya1N0g z&C`e>zNAsQbIsf*q?7Lsric3VLo(Ug)$RSE(&iyicsK0*QYD@Er&120`G-iXD9pX= zka?Zj;0WrS$o<7XU>-VIs2gf}iB>$HANeTC7M&~+5x>^+ij!}c58IYnkPKYX+Eu7YlLV!3#jb ztC6{aGP9!lxL7z?*%k1l#1*!DRnE_`-&SI9E54Iy`ww$*SIl-1(3Zbo5LO1 z*SVdD)Rn%mjo@nAs71)$ap6U_9@TO^dY$KXgiui)kb5}6cT2;XlNwNo>P=AzKD zaen=_c|1`;HTl$>#<|u|EbHvmB+3!zo5KNwZu1-pgZa$Tvz2A_O@P+x&=p&9vJZDg zObrjw2)6#`eg(mYM^<-;ns=L!jEmZ3hRAu+abEU zO}|f5jg;D?4-jnfIGk=c_ukh1+h4c+a6r=XE86CUFWRuHYz#Gt)oGtm%8# zeKl#-y8=8@;d#fpU&qBE`u(`<2F=35inuJVDi!PZz?#V{veHYAwsMKoP=6Q~s;dz* zT1hq4(unVLzA?D1_$_Io-wBNb^1!p$t^Mb^RcNmY38<)+*a08*VcT3zLh(h2`C$PU z5FARTiz|h?URY!E#|daI_kq>qG$o)VP${J23c?~X58xz&^3%EVZ^C6^DPvP|>70n< z5Ibc_yFot%qn^f6j{w2hCLSF0y;5yn(?X(C!Ec=~mO@x=;P+0D&>R_Kh5Z(GmgVQ@c9w|vR%E8z%~;} zE@X3nu?Ed_z{tT-a1`1C)UVkFW~1DxF2^g%E_3NH*F?)$ET%x#rA$?vj9g?qkJ?!j zqp;FZvMQnAJ)huq1P7&eR=$PlmSbJJd!J!gkMY-8)zv)a``t5Bpwq=4mIbKJXA zhNMsDN-)ugaVMWF?B@TDEi~PSnV8tn5u#9*78K3O+v;JuWQWd|I`VNuw23LiV>)2< zf*ffIIyvdmKjq9X?4Bj-;~PdX0r(F!*4E8`3&-V{H=2w`JpskuBnDZ1i=i0LCh-LDAsHd4UqA2>B_r7 zJsDJ8_Q#?KqnCkoxxQ8IH<=xkRx`5zAeq<8BI|2dnR|yOdn~Z zL^PNX!9Ydo+*K)NU)WjYAupf}#r?PhUH0+E;e#zT=>m--)lBFkVss|aOfle6rmDx4 z@a4Y6RECV6$aL_g+mRr#$4kgXls?|*sfAjmi_(;M|0v0i^px}hZd{FM?f?_6!HOk% zuo@wY(`}3Y_t@#>M|2Z2Ko^KF)ls)kECTnDpq+&mV*Lo2o8&Mbk-k*X8rrm!dTXJy zVeqV+!BaS}iw0(%=Qn6z7{^{$b;XcfkYg-W^4bG%jCuEpU33oW&VxHGr@<~7B(#}3 z6yu{<-bz85uB^~Yn}_WJeqg_vB*L!p<|3o%qmK7~HL#onB5i=9VQ7%_ zoX>dY^K(B;;eZb6FSL%;3cZl2Q==-eJBR z-RT<+Q`*fww-r^$Rb}*(|5KpOxarcLn!~g#D`Dk!E3PxIg1>Lhp-?=6Mlr-t$txFs zs_Cp_@ez;E@>H5X+9N7MOLIVdf#3an`|Ei8LYOABToQ({?F-F3BhDO;>=;tAL_82V z-=m;fu6YCm<+j9^eLO*}H7kg<@^rGwK>LeBfqY<#6M@#Ji-JXoizUCVO2-IV>BV83 z3SDMEo>si|j>psC!(5G+@3dp43wIYhi;zQ-gw%7|=FXCp3&xo5;p4h0GkrpHkUq12 zamjL?4|Dm3VDGZ5gc;3x%bcemyCluBOz<;L&y$!gtll{GA@D;v2vRszml=1>@U2Fw zTl_I>5!-GqhnKYrTgPRX%&Bp0b{hO~m@>0nG(hNOqG^#hSYru`2izC>za052vvxtM zvE$RRm^%U60(3bhmz(D#c-y3+cC}HKAJXm2y8rU=AKXPQ2~UT56P8&OI>RP;SJ1YpOe7s2^7?Zuf-cc%;bMd_ugo3 zVon!XNf2Q`-nDiQ@tiwzoyEEJptTu<}`T zp_|uh6I0|N+fG4j(dq1>9)`XtI2#DPw0=29j^R|SkSFUIzUQ!1W|PqeESfH)n`;15 zyLpQbAgyEw+8jSt$@T1IeQ9uwys6<3h$yUyMT|TDFrKj1aBsk^nEB~3rUp|H>l(kw zqVYX|lPyRqis|4&O~4YW>;N(_;w?&ETLNG`D%^-YhDJ#E1gy@Tv&o_^^m2aDYIY>8 z(2XhwwAW;kzFiba1}h(H5Qs_xj7-O)bfPAp9~{P)rjFMITh+}toeyumM=Hb$py?{+ zP{Z%qjH@FVTK_TjzHcnBPQDcoKxNlNk+B3W*cCu#QH8eIwIj zOq!V(#TMRb5_EX%+D4HM7|`TxI9E$+S3)2BbE0I;n+R8(0S>5YkrivBqoe1x#vEFo zxsWV;y>w4(*Wk#QeTjKnsh^{co5Cd^7CXrv28Zcf~ z2M-#wsJ6JXowi!VS$L~;a)(H{RtWnn9yJRzLpLLlcnvGnA)mq0qF#yqs~|#;*BAIp zh4SZV09@_Tga#T&cp72&@UP&6DV`8C@Kci)Gcr+L=5IdWwrl9%hT{C|?XUx+XhPeE z-63Er*~gjs^cI9@_4u9%INesAAoAb_PD0?@(fx&+Pdq)I3#>b|9I#0h&s5OGu#JL%F-l{@jqtsJR*15WL}q2M5NcNqAtaWIptS?4P62?!>V8{5~R35L$;` z0otn~^IuZ_x~OCjLygz}aYs#hPSsjUh6H23D{`^-_rU!;aJL+1i8#IEiuj4w<3Udw z=v2;l*NkJb}OV19FuL@Nk)c2uF?uFly9F@ zps-Y6Sg+Dkj1-T#R(k+(CkBDte_}_vKs~QjjdlV7S3qM|VWSGuJOm16X|bcKsd{!5 zvhqf?Ob{a3%7)aD7X`g9qYuS&|`}flI|Xl zX#+|ltd#~ym;9HZAcjrR&cvVc7f_{}U=WNAA*?8AF=zQY%ZHs$_@g5XtI&He4stC& zLpnc6FC>gyrumFw1H<-Kq%8)s1+f{Ki(odkOJw;jhAhNzdykxR?QaEE(D^V&x$aY3 zKN0JPV#3aMTyM^V?^x0yszvdIEC3CkN=aD&C%)H!nrmFeK)TT^4o3Sk`5f6m%t!XJ zF`E?8mMR|)Ob5iC|;Bj>~hxH&6l#RXZoYYcARI zi6b9nPreYR{#?c$a%wPhd8LUsvUV9u>4;12&l|IRQxeF5V3&)N5ZuqvT-c$F00Pne z2aVt%~@4-%*xpk1fy{7N%{!&D!#d3$^+$u zv7BwGyBnm$!^w0IA>c<%JTS;iuY7!cusA00+2u)@Qis%_`0V7tAelfgJV})P4g4Ne zJDn9lVfL?~f1f7sr_&EH`UQlaKCYon_W7ZkJW}i#ePGh<)f=Bv+fdPN$Nu*rOiPrA z__;OmH#DUWJ@i_Pqbs>LgPb|;F4(utGX05VIzwx8PF(RlyF-mVi_E~v!5!prg)PWA zJM8B|@a`|$I)t%8#m)qS2My5muqlh5ly@r>5KUh4@{jE9`cit z2IKbz+R=ss4}*7CF?VfLlHOLm@XohnB(Z{}nB)b|wy7V$m6)m!v)sX{BP__0V1%v~ z&rhI{iCgJ$2j5`{aEVFnw-sb?t?qJ|G5X}549ARtMTAU~b!oLiGaJVxBgFz`S~fK0 z8Z$E;K^}b`$RoDj1Vm2s_&|(Hp&F=okAyx!fW4erTMkWUVT&BhHs8M}J-SqpMHCc{Okd2#W1+h&a82j( zAqK&Jn6kHXp89H4f6163hzw%%V5kIX^I)*8iPoQQ`dlncYFv``boeuEZ9Qlq1r?Eg zG=Cz#vc6OrWVn~b_fl?H>1oGGIu-DjYnmt&U2v{KYtDdd$VnHH=m?3_%&{XD`A#vh zd&N%(P-IWJ3$=}IqZp_{P)buE#XEGHW?mVe+Qg_y9Dn$iH=L)Zp1 z8<2BHKJY4ztlE|-KS3Mtq_3U|e<@HMRw#ykMN_n6U&gl`!P%Kxzmi7K?qOTDaS7aI zx|tpr`G2 zp^9YctTQQLLx4&X6}bGPDj;3Cs(0!lrn(OS#Mwlliy?S*@yru!>UET-qmK~a;+!^q zZ#i5ufY{<4cQ*_3;EMVto;UzVRV#2e+sgD>X#sjac?5=!uX#0}zmW)u&*k2zZE9R+ z*@q+*L7YSI9$$5dFU?AlT?3zCA&2Z41?U^f6sEAx`!g=oL7C*%`3@h>X$UHlgkZ=m zP%>@~!`OZ`XHu<#kmKW1TPuR*?yD9rVd=nVoNv>WIt zL_GY+WV5MG4vR$E_Qe`FUg~K&5SPE)Z}#(#=1mvhr*s#CgQJI2!|snj)b>5JNIJQk zEv)KAQ9303!@uW{M};?Dgi+>+^4Oouoz?YjiS~XGFDr#{JtK)t|3WO&SeJRp&N0+V zn)&3%2h7|Fbn^V1?n4!YQJDG<=~0R=^m$>#5-}EmR?L^&&H2nx3h!QzA9w0TbHBO| zG+NDYmmkH#Y3bAjIiJK;)mnp^H9BW3*7q;UY zYoW2%_JmZ~Q&A$IUuJ+fw^ zM=QFZXBILd#F@841h7>}9pX;I<-ttsVnVhUmT95ELGPZ%zk*{93?gL)G85n(xU31% zG#y0UBGym?{VX0y!SVTx zvm~QOiK4vKS#Y=5j(di#0`2evj;q5uD=8ZaeluQxXZM?%0B2$Ok01`-wsmtp2s>LB z4)~jBBN``z7Iba-RbAoTZsewuc}|lRe&(z6MbzK~hyhag)cb5*-PvC-W8{gnttGj#}AcTQ#wff29uylQZ{l6>h_5thENYu4lIdcs~(kclQ{Vc0%- z8SCK(bXzJ-&ITDynQ|AyQ_^r)M0@a^s?XYMnurjSU&(r4PmX?)gfg(0*3w_g>tK=U z&3MuK=KfvI_bV{quX6EEPsW?TOpd}6Zc3yE#gT-VW`L}bp4fC0m5Mkg57pIRf#7n9&X-!R_|Fn?02(8FLX}&B zZyja6sghGCh0pv=LGa*h0N=J*0Eyy182r*-4H0n?;;Y=0LVkM6-H4YH9xX*$sY2_B zSm{)=;w@orh$$N))}MG_FSmDO>7&5zYE8RWe=P}m>pRx<-j1Xf?J<@S6oH;83in!` zIOO!wsvPJ-#Y6)go^Yeiw8z?v*=wSZ1}ae08wNNx@`;BV0ajQ!-XQB0WK-X z(fs$`b3R=%4tgP&h8$K+1ddq=j+yS zKO2IIjM$)d!{${lB=-PS|AIt>5F3P?jn^F-6}&07S<@%$qAo|HR3;y(lOE_XXHuUQ zK8!I__DFqep4Ls<&U)BNPAE4@`LK}!p@V-X%z?0S`60jf7KQenE2W&xQ%Uw^^wY1#h5gKw8&<%Qj>Fk?iuju z&uy#9LnmMqi9&;M^|EexInGi?>=%oG{^#t`Lg`d9=TsJa0ukY*DQuUiR@T{>$54yr zLa?Y|TWOLx8hwEw`Wip#KZwZ04B@5Tv^h&_miDdPMtydlJZRgrAwHCzq2DAw9ZH&e zJuJL+t!y!v9reze&>hH#iwvl3tH@|5vn2$iboB9Y5!iHk?H6=wj>{68U`~~q2G>s^ z%6bb7jIM_ zOQ8;MP;eQ3OAL?;BF}w{$9{-hV6y!zV~)4B1F5!-!@@ey?0^*)%_5c}boTg zeJ?hN#0G(mSAql}@DV*%SNjkb--bHG?|4s$AyG*HA*cz8Htb_Zr^ivJXrsiwtrv3z z+~2xlG1=Klq`4#y2!%L8Iq$w@mvirY%%f{$EwGj2xAMmj3SvfMQ2qW9(T)%0A{i_I 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 Xz+ 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 SnaB&VxpHUYMX&Nls-3{t)smt!o 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

M$mIBi~Y*-MO?DqE2cH3uR79=9u`Wnc`hk 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

n!~UW(rX)>x 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%0AmGA*-SR$pjHDQc9p(4^ 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­g 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%0DEP9AD)$sS{HF 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

))#j3Iv=6Hsgi`%!0k0zX>67Zz)qs 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 z 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𝔚-u(<(>TT97UXDOn4}=f>+9qb{ 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%0DQ?{ zLkgMtgmcP=AaB7UJQK`wXvkd%8ae_p`XRzQ+IU$O+!tEK$snNsFK^Ut-#C}vy1yvi zG6i9-XGjDVH!Bw}CpzWy$kRPp#}}S>*x9sr_O@-r2w5fs-M_YJ=i4P*53^#3sR@xw z1+hF*jx2}$McCyiBH^*OLT*i{)PgIwSH*PlV{MJOHYn9zo~G2Ed>u?rvC z3G%%$nL7p~tSJ5WaZ%V8rUT90tE>A8#TdkfpAfot9jZiP{DjVLW3z;lJo6_oqVjt4 zV(Aue5IhXC72oTR;_;n)Dk?}(9S;22YC97on0DrxKcg4$4k-FWL}F`NGDz>FkP!tn z+iU6^$Q38It87eb?f9!ogE*s%kuq`}YcHl!pwv_@BH~_HKA`=}QTU(v=?L*m0azoy z`?{9qUGRml;F@O}F{g!?kYj3;i-^<3@cwdx;z`j2c>EoNDnH9$$ZrVy5xCHeT44^0 zDj{@Rj8BTxfYKM|3+ZDB`@Siv(q4qqlJ#i$DhA3hP4!EBAzqoM{GEt*!;QB}uBDSq zOXLJdcBmQpypTU-%8WTe&P*O`j>7~A^clc8L$K2d1{s~A@)7>}ikA0eY1x-~c{nf2>JyOSKkacd@k&B?8ulh`oq&2;;t zrr3yiz-IBFqxnz(Cj#gQ@6SZ#!vw>_1Y*#U?&0@o;zMPv?+=5(bj*~AgZ<3TuoX%i zkS63ddaUF&0O(%_nAVR825oIYe#b+8dqU2(K}(gp20s**!gdXiN9tx`0ko`wH4X^C z1w=>{52VW8@kl@-Ktl(lkqN1ygjC4^7Z%ypN7=|m*}ftMjD*li2kS4w{elPTPy%(x zfOAB^(piv#zqD@&DWt5k2T=@zitME(@VjfxiusWbdGBw0pwP_u?_D2ke~F)vB5O#I zA*6^1B;f{PCu>9VMAUKINAnDmZiEK~c>lhS17Wwb4tulkI1~qV+45&d2)Yz^&y?4BY@%k;X0NxmYXVl6ZBKQ*;@COh069JemXT<{!e1Hx91P}Z{7HO^h0~`2* z7W@ebEJ6Y~o`uoPl@EpMXUj+iY@!1_KJ|YAdc3C)Ti%$E2fQ;O+H+Uzm$>V{nbQ3s z8alrW>NWQ7CGFh~emi+|aj{PzfFs%%{OIi7Vx>zvaWY`4Y&E$hhR5x; zBTfx*E9*F50c6N>H)Pog)Nr|Ca@o!p*nru)tck*lAaxTT2pZvrSZ%Up^;!`CdCmzF zuH(Qnp#- z4NAd<=bfjPL)guAb9Kd1v->f-kL=JUk=Ay(Z^^dP5sg76(QH_ZU$9B%!Woz&GLJzv z9A)Zgc{YlczGz+@E*{JjnS<>63_*Q4gD_T6Ve}YSgO9M$E!A;{#tD-XM#Ub%?qk@Dmo#FRCxadJt%=ZK~zNr|*Z zj4!X%OCZ22pgr)6|KQH&n8Cfe^r5oUHemVM`8}_hw!2liwUR$Yv3%~jR&G6A4W5sr zhdRmE%buKLgd(p_SzZIP#{zq}G_`+7xozplGEH%?*3v$gwRBH+la`3Ak-$MKuzIrK zORiTFKKk^LXlhZTqMFA+e#A{*i9^=&eA6Z)pBanfTqC*)6QV}|(`YrO<3aBTPO&lS zx53*0GB-Ocfq9M&{2rE%Laou0!p>Pn3Br(y%vj+gO)w|(vMWB(`U0l{8HdsiKUTh# zYxNb2tN#0)SMp=q`Ov&M!1)I!$@cw7_)mbQ&ceKtyzb0gmgivKq(J5-}t zenG#!uqD*tWX0>(s;I=XXv13h0+$HbVXZO{uXNi($arEi-8>~Y*fyQhcuCT`l=A{0Pt7~Du z%y_0mnWO?zBD#emadFpi3?A(Z3w+HKx6&4452NpD2rHb1 zwu5X<9D_z=Q>Wl$pxh(^K2$T?&kHqFE$Y0iw_?~@g=^JmjMoDZ!OvB2mdw7dA4xjM z_8N|c0z(VZqoxMaJPe-Xl=;-6hQT2-$T70iTgg1w>yV9SRPxA56Nx7wo|lbE{_Z1j z!850C9)|Kd%{@hiK`6>BvAhBzb4ZZbXCvET@Sx+ES=4CJg1GEFNxlPK2|{F-zFe`# zy?;>2z2ukRP=E0;9Q0u_;w5?F;oJsKRpRkKW4DQ08xK5d|zyC8H-@%n*O@! z4+1YKP;)=F_D?a)5xU^j(&q5vcmnk94}i1gVZBF~ND^r2=6)003~RNWDFQSSi}TUo zG=z*$^gJwqYMAOPd#W7r_p^9MyXHl!V@uBtkNpM$AGFrBnYH0f$vfxw8$IW_=Wxf? zP&tZ?oQKg_o?xeL>ZA?6IVU^k{e*ud#Ir}Y$MZ-vjZH-BAScTVM7;-lHnt1B=zx{I zeXwlqr%b8TJ1ZPykFnb(CdeOj_95ZTpY|m|Q&3BlAGw~g&%K0;)-L>71N|N!Zw%+K zcH|j-oHRrz{J81am?@r0Fhr1@N8p9Iq8haC`NDm7#9F}kO=b*p4?0hDrYo-FG=v7q zo}^H4ze!C$IE+hA7(yQ*4472nT&a!RzMbp+`>efpE9;Tfx_4ItPpRbnvN|}9Dq!Cv zZ4hSi1&g_~3TUkHU$EQFTmXGtI`N%iAa50TJKlDb`Hz;)vK}0Wx-N&`sbyygJ zaCWb$-+o`0@m8m=qHHW~p!9v>7eMC8fQN7n9R3QZ1w!Za&o?#AS!6nq{iTMZjPPn4{VTO z7Ri;gedmJ2?m(@G(nsBbGun-x!?P0L*t6l>NjZpFg@tOOVm?{xa-?-=sSv51{cv5iG^?v`PDpvtl!jBF#<)#J*bYRlkOj!jE|*Klh9AO zFCVgQDVN2z+xsf1tRQ_fPz(o~48!yXb&`2T)MJA^IR*{pE7lwGxaHw@P!IavL5|B; zI#w)QV_jX{1|0kF*-g3-jjRe`O^JTyj4IVtwhF|04avZRmfyxk zc{14UTUI1^4X+~RO5 ztaxahaBY~z;D7(R&`lRRO#Zm>z+op+;3ra0J?3nD;(4k2!>V`F+N;a<*e?-WE>Ji@UhVNsAqh&ERzx-l2GW2%QW4@l0v5^z^pD4 zk%qH3S#52Y_Oz883HX|6wG}kX<9p-$YrP4RybRaVgI9H=8!*tt_x~Qn=fs5cI(^`g0C8r(d$_ys}Q@L7$;hQc650z{ye+^Vv zq_@D-oZ(1nhQlSY+Gb{Mbq&jxF+zAUFyGolPAe&+)ux7Bz#Ybmzva62SqE(-g z-NzIg=zb1M)=8D&aSoeniru8m@yaB6*N`-tX>I-qTLw=F+&iF5lJ8)7@_D>7+N+`69(&Mqo@iC)pnjq0-I@y&+ds-4qjce7eiedh?yUS!{aDH1A&UOWeC0 zlJV0jZ#~g$LCz^9JweHjVs=KkKlA7R+soax=RRmSTyaoc>LzHDC%3!@XWEAUEjAUl zo|fwkd72>SlGMgjd=jcOSF;IJ9=dNxgmt0MBK;b|fZjt>{3Q_zis^WXaGeavPN-yC zKjp=|t2Uiyt1ILZXt{&W8;a=&b-lMA7PA|X^$+SO+y8EZbio1D@-F@bguPtu6zg}v z>l`;QI+mbwf#4(RzSwWqdrbm%;s&92P&?B@SXiB2t}_fM`4h3veUgW;__m>rbea7W zzdCPKwiXL-Zjfzih@slFfm?@pBjx82{NgX6GctFLPQG4-WIkO+qA6E%>n zjVhZeO@PSCWS7B=Wm{yab*cDw&xxx8(Jo;dDm(kHZZkfGzZ?bkA?A&RxF>}!kMf<9 zQ92ZP4%-42%G6^?ey(ji#{|)~r0Ezn)!)rX?KNc(S@>ZP0!94ZVY&U!cvY}+b*{sS zx2)3Fkveg5bvB5`je=ugsJ@od4KogR3=J)`4yjuvW)JaV++f6LnA!4A_qJuZ&|&}7 zEKuUV(k&J#NP5oqxDGLDe1uvW@3rb46=yO->j@+XUjrR)uTW2R(qI4T-~EgygVu-M z{ER1p)|=h@RLu!7jDNI4j0rKsxc(WB2CdJ4*6+Suk-*VMQ0@>iG{Sh$Kke85PQlV@ zjC1*l4f9%U`CK%19V)?|Qu%4Jn+p`lvxEw=oHDGk$x0Pu6}p+y&1uSF-xINUw=FSN zb+YfXa=I907TB00b2?y+xw@s0%B__6z`rjt*Z{v5tcosWvpJ61dB0m8{!em%6uyr| z+AQ03;xhL+opw0HoO8uNRk?v0vHeI79d#B`BJTC?r0xEr-bS9}EP-q~&IVK6UhXgx zf@JO)(+`StY$-y{Dy%bOh}+_Gny!L;HK!IR=%sPp@3{qcQb^tr9-08-kg5Z(l|)GJT8H`w z`1lAgegw3?)IEP35#t}D{Q*U;wM0#(+sCIN2gyVb%R$_wV=;Wqb7F@u33PGjhlQ&` z&=C05-ptTw2{=(t$52#paW4eu2@nXBQ0aH;T@`U?5OC6{a{V@FjGA4*%AcB}Yr8^Mo7MT5#UYit+N5Ir4ti`C-oslw&h*}Ds51y@+-X7e6TV3%*tASXlleeL^65?iLK#@$hC^KAsuMC7`=PVAqY zPqOO5{|8z?rN11mWhQisN8l0dqIk;9XEn8{Wg6RA z#3&A;;cyLyYgZg^4si_#C@5BnJbY#mq?IBMBhkVVkGRwuL*?5AdrcRu=|B=b94Y>D zQDL8;%k|-0vDE*E{9BpeTZLd%#VU%G5l*fv2gql`#;-cU0)LpJ!W{0`&6t}iZZL3j zf&aPGyPOmb-Tb>bdecqL|8ImgKAVlUo=^}-=CM}dGu1W>(rBeP+IqH&zYy*RLK%PW z#N!7-5&w7l13^d|PyAb$pl>Y}!5e3mxn|L%cY@1>eXo_goI3ZJPg0f*Pf~JV( zQM}b|P7o9h2x>IRw9Hq;S!~u9T~uPM1LH$IkRO{>%!hmEYpvJE5eV1 zAU+OWxcAAu9|u53vkSc`^=EU0jRpSuv`rI4jNx!CpPxPI&3ZjFZ<9=Gs91`oh|WwAotYwPis-k&72gI-e1q}7E;t5o z3kP}&N4|w)$}Jp4w{R@Eg=2LK2LNv2*l~MijoUM3ZqJChJ=4SO83Np%F>lYrZqJ}_ zd!~fjGxqjOj@vh0aQg-eZr>o|_6-r-zA?q^8(?nVDB|`F9&X=|;r0y`Zr>np-)Oph zW9aq`p4&I>?Hfg`m@;m~l;BoO6t`lCxD}(rt(X~Z#R%Y540$W&%B`5ATQNenVwT*B z(YY1#-HJ)whIzqlm@;m|WN{lt%xxG7+=l7lHjE9oVPd!qqq_~0Z^KNv4P$g0=E-ds z)@>M^+b|sz$$$e5Y#LVFrUB+QjS1Wyk-JTUhubu|+@?{3HN%HnGZt`bh77l6yzrmL z>ia=}e?M0E_hZYyAH9D+bpL+re?QDGX54-m!R?n1+Gq3|+b=nIfa7+DqFWxyusbNZ*a)7FC^T0xwl@5+K;g*?hnaNhBupb_l6rUE1rw8WKih&?i0W+n8 zrVSOo42<|el?vzi`cq2elzx>KJ<2{GTc~=Uk1wB(D1XWg6)(kvYPVx%56u}iG-{2e zN}-6Cz8xj}2gj5Ychg2oQG^{P_(IuI*#%iH^rrWzcR8hqp=LX*oE_E$ap0wmBiKq#FJ{h&%;>Ng^-kp*dC+2pNd(&cS zW}U(fO@~IKx#7jlTQ{I^R_K^wJ+p4yHny;B;P5tfew>v)vlf?2pV^9&i-Uu+0!e+| zT&_{;rB!yhn$8d+EVX^X2Tq(^oDo)Rc)`@ioDWN!)7rk^4U~$CRRah$LN!`yfbcZ5{5c#${L*@d z`OFxP7|bQ!cZ1V15N>VzyN=i)^+~bHtUf#VjOmK5^Qf2Tk zxyhyr(sZk1s8rM_r9tTs$p`=d0002f5CA|(BovFqV!?n+G^Y*g02BZMSCm}5W=fo? zSrS7E8A1#I00000001zk2?0|qT#?ts*k0g=UZv@_U8BYDAJH^l1ocdYCOMwsj%sno zjao~1x~$a>|5}|9&X*?jo2LyXGrw=rHpZ>^vo8szgHMs&FkboV<$pI5Dv{_41i!+q z9fXj@vWJh4J5R{8lj}?Vg~XvVp1us%(8hf{{WOO^bIJw#gs%4@Y+tA@E$fj9c@=!- zYK{O<6C5_!lyd>4zQ*DF=+n4Q+a1K>F7#y$83%&UlNgtbx6i8sZLTJ1CGzI@ez?S@ z!VE#TteQJO$YorCG|)8)*OcAF$YeI#`8+n@Fd;bb9d8f%rH+++lK6Mw5B~f=t{JpW z%^O()O&sQT7@2N_yavzh_`is6z6~;{5&vEMvyoA{BOV%ysZI$We2`iwSOBgdPz2tl z)74HSaDxmLieC-wTKracG4w~O4k#cND8^P4$&YtIpMo-G&>{bm*BQS@pGE(mECoc^ z0e@*{C)n%V$3nOYD?b|@I)RWQun5x?&HqOA@jx~qAul^E@NZbg+B=Fj9l*LsdLz)iMI0%; z;6;wcY@QeU9@|&*R2urLmUd9|;z6%UF{cQ6-Kg0~J#8XwfhP4dl+@fbi-V!^!MKD5 z1f-bbG7_8L?~XQ7;>zVbw{jO_rJ2|V8bT!~hM|CRw=(YVC@!K_a$cjc(j+W}y-^2- zTpcPX4})i$ z@fJz_k|MFENoge(yDHpC$!x^-RGO}JS~U3om6xGZWyGm_FP>V*;p>rioTaSY&Sm_; zV#?CSxZqRd2AUa{LgQ?%ar!%I?hO`Do#*&2JL_2PG>5J)Q&yu?rlpKVF)X>~(7XDu zFrwkAUy&R^0Sc8Mg6SQfW(@?FqTNQ;4+*oCCtx(5Zx~Ynq4kh(AT)9Vj}$0TY*gd& zH)fC9e+MdlTIWWc)wQ|=0itE)h~kH?I4Sq9a*q!gH_~n3&?wB*N)H?aFT#aLneCE; zSq4hj00CbgbkmG7>D8Fitq5#%C<}_jpyR2~4E-rP=AsA67T?o&Yv`&^a(voLg+0Xy z&Z=Jvi9>Oj9`3xkWW4^c?~v~vs@uzKb{b)(|T!kayfx<4N+val{dX?+6{-W##+fn6!af5^M zi3~@HUS6IEjKnBa$cioG<&aq=NpIeOlt3-8T)K}|)QQnlkl_WXe4$f83aO8@5~SHc zUb@P)ln~?;h+PLOWF+tGjok0{dbnM?5qyoiki&kCTXYP}nm=ja2b>sKFJA?j_e0Fh zJ$6MY<^DP))-~SxnR;jwh2OU)+NoG-1PUCU8Br@{%7I>{MMJ#%dJT)-Q*!oq=ez0& zlM{t78ztTPg3YfE|3G1k%A;6h7kFo`z zOPV5fLG6f8@opA}eJ{7iD|;h8oud>W&`99bcS#CG-E&J{7OY%Jj)bV};bm6_FpJQV z7G3%2-cF93SCXaqRm?8;g?Ql$dLyTvWeX_c76&HrK$b*9 z;pDa^*3M{`I-DJzm3cZx9-mH1#U+kU#kK7=ahMJr3lJI=Ne33n&rBX((aq8^2F?D1 zlVmQ9&h%If|35~#W7hc{(>R=J;{j)asyDHfywlBr#=Eq57QGYAdVdG+MZ#Qpr}`2C zaXR7$CU;sF;475>b=ZH`wH>Ig+)l95XNC7$onw8Hq_(%J%7v=*8_3C&gHyK)HKNwy zQ-xr#{oHrxxkSd;L^0sFwr+sYli?EjOYhz=fQz>2Cw(2Z|AP4jv%64vaqUQSx?C@_ z^zS>;e-}OSp}YG(kuqloCaWqM-nD2JZ5;Ja%qg4A zH)l&iKK#3!%XazVBR2CGJs}C;+T`ScgAn1rOgOPAUBn45P+s(4Rdg{8qqt<;&&&e? zB>AVUrj#E60DTa9fb77SNswhJGBSVke+>j}gE|UvYixRMfX|uBi3aeacoA?o=MGIN z2O)ogTbV-ypdmPXE;ZX$!1QD4fZZ1j{K$@}p{*TBB;GDhOq;Fg>s$FM%P!1eKU+Q> zwaxhOyu+;6&9`lvXY<$zA#v!A;*5nppro&KyI?yocZOAsvEvw`+T-eD2h{|j1Fj(t zHvSq=IVnooXrjeQY-$%b>^ z^t!RvA=QFY^A`Fa@fwvKP?>;wKeN`zrVa!{mqUx;6 zz1Mb6U4ObFEal^-OS3r(7at3J8p62AvVT92MztF~Gft1qDmczKB>lskxi^MV*i#fo z4|CnaX=DK&S&(>3$dWxt&#l(@17pmmi*mlEy1-PN<{(U3jAh?8ME2r<3=Kr;%l#{`SX#qnPRr58a`uWk2q7+_7c6pD1Fo=& zzMp|=JkoDuw5~%Q9zg3#(`{J2tF}b+PL>$ll;H!n4I!X?S_ItL(EC#gomyyD|EN~1 ztbiEq(7a0znp=fjX^-(tHowGhe3Hpr?T(X`ok|rvqmA_%79P4a-KXc)@1*E^@%_%M zf$lg9N8iS?L`*)+K2lgS>TLx0YL39qRR-|#ggrrjQdk;kfd7JM%d3f_obfI3TISN_ zagYFKer@~w%PzbRi1m3rlGdgrC#hh4uLSxgRHbxymdiJFX}K<}0*Ui=r>vJ#ZAohaCXPC)!5cN5 zz7)aN9T}+%D_M(OqqU~o4~nle;6$5=lA5#jzCfqwKfv>Ht+zjCPBg#ck35>0(7+2k zd%Wjl$F$kY0U5Vvzf-t=zmScW`A(`R6qbW4Q5%5nk5p4FAP~_90VOAJ_Jk|_P05zv z6{BQsFucCP4hYf|W*1qs?|t-+zCTd%@O6M7;ZT{Wyxn1;Z9*&gztEBYS&;Ui5dQ_5 zm!#XhSSg7{u0SVIX$v?f#qFh+#Wtb6fK*u&c5$JZpX@u^v6LpCC`2Wd3XI5nG-fIwEcmHh`%MyqS05uKw6 z>zVst_>I2sPA|AS`AkcTMXIka5VptOe1{fjiZ7Fbpem^=u%WtoK{A===(=mv>q7)+^354QsM-8_W-?8^JbL;WF#u#$!`wDP_X` zpu?>{t?|MXxqmA!!Ky32pCnOt(sT5n)brSww^WW5(6fUH6y8=aPIsEim2{zTQBLO4 z9EAVWwO3^_z1FyZ*VZEoS7(0Gz{uigI2?Q~zDk?tEIk8?XdTgnG@Py%F0!0_&rWjD zPDyG$l$s5RvvT5i9$R6?5Gt4u?~6s&f(5Gy&veAiDN3z$BKa{Dqu6l2BxU|;mwG%i z!*1-t=XWS0Wxp2Ya@Jb)1-5!#Rn_rJ_j{H9fWiLcTR#O_#Yk>098V)BKFQDPy0+~gW+|sqirif{xD=AxCxG`AAIjZ8Q-hJw&=#G>1qv_72zh)o&6PjP zV0!aTK=hii_LWAu6tCiWwrUljBjY3q*LIxNmRP-^u?i7EOHqbJQE4FmnGoWusK+5d z=l(zYeGn{d*WI4h*!o6a{K zho8eE#T1)bo6fa0o&n(HE;bP>go=GS5Jo>Ud}-n?peoT0gIy;cv=~|JxfAZCJ&@>( z>;K(EOiA(L=WecumUE7O$es3qb$W}=@K4n%Kn9n`0g&s;oQK+F{-Xd!dn>5u1FcFL zS&EUNJk$2oi`R}&Jyx^L@4ir-qt0^f^)iF9McBL97zTSw^H*T-AcW6}un10G$Y6;A zJFX{ntW#B{%I2hqzK)_0WmuH(u}o3r^3JNgqY)$~F|8W)ZKN&Cy{SU~Ccb-)sX~ex zf&W4hh@IQLzq`7$9K`yQ{JzBr`goDvbDBWX7?0jpOY3e#G6>&~$$GsC>Yp#6u^xJ~ zp72ccp?icWKr2WpC<9NaNpzx;D+!y$hWIKo$*jzn1rTBtjy(rQ!y|S6*?i#OnerSI ztfb%Oi0!o3g;5D$t2c5Ns;Wu^Wu_z|X(TDD!)e{BKm;@R(i*D__Abm#bHu|RgVfPn zNYpVNQ6bgH7{l1w2RJ#x)Woj_YA{wV>mUDq^~gRH+(YEBVdWqjJukU6Eigb&9yVDC znEMeodfsAeV6I-s4oqLI`GIR1(aHpu^Yd+ynLsyElGGoth{fWIv~|O87jkxX!1RaG zyBjLzQ0?8NBP88Vj9cqsuFjL*$s`DKYJ+pvD|G6-QShLRn|hHrPbBbEK34RD0Gg!1 zIHX3j2|{s{es!Zx6-&!W{st)Lz1f@PTSoh3B==+*J82SW9YlY2V+BuF!u9D^Vh`G< zArk)m$4(t;go~aKzOheb31O=ZkB|uZ+IjjI{k?SSZ`e`J+n-tZx^Y4QR7uI$HH08z z41rTcFzD#uQstvzu^>VRf59-CfrydtL*0 z4$9a>E=U*lp2kl2lSYe>~_Ll9<6t>+m}3OEzOH6P`N8 zS-^;xfyt1H1rU%pKx8KlgOf)aKO?#@-B5@KzN^^$EpUK)@u3)hhS_9<Zh%B0#tHW6F}n&ZuB~#dn!>IBA5|M=SDdO>N`X}vOBWQZ`N}3s;iUuu39-j| z3q382Kr?t%%r+NEx%T?)z})Mhdjeu-HY#vyBsvyLKk$JnwA&gP%D0U^oZO^+U(I18C`6FtgzF3>H;?ff2fI%IzD|M_I1Y|V2?s(4!#98_vF zrA3?SW(H5<#n3QO5LYjdJOIo|0CuzmVS)jL>Yeuv0k~;~GJj!tYH`gzgZBp=4`iuZ z=4aoQYu;km+XwU!v&ZJgydkFURekmtu{8wdaxf~ z8TIq3QJ-|c7zOyV^z(MB7$y8kygQCRQ8wEz575(fq*d>aNu_By_fM1q`e_os2tz`5 zV`~mSHa9e%@9$Yp(lR%C9r$`vrdPVOwiTdG^v|gCg7uTwc+P$h>w0@?mse;8~_3P zCVcZB^+=hkpN!cBzr=_r8l($%s6cq zd?25G`aJXInU8AC8ABWdkJ2?it^Z_CV?e>m5)ywhXX844IZ zH=jE{VxM<*gy>fP^>TD++h^kCUNb62;Z9@sbCz45`8fxkmCWby-;YZx{K~4v63W%6 zxV=fn7VQeN^?04Tr@5rsu%h-CE<(&sCp>Xg0`5#O0GQG0TRitaA@qMYK*zB|e&M*z zMxZWsc~p0FfY$G(V9bT$+yn~Y$T%50AKg%6%2xM*HL!Vz==u%i!~YZD0~BmJNZwP- z61)L!C%6$)o9!27g7@fz!_|xNlaXsWuN)L-Pynkkk-xJEIsX0Le!jtdyz^M7KPS&_ z{!u%q7g6Z>L{wgFkGtH$4qsW`GF&*%1Gxo5R_6FD_wGp{FyH9klLcD3wuE#N^O1}` zgfo21Zd8&sVxv+yKsi=eF5I)7dHh0Uj)do&T-3{?FnFN0XrrVtY<#C| zn(AZ}WMxg(EYZWhCsza#&IOga;QBjl=90QssUJ;~1wc-hr#yO^cBX3sWR> zVw8f(1I5HGXLlD&b3_J+Y$w<0gdaHW@p*zn@46QB z%heCCmZfc&=2fo*?8Da3<5330kEF9qJ!&^HOvMqn)(TBxr6ai-@C@63u#)Jr;(5Xu zVB5bYgi{aaya4>%4~Y*UqVJ$zNCU3^^nHR5oDa(7V;n*)#XSy>L7XUs#%BxQi@zBz zAnpK$198F5=gt=qY0>9!W`>`@aLw*QhZ&K2xKs+|C24)q0@L^0&_a0;*g4g8ndx!@ z8X$or*|zXYqsKZ#1g?)n=3#N0-3v-zeg-Hn?2kAj&b<{Vc_l@nb(Ty>S%iK>7N7H>6<`o3)i^COu7#nmrm=K!atv{(*C4>!;sBH!(n0y!j%{X}A46LG}!AVVT zNUHBDmwJ_<93()y+LNvC`5=rb)dQmMvcqGpq@00jX*?ue9?vFh|*~Hcz5ZJAnbt(%@zF3!cPV)Y}F*F><*TvdMpMjPPK5+Z)iI_8ve^`J;{KH+s z@((dzS4YdpKg5NHC^KU3L0BAb3Y;TIm5eYw;#53dd?N1FiAK<&((G{9t95W!f2oa+ z$J?$?ISRoW`Uh-cCz?vl>PpL_*sty(@rV7-Vx;^-qm!84Bc|t&{$9=ML%?+;xLd5~ z=4vj-7dayq{)^=6XXY%7sENi1#fOX(NJ>oVhA2JNAmEW)1vGSQiOc|=XVPCldb(EH>O!gO}6Ar{BFcFa`s9U zi&Z&)!Uf1ILX{%{qdudlyRM91nWzHgf-{n(u4US};!`YYaj&nue%1_?jkhVXSA5Iu z_-o9)Xeo4qLXefMZ#@vAKY+~>Q z>5~^ht0e@^4|Lnzqd`;8$rzeGy+;Ii_>qyt4ks>RR9pV0+VUip;HO_Kn#u0I8Kd6V z=KC!-6Acpu$PTS{AIcrXC^Lzv*d^p+{r%zXln#e*xaL0;k%`>*v~4ju0*dt5i-X<5 z^=W^KEwdZ=#kvj5i1H4$5h)ruvjbY17O8TJ2SP$e9AZgEl-$$6n-QfH?bs4GKt}`Knjyms{x){F}nz97)G~LNH89 zcO~qJ8}a+R2w-AqHR~gzu_nqdfrz1RMuST4@}&u-i#9-G_4f8KYK=LzO(pO0a%o44R@bSPZeDb)&W#PSR-K+RI*-V zjI&jMmzPt%&QvYiI*qr832_TG4yx0j`WEngCbKYt^F=vtm?+LqBc^8Q=%9Ex1O z2)b{o3Umi;i2X&Op!nt{NumwGIN*@-Q`O`O2@fAHG~!PFvVNyIimcd>f40$Ss7>O9 zS}Fk}GS~~|XjFR+JNR-9MJ^Z@Vof!E+sb}Wpup;|Mmz^ayHaqM8%^T@5}Dj`F}^6; zZg>IOHt=gsr&$b<JH}I02JWzQz&vg4e*yO z#WXJ!Atts}Ug64p3NFGrD9AZi!Z@f#29hEr4QMIUI3tzqKr#1jXZcVTyl9a&*51$bpfct)DO! za$RA`h~l}Y>@qV8sk|jlD7qciFxQfzjnrXm|YzwkS07>0njPTSH|6 zU|vliz}(=ASvOF~bonQBLMN%XJ@28i;TuF&VTA_pj$(%+fHfxKFe3*e4&+c9Xk8_g zQE%UBb8byZ_`r_&eMIT=aZZ$jXEtll8mt@LY{%WUQAg20^qmCPgNK0{&C~{4+Bv5Y zh<3zOClL8y^IJ6#r%@KtU@G7aJ5>TMEaOY(~q=sIl)J1 zdPsC7Uw;STMV6##m*e5tBsPZ8euZ%H7bXdD?VM+D54;D(tjGnK($6VOQ*$}lE* zV%z|a1ztDR{5g!(7`{Ikl?@AM=q6n};cHvQT=;E_l`$Yk&iGQCYUNxA(UVrP=o8d| zUsLK_=M7BYG{&(%Ob&`>_ejaOn=!J0(4gs(I&lM2<#|4p_hF7S$EAz0T1ZnDgqW;w z0W1=ybWRBTj#BKFEt26~uP!ZsbrvEHXCfSgGYbLF^wZAJVr9AsR}=;%qEo-!12jor z6h_mvYW6BO4-i;Pq#YfC=wi8A!XG_~`POXL>_UFA)T{c6`ex-6O*R~pnToK@nNf=C z_NsTR??wP>THJdV#3a-j5;IiCyBZ%o9W6PTr&HG^{p3wjug?r@0ZaFXwU;lfB1yp2 zceYQYjvEuqmN3&-7`AP%^YwPuA%g*IHx+@wFm4s5lmby@wU%B`t@_k~BZ=9hF6;d~ zyiH0rt6zdATeMOvWgS8#-8cW7h!ues>@k(~88Qrq)q%+8;seO+vN*@Qd>b6+x2 zD2o_7o6kU)N>lErg~&2WBC1#nlvfXYbchj`g!-|`zS$^T`v9K*N%qh^F4m)HD(zJt zs<3?9dWgDJ#EcQaH6Db)bK6!>yBF8%C9Xr0vK2@i;(mHTfcHvLg%fdFq!#=tw~kpg zkd;o|XofZa)osGM&MYz41B0Fimx%@C-2m?6%-JR;)x3eB5Y+u5A6>u;PMx+jrW-xZ z(e>oe7m262)ru4UyOS`Fb!?I1(E8M-1KI8Z=OGzM7>Wa9)k=Jxua_+|qOl)?bD!EEJD zJR^fC@Fzh8(KMvFfjxVe2_3F#w(w9gtNJnnh~wV)SO-qIJ>kn%f;K9eBi|P}ld<}d zFG5DSTlB`a_3eqwDfm9CP{dv32+Ril9Xb?kA3Q%nkPbxrty;O+Z-*<{{A&E!yLgw# zt2%ypKOrZ-9CZmtq#<)l%t{9?3NuHB+4#ttRsBgDw3l97a_yb2xQJZFa0L~~hv2~7 zq?EPf=7&7vwM9AQ(zY$prPD0d0#ARy09lgAq(1XO!AzB&x+4B$m*+-(&+F3Mx(3b*@@~yn0*()!vtZ6vYmE(b1G>xd7)x;rrCVlE_ zEQH}*wj;+zm1R*&Gek2*cS~@rHg3kD11N`|9;9YcPdfm!4SI0w)Cq5}Sh+`~yopof zQS1EOo3e<#-_6>9e#jRmWIaIx!enMQU3?`(S06-?mMzA4-C50|=UffxnR9Is8jrbA z8~6yB4y`HOJdT6CNm+dOR|{E&Q=*{p%UZ*ptDOdQU|PZ09Ksa(Yydf8VHNPM9-X$m zziBa3O=q3S^{}&u1=IJj6Lj*DwoKOIQV;ZH=ZQ0uU)l0eEpC$XEi?}C$RG!t=4D`@ z+zX#Pcm%!6x29^aJzP|@#Dly5TLlXFA*&V!Uqf4}sV<};xH7m;K2_X;Q?SACK{Z-O}Er|;TA7qV_c}`m1{!#YM3e0sQE%TZM zI+Lr8j~o^KEh}t1cy#faSO=<0(8i9XLFpwoC%9kOVQx;beLnCLk}BFdrJ&lLzbF2r z(Yho%PYSAejHI~2oYAkp5onw;gLI*-i`u~AB-TUpssZs7?&Hmk%{Nh-zWo(IZkVc>tKviOVV@3kR_Kiy)Qb zA+sg_j#2%c`z6ZC7)VdGQ4ItFS{YzGtVep>J9ZKVMPG!J?W|0r0V+dyp)iADIvLdv zrRt&O*yPKN@YIDDY%oKjM1^ShIgrSlxQph8ny`#FskD<08^LO@=4BE$+??!MTP|L~CO~bGOZ5?CVam?y!d%5*cCEwJ_cD+q;_vM$(5Co| zb_ki>l(a1Ho}KMDW)^rwz=eB{zTswwVDkR6E$qbU+{{G;cmOz?zkf*^a(dW+hSW{0}k(yvioCIAHmPC`x5$Lh!CgL>l|CRKcogaHMa{PcGyvJrypHHMzAwm=sa-)TmWP#Bl}uyehO= z@C-Sj9tJsKAlPcavnzS~W<64`x8d=5yXH7R>zkW&m2HRAfMNJ=Q} z?XOf2CTIvSeOP&QiR^LuKhV&fGdMIYsBDPKilFTQAdi2)ESO;CE%qmD(5JJPapqcg zDbZ>m@ui|r>%YB0{oMBV5@^x{C}V2nES$OI;#{i{ z2+?gC<`K!g`N2`X(eNpI!{H4emV;&eKy~T*#K$*LgKsGJXmY>~pWZ>#>A7_>k$xHL zNgbY|*Y^A3>VizPOM>z{@hwgtEI0Zl5p&ArSspV2pl|7#iUe2XPiR@8&BnQQiGQhh zlbBs%s%&-5pW^jd>G;GsYks@f=&;|}6# zp-m$KKO>A&8(sH6b1_bWbXFf0dlFMP<3;ayww@YP>*@`9&nD9dT_m3R-|UIXfrnFDYRl2RRf{0iS&s;s%{TZL z`Ti+rWh!8BMJ$daTowgT)OXUg6USh-F5)&|WRc_U~=q)fH3Ha#eb3-@aV31={*??Howdtr-9bn3G7CZt8Av}y&0 zz>i{7y@ru<(V&{_S=jg0iP3f}u4rs3D|D8^^8URR2fhchQCa*^rj0^j6N>mL9T5j+5;jzip^9p;ac z*GA5qR#9;CSr%~*02Yf@(%+3`14)oJ(@5IdsmRX~rAV@hmUb*Q>Hq-=?$(iv`2oLS zG*`S)=+t2QqVSl&&-5q(5Q0wDN`SAEqtf?3jORt)i3ijd%)z*2Y@^l=Sc>~*#!j_ zN{*WcQ6AV(x#q3d2O^N>6;?H*(tkdfd3DPLe6X8mnJk{XAKf0R>sA=!8fd7{8~HUs zg%`;V#}7(s6>xTYd!j0Y1f49b&aIK#QJKtFcuc?&KdY{)63dVSf z{IJ9IMb z14Y9Z28BSt2|C4RI>-)a>s+Lc%7+!@O-(g&B_x~C;z+xcJgR_tdqa39Fta&grRaOh z;(?u6a_`@F6DNOUZ~Hj*-r4Td9;FX%zg^vaUpS}=60pggAqVXZiOz>YC0<_%9_DUh zZ=JYOK11HGOdBIhqaZ_~&jy1!0-51oF6lc~2X!9A#c&rrPXhieDGdASJ$Vdw8G|-H zyXUpOWKnmhFZ?Rak@IK=m_QEmB~4Z_^!K^J#G|D^zm+ij0M)ziQ3IXs6^YE7WnERgL)Nu1z4L&&3!N2NaurZaBrZzEQ7O5 z0%;@qtV@TSGvU@UuDeWs=SsHiAT@(;PYIwkzY-0 zEqOgZKWr(}Qr#PwY3$-SKSy#XejFf%vTS$T`Jl50FjBIb1+`5}0o5}HP(M!rbqS^b zAHBTZaby7;nqCkTJ7w@zKHuE)kOMju(dvee;(*#iyM$mAXzFe*H@S#~bY(+_f^REgB{p3!oVM#|l?7B$ z%IY@JnGa$_T-mC@)wM!2(H=F0sMHtsq8qZ#9LG3z0Pk5DCVQZ&J)J`7!ELlAzsY~_ zJc9tqfAIeZV8=hu``D@6oc;+jl8rt>+m85=VN5!!^pXw-7Z(Q%La!v?2BLqu^izra z{zL=h@LM;zW%gGkd{Wy|eo=pC{`?Yr_~av}I}mZ_W%8WYvs|87w7)jb_+J`7qzr>~ z;8aJzH$hKvwYRu9tuD6&&Uwj#IbiXU?3vHr5(JzkiieV!ru zUT72(0FXYJ4^YBsRnfT|+%ak1L0yht$bd-XclCrI4nI>KSTbJGGU^d@A`U2zi!~K$ zQ2k9dgm5N=bwt7@$3hZ$qlE23M1ytq8=@Yu1GOmfM>M;lCCE{ubNFj;dvph49~^>M zN79pNg^<;ziUvk5puwUgmi`{VQFUuI0&LYWm2~Lo!=KPv_G5WRU9v_^8!sSo2d%;S zgH^?VMLaWPZrbNMb3H_OAN%s`E1Vu<%7IvT{AIJ=P9IYcT&p7YeBkqE?@HI%c~3)3 z0(~XN13wJ>a-kxG+tv|~LjJI#4&#_36Q~O*u%7Ev-J@K*?{3yt2=@(@BjXpktH5ee zZ?_jeD1@+)Y>FZFLG@cv0g3Fj{TSBA9N6ATO6ZO*AEUA{i1yAFe_krbEfYIg=%=$A zhdTQ{8*I{PX{ZLhHA$IFDOwdq%s>lh7_qy``-ne30n(3+04iPhJTZL%4B5~RO|%n& zf^bCAdZ7K)QvJLD7Swn9KiV)rM5}IYyf4d~X8KXl_Br?a;9~W);8zM&r{A75t+mNa z9FZ)Yur~^T3M0f4MN%@3IAd*4N0>+o#L0`=#%VVB03dZ((75L{Pzdg^YM%qs*I~fk z!ndBhk(_s*lB2>$g)-a&B*(P>0yQ_VU?K>>`f6L%#IZ>5bOH?l9YBl)Z4C;RJ~6i) z6`KAr!*bC1)p+8?Cd{XwH=us7ug!FZ!*nLsVB&9l|3iNaoKAdRtxS4)!Rdif9*Ykv z+??+YB~@dbhfetGolaW>1@qC;dMZW*OZ47#d}4{B*JR(!;yYwNpQZ*6tOaAMs6#JX znEvn+*K0@m=h_}$?PUb%ZMru`j|tl#UN#>BE%grtH12+;U5_j7{Be95w4HtcXP3O~ z$)nA>QC}OJW>E28+Ao0a1}D^oShM2#8Kuu z`3yQ4=#(FYAG2Zyk=*>TJ^Q@+Cyk)j|2XtFwUF{tho6HOFTBxYrqJ}_7D`~lWj!Da zG#ohc)~B*B-LT|=0#5J1g>x(=1X+fMF>soA6w-GJt{A}!BeJpSO_$8kn+?d*yWaVT zU;bW;e_Ap=Rg7n1;kRH(=D)anADAsltKBj{Yc-D37nZoqqKSL_xAYIii(~r z%y)M%Y_qRk*+O%!xsW3}@?9{5`16X(6D$~^NRq5}vp~++JqeBvKitW&RQ=$O5>;ZRq`@(jm$E6=b*m zQV(|*6!pLUYmrjopFZ?aaol?~0m~n8PD=%wM{WI-p1&Nzi^zC^+xckPAIy-0s$}-S zOq*hkz1i8NBX4qPyT~e%&fTa~7IRx>8L_7?{ z*XvApU}vuXQ9<9f)khPWH(GLL7zjjkuTM)~G$`Ya#<&z9gOBvU0{<%8VOHkuZIphc zzh5)}*sw66eqn;1YE6JV;*n=tDR*B~ZLPreo&^dhY+xI+;SW$38fp_{3Yq2O!oTf| z>Q^B1NcS_kDs@iwR+MEnW65`poTA+8_j8<&PWhBJj1E6NV?%_O^cit%n;5m?W5B$|na9^Q&_rz5}lD8x1tFbqe{MxjO{ z#(<23$bihukiDk|GOsar4+fCn0T$_O8gwn4N;UkUzm&M%h%of=T_8geB%hmr)?hH? zUsX^Eh&`t&p%dM4%YU5~d&Ih;dQjMGK|y(e|5qAtjy`IWS2A#{FN|XdtatQ>~Aj^ z#9)T+dH*&cilW4mK9UVw51)`NvUxhe{Sn3w#^SaI)(3CQEfQSXbL|N=BmRBoRH@iz z%D(jKbQa7fv-x@~Ps`V~_t^aDxrm(y9aytZIRkpsd(T;cmG_0Y9?{u5{VVHooplyL zq*}L|#`{Gv(F0C>?%`2`u8bc(9(%x;z6z@R@ULTit`^GCyLi=M!pvnlj&Y?`2;E4N z3@V&o?7<2l4(Kt5i+A;77fy?vji zeb8)|8yB!3{f^)uzXUx$CjN#jFV!aLS_MTrb_pL344C`s7>~?3+9k}cV3icR|K4{R z`gv^A1I@=GUt`jluN>|@4>v2@42t&t4vv3&%FKXzo~Z|C(&)fk)#r~s0v|cByTb+s zbl~#~b7p0oNgeEtD`{)MndQb#r5pg*)M>Hqz6nj!18AybXw(g4RM4KZx91M~_baHR zmmFFlZzE;i-c`=mQxQL+J)_dbv__5=JNojRV;tYxh~rIL69;%6r??&8Y3t1n?Mhg`@#L5V6_^@QEWU z{(0Z+l>!elXA^0b2Y)_FIW0mzI8NGlg_=l!_SsIo!rtFij9PxMgW9Q1IU(^rYWzx2 z8WcXjrJhH-V^Z~`Ktfcdck@ER^jWYyYHH@!cZKvS{JnBrYZ)Q{^G=!t*I*m^B!OUfdi~T#&1gxsE$K!zFMNs9m8bVi327 zMuO&uCHPf6oEj4IsPG!DVQJP867l4gFHD#$8#>>#H`iWopG#J3rG096gzd6u<@#}_ z_T21d%#iBBb7)IH;Dtv3Z#kP3DrB{3ir;K_FYsq;CxC?9kmO`6O1baaU*lZLP`PWp zQXz~AqUovn&M~HNdRLm3A-G1^4n*zcEZX-+1J}L-;)<n zIVF!5tCcDM39B*?UW8(jby}rG;brL(&d;?0;(#DRh*~zE^HvUtiohB@q}S=7-R;1( zFB2tuA~t%$NRIPI9&XLgRp$c)`a$;L=`Re!Ar}=Ke(DKFsXnW2rwfT<7?Qj?oMzDJ z96GY1(N7t;>ipKa*j*I9kuy|x`J(v80sXP4fuZFLl&04YNqIV-1oV9 za8dE}aV;+-lcqx68FCQJ_|aY7qEsTp`|G_26JI>i6}?pmMv zM>t2dqxVItB{}BLUf(Fvu;M2XjT@A|-H^3;RwxX;YN&DRW49u|*GZJ0Hgk#^>p;TgK(P{~&h_<~ zQ0Tx(L+KAXe@rS6{2y#9{o@YU4L12#7 z%*l&^{*pclZZ!3|(mSuZByT+5X+hK6!tP}_a=q~;H%W#cuH>Q7&4HEV!}XpyQcgi> z7yQVih$?i~Kp`CJ^G4-+crlRzu$VDgfy^7HYTpH$^Imuc+c1XzXJR`qgcJ>H+`1+i zOy1eH)Q=@mK$3g@pe`LlP%fKR#}f+9MeU5jg8T6yN8(}RsH+&0Qw=j6*#ur;XKNSy zi!lL4w;NZf*wM?OH~l<-MJ&K&bvze9@ZAv?7CZ%=O;^=P5E`P2#4xOPY?j$wn4@T5 zT!r(3oSq9`J9fy{^Fm@XpRuyeAJbNsPYi_FRT_7*NBaf!s>h=^uiUuKYV&t1x-~G@ zHVJTBQNUhl)=fnZ?0!oitJHT`PmB4qyWZO?$tf2QfUFHLQCh^(RSlDLxdE@);Xz9q zf*YKS-G-&+(r_Skb94-7{BTup3NN|c?m>;(U;x@M`|U=zW<9?(N2Te;7g z0Hz8LNN6wEBO6FaV;+Fa1AA7v)E%!Ix*iWT1jQN^ANVwv2mnbRDt%Pk=7S;>Rg_qe z2y!eoYNjvytca%@Pl9*nP7LBVxiLUpj>FaGkibfWM%n*}5IjtoZY@phmMQB2%afNA zmb2?8*KnQG@fBm$?CKw2>}y<(;-LQA1rTTX^NWPl-t5i-KQ2l-!5>;T;jka*6d9xd=) z1O9x;;Ew!e8N6J4!8n_aEUe|tfj(D!P-mSBy;I2o^l=bXz;knHQrhtBsD0DP;N(udrDZK?r~8LU#fqI3U$Pt>BW z;H{m)+x)fb+KKiKXjDA3^k9IRDC>?g=mo=`D{gVbCC=djtA~(;umhvF%Me88tYtVF zu4>xKCjsk*T|5(+n`(Y5;rxq@p}|3D2vG#9Obc=}D&1W3+{=862v!dWAGVghkUOT= zv8vr3Z)dHB_DZZvyFO#2Sf|*vg(B`^b|sGQ%-&i!8g%LH8y#G-obL6{%yM!Dznv$V z9)ow?=zDj?F#ZTmUWh7ME!a!sA>sj9ODxNR?;B7h?QW0Vd!|#HYmaNdg?P2XFK34C za*j-zvq@I@RkT)ZS(l10w=nU!yl;W{;>WxX(K*-w~GUqP^iijqS7+6lU~@m3855CZ5| zBDf|#dCsVSt{L0IiBh0qZ8`cm;2Fkn#T5j@p6=YoPeV1XkK{jck1*3UYwg|rlp^ky zK8j{#KSTFE2nTRi{PYEfc4)0QVZ~v-(mVo|al?`T22*RT6_tc?YONRV)D|F;8y1j$8CRSA6PFK&z_nWSC;=(l^9b4=5~P!2BvXCbxqptZk2i|+4Y zTNRtTtpD3P!nUVDhq71kNBZxH7Q^bdrszEyUtheaaAjbi`4jF=NK6VNC}|c>E@!!T zI4b}*KT73aaJpp9lz?bd=Lo&G8RY;Q;jxe8K)QXwX}%uM7~M!8gc8YI?XI#II43tA zyItmHfzJVmI;nuU7l|m8c4#y-WzI+2z!bnW4V5z=ta|~AIJX>?Z^s1$=UHiB-oimC z?rh)ihIVU=;L5iax(NqQk>&3h^{BawSI&`bWhNRfCX+Uo6_{L31G&y^HIYc89P@P$ zHHNwBwOsMa)x8bh%PvbW!EiwyuNYVt=a0s{UX6{cg6Js06--@hmjEBRmHC`T&eb)A zzJzi$c>6^Uv_XpO7)kfpLwxS+p}r$*FU}V`*<<^9ej{<8rIn*6CnXrOwzXvz8Gn{*5#z& znp{It&+3!0q%63NEjk~xc_S9f_;#_Rua)*j6{2pWpru?IJ*+J&+W*^`^)VZLn6$@` zD%Kc4V^h|D{bVhxC^ff+I#}aG!`cPzj?q<{Y}za=cywuwSZ+ccn`FI~d&*q|4Act2t+(IIz-o*DJr zbI4blKJZm#HDU>yOn!`l{Yy^&WxKz)7V*U$MR}A-|IBQzu6w!7zgGSa__Mns4U#}7 z?@*v)ugjqiOh;nUZl39cr4mA%8#s&a?jr$w!V`_zMjimbO^Fv%g=0y^VqPn!u1PW; z;hScOFH+;7@Q#sx6Nx;B^G%9>kmwv6%K|ZB!BcB!YPRGy>x~DpLq-Vcpx~*_N49;R zwyYiM68PQxaGmrDb+mF;o@gE-GeTs^pTsGqq6k%F${ewbgtCju^NV>NiUpPb6>M}E zp)j^MvMY_!6TUKCq<~K`hFzc^6NG2F*dHwb$EE5utYf?+g2l(&-nB)CUAm>yt^7SZ zpy?JArp?zYvzDw4*d!_}2T-`6yVJWG6YeEzy%pyx#y}RpKC%Lfo))_2T7pFgUKAGy zWZj#@@*od}iJTPdB8Ovnh@nIIDt9k&)Q88eGht(4r*Oo}N zek9Pb?p~dU+RLa-DX#g@J^i>mxfH*Gx2DSsZ@!c zleOrFU3<~up&I+^{Gx^=`*WrPy8v-5^eSU@N42%QgCloJb_iknggbnhEYP|dOh0wY z7<)DS7Xtn3Rso*~Gkw}de+8ipTK+pnzh*?A&vOK+Qnk4&@wqp-1rz|Tq8-FBY%AAGFW%hkJAN4jC*VQ4B46@F%tZP z4ZRVuR86p$x8froz?+V-o-#O9klOx5swxo-%+K!gZ=lmk;KeaVY;EGe>J7E^?RvCT zUx96C574MJ{|l#ki8BWMfj-nBT}}wvLh!~KjtA)%3TnT+k3|1_tzVrQ^*{bl&16b$ zonJTf3k7^~9`5l6A^D2*{w%Q;a};lRzZ64Ua9gZmy7MWmGFrK)pMe6H zoCd14Z-hCFGz3a9PObMGu9#NY{7qC2n-k3egoT()L5{W# zT}p)C2e6E_E3k1?cmS@q${=#Ay`y^0vK)Y}Pt6+}iMLh@=hQu&vCX}NLNvcW$@=xI9DF%v zCgOt^>#o<4MFc4ob|X=>=T17k3vWs$5jD;$wZb{NI4Y**TYE^Cj?Fpa}rZP{{RrboD0J z`v`nS0#NdoPiCr9_cH7Wo)-oC#^`^t_L0p`~AM#0MTm+VQn<>sLN7Mg#dXeu2If z|3vN{bdGQ11*flIb0I*+tMzEWr;ZAI46Km`J6za{&R!s3gcbm21~Z0wV8x~n!;nD$ zB^TDyngb^IsqmLXO->#vdz9B7M;s;1dtMu-ocSPcxZY1~s9GC0`v)Ve%F?cyWe*fP z%Qxr_0xeB<0rve~=P$+^$?cH~Pmd$!$~2I#S4ST%{NgLF#XO0fT6N5xaZ@`zdr+a`SL9LYUz@HEcbJy!5yvoC zuqiP==kw7evszcZb@&}FOv7cu`?VGcO>aeHJg5FzWXpHfo-sOTo9Vj|a^NW}#l@+X z(;Ji6lCu;3urvJp1c3_0Vy2C`ZN5VgSV<#BD-v|eVV|3qnoNab01k3vV=5y*L`nn5 zN^P(rkYpH?BZLRA$6(xq(5H3#strtLPK*8+^{;)Z>5vJ=K%%_ z`i6fN@yO8j7vOX?fRW94ub|+~@R!*(54o)Z+Z*{reN49H1R;0?pmJ3o;1MF(%D3FY zORkVdUNI4s!XW(>o3T}4KbnyL#I=Pyd!^6mWZCX;M0f2fgRV!Jna_qW74VF8ci?H3 z-L#9SCS~p4%TG{M2&MVrc`%PVkxK@Spg3`wZ zH^P>rO=PgKoA@L%0q3mU{Ln=k?gcN$%TW5`Qa0!C`03n*MZ)$_bXx&KaaGd9>+i5K z2C-wEm;;K|1^P($Ce%Q^hWWhu%1}7@xRl9K!W^H^-A|Ag;YWs)3g(2AHqRu^42#5U zO8+c>$9z`l9X%-jBq~zsz{(W)g`HzG%FkuejYvi;K96GpbdX-L@*BOzDfx@lx=% z0+|k3SX%e836@&Y?Bfmh#;S^6duW&UdV=rCJa)u_sw_2<>Sy)dbO$%K2)0+Xq&4Lv93=x@@S-Uc{F;Nn@54tfL6fSOgGy(|QEgpZ{ojV9n zIEp?OBW@*TYdXd@9Kt*@_mJx!r*oUrxdC;QIHG5}K_}TO$#~f@1n3O-VLV$dBWm+u z(M3UKv^e8n`AXnhDNut~UT_hM^pwi!{4=1mXnnDaF-Qbk2Xl!|Z4eT$ngY=bkiW(i(L!_QGr!>fvc|_e#NDREYnk^zc_nk6}vzM}bnhj3l0R*z}q;RtR z(bUp7u(<@>J?8#+6xIEd&`;h zpG(B!9Uvd=4lu&==~#hd@r*APuAXHttpOI`x;uxOj!bbnLhV11CA^Z=b?!3^M+DO0*cfcWgrxy)od_3&+I<}WV^B%^dQQm%j2(eTiz zXck?Eyz(zv>6sf*C5+~eKcXoYf0W$0n2Ev)#3+kf|Fu&BRw$Q@buYQEwu@y6zMYG~m+0vjZ1|N025m86Y(AEx=r zOz~LGAZiRTgx_nByX8|rVs@%>TQRu%-GEzM8$rRd)OX2Fb>m79UNxNz2jNu|9i$B` zZ@O>{2X8EPE&87Sq?D?t1g*}HlI8}oaF&SC%$UJCqc31tiTiJ~XY)*&v0jf6QqVp>Af)bbZl3c`ZG7?(0_7ZzHwj^dT(*=rH z+r-3`FdDEaHz%4y)SX=7*BZz*l`~TGD%PHq;Fo30bAaOG1eK4c+qrJY%VeUy?G}oy zY+j(BsZ76nSj1_3pI z==+c6JE@toQB7X_Bbcb7neX8QwzyKcNeaGupXis|`HZvl4NBWH-EEpr{oJF_u#kH| z6YyiP!3{~1KDR#7tesZI}8@_HBUCHi&<&U8fB9)s9ITyv-tG9d)1T@mRHe*n`V ziPd=wXm^1!35gkAurzj=RQ}FRR>Mz3+m&u@hJ{!t-cE2N%Or@q+J`W6mHoy7 zeU*RTL$~IeDTI!l%<={H4S4X9D)s*4r9%Rn9d17#{P} zH5x2*IUU%48F5PR$XrK9O&C1e>c}l=3$i z26M?<7b>s5ZalPzK-r_%n;g!b^7v@LZYFovg%yNJig&EG+6rdWa>x`ds8hjtSuef7 zKBic8WB{n^WIyO%C6+fVJyKVgtk#I0TXzt#GqRcdJb=kDzZh#j_x^?QAJ*#q>ub(u zczbh@7A!^d29i@TW9d6USHU`ii}g5T3OFj)H=FN+i~c+O=T4hkvSH;N0hDrJrQa+Y z&Eob;HA|I-;Ul{jcX{8g5Ahjv^vkOfHgUO?R^wp9f-)MQGPb%-!QcR+7YHzvPqKu( z?o8T1L-@t^mZfR#j(vaH8^b}$WY{=RW(KxCr zXNVY`BtHlkfY4v=*xF!`3~PsR0{x>rN;2USy`|Pab=irrC6!O+Br+cw+*8xh1|diZ z&m=9x#X(TGdv4065%a1!_J`-lV$1Bo>wYlEKndt$xI%`XG>=oK?n9Df7@VmdcKe{T z=6gP>t{MkGHv!EwP?%oos5aYWlP3)S;IUaslQS;rX4v~$0naQf7gR=dW zhFo9QK=}RnT2b^4@5I1mmKzxxgzKoFJqns;sqY*8p68Q|i-)3-Chibw$z64%W#$KD8f=w1%k`nB1(F;l^H$oJ+K0z!(LZypO&x zx7vc>r+t%+a&P>1Tr9S#NN1lsP;+uf7YAlF-`sTo1OZA_P#xPQf z#;^7qpLGe>z>KUx+|gV=z0ClWQZ5&jIYzb-rBtdffTZ@Q?O{aaI7v*B$y}V0)?hoyNEzal*XO{|f zN%TstyLxA^5&jH?Az-NAFkS?^yAd}t&cG3Qpa`kTfPB*cpHX2MhJI{!eDi{u}2TLJaId~G}awlL|8WC(K z&4jm`>2R&QYUs;UCIq%F0??F$I0uTdn>oJ-6ex6HFo3imi3`zZiqMv$_tH=gU@7W; ze)Zg`$mQHXybJ2i^gwz)X-_p6Y(kccUNPK(bf>@FlY6m!(#_Jg6G@`O05p&~2jM?B^F4W;RJp^d!b+-@5ww_a$SIdM zYh7s=Q?{YYT7g*HjymrZUw(>*X4tPvKyed&Wj0Wdw!U|o9&CfCWpg|K$)(Irw(u=r z`=7=C?bndI8QPjDB_-fkxg7hg1=anBEkUzYi|5F9OY9WGQe4lWumo5X3>4@_*_2Se|ntlZ1O)tpP8_IrI1 z=>C=+xYP7r`QOW1-v?4KY+We)y&2SRDYg>#)w5#M&@}%Ny!(^m&yC@?IoVX>9hCnb zNL_-tKBnU(EjG%HpUB*#xD{{@?CZ!m&0zVHqs4J~<8)<5ot>imw$O1K8?S0?WFRBoOtJZ%{x}}0d&iKA-1hX=-)R<;0iL;4wYU0_`$&W zA)g!v9S;T3I*QXVw;nNhjpt;x#p}N- zm%c3FVj28+9ll{)ns)?GIoZhHm2Ltk)-EB9#nh`u;?|E!k^=$zGs58ec>TwM?BANq zBg~2)p|OZ&w=nvH;6lBFIyp|Tu*5RkmWCrWD7~xfoXENme!U@bVDo_YGw{C*Dz8cK z>w+G~gr4!bk+waEeI01DpRh?2i4KQre;sTmp68QqdEMh|c9W{$rgYI|P9};6y3AOr z(bLm%^$Y#Ib01Wej?wqeWV?pk{Rh{0Y~(vN<^B{MKnKS^Jle@^)9P&1#Ia*%xpcs>AYcgeGxYxuV{|`kY>eO;}+jGQ<+RpFBSMubgjOzP2};d2oBS zq%L~!EK-YB@F?Cq#5~tK4`17A3uPPL_SiS1+~elkTRkMyV+>APyj}lVQu*~{d7k>X2O22nJiYZ# z{Xu!af}@pU=e9AOANLG=JF~X8KK$Op^dKm6PO~!DVlytvfc2bh#gX&pO+YL-xJg4ws(8FQMW^%z<2s7-Q08~2FQ!OW~6nba8TJ|zR zml4)iAKOy2daSnR^quaZ=s}PB7B_~4egsmf@lww41Ug;Voeq%N`DM_77Kv_yk6D*9 z4Ku%;U`kUe^YTUstZvC*p}?POxrCf(jNWyD|11Sq?dB|odEp!qH}nT!;j$3ByBB#M z&Z_q^iKW@K!3Y4#Tv(&K*J z05aeo=es$P?N@q_9RK)s$TARj*!4@Hx1!UbXVjhOcUy{b6vx1ldgz?K+hS`DG$Iyp z_iO)A00Fdv+o1Km0*Hrv*t8td+&_v{92j(1eDUrxa&f&|UCXX_p$>2!oe(}(X$VQT z4tmsIfB2{#BN z(Mc0FA?~T@k)sAV;2P^J;=ZjDE@0Uv%7d!W_R4|8^`L|@d$Z^oNg;zLeTYwS!Ryxc zlcNC1+(0fZ!pTF-!pQP|tr%~^@bgvgTWXF6^}&01w$OGv}` zz{Uvja8Dc6)aVP3`JNyylgLAp=qH2<1$V}5iH9GGNidpssU{f^txW?w{i=s>_u=9{ zF-rpKX1Cz^IzFGK z;pLYCbJgR)vgNsCn2gWFyFifCu|6T5I1-!B(N5%NT8g8o_EA^@nQoFh#mZV1V2KLI z0wW730+a(c7f8W5Gip)D)L!_76bc&*OM1giKzig!3&7HbN(+%UFK5 zM92cqZ-Hf~2Z>y`MVj!TsUqTLk(UH`tjHK(kSfSgLofxXNluqY56VpXc*WsAbHv#$ zMwkXat*fK4aRJo!+=6!G%zJWYC~q=1MOgH z141Gk9^a#a#FojV9Tla~0e_55*+SLzuaO;q8s3omX00b0-Vt5Crl)WC*3P?rGie-< zhG!RcONsiek4!qhhyx-+eTI2xt3}4+w>0U$Y0pVvv>@>%KO}t^N+&A4U7gz>$KRYR z)A3{{`#av<^5pL0+@FjA`4W^(q`nVHFC<_ecSjC^sU`-JVBz@U@jZ0YOvm>1%*G%Ut`KagcC(6p61XR^Bc_OouZi?0m zoWe!Dh-o>wdI>~mAVFDj!7bqVeep`9EplC%X~_TOmWc zCIhsmbL^ON3z`C>#TGm3{{K^2iN_dan{WNYmMx&Lh%sSddTIG!TJeTLfn4 z3K2>*DCHZ5J#7M6u8(@axnACdZ@kGvZ4BTNl+>v@jT< zkVOvGna~K|F-j;(qDc+ces{4+wTs?AeM57r(`&9rW zSu;T_PvQ;ucOB=U$(#9tivM9bCwHbA*omf|&|(Kj^;?%5?@g zj35~N_qX4Xz37}Y-mw>YR&p#BxlwT5_($W0a_e`FE0f2I@Oayb0D*RznxSi0^%hd^ z0LhCwc$a{k_&RXlQlwnxg|W3zlO3&Br+$Kl)>#~UHavH^8mKMKI)MZC?h^j|=id8U z)zmVq>nTkhGo3mOg-3+^pG>x1uu+<~mE!^AacaqMCw>@Dk{~`J2f(1X*I4l;y(nzr znkRZ)c8!yF{3tqmbZijE?W8cQpjNA5A+BA{IO$bHHYO*>rgI{S424Ds3*C zhar-W*esp2!3oRbJd+X)9?b`!4SzykomhbF=mbUpvcIql=W9adAVU0Kahr>&ptzZv zi}-%@Nxxg4Ofn9&r=_LcfGE>a8+gY|F;F@mTEtcdPCg;nr5blU$r&C zK$a!@>OHBUS|0wnR#bY@KPv8O2r-*Mj>OpX^1v55WRDh9>>=(C0f7GkG=MoDGi-C$ zdk>cipZ>S3f2ycJ62zQ``D|%#xn5 zAD|Zo+C9A+q69a*3;0Bk!BUs76pueqA zYU$^B=fk-3aenl^%P#1)hkdTNR=%Krk4(SUumonp(ze_ez89N#nh*{|h`0f6>h^uO z(kxF_0%gJ2w!!kDo+#>_gE&V@QwcnW5emayQev(?xuP85T!^-Rxv$Pu-7AyMcQGXJg^rN(A~q@RxtD8-#O4m?4Giz~vnR_ew;E4P(cn7NWe z?c%p*LliwQd`##64Do65Z%wh)aLnAIbj%#}%`9PlQlPePsfJmbfC&66sf`Q;U4HE@<_k1K*T@X-_PgZ6s|^y8nm0tMTJcSx z2pPvu%p$H45NQ7Q>0JMr$av|rk6@i+_Y9$N?ir|6xd2(`LkRYf5Fo53pqF>LXKv|O zpmbGgJtw@YGgFz`s6k?ceGBgEz{D8R)94OtFv6Zoz(2m^$kfEAP3+tFK!o|ZYhY>R zqdI=a9MTYX2~nPDu#N@97DQ}}#c02m@EQsBIm~d9z?gz3Rv1LmfDhY2*(*lf4-@mb=hDqx14U=cqxG5d^_CXU}U6JZCY|5 z;F{a8Pp~6S2L|FP3u%oIiHS+XNSpZxgI#{TgEC%MOl>ye5v*uW|+0Utt1>Bl7Y zaJg?$eDZ#qeI?E53v^BkY{rD8-AwAPJt@?xhi(fV=130+I&JG`yL2SSa!ZB48(QY5 z+yn$qisC72tr$;!-cVl;wDDLyA2dY$4n&cwGBhKJkq_-ScnT`P#6o1|yi zb01}3Yw0^I2hN~OK#Ps|cGEk&^+{>yH|u+rAA)P|*KwOOM1A{9Oy1r=zzK29M}g$k$(1z>?Mz>Fv5Ni!Rl|vVAUM@Xn}uA z+o#XWu7xM8^Gm!8vaGojv9tYvZ+&J50FoO%IA0o2>kdi`D@5*{si7yUonhvIpc|nh z*s=qhS7SxHHbq8ewy&iN+2AruK^i~9yEYS%OcCJI)F}~xd{i>s!SPkwtOdp;Q~^H? zM@`1&P`X|g=^@K3cR?imdATKnv8OP20R!wLZkyHGoo~Z!5jFr$ra5As`0lkcZ{CBi z%j&C2UwABf5KZ&|e_@m-y;F$;{c8hP5v3g0EdlzgSJPoj4tGbf2}6ZW?uM64(t;YT zHYYwgo@PETjhq;&j0l;m2sxpb8M z0!p(LuY-fen=phfepQSis!zc(V9)W@5d;cUOMG^6yH6j>Y`sbQ?qx7wh5h z`3S@L$VL5!hzl#*6%IyvDWH5yxh^({(E0rZ>_g;0_;!`J)J@ZH=5~r-f27Y*(fU-A zzHykQwKDMG=a11-e905O zf`BegQ%Agx3uU>!tWw~d*fOtXmG{?0E!seM}_GtPRQejnX&h%Z9w#ftads z5OMuEJ^=&aohvKsH{zZHpRq}yNT&AIoW2BUIB%@RZYMO7M$Sq%+yWO`bV($*dp>14 zvN`WTTb##YurxxT8ppE1-%Zhnr_Vb?UXUW5znooNy4`@s$p(}bs3PVa$nj?@SjPZaTt|k8CCI|$7pkWBz8l}sB3yD7p z>DP$OyaC=MBeEL_$yyeaMCOpMXov~_SzPht4gtmVwmyVKTt-z8SC_1a@Umi+pQ%?9 z`x<7G1R|Qg%(o|LvC9WF^NLhvB3Q~IIFX!!4W6dBnI9KE^Vqwm!Jid78z|}C;)&O3s3=h4*+das@;-IB7&8jNy!R~pp$4w;fccw7uNvUDx+uOWxlM^lS|3y(Eb=GU)ZW|pU z6htUVwHg%?7zXuC~?MadWwyo^x~THH>q0JAC8w4bJJAI@8{~#-rAQ z_HE<$OzYpe7Q9loH=c%dwY~8)t-arLpdDC`w>O@qM*X_!bdFZ<`@O}w?s}cQ-uO3f zref{-6};Zd+d)UR4&dAXL|O;QwVdH*9ERHY993em2w6n$70x ztfkj;;BE6rL4$Mtqw3&pcg|}(d%x}Cnobby?T*gbbbJS+>2r16R`269J=b?}O{dd2 z+m3hdaNMfXa%#Gmp8E>pbamiOTeo#>fAhdreQr(f(p;T(%aiMN>DsRCaUC}YnCo@H z*10!vy}k9VofcvHrqf(Iz3zgoUpXyzx8rtn?N--q<9xr_biKaootD$}aUD0VO*I z!0`X|yFg9PfZbYOo2&J0cV{oY?|9m*d++eIIma!~-kF}i;Q6kOAhw zSS~NI247xW-7ffx1>=J>;C$ONUFTZkuAb{!dQNX`9jgNZ;#e%-jKyMS!+D;yw$)jy z%xiP+zVw{g{2gPM=XvV|K<-kYV6JZMtCr4{g~;Tt693PAxoi6W^UQ_kpKF5NZO>7$ z;hK(Zd*|ulnr>@n?>u}5qiyZ9ZT+TY@Ay~W+G%2Xj#_K&#Pr+^p4F(jpcbcYZ7+C> z+tja(m)AS4ch}n67Sz&t1O<9+YtggTHay<#wYS{HyYv-qt7+vp;8sr8UA38tRcFWa z+|~SGYtA2R%`1>+3Ep&$#m@CwUF$PAN9(#$ zuxoXDrb6RD-@N`&C7Y;C0muL74<9}Lqdd0tcuUt-eSG6~;MS(?y!HNeg9Gcdyi2of z>n%OEt-CmGx2?5wcU#+8XEXo*H*N=3spV?hTBoUYdA+Uea$HTP@hv{rGuHO518p6P zodNAG9jzr9&_~u=k+a5C84_i-v-s-|K*pV3jDVFrK{Jv zo2AElwK}anJ?lC3DyX%0nTc%Uf7Y6-x>nt#^&PivYgsM;y+A_0@c&deIG7IM4|TW`&J81Ht==5dzx*4!Ns-`c_Wj0cMGw3%8H+Ik(B(=_01Yj1nj znyJ`3EPAK6-m7^Bf3dD+>e?G1(VDcAtJB;qPB#Eb9x%j5&(RwBh>U#HMLwz`9|@6< zfE+!3@fi!j6&8Yd)zxb?$V7{8Q^!cx^-s0M$5Asp>>YDGjUCnDeuL-X=ev5b6 zXpy?zR=sT0ed@NBjn4j`x|P?mkpS6fmIcHS(B=P!gy6^mI?PovpI>AFWB)-yLvnyE z|DRp@f4P_b>B<3ES|fX)BwdA+rD)oJdQEF`5`y^8lO zZ`PaF+q=HQ^O}Mf&k*m=&%+CKke|n=t<}vncgNCgy8c?{=H{BayUkRrtJyj?XPvEc zb8<74=H59td+m1VtM(4G^*YyH1+})|*XHheodtjOYdxmFb$-3UTRVG$w{}(vXpid1 z@&AF>LA@T_^?Gm&Xz%#lrN=jJ2j*MtwFckyU>C=~dflb<>vga7ZA}Qi>en5Ne{20; z$~k>0=h90#3A~i^=%t(iUdkCA*KxO<<@04rPs+zHOy^-<)UK^NjOSUdPIIMv$lU&; z*9y@;ulFtL*EbZUu-`WKx~-#p6W;W@ExNbcZU0d{J?~%0PE@Uq;zjSQ5`-p&$k^50 z_SNgPZ~Gcp=U(sIf0S+xz>r)V+?!i8!vC1puHQJ_f3z*HZ);lMAl;VNc7cOvw>_tK z>N=h+jmzyi-QC6Yo!9%@O@HsAY~Q-uP80Gn=Jf?8-oE8%TN;-GLDvPt|JU8^J(=15AvNOdTc7{vT2w8!(*kQc9k=_BrlHkdnyx0a@4jO^wEyTC zga>A2|4|43(I>R^XthCgt z5&{R__V`KN^}hW_wY*@j9bKT;f!{G+PV4Q_EP4lf_q+a%@#;X@PP~2VL?WiWQLO(f z+p8d&z^l`H|4{^6`hfN}@KGy!j~4ik&Q(;=sa?n2>TZ_)k4o)2?)D#z`rQ_@MWKY4 z)LUHbOXqkD;+*L@wa&kBrm{3B2oBqGMW6noPSNNC7<=>O+ps!KeR|WR=UptUE1jll zVO?F-URtkK*`iHRrs&f4wgvyAO3|eM|0n@^r`O5|1&Kz321qr-IoWN0^%{`Q!!;d_ z=f+K#|5w{?(K5mRZ^zwfyDuHS6Vr2FoO|1IdyeOMo#S@5_M+Lz&0U&`HveJ&u=*Fg z*VHd~ul23^#%Hv-uG{S7sNB8F3&D)`?dp3Sct__mZr9tlZJoc}VtS5>y=^(RIsK-= zbiLQ(dW&nfbQ^35!m{vxE^V&P(rrs>S@d6PZ+we~CeQz0b-MtXF~6hXQLXCLDjxOg zrD*W}savX`7QE{-ng;&{=DD=FIqt#?I70D%(um zsrrp~vtWEX*I6)Hm#Txm^qiGd7r1e|5&>So_Ud$4jZy{W{yF`v^KZ3EdH4E!-PQ^e z%-e2l>v~Q{29HeFKbg1jokzDzYsYx^TW`H!y{-op)O$gHNI_$s#teCNIxH1q`EwQD z+5R8S%ZUz%a*8?dA1$->ycWD|xxu>*)1>Mc(97D%UonZpJQ zB^WMXs(_)Q_18DYKtY3Z{_FdX3iyu(_>UI-N25_G80`NC(rL4UKsr0ybaejT`qD2r z^se*^*>`Q)3lc9nB+urmmtE@ROYedP=c36a=aSVD)aji|=W4;! zhyI(*f2gLLe`uS`e<+(Z|4=oU|Io`c|4>Ub&@*QKp=B!np_G&VP%>lwp<=@PL&1Fc zhkEJq59PAuAF3tGKNO4PKlF-~e`pmd|IjH?{-IHz{6n8O`G+=P@(*32nAA^*@IK>neRj{ndfKK`LSc>F_m==g``!0`{gVdEcKqwya~W5z#J zMvQ+bBaDCO3m5;;7A*duD;EEuDpLGIQ7HaH6Hoj@O_cbDk{Iz16%pbe3gW{*)I*1V zD2EOIPz@RWp@@h7P{YE1CUkHSBcZ^A!xPwyX^hxZS?v;IRR*!@H6=>DN| za{tgcxPR!I+dniy+dq_T?H{U^_76on`-eh!@DDXB`-eKH{zDs({X-dy{X@mV{-I!B z|4^^4e<&CAAG)RW4_%P;55>Crhbl<$4@Gd`A8NqrA6j7khgMPjL#L$vp;1u((5VcS zKK(W{JufZ1r@ov^8wDT;z-(i}oQ^VnKUF!|z>K`_2Y_3-Suv>Gr)_M(Y=`LO8 zHXzmw+oib=zQV@5ytvBds;$>qYIfGFxy~DR?VQecJDY#$IXZ0LjHZM4I@jLgT99oH z&Dy5dI+#wcZ+cr(@vL^c9b4-_+K$a`$89iRt>^8#EvDz{?)GiQ>eZ@V>$@FTcXfJO zgXggpSc|1o|FD2{cP(dkX>V@Vf%F&aYTk8Pnxiosm;?L&*ezYV-C?CUw8mYoUgvF6 z9De?{HyE$ti1AOY>7+QMq&SMC6|{yv|A##PhXDN#{rUePKaT_6Z*Do;uBGp`wf#kV zvqPKjwq3{Fs93BktnRJ%?ClNCe#dz8UCX5fg0p#fRQDpU^ z^L?hy*uT1)?K6O#by}aBsW%-+Z>joi>-B!c3gWojOvS3d z9CeHDc>bOLu)CP8TAj7#T5YC|zcWtNsa`Nx>kF=DKpbthXPX|RYwkSAmWTDV*}zP_ z!QNfLUS97CY}~GMn~?6(bT)sRsbDh|Z>E0D)S2ovSG!$YyVc(KJ!@_4nYQz+EUkUx zJAUKdtgM+%p@l;6ABEhbDDsk2+!f1SvFQI3sa(5soyhe{l>h$(kFFEkJB(MWT_qEuvkQ zMr`{3LnPNjy!Sf9G+Z?Fd&2{L3Yips3)kMh<`_8tzc4gDhVRd2GuG9O+Ze9A2+=&D z3oj|5Twt~8MR@f8<1PO`RvdR25034$uJ*egtj9D+Y(Dr7=)|Zb)(LvS&zoZ2;iL(gG@qmTveQgZQMJVB}zw4~k9+I|8YtDKUPcdh^Lk zA%kHZN`aatxmrXiDe_XHMT|wKL>7l;jFuEC;jw8rk|qio6JsX?+#=*roqFi4K`@!$ z38~yt0mYX!j$(3z5kwAYQw954EP_Gj!PE1SlYD;*rysVtJ&h()wmn z#+D(`X_&+akYo;Mb_v8G#|FVNLXv?OCBQ%#B&m5TL4HJlBiE#b$O&!hKxTT@r;o)n z^K#07hMcI21Ol!o#&Qge6{J-jKxh^{;3~lf+<^d82(S#MB0FcDz!C{mk6gre#oGqC z(W-U$U6G)`otFh$lrXZPk_0?5<46hKgNKwoPu`@RVKO`Wl5!=Fhb#fcW*FGPf<-=3 zgrJY@>?k8qX;+0#nFA^UkaczwZY3iiUABB|EpSU%z6?phU@gmzxwAk}HmZ=Mg=?03 zsyKN{m{B}X1E(X*RG*&HKG;{7gBy9`g$%n7OMFgTxL7*3H0cZDS;&g_RHyGu3ZU?q zZoq|-E9B;l)Q_(uJWE#WB?*Bxmj{l}(>@b8!pIhGV}Tw(Fp^DXC_QDU5D175J?mhMRht^*;N&+CK7o;!RL!!7O+(z4eD|@f#FBCWO5~s zk&df8i|9ro6%9$1(}GSrNQp#FK#C}lcZNy8VlRhCx`Uv#L@*lOykQSDGgwL z1a^_SGo%GlK4F4h6s?W6C$uO_QXro;QJBFPSsFG$E^nq!GGI6X@RkP!aK&lTN)+u? ziY>_7A<9SF8j>?|;tNa|DE*i-a};obaPWvApe2HnjVGr!Q;A|SqHTl--Z_!a7)3E^ zw|D>yxzUjNaP>$-iHi~%Rh3lDnn&#gF=e_O1ZO7{wGK-&eG{0_xp}#QgKZN^&y%DT zc6X?8=raJ4nApoEm1$w&&)VYeZt7~yT_3#}P6RyH^6W4R+mWe5ZSLu^LEQmj;RWVM z0~pIhH8;YD^pbW%%S)>rU<_o9=S05)izXB@^7P_Js3NFG=0?bnW69LWkPk;43C674 zsjz_$>m@5mNeY}Fnv`qG_An@g(P+TX^aPeePYo9{TD*K@$cU*?W*P|z9N93*0D=!zav<`-1B;R{UmTHS4^T#UCvIR_VFiQ* zq64K8l@9C)EFyAC{Oni)_6G21l1Txe31$f3dJ1`v`3sklQK_9jc#?{^J7>fQI6JYY zglLKmA>0@wRCQ8Z+45z`93CQ;B9Cq=c$o5*Fu@eU!$jywvvnf|xhfZAIm!Txf`0s% zsoQdYTM+WMCl)lmbTrd7mdWa!8Tb zAbVg7#13h}RA;2l2qYy+ue!T9Y>fM}s}v^B$lH^g=Zz~WvMD2+5IwcUF>odd)6D1& z0xNmE-VkRhbI1v!)J>ouycc5vl`U9AU?3y_rz>1T^0qkKdJI#$UW*?U6d0<>UNup96IN2y=V-=4Y{(y<5+c(*2FUQ(@zp}^ z&y*=hAz0U>29vc2F5(QuDZV?3bf#yT+~PjtNTKl|?0^tl46D&PrBLBhN0A7DQMS;K z5Za3ZtAy-vVuzig4H@4(PEit&fvF3Ou{&i1upq@5BliN14ndZu+oPDI}AsJ9O6J@+LQ8v$B7*lCZw3NcBxCyL*6QKwnRk28XY5;J2b4} zyrXI`CrK-`VUe|U0Vdn$$X#LsDFBJF&d|)^M84E#x;YN1`EoH1mI z1C}}?VI0G90GgE%4*2l5l>dPVqxPdw^Xi6ei<|C8ilnElZ43($1sGgXLZG17DHVoD zi%Jnp7T6vrxe)LYW3U7u$P7(AC&mJJbYNl~Mp1j}!1$rY0>&UXUqu&SX)dUcLLi0v zHmE^LeFW*`Y;r&!r4}zVY{5~QA}ZkAv*|%{iIXRyn(=nUHI1D)VK#PD;Y1Z)mZ5B- zBu6zTidDS;<(*A%I9`{hOL z+S=0ATU_mNIzZ0W!E``|=>Wm$0Jxvc%I3L>#d_&==^Z)wpBh2=r*3PVo*I3pM)OpF z4$e*m_?Wj}U|<3F|L6Twz*MJat$Mso)6urIx8C1&doO^B07XSgt($NzV6JiDzQgpGmAZu+Z>>+LPX zBke)pZRDo+#tW16lW zqXGJ{@s3u5d3 zEdC*~yIh^_-r?i!{Z?z~?_H;kzw2*Zz0-TQi}v+y>;L@=NT=IzVtXtGU;kN67zNz3PH=U4q2_U%y|vTE%lk?5nPGE}kH* z)z)!iVqY}(ZcOY8598H>bT{n_EKFOyz{0e(3oJ}q8+?UnE7@0=wleq%)7G)CFl`n4 z3e(oGuP|)|`wG+6udgs|?fMGS)&^c-+DhgXrmYOT!nAeFD@ z^~))SNR5wbrkk9RBrLukCP6#|fd%kgro%=d4Z@9XvW$!p7)?km*>r>b#5N z*__T3R-IqffpmR0XU80-L0)`Ufu4)l=FH{#r%Qk;p{S!rK`zK;sBT`HICqg^>CxYH!P^r-oGxd*#Q~2?}}GYr@hxefnHFj z@w(f$tJeG0#qlovrtg2PlHvagkbQZ9s|5I3U!%3UJy+LlZvMA*J!s2Kk+-&*mtL3N zkGoy8E^hq-18emjJRln@`vS|GwaCC_VPoKWi)$a;;c4qZZ5_qMx7N43_%=k8H#thz zZ|lH&{^D8`FGCsgA4qorXS})Q?qHm+@LB=Nf&VXR7u9Q!Ev?RqcZUu7ARa+_POYihL*?H!X;^ies^qeX$xssO@ z{XYPrA$49J!sg{6WnLcg<*H~3Ht?$V#?oIlkkf2te#sV?KE zI^a)rwx8-<|6gDXYFdC$?qx!=mkGgMCcJu?aO!13r`O&Y@PVEf_{EueoljC__Uw0kn@~N|@j-EPq>fGV1lgAFH9Xxh8>)f$ZhqI0y z&N_7F$cY2z&8Ft2=BDPRrlw{Q0skMa@0rL9B8xK-3q@3ZTxHRHa53$tFOJ!Rx`FsV|z&bdwJ0LF&_ErUOR4p>FE3$pSN@x{?&o_ zV0*3W^=4QO75`r2S};fUqn4JImS}KTdHt)-(*MyjXX@MT0s_|6Ui@y0;}N=DG(E?6 zoB9B+Z2N|#^LhtF%W=S3$8X#g*L2u?&cir$yS3{u+Fk274X#GA|Hh?8A{v@BF6XOx zuFijRwU2A-3yl(C{(mlNX0lqHLE?X|-s$bO9bL4{w%&2N7*n>lEvTi#^PCMVA&kq_ zJH3YE5v(}i{Wjij+}^j{+HTv5$K5>7TkmgVUtVGS&TFzSuP}b^IG%rX>00;d(zV{z zrE7g_r)g_FovQ`odMqNmKCT5jhf~TM!f*v$ERi zf&sl>+I!>J9YI%@7xw#|skPVMxAmR(9pi1kU_l(0dy{k1O-TM+4Kp#}n%CD#O5MVY z?|Xf>*LV8ccCYW`5rqFTh)57yy-m++J8HK}Z|_=1^VYjf+kpC)4(s|G8a-bT@er$r zRSqMmd#z*Vah5JhnEOA}oqQ&SRO*}7(~>M2G2DKA)B0`y04x4`ZW=cI&o`Yl{2xkV zIdu6$ibF6kSUwvbhA4M?y}`F$=ie_K*1vREzmDl|S9{gRwLCaM9xRi=Xrg4s{0|i^ z#emvV%t7T1YB``aLy%&@odC7QEdWVG_kZBZ>J1bq;AQpl3W|PidFkhnmwq** zflGjmq$j^ZC;@74L(Fqyx^i&-|8EV+!6Ru3dB#Ly#2M4HQc~$kA0Y%TCFdqE7L-7xpTL*;sqj)ic`x-t_fkJ>OGX2VI@!FmbIMCQiM+J4#!EX{ytH$~ zOFI!?+R1%sC-$YC){n~H#_#v*!0*{yt#=xn{T9jimT@hJyZE^(<63`HxhLFGKUck* zvKR8_s@LuRyP1#U`8D@?3$NWK!OCys3X=WLRl)zO)yo#f{LfX{f(r}VabC+7x;}7o zuF7`fT;+a*EL0Ek4?)FIh-kuu)!gAjWwl~mx2MVoKV153pE1q z{i$M-wy9GsqTv79(9sNpflH36#0~i`&IK4;lW|8{`oulT-woqTCKS{>Nn_)CV=KTO zlL;}Z9g84Pf!feP*)YO;S>=}Zq`7y9;>DdA$UtpPplQ^HILVTh9glbHtSMqdx@dyt zZDG$$Rypa@!D&x?9+QUF4$Kw)kaO{dmBq-G!p^kO8(l*$H6=I$PU?e8(9o1&k1P^u zM-yial>sVBpoJv?I&S>|nZl;dW(>+6X3q!84AX5zW|xMWGe38D(2NI~KIfuo?DX77 z;IiVx9H=!MlC*ro#OY!rXcyM<=hz-tU3cDz)>B-tl037BLSof5|2X~YIL3e_-z`Q&B{nr8YTH` zFqJK8iE|W1YD+DN0|6w$%P=7a!xQsVuzloWZgAS;f*yH^j=U(ZOEb0)Cd7_PZp_21!4?LOPft> zAJZ*>*POW~?-ZWf?GHR|dhyhDHWVV%Cslz*m!`X5j{j6;6)$!M1VHGzY1J{n2?-7S>{g z)}&%edVr-z$`BHBuyo>JH08(yrk(`q$k@DGgGP!Rha*Qka!pzE1kyQ(n?e}B+(}L; zHPo)S1~94s=RQ%!0VQ8Jea@;k4z`Oso>A%ahS){?Y_aQ~GMz zE?|0KqD7E0sI#QME>W64#E7Y~6e4J&wP%YPK!#7&I%u$R4M1_GnxruEz#@y%89Yx# z+B7{wWVYbp#oz}SDHT*BkX+EY(7aD{4R;(vJfV^A&OCkyxY()p1fAgYF1Se#NA z$4Eg3DqW25jF?ITVgm#X>ROr{HL7gdtYImaL}UXw1OVDdn3IeIb0)=-k^p~KzEd%d z><_97klxa!_JFgMMY4+%l6YdJF-!v>?en+!=tpPCbj5Rtybbfhv?ZOhXK0j3K#W&* z{ANlSDj+3*+@T#CrxG@0B%rB*Lyls^g6_XR`68PEskA*!`m&JrLnJ zQ6)$q02besILsAxQ_&HU%&ArGRRW|zfDB;}Y7K5&nQDqU;e=}EN|lRNSL})rvdp9> zBP|o6bh!kG;9L-0fHg8@a`_{Q*f`U&M~1b@A6z(_T1@rAvaY~^qw@@w3>Ya$601>~ zlGj~=AK238OkG(OR9}!0XdYpe!x|Ctq>!;+PEIiT46S7uxX=*&LwlS?NlN3SVoXNV z^)U=84Qv7=3<^*k37mf_1j6v)CQ*jVaCT~e;EVz;#4jvl6L8EsSu!ZG9a-byi3>em zD~}205{m$%Y&`iwCQzT%o0*!)HHSLoQ`D9nN-vxuiMEhGHfyZ0QjkeGNKHzAG&oFQ zk^~NjMJYKFOm9gdvo6Afxsqs^L&?((8{jdED54(0;I1w`BDo}`fsduyj<-D&Sxv4k ztu&DGW0zRbz=%hQsPGD;uSqFVs**{|D`g)h3$H#dNMYkHk&yh6NkdCR$#a^gpo@$- zQ;vIE)dh|1n?*f&M}}B1NSk1RktCc>f$;HXd85Uc?2_jaqy~Q?z=feR|!gcB8Zrs}FGaE@;bs3C-YN?mdw|4ho66{heA zaiSpkwu6EmAFeb^Z!$Bb;8}BPtjcj?OHqPI6`C6N5E3uiS7bf{v?M#PHFjn^RPYHzRltjc17T3pHx{OV&g4A# zWD(}%;si=00Pk|4WX%lkpmRh~0!IHx2WC?ye^Rv2~-K*CE= zR0Qfwk`o+8{JA0@1SO z>YdtnHP(>Km4xZ?gaF^1U#WwFB9M)Jl00yv>A?3P!%IbT$iV}%GQdoYZB!4A|0lsC zoN9hEE?|JPgQBqeSE^%$&x>K42|$WxL;Kmk6p_h2vZR>JR*@HtO8);zkC+N(BR0|r zR)ivwe|{K1P2KR(g4e*W@&Bi^SazoP;dt^Ri5^6p7lN9km7U#Y~2!PA}tmjS*X4lSb!P<~A$==f zF|dywn2a(~ld<0);*lXmV98Y3K?u zEps9BvqO;PS<_>lBVPc*l90&Kx)M@cgc7Tb%gBJ7w}h^!f!mWIiPKATj!X)u%*i!% z?3{v3i6cv#O~}NeFpG-f4WyF{+w)M_s5E8F05gM>pq>O_PfVy#DR#wZa|X3&!)>YY zI{!~`ssCR}+2Q}0mcINyRfi1!vW5R=3i1C{Xa7k{Kb}fV={i0MFrhOptb>ah(mXU= zc_L8K(GrBgjG!D&vP>=`B&Js4GQ@-)0RnWcR;Z|$)Sy!Jgf_+bBZZhZ ze2(PMA(%x>K@^y}I~fj<3C@w26lEgif>QQ!8x;_F0t<+-g(0y{5Kc>4m=T%C-ofx@ zkBSGi@Mct&;nCZ7Nf0PDkC8eS^VTH!IicXu4S4R`MGi#>sYoDB4ZMcDz%Dg%3A&7g zV}Q*R3dG@5ASBYaPush(bv$#KvePIuOhH9VI4b+ ztV}m0V8tb|(gf}d%L+xiE=ZERzLI#slNzJr8hR3bX#i_7L*%Mq8BkjzB%`qMNr4Pg zxy!UWJl!TU9M;ev(Rp)O)hJ!s9;asCn#Z8y`5Jql-L?fgxiL z3!Qd9Ua18=x3nZxIRVjC|jVkJMa)|r(7;9bd}nM4RuMo;1y4D9$Qh5_@Y2?ZDu z8ziZxDpe4Ofr&n7`63a+FoID!;ee3=nthumtsiAeUlVt-`X^I!qbB2=^G$NQp z-DXxF^upfw%%F@9#5gWcI^af3g&xdDN-G955Us^AI^9)L`rw&RX6}e1{pM6b0~D4W zMUHfF5vYNn#h8(T5vwF8MPICkQ#O?&hmJw=5Hd}3NDKu|;h-YcrovuOg*0$bS97Xl zXfr^MT7^hCQH-pxOyXN){3c!{fs67g(z!I{qY3YnB1hzoW{eu2GatPiPE!(nzAi6= z)ZmcCu!ooy9fc}7dmyx+WE7FvWQu7+nC4{C!>8%QO_VX}o-Zx05i-W)J3?q6jTbm5 zDdOaa*_<^FRa}0AP;MqNdtiao1Gp=2Fd4qsV&|Oz_OqjVUn7$DAK z=Eqc%4_vZjWiGU7!RO1QCknkK7W>(s7KA3(p`SG$DiBUe%arVPCN}1u3P~6h?3t37 zGIGL!B2EXs>KHf34jvkGmJ-bQa0cw_2$gJ55CbwbJx@Y-Y@!GhsE#DmfaW2JcSp)k zjFl0@KoG3T6hPr70vxK65&(LL5C{YUdHbK%yNlF}7G~p`ym#q+q_Av!>Hg;}EEinOFpvY1bxqbA{rYG21|U z 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

I_ zi|8?ezMIg~ZYI%-FOXylbucs>;1b&!aE+eElB*hR)ulDl=9Q0YzztZ9DTF#WsFBP# zQpM&yOU*jg1?5aG=n3v#^Feq{maOc4SZo4jwrQ-XL>I1=bVwdCo~Ue$I5X zjA60x5O`USSQo(5+Y;{ZQ#Jg1L|^H&44e68h?mHYseDGepk8KfBnywsJd2}A&#A=NqRim+KY%9gTm@3>GiC5`gp}EMb zgb0Z$WF?-^y8nhFbBEC^(rGqTmM3oVpK0aUbEZ2a&Vzz|qGF$c$DJgg_XxLYr5d>rB@%M)XhW>z% zuC+lj=Fe6dwTs2^rqMxfDDTH8w!sSYC{`R&$th?oQ`oVa~uKTyGa2FSo}q^o}3 z$X=;h3i+;2@bGozX7uGta}$^FD+YsJ!6A~u-UIoB1`2@ZkgS0;$f9bqUFq4lp`x7U zjIb8Q3?u8Zf^##dV&+_Qh{43sM|Xh`hYf�K34zt_8CIF9z=a`O$3Yl*P7p5adAc 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

#3*2{@il$`A_VEYgsfMM=7WO*9{6#I%O=a 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

  • >K}ondB))15!4&_i}9Q-{Ffq#YKmK*_DD0)8>7cX%q2M-=O z?!(ddLhYh4__V|DDn7w%$x~7&P+V|!ZjpIuUraG=!~#0ObHtyxbh-4`t*>LTURW(K zpRSrAJDtB+hyj~&uM|3mN_=GoO@^nyw@r|8r$Cm!rI2tAIpdZ3DUGu&tKG34D+l)S z6#pDKf!!o;$Uu+fO~5pZXGN*Hbx9dFjhoO?_~^x|-hcL=EnU)JVM?jfD2>Ah$E8oI zZ;uZbDKCX@H+PR2grY8m846t$mi>ijGtCjYFbYxJ0cwI{JrNj62jbMlq4{M(DBoKh z+NGNe)n?~jp6nw6xOk~kxp8g5EnzGiz9*3|x=N^prHC&~q)j^aX76t#XGxWYG@@a^ zEh0o|F?_%a;xL_bOecy+guLu*{9{&nNJgiX{!IO@7*v_x|I-&2b}Pvb&9_Mt8pcDf znwK9_;328-G~tq2AnV&qn%Yl^G`s_e6GG>+nHT^dCq;==A2?ZWCczP-fV4}=JzxVx zo=U__59_T3Gu-*OqKLD}v4`@&AUtqy`#DMCjDas|TMfsv0$L%f%+^d_fcHRnm{PKA zX*$KeIvB#yuQe!YiSU6fWRj%{7MG}N@%ij8m94 ag$N02q4}iF2G@onCNzxqHRo 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

    V?W3+S>c7t2jg^ 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�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 z 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⪙qF{L8I6Z;8o$<;1Yf4O(+9BXh1L& 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�|M&NZt&lyH-v&`>1WzS$lSK2fk+Mh zW6dMctu2-M?2Jrda<(RT@g z9qSoO=hEu{e2y>6S3P&@BlWW9^UifLeUc+nop-30o6pONOArLXx#ht; zlCWtLE?mGZT(oH60%i-$4W2GhEOhCLrb|?u7N{H4B23zZ3zu`*qGdPH!ez>(B@d*) z^EApFX_GyvwBGt0=kj;{9G6wI{!@cKKbFp+b#&Gv-deLXr$=#%KM!hM z>UqT!LuAi2e0d8b!55C}WdfD?6jFd4b&}iqE?>Fz+;8}U>Hux`(J^Q=NV^Q`m zZ94pWEfLe)m4ZJGID7ng6Bs!NaChWEF-FYS3N z<)FS~&ExQ&9=8qDBgS9&P87qBKOqkD>p8i4MBi~Tree)+Zu2mYu^qNrdT#ro_)|uY zNZJ1WI``#QUbTR~k9dCp^ z@|A5+NR9;a1?HCesOF&_W4q=rAamES^cdT$gL(W0<%KHP`sy-|s!NZEbs_rcaVqWa zuD9}NcWY@&DrGo%Vk!3oJvP_b}ieZo>_(}g+5?Qf#ja{3lBO=P=S+D5^;it zl+DSR1nru$mOH^;YpLEI@IycQz0v@~VyF4Y}Y~%LEO>cwgp>A{Rl(F=w-?)so z?VC45JDonY{YDxjx^1Y~Q3)hwV^jZ8(Wb6!FcRJP04!ihkH3|{Z4^k#7Z@;x12ZTQ zqur^`d*3wfsyyO%r%7dw=0X&e$JDvhy|YwDJ(co4@lkpVL+%cMo#%4vF~mCLH2x0v zBA7-}VfZ{6$xhOUP%$Gy#S!1d(HxaW)KwY;E*PcfS(n}rnseHS<|=Iz9(B4=G&lFc zcc-Jmo0_+d(qoQ|&3tRtd{y&R&1$Ytd6l}y)t$OmvwCZF)O?E5W9vwDuTVHEjq?`H zQ5i>HQXr3O<@t$1P1I4T^EAOB5bm!}Bkn03204wW&ArBm`)i*5ItAhW`YWf7vGbkdPEQxXu5%ro6ryxkMEuT;h~Lpksubz`f+yLz zkqa(f)Jb%Hfj&%!Q=dmX4@}DnGs1J&VLFMZd9)mg4RIdN#T(%fZv=yTGbugNox18g zS%hT_P)F$y^&;^+FT&ukFhuDh-sj9yMyr|6T+BSjAj48KGhcBz42!_db0e@D`P3uc zH0M-$q+9h>nEHI^9d+)o9Hw}3n1bohI|e-Bd2R#)4Z9e^p69txQRfTvD{MRUrl!CZU%Zr_*=`>1^E??zg?Yc8 zCW1PB=9!~%cP@`ucb^{7%sfd>Cx>&+IVTAl^_g|@PEK7%hh9qW=+M()k)7+jXy-cj zuA`Hxc)CdEJl=JlX!pMjsiZwXfYPDLe z*K5=M>2VTi>G5bg_kA{CsCaW1h>!Ca)?tx+oEPQe=%gz6Nm=6@>!KXj6qC}*6UdEP+}$m>(z77;4W@LnE~ z>{dN|>q7KKPbXBgVV+O&gz^geKE+Vc-bQ;s1%7G!BNWJ`jlj45or_V~;Oo;1LrKM@ z)?MFAw>a9pUS4=t&U3p$*e+c}#n099vbk0(Bf-(K!azOBF)@xC(Dj_}{5f>}*EvoOUB`Kj=N!5; zkRv0&GtbvKx8Uuk6{a2iQ(-Ql3UlSFKBeT)HQKtKg(}STocvQ^uIDVP>p0o<$Ka~*is!w2krS!XPuOz!`5^%aUL7O(LYCYz&WnJ z^Q0<8`F~QCBAn+ZRVmUr&U189m7<*Q=p-T)W}oxxq$)*!j!r_Nvrf`ULKSAOqoD9+cWt?5MJ=gOQ;xalU7<%F|&I0 z6bEzHurvr?20y(HBo#HUgIf3WIvDBav$|V)OtQgy*E}F}gH!9#J5t@?s9*O^y&!bIUh_*! zOP@jDf|2U3_fC&9(%cov?)nYz>pV{iI0Q0xrj6{U4uf#d&OOs3YTGOu+0&qCej1uQ zzgoqz&usOYQ;$dly6F?#Y0k;X1-{Kt7<0AQ~$CEt#2NXxm#ZuA<^B^7nqyAW^O8kI}Hs-vub)nv`h+7%E^xN zfKaV^mRX-U`znuiuikk<<})1v6>KfYFTrYHnQhlV>QiD z7pfKSnViaF5|KyLiGVaWcOe>twK@IML&f_dFyK*Yp|^;K3EqCPQ*M6BQ*fT$e8bW6 z3WZ%NRJ^~*lZQNmSc1pzyTA88T4eAj%S^inlNT)CPlsXW^~)xrIl9IXI^K{sW$#ZWk*q3gL+nD zZSMBWrAMTixz}bWx@~mJKIqw+Hp=v;7R|V|u6pk4ebrWn0$D9rKV>+n)1`VgmuXq5 zrcOMRRH^ck3YJ5x*Su%foMYuz*mxAQ=ZB!4Xh-QVwrd{0E6ugj^6Ju?HMVC)x_hN- z3sVQ`7j>bk%9e^V-}2b)8Wxb#YxJbaJ0W&ATK7JPisEA`UWcXu^WSl?h-ef~k!sVY(2pDbX=R7Eb(7Miwnv3P1!BTZ~x( zMwz87P!N^6pwh%-Nrf*Y8BM$((}Ei`^bp6!0SSNr2{TYo

    ;7-~|#F8dI9kVJl&#Am+;qS9l5I3?G<)ApsZ`C~4vZYm^`b zOs=RP1{7f0c(TL{Ff5%Q!y6?a6T_xNkL#8cv;g783Mq_8s;fFXp zI75sISQsIN7*WVAvKYa{#8MGiumML3Ff+b5Ar3G&{15^pMx3xj3KB0+(SjE2(19jg z#1M1E2;v~32^U&$1xgEO5TU)nqzf=(9AUx`A7EmsD2k;oWKQ5i5^88}bfCr?J2c?| zixn|cslo;=O27fd13j>S2_@qQGNSPEffJbA@PZZ8Op1{ocIK?FXOu)_*qh*HA|TCC8;5G|kXH6T+l%K@K#SP=*dF$btzkLtwGuM2aRLKw%6Mu!$^JWPk#S z7C=-XLq-)R@Ii?RXh5JT%MB!GLW>q==mG@?Xy8Hx7C1mfJ7b9uLo9h<1u1bTK_h0w z7(;X*3lBboAPCJ2dR()}Sg?Z=HF&@a7PLU=3?0fe`C`l!CU`)>1x?HW$Oyv*B2rKS z1{t&vEhymxhZ87KL#={I6%v@Bh$@N@qYD+B01g$f6cL3JCc6cOCsX`z0t%*hA*06_ zD7ayzj2^mZp_P$>ZG#?DrX4j{AjSnVfZ!sGp&B?;pw#q4lMcs6J*e!f)qQdyb!|{R|N6J7j29s^c$UGqM)7Z&9rT! zVmL23FfqjoMNol5%!VsYXfXi@V5nk>CI$nL0Mh{<$Q%(z30h!?;bjR6NuWVP7_k|a z!U$r^5Mh$Q;>VH|O+e9sEK*)R!4`n5Zasrp2vC)VW%Rignbv zZ-v35+yYc}vI<;{WVh9LOf5qM9xL!Ti{P;Wk3DYA@`(4gZ6KwN>|<;?(b$8jRAKT- z-c^qi%4tq8##zLc6UtP2B5z+mjq1l9TYk&qxADj{@B+^lzL=5e7!g{WP@|0~D9Dfo z7f_hc!;~mm_+f=FT$pI%X3;x-`~-C?nxA``m?+XW%ObiDaOsK*EEJLsm zW$5yNMh|S55l0a;XerpEWNK=XUC~0*lTEoTo0>}4mUaZulmuf39l)4^0vW{MG6cmJ zFQi}!6MVUXf`$SuN>ExnfV&+(epCR4h$Eo1Kt&8=Tp6NDVu&yUN(sV*V2Di3mQ74x zn3!Oo-zXPcuopN`=*n~_EmQ1Z0xiUFfyGeF2PS25*nkWx*uskDC5)Da_9iAS9nO|b zOg(JWmQ74I0C8{Db(D$-tn!|9&N=5%rq|kQtKR4rcC*z!=Tx^^aj0~w-@QL=bG5Q| zZrY^T_iY=s)Y7~!t*iP;TV+jApqgdfuKFnNt3NTmSlM%)j-f(-eB6NPXBR0@oX{oP z)=Iy?)rfoVq?B%ESZl47bBuefwHE1Sk#o{|TIxM^ekKdZR(uYp;~Q_u6~yX&c$2 zm0eLG?X}n1yL~GPlv$fe?cVHO`qVe1r5b!8rL|FT8wHZ`r@~}~$?w~?KZpKc=Q*K0 zd5Dlm*`C(sv({#NdcgsY3`apnK}y^9Afst$Ah{BxYer_Pwbt70ZriP`HOsOr+vt|r ztUjA%_SyAHSD@QS*UG(FmSwkYT^iSFnYEjy)$Cc8-BrzD(=ZjO#@`W}67bkrtB*uF zLnc4oTTg(JfEmUZqt;ocUTN0aSbIOK)lAd0Yj>7AyREf#d!bs3bS=`QVq_Vf^xmvy zRd@Gh*{!$Unq^sbE1;^sTjZ8Btlhe8SKaxj0grZ5AWbuuRr+Jw z4TQt`o4vDzXr_S&5VjHlgEMNsbso~(-E2erM<<=yY9F_c_hY@LY2vnRudunbd+(QJ z8LqHe>&DsB>Gq_XtUR&-d?aowPBX5&^0aA}+SO+Cw))lX)qbz09qrXFBfHtvCp>m5 z3RG>awPrIL!%zBLy@b1V3het8&b~<=+qG(?t%8p}Yv~qrMdzJ&;?)Z2?z+0S0;`R5 zrKVe4O}o0@E3fJNZ6x1Ov1a)w<9xI1-s~uETT$RX_K+*Q(le==5udTQ7Eqe@nUvRQ zp9Sn}QJ>qkX_^Nm;Q1~onyrA7I#O=g#~wjac6KFhdi?%2<@AWROiMA#vTIV?w4B+k zHs_p~%`WwXXnWJ1X+OC~q+$^@P*kfjW>V8XRJ%VW)-6Y}7ezRF8MnVGz7g$J=f#(;%o7IB>PHYJI^SrC~Id5(f=|u@@<& ztiSV%)lS=Mt8(pYoiq1lS!So!-AlD0>eALj0I28F<#8%Y3G+G*H94E_t+h5sU~4&b z(o$;m&y4C;FK>OlrB~CmtV(8WwV7P9Cd}<-8L-;9YPYLxBiveb(0~gPND@4vYO4=5 ze$QDuFC{^hA?&O&QR_V=!3L>w)@p05O*GKDU2Pko+7kw>wQ|$;YGBvfBul~IG>It> zB~|D(yS=8(&RIGmv#Wu7uidgNx4rgm84#Ljt=iK{DYZ7qR&8coV0u42ArcJrsmZQJ zvpTZ((`eVv?EZe%OB@2GvYqDbboqPow0Eyb`()3h?%e??PrCy;jRbYtG);tt$w7t| z*4P2qvPq1V&CPI}cA7PAyF9nOZWpRswslAdA)GWlULuY1NOT-w%hS(~vDj%+DtCrO z>hq7#|C=74!}(w5xRGB!KL@8oa;VRY(wnRKPEE~|baq~&i+FfYC>}aHuW6mrTQmv}%0_B2X!L1@{WoJ(NYq{WjxQ`oX8 z3np4zv2WNMmvz&_dW>xxdMQumJKEDbI%(%Tv7z~`^4QU#N=Jt(9UZEY$O=p8QI4TX zr2udpEq%TN!jkx&-`nc}L7gj-yC;Y9u*)Ga@4$2t*ma)d9;TCUh26)7c62z4#P585 zXXh6@N#`PxV>#plN9x_DgyB5Vyb%n}a~_=(^Ym!*P7YBzIYb?W(nUMx(Mdhuc@hAw z^VpE|j9l;#l|<*T$A*mX+~+Lt&t+%*!DF zpg#Txfdl2~WI5ywolZPW@Z6_&T7cOPI6}qC`U~f%8=B|bCcI7Rs8m*+jzT?za*s5^ zQ3xv3Q>lA7pK+*U%+}P2mSjqzfdB&l0;3cFFdz^Lhl7IAa4d}DRGWJg01b?yMrKNw z%CjWLK@fzDF$5R@03ZYa01TLsp`jH3Er0F0>Bgh0GSan>cq&5e(naQUZfQL9$q0R9 zbcU%ITNh<*ytYO`@Hj?M0dPIO%~>wuLx z@+w{b1K{kDjvUqvy3pHp(2vJ~_j=uRs6!2r;*1?#bVBpzBI8z$$B%$V_!nBT&rvMG z;rC~)o0Aur-|mfY`p#;5$V*VX0JBJ2FG2k_oK{fN$wy+8-e1|yY~~FJ*_JL}-TX#; z&7x46Z41fv#al;ba3FVA?s>Ybk7;lO-RNmIE+{h6_Y$@e z*tcOYz?7fc#vfVEyhsSct(9gU>y9`AjqgeBHe@4;0F%q05~RIf;Ou)kpA(dyY064t>a(qb+Xo){Srf}^E)1W);? z*!tjFBQFmVDV0d;lWIeHxca}+U451CLV6EZ?w#X`H`L-EuqS6}b%bPnTcu0#!i*zU z#oa=>J0R6M*+vtky`$;`ImUYrzNr@8wtLX-4C9O};tw}T?lQ2LV> zzmwig$pPOpTT(1xJJ2nH?Oo2&34b(&Ts8XOq=DxC; zQ~4A-3+br9rwB2nS6vXKVJO`48z*zrdQSZD%6GrHl8xMgW8GIgm@ZnXg^R^rIU0_G zLza;4cc5uqOiLg^+2y9YloLL{+pWM}mc4C!bk-q|q&@m6;MJph8eRa)&ocwYP_h!JgRGb&dyJ>w)avevk?OCUy__Tu|#vMWIBdPwoZR$hFNk)~i#&Tbo z^#SnYw}QEh)E2`teC$jf{C@W!L-+358X*L#BZj;!UQW{IJ=H+Zib7s(! z2J`Nxw0ISvCRIcPT{k`+p!wc!hD>nDOe=fGS)57o4I7L`*C+2J?k zYY55wN(p+W{?p*djU+j;OZ|U&E!pM#8ztj20FSF}sUw;}iHyC~nwfmuT#YU&e;=Sh z)>w9mk;)>Z(RU|+mLMG2d{ zS&cM3>PHxj@@W2m4;*=HtlHzBInglZBBm%zyqAPfg%@mjv9MjK@J?0M^|0%wr8-1G^?43?4gk-Pt))4Y!nrhRWxndb~iDFXw*ZVkT%qPMn z(xjXbfiw~+lE=5cN;_~eLq*?^$vW+`k!fEda|Udq`2PVnEDlkZNj}cg+x{g@rv0?@ zMMBT?eyCxqAH%LMDma)m=!bvROd0P+SSt5G{drKTt7Wyw$#Us2N^oD^|6dw95X|fNVheg$?W?lxDUe_jIaDS|2l6{py z#;eo2RRv-h-VkT->;WGf1S}ED4^F&#+v+Y8ANO$%_dHeduwg982dzTd8#4SwS5aR9Q_9 z;`oY)f+UgqU(Q}?7JcuoaY|v7ds=zL#Bo*+a(F^JTAEwqZ66OYhvj+-L{d!t53T|- zVTl>HE6(`>A0hy0OSo2OAaYf97rzu7})Uzx#>n zO0OV~smH1sZF%N4R0Z&_;_b*+J`J8ESU-5x`ffOPe7KS=mQRT(qh^F`3eM@pH1>%R zvIl?my^Fgq1SD&e3L#~3o}1i!g!eLJ&v63ob;PD+^d*7FfOs(L)(JoqYY|7ktzlV)EBId%Z)wfa^D5_j~pq0DGZ+LXibX>t7mA#D#M| z1OO^b!0sUlux^zYqPje;m;c+7QA37IXh@p$WfhniB7~IZ(eR1oe>o8U&gvQ&4E$N=hyeCed3bU&m&Nn6_PWA4CI-k@f8(EG@OpFs`9Kfo<)LVJX< zlRm3KiCeB_+IX%;|R!9mQQm%B;*(oywm zcCm*KC4g&IzCIPIVK}U%ltTmv;BBXXnY<1q9%3^uIA~_Q`RlLyts#p5>*rV}k)mL( zQtu0`>sQTL41HWefe*c; zT}smLb|p|i=kkP-*_g8@4{kKGubn3Ri2iwG=Sz|y42ZDQ|> zK#B(A<Nrp&tpY4&2bCjz}of?cB_k_!Sw zCcUvHJ>KFaGVcS$@(&0lK!sLg3c`IB3d6ylK#f_}(9tK?@B)%m)ODHRS9fAJ`Culo)&Z$C*7@GF-5>RK4Eny z<9FLbhJn^-vDpr{o^KFC;|4Sghp$1o%!1?((O7OAHhI)pX(@fSs?1EI(4^oj^?=B< zHY&tm6$(Fg)+peNPX*)SKbU%@X^xNMwgVwUolXQdX#O#_Dp%%I`OGVr zYar0YrCU&ZrQ8Eys~jDePH=A}5J7mO0+N70E|T%si*qyiyE0b3_?SZ#$5P?UyuU0@ z%RPi`Eqvs)K+N)ni#8tZVgDPP&}&dj0l=LG;NUv2<8hgFzUU)QHAaH|CQ~Rk+s$G@ zSJ%DsJ$Q*urZU702qc2R9ag z`?b6yu4G_6-b`n*X8b9Gg6vAasO;62xkNCwP`9nU!Us8)jh!FB4A%ES?)aU-$*Jd% zVkI&0uT2X^RDR@eFqNnYUX}pVAmEE`<3~{5IvzO=_W)J+uZV?4H6dPcsW$07x@HF$ z%2a@Sfs~}n0To!BUDbrq8UQ;(bzx z$F!6q3Sy<0-@`nqJLW+HWU!!1>f+UiYFVL@Q~x^@EzKYf{Un?dZcl8E#C@Qveg(l) zk2E)yYM@c|A6v)9*o*9dBL~^Z_V1O(e#E+(E5Z6qb^g`M0iV)I{$1H!kg(V8U!Mhx z|1kBpIDKH(lu!@W(YbS0^;HRCOje-(VyIl(1Ts* z0j?hy$S0s@v9;$zTtjgofN2{6Q7n59&F*JyA@_e~6D2o`(nvk|YBB5)SD61gn}9Z? z^CmS%x3JH=52^E&BLiWAIm&?*u&us^Zk=eY)dfN&6=lSwjjCfD%fWoy9MMlsMGjw> zKeKZ>OYyeZ#;ln*4zQ>IVSHVQ0ZiC;elDU8PsCXLg!-tHa>8sQ`ywsBf08256yY*- zPb#gJSi;n~G~!Z|xAuNNW=frqbc6(pzM8(<1YN8M;$;mjthIG0^+~H?tg3uQEl^t6L%THHp} z*|Moum&e^F)@x!wv{ot?-72~Fn%M5G+ipr8H)z%o9(^{0>{~Mvd=iNF&rlxFmU-u7 z6E_uR{QmiTbg0h{WSTE~bp!qoTm?W^;{6uIZy>9zzl4XP^m=<1eTSpBdi7Vh( zMg_+u_mW4jVOyU;v1l2JQ9KGP-nt7)#McyQQZtG&*IFmujp8bLhqn$vX9fp=SwEma!$N4fP%cdQ)>FfLqrtu2zZ32{OX|yW#Ng-Hl1m9%HC-|zlb&OM-dm)%tw$6I*tRkmubSCT(&c(X38xS z@j?%5pWG!JW=25}u|b3i2R&_xOt%cK*}laCQ0q#htAdDaAKT*AM zphTs7C!I|<=n|5osXHyg8ZMLs{T@2P?3eyY->Z2=ZuQOXy7)}7+ zM3q3|B{1fECY&uBR&ckbIzBY~tqG8Lo`YS4Ye6Z~UZ0K`U7d8Q3fOroAX4MXn}T|E z-8gao!ad`D*ue9b&NauvTCKz-Lm(wy4 zC9feA;_DeeoMX#ZwW29{zBv*jn#$01&{Z&?l3SdltlKi5aZQCBb-v}V37%lxn0U*( zV|Gx@?M<(eJQgJ3KVtdQHFzt0S>3V259L(A-|-jQaUeh^hynpO1%us0I~`Kv`3DGe zrUiKxkT(B#qc~X_PGrH-IujeR{+*Y`sf7c&5^cw?09qIo83GIyNSC5|6ZWfnqdi3; zsfUT1yvt)JFyaux)3p`VixAxbAOWO`@?JpmfC~$TWK(2iuHWZMaQg_c@mAEfAMPnP;g{OK`NkK7T>7lemsn=JPV2pwg@hIbuB1&Z`Rc>D@zRmuRuuwOyE=8ivA=9+y^&kAbEOG2 zb!C-p#i_MAJ_#g~CEM*+eAO$P?(j1-qR0cK+~`mVTS#lIk*MwT>6Z6_?-`kY#^a4* z-j~*~b-_1z!W+?qwSdX{MG;_C;rBhcZ&B6wJRoW{7mmz(*bJHhFad)syQDZ5gfMSxEjx`v_QMx#R(Inig78 zeNoKU$_~scovnyBl{C_!oVY+<^dFGfy>gdF`4icNG)o<*wxJ-p+mP2ZpH-Va`Ca%A zWX4)}ijVinGdxlY!{cbl;|c|xe25~4C$?)%)Bo^W=j4&0M3*UQj2+Hy09luGg_AcF zoYUWFc;IRguC>SU;yC%h zBFsZ(MK*hO^3?PCQOnXiN@Rnx)OULFGY_>UsH3R0RmR6Ck8FFf%X)~E==v>qbMm1! zWy1ht+zer-r`L(;EkqO&{6Mukq)xh=-)U2N;*M?46eQXk%jxN!3@O|_*nFS?vSBHo zVV|({p%N-m#WYW9!@fo>f^VY_?D`Sd3CYEy!Ce^wvlf`zPxwx`6Z?i%>87zn^z;nxaXVuh(8EX9sBh* z8^6Gi(x8Z#Jq)KmlCib9QuGko$M>%6Eq%(Rizlori0HJNvQpr@zvEdN3P>VWWhc!?lseU{j-9BQuGJ#s zy3^2O16^R4fo-4!T?w3X{MRYLiah{*AqK_r_snc`?)Roe6yc0v8f;djxgjKDObZPBz4A!4=XI~)kq7+YCPIsKD<;}Uj~f!LHlixI z4G6YdoTEeCkVV1$4R7rzM|q2JF8;C_kYn*|ia7@@26ci%RvqH@7z#w1GE+EUT*L6I zgG_%nV*tHsD+Z9S5}1zjIOgyhE&)JQY`7AT9#p$&$V`5i;>8NlILbRg6{OF5=T?oo zLoSFO1WQ;Ok&!isIJQ!9dcc(O0E!(WFEk0NG=QRwq`}ulU zHcH90N{JhZ?z}JDO_#f_;Z~w)S+As6dmV=|>`$r|$C+#-qRW8Xy)^R760|q}Z*$e< zBD!ev0Ulf?T9dU>B!>n#FL(Q+#OLBs z0trbf6d0_?*t$`>-@uflUh^S*w$?Putqd^qt z56N?!kw8QqoQ~$OK+A_0Vm%RyRP!rTxPC8j5 zBfFF`(I5*D+UO9!fEH9ha1Ha$9z}f!so=u^rGsA=m}^}nPp*|NkvIh}nqs<9-+5>D ztJ1f4QuhTpN@l+n`p_zN8R!wVGF$>W=7vIiQnvC@oKRqhR$OnI{l7Q`tUDdUn^(hl zGfCwjhe$J}an6>jE7o&2_i$j?&}p*d7F&EMM*ZrM4q5Icvo|vD!1aL3H)1sjR*7_` zVgnIgIAX_ble=+JLF#IlpH)aY#Zom^QjAbo)ucb(w0PyPM@qt(s>C_ae9+u9LxAaW zO^~Z5NVhvKSG@u3pmgjA&vnn&rD-t%c?Z$#GBrp3r%p)3aaQL$Lwur0SdLQ5MoW=5 zB|#GHXvQ#*S$W|0tVXNkW^xZiaS`k4Y^sr_n;<>|4P=wBXuD_K!+(+MWFAb}So zbE_m!9Op>YE5zs!DgbokqZ13zLci)mo|<_D4!t9e;}mMyzN-OV-%!L=88l6i4e2XmA=B7m56V)jaF2t($_5_YtA@UB@M-S?z}M}StZa9i@n%t|)rBynMJ`fhu% zbKQw0CX6g%PSGSbHK4CdUMaIOR=B3M?XF*=J5bwO!N!kOB5ArJyZzZcBTy@_+v9|- zSmx&#NQFG1EswKZw+58)Sr-+P<*X$|6Xh5voXTPpaC18DQekFZC%$J|{gr`@y$i;2 zHhzc=UVKJ1*pB<})s%B|+?>d`{06Bc2JRGLxou((VEDr~tM3DDjk;`qgwyZ^et{*T;pq`AEknRnn!pfIXAI*D zX3)|_ifUYo$eg0)*vqbK@kK6(?MTY*vM7RZUPjAKY!|Od)~^Xxt~)i+v0!z7n>k&& z8$t8wk(WHCWiLE{{!~vv@o_&BRh}C-#a*2altOBtbcO`cgt3=opJEb}15ckb<;~`iYFUM|Z{Urj z^{9X&m_oL&Ku@@Bn7R#ClN#QCJ${iqzZ*%&o-89)b6UY+`p3x8IdZlmPMTOi6kU9v zxcinlu;RhPFIS4-eE*O7>1s0N(O^|VfQG$-z)zg~Ia>rD;d;UwZ6%~nPh?VTKubUe z+(zR3xm;G;VqPcv$Mb-I4rFfLH>$D%23le%2BCwUK^NoyTG7WJHY`nE)dDXSGiaRl zH0RAq)sN)M?kVVgA>Z#@%rExM>7PRy{*myh$=)zEx9Mgx)=36^sY#efT=R?J8S>=y zCR%bNF>;9xa_27gTEx`zLWI;R+;(2xs)N-3`jm;sys{&xk;LS4C9#Ah10)68-TgL> zu1M6DYHuO#hGohT(*?(Diq`H1jk1-TlwMoxbb8$gxOwCk#sNr{v)MOqNJ6ZP^b!R3 zPzI|7g4GG?57lSw(}ScoZt<9qbz*45dJC69CG5AZ8b;Bf>-kEL9lx=Y^_CMiIe*nr z&z0Qb6(l*x6`nEKe-Jehy`W=vsVSdAuFYEhEl%VNR1T{EsU@Pvn>R}w98ZZv7Ev8n0DCE@%O6kYf(%8wh|Q3iv|E59d>j?c z7Sb0}=S8fnB2{8#t#j(cl^uIW*NSd+2{5_zPO;?9a3(pWUvCA4 z$6CS>70jz=VPfzp!lIB^#u0<27-lzG`Kfu4Lr*fPxv5Lf4KUUN+A-qi{zvSLqMP&aM=ge2>=SoRQ2vsVL~@DwFgnCS}mM1&;_CqZmS`r^q4zzN2lUW4ny#lr&6{EGtrmH zqrko`?+d33x86O8%cGZDhA=^9R>Zx%OW6=VOCUdK34~W_f(r%vL$@C}b+JF2k7lrW zO@Fn10QOuQfrXOh)H4|2xrl4?0}6W~nh-GW*(1}#zZ}u9Z;=HJf6^ZQWLYgC^opv} zXl4KufOZfcqq0c^kfTF&v~D@;_fd17*VxK}z|+4bh7^(PMJ;Z7OQD55u0oYqIp`dh@OnCyeYz$@evBuOXPJZ78L30bWJT_m|#n+&OF>e@IYCq}V zaZt7)c)8^(#bp~DoSU8F=o;CSmzt*{bJZjcnRLcvLq^-E4}KTz`WC=x5+DGhu1Q7) zH4zGdnb;;;#$d);MzdWQzmNJ<&C15Rs>TDb_>TW~7*5tHtmjfhvf)k;;VbuC!csA}lO0@J z5kC;r|AI#Dt#^-*GA`z5gS=vZ{8FW4=&vCsq8Zpo^zvQe%q{b43{A|bn z#KXs^OO_)3(dm7_BUc<{R|_Qp3Etg^F?GBfVk?+|xu(AGWIyXoi(0_39`pgNwvnL# z9mD;o<*|X3FY1{F(n;^w1^UlxTwlb%-?b--Us>N#`tUC_WoPudJwOmWAI+@-!eUV7 zeaCjAHUI(N%L}Z<`W{0#@9%_N-IFkbcI!Shpl*4QJu7Ni+sA(9n{(K3U{|J38+($g zov261WO?|5*@E0&*%0}e(uGs4DGV-&)Z#-2e-bHEBOo#K2mHKM*vO|kRXWG0CoGDF z>oMAcpWtTFq<)|$+|NQ#9MHPZZ#{SO84wU;2vH~$@U5g3BlXmAH71gRmOORBGyAo2 z06Gm(?HR*LbM#Pp5c3X-(KB!ZvmtY61d=`!s!d`^XyPHNyCW=jn^W6MvbMR;J5XzD z1-_^woX5_JNDmSW=obY_@r5qtG_)m-`aD2FuNOXDV#zcC*3HHoYN1_18!5}Ly`pEv zM0>O#&4tXbmXV}~SYUcR4 zQv;&cYf0%XQ?qMpit8E=C+MT0o9ygIn++}g+t`Lx@jf)hkSbz~r$tXxk(P8nV2xGwOvC!H~a{R>Q z)c7e=J~ZF3w(zxzm^^#rMKVYK?l^pI?|`jo!a#u%-K6b~)8PrW6>U5ANp7^G0< zy|U2^yG<8X)>RD9Qt8K23S_U-bnlV?8|6SrV#gGDLJEYB*|N>h>OtuhOvem1VA%8m zq6cHRj)OheAz~85DHM0uLDHIs)SLfuC4;JC;QIpCmo;y8r?KM;FV7n41(0Q@&~B-# z9R(p3GZt;{n;@r(n8c|q^BOTms?++&2y0{AQT~p6h@L^zFI^7iJylf1%|E< zT85>jts>)W+_tG}0&qlZl_v*oce2uwMAOFb5@|ZGII1HPEp|Rg{@Znj$n3rk#Adca2tka|*)O=!;kA8|(IJSSo1WW=&NAVOaJIWqB)Li8p1r zC%n$P!X5bn_1RsgL*|l3cKgH_QLc#(E7^rkpls-)pKY{Hd8f^?_*Qs}wQ5GV-V8*2 z18^tJ7j10Ywr$(V#9GF0Ry|l(_8lZgGuP;1VgS>=uSWPApHVoi-J( zd1xVGGfL$_+7z*~GOZ)x1F>X60hroC``b9)W)#xol*A`$8|N~ zD2KK4DdY${e8^9?Wuigal1#(GB$rmQcpP(j-6~Jr`U21A2f>s#R*!Uvq_;9X0r^!^ z$&TReZ4N4J{*UNdp@oXDahMd!g+B{e0k7u!FtnJl!Wm3~8I|ngQB14MYwv@LJB2zDf_vT@{nutq0 z9m+ijQm#j0D+X?Pe0u`}PTN9&Hm$3>=m`$ko5<~=KE-})^Ub7JnfMFsrxMwcxt;y> zONxuL>>;|$#!K=fMeu5qU!PkHyQQp2%@fZ#KPyHO+2kV>Ie4g_}==gWLv&P*7fRnc-JN2~lBONR(%OS$pF?qnU%@DT) zy+7zRD*hJ-%>%0~G+cVILSXm@f;Znssn-JiZ7!oO4e9j$f1pyaT1nZgR{%feH6a>%)`2|Q*%^~WMy%;Zd)`~=$~_$ zE;TM|D>{>@M<_wP)&XJPP&XEcLS&xzv&%I={45K&9|#6xuG4Y#B9}%^;ZKg!FnZv4 zSUJ^Vd5c3th9MnL)sxP7hZ{O-xL`9D%5*%d`e;Zev%jV#W0LaIDAQH@#oD1W!h4OC zvHq#t!ITEyi}7f8kczAC9HO->?=GgF36qv^V4(JyN1V$h&>UMxYLu*f>TBGfHZQZQ z{a&(vYrvho>lxp)owU=v79?3I4RgPc-!Yu8;nwuV6}u^$s`oSGuJb*;R%BZf!*LwC&v{D?sHwhGNf5#xNv@V`$3 z&nmUmSb^YJTl#`cZRvLF9Z3V}8%QsZEi24zfK%*}64#v&!71#66bLG$D?Y3{4%@H7;@raTC(L8xW&P20aAspt zoGDopMD+$)jKrtRXR5oddP6zi5te;}t+Oab7++1P%Q4W?oz8F}(u8;0)=8_aN^=pe3a|BVf>vIuT$EEh+us zZBy>fXrslJ%n}#blCz1#x#Jm$%zqe%gz)=?AHWmRV%OyUIx7;QBt-{F!ttfkz>O@! z7XsvfKFcRUoBtP;O^PE7Ar^JLGlnE*?IS_l&QwK7;R4EO^{!yxvl+@c@fLUh&Yr94 zn;F`n3XXr!^_09Gy(k5VG$SIEY9}|tCTtw>=(Wr}mSp1C9pN)UO>;n+0^74#^n=5o zrsUJi!MMB$Mr%GFzGPeV@p5KM4Ly&I&OU538d)QaWgoMaKD1_v{8@tLB!bK*|KEzd zWZFj=n$J|*L*Ola4pqtD7aZ^fY&@)n!g6M>QcpXV613AJNeUH{m1pG6ath5H@ ztNvMcifb7#|03gYxdB`lUg*$a%yu66-wBJP_in-t%>R(RDy(HGz>>)1QL02dz4R<~ zct1^msfx+S02!0d*vNaSf#G3|sq4yvC`4mP`R9tTctU9^ApIihA4N4^&vX=j#JC=F zfvmRWyhw}~ZiU{Bw!E{=U|yjhC%stWyHp7&A~A?&r8YB?f!hcS6CX}&W0X{m(!-k& z*F1XFnFua_BeJEw^%$ z%YuIPl!~MC{lyZ3QU&+_y9G}ZxB`#wm#DNy^Lng2TG^YS6*Xi7eUrR~ zMe)}F%$6;5tS(#d<(TbowXpD@(t^r5owUxQ#3Y2_lgn`UbE}pGLV4pgil2CPU>7CT|%bK zSiUueNBHR&3D95gw!14rLThrA?)(vZYeU^@d!$seM$CdHg{xY~sCV{=c4#b|kWyHH z)l`&U$87@aGnE zkf)ge^xnT3nk&jiq)IP@eD%yT1lI@F)qncTqnpV1Y%0ki0ro)S@3cfcI=c>k&4Ul% z6zuEzS7%H@QeDHi>^F!e{2>7wt&9nBW3Gkhwk)D2fJc2E6464DusPl&p=0^H@ zL`!HeicXLR_Q;&ghsY378((_Cg29g7b)0`SedD@?$&=W=RHN;QYUH_;vs=>NAQX>$ zl|{e!p77ap>6g~DPGS?J+hZ1KpR^i7Iah#{h3NuTv;ud1Cmxpb9EFeyD=X|ra<8UO zo-+{BvOHusmyJ`Jp5lN$uem&A7tQ)!Df1yX)6{S;Y@@eAYmr^d(W{ z9_m#VovRh%+8YT`$U9kSK%cPLsDxik|6-JhMt>WJ$ z(5Hds$`>eo#xlzUEa4p%{u-)MFH>6&8aa!>1xl=3?6s& z3UUE`cSDaCR~PzTPRk_ZGmoaLy7ty1OFBMd&p}=M82kM_=J{4T?}^Qwn;8l+>USx7 z7t*dy2y{K1X+I~kq3;$xhv2R|mHE|&v$4CHP*kJo9 z=KJjRYKgj#xsD#Vc8!+tR$H$;k9qv;dG~vYwPtS?+Dc0#%!1f$3qg9!Rhd`PFG(^B zl#0#LwkGo!Lxx)LmCl03as0rvwp2{gK}{Ia`meQ?lp@Omsd|$3$bF0cBr!r?muT68 zB*I9etji$|#5WQf+}o@Y zvD;BvG64V(rF^`y06m^JPn%zVzfelo`mTJLC)?&kcqs@|wg3SvlLHSvb0qB>M^luA zB8I^}y2>+vjXTQoA!IO5Jv;dA>UF+(b1HkA2n-FH^9wRcEU}vXaX*uVoU=nxL1Ydm9UsL>qHVD+Q}k=~>a(>^fn}X(TNZ*7C!)~Sgnvw}z#$;s z12y#LqzGPN-Srp%(K&Y!T#(3;^s`81VY?*<1x_i2&KB7H)P;>Jhj|a7Afl8|I zmj+bTIn!*z4TuLP;n_iETH&l8Js(exWlO49m7uf;vf}J#?1zC2F6gntLidg>XY}I| z(Q7+x{;HUWj#Su`30=+~K^u6M-|G^+W`nhKiv`C5=NEUvn6ows@^C_9wm~y_cQCl` zC35J06miCvjAdl@4S&1GUI6_BsZO>ms8jN(=H17JAsO&6;-w9(0d9tg-!%J9l$&L8 z&ZltgNRr0>TnZ9u9y{ZJc@l(p2zi;@zq%wCM1Lrz%I{9S+0|~eK{uSgdo(>1u*wUJqB1WSUC&mS=s_v zg9zgMk8LH+PPc~M{8@Nrb{(eNXA{u8Z63518I(;^gyXHmjQynj*ft z-SZj>AwXD-*3$0?<@7ngv@$VBoDp$5|$EQ9U<{%^pJ)`;IZ zduHErA`-TI<1c z50vIY0(iM$NddU{P!K}$1=;9p6g;-Qdug~g@d`kKXWkLR&JLiIFsdIvVd!@suC0z) z1Ezfrp+A#Zl$ba0ZEZbH{fP*!YDqn*?e;e8&>I(Kcr%bkh=q>OUCC^sQW%*I^dS)o zH#M;BU*3d?|J_>VmTtlBK+q@_SfQ$w1w7@~JfSxiG`4x&E;_o5C{fA?FWF*P%NVS_ zeNvt3dhzmHI0xbhs%ok4Q@BcO>98RRMEvVLU}gjM-@3f`jLT&Ee&o5Y#YRp>(T36UlEcos7_qR&5 z)R?%VCwRTw(Ws4Kyf>=UQgX!QEiOYRK6^X$vCp60I-2!%<-ynmS7`{u77Nx~Jtkn-ME@|-k_rMecFSCS0W*fPmzqo01E9c;0=2q% z$|VQI0I!a<2*M`>B_X}bBHm8fX_q9~agH??Gxld2KlvbmJhaO40kDWBQ=elCbNZE; z1sqiZtuzSCzT-+5MJ)XSNl$))u-d_}Gt@HnezOnO=fPxje#Qf(}8RqfUytEJ$)QcWNU48 z*VAY`xq|K2S%Xk1qX|>migRYli*`JU+&VJ$wg2O?s<<9m?kQ$CHwIOd?U#FYpGsZp zk%X$J#FH(q<~}4!L=6<3L#J{SL`+ah($8nin<4bkrCl3?)em-wRf$W{M7O}&HH;(V zT@hpS!3!P$GiXnCmNFwML_(7OF!(vwGJ8HQ+c8G%zju(UQIZ}EZ9w`CH3vLVn5aM> zI^Q`n1+qEhHM}qEM{ZJ&UX`s+WpsbFpv;+)?MdrN4fu}wZRorQ)f^oJiM_A`&mJ7X zJWjbjv-b2A5m5-smyqrYH@`Vj^21aMz&;EzVir>{v=G^l0ygH%{Oya$5T}K@h#3~_ zs8aI8i@bovQ;FH>YbH0oVf%5#^eJEL)=98WIp#@Jj&sa-Xjeu_FUFdv%++D&AJ`CB z_6z!Cg7CgPmz1@U_0DZjo|oKy|7j*^Q%5hG_i9!eniadSFg=W!^Sl4p;{EC9v}na; zGq8UQOi>=s--arN&a$Wk^{q(2I|yPtGx>1^zJ(i{6?1~i+cQn_kRRWsR_%98=S&|M zczmrLo=}Cy$RXbExUr!NE{Y>%M}rjFx5+HjHcs$;^Lsuba;M1|oTSriFtmCA`Z?=Q z{nM*=gG8WA1bGy2b@joFii!osO^ha}xna}!inHVGh|YQRP4SAO9S91cCi7q#ZIa9? z`m$g$i!i=@`W5Ak1K$tDeaR{(M`CZegL_#NPGs8?A{xZ z$8yL2-KUkrC+2WjN16zNni_pig>sdld1O2vVN}=S_J#XqR~*OCJhZ327}OLJoPL&a zF!0q)T>{G_<&F7pv~(->oxTka3(Vpso140H9Eelt-J1KR<_8i$#k&wy3gu*(?wa&>~h=F+i%>SPEGq5J>t? z3%Mzl(jaQV?E(^s1KHbAPMr_(6Gv+vgD@7aD7l@|{a{;3+BKUIu(x`0LdeIy2HPYG zFvL;cCnJ^zV;x2kpquE}Z!z_;T}k~hrQMG{`!+od1hgsg8|2rny4QZO{jSun*eX_1 zl3UtBN^I8aTfo2Y2(_KY2OGMGqg$w}=;rY;cjuODjAY#tE9`-z!FjI?bhfI~QJ(|F zCJUmTCAyE=Ny8-*_>Rgu?AW-N@A4SU)<4)|+Qf4m#Dp(0frteem>!mRtRJ5^B+lCA zZ-&wpBG@^#7j?&URGfuUAhuWoLKj|+f|3g}xkLc9A z;0xxvG}qc!ewcE9aQv1F;jkh)$g%WW?qG71;CjsFs7v$1o_W?}DYxJd*{tOG6Jgg2;aSMswKeX3egY6=59k9RhCZ zlLYO2sS{+{gXhKzBpCj_ooD6ZNnn)J#jn)_R~bv&?>OpRE)SFiZ$5ra3egz|kB)y_ zl!gKd1o@ROo*6VXQ8c8Z&kEqNVw<)ZGJ@LKpbQaU%L(Dw6x`yu)^EW&&|N|BNICJc zII$FBl7Fp^SBlPx9NtCL*ep`@RezTu?j?U6w0b}=6X|C&jR30qp1RZ#LI7P^z5)Jf z?0eS&m_-%D&pbv=Zi>h4m=TSj9=8LjPs8L4ifs;KE@$)4%=k>mt!dTvd;J=6e>q!T zxSoo8+SwRN;G_2axxXTF^;Y;nl(wIM)=5bn$B+d2f`D-{CDk1328!4S9QZi~em^J)guD~IOOS`9aJ@Q4z!H~9 z@c;Y!$2aDou3=0R2u0t94ydK*!B6dTFKb{H`!IicE4$K{*B11M+^1{F4c^iC33P)wf9%EGN$1sf;TlK|}3uLm*ziz6sU5 z-cXWFLcF@KBscwE=sppVFty1;W)q9GGSJN|*Rty!kJcMZIJN*~Mhb$5&jI z48Ei_%#w>MaKaH{IdP}*=)DN5F@28WFe9s3WoCV>#?tU>rEB-?XRTW(jUmR5w%^#D znzsqI1|O7N;Ke%kYaVZ_?LHoK<41~7tQo5YZHe5{&A!XR?&_R_{nw)Ypli^Hq*4Ep0EVq5Xer?(WU@z3ke>F}FKd_6AP z<^!E?ay;*p79xRVFyo2_FSSr?fP1ev@IHf%&5gI|-q}-dl1fF7+ckTcGud`!Z=vU> zUS(F>?5#`Sf+LnYP`Dx2r!u_~P;JO)H4huaBWJpek;^LoTH?(!8E_v)}!P{3jVX<3UWE zmY@tYG$q;rgGbJs$MI26{usI$jcgVAh5 z3_7L6ajwCGn%}3EXAq+XY7y3~_QZC~lOPTsg6k%ex(oMJjlr$pe&?6{3QVTKxXt`;0OYVk#!usUdxLnOG0sdn^KnZ3J4a|2XmXlL8 zId^oJZ~OpLa^kmm_mH1pEmRfgnywU&C9(3+fa7De+Ycp&z3GnoBW#(3$6PFFDH}Q+ z1?4&Pn1=8`OF80j@n2o+j^Cfb*eg~R80*Mc)_2paZY+dPNd!goGhTHX$JZZvr9p*zU!=N*C5Jy{ z<{+uk*q!0K5wW`WZz~m>gOJgT`CYd|(|DcYY<+DQUZ!gJ^E3(m&wBF$HDxHtZ6k8R zk%Wvxj#`2Y@|e1~6kSt}#H`4%==34YBws#%6lZ8Iz9ypbV`Z~VxAfg`Bo$l5=mIK~%5t}x z{^TtYj+w3`Bf7q+(Q><|Y#9&(QnMz&j9E2+#+!{cVm$+5H<6#czVSd2hF+r57D1== zr{?pf7;&#E59GHlF~y>uTk<=hb!ZY3A0Np{%NESA2IOOf8S=YSy4qb_I@;#zew9w_ z8XGHi1lhIEJ--Apw?jO7@M`rS86JmI(!7f?VJ>dtdmDe87>5)p830yItDqx2s$?XY zn|BA(J!^>H#1W{nEA|dmU15jV2)JAi(&7&x{P_W0Nkd3pb}$pARR3EF9Tolt0sl5H zW8*XhNn$tl0J`$D>o0E>8hJks?~guJ>OAm!WP1qPXgse`H#@#8%dF$S|+%dJ8 z#IYdVOD=G3dJZ6$Y`BvJd65DdPxmN=zY0{?N&W9W6%w|n@pfU~a z5n4>i6;{!}+Nq|ZkjRJ>4hwm}a6}os;-h4*eBKzpI2E(Tm)^|298LI=arYqOwL-X+ zBoraxlwyK-lm(_07m{;}&$9PLQ)O->mu*>X>=sG7oU5}Uq)h*fL4`pbLsF08CKv!d zVv0&=;*YpFV^*E}`})p$b61d33%`zwtd4#A#C;SiDk^9^+vK7%1)LTpTNPN!h)757 zdcl&g9ace$kW{$SnDY-+oy3rik=3JUBho?BO`?&Mocds`cL(P*K_DF_d!hJGckhT{ zY#}gTqgaZRRtL+3g5k$w$eDPmuq5(1dV#>$HATm7*{S3p97sTY%PgNyw*OEgqWeo+WOkyK}B{W+Hk@^oqu|#k5QG#Ka>+{9nkVD{7 zBkG6IMOqDEki@Wq(5OwJjDmF!R6_7afue99Zh}ZRA-OzzA^2a2B9MhRD|VT}a7>YY zg(A4t4nc&Bip2dW#fhP+7NH|0Q`j1Up{gJi3?$Pz6xE4hdsrF;!5{9z;o${}<6G#y z_Cs=57J@OhiiF1y7y=c-a!vw~#`2uj_QEuG-hv{|8bTAu0I7uHbD$xIkcB9b!=URT z7e?ThfdxX+1u?SIMk3%+El7zz%cvBTdk)o^`fs0lJ ziXm|u?nlkjCmccWeDn@N*X{!03TFp`5vc-8;wZ^NTU}Pcxc!oBHjIjrJa+wQ%RlnL z*)B5FM~fPb`tjG36M!Ea%B4fUEd-S2WiRWOl}?T=Cer?-JnL zv*(i6ck(d#*_;E~wUG<3FR?w(8Acr~a>}L53R{1kZ+;jNIYWg)CehL7RMQq-HPS1* zE(#ZUY&^btYQG-BGKpaxZpF6_N0;t2IWWK+&V5dkF_>)5EZVzxTtO$5eN2l>AotAC zXJuR$4*)6eaqb+rXUY}Yb^AOVDn7o@`MNpkuwggYGHbEuxf|*4)?dTC+;cP1y(pG` z$@r3zVyV)I@VL}Qal)a6E;ddPZ=sgI4hVR&)<|kb23ht<>#+8dounY z=~u$v_=h&0!G_VMe8VKItJWK6HBg$?(|*fapT9I$XZg-IS7V}mK>K-nTj%ZmV>_bi z5!}bex(PAuVy1I*q@anve(Eit|4;bw-acuMu0>kbQMY=4$JiU=E1xqWrVNeg8$-bU z0plA(-tBGL{fpqh!3pqQUhgR`N;&YqTR|JHyc z5!(RtAo+l_0ekGp{WAIX$_NN@;zQyMDGc6$MAu5Z#42ml(KXkOXAIj<)BK6KbE*-* z;>(MDb^V+opNKyYcmEvAJWRONKXu&*ZVw2E$2WmIQsnIn_u?dBh4Yw+J3iV{6w47b%=Y z4;3kpgWa+yR5}${5c#I)41H+c+wu9=wH6@eM9BFg9y;9ppIK4tej=hRGvY1g#_0s3J`~oEjf9?0oRp8>|w?+rC1t)g8I=j@>vg^8#Bjf#eLeZATyMJ$)A80&* zUv_Ymhi3U9TC}cZ4hzNmu}9`gyz?*l2h@}ZX2I8d*}D6EdKm1fq=vR$u-XCBIW9?G z)|J$)u*G`lnlOJZEnfK%7-(ZFD%PXTm&QFpW}21#pkJmnIhwmnEx)nDRh zLXJVu+(mG=!LTw=jl}D#^TDYE{!oGF{6fO$Mu0s~j%=Vn7)Q2(U^Lgm-(hG3QXoj8 zT))6!5y~bpcWdPx#Sy5KbZ3W>QDun0kd|-uK~<@4fhqZs5<)R>O@$%QB~7t~KMbSM zc>#|6z>eanFDddtUCTQkdRgi+HlM{t8YtA#?os#_jtjL;#e`1?3mh&BSE>uP zB%ONncLKz51DYE%S0nrJO>5h27Z7yO<*`_%>{3B-X0vYn+pq>|0ndLfF$^%DvuwUH zFW24PqBEX;ef^#LcOi)_L$o9?K{4F&Gkn!VTCLXGnM$n_b-yg#$V>m_%jr*?MH(<9 z2@`tU7TgrfJ+LU{@|d|h`ujA>f3=_^?YX?D$Nat@lTWpvFYd)M}q@-)QYUgyIexxhmBV@NM869(=tN~v|T zv7=FX*KT9{(_eljS`u%a=kdv6KI-x8AGTwOv8;51p>bB3v+VMs@k_}Z?s)BQmDF}J zoDO6tUXVW*5h57K5}YbOQkgjs?EEsp1jf&7;qP}HnE$56!tBcXi;q*x3!0?weT%7q z{DTbwvERNQVmk?a$nD3eT);@rYbEuba$>a8)WW!G8*O(xnJjxTIc{om64n8D2$Dz{ z*>FT+RE`KvWfy-6mWg||vJ{5X6uOI9UvjMB#s~pWU4z`nOxF(H++Wk5yxAh9Pjmkg zL*#`MVG-$pJ}b~>2wghFX}*(kG_Fge{+-%C+Pk-@PVKR>`95U4o@waZ3b=0ikfwd# zzFZcVScXEkon%LXldGl)O}?WJ{BULgcJ;>N2JUZYNvnE?q%cW2-LZR zYT;rz$(~c-0Vk73@w7Mw!T_u^y-+xF}zwU zgR5!lN!h&h^T6}Y3(kkD-nI{~2`23doTO0>6O&Xt+Q)TUj+wMlny$Uu_HarQI7kam zVaUMBU|*uV+gMo%E!OnI2?Bo zY&{IaGlVJL0?M(B0x1ZAV)#3IBoRt6aTRrBP>NWDXy0r?mM(M?CIY9R{{?c z4}F&lDem1kZCzKvpJ{}QSe>b#1{rm7h9&?wAWh~T>^Sk#moSkL%H>ahkamP}e}w|q zuLDJct1SldUA?HlQkm%pQ--CI@ns7<5cH&eoSnQkM7BI42Y-mp(w7N>q#8r1x^0H- z4qREeQBveRhm~td*a&$a`jjtFGg@RjawGk78T95zB4ML}tKecmxEB7=eKBjku54}< zH0d;_f`)^tB{(XYhT6Hb#priX_2#BRT7zr3gevlQ)H!xRK_v4{11QiEHjje zluhADFvR6aY9k1Mb4xGH%ytW@CJM{oRa+?JGbzUFY2;d%e$1&tJ1Rn)e|qFhjH2XL z+;p98n0gqi^m2JJ)qS!nLW(3SVj6g4#_GojF60=(upX<*U;G6GN(q%9tuD@|b0LJ> zM?t5i4)OG0wPlhdhnlOjHN1hIvIJ3O!Xy={gEpSaJV%XAt`G~z4OrJH%((ps)}UI! z8i;N1CMm0}UT{QfEaB529?&REFe;c5>F-W*VI_c01Z;_4K8iGjjI-*Z}8tYeCIUGTLY+^eK^57{qh{to*l$Ls0o6n8ltGNzNx4(;f7V*^1f z_Pe5Y{Qc;OlVTlS;+AvG!ktG?{z#KiJP>~-6ovVihkwoOOnzmbS6VHO)KprvEQe1u%3avAE~CO_ zxu;IwL?lp4m%gHQS;HCzit~uIFR~TIv&na(o#CKzoKalTJ(9_;{Ob#be007(+KfI` zePC%HO(N8LV7U`ZBf-Q>Gg%YYCqs!8Bbf_`39Ob)h?)D#w3eaOrpaxWSWG8li~OjH z+MU6_e%PWL6!?nK)@qxu;^hMyiC`w>@$FjZAo|cD$}LtT_%YXVacTDQ>u;P3Kh&Qp zSapf_V)jpQiZ=lTKUD##meNd^P}kFKrQ`0U^x7sJ__3I7#Iu8}R7H~cyotYm8m#Tu zaAN%%#0%#zcpB?F(j1!M+#uclv2>?$^N-DM-ARH;qV7(Hg-aAc^A}wc$1oWdC9{BR z1SKf<_fi4>0mDiaAbV@Jn)z$hR>{t^Raf$PjCj1T_v2V@LD^2;cOT3+!OMYhd|?J^ zgMv16X>-%8HzWB)gjrId!OSU9p@D!>fOt5qwGI%r{3}Rvf`@~f9L6#q=oJGRj#dt< zY%}d~HCohP<)zy?mBW7tG-uUrtK>PW6Rde@XL{=F3C;SPLpSN%qtgizjA8!quwo5b zRuX?4tk}mEQ;QkLW-A=zX`y887*wVI?e$`1x#1zP zy2>!UU@ZN`Ic_^PJ4(imh0C*s4LRYBk~yCT3({&yT)RKNs`K8;o0b);o4ohLafd?n zxFOKsP>yzu-Lp@hTsr)kdz%2&c7Y?)iSNxNX&KIx+W= ztbs+#F^y&${*L@%f-cJkEF7IVR2cau+V*&NG#XUvVTDW-=@P`BMAboQ+cr)7A$9$afW$^{YJCh{}KoNb(hA3K~lBd#uUT2R;pdrm*r}n zyWMe)%E0P*{u}zQ{F>`Xs#T5BghIaDH!`MNC4P+Q#qugG^9K4TZ+3a<>l&4D7wltv z528pTAAh@&P7L@oBQ#!KcnuS)IY8`W@@&5Kxch>8Qj4%B)vL6@z z>7^y{vc?nS3te%PLaV>UJFytf=S~Ar&?bPt$DV!cYd&x4>+j0!>Oc;D-a1{2y#=@96%hP&6%37}8gcJvDFd46eb4@JA7`kG9_-#o12AZ}_16=p#lvM4K z>M%*&j6x;dFDltOkt~=*Pnkz<#;7p6q)8oA5Q;3jvl?k%&}i=pn=)Y7s=Z44Y4AlJ zHMM26Efx7Ho+8&+Owrgf@xihn-+pb;7qXtij=Rp?*$q zjcR}`OwVShc84wu>uISTx%$?f!@I;vf_;0~Us4|u#7%ES4S&RGgvBBhbD*1WihQE> z#7>uUCW)Mp0%GPENwg-C8O~(pU6!0e#$C;7q%3uBvYRzB@)t;Twz3fT!Sz#CrAEuj z<@2`BzpaPKX!o`qi;HV@RtiRsa#ltLnPzpt^<}>Ww(U~=I8Z0_K_}fKnuvqeaU(CW zqwNdle_buh+BVfsn35BNM~u(yhiTYpJ#s`(3_Ru_f$Cy+*MJ)CqA@o148z~}`Tekw z({3kBbO$~=dsp2Qa|%r{VP526Q-mLV0*ts|5*}Qx7>{#u*<=A8WO03#CzRTGw$}l>9dhh-qdcjlp-% zb3E`iSl#S+&r6r@HRcBg7KB#=nk$Yv?@Me`PYMgG2RQa7_73S^)~$BcW!`uiii)(= z$;#T)#aI}HJZLd7Vk{~B1^a1@Br%t0uTWCP?m+$yO*mp0|r2z})zQwg}oh#+93 zVY+brz<9b&mNIJ)UA`(D_x%OeS?5!YnwH<@isU(ahsd+e3cOBr+CJ>^1B5t9n%>$< zioVP@*gq4b)-qZ@j^wyrYUY?c$tMqx@{Z~a}H`9EdxcPF<`>` z=SXDh{pk{M9fdHYM@jl_ot?#!q}a^R_J|4^8vgtw)|#KXo>*k5zWF^MI-N|-tx_V# z?UYE;&eW8?$Y#ZC^-Erj-K?qvUyH^IC?Kh`9+Mzh`82d!9!hcXelwW8>@tk!YqR$O+&QM7dxKx@0furU958VG@Au2Ar z@XrrOV`md&M)9SOGXMWup8vq;1(Zf)MyVXBEyh%3y7oVe{f7+oM%x4~l&HxB0nPuH zTZ)z04__$l+*reL@0Y2^6{J%faa{mv` z|H1oV^l^pV0{-AnNO=fKNeuaKAc%A`*};s)OF5$A`F~zml7#!omSU>L|K%h3UQ7D| zsH5#oHq@X31}ZLB&16Y+HfA949Qku6Jpran^O;+EG#=FC={Vs;LH|><8A%ve={&4J zGPMkHBn(Vf@tJp^K+B=8e^UK5F^|K%A+#%m=uj>|nhSCR=L=jxn81mEREB|cv85q4 zZk;4Q<>lqqjK;y7X(Hulbo`NG{`Kcc%4aO1;WvZV_O65$(;e;Z9TGL=YaW9^8$I-j zV)6SDDaW!xrr3s)mEjfCM?=R+(Un?7AmWoy+rIY2834iRY_8tQm=~?y$`<{WhpGw+ z;c@4KQ;yiYWtLOfhpQ7z(>wZwSakZokEfAgEG~Ow*Ngv5|Qfk(#nr35W)s3bB4O4Gov~+#%6;CO{?1O7i@$JW?9^{{TloxW53P z0DsZSp3#aFB54#9u3*p*uzbCUOcQg}n-z004k}dO1StyAQBf3xu(GVGnkk^u1gA~4 z=B+#_N(Fd|f)qtT99UJBRlSEbQIs3gWl||kl{!ob2fr@N$u0WR^{SV~UYxmxO-(aO zDyj;?3D&SHYVtrKoG>3!hZC$Igfq$nCv{O2mL-qJGfftR@R}wMXnYYixAOxLHYZE- zQHE)|z#tk7f&}91!h;GhtWty+znko2l4NK`aO_Ke*qzKx6FQ}u_W10gETb2#a8GkQ#@cDd_ZmKY z%|uzIWzUW|u$yd3wTr68uQ{W!NmKwGXWa_g@8PET9PTg19ruk92Jud9zH*b*rayW( zhkW$*_}>MZ;B1?@XSmswR(cuY=I9JJyXtcnK^VjylVoV_H5xSSqk+OOFR5wzn;BjE zyne3b`_c3larQ_1dl*2ULbDzOn*#9QHcGumAtX5N}b9b4h4sCZM(w?T% zPNq#?N!&@>>nVx*=d}I;GMY?wCv#I73}sVIgCB7YVG(Crs70I&tqa*P8g{gFl1$TM zkGaBov9DiRv$RY`$D<6tn|)osMBrh^)6*o~j+%zT(>X*VWeV-g==!5!XIZY-jOeqO z@J3|Kn8riPWTYn%ZrJhnciJCUFumt0(712@X1Lk+am01p@47Q!_W!PUQZ9 z2L6!+$3q#cxT_pFFmE{NX+i1Cyu3ElFn{<`;|T;pCR0leNExF{mqk%D#8VhnH5p^F zfyA!9rzu9brA)FXY6U41tDKij5-$@k-} zO3y%j2I@|z6W)s zQmIrbEh)u;ttOWBi2aLU^5_W$9IQ+ZbnjNX#hJ!k^=7qVdS)cj7hlR`bP=X{W^`%T z_#tdsZNd#&J1gr8x2QNC=ZTXX(k*dOeP zx~}WAZ}_2iU57=T{yv!umbPj3x-MoS`bfhG2gp0ZjjjZlw>90w1sc>4WG)WG^|;u zd(@$_83+IXa~1#qAP@=%!y$1b%0f}p+XEDU5Pg_HW=I!_qoFKEQ5*$P#vo!0F~$I3 zh#@31G*tnf=iI>F-Mz{9TFqJeKQGX}624z{xX_x`Lz!-$2v|EA8IQ<#EC9zZqZ^Im za2Z7!^5KyFaEtpT4TFpJ`L}5AyWM#A<+xoN1=DCnp}}6JWw-Aq{;_v&XHrEz{v&L= ze#E&8JwZD!BVju$1)fiEx#VY?zzk?5O**^|Hod;dMeO%x4J5zpU)jeExg##2mixc~ z`p!smVHJI8qQfr8DaT3Ik!C6rERe5%r#b}Z`gp>OxWAzS!5a(>PN0xxVvs%kv&;p85sD{Oe;UZ_utt(Cr+z9L^rh@Ai@)72KsI#3TrN z&m>a?P+VY8B)`;Dk)%+wr6~?V#50hSylbvl zf$Kigh-PK+2UphzZ?8ZLx>DBv7PW@{3a@mm)}*BM2Q3SAmRzxeA^lDDCOh z^Jxh&yuCE({8t=AzcAX=g3(scgokDIHVpN*3Ig9;KAZ}eCM;HhA+Z%O#*C%$6uGJx7q#93qF;a*l-=mn6!4goy80 za*Q)+k?|f#a0f78`?uu7z5pJ@I^knpP;^Ese4+7*dsPlv4i+e$9apkf_%MV_6~|ba z&FI5}It3UD{?0SP=n9ogz~HJc4S_S+bb*U1fq%y$iwS^ZsVGU%NfsBMQORHwzPnVS zB2HqIPO~i_jBz=k9Ck+vPQfKjI7<*i-9yTpzmkQMhvOk7xQMp~e1FU=)Z8d*OE1)m zq^>i3QXL)Cj`L`bwpc0Rl#9VX)94O8I(ywJCWu}K2|ScOhIfd~c3kYvM)5^9>S8XY zrMB#rH7~1M5<~+vG;yc|oTW#l7lK3mcGm}FZzwk6|B+1iC=fqv^TrGUuw1ZSw#PS4 zuAzb;h#bgXfSXflhnC{5j>i3ww;agxsOHH|?{5P!z>R`2>9CUjTPvl3D&`E8g3?m{ z#2|tWk1;8Evud+|rKEO1e`2Zs@TO9fk!v!5ZofW9cb8I1i5O2>H^CBkuqod1?O}EY zF+dF<&joTZ4Mxyb;+V1M! z%2zVMaJ5O6w(6CAjYGnW5>tE?T~xRAoU+NEgov(q)MJol$1ALP;j&(}nR=*2AmYrn zh9SU>ES@KLT5aV7?;73;2dxs^H=kX`01 z^z(q0yG@Gn(zY%wq+9kqu^)gZEN0-Gp_&%Uth)|)1XOPD2n%v>$G-q#i1jNa_{}bZ zMs>zQ@sVQ+IsIJD|EQ`G=&5b71R2;44{A$;(<++Ck)jaZ=ZP-3jQ`d>xie-tgusDu zeh|@6vci%65w)j;r5^N8-VED_HbyA{roVe##o9zeagQdnjA*PJ`M*g zmfh8~q3D@e0XuLea7NFnoDn-rf+SVX-4eC)#a;9}Nv;swyU088=*&@zEwZH$&?=tBwH zec;3)(icRlPH-|m7DWlp!^kG}mo&T}(`*Rasvc#+=%gu+H2w_5Dn~Bm3#W#;>u@xf zAZijGR{)S2W+N>Tr4$>sT+c1EkA{>DdFw|viwt?xWbyy?TvnUZQdwf1_0MX_1<0`8 zuDZgIH3epzD!yTDG|I-Xu|Ma-z@Q|qfS!Mid4PI7LYZzs$4}DjOMW|JO6&mKz&IjA#6n=uh#2#W<&hhO4kCl$VsdHOSb}5?qZu3qwQYAK zRw8RMCx*%t$hbx}iYvyJqIln~`T;s|=3%3VOR}Bb;dK9_xll&#{-~g(z(`S#N?O{K zvTgkM7?qJSR}Pp{o2!RgV=MQQU{Nc{qfMw)o%r7Q8X6Pf$m-13;o5%5Lnw`6a@D6pYf{(S@7XH31rrG1)= zHF4WS{FsJ}(c)dS`t=oh+eF5pytkAT0@SO26oOl+sT@4t7@&DAF+FMKn+fpq%!8n( znFZzv_ky1cuKwyS72T8DudYT){F!~4^cm*5_PhtEE4=WFUSM|rWm%Bnf>~+#*npnlgG~EUdwCX1!58e7$D=kyIC7EGz zO((6W5-bX%Ibc$5Hv>+Uw$lL>bP^S>Y&EhW@s5zVswBd6~$H(m>4|8e@vFRE48wju=y~MpD?St zckPlNj0*tePMc`I3_HXlArp`eua}<%M5*U?7RNY|4})u;Stx&TgoHDgIzkW3Zv63_ zic^q&M9U3OL8uG}&t$S@;g%DWyrRU9tbvefOM%&vJfEfz$FL__N?Zxv*2)&O?23*L zMDA;$3>@G^jc%$gtj(4FtWORUV}+ zES^L54geiRPYhs@c639H$jcLji2t2+T(;n24g4$x836| z8_dPk3q5Okizq;hAzsQk-*mSjWh}+C$8?T8&HjmE8&(n){bT9Sq^0La9nB5k<~mMW za+lTpnw}lE>PBupG8>E7s*fxxCep_KPMxg12W8ai@3`mTUY{lNCPyl_j_kBBHv)gf znb-rT1YMU85MvsgTIPbl_;)xS+uDXN{f$5jW@v=6$Gb0#1XpRZ9AcvK_lrK(X4td^ z{PNV})+Mu}o2%2pea=m*7sQ6z2`<`NF6wl9PW`B=NOI|~;kX+ayAf-At517I#FS!) z8E^=n?iAj=!P9UzYR-?X2kc9K6anZD1t7+_fDcUJdFI29@$fblN}cg12|d%K#j}0m z-x5aQ+Y~s_mse2voI^&t27@MNr)YWM65lcWBDP?#*-ZgyHZ@tjo4s^c$(qyE`7eL` zC?EN})cOa(>BCyWe=z*|Z^_}zL8A^58Vbhx-AO`G0%#slS3d93f_T@4rhvN!OF9jD(Y?ZM^7cFEdWEL6;3N|-X0P|3Y>i9cBMi)9;}wleQa#Hvxpfa;m3P5iJCr9DSxoPWMu;L zU^A*)g^ObZ<;D_KoS&nrAlFy81Rhne%7mePQaHLLCa`w169{~K9Pe0X3goQ}&xy*B z-F4Li_XqCG2Tb8zR}y_)hllhO=?cdey=+GOo|rUUKau$}KkstwYx0=W5`2IVRQ($XGS8jhG3{6|u!%&?@B{yXz~1ZLk<$p8#lIoaH1_oGFR{=*`x^8Rn7r zD1vDp*7?52R6+c=uClE%2(f@#x6sE z92HJ2nKJ+eAx4>HU|RH)Lv)+(B2aYH<@bzF9@1AxKd*ul2!_kJG~gBmuujv^ z51Ma&7`<4Rn@v(f;tYjtvjgv-@67#0|6AYHj%_V-qu?wUDi=pTXuP2&^4Pe%SC0wjZOp;BB$TVGIKVc@G5Y$jGO z@~P0YIp0GTe9FIV_S4k_^;_{cy4D=-<_ikol15!4V?d}+N(EhG4? z4%~m&c`HS%oV!R&0&0{$DXdzJg^HDP*WVJ2v&v47LydeXWi*IM0RG55COodC-!f6A zY!wyp#kIzL68JpbTczhe44OH*tAsK}@8*DFXn8<3EsfgZQaaa(E?6NQ^VY+o#M{ZD zzm}~GR-IEr@JYo*$zhT1KIH=tfSB5{;c}XdKf;cAno;L~#c-Q`t`>9QaLntONd7V< zFAXx+2*&yQjM_(UB6H}*g%urG%M9ZS*T3=~rAQ3W3#3ajv^HwcOV&s5``FOq=U0{s8y8{k8m zc-&qi__YHKiC-V0=M!3iPHGEq5Is#{nT5B1ww{Uun&0$ zSg0(k@j%ZVPOp|H;P=`A&jTfIgKIF25Mjf65iy>Fr+`P&6(9;DPnRY)&6bx=Tr#fL zC@zvKKnoOG$oRi>v)ta#0FJkyAY0(F1=`DtSE46)7&U>Ij+Iswx+b=9nD^jn;@~O8 z%-EfLLq6}QfP|9C%}@bO#Q~wPdOFMqt%6tFmS_kSAf}xK;v!UMn}G^wphY{K1>g|F z&utmt8Dhx->HZ{^b9J&{W8?t6bInpaWOQJ9;$(_S* zIb@Wlvn99+Fx124#3WQe90&EA-DCr1J(SDx$j!3p7il$B!sN+l%kcsgP^^_u9|{d7 zgsK&RIqThvYx0Q-;Oj|KL<#T>6(H?^;-UhmQ&v3)6yEfe6{58$y0$@%2t@I1LI~tM zL1<;4fU|U_K-_~nmX2J~${UF&z)iG|T{0+6f%aTgcASswpTY9`jXX(JJ9-6JQnk2$ z&?A7Km?7KeP@o&|nW@BeO|_&pFmn#;+S;rOfVS?29I{89>oykkSY;n`vv1Gui0tXH zaAIHM8gjt))bXpwLOhT5yM)i)?i%n>H)XZ%AQ_?%m2=;m3>oSJfKbX{PM~0ZK!~0l z&-ua>^5A-zF3;OoZ|3LM`xFB@;9``iv|-!%HpvS?7kKM2cvn zv}EBdjiB?8fraauSVeJ0{0dJj4LSq14@n9QG>So)HMxbDn%L3mWiwO}^l4sAv;PVI zWJRJ2hsX#cCfx$|qK)d1Mah(yWiWvw67TJoL~?{MCzFf}Yc}U6S6GABazp@Uqw^&z zTHHRD8hA4$;KZ$=*mcL#tMN;3kjzaM!3MV|{?zaebJMZ;f{%*Y-!=pv<+!+g?MJln z<8zLwE9;H@jhoPffb@c7!P_|YF@8J`K&ys~ni?=2-|ORXoCK^l(4zLx%h!$a`y8Up z$+!eY#-#(sK)VMVi>SjNwhLn7anRO1=5!D9!-6)}ozLeWQO>`R2iNaIw^{&#^)WdQ zlBl~+pYaY4d#~kt=+AW-1pZ2~P<2);)?sQ`=PXf&L=me>o$1xVHJ8QnGq%@@boIVj zk?i>{;w-&)9B0nZGMT_gAG~83gxzwd0531B{IlOI+n*-18lcy9hXRJc4QW2+b%AND zbYRt<&O|1nxgv$k4usOSsZZhs!Xy?!(?v-p^luI8QYj!wv~mBS;m5|y46<)BBoXNf z=w;OQi!L%JRrd06oQWh;p2*ZxD`VNj+3puG3!sjxO0mA=ec%%?UqC1t4{Ih5BqfOc%)vY(%?$J6Tq9S=?526Ku55Vkqa%M zAFhsM-*S3^kdLJRPMjbsP)K&sEisV!uyBcCSB25qzM-c3ubEh-!lBJ?l+1mrd6ZPN zdZ4}ZU3?PJ`Fwvq)#O1FDPlvhfCQa7M<_a6wjs-ZWz}8!_rT!18wCAsENbjwK`u~| zab~HM$Ph&qtjE5{%qWr363Y}_hB~s6D-&*oNV-X`iBwz=(UGuTzT=M5N6E)GSF{ce9B4mleRUDeQ%TOm^c7d+ zlHWj1gG2Ow<1m-p`|tAcc36m|>Rug?ljc~mLwO{Ds*oaaA!bfX3Fmapz}NIY+rE;a z|6~OIASyTd(Q&?7B94h7%(&t&lbRZ7H^kmNV}$+wmXES65@3`iD-28Bu%e1=Exp)K znz=>fNN=vF6M~`mL&H{%QVWcd+ry>G6do*4khX0m?nzV$(GfUc159TejYoF_1~2V7aBQ2LzG$dHZX#+vK~c9G=q{EO@rs1wXH^3X zrX|j5&Ba;i#YgO;I1^BfCFe}C@0v-Jg&B#VcZp^oimxmI)={VmoxtL9od;(evCNYO z{%EhuFh8HvN{vL7{zzcu)rv%X53Cn>>=uVbJR6Gk=M-c4Ob%${8i_RpURmP$_n5QzBSZ}f0QH( zlGWq}+B*9xicr#Vm8=Tr>?A!5+E}foWc7h#kJbyl94t_@QrS#7I|_T{RSkF3n5%V< zJaFs+fdl+-WYxL~8~S@*T#&oXuE%>6QeU$IGu15ai1sYi_p5FK3rdMVIwU1193%&iGh*1LxXW& z#7$iaCaYf*oIy=M=+p|(z$OOe2uBLgxDL}|XxpoyldO4$YAY24+@uShjXaqlNi=+h z;aVhgE}^#lDNNGL7yC;)7RV*!F4zsxEFqZxUqw}&9MTv80joaYh>4iN4HdGbl!W#N zy;h230RP(3K&gpnBQ4BHK7nS&nJoS!jhxc|&s<%_X=tQHG0O`CJ&;1i>6vDZj!7LD z6J%V4%yc{&uP1RbmT>}md$Pa}XNxqYa!!D>zPKh=ln&!?lH75L5ur6g)Q~VYQ>t&; z`)>-fhGUyo_&?$?f-TIQSu#)24giSY)R1xad<-( zL%h)|-0Vk_ULBS#@sWJ4@W|96_JAye4AsD&i2AYi5ZKTS!U{^!+1I5Q9UpiccZXj> z2%TF6z%3R5FyKQA-wyS0X6(W3z+p^<%3>KJVHtFo#R_`~U?HYQ9uBcMYPPC38NTuP zACg>%=!D}{l2V`WNQUJ7)aQeNV&hLVIm`CL$RVDI{fH-b3{mj%i|1bmYKGi>HHyxS ziRmFe0ak*dw1yjc0fdYk0-O5ex2A6S?foT(Q1=Zs&-?ASOuBX+yC}k|Q~3jy&sQ;Z zEc#?IFNDdwXVSMpH9;}(Va%()8(i$*e3)_i>J-;PKoT~WTGc{;Oy}EJUN1gG*We&z zKwwLN_#xvT)B~2)LYVOo+%1TuydHiLHIzx`dkH2u0;BU~D>k1(a$IUUA){IdCsG)U zdOYewU(xq=J1cy@7YLKr)1t;T2quu@&$tlAar&3m$+I)SdCxp13fFYfF@*j-l*9sJ z6TpvAThCb}f>;}2+sE3=p8pVX9X`a$rG-ZFJ!N9;BtDJ{H(r`UzG7!?URD2LL}S`J zJB{~KQT49$C}2PF4-K^RuF_@}y{P9t&o|5tPT=Yeu$$T`I}`iEa;=GL&zV8kf2y_%^nc|NWCn$W71e zz>$gnuJ%2c(k>%G?E5PO8C;j2*g+m~xT;rSsbs|2m?6eg( zDtb60Ghv{_siB%Ki>Ke`ORWNa7VsJ_EOW3t7Vqz}LTPy5D)tOu!dBR|58}SQas@+Y zLiX(`UIa&*Bw>nU?B!ZAG}0fcaAzFaSt{nNB*XkqMls2x;)0Ep8YXI!RLWUFs${fgfky*m^==OX|h5%-(G1Zil99hi3q(cFH7JAdu1fd+1mckfD$QEtKr+UHDBq?L70=~qNk zvHhen0$?iuW%~MVl4A(`c+8fB_TwplDAr>|PHB7pSCRkEuM&o#>X)rPz5x(W(}QTN z8i&2X(u)bWzmaV=(r5BMrd$})0FMTd5h3Y$xTfrcR7*X^QhKpJu$&l7v)trqJi0d}_^HdF+rgLh4E2yNndkPTj#wmSQ~dwc%`=U=)+?cuu_ zZi)#;o1sjnqLhZgU%~S=*@FdoyQncBg>CkCjd2T#VCj|uL+1cSugOsg z%2R{7EOa&Ub2M~qtkDbZH726QcDt>$ogMERF|wuu24xV+jq`{HrOoDGY_KfjNRe+h zu+)Lw%1>8O=1yH|h!qa5=>Ibug$f>sZl+zij#XGepbZUWI>FlvJw$`MnMu7d`$nLN z$o{nRGb~>UeTG;Djyz)(CnAAp+n~W>@RQK6(nn?ZD`pK~c?)afKm`%$A8Pp&0%i|1 z>*>F;{QFrWHk;P_d02tK&jc0RK%lB513Xv zvXoNACbWP;;l`&4E&lFq`fxxuYR`KoZ(5Nr^^9fKsmVKA6j3BQ_@M|F$c{<1Bxg7~ zz637>8GHJmuO`MXr)J5FpicL>eBLZVKd+{EsIT#V$==Gtw-_Y2Rc^E!hTl8`W>*@M z2nVkC>RA8F$l}%HP9QiYm?`!%3lA`^0m@5SVX-u>I}onDntpJC57$=E_+C1q^KWQh|SOcNmnd)Q;@ zW|>CQ>nBWIAPpOFj|J3y6z^DRxI=BoQonkOT8IZaK%3EEf_k%`=L)G0I6BH7!WI`#@Qp^g`%(eN}U{{!5d#hEU#a86;CUc8XH2F1+P(OgJeu*ta=F-3tR zO7?Gja{inPCw|*VLnk&w=@>j=ny3TPC{!ryn$qJ%(vKnP>(A2^ecK7oM57{9 z7Ktw+e-%dH)ji1>zwLm4MXZZkO+))pe7`X7x-2E45ISz5ATpcx5d8N=3RlQg;j+r1_ICi2ZRcQD|2N%yD< z+DU|fLAO|5mOpv2D}E>7qJsOqpud=sUG<4bk1YrgL?gIVUbZKBXTGeFqri&lRryZ} z1UJM82$;jMwFa8CL>qh4DZJyd6nqODi&eHlCX>B;8@KgO-s<3ijzn8pd<0EC&s?dG zz>gBlbI3UeSB=KCtb%vw%mZSV|511R#8-ziV?lHDs_7A$D$UUzCIM2Tgsep0;?%E) zfo+IUQmQ-t^QA?$@a9&ZWD&wdf0$RKIsU9ZOQ`tq+?Bhx0Ra`Bo(6s&WughMc+FLd zBu;mCB>b*X<%+g9x?q?WTb%REGD~0Hc_eN)23r<1B*bn6m&}9@T_pNLI1-oIUkI7n z*n5OCtw(&Evkjd{A}^*SZ3tzwuN}Y!siCQhMRmL& zYNVBK^dHeFYEWZq0{LBVaJ1Teyxl(eN6;Xl?YdyzI~p(*AI$=KqLA)ZutT= za$ot183Y=Gi|YM+bNydu9DD$1z1Shf_6wkZ|En|~@uGo4pR!=(579EfJ_Ql10*kh-jX=*ep&75yRh*XWw(f*_JxRg$zQSGHQ~hs&p*r+cB!9Gi=6Q z=05i^w5O@M;%`D!FKC33QdQF2=Ng9Vp-L5SS-H2{Pwb@K(h!u=ue_l(wui?YtmtjL0PMS<>#>p1_4rkGSMzQSjb$`AglfqpD$)eUc; zq5B9B<4(7$M3xT43bRa@H4?QI`dZ=}ZtL5_y>JnkG)rVV$nd4l_A0(y?1#p&{eJ&Dxy(>CwSw3Az| z?Lu=+hRG(~iIY$vaW`6)i`Q9ILtf8&QC-T48IP>+0hV5&?X@@vcGH;QnPqyN)ouWb z!l!n^s%LUi8j}%%ooa(}P=~PROaQMfLX7Gr%F2I^|DYJQ4&7C&oz~l$WLlEsfAd2`3JO%BvPt+(bbiWS3ki zAr@`NS|W7Nw@bo?iBm$|eG~d3!*Im{?I@i?Rx$k=%YdaDnZVulYgK8X_btrRe=Tjo zS%@Gu5;jClGv?O*Mpi*Olda+#BSMkw!>F;ca!j8oIQcEXg4_l2gTlfkF=wLy{H;Gp z6cT^7g#u{tt4H;0#(nFzu*H{HMa&eii_g-`GupFx&Z4ADR0vWqom}75BPwC3Ir4rX zfk0Yq`m*~E5PwGaM^OASHhSi_F2)O?12tyqZ@GL=WTJE|QUjSHL&G57Q}M1lji4t7 z_iLMDnctBkq8vUF`eEn!^+^n>sC;7pUM?x$;Pr*BPv*%W3vE5XVhbG;8?ny+pRd86T_;q=AU4zPc83%Kle=R^m*FmWun>b}!0kQh5oHPqiKeNm^x(%NPZbszzHF95_2n7TZJp}2pIZb1q11KgJht0)92--wF%N0tawpyWW7ipXY8x(c!D zepl=DshCl^4-}2}B^`ZAAs>)fi|TQ^9mS|5fU*$U3Qmbb>cBBWYzjZOshtCLUu@qCH`yc3)dC)L&k|Y2uVkx- zOE(p~Xht61#Hwwcd2l7RY@=&{w+AZ4fe^c^cc}y^U8se;px!9O<6~ZW5zO!8 ze7I5yMkb(8tmEo*qI#MYisL&LjtdaUIJp^d9f$~^I0@FSaZiI(aw&g8G&2rkx-6It zv9rOjDOXUNb=_96RA66=tVO6XQed+P8P8LA;BO=59QRl3u#_O=l$9uQ-SS15jUmd3 zaz;@?0B)h?LD7_IfaMkPh4GZkXA&Dw_SxFM z|M7_^c#Nl+&<4>mGl_FaR}Siu$*pF2j#k4B`y7_$QQ}1@NUucw~tA`>DXM zaTZ^a^T-2z4Wjd0tPx>9JkCr%RPpX=7wCdgJ6L*9uAzGLDjor2sWl?mJ-wh+aXez7z_yjGG~W5TQZ8S(vRA zp$ts;)qaSUfvEM~z*b;hIxxMa6;QAwy^n=z@=^hx3YQ@akv^3hCq~Kf){+=U9>g^T9yaQ-<4# z*nieaKOt~|g^8d5dpzz};26)=lV^Nk`lpYyieRx%k~gJS&k-l71v^tBhS@Ze;DAaJ zh-xJr?!aOIW-o+5b^AvW&qZv1Xa~ZDG=6i0)J}>*Kcd>HV#dX%CTwP@E(C!eKtRd0 zasi8{aXC9nSgMMPr`CGy*U#3AH7=Uio|04vs3v)qgt6LE33rE29r7AUNu-B^P13aq z3b8awgY~cyxikA}VphKwO=e=))!bW{z3?*|>A~*m1c%l@J7xP=11vJSQ%H}q>(SW+ zQZ`e}*7XU-ZM>_k_5S>)h`u?gjAkWeko>=vsN({SF=QuIasE7lBWvQ?7c!Y?CgdDF zLXgmYP6RMb_WEYv>@Ry5wy-U+trhVU!D$%0^0w3xu zEv_R)(QIr9#bsLn=gly%@r%U7;4zRi#!ej=oN7g>Xa0uG;0I8Iu17S;rg=$ryo^8w zQ);^DRJ)j>jJ1X zcoH<&o{x4yLXG*dFOZQtT!0VcNSF|81ZjYZpV~ikd`zgW)xEHyBTK-0reTHWf$CTj z!u%Oz(_TVsZnUN&8$o+ZiERbB@vOhJE|$-g!GJs&wxxMg?DLdqR29(Y=}I9&@KpSy z&6oS8u>3im&l=J2!t$7W|Z*IRfit%1M z-~uHTSIw$)`u9sh_b)XygZ|Pvqws!7=wEp0x zb;5~1`_qEq4L8pbafIxSw)Z#n`{Q^XqX*F>4Zb;t}C z^$4>3y#PT3_@K>4aNJq0ohzVBCvZr#(wmL65L2*x`(PXUc97*pf#iDesPI8Lzz>i0 zC`)Vspd}mhVOt^=o~;Lh2?FEy?M+~Et`+pkxf+|MR&>3->$TTepx%jM6uPMrgW!J# z1(bDDXDwk0=?35*bh11`K)71Oo+?*HzkeY67?r+rbJZ2v$Auet+K;Y*PL^?oj=VZpMOPpr*Z_YU)B+N;;K+l#BbAZ=~WF#ZL*srIc zb3**M_zB_#MgC0Tql=k^%2&Wg>){<&kLzWB#n6G6D!BzZ5$t|Hjh6aeA4jsla_b)7 zkXv0S^A>giJ+6>4tdF7i3(EuG_R%aMsB> zw&XhZhzDaJ5NOJJ+%!yl#{Tnw(2V8I7sIlPbJ1^tq^cC z)aZ&SozRJ{XPOR|?_c8SctTWDKu)OR{Rc`%_q<+^6WK-8luUAcoI7&nv#9!j!^w46 zyL$V%K97>A@XCjW&Ijd6Nlr|A&#OB~m>pY^adLSkI65*0?h8@fo0QV#(cz2n;F=|o zEVkjS@P)pB4Mv4mr6LqMRwB`=(Y&1zu*Bz9F zAE6R8lFm@2N6&BzHIh6KKfoAYA*%%=Q$k|^Gc^L|*jWqUiGC$gwAY1&PVmk|mbM;j zx#ZpN{jN*Vw<{;mN5iqVSR=G~U_RFC8e3DoU7*E9>l*OyxYS48<%bid*g_ z?3`DeWkEM&&pUAmDLKz%oLS-#RhKu7Ca<2fW(yo!9XL!Y+S8ZtCH_)Fi(6Z7vw!bN zi2y6_Q2$!0AF0%^Sc7=X`xuU5%{;n~z1v5h<)s1nuUDaoSIXl zY;g>rbw~bW3Y^HD{;Ar%NfG!^H&w2{5M!{u6Jic;%JM-RE!=6(BKR>Brm{~up1-nL zB{BN8GLwNJn_E!okNAWw;aX6v+(S|VLDKTVddyTFshlMV9`>YwB}l=VbLX~t*b(g? z*-*osOhJFoDgoOJ|3ROK>P|(su|89x&O>B9;3dO@*?`jtiwQLuo0#i6iyjuigWU7* z+a>;K>x-CycXoIs65AqWxRjD?v*HSyvrlp4Zh}Bsa~CG;K4OI)$c5XgA0bz zh|)a&r-^UCronK|hr0T-^RR|QlO_tZ0jp1-^c7ojH45;`N*Ssg{3=5w7owKUHHE$3^`M%QtTNvO?9zY+M)OaPrgV!yx(#5@+TKw$m0&5SVzz~JvVhR-7!a3}g( zk;BIlTY?E8OwymU6_Mbn+f8X2yXIoylKL7$QDlIvRD{Q6F95F;qhGJew=m%TX3spy z_`*LTEwNiAZ)|K7EAy6J@uqKe6ZGy=@V0*E8%x@8FElD~Lq}3Bl8OukrR>Z0bPYn8 z$K1+~Kq>RSg6U(OUWnY!xuF_q`-DyHrrdl~9Wy$=15Fg~jd9dN8E$7i;%BmLnAg(&C67x9(6=(RrC8S^6DGm2r8Nk>|o ztADy>VCDo#d9NNJ^R*588ha#>I`NQ`%WfG0q092jb$Ob?>7YLKhp}ei6kW>cx8dW zc?h|ZlnjU;RU&S?V9%tl*A}_PVZ)crA!@c87FrfQ;ENkFOn+e`7eZdwlxD=hl;MfM z2o!P$NzhcW{1JG6x^^SDs?Ci+4gdKl%1w%$+7ji%(PVr%*gl-6TI6650G&jDJW%$L z4dkrSVv4BYZx8Y_ts=~r(W_*~KK4A)(##`eaH7&K2MDTF=B;5tmbyU3V#TEMD zAOYWVb`j~!^c)l{qsp-eW4C;IL`OXR0eSfu$L3n^r@m)+=k8$^c5zgFT_3~mLobR& z@s8Jc{)9Y%d{5QLIbgSw7yx||Y?%r6P3P0z9U+;RL2Odkuh`0Y)^$XKtOIRkW zVyID%LFrQoq`75kHcvq-5=MY)j3G^zK|otiebKYs=aWblG2}yAcF3Ok2@zs`Dw|lb zFVv>Yks~OUV*gY{-QWJThrRg zMj_*CHWG0IjHz8lX^f4}s=4cI@=`UMDR`NHRt@CKjTT9!G{%lN8{9U#dJ~(nXPGj| z*|?ZCs$K_%lyEvcN0e=WwkRZer{|_lPNcsE(QSGB>D>wI_KLe|_%(2E!ObGE!h#tY zm&+&-q0spvtd-fJ!9M}x2xkc*2z7iB>#K)`0U!lTuZ956F_oAfWXihxyCt&r%-iQiXOHqX8=v(wbEHy7vUrVv_hOzfV7yRd1} zQ(Kd9yP1Qv-Fj#Um5XOa>XggPFo1No>GO?riIh0>Vdo$p@7+!6X=mULUY8i(9u!b6 zlalV%s(rJ`fmp2Tfik_pIS>OEWl~o6lO4v2J`hbyaEo>R#nj@d^tpU`QqJ%qWd}CR zk`_15WX!mk{-9bcjKmE`6Wq9^^5Mt_gLRXl|DP~}AZ4i}L-)})=OL#g#V`j%!s_?# zOai?4H8k9U#sJ@3L7y{u9954ITCM5AS4x03uY#syWLe0}giw$#CqL(VlW4s+zEn4f zG!~bKeilB7v3E@#Pma=&6=VdQ;A~^N{c3_zPncC8x1L!TGK`_E{kSQRq1;_Dc-DS> z#TBeq&jZkpj~D_;K2kX$iDu##yaO0WZ&pp_XsL)e_%~cZd&Zr{QX_4KGac(zXCt}Y zV}UGoN^dF^=K5qvCEPxTUHlVlx2&|(ef|jC^tiJ}eN+>kv<1*|6Z)HL10;wT0*AxM z?BIWe&i&0u$er)0@rGNIa&9#?L?BC{_`9FzMV{Ei6*V$nfpr$Xw`;H8SZc2ug*v-5 zu~bZ^+2AbeI~kR!(XXn$Y=~M`Zg?x*k8f{ev?g1Q05B@EpG-;;3s83yut zBW~m3G`Nx|16m_{LpW9Pn=1Kw8(&>sOH~z8ll>N%l7-_utg6-ewd_LF%{?KpZ&~AxApCgE~G-3#)^Ocoq1aTM7m(R zIM&*IOuS8nY%u)_c-|w=M`HE4Aw4xf<=YO^<4Hk2+|Zb^((8$=w+waWNSdL?PwZ`tckCc;>Q(K1QlRE5 z3BN>CEq4tHle%85*`z}|(dQ(5;taX_Kycu&8uiD8Zx-$xhcV5nM`caEnaPxd(Gs}W z$EoIg1<0|JX0mqD9kV@b%*6)+=D38%xyCB|0efRUXm$zD2=zD$pGtA;3)GOPmpD|U z078HY0SgK&1VkW^0DuC3!U78cA_yb|pa5{8fP#Ps0uTZ$09YVkApimaga8&&JTCS8 z$H_!XwVH&c%ONFkzbjPT7*<-CVFhUELOU2TZaTM*haxS2jAH~&4>$Zi zc^O&i!F5stKXzAdK7L7kp=#U$FmqBc^()k2mb>x55+v&;xm_DX2dIb28JaI8KL{<^ z4N7sn0|vT7&HxW<`V!E~gtrhWS79NNh%4X#d3;B()n~8!ZABkpDVwWT*|nvQu=Ocn zRa0}Ed#PCwWJ1dh4shc&0zhLT769-9>JSn2&%HE=JQ%M)U-H4%s=zHL@V~@X#+fOl ztqix5;NhW)BM)e_0#Pluq;TRXYNF~Nh*=yQJotg~mtlYCiJur}U9BAE;As3-+H*lI zI0{etoF&)IpiDYN-wZ>-w7b}j;t!rrc}9XgVYqYl<136ab_lnI@4-yJfuT~7xPK8x z8d^Jq2q%v^wFzrct?cF9sc&~zx(^$?(N?nvXR*aQJm z?b-(^fcPNuT=Lg|+sTR&(c+@p;&yrU8%Eci?^lJ%VMZ^YuR7$nZKOO64GOOc+S$#u z@WS^g$JSvV%yOZa@RNMO2&2(YDGW{!wbUqFMUWp9ZZ?~36j5aEVy7lfzF-%==HABl zTVoIhH)|w4;iQ6gWS#KCy@~=?BR-f(t_4R%xP?S|=pu@|7sDBIJZS7ZT%Xh|kP%*&sBi`M67>sw91Y}{t57t@6YTPyi}T^zZ1WeP zhHdUauXV!%-+Q1M@PUVGCt=ilLc(=%Fih#pG!}-}a{sc3bqis78mm3VYI(0gp-9tm zs0K67J6UAGKqdLX__<3s^00c1-A+T-?@ zS0E6(O$UK_*B!tf$hHMC&}~c;f7^_xsHDziw-sYoHUav^(#j!Za2Cx)Rp>?|;fxUH zpBg+qLs4iQ{_Pv;yKMS|cC%`)?jNIK4HWxrciVFBEoDk6K?!OJTM6xRT@6IP`yDfG zs*>P!P{qo8HJ!DD%fdh_w2$+T4!uJI(f`1BExobq7JF3SCw9MNvO31ho==}N{KURX zR^aHDrhDTaWUhJMbl-g)Nhh0fird-Yl<%;Dhzd^S=aj2(P&DheeCK~(d7vs!Ct#Dt z6K6od29+x=C|<_cA&VN2aD#@J%gNkuv%#4jfXD(0mp?gKEanL+wqWB04N=Hk{%uNu z8#}mS>Hq)#KM^OxESf&th^NUKfsvlb!O|~V?j)tHmalkR|Dca)4;A?aO_uldxqM#& zgBSs_hV8~5Di3aUwpy)LtJP|?Zc$gJpRXi!_oP)|p_(}-<+!+VhKnm>bWHGDo}fel zouRw?^`@?Se&^A-=61A82t+&RY}%HYnHg@`XWFRC5FG#X7tx`=%AQ@ntd=r+y_aXCsz#03>LZm*b&8^l}>z;!NGa05eUuPPTIZrNv4?t&9xVZrN0LY}bxHBd)` z7r{R}&^SX%6phb5Ru18D}Azi(g(Dx8Rc5>8~fx%|Z`{{ft_WzYO;we~cdmA$36sJ5tH zuN`SXRo9UVxIB!y?2Pgc)F5+`FXg#`nF&T*z7^}kNme-XAR@zv`3FPSXP<=;`9735AFjKCQ$xXc9%W_;yLL*n0r zix+0se}y1!$!M~p%i))sSeuID^qQ4%hkZ|SI16seGH?Hy~Xu+*f;9+eMT(@mDptfP)M>Y(s_ z{qL*8##2iiqQ*LmQ~n>cVN0eN;p-ldsg;dK8U01YmJVZc{T=48Db(GXGKV>=^P3|2 znr(cXx-JM7HWps@-oK4}oUvZ5-ht4@QhQ>s#aedEW8%#n@`gouY4 z;!|Q-l4#Rjf>>o?+X?_~*|ARS7^hkXM)~`=?so{!bbMe+ZHy|;+|C3>bE%U&0V1n& zyAewlIq8jLH`!#@bzLge6N}N8DGW}X-Cnn+BLv3&9lN226x+8|PIeEc`n&FfF;B)y zx&Gw{L0X*hZlo5YhAmImtuQOeL^-cGUP)n~q4x1dL(2t|OcwLd?6GXs=2)g~2l4vS zFv(=K=Bs^7*VL-L0ESakxCSP>3Zq_41E*Mu>pZN2u#F_fN%x=%Su>qC-D&Kq=Y5{{ zRgY6JSnbl7opQ&jVST5HEmb{Ep1f31E$fnCoQiILc4>!j^5s^=~8i z=L-X|fPcRC?<1I1mtYkX*QJQT^#@h;)uRX4O=q1$PI?6x<z+D_Lx8l?c@K6 zLUlaCDGq92%YK>u@I!%@cA>1BVY^idd-IZ+d=H528tgHiIVZ{wN zO!;Aq8MM$~M0AnG2s2t-MvkySi8M1bvKm~R<_aOwY)Qj{EI7FQXIJUB=(kNl=ImFg zz<|tC#+LKT^&UAmJD#7MEZdJGvTKJJ1%__p^0MQ5h&(<=#CaWJyLO1M>Y`5@sEfL2 zdR~sm)1t{VgU~oSRX--{2Ppa7x}l5o5WDuc^)AVNfH$*PEpY``Hc<09VeO2 zNrjy3Z=mmb8SCj_Cv{M8S3RQ!+2u28h+R?zw(Qp#S#5@XQ(QT_dT!D@BZWZ@jW zT$2cgB#8<~lcjPRZ8k$fYIXgZbMzV5AP@4}6|ZO8UoukJ;y5S1a@G!_BmPK|tl+<- ziLZDIHf&xTZTYISO@##dqzQJ^>1Y1wQApp{b^7*o`O?=7@+tmsO__ZQ|T~s5D|Y>tDm2i(Vx>eIw^E5 z=opE@&pi~EjuHA$T+`P?(Z%fL;wi>xgAETST9GGeQhs*n_;`e$KG(w(G@_S_qnH6^ zd%5~SH=)2rqRci$fG6d9#9gY1YSOxOpE|TajgUVQGLk@Zo9ljx@8yX1^XGi}N9NP{ zbsQQ!%P#J@(GH;K3)0KQu5LW(^mkBPNhV6CjX-gE@8t;hood$ERMF?&2>0MLp}?*v z+&JXLNcWtpdp7A9NjlQGmQ0j$qQ4uNDF2d+e~L!9Fd*~vvujQ|>65hM=A6^NUCc9` z3oExI|E6Tub)>U6m{B=q%!&fa(MA!Om7|E>{v_SxlGV8V9p>D=<<8x5OCD|pAO<$+ zLV$FVzsE`bNkqT+XZ{s(zKTF9GC!LfFz@83e_!uz17x1EYtsL&VE;g`iTz?=nJJHnEu;uB@ zwAp4w2EeHl2#xYrz-eWGQ?1sXPX8pSve|IDfE55Yr-ID2D&Tg653VPi4luaD&w)Zj z;z0btuIp;8A`&OP0_@}ebAcQoPWcP*!j_zLhn&>VFz{*yUU9K1FL<-oq*`j8^QPA7 zpR7bisZ{Fry#CU=acgkOTjS(w2aENr*mB;kzvj)m)uPE_U4JjBfjl<8@~Y8SiTrnd zu+<8d3V!Jw>GN*$c1!YZYHZ(I3ymQKXvJY$Yi#LANj=wW1B5xq5z@&|Kn z>D@T+mfj5ny&I?eTW8pkW$py0TE^X2=G|^Ih1wP}*Z@q^3G}IxoE0-L#wX%*f241_l$b!zT3(xe>d_^Mu4;YuRD|vxI;a&~h@W4A!)Sn$T!M zljWpI12s_+Z6?uHu*RDqamoiKd0?`E;8^>tfPZ?27>Y=u&FUPMZylTTopVkv7ORzv zaFFY~T0Kt&j5NJDy~?zwH$55GB`e*mEA##A9U*Mly8hMgx~@CHalPN*ly?iRC&7ff zW$SiOl5vVYF~gyvdbgyVOpeQhb1CjB2iqZaVw@~H83f#g>wS0MluD)252hifOtbGw z%i0N?%FL8HIRUI)u)+3=QS8)N%oLWa(W+>O1 ztR+29#|hGEDl59yCDEca#TV~Z`P z&5Cm{B45q-BB3e1D%lJqZq&DAGmQ9$O2I#KiU#V&G{?ze;AEJ#G1JB&abl)T33q^h z<`=zSu)ZC~bzE~j8-i0!M5FwnI2|#z(X>t5Wc4`8Z8qB&o4dQaPusL{vn%w7evv&f z%kjc~lu{Z0aM!=7U{=36xI{23Kq#V<=p?{|@s$r8ERimu#O??BS19Kc(j#dy($BFG zB2JQF|8f*sWU?o!kii&YT>ed)EDAuu!)pa_3~}X&DZ)@e#mp#+Gf=R=0~$euu|w@9 z#pT~kk}}!R=LH8=tit;96+*_wkiOfqvp2A1$6_r4me=iv!dl{?7-WoPru5da@9Fpb zJvVXE-}_JW`a6NgxZlVA1KsH~fVr{>_kDlgrXb%~MJ}apvg9st5`;wrvc?iAK??Rf zW-LxFVc`{rrKTWTikvhJ`6aj8?OO+C1x*wMBi5IWtpoiIPC9xlzq_i^v4$;iavA0S zRUJWPY%CUw#bPlXL`>Oqf`j_Wz|aTqgK0vui_1TW=aChl^^Zc**pi1Q$w_Wa)~k4G zV1pQ`WS&~7lRn236T1JHG_ltUJum!3Ax>3*Z5+l6tPAltDWcfNfwWT~JOKTlzvDK-lujx+(>gK*Wp8`QwOC_c>vx$i(#Y=5ff8$H^Vh zB(m`2g@D_cM81>>_bhZ9k%cF(%YA2p00QoO?wfPRS6_rk38bpkl9j&sH(h_|z`&{O zqSuPkb)DytGbt$v{F3O4f4b|i$(psKX^YXK>y0ysQ#W@9jV&k5JywUHu^=`BOQXmU zN9wY9CGn4E<@y}U)|Bf>VBCtwOhM|5gTkl_Np;d%z$qBqawY+x!p_<_&p7Ep8e6iN zNt<&{?<>_>`shrWNnI_3fy#OQP+wuj95J|_OfqiZ^3u;(Ts)_ptd??$`53Z=onMj- z^N~}tT#!#4rT_?|W!&vCENf43lBgsRzy)9*ZXgx103wN~fP_S3s?b3FLgFabDd{3N zXy<{Gf^|BbH{Q=$Dt)4n9!`N>crwokA150$rw~gobKDQllJ=5xMrXbXfq!^he|n}i zS+nLSf7|tM88zc1Cn|sjOQSPibr08{nhA0j!%dql{IUreC*3x`W^>Y~8YkUEXS9); z`RTIBMx-w%ah`WPk59oq&e#IZTb#F}&TPT{4h!ta`T03FzhiVABNPXP*kD`ma^$9k zo5vaQas=mHE#Umke7-5*{LQmTXO2efM}S>+OyTBnMz2kj>A6?)Hj_e53#YtE`lfla z;+Ax_(!zRR!qH1&CyXtpn(J!Bl1S;SV=dG zwq!Da-pZ-eD?D=pThcCUN$0R7WfNq_Nq!!tA%0JslEaqO25}_Wl5)WX9JZ|Y4O><> z*4UEXHiGyt4Pj%An=R>OHG0xO!_O8r zMvoZWVy%F*ezaOG1RS8%;t{~uYVFX`n%?(D#{`Dr`u9h}O^xf^m#PVys345;Cv#m) z=Rp2od*s?NC;7r|U{;Uo-&2xwxc(rjjR-fF@?ck(lhR4Y5;*0rW3yr!<_&|vV3P~W z!0w)YLK(|Wc6WDIJ+Icv-J_ayarEWxXepfXFOA(abg!U+dh8v#TQ-a*>ol!6ffO3$ z&t+WaFZkw)u!S|#DdGA|M9_k1s-uwp(u+EuP6=Ex#TA_N2Lgv}qOqqqxl@B>6?^P? zt!xVNeYJjHeZR~pCy%}?KrVw*nd4e6u-+|Olv3x2(7?8WNWjwFO+n_kj!!3!jW*A7 z@|@jy9@te5Zg)^XuM=->o96U>=XRFvfq(es>%Mp9?&G$wv6AQ}AwE;MiFd#EzJtL0 z@2kky6Lq@xo?hD3v8PzMD=%ypHI|;jjT}?L0S4M>AOA0r5T}@DiRxtI0(1Wa5-3 zk`U4vnVg&)Ff2J!N-6DugcZOoa}Hp{tDoEl8mz(C_+-A}mC(FK>bllwN(9yBR;v}ayC`?DI}ZBcDq?O zRRQ`J4s7i$L3qJolE+E0i?kfg+YQ^|q{CoN_LMHR>>^kZtO(|?p96Rv{^`E_yMCX+~m5i1@41|WlnK4&#Nbpu__{P zf>EhAuXxqnuO&|SMuNGdNh-iMQ>Jr4t@sl-yavJ{J9dk$OJqBCR4yD zU*cjIii|{@6w^$N=-6z@wG0FHEJY@QQmPF+@&m@nK2>`IPpd0kiyQqRQ|Jd=KA!O#ApxQNcxX1jd-7 z$s$W2kHn1eLhxwJ(b1R?1WQDdMMMRpO4P-Px_s4Xb>42bo4!qHAh*rD20rEb_w<|3 z8mM7j1O90mVD7~lCzZ@;o3?3hZtTqmInIqq?AVZ#CIK8`ng|`?6cR^)eHsZ1C^(&y z2Dkv6%B^$ifN{hsod`sW`6dgm{#CR5r!Ym&v_$Vqlhvf99XETzkcak%?bA z0XjrqN8aqKePCRFd;08TktE37t?QEb$8`NWHtxM@jcEF6)!xg4b+;~w+9t~1B;>~C zQ5&`095BCQPPP^9?xyN)UfeUBa{igrR`ZaYtZohO)y2`Z*P-cdUDv7c#?IDNG}k{! zChJjkx9;}Uz$J=?;L9fg6Qc_WpbEOq$VChJ0QIW609^FJqc06PA_UBoHlLRwCN72*rGL{Afj?xr4prK z)2{1EqTlWgz4k(|B;H&n6Z}%xKj$ocv(Q6h8-e2LhOX|Z*dRtLuqBTHzt0q8iaq3< zpvZTM;g>`fp4?f(2?pu0M8flWIaw-=J2B!UC$(C8 zN*Yr`o}M4KYh_A_c97vd)Ng{_AV?|wzUhU{VHP=2VKC6m`}Y|9V|tIH*Kh-|@_|=1 z)w^v$gdzB)u;m9` z=XpA4sYW<4C@hoafm1&IL!_|bgG%n?TGq?Wniz_-mQ2Tc(?f9$@kE85SAQsMu|5m^ zAp{ud_PilD-5$HgKJuZ3EkB@>ap>(WKAy1U2PhT?@WD!i4<;)JCbP+GG}I|UFdF!$ zcQ_(b1d=!9^SIhucI<=eF;2yVW^hDIj44_mamD3R*dXaZ1`lz}paz$J5D_0-e!xCF zS=XP_VW!He6CwO*&Nmpp@S<2d^zbuPwbbM%S-rAR4+L5g3C*N zj;rxc(&TKk)d_a}h1g(ozQ=bbVM}hz<;HL`XX*GJqK@}C55<)u>UbcSq;|#!+ucvG z33ux_86LsJ-dd6yd3HAIYT{OhYBUR z{W{!;Lc4gPTr>O@OVtG@yTWIoFPp+~!a#9GanhfM=(maTB>v%k-oVi~wFPGjfeYg~ zn%9^Pv0`!5yn#Ezsmalt48wA>gK*!8oEq-tByFN*4X~cwbM)@V&DpT9lXm?*nAuX* z-Q9WBV_$h3jiXgr7PB(fAM|muA$fhLM@mWi!w1h8Tehp#2DADMUa7&W?t8wK<+xpg z>l@&4g)Wc*UUg4v+3e0VnX=X6S8FdOa^RAN86vj0qQVw1Xr$cKz(7S0AHdLz#*`Vt z<|>k=2quI8g31zKWM^p0=u=s%Wj~y1AtFwh!DF1kDDT=2|FjrMF|_eYg2YL$gDTz( zv&cXXPo+|kl6Z4HN(_wh@3z5;0?@F`DQfz%)goa8M)}vk?&qr1dbM7!*Nf-&zx-b~ zw`@si1tE&PU^_*^e!c1&PH}2tZ!kE+X=8}G+?c*J-F%nX*W1FzK^U|- z-)q9%@IO(f-iT$2rc;ARFQIluM*C9fOJDN5j-xc1Oh*wur_<@w?YWh#8N$IS!{`dS<@!G%=;W$n#;$#UyP9|Uh0B9dtY{^MZe8q%v zziQTrf2fi)$qN4lUY(p=>9CdS4}xW#Ujm1OCJRr>AGh?448jk6 zG{^oL+Wx+yIN2~D?Du8A`o&}P92?emiruE!9Ub-SC`+wxlLcjp85z7BVFNW+e$e^i zh)fnJtYpE4%fD-r#Q-cl;4nsv42&%VCxJtT_oFK!gXOk8&&yeJ$?pMyJYPH|F` zSg;rL+w}I^WHlHk?c*jeHx$g+5vOKw7?|`L7}Y@jLIMBy3m%igtH_EvrUaw>pQuz= zacVIB@|SzFLnCwNILpKHDq9?-(bfdve)3RmQtqe-GqG8zecGo3E4J)dEEbE!VyYjt zHQg-Z`hAqv8k=I+lDy6Zd?9mC3dYuos=_mj?LY;V{I^o%L(^{R-|s8F+!LXJt(9h% ztZ=CiB?Gu({eS+gMm$9>=Xx?L1yYC!Q^pff?68Kb|HLdPQnJ7RiX@Yk9$u~PfyqJj$8H|U<+GzFPT+?xZE$0-sRa>6Chh~|^ zIh(OBLAd3Ng(nw))`(J_LVOPbeIa4%Eqkul5Av?B?ln=~!6wSTJ0i*NUbF5s>s~;v zuoYILXtAX`as9m)7xr}Bi@v%j-K(RuB$cT1Fw0GiIcw8yI;VT^f(?KEFTjhXBRfgG zT4_)>Ly*lWl|q-of^YhpuL1bNQYkE*I^a|ZP7*0X&blo`R4ApCmP$d6^vhsPx1{$2 zH*CpCDR9^74RRKn&Y;fk)HfS_zuqgg& zwOXZ8sU$Y1N~a&ByQv6=MK-0a@eueY=S6K#Z+F(t{G{1xv@_x)a?*;GR1p?@Msq0| zO7oRRPDkRTgOt*s$)dAt+q>=Np?tr|^f%*B=}kYh0=wKsXB1B9bhq$*AC7Kop*}eJ zt%~gWM0U-WuO_X(X=j|Yl{AVJ4z`?AW^9UMak7g{z7qp$>Yv=4LTyf}adM3nc3PQ4 zZP+eyvaxWn%^3Jch6dv1lsV_5O=*)wx1hE#XhSF+!@0q|L1|Mc%?zDUnm3N&B4ZgD zAyFeFYJ}w7U3WK~$jLND{{F(r2G(efZKJeVEsXYLQyQgp4geWIW-68K4y7J|E^Ns& zN-0&TRNbSR8R^`Zl>uvQqF7I9m|wEvcs5caO*EA$5)vA&Q^LcnwN@BxCS^Y8?yELc zjG|zPLIz@>01<^3IN-pc%$3<>pYw)GtXda7bWwp2HChvJ7!gDlLYQG@i>_-Jpy(kC z5nPlYtctVFaxO6F%O3YfgV9Klq+8R>O zaH$YR5L#sL0yS)eaJl>6h;^bs5Clu5FzoqA2y(InYjK$LK_*iP@eep_wf1!SSE(Z4 zE)l%2>?9|7o>#x``+8(SwJQ-vUqaLDrnFx*QDYCKB$DmR_j-Vp@ERP43nd=R3IcIz z10f+(WjbeS5E4pni%1$MiA)1$Xi-cA`~fCMz$kwu8sMLjQ~p5YC^8M{TS3ss5u1_{ z4XPfV&!JQd6Iy`lPlecQf7wKkkdTmwa7ln%#!MSTt|tsd6Jm~B-Vg0`;d+wegv$fs z54!KL-#{L)kNeoMvx6;9C(p)l9(LFD&Q2!`TI)&+!E9~xg-va5OaYaibFhu zjWKc!J*hWvfuk4ip8%0LLgp&H3Jt^;NfMf`3~>FY5FA2ntm(rqRWzUg|8%uFfIU&i z1P{t(sv~p~$&XyXN8+Ua3r&{FhrAX-;wZlWr~G>?VW$umtZ58?Xifo!nK4PcUM_GH zDve&c@kdZGO^C)crj^bBsoW?qbd>M;EBS-vzSi*hPqkg(ji__v2Ip_aAs<;>GH|Y& zBjKCgG!Bi>#1&m!Lr-*!aj858GF&%f4M&xewR)x?Lrj|3n*vVxpMZV*Dz>Yn?xcLbu+dmN`x6$el9mZMJ}fQL@wc1lL)J>n-4|UyKY9+4z|586o)!#3=wCz zhMt62xVTI|^rQnHTtnT47q0Mc#Gwz!xQ3qaxPbUS5nbWv1^j6mA_5kcOO=nd33vNd z5_RT(LqFuO&q-yD($J#C4pNBWawH?RbWw$k9po^=734+?mKZ||5fD>c{?^(dL?I6D z?%oQh*~_jnhbRhWbyCaV`ZpLSc*VW<610yxX>x9*ecWRhmv~(#dDq=>b0#&A$B;S+ zsgryMx8gZeVbXbUB42?~7C_8yoe7Nc4}*#=n+S=Bh=_=Y>?TnY$-LWeVC&?#Ih%GJ z=N*LzTQW^13)6i!0S42oP?%O2pFU~WiG5o(!!*#5*5okV%U4qc46slIEYLvw^S$j- zO2HD>HKEC3rnOJ++U#1_taBcCP7`|VP@*ZNbY@}8hJ9b=+`fTZ2W~BtQc8bR;W!pa zdbgXe2yp#9NypciEt*DG2pIb+uw~O^I_=*zr`g}}N9^zT{vG3xm)0@XA=@LZSzyJN z7}OXw*|9KnIBsmB*UhtX+L^Fh(x-zK2c<5Y5Av9k?za_^^&%W>W`mMi<=SQNJ+_ZOkSOmrnb-NvZzkul!<^#SK>a0eev1g;)CkwVND~s2 zpnd7RPKKsTe;z*KnEdH5a zYo^$!1TJ<(J?jvS2mk;807Dc203ZwshQlGTcvvu3)ZjZ5019`EKyF+(nF*sP2yzr< zj6ujS0)PMj8G#|1Z2)naqCFy4zZuaMOMLG>4RM-B$k!%%A|~G%H9?9(J7au99LmNl zU4T-8A7+|M7twg}g#X>BlYyR4l@jfZfs!4AdHeh$NkznC4$NOEpQsvJ(*n?V5)qrUSN3-!5$LK*flj;%_H) zdd&v3p{ccnFCXWM*Hg$&7ARP&;53WODQu6w3aJu6fkrN-YX{%dA!-Wr5%Q{Ugkl zE)<++AzR0+vn5xWJ0Qv`$<9u%y>s)^e7QCTgS zZp50u28s&(FBjK+BjLS49CCif@hi|#Y@mRn-Kw~k5Q@zaE`>XUM1Gln`C9mD@?Z;< zIz~ICwN7BaP9kGGt%R9Ye$Vhii_zdktf*DcrLgsK#{@x#Ls~S^IqGt zD>HRM(lOGq9Ao135F6#wv~L3{kz!ox)1FzB>V8=?pk7`K$H$ZdFxvVnbUc3OQ_jAu z0;}eFw0QPOzzE%$rU+Qenybh*3h7)s;wRijcr6KMe!suRYAu15b~-LUI4^C6Ttius!_YVcivT$1J@M#KO%}JOCjW0=2d2Ghr zW&Yh#jIi{-o}nh_105N8!2^NP3EUdktqgMhP=c=EQ;j|PXQ+AF0hP{sXnV>scV!Ip z9@uYJTB=TyoirhVTEIECFNC{9*)Ll=>b*RR0kbuP*0nUs7Pa)bz&Vnr97-w~RfLm* z)cwRs?sVBU&^$Sxm*Yrgc+p#&?YAO!f^wLF;NAh$*)9nO!ZQo;+=D|uTu|G`B{-$| z@e`w=RSS5d9-~gKg{U{5rz99Cg@%z8Opv zq<>i($h6I&YTnpaw48_fnnz&%5@WBUh4fL@)=sP_Zkq8Rh~Zl((~-CCvKd%%(Z;^@ zRVmIgBS%D;p-cjwH^)XYlK?=7tiH21syv7XN4tQQ36TpXySUR4W9e1$J8{T+*O(i* z9KY-&U?{)_uJA;3jsYVxYU%yS4H5;p=*2;v{yWhTL!9Avzq8up7jy>kM6s$4=!Zs7 zf-WVLdx79lg7*ITL?b2L42-vnl1R8k!$vBQ-zCP=4fc)&ZxNbZ$t1o+G9ypKydy@L z%)Ily^>wD^BF_ULiiMH?Kw35Hus_H&l_{-GkLiwMX*J^6JdpB0^0+s(Qn`S`40Tj8 zNUCs8`Zdoh*}eiwnloJ8XyBBq1i zAEmEEYLc`Pivw=oGs*Akn~Y%>Qy`tO^EF0+IUoNF;$&H);MMfgrdy-2kG0 zw!;*zij_ub`N5G_;$>7PzRDtnNS9_q`g$J9Mtx z0!*?y0&P8}vMZLZ%vCc!j%O+YQ$%Cw5a1jh41P*`ZG03c^}-6Na|@6MdK4f>C<85Z zYLUU~9A)zkEH{fqd_Foqt_c+pvu+4qo0j1WTJ96JSD$x(`DcGJwUzaekB}vE=;xbm*AM zcL6W|5r_^8Im*7eh;^0T*ipk$!U3mqpf%($7SB0j-5bFqyBRm(Id(FO(;JzvO_4t$ zyyNo7FStUkt6Wt{k)7D*I&XLhFyGB)hInJoHnaU3Q^(W^>*M*=p3N%_ITQ~+^^O%O zlPV%JvCh09)#T35BDo!_(t~!eiLPu!^hZhs1&_!UgR)fqyg0Ys3{x!OG^;!jJnHTY zP_%h(hD1Q3B+-U6zUYMzS1pr3GdpqcV7=Rhqj4`bYllY6FMD55;yb=Mx}H^+-0lo! z_fN!ZT!Ylp0nJwGR{$LA8kx(>rUt9^PWIHHDF_L+Q*TAnr#n<}Wup$yEbN6B#CS(p3`hztM|x zU1dy#{6N2PaZ*Mc8OEFdawO{wDDJ4q#173Sj}l3y9+KT*GglG9^Zw4I&vVCju(Mhx z2dHvpHZ-WH%;7K@2d#1&uB54DAaW%Tz5Us&#%oID-I~6d9hG-3s_}#aH!6tUG(?sG z**7}8FOIP5Na#8&6yFZtP{NlpF*`|`@Il~CukGV+@WRF;4hiGnP(vJJgBSZp2n~w% z?0A|!xub_&^hHyvvnm?}NQ`OTEk37lLFBevO;AnjSW6Ra=uEH+8Fc`(F^3LBaNlt> z1O{3dB1Tz!6&YF^f9+-|0h;sEtHbtxVmXNM3Gn{W)*)O_mr&)uW874rHG)T1dr=@} z+*-vRALytXx|tqd#V&S;=@B-cyTQQUIUa4?kc4>jR6(K!_ZMIuGlqO?T_dHt{}Yre zy9NtaR(OaS^!{TasYVaktVMF8>J)Vl^GDS5YGG3HCxm*7YrCS*y*)296ctS`tHE+~ zi`!6w?t$BId-)eF00Tg2xK`l{lg0A|om%P9J29aBdAO|i0WBloZD#zff+$5UuIc3% znc;&^v5Saiodp9s$QGJ_Ml4(gawWlqUGx44X{G-;dl1mMn)5s33?>d+*SFirM!w*; z((*MEQVin3%#R}~@{sJ(1^H7B%s@!rDWJq4iXCzv15MmQ`;&PPU^PnfmTh=&b=m!P zp-&V+x$oXJ3z$0DBzWe^tLb_AtpvM*B%i) ztqJG%rWe^^JiAO{MrdZG&Oe5D;J%ORJAVe#$skf2YXu3`2;9$$dB+5Aa?Qdi#s8%# zEt-D@HJZMZ7z9hQj<4+M;sf8452sLaNa&`~RIb0WIUH_NTZF9f1&e`P>BYMGH$X4E zHY?c#ebMzNI&yQv3w60BThU&KLJ+Rk=_ui_5w+T0`oPY8z5*0YkF&^y&`)zneg^=& zZ#Efo4gLx?WB5>iy9|`P9V_&6CstP4*($4qZL$u6BCpdD0<+lT%Evg{Qc<__(M=GB zx}Zkc{kgY&w5VoFKV$EFiuQgodrrji*lHdq7iq57D?laPAS8xYtkuD^E}BNx*fQJ0S|h z7OMcTeK87P=dW|2X7Tt;T(44s@=7~llB|%{7m}YJPr$iI6f-uhcLQMjc9bm zpN1uC{UlhB7V}Q+r1>*Y5Dii$85e}plF*V`4`s*EgA^0xSJRP@^itrD#?q+}w9NREbgl^X z_0$weJ~<0Y#v*lV#O4?QxOQU_7`+y2a>jEe{P~ zd5EvtKrn0B35UdUuvnY905#w}Sr!knZ1J7(Bux>P3SmGz(o)ULO_pXC;oP|4bGhN8 z{?CopdV2uiO~a89SWK;>@0qIY7KYw?0N_~C2x!ri``s#$=@1_d4#*``scM*|o#rnL z8p&;|t!k-eD^wQ}y*B2ag4g0EY^`WP~lbe>uq z(P2UHWEZTKkFf)N%^B2os7qVItP~tRI%Dj7k(IPh0yPg+ft?yVRBFz^*`K23G-70I z^)5vN!FZ?AP)XP6z|;pA8LAhvW50&3q%^(i7fvaudcf$H2LUyTiR=ci7BWOiogb?r zgXp^h7ua^1JTJYZ0VaI&_Lxd#xKeG_YX(slihSGXocH;2OhaT6J5`J(R@HL0|R3|Iu1EwK0`#R1$5ATW8y^Us^pvk{~H5LemM8@P$ybvTq4b}2%e}e zE$lz%q-W&-7-9i|iShWEY~~s~Vco7>7(j92TyZjODc2b5JtO^U23%vPhQ0A2Bo}F> zqV-{u9Yxkl> zV8vZy3F!>eNs97M#gxeQ^*qcJoZNsTCaMyHgqUHkI15@&VWLxx9#ny9i9uqf*a)RC zK?+fw!a9wo7Ek+~{+Nn$ekd2T)BBVuxk72anh&InMoARlj@B)bDbMi-e^z8+Zjq9# zyjLEdY^Oda&tkKy137p=63{dnw?C{X(W79jC=xocF!WYjT3_RiXX3DaD}!jtafFL# z&Vj9YDY7YY=3Zp`PBFr`D+1zu?LCHw&QrnlV#)Dx_ZNtex>;g=XJ7 z9l1Q=GpFcINs~!c=0c`em5+$}+kY4!8iyBSV6ju7qu!_K$Gfr?3YFO$_J-z@vs8f4{zOxmX=0s2;m3yg{aS08h~605o!%y4xVJDs@|GK!6W{-= zo-EI**ueLN_t&&-qM@wYEQa?{99C2U*v^FgN`ylhig*Rh04*X|I6CJ{kl<|%up|7?-EkbynwYYDFkcClOCz6DM4E@XcNDSS)oZdbUmnMl88#eo@s|lzry?5pJH%klRVp9%mXP4M6 z=`Pup;MCcNNDLib&681I!UYb-@bgVyLY3RHT8PP%uF`;8C(@|4d)V3sRJ`O=@ehe#Ico z#m)JSFdp)8cjh_S`=UAW7X5Lxslk0O4P+hxa)LG@-~sYWo|V%hTh<0-BD;p8cAgtK??;i2 zPEw?BK*6E4iAk^@-}!P%I9#Y7UH~ZDTYiXFS-ikp{lawNW0?G>xRd;fkAo^{a}RTL zavx+Wz@G=&aV+_*@~Jx!4S`&k1G@IXgmRDpCS}9Qy($%`Fnr;fW7HnW5-zqCNRJSI zA+}l1REu}1?ZLU1%k*CHhS#&p4{U53Nif)j5w|nQ!m$|PnZJoU%p8$Kni0!3B;2VO0Y@bDzPevC~TJlaVbh4yuElGFDTy(l{g zZMO#R3D02^>Ad-QOiGyBZJ>yrN=l&)b_PN@i~C|%Vn(IKO-xY$91E24Y*JHz_;>fH zfv32?{AaEDSJTc`mA2W0__JJC$iar*iFLh&RJ~q5SI!Mua-;BZniXm}O@y^^yjh|K zbL_Z9M|p@Q4kLAZ*rJX+ZCQoOHmX1hhdSz5h&Rz0j&f2=p*U3Ia{4kvtp4$53`8FB z=HgAVP6xh6ab`#n`ETn!uxGtFHaC3FDqh57<8rQ6ZF7thNb6L{*YoCJCH%R_LPq}P z(%QeIq-VuA?L5lZ||{I=l6QdS4G-mF^5Ud-2_)l1kJ3w<$TP?XaNc zF-5}c5A$ZE--%n~p?wOrfg<6KlG(Tox<(E;B0@B?JtDh}Q~{JmiF%_hGu=r7(GE5n zXpkMp(1bY;y@h;dt!lngWlLvh-SJ`J;>w-qxJ5X_=XJ4~b@iXD7#wkPS1YT}ib-qE z4WVTpgJvI`{02(e{a6S?wYGQA?Z91svyVHV($QMc#=*5F-0_8U*$|?B4N!@9x1j6K zAO@qlMv}+z_r82-&Z$GL{&QI~UnX;nHU_>u4L~3q8-d}$stfTou=cuY_QaoM%tZ%6Omfcn@@|r zNF`T4F=Thqc`AJ@{KZsL{Rw9Mhx6&aM;V+q!4C*wC>qtC=S zvp*WphCfm_tQw>=1tVG}{Mgw^Q!b>q!g&+lK8=_XSc`=NaYLySb0gXKLXTt|(uED- z343U<#*z~~jZw&wCIr^r`d2z>Mh>&&X||L=3<_fePg_WieG#_Id4QDeRSHa0F*Ulj z+k~(gFC->_h^=92Y*BGKwcX0QF6c2QhcK5ymwpjZ74j$NZA34)S${^LBi<*DUCQ6w z{0<&Q2vz&Ih%rdzTxRMY%D)y=*X30lCrZsM>?_lXS4@WaxmA|u*TmQ5Eps-;B0ioNA3L|g8ZM#v*Fu+tLZ-ML*!r@^lbPg z89yOsD_mbDG*gR^m>Vt`7gg8Fj7o*Ilc&$#R@W&rY4{qi)yT|3HL_ZGCk-C3_e_e= zBvKQ*%E12T-i4w)YlygmVcO^y`kRqZn@!6+Jj399b8JFj8K7azl3FH#7E3BohC@P9 zW?#=MiR-74w1O2sl)O?LKT5B=%s|8bqGA^A8%O-lD%ORDeIv_hA~uIIv`{VR)^Vet zFc!GRYZ!-uh~h{)H(vBvYPYq>DEQv?SwYu>myNJJJ%=SKzjnSd>y-{?c@p+m|CWz` zC@#+D@|SF9Ma$doK0B+LXfUwExK zr!Wl8bZfDvzW@_01a{dw_n@t=g(WGRm-|Ie1g;{`4@fyq9KV-xkCiuAo|#di9KTBM zx{J}f(nuAv2v{9v5_I<3n^gj`pGZs-8|b_%Y!tAZobHM!x1MYQh63gX${Cx}e$X)# zXiqD~2j;5*h9uB|K*=n;cg;d|b}6ZTj@Aq1naUeH>59$*_X=(=EyvXCr8!tinxTuE zI#Qr?K&xdlMg%Cqi&QhRybX4;N^UpXq5%RnnbkVF7vz&XnG$o?F`xCM`I)iN?O5Ze>CFG zM-WH5B$raNHmDMYUwlKOMd{LhgbroSf1NW^Av2gp^#7duBF2CoPkF!;OwmMALZO)H zToM=X9jcUNVHk7U3jdP-8ls7hqH=D-nX=Cc-KJwSBDZ6l*?D~pst1SpT%QQwV}K;h z438b<;XeLqqIZC!CwYbXDoLO#c8NljOTMX|4^q>gfl#RAJkm_ZWr zZ?ZdGujR0JHJt-{cgW=$CgQ59WA!cYNp>I#{a~S|xnO$zQ#`0~%>7=|5)uPxDjTe5 z^un>W5zIkj4dJnBoLB=$f;EQ*a7olhK=%Oda9Y%Ms>yu)ADqL3K3L{oux*^U<>?VB zVpkWJa!2u$n|do;aEo;2dl3KyRgffYWG_raYozdRw=K*{%d%(=k~4{2lIA*`FW@+k zjFN#FWv&-w=b2l4#0l(kV4@Ig=20Ak6J~}L%7JW_?P&f#$K;B(4P{K_i=Db)Y zv7{t3qpjyG5HSSz5qP!SyZ<@WoFdTiIf*%xz28O{Q z6%>|4TYAF~M*o%DzJM@L>TKsRLJ3WH7{(7<=B-!YQF0$}DMBFx9#YwG`!NRYcSD|AaP_i{r7ilb$(;BPQ|Ny~8j#QaSm4`?E_@OzE=e)Ldb3^MSi<@{%1 zPe_bp?554uZzCRIogyUvDT$OCW$W@gC5@P8`DnCd+{8k=OTh=OF1mdakZEGmi4AyD zuIh|$Kq=ZJTzUSlUG=lC3jhY=gt6e0akMo|JUh{G->&i;++7fmDO@YO({nICD;&M$ zg?uFmP(sRtC9^jDNb*Q&=;wLYWIo}VsyIzTUWic<9{ zD%dK*>*!0^fbO>gQtOY&iy&6=UXeYSIY8bO#eMOj<@hN9s$n29GYR)jNbXDur>Ev( z`kyV9bSAlCZ%-n2khhbggpKrQC>a$y^0&phd*3pOUFBq*L4 zHEJYWCU41y4D17ftGa9@(pYpSV56AhUcOQ%Oa^oDsiL-vAB^0WFnzeX8t+2&wapl zXa&R$A(-t6S1#`*jHA4l2O`qLSf3iwD)W2ywC;!{6oF+Td^rv+mhWOm02ORVq2t4$ z3E|$PwvU@K`Q=->7H(_eghC458E`VlUj~Ls1ijQDc-EEiomVig&rSFJ)_;oN@f*iD_B7p3R1gbCqVT<0HY_*pb!Kg|l~7pG6J= zn-t0Fin4|VHvdjd2?(~qW7q0OJ6S$u9E1c3Xy7Nn?p^K9xg_F|7}hMw#vqaf1%b7p z6WN(Lw`1)NlqGCjC9N^wF;(rrP5f#>eRIrUn5TMrKmvD4lNhBd%4aXD8Z2jb1tU5^ zjt$*j^`eX#lg$+o_`(R`q&o-#X_oycF_*{KEu(uPnr2oGKsKQLGC((R5Gi2sH1Q7c znQ<)~!nc+#f^mhAyjHFju*=1(QQs)#rHfUS^fu6BojOaZLrj4Y@-G+O-T`jSx&ovl z-ajD0xfUqIQa9~8_ug{$ha+7Es|$u7n-`fhCls03sDJLCTCTQ4DxWVLkV19#Qb3J= zVgRB5Ohkrai3@LAF)9aA)O`y_l}P%aTXGiZ=wx07SKA2tROiBs{1$q*?HJpJy&TQCH=JNX9&&ZW2?oWC03SFkQLvEU#EWnh z8z|x&p8%&{}n1-S}E} z5uU2GtuMGXbcqqZs^{Zm_rBfX!fR0`9%@CqML048#|wWol|d{tzzpK z!1o$g>&J?{4;57V?55g{D@w#5G}#DO4||W3$5qBS zb(oEBbdjXy7s0|3@aH{0j_&*2f%}9m@L|C zNQ?$U4>9>=nV8&nEEFoGz7k9lBN?QAn#nUTvCqR8qgv!5_Jud!axHM-t0g2igjipb zG&Yx3XPl3kT0$FRsw1hi9Ze25A}R&?P>yAex6$l$e`#LUj16%yMR+>^U?Db@*>lM#<9 z{BDeHbHO^yqdA=gi?)<=+3oPMgaRG76=F*O9)<^n#a~oSZKKtl!dU4`G??o|@0}P8 zLeAS9IBbOb9^fU&9(jDUxtbwxrRDLM@c}t4OiQ~|%kw~I78w9LUJfP(#h_um0)r_w z*fX@+W1yxy*#M@!n||bvxPz5aHTr?vT_`8nATn>IENllj)etZKgAy<0ao5EsGVbR@ z9qa!l#s{fp6?-xQZCogAZnTB6aQyx5T zyTe{Y|6m}4K@@Qil^PC*L_`&IFdQtsv;%lpLtW}ju;P}uD61`xIS!Fek*Pa0d^@QrKsTfIT@_Ba_%9XwH>h9BF(Ci**^#tkB6;m;z|>S;GFwM8 zmHfhDvCY5;ZSkw+M6P9|1~}+TZw$SABg6IT3s0xcdrIe=KK_HLH!a3n~}+@LTM; zQ?;$8QHS!ZO;U!G11nPzsB{L3GD|yWyQj%}lBWrs<1LXvrgfuNcK3Mr{|peNXb2!b^4iD zYF^U_A;lGMfg`HtZ`N7Mc03XlxoZHcTvm}m=6ZVM8%qAECz`-tdW^K(+)8Z5x;C=G z?9oG@Ro5m$e)0mUADjAP1^Yb6sW<`z*p5ZXKWnIe+_C+$=0+ij-ce<<+lBT5JvPqQ z8oZO;i1>I8ADilKzO=Z;12-Spx^~1~i$CXlP8vfeTvnwJV+lK9QasfnCF_w^)OUSz z8czI{($>^+kGkQ*ch{Ptt20jSp-tMuRT&os5qQ>H4i1hb)aWUdv_fk;qAsv_g2KmB z(Jaa5X3HBO*HhG}d9k+9w1ru78n1$T;2Hsc-ebOSZ0J+b>uGMLiC3Q0f?n*W1xV4dX7 z8!wEpvR2-Q6#XUqpy5F=DlW|ImHCgRp1Tbhu1r_x34Vct1O%UaW77|phOFWRL`eMy zh_*FFYD%cTVCWBmltigYcnfXk<7AUmiz}EBhm$EB86uKD2b2ulerTLCC2oa64g3rWR72g=;!KoJwwA}$jKDdza=S6h0&qSK za|4J@>k&6Xt<~#c8$(8#Un^t$YCN3fZ)BRwY1x$T#qtYU*K8 zhXgim>kWAkr*zINy%{a=?*K*}k4{KIeW8Ph2Da#h<%wxj}M5|bf;QFi^NRCQh**jD?5$9)r++GK3ERF%C$)k5>QCyH$#V?FNa4M zNb9bwcn$^Ovl8GJny2~z@Cyyr^dBL1bo287zlEW|*_cVmAQ5R8l3|hl!4f6b*nAwV z{*1IK8}fE0%6}iS41z;iGPRe6ErDy zV;-fube#uL-L77<_Op1M>I{x_!%|PiVYY(##|JlFcC4p&=tjb0oL^|6#kLw zB8)jaJJSky4K8#VKVm~y!8>|Vr{I&y&#-ykN_UBPJIE&mg$`4i0T^3CSLl0%X+9t~ z77ym}ir4CtGC6vn$cc0yT(o~e5<&~oA$m11K(9v5$&543?2HDilwH^bHpFH0@RWxm z2c9qDuAqp@wt6cv45)m9NUp2u+(e6d&mPG$s!lH;o>=nX(3A=6Hsn4bHD zhpd|NH98YwYIXxJm*MTd5got;R5kFqjNz9W)N+0!cG;+^YeQRNUG>k*?R5v@T-z`j zFd$NZ00+d+vD|>T_tMsa#F^>>7jwU%{Vt~DXc({HjH@*Gyuk?KAZAxN=LXBp9YM+z zC1x=IrB~<9gOCVNg3B$*Xp1*7VNr$_)ypL>lb`BON!}TrQ;>L;Y^3{sLGrR;9QB>r zOt!#lPGbTzIRvg|4Ogg9^C@b7;n?p1e{}yZR4~ZhzB%@YSpbnycpG2D6nCwpVX{L( zE~hEt5l_5%Wa7?6dLdm1?alj~`{@(ndA<$13%fz2bSEqMwn^~dhg8u_Ed^MLXma{y zv=?(KUpmnH627N3z8R5D)Dr?v_osI$R#Xp%csL<}t9lA41UuP8zj~PxMZ^l4r#&f$ z9sb%sGz0|cPK;Tf23w7@F$een_iyA-Pl*-;Q^FD9s0~3s*#B&0ANN`nu@H=7*@!?R zT|N2(aay(cNwIlxNU;-)L#01ioFm*9lrKR(UJcHxa>_u#k~vn(_qq*${zYQi zf3n*ex;SbTmaxvb3XdW#>r*hny8Uy!)t3+jJ#gxEtKWz6DEaa$C*C+*>QBY6+T1G~#U{p^QFhE!cYYwt^v-9n}W zw79Vv&*WPxbA_eE(#kbUvxD~3hRdgf}!_S1sG#Tqh(#VitBp-(_>u4?9u z2S#w<{lAXvu`UNRL@i$BOs-0~Yg>2W=|az2K$4;HwOkc?$Ju4$Ss6!fA^}nYDp-6- zuzePT}h?!Z~{zsktJ1 z0|K!YO{0lnPs)>&>w$f1$m6en!VO1iVL!(u+8hU^FGa>TUy-)`uN}%0WVN5p{O%FY zzDwA{P)?VG8wgN~qdpz_cLo74Max|yk8OE{&cDUaM#6$b+!l_77MW4PtR8-QNBG^03yk!3apyK}=Bpi$@irz>$;Gk!47owW?+I|Z*-KX`I zg8EL_F^%RUiFx_{P5Hv1&;+}KhF{xh1jp3daju93Ms8aCimAr5*;norwaqp&rqIh|wk z6!M|(yuveI3uzy5kB8ONv105BZO39gx~U0Al{zG?gpibh@#9pII1Ua3lMz_mD)^tX zN^pHB5xJA&MA5T$hqPd)43SMlz4;{-w}IJ#S$P$?FX(76l5nsqx`C=R`BMDDavr?X$P}+X-qO@yH)q9Bj~WbINg!j?Y;6smShOE{vSJ}&$s!Glqmk?X z;PCE|h8OcPY}I(j)Z(sQr~EXFIXQ9!6RdSbHR`4+@`Q2g5wdR(sQ^&OB-qGMI@$Wu zygL&z!prc~Ak}|{W6Ti8T`P`}Oyjuy&IT#kw9wbckC-?=&{7>E6)?)mQj8qZBsje= zBAZ^_;>y`Kgcm=ESrrpuRP@G@2|9|VN}SgX4$)N6wtUmc%2`LWxHP&gX@LYqPei1_ z{d>=*`Oobc;oP>s#iX$mc}j2*g|x2>8OJ}jT|TTBgFu>b2*nf<8caIYq>k%S1Uexu zP%{*)lp==2V#>=MHi;(au9>qNNt7DCJr8@83{Gq|xv-$W z8X+7W*tL_mCet*!0qsW=$SM2bTcPhviHDwZn*bsv=}i3>xsO>&ke`1cwTc{H=dS{! z1$a*cEU^0FT}+=ugW%&cjVCI&d0otgw3>qz8oZ{h?pG=HVDcZ)Z>sqVGI?xE8@Mn7 z6Gm04+#^5PqeUN?e+f$N#;LiH=BR|kTBeBLBdgcmKrrCbMz88-Q=kgVU7ep5w(QDjh>z{=SbIbHH? zCax?i9oQ@|P``??P$Aqir^DPR5DupzOd1qsfW@hO1L8ix`2wF=nrA8^wpCZ*YF9HG zpR*W5;I6^UwSfx0ufMQgthgLfG#Z8@G_qY}kdd*ETGs5UWU~Z@59+ZvGtN|a*mC+^ z@q1nAES?Xbj#!2GdRTmgR3hrCA(XsnMY5Vz&~+hG1!vgxh;$aZWS)T@%=b!^#Yua; zL$l8I$6Z%w18c`S=hRO0`_D=g%0NHh`IJfQrGB0uNaYo6QD|AN8wr+OQHNI90V~52 z0wrfrsW_NH3Oa@a9z54r8v}GHEZTj3opy?-!2q67WT*u<(c=Y>gGF*;){|^NZxA=$ zVh>a(G>L-WGM0>~@GA-^ z=>!**QyE=wSqL-CzbMPJlk(B5aIafk+-djjNuG!{99n1eLzuAbKQBVRV&1n64iV|@ zk-46#97aTpbM;g!JmiD@Md4UUjEWHLYb^GDFzQsDedxrxEo37|8H5!@n}PXP>#t`p z6jUG#9t0ic!d6e&WgmsMKi@%7BvA4dc<+ascv z=w70rz?8+~4h_3v2p{?ME@vz>>^V&kQVgV`bd6M|RhGUe|IL7a6tN4loG{6f zb_m4Xk9=LLKSB_ih*q!Cb|o#UzzN<81gjvwE|B(f_IySgEfLUa8<4NbZl7|3Zg{vt z`}g0;;S63}ojFs)hB$u(or5n^U}A0e)Gn|>6`foqG{NSVd0@!;8vk}3HC*>nDNuSz zY0hLGQl>L}gMG^|BZZ_)6GOPZ&Tbp=|yr= zB2#3bDZ8@*pdf(BbPT_9`C=iNs+v|Ri`m>M?L_Ut2Tc4AHu@AhGgbCDjFr`dS>TKn z$s$Yz=Ll`SSH!t~#J~9~KnK^16m=3Wv+{me*D67bx4+BEKynLRjR=)B$g%*RQG);+ zbQPQ%2~L&&pPrIavzU}tV1F359_$`zrsQ&T#N}6^ywCp6Vh2Anfq$(Z?J)QWfhbgK zKBTr#0iZH!1&ryUcRC9|yVbl!|HVycy2FKrdzh$A77&>zA-FPMx0z$=xNeE)Wnv;z z8EYp-J3dutreznNy!Px?_u|ebJusISfZ~$bi`JgTM!zDlo18Hdt1$c>x`%_4=~-OX z0tZqtfPc}p3Z>nl-2MZYIZG%ztjM+8#LoksMf)!$ysd`7jjY4~I>y*o3Kp-sDa1k~ zXv!EKr<@bg>Neo-2tDOkWK~Gz7VG5O`-X(%z!&mX!`0}^(TQ!s;l80Cgdgw4vM0QZ zj73#dA4kp+)}!8c81jV+`71*k1e*EYavkp;?A)k9(z{TQ)F4^~EtuI&ScjbNjnX2l z?WIx=iXgp&Xh^8%=_U&_pMa@NL;m3S{fNWaK>qYjham)8lvAQ%RnU!F6zQ}u<`jfM z8p+2KrZ(S6T}o7Zzm`>r78Ccz)Akdv->QMnCT4$2zuqAquXh~WP)=!e+>|X$?%zsU z2*)^mYNIvK3i=SqdK7x;lX-)>olmD zc#iLVw_0BE2>-rsLwE;%LP$NHjyqHw!iE^5pw8O`CFCb*xsN>0-grkA!U`35x0xm< z(KR?G>Tui4O<18R?IsxwI4hCU$Fh79R65i^{EpGli4t(o8ntD5yABM9*+c}~W%8=a zOFx2=h>R|9aH1|PQ5$W7uJJ3D!o+PUL6#ufdnb$pNbGG~OO*gyvZx;q2Y%$4jPvgX zhU_&ZEu}>c?0eBJPKW&gGwSUuKWz1@t4t4P@6xP+altR(NG{aL>lFqe>xFpXGeRN5 zsBp1Ujsc5!{Dg(iain$1;>dO+KEK)rF2$D*Uo&Dy-Cc9yPm42Aocud=FUB;>afNZ! zFP}OfhS;DKomeHU+Lt_@s_`kj3o$}dy5564!=tHuJFP&70{3)Vh-NP-&}G=A?(#td zy+*A}CH=>f=nxkbIHlC!D?Ofef%zc=dtkHyup8iSG+kOij0u76)lsKlM7AyjB&asM zS3IxJrd0`*mu}4ZN?|Z6-5v`6Vhxck{l8G>X{FL8IzFl4_@EDTw;Wqsx7)k()I6>$ z3(%3|E!FlUeYCIBQW}u8F8Ay*1LHel9Ge)g z!-gjZNBeaJ^WHW&h!#yaMq=T^pw-MGL(%bL$kYuDZ;v*gTMH1>?w+NVgIJAxkR zdx+?T=l+H!zNV6t`cL-MqWfEgn^VdQ|7<3B+}NHy*&~330i~Zu$2r1VGkQbrN2yBF z>F-{d#;v-l^@4f&rvh+4*Zux=;;{ei0RF#zH<|fz*t5H7OBxsQekz z!W01(S#lu`)o1R-adomB4!&wx$#APN=OXWQ%1vCIJ6Q6Zdi&=K-(;l z3tL~2oM917(%2h3x}%sh;(twX!cLma32Bhu-D@#fJ|MJfjt(^NkobX_QL^bLrrzKP z8oV_5S2Bs^{t-&!WO+ic{<4W@ zst1g+pJHUz&spdUH7=J*EoD*ttVy6E1Ryb3bfG-VApknHC8Txv$_!v}EX`~4y;lD| z^NbdMG?2=D`3a^mfOujKc?v`f(hyKCy)>mrnb>RYViP$=+Rg8lME{@*V~$LkCR&0Q z4+LRF-HBxp`RaW)HYEHSd{bd8y)hyQPH;0S)!(YB(G48R;O>djgE@O)1(%c#mHS{D z?iO810J*PawNkARj7J21Iu;b>2`}A^6|jD`V=H$!ZaA#e)9#{bG&mVdM!yz+iff!% z*I^Z3x98Vu>N=gY&t7%Z74%tefqI);=7O(Z#TUH=<^J*0<6#JhE=;{`^2AB*4|Q4) z;trv0zK=2e$E)Cy4K8j^!>(4n9<-)zrc=$Z#)}(Xv17i;>^FsC+Q0#S?h}KM%XkiP zZ$==eA_n*(@=23%3>T}^m!Kh^$U+NSS5!CMzc{!2D#H^YhWkzRq0VsTmnuW!sH2^D<+`%6XRKI?o$d;d@Q!QoZ zSavxJ(I>(5LazP6mcj_|GxnS{HuQHs@y8jyo=B4l@#apMEMq7H^5_GaW=qY`cm!ej zSMtV%#l)bi;vB^FDvrNqsmwq(2mPFEKI#4#zLq6h~ioyCRFA5 zQQ}Ibs9S~7Q9ey!G-GGbf|?rIW6*xOU%i$tL<9LntbnATmK|sWi3+Q2 z-gb9CSyCT^yV|@_Y^%^QwPLkP%Z-8bhHe@dCaAeo|CC4H7XSi}62)<|&Q9r*+{yUm z@m_750_wjtPrB za36C>vTJ$lpJyJrp!Q#uc|r{Fr2Ghj7&QfbSE*xHvWy;59N{idKU_RD{LUaCUq+)f zAnp$M({SD#UE0CcOsqTv+Ax6QnPWUE`MzxLzD9&9RRWjI(#TuRe;J?u+rfzF*W=`; z$QNp4K*&9VG%M_)*?8>_h*l={sFO6L0T}!e8{j*!hx0NqGk&h;#@9>*%BxcWDhR{Z zD{?QG+6BEhIH{?@*gxX&v=7XVTr^R5vS} zI|Qkg_KYvw+7R2Yr~^)|G!OhM`$co~Wd(Bw3hik znnoC1H3D5Lz(tMOXZXPfk2(Kj&IE3SvwHU~D8tJ_R80cXlx4udSJR4ewE}c+pt&&R zT}cN}^1n&I0#jME*4Jv(pA;UMD(9ZXK0Kp}DlMwKOeapa7yaVW`OPK;E>MGm7=}JhwmtGEu1m*e84Qg) z)c}nWF6XN2CCW=fXdciHDs2X65&sD62TK}H&rXD7B5MimE750I$`?_fAi=)6ihkN_ zYtQk(LhoSv2%?U%x738GOZ50e7)`9D1G8*K$c~xXDvgz4pRk$u8Uas4vv*hkVL+b0 zm478~K`Y7P z#`%Nbvkv0Ieo_{J-EH}?98oqx@?Zz{RT}}#`yXm@OjAA7nu_{j>O0KW|BX(%*}erM{=0y>YjrZ(#euIrO$WS)5|4@5+JC;s zpR9^c52RVt{2cC~pyLe(S~~iik=%KfeL{|ucscn^AxbLU@H;;!vo`C(V0bVu2E1tl z!8&2Qpa&r;kPMv0i72w(86+WUCXInFrd^}Y)A2`q$1{2u7rD#N^k{=}0I)Kk^(qY; z>VLH(QcF&A^jTWTxnvm1y?=rD8A`t8i&=MDh$bOrx(}6c_+_6F!Em;`>&s>W9izYO zg}sKb(W`DSDkjGFl~5esXzZuj+P0yBuQI zRAQ=tY%ED8>FML7_aFWLVBZImg$8{GSqfci!Yg_(AIY$L$Vr5dY(}L}-A}4JWxaaN z3a}De4IL34{@>ZF5s!=>xSe#Zp?C7F&_0@gU3Vi-W|uQF-U+|ZD-qVJFN@Avhu?Xk3BbZKuSjSk}SrmC%|M~J*lL^+B!{;r-OcmOvtJ8qvUJe$sV-jDCrNa@$%%JD<}!eyc-#_8xvxWW;u%eUMU^1u_8| zA~7VH3Smv3zGh;Ppg(2WQd7FwOLX=XVSu|rumq|z*ta|*sbRkhvuRYG~H?h z(cId9!=a#&#{+mC4X_QE6_A)({U6e3@^7g@Gyi{6!$ zr;6!?zskMPG%A*E7*TS=fQM+HB}!Fj3$REKSaAg7kbxM-A^YrDVjFhhLg2={&=Asi zo~zyq7b{j^ec^-*ukA&+3N9uky?|5EgsuBA(lNT)M+dxKqa*k779EX+-5B0|<^Rn1 zoJXI7GGa&*0{CMJgCb@iY=har1+u)~dEC)=;4b6sO3}zBLJAY-3TP#tl}Y;$%iQ=#*hKE|9@8)_gV&-i0A^2Jp~-{iPApCnq2u~gqStstB8qAW)D1?^ZPpiW)nFb14){tsUAYwqP(5aG!|`Y2X-7yTaz#~+JS z$DABuE^oeXsl}Bf%I;BXBnn%--ZMeGs|T(|B1&|H0x^1ja8f^6$K+C zrVtG2B^9RV)7TAQ6I?TC8$WMDGZO+(D6)uRvsDU}iKbLBYhx16Y?*oU!8hE%wK zala5#Xf5b6o`|8bgztYr6a#*mOdc0Bz4{L9F`c%t#?X4AT>GeCDu;Y0+}X)d^Oh$; zwR8fMsY(_q^-tQW?*_9Wx_FV-hBRA8IAQnbG0i0ra#XqS%KgD(GG9*X+4xOnDJ4tV zfmskP)U4Kd9lnk?|1Rk-9I3XT8bb3iKIn#TsSckN5t)W@0_E6Om@RXlLkcubcC}+I zMWf#KLhPZgP)MG&1h~>%U7Bh5xm#acNQ*5=i>-iUL z6>M2fNP^9ht}Ij0gnVz@TppnJu6q2G3F_MrpoQ6UDstu25W+$BWOm2^7HbYK4>F3= zw&IzrlgPtZT^ATt@G;+{*3PUE2YMg;6jTFeS`i#b(DpK6I(&>L9f#hYqesU#4fw_S zCYJ1Edm^9|P2QFra6-GW0g^^ru~ZBxMHiJeXW^xF;&4UYwe&8{m5`~t4kVlitjq;-s zb()X_oHFC_xdhMmdGUR3^I7_hdws8Bz(>1B!Nn1`307Wg(fS0<_|y?<*8% zGODc@_B3&?$OuiObZafU_Kv(!m#Ib!8c1MLGp-6W4B@s%qn^}FgLF|S*PxAt2;341 zSNCuMfR6PFy%pjBt^-C-}8pz^owAB^~odC7wdq>RwSt!5fdJh)rbFEtTdU#d$+86AX zK}#t3QtOB2=lK5ULCzi{ik^ITm{q1bsk;9Y6Mh#pFjLITFW`FzvTO2bFjuuy_|%9@ z@sa>PF!2NFc!;b}W4Bayf(AVB=mQuf&!9!F)SW&Tbmj2};s-usWuvAe=duVrRe3v^ z&qmQn?2_H>J7#NjMRo(9sjCJz!Eg#y$r!9*a3rh$bmkg(IHgQLNJ$ofrC&6AEallR z_WiMD5H2+^2a233huw-QYs_HZGA}BUC~q;q!%@;#iN$8B&p?Ou0F;dtzyq%Qf-sDZ zVR-3>?(qabePn{`J=H~DV6yXkUik}$H3bpK^9od2(+a^Fk(gb+rm}pDZslxE&@*Fz zDCZ;sFNJRAn+Iqsa8qER6WyHGDXK>8BZARt3aY@O`HLKTUi>6wkF z&ki9`LY|sk*AY^lYW%a6~s_xV|u?MmNk>gYkB6v;9S#m?d0$`X@ zr1kn(%OvMH?glIw&2XiFLaSNRr=&)xn5H~68kQ=Aal077JmBgNlmwnCHM z8HZ6vwO^jS7KT!o?$pRQFYKd6rS;6`7r4 zEYKpdVtj2aaR0gDzj;$slYk{F!5K~FAbJ`}j8x|CLD4w7W1)HPCZ8d`!-QfUG30ihQ*csCh43j|AEwo&< z%BTe0ET@TJl*~m>DKayY$n15!fJ0ZM2zPMRW3smlXnG>{(5swrS%D1^5#AhkawZLH z!C$j;&xIQ*r{6M5h&;zH#h6Gg!aS$5pP+^vRh=Gw3Z+6~4zT}xelD5*whDV-vfYJa zu`R_31B966GT$XDtQu8r9OeSVcy}#dOnV`?1S`l4{P=jyj{OUf#E@Buk@n}f=Ev(R z1vK)O`#G~;{LqWt#I`M~q@^>_HwIy#U9eIJx4Gc74@e!oijo#lE=;Q_T*U4KX&{Q| z3chda5J-uO5BvtO_-(wy4tmK(>m>_xy+z5~iDA*SD`;h7M;%JsLc2e4vv}&48|~9e zlYiBJ?2)1rPW`9AUKrnnPvQ@|1j?i&p|~x$s83c5=dGvSW9+@BL-)@dN?IAqr2!H6 zxMi^&_wR^p)FSqeb|Y-oX4om`WuzL4mkk@VDq$D%{k@j z2FlkY#|H}-kmTH}{D}(|ja!;2Ubbn+DlFCSU0QSm=-**M_wSHO)#1pLTFNo>`}lSY z0W%f@2Sp+6*>5&6j3Vr~2Qy#{p%73|m$=q&!ImOwaktO`Zom!`L=UehOXg(nprDo)#fE5AI0jo8Q}u*E zdA37C|6Mb^CA~Q0BvWXBereg_$&!FMm@n>7Hx$oZu1j&aS~CgY0xbQ_cRxKH8xQNh zZAOetCikL=!B#e#)uRGC%!Pe8wYWH!GtYON{f#qU?xJ{xaZuLtf zZG+Ofnr-ovC)!DuT_jP+qv=i+NbZEo;ZD78Cxjl(W)i{lH*HJ3jyvtP=k)Zj&|X3r zyVTi%f^0&rDsbh6kUXyW&=pDDsje0*z7ZNEN&1o#ID&UnX9iREx^3nYchxpDdaWR{ z#GtZ!6_ZcvDokT3aj5`}st?=mnoEL@ffh?0^O*dTUO9eT;2kLCE7fjisUrne)^LsF0U= z;{drrZhQPgssfIcP;z{4TX4g^l@R8Rnu@I0NTY+K9w77dofZe+$=Kpwy5#LeH~G!& zz0Zl2`D%t1(*ulgL1h;dn2YT_$Mch4_?AkR+v8}+ zxv)7|$~n%S`HW8)qVP0d%d{flSb`;J*8V*2lHEyjm|^lH6K_r>QbJ6 zS7jB=6<$6s*;zqLjphWn9xk019ks?JWa>s-)F|m+?hg0q1CTzAc=!N*Seqb|MI*9t z>c)a&fSQS`LyQ}fVXjzoNq@3m6fN9XDhD~IKyQoig*+I8(035mN+@u_x7^~Zns`WN zKankTHSIN)=@%49D~04;ri!j|5}zO9%@5~pj2b^W0v~gJ!?3J}!DLln*IU*%b7of) zs1u7+!OLnTy;B;!Th-LFg%gm-rcuD>xyJJZV4rP6d-MC=Gm;>O2Y373x~Nw+8e-lf=e_5P)e-+9gn@7mJq=O}24+q`a~KTdMu9P2Fj#U_ zHz@|)*B=b3#8}qFhJaw6XIP+MVqs#Qx*x?A(@UTPWIlr&j6;ioT4KLOyVXRM*#4G~n{NarRbXmYo;`={sK<9Z+5Roq=%g;V4 zBR%Tcd@8sV^0g>gDx8G@qPnWw-3wq8mHskfydAJXRbm!m7i)UN^Wa>o<7+k0ljKRU zY<2q-*LLiVD%AJnYgsJgci6ljs%ukW9n(_fpAFi? zx317#8jJ&XX4?Us=48Ogt&17_y>aQpp3a{v)``_Vu))PNl(I}!AobyP1Twq^I|I5n z3Xf<8`UwX`Jc85X!V!mYI?Zpv-<(wz*;~i@iUo0DD3s5e;0e1S(G$2ZH_x05vu`CE zg;D}SQ=JlpJ{VDC<`zFEf<6$XfX0^ZlasAWcnVnFk&@CfABaN4JdA;x9`EEQk|az} z_H9cN=~<#@Wo;?_CG5ruH_3CmH-IyJXXpxxC}QpO+=^hg@`SWfV~patS+E&Twx-2pIYpg>t2<n}Fu*!NF zs!@YennH_jvvHmle~bWvgihcsuhc(LOaCW({xS)gq849Mp%zMO#3;QpKQ_MC<`_fO z%HWBA!Jgu}U8o0wj?xRu2tUyH1YTcS!p5lZUljr&B?56xWk<_5P<2o_Fdbglge#TW z5(|8NmHLN`*93`!K#x3S@(MP>o+7bXr~@Zg>dJj}!2#U014>sOds;A(vQY=E2?X|O z=a$9e6HeQDp>aV1)2l*QuxP|LR0J0Qvt>NeKbuH*#Ph+N89+M-hT#ErWe|EG5|x;< zCm559c^n`e%uy7(yz0af_~_-yHoN8CTc(s!um^Pqng>L3lz4mX!^4V7#9KkOhezCr z;*_yd3Vyp)u^OA|rze z?WViwZn_DAv>tC*6}Ny>{Y5a@!EZY{U42qVMX@xQbguJwLPAttW)t?+Ik41{X(mk3 zSpl*l_kAEZlY=UnPvaU-$>D-ZBeEn(Y{?SYjAb)eRkMzvn6VAhX0R`oLJOh_nX~Q_ ziJ_b84g-R_+Ep{r>iKlJe$>G9O^-d#`#u(dVGldm*ChFgDU8*ELir@MbNrx|Pm)5S z7jgpMQ&I^#Az5;d$4u)fT>HTR1raQzrht1mM(c6P4=YM#&gqc^D{4##7s@f&;*O9( zPYpF_!qd~kuWEXFc3^U#BC~SDNeh5rivbl}6=ke211V|XAc!%9zyb%C>ivAv2ZA8z zD;vJqsg%qRs)+o)PbL7eZOo|N=d?$HHNRCJ9&6Mkr+DH|Jn?)2#QVv@eEL*00xMUf z(+c2!9|RO>5KqMM5s=i9u2wFSHDMpJ*$LUd(?c0K@H4Hlg^eupRFx{k1)TmMH${ z2zCvu0rNlEKbgH103WzqVT2PU&gg-)7Fal8MJ;HG40wPYp}`U;TqsGS1xmz#0l`5O zG;Dx`j2*au^>?ptuQ7ff*a(0@9m&=~Wv*ysQk^o>5-IXHwnHsl2|079rPD~KMOhj; z%~XX(%L(BC4P%>I)`3Z-MX`o%{_^Fad-$M-4$>ITitOf}d-MECVJMU3LOQ5agc$}o)!}gM zA~SD897P$ihzKIp(U~vDm|vI;864LTKd96YX#=T-4HeWc^r3iiKur!}#~KiSnCF@Wwold9I>2$eL$4C)|P%w!Clc9CE0WADbC_dp^Mfre6iu!2iNWOWC2=8vb z8-T9MC*6IkjlmRIo8JwH7?KXW#7kGFpO^z?kD z*s8YJEWEg30R+b5xS77&mD>-S&1SRxFqupylWA3RyS?N_ZxpVKvqx_WNW)NQ&M=(r zM4exbGZYNN5J*Fi{%}pls-{OAAVESeP+to~D|*R&A$qCe{3Ec_5!lK~WHYk}CWcXX zS%A*NUcL;#4xJV3<;ww()J-xdhQ**}pfH(d)DSTbgDR2(1xi!^oB4_=Qi2b#szYHh zFN4Z~DKhgfKNCiE|FC2b@QwU{fA}$|8AG`mdqO`9%7x%v$bOUf?LciI8xFOcGH=aY zr}}A0ld~C@`#=S}n5I+xE*k1G z&3x+ZO^yNHKq@bEJ0PTmRZUS(AkXvWd;tQ|?JKBRJI?8$Czo!u%~SoRB~?jNFQ>gG z?Kx@Bhiu)PK)Nj)$qkcb%ItV*^m*T{n5aHe~GU^I~%i z(&rDzw)qS8wF9#psK@pn!g(disyrz?dQ5Bqnn0_XT4oN2emSp@ZJT4vof)C)z9c^M zPxYM#0a3B!oSL^>XbtSVg6uE4pfzV3*Y(U=&l%k|Pqr!_?8t*1=MUIs0x``Q`RJ;$QbWRYQo~tG6G;6XmyVpi{9i3j;IxsYDeNj&jU@fm3aO@UN$;DU zH^bTtVEp(H1O^ma*!!lF$xb+Lu_KGI z=R8fimD4iElw%1(5-TEb{SvQ7mn&6@A@y=NZ@O4_A%{Q_`mM4CHp>^aGPcA~hBmG^3p(*K+pF}PR#>%Q#WG6i?m$?i8HnhSIS*X=G z=lni!<*DD*Eq~XcfZzy~>O7xw`kz2c>-3I;za)R_=#;I)I+x*=m2$1DnCEAcHhE?b z&&+2J+la{iIeD73BD>@&$9iLn8uOwXSk&-o4Cb6Xv+?>*>{vRvzicLnGJf7-V)qEjK)*(Um->5Qq%E>c%czAetc)%T)7E!UbAI%!T zO9Zk%1|lnPv2v{(hsTc|d4x(S^(fAnpP56GQo5q6Viki!U?=@#QRw^JJra+XTWB;# zY*U%0zmg-L*^YC3g>hDTtda#al}0y`XmYy&rItK%LJe~CK6;*IVH@9g7g|G&ea){+ zx|NhbLoK;U2{zP{n|w}4B#{L4N&c7m`~WDKr#^rE4={`Ur8|@U-z@*W>3= zu^zef$ZGH!yBml|BoYYJG%KsJt*XCs*rv5un!b@+%s}>^0EW|QX%f9p+j@$|b(IoX zwoUXm&9tu4Ht*XGYS(&7k2#ps($%u|VVWR(TIM5@wNJ~u6~u>anuco`u4Pgv=(D3z z#da2LYbpC`D%!STv=_K3w6^)!Y%f(XJEfjCOE{vID>Id@`3yQWnM@{{3+W8tO(q7! zSjL-hL9^5`NHcyKg-|^CQ&@l3nssu~ihc3STj8YaF-LVy4jW4EiJw?j8gQ#5_6(fr zCzVPg5lWwNs?3ptfAko0|8Td)UFHj_XjBns`T=Lii;4z+V^*{RtFT_$0izA_p&$0Q~^Ap5hQH25$s{3k&%@N_y_& zGpB7)Tc>k+?9cH-onLmWgca23Gty(7>Ti#EtlK^2vny0f-4evb!8RSSW5YMU&~Z}u z@bCbW0R`L;IKV`_!wfip$uNQnU?NmapD>19fNzXaX$P#p;DQI%Cj9;n&?)x6&@Dpvau8VogbFp0P`)n{+RWlPQxf$e&$i-qhXsqXFPA~L> zs76B^41!*cEVb+yiKBn8Et~UT+Xu@UxfZ7B*Fwg=W|FmudBFs+FWy(_`&*2CITqaV zo-WAlFR0)fFpJt?ZTyF6T*p&PtWFdX>~A8LE0 zUKHB2*lZ&a$TJ*tPVet4g}&7D)6?_gpwkcxd;EuOUbyw#dba$GaCjj2d4DBP9|g(iF@AU{Yw74(?8pp?aaK@vDhp& zi^;r{N-w4Q+pH36@lqnAV_b!?K(Uo7^6mB_mP8^ktcq7E;H*}+niqzsmWE%aQ_?Zr z4O{LDvU^`@niY;preD|`p%%uZP7(Xfs``0kQde}%SwlkQkRAzlfz_X=(+Uk6A(0^l zBfY4iNa6_y>FZb0AAyxnTq=b|9}34&IzE((cc8e0I+esCr5}k!L?l&qFd2LXd-DAe zmC-ZY}2tVilEX=*akb0%A3~*YvnrHMElWE~TIPwq(PSI40juh_ zK|`Hi==(w;I_j`VXVjXQlh!?XceB{Bsl+Fo)OGGin+m*1dCfkP?`T1izi&ukU&{OeUy+g8r@Mq^WHw0?D2i@|=R7#{u6wLYf>Xp0W% zwOlO`Zaz2^qF#*jg=o}3E(~Fve!3&$p*_wpQhL$%D4~YD0D^P&s8Y)XGV;WT=u2;8 z^rY|i(u*Dl=||tC7d;Cl(S;uSeQ>GbiGTDf5>G6ia74c(5D{{K1d=hr7m4dKJATLi zj_@W(?Q4&L9X(pO34(zR2-z#%Zn} zVmd>JgkczlXebo+sL>7K3CXB65t2-b=A0APf{}fBYYbyD^Ri%|uVs196V*ZsDMM6) z0ExiT^na)ctV&1=J(gn$CK3jirbS=_N)YO(kdPL}-34($LM+}lXB4%hWREBOq%i(? z-kjg)LP)kBcK#9bUBmN|7tR^FFvFqJc0uiK+YgunO&mLVY;hb#6LK`E<=TFDKWyI; zvMDO_3zmle^M3mG&@3=~ACk+FbV4!@IuMDWhwN+gCDQL`VV#`)L6>7|DL~8BseO5v zuiroJD`u(m{`3x#dniIAhA^bxArYzcQg>#gbR2c8YDy>|L1I{ytj0fVgW*sOcz=j^ z@yY+p&@>gk7X z#0W{e@zhGh@l*(Ebzvc~bvov$W|;{%)Lf7K>nS0g3dxdlHed^*VJNadKl~%Gh4IW& zCkT9ir~LNtp_VM0AbA=RgHE^00g2|f#dB`=(h%V{iG_xRpYxQ=Q#>@N%##C3Z4d-= zxmyVfk98ryIQJD2jl#7F!!Jdo_mP+`NfI&7Tom%Wb?WVUF!;zeI*RzrdeqgjfdH^d zqXsqWv^$_?(JeiIsO|Z88EfMYLwX`l@#&FiI9F=fR706wDtfe9xnlQb*C9vzd$F!{nJjc%Hj6ZB_gw(`r$ipn)E$MAB&9(g6#j zmP{*oz7pmoo9bU);!99H=l3FSWSRzo%gbh%j z!%l}Fm^^ZGFX$mDX;f3cAab5pvp762i(2wLuZE6RMOxKrmHUjKp-2?P=7bWoIYS{G zibv>0D4x=z%||bjbQF^%rn$(wAlhnW;-QvIW0Gr3GoMiz*cR_pU@fpXy90)ko0AFTIi8!wAiT05=$hpgsaEzqfFCZw@RUq=jxgj4eNA@ zQAJk8+-0)Oh-rHCF@MZDvZ!STl{&~4$2zB5tkbCu+Sdn)MwSMRWt9LV%MR*Y&?iFR zj9N0!RAFBm0ST~8m_-HIv)JvL)Us1yU)&0P-`%rXHVDLR>_R6uY}`anQm(5_jY z`+!_$R2TQ@Qy>~MMj$QNN|0u;gIRFj7~hV@j1h=l0m`xkNXwT40z958wM@e_{U;!){VOBJh$StniAR*gWAxugmaLn=$pK2ZmyN1h&=TrxySidu3~@0%x8cI^eirv|49JglY(~rm64l4l-I}lsbFnmS zh3qOjwim2fb(s9!x`iUE>{_v8jH7Kl0_KF35H)mb;!n-IiFgH9( z&vpz^*-4LJmU`;3q=+4dVr846JnQSVX^DqooQ->Z{aS{AP5yhDwQ+CQ__G ziXL!)aR3M{t^fiWM@#{N_5Vns%+&jw2tuVI%!DrD(Ff8n>>V4RfdwYR0$$ z^rJ8gQBn}u?Z9sfV8!GD61pq20@9F%A4q2utc8T|LihVXk#mzx0zvohm+no-4U(zH zyoVA#mcZ#>5&cA*RfS>@4+jp8r(#fDr)fAQ5NA~@j3GD67WbTcvy`!f zJ|Vja*-Y$y@BTi zCw_0S7T&@^WQ!nnP8kD(v(mrAJGUER6pBWoL)Icf5C&PD#(KA@KXa25GpeT60kF0O8Ews@a5naZS7a`*PJAgI5A+ z+Hru65geHhw)-%li267EKP)f<86bJV5>u4O;K-6IfPe&+DrWp>0qYgJYN&iG2yCh4 zszC;s!EfD)s9)5m9?T->G3s%@M_m5YVb^o)CXf%zC1k#R4jus0-o=dqw3 zTNkUVyW%*Q51)mY4~a%fAM>FY^G04msLpk&zgQJb|B_Nr>J_&6XdwIh%D%8{tI^n0 zzYxM8J?9D;w5opjk{4uqu`fUIV<3FeV<1FUu6-p2DEWCV-Xk_#+5Az~2&IsvC;=-sX7GWXuqtR1fVI#3L5=}7gtr3cW z>S*-xFD12&PI>|a=1FhF2#iPyflUlzD~awqI9%&m$0ZUM)_s7vd?XCOWXXXLLqO7{ z3#`Zy*t1|n^rI)SFcR4&Qcq3X?c~A>I-Sd8v>7^uK_$Y31R2E%+!SpC<Ztg zwW@A4W;PI^1A`ar{Du_Z`~)~CO=Ajrq9b6Rw)kjRgr7vgAqFrRdI=XW`XLpcfHYE2 zk43&Y`0gMGIu0K<9&VmDGWfo`x%&jc`R;lCp!eVReIE@y_dMi%p4VcgSi%I5j3s1C zIn=dsOoAkt_<)^|-}0g^i0US*i;i=rIQnm1hdmJlQEixRxX3Xt<-Y zV--7Qv8iSoexeL7$YvYQ6rL#}woSpfkMsv^ezW5LKMYqjHrvZitqGp<0{s$Xidyc@ zRDvb4J5Iq3>(hPubehj@_7SP&ypMd{7X<--f7cZFOgztZ)I=htP3c}@MNbiVPTEN*TNo12SP9s1|3(6Kkgb5F!4L(BGnsTi zv`0KkxTs~*dT2D7tkg5aOCq(xJ?=f*KIa}eOBQ(o=3fOO~Eg1?bV-YRR|J`o2gc z8j(;q5^9MRbz8>F-lLQ0NIj6$nFlH&(_?E|rMbeWCEF&>rusJ|+NfxQ5l>%?c>2T@ zJebVK{KA-olk@Vm^rUYZ4C{y5IHc5aZ)~G4)Jdfs)N*er+_)HVRU zzKF6aDQgDVUC7w!K-a|+lnSy*ENl%>QkgcgZZfFl*7|RLF#nSCBcXnxG|j>H|3)rO zQUpN|e0N{bXrfN>@Bq=U5x6wq+OdEuN(ic@%ay_mwKR3te9RxJsf&a%N}*6FyJ4;$NB>idZuU?jX0LuumRqCL!@c^y-G&%>AEJ56Y*dmN1 zVEqLOq)6cbi8XeBb@ODN;OHau0KunXZw+1F6Zz4drf%MSgDJqw?T3-j;c zL*=1{Y&NC4yX?z*MM=|aM*pU9ytPD}W~pPC%-B`q1gjK~RFLRe&nVC^%D5SARUJh~ zWei)Eu9CaL%&enlJ)==d{pnNpW%fKT44(ufm1Pw4VVeHl3mPP;9$7xlTlI--rLPU zv?KjeF>0VNxbo=nU6gJZ&^hR20L(m0H?)-k zhn(<=J6JfnxHZS&L$JQ$WyIc-jW~FZ83}el{>@WH=bq`oAIq+j)D3eQyl`gDbe>#j z-EO7SK{sV>g29X$l1V{0q+$RwrfoK>H%NrRp>^?~QTJ604}zw|75e5AhKb|N8vx1fnNAoibicALgbQ{cd?e z)PWeDb)E2aAHCMqo`FM{h$gviAhOP&3ficQ|IF@rx$IQB+}p(0$>+l;2u|y#NucPF5;&Rn z_MfVp-U}TbeHXeyG#pq}4z{Fx>0e?eg(WOJcFb;eo+OdVdtbDaOKDl?$uQLw|2viyGUds|fXqoo?zZE4L&OI* zbI0ohduz(!PTbqOg;oR3TW^_nojsMQ4O-EssWzEwf$FBh@-{oL!DG(=Ixx#d39J=P zF3m#T##$OP#dSE%xWERA^`f&2D&ssct)c>c23k8rG1A9i@8iI#p7HmcW2%iH1<_^M z)<`OVol{i!5=+`V6V*f5Gmm#*BzjExaIh}3R=2c_(sd)m91|nhmVpN75{Rc(Zm!62 zE2?Q<^%$VSugE4>EfkKwXlvgfAho?niXBt@l*TjqTlb#e-KdFqX!5lYPsd=uw|13C z=}b^!kWLprP&SwsuQ?f5KW ziEqSp6FGxKH7Qqr(6!T%!MI?In0nKh23CQQ!Y1ym$ZM%0B>qpI zel1INknTQsqhqTe!>r_0k|Ida+(`IcdFab4iA0CnSBeL$Vm(CkFZTw^Z?zt^MesP5 z$;e1o?3WGyl=_`xU!>xv#aF{(I|rocia-0Q;wPnK{sb(tz%z2y_(x_nf3CMf&iKI! z1aJ&g5UW8JJoYPLO_aNQYGw%>DD(d)Pl?ryU<67qIZ~x{>-8p#Ei3L!F^L}#u_7LZ zZ&Y2CHQBIPVkTdd;|3-`@5$3)*4F_OcV&HV%E>dKP1M9Av$k5=w9~A7S_;0mJIT1Y z*v>Z*#*rab7U_=1WPfvJf+DQ_9-$-b9376XzjV<5%c>}dbTj2=dG6@o&N2i_ZCSyo z*NiCji|%(g5N*GZ77e)^XAsM&WE0NfTb7=JHBL|$RSumZU79}jf&cG;W<L;@*BsZ2IZ|S*u;ZK^d<|&3e{%eW+dc{RVBXOJ26C5H>Hp%sh>gN-U)#^xy z!%IKd2W0dPkqx+1?HU#bP{;MaBYHG?eY3shV3+5iForUc!CGB%h2b{ryoHfGtMKB& z;&#QVrb0wdKBQfN0lmDtCIyKcnswL0!R=&CTOr7vB(5_H+iQ|MDnAPpTi94w%>oS~ zZVy?e$U$Fm-LL-@YWzAyok=cm|5Ia4AocY8oC{cyfN-1&nv7zg_s`j}pVG&g-26b+ z<;d~10O34g@_$?r)RJrO@E*X|X_V%DHjpD}umo%*@?fCayQna2amo6a9RDeIxmFT{ zm8JuA(R7n#X)GoqJL$O+zoQoAyPqxY0ZOmOef&NdFt>YZ^|B>*BdQ8 zWcbeIwD4!oeur%46l0YHZ0hj>VnB9Xv5Lf`ckm2Tf$4b6`w50fw=FQiX@y5-Wa_v8 zfoK7xp5BDB&?smrFBkuRUYA^aivD7*bbZ zx%863WPv)_l^m#>9N@BKPABTTB}mf0$m3*u4pF-+VldsGrf{|dnAvstuVIlb&=LC$ zk~qQ0rk4Oy6-VSFBf?y)$dQRt^Z?!zj59*d@-8-Lt%PTVQ#Dy+{c8#uMcbpal|}gY zndeAZL=&%WJ}Kpq--4ABm!X4tE+^if^W-L<6~UaZa`Nx$9;=t5AxleiKZx_a?(7G~ z5bZZ)1w@8vr_5s!T8cmsD;{}f;J(6Q#>efjI#laFW;pt}3|&<*StJl~Ql=s> zLE;=ZKwSq{H%y6?ha?8B@SCvvWpUHCCeb8p;js2fnmE>ft5lZ}HM|>kaO^N7Vlxq` ze600ui({5lgFGpgBYD}slD^T$di{0)T1cQOd6Jp~F90g@D_&6MjczmJ&gSD$I{ z7v(i(q|e-r+(QXIqx@1$Vw7Sz03rE(0--Eui?w52WRAUDq~Cy_;6?+`<>CFwX;0q( zQC$a|-B*=-9htI3rrGPbsY0s=km3Tgg3n}4sZ-%%>d8wgu9q}I$)yLQrTWb*dMLCh0yK1S5sNbQbNR}1Q%C4zmf(1ru?Q-!EV~~6-6*Kj`q52 zPqS40Z;?!DWBD0S+dY%Rl046sq=6%@*d!ZNKIGaBv}XCrrZQ^~-hKELK^+R61dLSd3&(0VX@SMi=GkdO5&`$CawBk&u&gZ5H1HfYH!xP z6K@f9orP(LDsvD-&+YJXDnGl`U*&{8?5s=>AAOvE4qsu4)bIdWScLaNDYO86l-iGy zDF1gfuwR>ODMm}ts!hAN5-)9Oe_c1RL}=H7jht5g-%%4<7mlMeGA+*vIBM>>0dny^ zv;1fg1R0%O?5}TKe%iYy;#AAvKXU(==GbV2Vcbws$dCUYDXSKv?N>z`7UEU|2KuAO zy@QKJh3603YS$>@)HqpeD#RR>o6CUj`$Fr&*sXv$#HQ@0@iFHXs>8qG(kP?{QcZvZ z-xifBayBxytau#lN@v-%^8M@^GH=NesTs4e-Px)w-ve5xL>WhS$?Je~J7*$nvjuH7`m{NiJ! z6YTp`^cN8_k0OMkK0q)X1*exr{kL~gvj-L^mKy?WX17rescj+M0kS`RFyMlpxF4KA z!v|?t=Sh%j%IuWSvNRc1tNYAOowtKb>rqUBod;q|oaf4*VZ%rGQ&Lpg>%zXVNE@Sg zceM`XM9Ph?WJUWmAr-TmT-{hf@Z^F7`XLz7rgMQmUvCdN%^%Jb7XgZQ?46>f_VJx7 z?OM@jLQZ$wXq9wuifh`Ts+2f_J~0Y(qis!Orrn?SCe>iUf7k#doYji)m!AEVA!SfF zTJ17cv~Fp)#RYjL%N7+ob2kLalCyiH^X(%mTVVj{);PmR>Coc7ZBO`PAuNN{A*Agy z?L3=~@Bw8dOms1j7BI<4k>LCG-&2312X zh_MXayn_Lt8N5j1F@A#CYSILVnGKr~X+P4~F}cxs=2mgoZKY>1dZFS8&DhJjipTmi z+z;A8^dLAUfF?5l$VrY(BP4uV+4$!kI%Pl-i=&)c;7NcMPkx1o;8%qoBRY6I{~{4E zsv}cr53I0KDQZwP7Y%_j?^hqJX#F|DL}F-Ei$4^U{jW`si?IXb$D0;-9nq}XC9X7h z4Yy@Ij+QE!pp@PQ5_e%3=ZPr2GTmEus+coq6o%|Ai-<^7WvjA0aV#t#(ePTrDO4r? zC_M&`rv`rU;p!c8u^SmMbrygSw+im^5`)c#u|t%r*Q$Q8K$?84m?bQ1KIU!YZvm6U zmgz?aNdo}-xTRi%n;%^_rQKv5nqT5+`WPo&&?0pzZYs^C0UrH7+5)(BFfx;aB+WDX zLPt_X5%kg2v)QSDjRN%LoHWW!(Gv&5L3 z>PhPNDtIZB5>5lmcwvAm-Gmwcf(Ev1{{c(o3wA`Er8PSA{Fz!;)<|#ju780!R-59} z1^iXwOH?DknyfV*z|0Z|)w8xD2h|F8z=MuNL^uav zz=;Y7h*u`Izd^djCes0-u*B=$6B(}TQR%bfq{~LZfFSmPgmx{7s~BKMYrKia&9PKG z?t{b4*OI!;mF*#3Tz*k|jMExwGbG@57`BZqY11)}3?*EJ^&HZ;}g3#<~Zf#Xe}TNsWs=|?Ns35WL-%XjjK zAE8ts&^Z_SRN*2Ft?$YkT+67cP=m;1b{i8ERd-|CAf~KgaEBe!qZK1MCD5nV>L_K^ z8#G767ANspt}wCV(}gaGbR3H^54#o@#yQY=-yRkgamu4%Z&6?N3{T53tN<(fStz}) zp^G_nB=~e_|Mh-{UPGPnk^OlA2Cs=QRH1Se2x)$T*46%Y>P&+wu^8 zIAB4X!hCfyGHUtgoEZ9%E2f8{u!J7z_KBClWQmtTju6 z1zRt(>geY=m8NUM?|i+$f>=FmEIX4!LNzP7UfB6VNrm{~Sjvym^dot}Q~By7&N6;d zmxmU@njrQ|Omo3dQLPvoYgsxia9#N|AZXPy;L_F@q+_)iGC7MbMP?jqj_awj9Y3Ue zn5t~J!o#~r(2MYsTm?jGR&0iggH(C4XDY?CXIlMA0Z-jsC6f0q0sj!%DF{vnTV8D> zj?mK#FgTDthEaD_j(@Jd#Ge6sZRlz2?)a4DZw8y|gCQd%; z#ZV@F=eZ~VU<25geo-&bDsrvQgzuYlVIf7uVJk1^0hadtJI0cAZFZ4ckxH#e2#1f43c9Y3zM#TtS^ zH(-_=$j8Qs;; z1;AyDObU$BT=tzbhZ(#^!ql+1WW_%C3@dQZKH@@e=`)t%XpCtNTlm9FZP}8V5!);d zyc5WL3w49Z^Dtw>>@S-aSqQT+TYVN%+;ihTKm$Mk4Bss>#7-0WSJc^ybMs3gULjpr zuEb!|bWHqnPBq+|qjHNxckCL`nE!A($h1++OJH%dL$jY(6zN9>huQ6QkX>ghj1{1o z^4>|>)g2ZDmxLbFS{10zh38Suw>v06lC&xL}t591W?0Wa{1 zrUIRHN{TSh5Vj!BuPG%5v}8)Tv9Ko3Y)9MB1QxfB-{Rn7IuUoRJ(wDkhWPDE;^ z1S~SKF!6aqgUt+`HJZOW#J_D&p@eWI$|tA>sqE!Dxx{OhZLKkcgSd)wm$v*wx7y1^&kvYK0WHO&>fP zikBuc8+DMuL7rL^&ZxutjAE)n=+TDKp8lb%9HBZuzjTN!Do&V-rZnWS(?jd>O1HqN z+nJmFbmit_IVScoMh!1gEnu+D^jH4&pdv%xVzp2;C7(`m9Gq0QnC#f>@`6`N`YuQUSPWRMAcH5E_wvy(4@nSXtk7fsJVU6Z*ReCh0eYB8wV7gh^% zA4l)Rib=BbAI$4)*h<0he?cz3P%sSKO#CMgSgcmx2`|TxSI@D3lqVR#QN*O*4CR40 z%KTpbi9RQD)WeL%wXk}Vg*ZLEu+g0dCn`TDXnf|aUarf~Z%gn%G7 zLT&%B>bKtx{Ey3_n2?*lH1EDrC!^Ca@(A`L2Eyqd9J|S(4sQZ_zP6*~Xe8vaHSepN zkkn6z`zaqTWIqjWJ$Veb&y8)M^I4u>P^O&E6Y*=}gp^l}Y?17Jk{NuQwae$&6b-Lf z+`o>dVY&@ytQJsp_65~)p@0h4%&ygl{|z=SCZA@&_cXFkz4`42;X>BHVs|CD_u^p2 zA76G|NDbOIyL%D4k3pigiHxupzH&RkgK*?I;4O57Ai?yy9DLli%NYIJm7Z4-#;_ZD*#vY3TEY4+wEv0f_SNYPhHajlUnW zQ2Lh7qbHtViKHi+!tc1mcQJ-$D;hIAI%yw3xgJA#nc>Ig(v_)YeL8tUKJR>J98s|$_qFpZtZFj+DbP$6U1FKl#icw*n*2rO z{?MPW4Z8)5oSp08MwXM1*!%uU_?=(zpGZH|5e~pI&N~)I8f7%cpIh|C46`7;heG{jSk@kGsEOsc1r-_gp-e!*!d--t#82oq%mKBZ0)) zS`iLU=3_mQf=yThSVzof^@qb#F$~$y8}X)Z z!;>&TNsu<;dAmPn%D0YAlc+U3J*gU^+~i_|!d6`!QKcyK`Zufp%^8b3QO#bNy@(PH zI+G+UaTjddYq+$i5;J13yb=<~R^*1MQx?bDT-M!lZAy!+4!C-p>@ppqafhcm3;|#e zwyhUAOy()jIH~3szJd_+R3%e0D{=OZInJ+QTx@;`RI^c?PXegh{Sm+Wmu*qW>7WxQ zcte-oDs1Jl&GRU=mWJpM-5~ugV&b?~ijB)2nGQ5|urEDMrch7t(IeAya-7=aobtIu z>P2y?z~1y%FHYY#W9Og*jFZM@I4MscPiQyl@$P>UrHEshfPNaj8AgHpT)2R5iB zgHsHQBa(PHG6w9W`F|D!D=*c2*lr`Z$0oXtkuc*WVwhST9wHQa`O)s5%zIjKnKj07`fGww&zD z4?=dezFpr-^Rr5#zAMdk&( z!+pu)F1zzNzK;etq1;AesxA+`{%(|84*DwHdGo2f3|L(_r#}h(p=ur54(y5{;NNg? z+~g7=EhJJ`UGp#d`6}14pSOgTEonnm4(5V)gm?rW^<1=DfY@;h-)UexSr)ckKUOJK zg{z+mei=bL*3e%G8>@9{3pdb$3FyNDF`yN8Lcy%;Mkace%Pc6WLGxLBr8vXq$Rv$q zQbe?#IRE{`s@l_4?HJ9XZy&mXyEm@cprx#Ef`aJD{UQFBX$_3nT<^E4@RPNfR zb4~8n35qn@7Y6uFflL#6AK8VEX##ax=}Fho_X=OV&OwsIm)~0h2GC(8_|O#z*?{tK zNcn+MS?K8vpzkte>iuk1TW6=Y+)*@_W+$%L!)%mUnS5oflQ`bokVI#3tx>mXj{=jz$kujCPpSyH~P^8;)9pX5a z_#T&{XkS|QE%_9t@X3X-T-ppJKtUe#njibuC-+(Ck0cWo7I@s*m^5D67kEl^%gJ1FAH#&ICZ3V#fo)&>-h9#MvxihfKY=YFylSeoj}Fl-VuDVKu?Ywm znG(b<%);uunB3Os51U|zsOYj-yqD>*A8SJBz7ZkWpj1!b65Xt3EXxO3iajj7-TSC= z3O;Y17AwnEien@FF(%)4lQdUSg+h=N1_X`%rArK%Uag=2OJrAQfw@^CJ4Ol)7i4O^7;gB(zVC(PU zOYI)^Fnwp@;wK>BUN7r+-!!+G5`a@poZzKD%K6C5nKK4jjmhc|ME^N>{(<{pTVh91 z=pv}2(YfGx-5ZN%_#lZfY-Wf^I%3LuY z$l^ramB`}Je#2P(#>({v@ z8BqP7K3EfsXS}i%|2<594J(89L^?-o!TkSM?N)H$es%dqQ6S4p6$@xKHx$ETQiy}$C{Wxb;gfFH9K7C@#oLN7J+sN}8mXh^m3NHZ-f0VUWu!CDm) z{IJ)BM44bF&N{1ilq#qJ*Pf|iew{K$y|WR?gzZo6%oPTyFi+lrodlLx8S&^t4y|+M zFrQ``f|FtZpNn&l{{$muf@K6T+7{<#`M9g}-uf`mFbxv;+olP3m5$&1fL}>E4U9HF z)87;%uvy0x#E9lfsGSX-HHV4wS?GeN*^h4TNz3%5-5;+?2J>6#(yip&&#lkc57JA~ zxiQ9^WxJ84s~!Eja}1h_hb~j}gg*w3J(_f$Kb4xk$1IjX6^-jCvNHuh@4_Bp5Y~~` z`^os;DZbF(8%C|?AZcBz>`>vU;Z|^4!ilfra*zN_OR=XqZDmQ8hYk}twB7AIQtj>7 zT8N9+4o;6hMzj)F{orI9GOV(rR)o0t{<5XTRd4!;Lo^=(18u2O)e*7 zPN)@a7;wqvR_02;AVzx=0I0~dX3gn@oz|b`S0`x>kYaSefMakdP9NLstTSxDkx?G!A#XzP0 zqf&TNs~tYnT&9DR%n3^BjL2W#9aG=WSC7I_m1-Mnyf9RuwECKyzC9feme%D@M^jAi zhD85Q)Db|Hn38eZS>D7h3(;PD1O?HhexT?=T4NReDjR@g%i#XGPqOIT$LUV@`GB*{ zP~efP!vD|m`F>; zSG+Xyd;*&-D`irX|0c~$ua6f=CIN0$Xl2N->%SORORUih8*PI16w+B1OcrS(av};` z#&|>h!b+2DRMV|W$Pexcv=RW~d@V3?Nv}(xDnNU@-uq#nhL_c0qrl5Cer`=ZVU)*w zac}bH$lyXHfa%^m!Pu&?gJN1%0qX;_2^vam0kNK4`HA)R7uqbGAloO~El~L;G zW@h2TyFU*mx^5C-5~)3ht5F@O*S5X?LZnBRXpNCe_+|};q*&+Qf-KpTJN|s2T}c)K zi}1V?F@`>^+a;yqGwzyc9($tI;ZBlQmF45*&0kS;J5IsPTG@Y+8Rr>HjgDnz0H_VYaY)kz zkjTQ(rRNu%;1Spep#84Y^5SkDz2UxJ)HsNPijOO6k^rL`ML#rGH_xW|ybo4G6wTL? zN%_zV>v}7e{Xw9^ImaDI7r1?@!3hIi zYFyHmPV^N~bawxUcpAK_o86G!($Ex{ng6)uR9S)-SP%^+B9Zpj)w^07fT~M`t-B39 zLTyxCvZyT>2!5LV%KpB{#i1s!NO4s=WFL3A9fHd38Syc4h=w5rL%&?(zDfH@o z8ak^Fcu3kfz7eD5b%x0Y(h87c35cRe9{25BAMk5pP=TcNFa!ENM6xRcz-e+v8q$L> zqpgl4>xwdj^OzT>8#j{8*h9GkkZ$O`3p#p=Mqi^BCL`^33nlyu)%DoY6WxzVY6BQ8 z7!`z_DH0zF1ct;L7H@_+2B9J~3D4PCxoSw@jD!#!(nMMXwYK<&6Y{@9no_6do49~t z*_0dB*ZetEWFZ`*I@9{emwhn*omho_EeZcc0OVl(T7*B2z_l;(!pPR{P*%X=)@O80LhTKOWTSobe(Q5)&fr8*1{rw;s=z=e`? zaqQeicWDckM~yTCp)q~BL{w>=Bd`LWNos0C)f6}Zg^bo%{cKGXp^pqu98=tZP+{R4 zmf8uIlmG%$UV6h|T4EZZd}=I2=0gfI2Vh5qsbV{PK=K9zx$&W@oNUk-0>iEa%IH!P z?SjGHjy~fUi7c2J>Z@1$LYFBph|FSJ<^oGm8a||dJ|}D_PT!(CQVIDWC2T}Ik6jkx z{5BR`KBRu(@@^kQ^8-;Y3l}pSaV^)|RLhOmUrZra$ACF}(P{+| zDV%m|RLzJh4}p=nf$t4>t(zJ8cLkwDZw|Hh+-=kTX**T{MrQ3s|8!TP9@FDAu9F%Z zv_A1R1t|JvMM1bR-EDTMYSIA^(tH&iLy4=j7+(7x|o#C`*>7o=Zv(?3{oj4E7cnQaujI(^FEYRZ0lO(3(&ckNseGRqIZy z-h-b?+^!6qt;2kob;8CF!xc8zv*X`^V@^>}GfW46)-GW3FNQSJw8U!BLcH#d&Qa{Y z(yTfJ*u=@Ol?#(@m_HskteYNuPo}U1BIZb4q51FW6}v7JjmNY-3yqJwxjtU2B_^imv%xQ8sX8pss{1INPQAEsPaD~fM>zhTXTd|o21Xab0 zXuVBQ;&2raSaF90wGJC|o)1+{wZ$nyg_DjRwRlQnFn)x*#Cx_VdATJvN(=>0Rw{Zx zi8eY6^h&Y#IIdh5ER+4pqSdX(gG8d4%-bdIoXxkA%$%!>Vk^~v0^M(F4p>mZ)uQ&^K&&93ipHt}{!aShQ@04$5Th zKN9kn^re|z>>6j^alr&eCjNNdV)$czbY@is4H$&0GzxKCTf3#_bdB{|4FbTkptb@69)@q@GEu7)%v*p{$}O|{ig^cv)H~l`>LzZ<7&N)Ug!BPh@AlSw318E3vm@z zev38lfYZdS5;mUpq=w99xxWPY&Q(~vO_?=%zzscP8oL34-imC^&Sfg~)OgM_bMxG% zniP6kb-~YvKyeg1SxAnxcv3f*{H~RP{iityY0dN21*3altA{RmqtM<-3atZc%C}Mr zA}IvtsK9C)ju27hl6~1l1k4x=+R>>^_8-}!$_Jh1Ao)Dqog-H;QBVwag9z0XkwQ>Y zy+ZyG)lVWU$05!wNj+S0vP>sNyq8Z2!~rB0mVLBqXfi442%9SW^LN{k9ljB^x^*rau+rj%?Ul5!NvWM9BdeWG(Q;ihngZ%tbS zBfRqU4uYeC??q90~6zUf!_~f(77g+}ad6%{rI>c7cr4IV1yqR=;>TOg(|4 z&1z+++*s-UOI{jc1=!{dhYn4g-Dy`B(UjLGPa(lgaxFeS*iolh4=;2YTZ#aE9J|m zeKjaUsD{V_7!s5={$U-MnDz26^HBsz5NFEPFOK!A;tGW2TZ42WhIOA@eY$J~1X7iB zk^$t+^t{|RQ)BsrIru!&(-_6lRP@Gq!#eO=JbAaCG5`tQOw1OuGtHq6)4#uWcz=1q zC{gF;MdyTId!X&5nvTHnaAQ-L-rgRHzzO;f6%w-fJ89evG7<-`g+$4Mj#2`l9RC8)^ z>E@udF$2y;vFPA9e^8oED1_4mphnH90Q3!9HV%WMYG9S|xUnp`(?W_V3vmCq7duyF zmG^gJ`(o(k8+)lCXCy*NY2rF-CVfV9TE2`)+DGN|Q@4cs*{XPcm=50eTuZz&a(}tT ztixb#)djh^_OmLHlBz4ZorshntmA`LknG5D<^^ zX!SWulQL_E0AVvR(U^?3eK%L(^8OR2y{mRxron6&kH@;~M>066B4s!a^EBk@pak5R zbk9yMuO$910iL@KaU1%QuOyMlP>^urobcnsXQGk>~o z=rRSi-7CY`a!4*wP*(LXTOPOm4Fu!Q;)1Ti!)B-FC>Zr9cm{S@< zmgeYZ*Bc17fP0`D+e<*8`MC?zJ{Xd?8NpH~?jZ#tY>Eq*@9i*OjALuVr0wxMxXE~Y zC>9Y(o)gvXsWow~wXq@)8(cU-)GfPmNfVnW0aUV6mc>7PdKMLe&>-da%$wlsMk(&0 zYC=!~yj1+jxL=r)rfR!lqD$-E8aA^3E}Q>-JNwLIC&N~$6-SgqR&1NpR#I@uQ6KS} zd6Tx;EoCXVj+BLZr?;`VU*b$&;DDF3H|3G|np?|gQPE{36e$2r9CNhpx1KpzUi~H9 z`xt_0N*f-vXBlhCn;zt>kn_N;jBIHrNO9)qudH%Di@382(AdnuBvri~rMh0yrL4XA z-a9jx^EgK7!-T2;OQoZ92{OA`dWCyxY~s_?0z-mXw((VP)JP@k*8|~h0@^bh$ub(B zVc;^r*GjRe3;~N4ytE!>e@OfS@XDZHeE+Ig(1wU2&7h#R`>{&zbW$JQ@03t`u}1G9 zr5&9_w=(rM7m=*Y8nqX)0WGP;0vbN2p*z}MI{wSBs|l7ZT(`T)a^0=%QJ{+dtcG{E z8Ddw0HW;p;kNaB1r~gH}p{5|#s*|tGEF#mYi5R!cv}N>xXzLAhY>ck^hp3~1tZRNY z!}sk+l%AD9c-#j3%S>xhLudY0sw79xxXEnL8hQGGT?|kh2+-9)!?0iKK8mt8 zm*CD=il(@=rQ{kRXp;h`$PdRL=<6fG`mEhTa%*|phV%@!Fz|>ycBCWz?3Ba8$!ajo z{*)qxw0e0sU1Rj^OgKuzpt8fK1Rew&Y-lLTjgaj|SF^NZYQ`6oU#mqgO=NE*q9h6u zC7VOsb@pIWVrKzgx1X|Ax=n5k(TTBbs7~iPTKYBAwws9-tM=fv56v3MP?>vcgBQoS zw~?3(h=4(3@u6;iJ;G zgv6S?lvTg=)}dRgrdFZ33TMHQ$wvP*@!Mq8-e|s)q5a7jGkSS99ItF$8bSBxJC2ZO zhgTe&_`|$8jvAlrtgoY0#;Qn3n{L$Y!NX=?4psZz`-ND3QH`x_)0Q?-V#F!1X&-t` zc5ZgpF@Ei`;b(1c`rw#xCA{x&Z_Vay}o8weP3D51b%FL!er0#-WLe# z8_~&Ni~+V7BE-B0U#b{lyio_&8H@XwOxZJt>e+ zu4^(jJnKxIvWHij()vStV8-FHU~@?s6k719=IK}q_Ix}=iDzsdcjfUZ^G=xHqZXE} zYkuuyyliP5+uau$A<)}M&=dX+P0Kchj(HuWqO3`01z&+m}o8MBxe1ww6O3HY>0zP0P7;RZLn4oL?qx zRBj_cWAfWdD>oK6qkSw;U1=?2k4Wo$SZ0%KYL4gWgPkYYm&*bDJghU+8eo!%@sjh} zWX$6+Z^WxCsGiFa6W5hkG{JKx@AU8~go?Zw?}$R`iyn6eorgWic{*~?sGxVAZkb|@ zU>5{Q8A^o9O-JVmazFw5PlkesFnJ(?tjBZr|K%sebowbq1!HLXmqtM8us?SzF47Go z@GD2i){9xrNgGB9B$N3H5D03_0Ec%NR;xYZOCPq;6AJp6C(&tJNR3n)hw7I4j@7Cd zPbhD5BZHaIErg1$s9W@_=`Wv+QRAE|{0i(n=rjR}wSe=h_zl}0K=yXrO?_|M1M`M- z)qEuA$kf4Q7zc4|ASP~TVtxGg(~vX}elY(-KR`O&GM;{BsM)3l4zkb9MM(y{(AMgl zD4jUSH0gK>sf_4GnsF^bA^(Pi=|y`8$aWe^@H(l{V|ypgFjKCgY3QxXjU~7A!<$Hs z#-;*+XVIG+ENrf|CEAkrwww_0?3yWL-x{;tOppne?Q@6*{?E64xar|(E}b+4sTH%z z0u&ngu+1L0^571WMo*0PXYOvzp2q*Uo=7wlC&uAuP=0&R4TwSxdaJ~h#4WCpKL9li z+md2$KW^-#LEkNvgp>Cms!m=;*IbyAH^@x~quQl-<&EJLyZQmI)MkhJC~|itk;+L_ zGKz~Qq-c!F!iEYV8&%$|zMKsOHvN;s!ZCXkb)W+44i zH|3?`>!k#Es_7f7h)#H<$Qr#BtJ%p)f84XPn(n;z((j2cxm7Sevbedhm!BPbbXn5r z0i(p$800a%Xy2bd3or+dCR$E83HFm{0yi48u>#L5w-X3`;Lts+Ek{2Oqh@}L8ARNn z+*mHxsr z4--K3`vIW+D2D>GnSQ7e`02Nr>_u;khB(xWPz4=-{ai@BM~hvBRvOp=g^Yg8QT|tS zLU{*eocE>Bh+hx8`SiS1QQHy^-BSZ4g-;y%EdFA|DLJ(V%>gE*J6pbmA@;PMVA(+o zLpj@^N@fRaNW8OO4#)%1mteN?!BgZSrfIZPUV`ROhw)>D0EtZbXHtIzB`>%WEWFq+ zLFuR2_fNA8cba|KA7GeE3Fdh&Aw4d}hRO76*r->L5Uv!YT*=E;im!ALXl(u8q|P$# zWD@BgNV=^;q`OX?_M8LFVL2yJh;$uz1D%snIwc?WSm|&wKR%I-5fzwwwY)!?njeu) zBgD1q8z)RU6K_!>q02?4plBY6tNJV}YQq946y8QAyP5^G`0`XKDpaI8xaeV-B&iZ} zK4xUJshO=pp^;Y9Ea}fe2Zw^F2ggA3!R1g1!V$m<;TlxHlro@f!68yLXncT8A5DZ~ zNnJ|vO1eTsRFzsyVgYb8j6}UxbbLG~6u?KWM?NXIu@9tMHxw|?|3BkHKNH|6dsRis zUm?ilJOH$)0|gdm`RXXB#fqW4uZ+CWBa>G^lt5Kiw9Ow_1|I0DqU{rrGA13ZjGYjJ zmXqqNh)q&)w}Dgs@i&BO51rPiLjwOMiR}#T$SWj}905Vk81{<8xVQOr9yH}o0+oqL zzw+JW>Fn}o8ZSWl?%U0aS>SVQZfj4u7t(y=ezgnI2iFD(b>ctGbA9lN4#M1KLyLZu zC!~NW*T*{?sxe{Y1#hFKUDz)`ifGUx^Vj`BL5e5_C=2M(Ik3hIt-NJ51ZxbF1R#ZK z2vWGrG?KaHv)i%ek>#Hxg?N_P$qzxkTe^oO`egV{c@dADf^rVu@(@SaSVJD+*CHTZ z9y9EuNGI4w95l?TJ2G^836?NwLGCnm?SN~eBP8TW>x4VnwL`7A4gSL4U;T2JVu?ZZ ze3I4%6S7f65-naoAouy&-r8nj&Z@2fU6W^0REReloF1vqzOQ6E@gmwyOCISo_dlkg zUM87+rlm(5=xhI3EMlMbcruM>XPbCnxHM!M!w~W@MqzeWgdW1_%KYDO)_@Ph(K-fd zP2bic$2s$PoSfKY$hxf7uFT6Jcc_ay!Sl#EK?GwB=0j6NO^D?g10N$(bLsb4;J9yS-A zq19Ir5u$?wp-VDXuqDHOLCD;LlN^)cPG4yurcYnqYzh>hd!#FoFWn-1{3#I%>7G(P z+<1WeGTgh1@@*rl<&fZR#90Yl04SKOpToC#SKnWtgG<6feiGSr0(WLkqG!lQqH-7V zcuAOMiMj?`R0wQeJN#v+!~@I7>?0SP@Ec~m7H|v7*gZO?A_JpCVQ!)a&`$|B3E#Se zuOH$=Q_u$YQIiJ$b|3yR_Fb?^IMgoXbj8$!Xh(+cWaqkgT4tdrVG(h z#vWNB=y)z3((9MC19UllO-aQdk@-J%@^!HXVI;ooto0aeQ91EXqK9$$h=Xaj*z8Xv za!mQBU&Dvzu(I^n*b)-ov7*KTmxu>;`?(wucn&%Squw`m;KH5K>TXxcI?GL*aMrie zu-T7+4BP#pDiFFk9zd+)xHo-f3DfI6HK;QPjNv?hOQJC$4f1z^bZ=&9(Z7XiEUnQT z5SZH#(a=F!1`MQ}aUCj-Jm>>XcunfqH5!kHI# z@kuvz(`Ib2GtKgB${4JGi?7J6AXWrkdBByIm0@GwjDDLw#&ZvgLoMY`yq$?3lM!qS zzRq;GP8*&_n3)RezV{u@z21n2V4Mp++q4r@34ow+=JO85I0h0)HB>5g@J!?jblD>} zX0|u!orc*X=tf5G5|pdq%Ry>XTZgU?Opg^jhfZgBpu0^x07x4iGd?e^j>C*?=Oi1Y z${4R2Hc^?>C@US54hug-GSPdXZl@R%zRw3c|M6Fv>KG>fInaDf7&4N=r{9dJ_-iS? z>CiTRayF{Pq!k5P*A^#+ej`$ec-xfj979ScG@@Zg=p|z0Er8?{hF_|djV>k zY&^L42DMDL)OC|xN4M?WU|ZhmVKwUAV4rs!~e%}U$xP|nUr6+B%KGE8Dw zsHdGBctg{Eun%iMK?r9cz}7!*wcwE%DxVk-?}5qopjC%)Z6BpX15*}l;BrfRr_4<{ zqKV}Y^k!7d7qk4-+BuTnf>BRd5Q@xFSt1Mri)ty)wrQ=$Y=nq-Eo41Ke+!QO;5vhj z^J{v=8u{)m?I!CNp5vwRx;HD9#*K1)ibd9~(+#5T$$;`I{oHVNCB4!_?ckqaJ82)c z#6I-jr1zGi{&t(kHk9_I^bcd`0TT$rtRZ+~NwvNpj-QE-0+7PE65V@N?EiopeF&Cn zQ^43*{Rh~C+s>4jM5Yhf>O%g%kshycxY5Z0{sBQ6{yx-`0f__&t6D05CCU9k)oTIVavwsyG4v7@quU5`guj3gi7Af zr2Q}A?2Hn-pR_dnudfI-H>bWzvFm0RZP>B~y^qsDm4ODHpkn9+S*Ehx?1q~bq>yhW z*jT5_ih+(%nQ;pD-Bg|A)e2@fn1wcRx^DwdPo5L)0^ov>CkD!Y2$M#wm#G;t)nB;7 z>)1yIL7x)Qu#&D65{x5DPQ!I4cQ9p!tO!)00*tAQAklgBVZ^pcsfzBdH?^!zDu9*R z?Pq%UJ-`1-j^H7v!+Qy$x&S~Etd2h>KhMsed|s`|6BXtWG2Y?;x;P6UUb}0iT-f zrshOdzn!MlN8=-|NTI~%SSrS?o0ZSN{oXLK-Z9zL zFCpN*`|@T0X$FT@(%-)5sXSD;-`ac6xl@*&Hidl1WG);O{Jap(bvE|%#7$YQu9`PT zEDb29kliuNEkq3`qTAa&&eMi8Y6*l$W1j&mGr~80P67#@!;BIWUh-pe@^o2P&+kBx zlA5TJAvMD^_dCZ%wTtAN@#QO705%XZoOHRYpGLd9|Aj+TMJ#pJ5U-Fdd{&TX-x0m; z#i=G2VmL~`iqe|e?o3X5D1f3p1LA4iuJruq1y!<(?fflo&E(sf(elNSu>B7YA!l2paAJ@h2~}(c$iRO{T3{4MN{)D6eD&El3Lg z{12za0(!NT46CUxkb@NsMBPuy2Njc#pjoKMK1_h+axwd_;s}{aa1-p#(63MkL-ymR z#W1dI>IL=O5h60tLB$svOH@Wfn8v;`WcOH2(c7Az2jJK>=~F{4BIG9wwu!ao55-Y5 z5!oP-TG>!a9>=z=l|3_%1ObKL(E^r1RUOHNWFKb85oo+BtWVsJ6JRGHeZa;S#Ox1; z7TV!^X;@V9SD!I7xG=FUJ)dGMfROFG&9)F^6S|2Uq0nvUcH)cf)uxdV;kxsHWAt%~ zBQ~15Pp7E-x}5kh3%6{&Es_L^1&kcG+9~8$CoY%?Blf2LtlhO-1l~a4_AYS4m+Z5e zwHU&4pMnpwEOQkKTCA>sCBy62x(2}!-4?jwZEK;ANJ31+>AHroSUrNqeEM||;oOIJ zFd>XYLTMq3leqp|blIu7OZcN!;B(WU^> zk_Ya^vxYW1)ytT-KNL6d1`it<&!_A|BH>a1iDHqmozY;kA!mul6Q%NT0Cb+QVsK71 zn2cCtrkR2B=*bl{ijP1|D921lktM{pkQ9~Za4lPpUy{BRJrDx@!TtZf;+E?VPjkzT zCcqW24<%KXLL-SD%t?q~LD%hAom%l;pw80q2_`_Q6+FI_%F0(D=@h{^MhINvITT(M zNYgJlVv>gDM^L^9?$oM0$#Cdbi!jA65L$SiUFtQNOa?TGB>nBPqys;^B}w%>cA7(OrDiV1|yUqlvCy+Rf;MQr0gI$>tvNDwD8(ogUr^TYySbqAPA94=@;zNWLZ_ zhHo}NDISz0M@do}w;MF;vN|RVk;Uio?N3!;hDIi0ScuX|TvZk1VYXF4;Qg16d5D+p zGhFu_gK9pId)WqUQ0YOA^T@ngl67hZ%OhS~xSy)Dia9RD=(CEe5nUGCn6VuG)Z4c) zQ)gWWFNPzZcam8+;_&&fGQp(*xA1%lex<+wOWqxBeiic^7Kkbvx}-2lq5<yNsV z2*)@60VaZV4t8xj#XseVLRt>lg=i#jv@+i=4n)e2pS+7vn3E>0PiRHntGfWm*C-6a z4n{I}kH@XNvFh0`z`cvR70JO!%Ix+7tX4>E_s{WJS<4?K$w11|j<31GduSQG*SrVd z9Om=y;bLHojkK`HQooc&qt_AzR+uj`y7;*lLamr)uQ&fO?oz0sPc^*DNW7PXo`$lS zxdpBqx4@~vO}jU_T^H7`)dBy3J=p)8dX@`{YGP;;77f+{L9I+ocOmQN(5pd+~pe;_CUpgDD@=*m~Vr4Cgk*utsRBk_zoob>A`3Suul@w|NVB3+0H)r0qGK$ zh%or0ed`VCzC{Xoyssvu1WIJBkPcpI28SW{Pxvz(MeeQZBpt-=(nxM5nyxDm-6E=e z9_J@*+lc_{PShJ?X4ac1YC#N{lRNLZRl3A+(@L}nRV&6R=4TK*>gVc}W}%6XZEq#^ zBN7|O4U*HDQ$*Xo3mTN~3_|+>5v#*R{prZXP)1D7r@I8FI>PNn7tTOYV@rC<|Kzzy z_#6T6&@k2p4P%P$4+3Hsiw@=)GbNR$=A`?8N6Ed^s|wL$P;(aG{L-n_>rpb;u{(A) zy!S_JR}7krjC!!<9Kf~)b|=pxzC%-eJxpOf@1$)N9I!rI%88Mi?xyy;=E!>{91`H< z!gDV2lunl?eQ8CxX7(H%Q15MgXAQiSjVKWnZeod8h(k%7go-phC*w%5T%-ngAGe19 zLV!xAQ0iFc4ujGQ4iN5g1Av(NKDj`U9fNn!lc7-k>0Bh;!Gzr1uaZw z6&*;wqyevx$KGf>iWZkEZJc<|gxMsli@7Y<_Vx#$k0ydvZ z;Iy)hgbZG^?|s9T5e7U_jbs3xfNccOl50%bW;Kll^V7byE+&K-slcNn$&nV}c-4w3 zWNf60S)IIg7{t|sM|6Ol`NfBCV+JoKCSv5QtH1LAT;IK5i&=E@RJ(@4>_9%~+ICsr z4**>(35yv{YkrxlEedI}5RU>2R3Kms_Jo1xmY!Q-p(c>*VIms}atB*WF2E0W*D?+# zuJG3@((C$L+i7tnlnd5H-zdf^Y7*Zp4AF2T*B&EM^1ia%l1eV1A*u>%7V33>+e5T$i9iT1 zf2S9L(8=4ADAkt74!)w_E3U)CPtCHXrZ{yk#H|yJNlPOVozJw)hsx2;kZzt)ohg01 z@ZYcUo-4b7%N6odUnutco==*z(i@TZ0;MV0>`e|8sRyNkoT!OXL zeMTN#Jjg<}Mmp+CzQr+^d+j1CMCq8}h~TH0J?0nY)XsRpxTVk;jqaMcLj3ws=Eu}$ z0zdhG#Ic^k40V$_d99|N%iJy3eaM)eSIodYi<)HhrzyEu{^l$h9Y`UC1w!L2No5bcAxe^f8(nGfA&4KU@_>lzyArI}C2#tjEhQ5mKu!3%{N)RWov z*0<5#{NH%JFkIA<(r&M*%29#@<9jQVmheYJ+@N2bJyr-Upxis7lT*dGdW3dww9~BV1Hkd=VENITY}V}nC&5t_hcz?C{riMCSV9f2sgh`io)R=C zIIG;^mHzqAyy{xloM!;2&z1hc{R5_dF!>?sHQTbnlSS?+P2Rg3ey-nr(G2W;!U8i-y$&^tk7wQJqoHCJg- zg%<1v@BLiRDfBx77CBG%*F}Raph!^vdWNj)+NiI-`s%iC3i~ZbOxl*K!XDpYeXJ_H z;QdzjuI}otZ0i)m8001U+rRj;Uu(nAyBZMTqHS)#hI!>#+*G52wPcu)7l@P;HL2aW zjDB--GeuTiH%B_ypKfAzybFHlsyRVDU{53JNtY5YTpv7OM+d3TuX-CPe9Ib!;tBQE z=7HSha=BbKS(QSSLqCMDFvN(av@V_2(SATBTQ5a0p{fh@QiK;TJwO>%wi_URX!01z zM8Ik!rLCUgkM4dXsWxO}O2ZeyAc3K(3v~JejBEn!o zYeI-DScp1Mg$E#vXglms1ew~bi3$}*bPx#G(2%@Icnt43u|=|3X_z`2!)drG?DHHiOFhs1D4egJzY9c@(s+5TX?i5wp)K}vOhGyrHRG~`N5DN80(ot338*3=vn<`bZhEx}qI+-MRdUZOQ z&W3L{+KqOj-NKv09Cpj$Ff|7cn}#Kd#5=4eW(0Kb;uy58)04&X zz7b^gJkRqylMqA0uMk52eF=D8j`9Q`FUYJY-&=HrM(=0t*m2bzsPFJm+d<06-Q;lO zbaEZK*0YF=e>^jViV0F8WEe(L)edHTjM!ICPuOIIhDX9BC#6#oxI0Zb9bKaf<xVy5?kT#3k;2fF>r^}g3YTvXpjs!^)2LAeG4|9dbMXL z^){-{UjmYwLu@orgBMt6ur&7%T&hsB!cv=pJJ;c3N>;&L4E%dx<1O-&mDAB_raIA3 ze{koWMPwD+oodc=O%%re-ie^7zoqAS-t{gD_ibBiZKFyQ`Xf;&6bgm$`@tXEekrvG z>X|6?e-Dil3*N^Yq_TX;Tm9;b5nvlhSEbLRT;XcVfUDYP$#A zfjiP|zF1=C{PrH(@;uwZSO`1JW7fxxACn{J=_x&+((Qo-1(9)>GRu3}?M82#=992z zSy&9miEO2(aXq%>4jY4#e$o(=)wUudf8Kqu^3%hpWf2P^W&$QBNQ02JFoL6D1{g(#@ z>ipY&1e2V@Pxnv9yYKD3*KaedfPXywXq^;GA2FCBw-P_c(v^6T=MaIRqUkX|J!V_t zNEAburv8Oqla3@wq8bX#Oi!gv0x2EKiwb)5eopmCs|^vf$Se{(^%&|h+v;2huOwnH z6x9HmdH`SB35JZ5tqvpJ91oX2d= zV>lnar6`i zoU{r3xUbU&JA=+-e;+$g$H5}2*4E=eP{>J}&qc*|As2dGFpzI=4h-XCuyM)i|2{-9 z5Ub4~5RAxJgD}~9)%K6wVRzU~f<1iL#1Pfp9iqHA4^E~VIxQ#j< zfXS*3_Pp=YfdB-;_rOUe$MH#W%&3%#9P>!3QYdot#t{{QJ$*2sbxoa4ryg?c@xETK zMTJH|B*>9E5o^;k# z6HGk>mLwn4LNQ`jO{_2RT3E*R8T+w(O&}(&2TXa#iEPtOlW;g(5EB^<8bS8Q7~>F1 zL-~7el9wKUs|;a3>f$Q6>y7i1$+oDlIXGMzMsBpf*p@#So8y0`t@wia(Bk4c$K)sI zc|5}RehkUh)ew`b;5rPy%ZrW|6?ETh6JJya-QB0wajh$z?{gbqvPHoU|2#jm|NB0j z-tpe?Y|C}UP7gucQX&=%ENc!x+?+Y2A>-yVusi-NUm=k}9qPTh@-X&re;9v_S1Z>P zBuSFq2cj^>7~?)-TkgS8#y`g9W4!wJNShsNmEV5`g-#b_X@0UbU+X zmFoW=$CzZbQyJr|Dtnefl{&WN${_@nLTpRrCnYo|3Rp9dYI8*0PlAE=k8f}PNd~lE z{8XtbOCa~2bce#_}@xX$TrI1p9)=G~6YZ%(S?dEY*+$`8=6S{=0ohs6EMiQNc~y3L9RvrzTR{C-EFcR#vh>eJGfzkRci3| zT{cP_&nj(NmVZ;)^aO%8N*j-(Wc^LqDG|~P&}&{hae&|nWv4f#r)2+RR>>L~;^HD@ znXH>@6XbnnF@|?9K@*rFYR7cseB0p!eTL1Ku9jY{|Y+Knk zCF->qrMe388D`hKW_L4u8;|oP zu)Z`~D4+E>W(!C|<+Hv8oVW2dHQfi)$D%l%12eoiGTt9YxqeKO4YvFkH_W=GYaccpd2)T*2saMM$dhD zz_t;4q?fSpa@fs@5rqBeFM7uxe4i@)<5{2n8m79UVa_NW1yLc)nBlbKW$P4r~EzV~j^|vB$ISs{us;DVL@7!Enlws8Aj&Sv4n@=; z0;Cg2fuv>$ne9pzH{1zElwbuWZ~+WWqR2_G00{{j(nKkffFm1nTWVn93mA-SV4?~Z zU{R$6OX6y!Iurhv00{6rq4-=b9AI8g4@%0q+N{mAw=0O+FHOLpZT9M;M;2JDNdi;D z6jroIixh1+B0_-_SRi?lMhlj8ttHW5Fj#6`Ya7U5zpq1^hdvV-KMy3bx4RgML1Hc`wNYcWn5!iI$h zHq#%n+LM4E1oSXb)Wbs2Za0ESv!vM$O;VG6{SZSTcD1_r-cammx_EXQiKJT+G^3>1 zX(Y)pDJd1}ONO53F`?V-Y2!GOAGK(H0HUZ26E9p4BJJ;;5-u1)6UK!kX?N#rtDl1@ zayLkS*;;hrKWDS8IemDdqGAa>SW75zZFR7C@Dg+@hSBL-ol2way z9($4?|7f7@0m2WHagyWf%^OIZ!6jt7^A7CGos0p5G3IV^MWjkCuz>e(x;+|m4`G=m@!&I zg!JTz3{p5*lKPJqB?O{SLLkQ2>kek%a#}T<@eirp; z;(4Cum9b}X>(1!9$>vLb{{QQAQb2I^=N2qqa%or!fJ};W{NH~jcD%!AZY;@Rn51CI zYAsW8$fa$2f(tBtCb;Ro&U?O*tl|u^WQ+!Tv8J8RP}QzLUb1@jd0)86n@%VhXosIS zu4GGQo(=3-TAugQ?f2QvcLU3_!=Aq+-^She>jA|zd1XWQ>)1{iM~pp~^+BQj9+C6h zDgL@Iw|PrhDRi4>LFM$|W88h+CN%wXb*LsZ;nI<9t+A&U_VixBJKTjQyI^=p?k>cy z;-!nfYnotNzT0`R>z}U+>*LA1B;E@h-rI!nl9nZ$*loeK-O>(!Htg^Y-0gO|FT^;+ zJA9?sRu8>1Ww*n-yW8z{G+>}I{{M$hCBI&=`^v8u#`vv|ziL^vxYv&#HE%BpPR?h( zubdv74p#1dp3Z{+cL8-XJa@Ka^}OeKp67XPvDT$?icrMUz(ui%OT0!ViZ{IB4Xt(E z7Q4mqlI4+XWOqs)F144Vj~qc!L|N=-NTO^D2n4cEFt5qe0<|D`RjV9RO6UkDO;&I0 z#_mh#X0B{3<~%+9)3J^<4K!~oG;i2)TbsK$+v@I^4vlq827*6&?RhGS_!d<{r=mH8 zNGjf(^@ecluaF5*Cj2iL@RqqX|-dKzTPjBqz+$A>0Kh~7NEw?G;y{Bf> z<#M@Vu_n}Rpc-?u>RGK>t(>PsKh#w^WYy8e7<+iNx-eL2U-^W3ax861rj05amy)Fm zmUdZsdMbxlE{^y?mJ+eLCycB}k-`^Ci?$f+g9QdHU0y)$Io(M!+mw`)lr)>oW=$HX zp|O&7RwvTkk!cHjRrS0Za^?b4%NVNU|Uv4V-UnQH&+f2 z2G3?Qp`jmBq(B2Cl<{n636*SEnqrL-Pf%F^mntvZxO{OXP3r$=4-xF^^!^1DV}@on zJ-79Ufv|5)0DcvQcs6q$9M&fW6zA!o&hcO6G7fd&RS2GWH|JrEV69IS)+Yu1ZjD#r2hMicPgFW#MHplx1&w2-m^}#sI zunz&<-xycm%MD?S=#n+4UFTrfit84gDP0mIA-TCC_H1V=!S z0$sW!fe}H{619^HGhw*sp-Gu5zVH4`i6>dAs6jy#B7WS?*r<4c6s4UffOU%(Wr|S2 z6fG$Mn3@=I<^?V>7-5WaD4X4zxE(Hg;3O}xPKoQS+%-0Z3pZI zYznQz+BHhF0ED~rT}%sgS+~-?E=UMwv^cN@!F&UDgX4AAnyqbFFJkz^1eeR@`cfd6 zN`WaHk}KQFz_vi>;R1J1fnbxL;Jx6zHrowN7csS-fu;&6*hti8v!N)Ge3Z==qH0FN zFb&HvioH28~?gIn&%;Q&AYkQ>16nAT?iwq>)e9!O5{-tO(*uBqa<-TJ4+*d70z?&eD$LPI}< zu#h4m79l-G8XsY-y*UE7A#WL?qoZ2fl4@}ez8AU>7LNLxns7Lrm-~)JJE~?SD)RL7 zgx%d<%hGEOS#>7%C3JJV=Q$~{KPNO!a`Pxou$W==Sg&1Fv=*&JYtdR%lmQvN<3cVF z!~$vx*5`W}Aqa-x3*8egcpKG01rvnkeQ+P%q4(`~vkRyjEMSgc8Pf)5NuF${5j z$ZE$>8Tdh2?@&X3Aj&r81B1l2$icQ0TWu>AyP+VAe5ZV}j|Nu`L&(-f(_($3*jEM_ z@Q^*OQv+F^@pZc?r)!yyEp`j-e+zAk3so;Iq-kI!tCz;Q4+Sd;FRgZyXh-3N*X(xir`jG%B#u#=VzzpU_ySdTHu~l0?hpJG-zO>+Z&(ZJm2%swLfN zf_%FyhN?%QOjds?^{5}pud-->_=2Q_4_adEgK&MlYb5DSLsN)|NaVCiTgdE=LGg$6#5H`->KMbI5RJs<$B9qhEA;zY`o+Ioeo zh9qaw+-y(y=wZ9>q1PM|x|#4}%n3QB+>9f*P$~L>2px(nnJcc8iQ)t*FrvkO#7}Bc zPTi-|f8P_D6dM#wc`;zBJT@tUBndjGDxFsP%%Zx}&H6MNep!`Kl^d|H4A>w+STA%T zju1RL>Lr$9VtBjBl-y#muc5@O4T>!WB^HB1&OGL`Sj>_14dOvDb0j5j6;kk1cR!LO zQzV%}k$#3aRvE|bRvRr2Ydy#4AKN=2io;8Dw-%pHGBD5%Au)$5G~j|mq0WOsb8vrO zZ@F>tyw8#Na{F|`X+h4t-k}_c0VP@cj7*82e*K7jHO$G;>Pc?0)zYN`2=X(IFmWNy21i2+N8RDe6BWPUJ+6 zh>A)|K2rEWOXU93xU-b|#qXuj?A1>zt%O7lMYY!eU0izal^ueR+XplywJG;i2rX!o z!;4xQt+pD*wuam2UJqdIR|W>j8q_@pCdmwSFJ{0X@q+q&IlgL-ah?;}JPWX6YD{Kw zX!rE^$x&HcT4YCcH7a2|4~0UJLDDqY2;J9BSr|Bm;YrIWXAxL&0}n`CklA8{1Q+F~ ziwJBmVq}G^3)qt+WK_^#t8jwJ3wBnnB(VbljtdV~!T{l9wSk5%WIzEHOSl~Q(ZvmF z!b|~U3n&RNg3JpvTn{%J1AYjeFQ~+hw*;wFBQyX2fB>Tu000mO2nEBTa7a8NmXNG> z6o3n2en4zkLYE3-u_(!L7z05RWSB9)5I~3_#-JLa;sCNyhpAr$-tKPI0nBbfk*KOo z<3d-M+tO}g#V0m?f1^aq&OGw#RP}D6eG$4YU6XdocCa)Onyi5`$usuZdJIL?CIlK> ztJ8|nQMg=XMH${n1C8i14J33UyagG6Z(Mb=!G`202LoSo6XFf7=NZgjYAN)TmI@Qq zP4p^UnjhRk4~w9dg9GL1Zh1!A(3FZ^wC!3-Ftqn}&HQE9Eg}7^e{H_0d^%Gls-IP_3kHN$;sa zh5)y(L>1j7h=?m1@SE(U{1S#U=fBEpQm$|Pf9iT(!YBH#5C#u<=o446ow(a1goBFp3 z>&;1GS)|~LbL}x0GkJ7!H;vew7ATP(ubzp7X_luN*e&VG77XVsV%D02!{cw z&CYV%(4n$NBV|WU=5Tzqj0Zv0u7ISNTFR--iHw=ynE5|$62=upvJc8sE8;0w1CriN zcRSCkW&%&7p2ks#XRQtB^lw%<{dk?AvZ&_Yzs4s>D~@KoiGuy!U$^QScNAf zMJ7a%>V0%@ddP@Uu+mLdQdh?DIcp0mK?hGj7opi8!00WMfw65-WN6nGzc}bEFgJ%} z3GANc+`YD?#>o|Yl}EtYF8EL=3Bv4~y7L2ET}RA_*DER*3o8_%J8Xvv4#NQQeEE}Z zV$T=Vk9;`1#*iCJK}dQ>O|*THo~;}a%wr&&U9?@@X--VJp(8XF`WQmLhEv;9LFw5j zMrXd}ML{nYETi)xhb+Z8hg4gpXi0nA$BAUhHYEezO#R=>W{B}KZsBHDd}=QbFz&IJ zLyeL1ZKi=W3$X{Hr0TdmpK>bHy?MI;wq?49sRI>}G_JN`K-^Q2M;&7ZPq|$b)WbM6&HSBR%SC<5-63H!$6(NUAK40Uj6?c87_JL40sV6PC%tIdG$b# z-RRZRUrgDD_;q{wT#!&6V#*67P_`oOd@(e93duBJU}b+7kFAs{yPNpb3cu6wVZGQ4 zpK0z2$kRG%DkW<-xJFq;oB=Pf$L^5}mi2Nm5%E%&CAKk25(8I;|>Ovo6g|Ju^^|eu`kG@7fWk%took-a7#ga>G4qyJU>xo{y>ZoD3N!PGj;*+t zF$4`24OMAD0zCYrOgC>QlfBuyCohKwY&Jj_pk}`qm{L*05!_U^yT^ti->i?Ci6(or zc-8VUFqsJ%$}lCSg;=_9NIVE8!$zcE^8&l0p`=>R@YDV!|Gs@U=-8vFW zF9TLbCh>4D_O{G!29HClZcaI~d7a zxADLV5k8<~vn91e4tUtjICD`@@I&F+X|~hKY2(heg^Nz~n^v8MG1F7 zlVflw$GB-lM*nCNAy0@aPg_ZDZ005U8b}&So|XWG?p-d--}M5@)9xb&afnnn>Nck6 z-{^_gM~1Xae?U~KRIMMJ&t_+OHVsmkVmyB_JNq}(4o)+ZD8wi$FBC45gAr$L2lL8g z=uA}%bpNOr8$0T=WfSiU{qY$0Z!iR1_ZmTlO#~NlBu-tgj2M16S0jUA%LR^tQGE?i zf0`BMWPm<(py_a)rp=qw1R^n8V#vb3%IBKK@%;PxifkEVz^CryHgLvAuu32@*n(#Nge^oCS&P5!{8Wx&3-zD080U%Us$|6EQ!VeyKcL~X-EDnfZQz68} zTF+oDYBXHI-(VPj!M5_mg1>Y&?1c%~F;WVxMuqC<80`&BstVatG*5z6a+2qPV*e!v z%P6APO8P(5b(;u0nmo8g{@YF8nT$DL8dIKY5tg_MnT4{leA~ERgGtBdz{H#%8Z7Hd zNQhi8t;03<`k*AFbc{$C8y$0oWw!4Z@$<mnyy1N`EO6SB8m$O{$Dwn0BD66}l%^@f;Z@ zAsJElGnOsIG_MnZ-yU=v9G%0VI^W<^=Pbdja*~_{x~}HuaY8f_q4bJOH>e1WrpUMxw5`D=7?XD<-vzW(h?2x$h{iOi`48@+D|N|o z?9NpQA6W7TRAmv2N~}kGVP+8-Nw%nmtteen$tpL8n2LiTY3|W8 z_VG! z+*(k(=dg>0@r6gM$_Dgd7xp-Wie8j)e=sBAWJ#rakwa{7k_h51TDSG7!qj+m_?97~ z0-xBflM>L~!{Nr-wKm=#85m4RRmhtsD!GQN<+`klTthlbkP*rfGZPZqVd+0-TDmN( zWfsXJFAI|lFz4F7w1QF?+y;@UR5|K`1<}@(PHfT1WyN{q$i}e!^(a(2lGQn4yaK|q z{ZjTHg7>_i;hbs)=+LOz=Gq_5v9O%;gt`#mtlq&A4d9#uo)2rhI=MFdVa7y4u3hOI zDL_clvfs$CNTvCLD;6|=F=>OO3QNdF)Uose7vqn!hV}*ab~62E`blZ$IC~9rd^}Vj zgw~auNE?J_x#@AHhABZC#T=FOdu|h&L6sXJj9Yw@Qp=l}a<@L8AYT@QaDyI$X_vQ2 z`_n{$bT%>|RT9J>aFmUonN@vk!UXvm1S5VbcL+D!ee0~ABQHV;iU9}Ty7xh9>Q1VN zoJ2&{);p#pJ5YX!EE4ey3EF{0HmG1cqS?=71fIb@_Rouk8jKyduU!X^rcNRy!mPae z1wkGiXVHy5?*{La#(5=&zs9bm3X#hVsCbgU7Xq%C)k#_lyMm6keT*$ca5JW5e>89SI5ALf4U6FL^;{nz4t@+ETEHn<5z>B{c`8TZx)4b&(mkrD1Xp%Sfyb!LUe^mdj!?U?nfHY~K~USX}nLa8G& zXT#s~w6`tNUEK%PIL6)n3{JfRb&>e}x&}59-`t}HFRfe@=5FpSbD^TB@!tuj3eQm* z-vc>R%MAbsF3rBJW}BV%=NF|(2q5?jCI2arm&V#6(26O7$jP)bw0Fc?)+mKmYDy4R zQ34Fa80rcxB+M?->pMBnzJU3JRMB_lLj`WefJLD(bEe>d#Gp|F4N<7xp_18R=l(&R zxJWWmZ?01_XKlm=4W4KuwS^WYh0<#;-)u`>eRwfjLIPD2$FpipQP%Ifk^7a4b!7&vngrkp6>YHQ#~1nn)&R zM&{)f>-G87hWpLt7 zKonR8Mm;N*At1W-YWr;~6s-Vopv)=&W!DP2cTw%--hCCeIq1q9P>fZf zT~dupcbTR~AnhBp!`r+1U%UTfrNgQqCb}emy~AB~$l3)*ED;z3B2WVmo)U0Wyhu+2 z6jBx5=u>tOj4}K92R}}@lsDp43x)k#^xl?%PvF(^JFECLr|$97X$u19LnG z5HC4<*C9$Vnppe9v4G|vkGSh{L>2WnpvSJk_j{nWL0pImsDrqe<4WuD>4Xa&;QU(% zVfGm?8(37iF_&{_v2i4XbIsywE`3xbFggbYspt_yRr&`dU+IykRF$Yz{50=|W;rCI zJ$jxTQF~s@_$PvUi>X~hK$z!*fo&W%Zc(cs>IyyiJu)-t(G__=WIAvGPxOg&0Q)AA zT)>N7b(A0bEO|&NA}FiO<7o+uG*Fm24?f&Y2-i)n;O5XnHvX7lbFJN!!38b z+|2!LuGBhRoaY^FST#0ONCwVneQs!B`ilhgDJe91uv#8TmKO@7>B28hFU7T@28;4( z%;REVUF=^P@K%QtTo*+j9sZ;jKL5x2*z`4>S_V<%`^{5RrZ@rl9~05ol}DE@Mg0#F%VrDlcy_YUH+~+k-mOe6c|o;idg{rOMoQ(+O_JE8fB!wAiU` z4N7K;z3f6ckVpmQz)#QW4cn@-PoaanY{#n4v_`{S>W;Y|f)cz3xuj2xNg^rYI<_kh zU8{Hmij?ZB(mYdS>wi`RohD#7CPs|TpB3~Xu{`XR_rg$3?+66Ozfp+*%V=h5cx#xr zxP++P&+EdBl-4r}C7T=a<{|yIhAps1@na}zN?R+0F06XDzP);z@E8j=;#aD1vC+tB zNLws~I)5Z@@)c<9*s6B6lt@1opnCW9@c;)~y204cs1ecS^FW0pU$z@TRtKTLB)AV; zJEbZ)oRpF zt_jdR`ZRTt9KS6izjt5GU5ZgM(kqn!?&8o&Wrb~#$Sgxdod#;%gg%wIgd-xBWeuoC z?f9%;ge1fRR-h6r(Ur6Z(ntS`7_rg7E>bK{RoZ~fJ@IJ-y8!oE;!Fk+tCn1xik8P= zX{w#6ST31MmORhn(C_ldm7NOx(Cg=exh_w69TFX7Al@Xc^RhRnN3WM>fqyrEw;AA> zZwZJa_jt)}OLyNJQ= z=~*iAQ2@z#A8F?Pk!lcx}g1Nh#8%RfW4@PVoqi;MH;dH zdRkq&UShlA(viC(D&>ouS%03!hqz}QlMrM);9kS^(I>#WOJJJJGvm~eq^xW&b?vjW zl}SGEpz1-4YMT}%6!gSI`Q;uBbO_$e1D#EG;Tm%2u*@vja+y_)B%YaYFfsxVFP8q* z)V`C~UM^P_7Ed@TMvmPDw|}vUsgOgt)Du&&_F^r*J*?q-U$`778!msaPic_kaUlN` zppQ9dne>Cws17Rk1jm9U+7JY};I9(96XiIWn`5vSVC;tf#Mv+Nc{XQ7Z;=ZLF|kyq|k z@sr0z8R66~FmP96(v3|d1-)vHQ&49JB8DYY!BZCOMcA=$dEiFQ%L}3cT~%EXw^p%X zw0JgFlJ+r4eem3M7aYxW6^(4%3%E$6hEE~dFV-*G<};24#iOW6$!R;)mGPjLx?RB| zXp$s~4Xi4fS^UU*=Yfq8y;35&?olGS;UkgnQ(oRof;Kr=sB#GQ)EYIECnliz8s5OL z3!N}d*??o8C(pD`g}U#8Dgv=G->Si4g$MR<)5%&`H$Si1;?cuI=mYWmF+_Q=H7;f{MW*z6mdOyS8^^z?hG2GHZbb3lS+$GXZ$vZPZuhv<49hzmUOo!0>|f9SF60~ z=I_CJsC~M*HQhBH>_acqq*7@Gl}O!>ee`q0x*iG;4Kb-$PceCQB+Q)3!fJsM zgpZW^4z{Snyh^25d^K3NV=u%`cBY536l7Dms>n0Tb--|bT&EbdIcL8!)DU2Do66-D zDqAfSmA^4)ID@_Ow@u4zG`BV*1fpVP{rs6qWJosR5*+(UP|Us&e)u1cFZ!DNxc~(# zy5vf!3b&a$0RU4#tiLX*#CC>HM7*4$1=L|vW%Y;CxwS9C!3pi~H{ux-s%GWp0ZN=x zpZtjDx#DtKxT~-U&~X?ufw4e-{_~Wjg7*_}+!W6$U8m}I#(Ja=jOo7?S)VCmO&)aT z6?~>BgTFgp|M`f6j9|v-c+CXj)`@%QydJTG-0D-N5S%W-3`awvfFQO8aMDquyBn4C zL}?Ub1Z#A)x6cde#|7EKC6izIcVw4>_~1eObcKgF)>XnBxV=~^tRl=d1zxNN0$CQz z1_!X~otv0klN9jZQQS{q><+>}@CJ$$CM6|5&)6wUX%>mi^dO*TN2%vdJ%F_Mq!Rr7 z5I4MaO#4Sn3<2>0rP_R$RM9oLo?=~I#yu1r=?wy6CBe&vXXp{tl$RN`%&(C0pNI!| zS>%}xXl(SK8W%G0Bp|be&HWl9osDB$L#?i4=vz`CF9khMij=9#ViZf<6|@&=w-rO? z>Ou!6EcCOoMscJ_9&~u4vBSS{@7ie0aDRqoPLT=>({-)~(`0sN z&WDMsEIkO1)_`xx`|ou5iaZKdguHfbIc|yI3C(_ejW?``AfLp1)1TgBE zgIe{erw7O+tou2PPZ-f+gwlsJcV&qoiC&yYc#wn_5~DpI-We@q{>-u!f?u7TFjosM z881YQEp<0)a{Q@!2IVq=LvWoIj+e~fT`wQ4#VKJ8wPsS{VhVMB9z$$uFhUUnmM@b} z?P0=l7bowb*;NXvoUX9A2859^X>oSA=}!eJpv{hKIKih?8+2ji>&JbGd&sBi%fCj> z^Ah*mE3vqFHmci#_YP}E@YvM{ewro!dQBM7AhJSCPO6SmtQA?t;KCgK#LNSq#=TClW!}Bwu3)Pe+!wCcg3;FIR@Q*{cn zfsZ~XfyqD4k7L~Rb%hJ?UoDX7+p&`bvFFp$II%8eT*~w>cvFV;lI(U-s4^QYLn1kY zfJB~NrRo~Xu~wC+cI!%tT4vGgP>nm&0x4<@vzY4b_G+c_-JBh0_ z9)^Y#)MmeXl?D9Ti=+zBV*q5t{|^jZwfo%}CmSJ7v2@%ex7nmbc)OXAP)D7Lc9O_> zL)L32aU3n^=8hD-q0HbPr`;}3+%k!@%nDz6k{$d%q$s0wm8{zQ{8f@mKfF%=Cq*RH zOPh+9o+u7WEpIJy6H4Gzs?`tZ-B;mBE$xOyoj@^dc+S%0Ek*tAm3DehwryS$0hwoH zVNVr@erO$V;)#3s?!^1Q;*nWdp;j&v)k!z)2P^#-IgP558TmE28-fmg4tLli7&N!d7DjNX-Vw zmE0)3Ht`$2eZ8#=h_`aocU(o6x(1$sd)B1ZY6ZcVi5>n&&;}Fnh@8nkJlp#XXfasa zat=ph`|H}wo;98RoPA9LK$0voF}09%Gl?iHla;vVX_$5PS1eR<%ptTlKb|BRP`O>! zf%hZahH#m~k=IQO5A8t$Vh*!g-g;;H28dUjQ(oSFmkWukLrN$=7IBb|brV1i37BAA zz1~|3JJo|*0KuRu+n8vCy&OTquicc{Ts-xO0uL(YnDB#AwIP353@ChY2gLWVwuwav zl7o6vY57j%uo+k{^}1M6u(uLQd6F@XT*L~cut$X%_m`te#Wkx>BM8Hk?=3g$!i0=8jA| zP*68aQ1IC4GOF!NSY+C{MXOp1>v1l8zyA2P#Q;L?u;5^U@6H5TttBwqHCR=Rv+e zV_$}+mMP@Cu^o&R7Yw!fWm*nJr?tZbLsC*K64|woflgLe(pVPitVm*PokjtQ)T#?gq=?udHi$COQ)duJ=D-dnSQUDZk*)zp=?_-vb z74O8P6#xW{1q2dJ0X`({pvr(yJw~DdDm_8ufHW`|>T*0LJSHeg4kBNvLIbz$RHl=G zH!l#GW}+A6i;gj^D-P7>ozh^^Rn{HQ*fdD%s(nL-v+q`y1Cump9Mo?<8e80g($9eO zFt~$TLG+U-=m=o3G}b;yBNGC1g^vmmf^Fo*_}^Ai1mXGzE<*-=EN8jg9>gAR0f4k3+yvhK*s=`5RlC2x&)oPukfA;QIMmk=Ct$omnqY z&xcZJ{%>{>Y}wgwH4>>W7U>cKIeCD5PqId<9!z>-%PXSPIn*klkhVv4deaInmZNdL z3K7Y4(x$9mK(!0y8c^sbO&CKEhZ$)AJGx-GWlDa3jNtY%~=EVnxR>2FCaWE zp)Pgb?=q3=A#8nOk(p-til5fQ7#{tw*S2BR{S`Df1K>#}BMTLveWJNXNfFE`{|zfS z3O6K#2p^d}27JSz+~dpbf-@Z}(k);5czKKJ<-D#sx2(Z{WgP|;ep{bnRIO%93+xQx zy6QSK80lK0h?Rt$GBRmmcDh>)w8*NA$Uy(z-nUj5A(p`}zPiFN)F%(|GQFA8lGuP@ zzA5(@EVcJ(o^?<5!aMjGk83MNs??^R{&=rZi%hqO_6=Q{(VeqlMu z?B%q%C-a=!#S;D*CrtEyt7c?ELJxPDKi)p4vhdA}HLak|HDO9IjY|$rzPXng(_?LfuR;0~h;qlceN_7I zF=eGp1p#NZ5e$B0@z6 zbew)3(c0TJ=JQ@X?9stEWANpvn>0Y@)ij5f>=TvEYs2uL06W`4ilj9(iubS+l2i$ju9 z0qVv)X>r}zDxB=&*WE_mUJ81!zS-A{hQb1%FT4aARx;ArHC}M&`;Z>zaQKY+R~S~* z@eFcQ|3|f?Vt~k28I{4%$H&5-+On_;at$I%yBD;ij>S*Vr6*kZ1E3BDmPMtYz`G?m z5Xikmr-tBj1L>tb0UO3}b&*QZoP+q?Hp>6ojE8$5zpc%1yjvm`AY5&{OiQ?d)^r_k zk{S1a(MBHvVJMjhKZvEDV>1J>++`gEA>&EPIAfn1$-&QS4gNQhN4unxbotZo_dpAZU4TLhQdv2%m@QZnZTI$zl$#psc zh_JHHMtFQOkmmirj4P~xS5+vm5*@_8YE0EJus?i~pd&PX(($OQzZhFdTIS^*SwX@| zFaO92Bv)?9$5sx<{S%Ixza6>u{Z)O?ZWatkAw78u5A8%oZSBP#IyZLPj9;FBsBAk{ z`Gult`&i1=*jMFEVUUr@Q;|kxh_`R{wg0s>Ltl-gia}*bjJm~TBqK~FrII!H zvH>4(BAs;uBpGyn72Q%=l@wKV9jjL*gp2ZY(SOKN!#!C)1i%tSP4rzQKlqD++ZA5a z_h2O9zB~ALu=bx&CKajskn>%5L@^?6#`-T777}w8Jx5GInDj{CUpBOV$^qKXj8*-#z9H+0AFrCtC z$PH*D-+$iT4m_{hfvZ5G7?nqnb2B~39GQ&G)4x)ZN)1OBK70KRlZ?$g-`tKWAk`I^ zDh~);23&va)2R&af8tJBDc1o}=6I?7G3(GC==LTtN#nF6scOFY*f2d}yBy!fiT6wTxV#no4R)n8zS= zrSBX_y=W;vQq&J&$urc@{2@Z{?1owPZ^8zyEkX2A18@XED%kp2Mn(Zc5@*(6kzrdW zOGdsR>1LSTnXq;ULgrlLw~Ud!Ul%4t=oL2M<*gqez7I9fu?2jgEY)5v=E#q*b)_LG zP?&gO8%Cnz{(%obnRALY=on5E1(ZD2*Yw4O#kY}IB!CSEyF1piOdh+`!jZ?3<0695 z9#RApmK)a4xgvb&?+z!Q>c16WkJKZ?A^7ZQlFKVugs!j?S{7R#3KZmyg6twg=Xwhe z7H9=pVSZ)@Dv@dMJ{B?06PLXpOSqdJ_ER~Y?W=WFE+Clw(0eUVz!Ti{)|0x@$h6?9 zdrWNx)LAXzB5O$A!>>`i9=MRPQsxldU}el|lGI))FK;_{^GOu25nIe3qm%Q)S%0hy z-p(LzRg#p)XZZCE!9mDn1V%dXg`h&y-a?_o0>s;AhXgCA2J`{rHWNu=lwLzw=K)GI z=LmfKyW0ylB?!T)Mu^fP9SBB94RY$X2H66F2#B5I++u;kv_h1hFq*Cz%51Wz4Ds2W z37adZ`b8?ThsxiJHDC-_k|yPdgCvxD~JT z1;-t|?4Y4z2xM~zJeYe+|JzwF!9#d3e2N&03D^E?>Jik5FYrNzsJTW-yFlp8KF{#7 zj-m*9sW8u;u9qJy$TeL=ud?Z4Zle^y_KlbkSYkda2UU7;ue z8J+}fW$cXt2u=k!6_Z)YDiz=ogq#f(xja-=Ww*rCM;^aA7wWvWhLKOZ0YJn3K32Y! zrgjHFfCO-*QIG^ktamXx)g(MnJWWHLWAWDB_2WM4`j2+&(k|Mk=$9WgP!E!QvYZ+TgdMj1AFQ(p7Sr zbB5CHOl&fbBP2T98g|kU);Dx;hAT*YyB}-KFSap^dJz_k7@;wOYbn(ls+bV?$1Xj$ zBE}A&4KY|$WM!JclW#Z2Z3J`2KoaeeV7?JZp?q7Q^ydQ#NN_qM;Q>+@W*Le1h@GX8 zSs%=Yq%@Z!lYG%D%9f(uULd)LkZT#9pfo4wXlD_Wu6104(4FIY(yd;Ml%G@PI5Z$Y0@S0vl z>y$GGd8(0VTcsd}v5C>BKy5=S?fc#up+F0Cqr<(q8Rl_KSTVy1mf!1S`|a}d3U@7jgwzO_OLUPTJO{F-W<|Tdr;jqS4T<~WHz8V>XR_KrFt}gaaHyda90KnoU z^fu$eQiCf6zK{AwE@*Cx3q!VoS6O>I_EzTOZMbLPQtvvWkcdj|R`@3msVBH7=&@ml z5p*4X(wxyM$=$uhHw+#^7c0`u7kb={Cy+q6iFqHRJ>hF&(*3YQ@Td0gZr#Ge58m|1 z$PCjh!~w^E{;*S@p6AfPQZk?&yu@(abYyrugeN-n@UnvySWs_KB^l`=kuTBS9OXK;aSjJHu4bjj_bF7f$LmgMSi;6mH&?AIxNeyX%-^cK3!o@pp|*YgSQj07NGi$e%V02Nw;50cZ+ojQiE#KaBS zYjM|aI)=%Q?C`g)=%I zz<=~+(t}JJYgX01b-p)6Q(1I*E3jDs_=;fh0s=;`E6h2%ov2_^zX!G!SL)3dSpBt# zv|cBl@cTALbob$-hrgChNVqq+!Pu+Z$Nsm6E37T@<`k=`@0yXPJYcfMA}I8Am=D*B zNqlpRk|GY9XLhP+KfR*U-xajVF%3FTN6;)|%=Xu0`^RlD9K>ms;Y} zi0!!ODm@#J=4rO|?8kGQ=at+xys_n1hx;u4j>O(V=5{bEa3@&O0PthfnyRtZd~N%Q zZZW(OsMRaU0H=QWe3RX}325w-{i{6Pzir*S)i*FqnVa4yaj$=cq;ZiR!ntCj|5rCwr-Q6muGG~a-_qr2uINK2 zrMA2!wwj8(Y?W{hlk3TB?T!5 z!?PKn4+an?|MdQ4Px8;OWSsW&P#>jl=rjU4Q-yU9l$5rTsE@zO6{R1K4=i8&kIY&baLd^&HM0KJ`M1p<)PfJHFu8&Ux4P5Bd^>><4m*?tlX7GIEWi z*rdp?!B3aS$v7p|!mHR!U+=$m9yIEisY?B2J$Yu;!N@W&9={G zixeolUCe{ai4k>XEZG0*rP-gsy@MMSanYm;3It~!mB@dLuRBPH^gnVHf|U-*K(RX6 zLs|OoZlwX+*_#al@V@>{_o*Ci!DLn3`-Mpo2^#~ybf6_kkCZ<|C+e4>G&wrKUyf}R z*CW^~Gd}b1>&7UT;A^@^22XlSmCC-bnBmZ;}}Le9Don5@Ln8U(YZNTkCl0b%b? zE;=Tyl{F`7$Fh}@=%Aw&sn*i@tXe;<8|=C)Sy-6Iy3w*DvIf^PT-pB&iar}#%o2I; z2kbrCV_kN(U?QjTw z<}{`Lo~6o+WqdvhNC7sRa_Xo>CM_>c20ZEp5>^iv$_drrXmTjEpXH)C$% zTpXfLpPmj1X}adH`Ci8G&nGXsm;lAGJEH7|uK6>@rTon{yrtoeuDOF~@7no%OSN+2 zgjsP}75}JL`!7TII{KP2&k(ci?)bRvj|jB*rmGE1Yav930U7CstuMom9ZudFF#dg7 zP5y${GK!$s8cc8+KcQDinPe{ z!loIDkO*0TAEVv`N3^h&H!_hAWS>eDslpKm^Gt@I0(FXIRT0oYFW3YjD6vr(?2#c5 zD37dv6(t-AJ;badK%Z_rf)gs>CgA`#0GGhr7WEwiF@athY-s#{M`d*jA>rX@>iNv4 zZK3x4PU8Vjovw`xxV015dOnMm3G>7N$}QIHXulKX`4HKlU9-Bt@h)MYB|>M5&4B z(lk|#jQkGMoW4pcq8O;J7HBWEx#~S72U-Uuj##f=*3zHnQpWHm(H#n!lkjy7Mf9Io zx``rYm}3eM@hA=^G{3p%M$i4aj*SvzTK*-6K#kf1LekxNIjKKjaR!IMY@RzositQS z72rN-2460*cY>RH`Dec3G~MzsYUZWGJZFbih+O@fD>ZX}kYY&g;(Jc@5zmI!b| zx~=VIfI2^*G%79{hV#tJS6R_TfDkWn-T{RW>BNxXb2bkM02aG9_3Q;|5uv>FnvO=? zf`bL6mpq&!f@6MM!o1$izJo2jTTu&yv{^>+OxPy@-K3!l-bbDrC9NL0QW)Ym%|R$8PA}3*#u6yBLh}%_=>(xxHlwC z(prwUvbk(%D_U?5luPnt=pb?ku$r+J*@y5Tu*Yb@Kql3EL%G)Aou8_W&ll@&|F9*9 z0YWc^1~@NvVH!f@R7IW13N)?=y``=w(?!C#b;@B7;|T;_Ich&Z&`?xR1_cwFOK|tv zah{YlXuM)pr#Pt$^vCyYN;#Y2oX{yJ*e7I|35|0KrH#>up@CLkIVYj&zMyg=V$VjG zR>=rmB{0l(q%2eN6d`$dl@c3XQd=MB`zbzW z3OmA!S*q-!_2L6mit#||yo49#ReBs&e!KiW@72OQLvKh&B9vRs%5$}lE=NVLNfwIp z14HqNO3LpmZI7Il_o-xd zf)|5=0npZd@GD$d!CLsNEJQHsrqoNJeLx9WwP?QXk2T^DXgl8)UcFl)<>oTj1a2Rv z@bQQAkj@fEJ%FZWyNWrG4M>jsW>^STir*~GCa4=gGBX-YwS4X_TV)DcWc1a{9Y99m z*fqDpU7a~0sQ)@Bl)^AUr-ZQ(foG(8JFdN58(5@^Db*%H=sERL$04&Gs7OstM-YRn zJ0|dK-u3#g?-m~-x$^*-wZo#;0))+0#$2&R!tw#n?_FU;{UqCzG-~JhAa|YD9s?v+ z?V#4K%~aJ^`BBt$GJ=;zVv>(8qJrZau-eIK?3clIwF4$1!{RqIGX{qOs9DPV3Z{J& zD1}v|mr{LDfsFJ;xn^rBG(a&+2iCt310`jKjvhmC^(^w5Dj@sqr6{JQUW8|rM_h(1 zJ=5UTY8G7rXbeDPS5eb|O2B8%J*E}|VouPx_~6_p3Fmbtlp`$`;H-e(Vv;I{Kk!Dy z?33$vN22q^M|>Tu4sEEHA`z{6dV#nCZMX}c1!JjV>E>m~c4$Kbi3+A6uyxe+59yaH!QGn*z;s<$`de?Zlvc_SQ=8o$H=Ulnz z5h4lsuwrXLPLV;(Vdm)9Q4Y-Pa)bve_Ch}nw9hDp8GPweO>;4)_3}9a&_Ec6dfzmm zO~b?j95Zrrc=es|PDqac&HSKbEMDn$RbFisjed#U@!-=f;z+py@#1oGfN+X3vmu1K@ovW78B3)u# z+V4h$Xp_STB5l2o4Gyc!6wfJ*wWjq@qsQ|=S^~Jx-!RWpp_%kTtkK_O-_`JbQ#+*GxWbq6#J3t@M1ugm z(_0e!#V7$c+)wO;TwpSV|3vX(GlIVWd~-?b)Dk-3b1D-P8XQM*Y^?)aTEt z{gKARDs*?|L{`=40%G231ULwwE&%Hs=HdabK*0*O`=;+n=o8+5Oaj#_T%Mxak7L)> ztTpW=Ff=@v4m()AAz`qdqNbGt)f9R&W}sD7KSMy&M7RTEeFq4Q0fK>)`-5K9f5z|u zvj|S&x0g#d0EeY&8w~*&(kO(b5=8tiDm~tv@CjYVgv-stRo3UUE>q_laqYDm$fLfg zhFatKoh>dQu0|o;=>A<+?8B8GxFfv9Ea9?Wv~3KXyuFZM(O>!gXev6in^m(?jYC_G zs_Q;TqAoE~kt2TrCLnikbsR|r-fH1um`c>0?ZL?Jwi)7%%W$z{tI8|GSSqOgI092# z^Y0|!yD)^3_!umZNFKEJ2yLP*{58Q64d|6Z&hC^Ov#hozH;AspFm$UFB*Y`cSSA|b zEq2zpIA;mB66QGRiIkQ4>c1AvyY34ggfhW|yE}$qr=mfOo4~ARd`x_$hwy}kHbz>e zdigS}d zk{Jvt=Rx2pz+_Rktd&wCNBs6*9npkh7m!QdBOXiwz-~GAnZUOkgmSBa>~*xI(>25< zD}WWuo(T}A?^4$RdzOhDe6Y-hCS(U(U^L;ZaP?^yqKVNGvWjK`FOI9>!N`|uz8L%r zc-vg?d^tmMe_`BEMeZnT**|sZ9!xNuk7wd5pF!r}_6`kgvu2|Gf#2$joC7mb;bJS= z8C>$v-!2%LE)`8G3=-#7>)RlaoS)>?Bz^e+!bwACZM124G{usIXys8p<8-;*{xw)W z$b`F6v2K63U;DWeM|2xu?`e-Zn}vSX{k%F&d^2o>g%174f@x2VgtJrR^A<$DUTGY{ zNIoi63F%l(WMVc@VYl(Fk0T2{Vn7H6iY6nUeWR~3sxZvEvxp$jLfq+k?Pd|vKAa;) zSCAYt(98Lo(huqXXAuDlm(-Eb-olqrfX`y)j#Cp<2B2NuhC8id;KNl|%5S~>Q2~CO ztXt8__e=av9;BLHwdVSQ-$|vxvh7cCps!|_a#%kKrbDR#imJNx4;cY&JZU1%;U{$O zs)6I1*IC=IPnj(adg$L+6yIy<1OrzIl>=`Wqlx9zQ!N>c-W>hM)eA}Sf1iZSmVY3h z2QtE`z2_TfXi!b#Ga+~3XcBG&(>@NAR<8Qy)vBu?dRCyURc66t)&9U=W+7a5wD`Gy zf)qe?Mya7XacenhMZSpun3gtx&w#!VEpI>=q~31(Msy9KIZ*WquuU|!9%bRrrw})3 zo&h2SF2Z~BvuOY7%LgA5CUOlBap%+cyq@Os096k0CYSD=LL}i z2%6^>wV87HcRH-K7=7xyS<8k%LZ?Ho2p9E4&v`rZRh5A8tRB!+O!uW{KIE#|=}_BW z1#iq#P=q*AtNVmiI_Z4A{Dt0BIaMqAUvlpzMcv5BgamgBRu2SmLp83SNxVD(5f+6U zO9jS_=3$F{R0IAq=YgJa^ij|zBGopCaDh|vkIk|XH_k*!yf9%Kkbdd%-zNhJ>V%n; zyu(hB@h%Z6I>FIt^mj?f9i~%fsWvrrpE}AK^<9!w)x}c_zUu2;RdbfTrl1*m#4Ji( zLk#`g?ior{_dE<=p0US}CIc`@GLWmHdR2giN(5buZ+RLB^ZO{jvU2Cb-O5hB+ITb$C3IDl8$&=e8w;C1>xd1&qw79v zBAqUwb(*!TPmtJjTkn)7z*1t+5$k6?10VFSk~3PGAZ5Ayku&&P`pXX@sA>=YJ|1tZ zSazZ?k;CD=RPbgrpneM+%8X5BxcE$QK`0xWI9iYzV-vbK3{By1{z+I<&y)n5)TAul z(@JDP^8shAZpsDIO!Y;h{?x)q(~IVqQveJ$7<`c-d!rA>(F&TA0J}?#z*Eg;*PN&D zvMYVHEc9mxk)~Q{>hF`mD%wJFsg&87>!dG{QWVaH@(ANW*g#J0Z}aR{Ub5g-%B?1s z1YyntRbFHg&j`q%5vAtw%G;%WD?qDJ4!P}FFa!X+71&iQmpzTFY*@yjxZ6DJU}MA7 zHf);s9MK_9DSVELlENkf*9GX_|y|7EQ9` zd@akwRPD7P)z^cQ+ot_M0 zn+lNnVy&#+SfM@CosPP;c{!u{QWv_ z+pJTr&l2yU|F~iD(H@*bC-<#b6seGR=7- zm3S@(u82qp$IEXM;xh>g2F;P4o8?;>=(>z#i1_|XaH^6~3VT~Qg0!gSpwlJCiz&Fy zYDrx8E*bIAZ)FSI5g7mO)z>;wx?`rxGa5(Ix&u*!qcxwp$eSK+Tg_sRgzkbd6*Ou* z0D^vHim6Tf*FSwbb$|M4wCnK1o5FqdeQ04>mO(+VL8sKqmN?SPRO%`!$QguPDf@m8 zjSF4d{za_eDdLBBTnT!V07&s&@y4cu*62kyaYKL+@l?ya8shz-d9_)fasc{-fT^nw zSwk-30)?+O$avd=9S;_b$^m<$_TJWOeB@zBxR6iQDHz(FM5NHIxPF@42+wXBO&Odj z1xcl7Cm?)g&OFT*^LA`Vb`&T{RPU?$;Z|h$OBQORk-m&vH&9YG9#B4j znh3ah5>Ae!riY4N`H*rJBi5i2IkbzJdVet7H9*W2)ifd4yQ<+!bT4bmI)f!)Uu*qP{0+8`*S%GxYS~j2+?eqN8&y*@_M%Ck_FAYJ_AMaa$r{G<{j@Y~u0(9Qb z#J;%BY_%iK5Z^C-7FP62IMIiyCZbd`*awX75lC&P) z95$_56o;BCvHffi?VP;x>8++&NZk!k6-KzlzhL;WIKr~Sj}*)2YA%=Vk0XSGXjXie z`+#dmliytteQdbWuuFWqFZ{Ut)vYp1+LcOR4(2;2XPL;QpqbaliUdg&K&sNLHUrx1 zoo8JzP%`2iRb<{TLcn^ZxESBfyRxz9L6^`75zl+AQLvsK_xJEDJlIic)>Z}fOSuAT zFjT$(K`vnq#sdXUcH?Zy-Z+D<_L!*z|D;Y3G!Tv7#lrrv{bv zA&?zQ>KOHh_rt1k(41o`&+}_)SS0(_W*|4{yua<>D8tUA9YY90n-%ANLZQuCntpme zUOXEN@ODh<$@6^W)GVs)gKf_fUS`GV;BdIx0+sk3Qlen81dJS%Fv0p83}H)>#STtL z;llb|bFC-~rYNfQULIgR2o`NtoQ|2p02O?DMglMaRc~sg`A8&Levuq2nqcW#V_0j! z98o$hs*UZ!Z?JPoLSHVrkjZjftd+^EOeX7ESHM)>IL3Ovn~w6pkbA(&csrW2)~7q7 z11PJJ%ZC+xpR{JZ`ODO5L5yWtOkzFk_#sanKHDYJ^W>@Zq**F`xIo`+Rv<8K)<>sM zanu`mp5%<;@kzHmR6*y-e<8I3{bY?2y-S*-LVlwcMNt%$y$q%7E0r43_uANECzs3R zar2Jt}`#7sU(V(Bzi7u807!||NsC0|9^yv`c0En+DFX=H5eK@1{+0_ z@gW!^oJQDomu#)JRv))(r9>9O9PE|2a~wVBo2n?^tBj^M2g^txNMZt(HVG_|Hb^2F zX__f^f7VM_fV2P~f#Z{JgB1uBZ91)1MUgfu zt%_}gD)!&|UZuJgAVHd@i6Yu#>o|`3?REocLYt0W(k_WOj&hWbc-t@IAOBsQd`lgi z1UeijB&&nNp;%~8@E|Rsp`}zR_2rZaG^U(5l)83Z&ap3d6J6_aauh2&EvIFED_7NP ztX;X6N2@BCq)o+QUo+M$WlCAgaRU|&^iU2Pw7L2qekRjpky^V^u>=@Dts|@u1tC_n z1E8wD<>3eV8wAj@K-sozD+7IA%c^oL>iy`uXMyZwlVbDTnLGKJczNK%v9NhA^pZTe@=lFQf)2P((YsXON<7QF*Lr_VOle4>JidO|no@OT+tZ?J58T`ouJB<;mKUe$Sse zlLB)rp-Y=did34{^Z+iM0q%M-m$n51ZG=e_vMF@MPBAI_t+@pw?t>+Z+yTr0}+G47X=V z)!{m6`OQ6Js5Uo;^8~Hyb6xkmJ>L%$E#VZ&InNqXU>x?MmOc{r@qDA>J}0bi8zJS$ zfyF}_J@=&BM*Jpf(H6C+J)vMrvpaM0>j9@ly|j5U{dNMqG`rLDyzWc0JAFH0(Gs;q zL%KVKzHM>PCbnVQ*O+#;v|SwWv*P(P=Hd z8;3V^&?cO?JG<_@-PxVp*_{{%7Ts%l0rLlfAjX(PB5hPz_az-=+Mi=3NZJ=k%z@MY zvUdx4Sb9ox;Apx8ekqu4EFwCFY*=lqLo_Pu*2fzjMyL0+i6dbCs3W zE{?b|L=#SC*ir))n5#1;(Yw5mAu?ig(BJ-77`|6D*QX>pJFRk_t5=*zqp4+lFFiX5 z0|{-9au)S4i>j??DfHyID|leh&P9d=rXRWR<=vBmuLN2b(w@8n8FFIelH_vE-nB%vc^h0# za7TYj(~eBQmKQ867n^u|TP=a(r=*c(NAqbzsYP8{Ib%Y1qy3|=*?IE6hR51&_D4?| zJ!z$iel9p1Xr3o`p8V}84ZGT4EUJyyz;EtR7h2m{+l5$4I%U?~At|Pq{m~4HY<7oa zC(K%V3WIprbzO%Y=P#I9$+OvvoXtEKjVL%TF!q>eAj}uMoq-qXma^M+zu=8^)Ii-* z+C76QG%kT5DJ+4co?1N*2IgUM&iCGXXKtuUT8qL3)So(k6VR!5daZ;*yVqj?@thjC^ru%eb`uQq#{rm4Lk7&S*}o~&!3E4~-s z?I2j%9>(BgBdjdCutGE5gcQD#3^|T4&*;ne^TO|T6qu*2yg6; z{}XaY|KG*XIJny{SiuC&3p5&zRq42BHXPA(aB}7lA!RqWUR#zXnp+of7hGdob##=_j3oaSM~%0hR%cu9tYQUXbL z2d32-nf>S&k#{t|MnqHsi?Eb$rOwdmj8UDrQrs%{iA$x@{HCJ(eT||hpXNDHXTEN~ zk&%HpISc$i{3B#R$XKA4J`jIqgAHOV@KYd^+R_K&-*5$q77GUK?022l+jZLHxh{@) zv0%i|2pVgK`b`l|t%}52m9wu|VH=+L&T*uJz?CMR-MFI7n|d2V@f&P}-`HKP)R^|~ z4%RWLos()4-a3~`OTGEiib`VrzP4@Nqw+5eO7mWkR-0Qzz4_XeqFyW22Hd}Im3nE_ zrbHtJOY^2E80i@ijh#o-X?_>Y*xg7(gQ)zCX-@Ng^H!Y3=uu}L&7Vi&CSP(!?{*NC`}PE9Fh=%$s(%s@Cz?1!A@!5`A=?z1$#AI~IuKAx-2cr{cSjKfwQ z^*c%VUMq*Q!0Zq58(bxdAUwlHIIS~97_Bq-iAsa1R2tlZN`t3Vn%^-e%HO0R7clWV zl}dS@hi7>9!Dc*;E>t9GRUD|O-(GP#Un4^KdnX3m-Yx=q-p(VBH^zA0Jm47P-ZsJl zy`{60Jrr;_Jw17QyN84W>R6P!ENY30{up&Ek55naVg)9+0Sqmj&h?e;OLri$UEvsG z?_f4yuugRMZ+BMbg-#~+X;=bD;aJKUmSaIzX!DIyT=R{CZHH~xhHZy!*!$6wFc=Kh zL(VWFY|c5?YcnlrBDcoS9_~^%g}binfiS^2xmISj*) z6ow=tUFV})b+4|6?%vAlO3QonHQw`N6jgPds2_ux`pw-UMfo+|@@Z;SLRv_{5QQ(@ z;x}FEmfq4Bwv@k1HtbwBfA`k%o9@-cP;I&@D(}&gC>8#yT5r(XC569xCailHCca-*m6ehHBF_kx799+|iSreZSUpHyDON zK7A_b)j^fpr#I(PXl)pVR9sf|FPMSruecrx*LSZD{Tkc7y4UOFsy1L)N?j?d>N+3Y zstZY2ijs(@=w4|@>b%DTX-c*b1xnL;y>jcumQVJj;3a#WwK&Bot=ix!)dr_^=IhL@ zsSUKbDo;_MWE-W4)A5gRI|Wmzy;R95Q98vaEkaYG^7rXB4lZXm>bTT#DK2$f>bR5$=P|H(_xmmmR|I-a z1XWe50LmGh1W0PmTI)KpW4msr&V;~qwdox78%&^g=COS+CEQ)ow$DIH!% zb|mRU^veI=q>vx9-M8CXC|lHx9Ar;?`xBp~GijDkzKmLLRI#G|@x2(dpBN-y@c>*v zqrZX$yWO!n?kRuA{Gd&nJG$jaz@mM`7}R3(vP1$FZQfIhj>Ljh?Yv+cwqd-5m!#U* zpsM`DIM{(FL-~7%4cf#ud%I!V4cl(mb|V3cHnHu?*&D>>=htAPI)k6UMpE3;#748y z#I~3rrDNNZLz3Kv)Q~@$D^F-?XC(<&RA{1cy|@u(RcT72)oM1IHL(phfC+6n6evk( z(_^tBwCO-VM%wiA^qwZPS#!BmoAu~uiZ-jw7Db!Yij^m{S<@x7dBO=V&}J${)20p` zM`-hOs-n#X5b0bE8ffg5Cbkt>S=2`$Wl`Uw&D0MeTQnZ;>*s0sN)y{^aHurcK@&GE zTXg9ngvp2}K0~ygm?DI=;Br`tml&KPCV)W`VFy=iSTaS*4Rokb%5oz){1%O5r@c= zV=VvMT51)h;HB@H^=Zo>$4Og#$(G+(qRpCRg(f=I`Wx!a2|w(&NjEu8vxVPu)dp`I zeulf#6I%KVrLjF`!)`u3yUU4-KJtCPrURz!o3yH)C*iKKd!EeLFuUi844fPLgKh58 zZ`adSb=tmDKddUp_MP)JFB?XzEPq=nb)^r)%EDd=G?`4MlGl3g66FgBUU5bVEkjWV z$DSby$!r;-P)xXOh#%B|sgE*k5cUlb$!6Kue!Kgpy!+tX2Cp<8s1o0Cs99-yTKPJAj}XzL(CC9fMATk z5rqIzfB*%i2Qfw9P=UAwjuH`NI3wl;478a~C0Q0P08&skzzJ<$nbHt9xDcO|;S3)~ z1YpPqZA8H+1P>u#j6saxM4J}?vGM~^h8$zm*q|roT5Cn!Z4&SHz^S~uhS-B->+n3@ zI&%e35|ZgLv;zn+1ROGA2smU?Fk16YJcPQ?PRN!qWB?*kNda%(;hV>gEITt-`=*KL?8927!eH0Yv>HxK(`+s zBBxe>s{|%ON;H(AC=|12h(b4FZj4_WgGdQU8Hz$7>=~jEjx9qJlG$1mig}v&wh+co zWzcyLL>YAc7BhaAw>{-=AxN~DRVd9cB!lv(-!?vIl{qzqHZKTbW!6MrVkpaU~L3N_GXjv?TOj{_Lsgd3Y4 zD^(2-6AC~8R^GYHqv_GWJ%I{Xz%k%8q#GVF${SQI`$p6v>f)og|=jp9eTo#oQmU#PfbQ<`~`kqFsUx6$orJR_bTel6{i6*dX^_esbQRRw{0GRf^V0_ zw~$1jqJ8(MHn${!&ycauT;!nqZDXdgM-yF3-$ESqdrU`n@8LxI=vSQPw@G@f$4jT( zC4sGC2})f-t{{&&>T)d+L<)o0G=?rwtED9`vq!q{-DY||1mb((ZZ^-_!%Luy4s1`?7qE`Mti{*Su-~uut|u`Oq)@j6T|D<+FA6gME$pE%{y_ zP#&T*zo2hPwfPm^zt<-#fAffe{$L-_4%+-)`saE;ukMT0nGfQd+4zXiUkvxfJfLsr zi`g8PFZSiEznG16ItuV1Lh8&6&?_@2K3VOHeX-K{66N3X?9JkN{^PpWbtXtjr`*|{ zea#5frbhYu7JZG~s*mT$yF}uh%~Etm^fmWd@o`Ub`O%)f4F@ZaNRrcO2ULky{zy)y zfarJqN94nyp4e+}$nB(mW+VQ%>@2*gI#8642`JGa@J7x&pzI`-fIwLqL@piuquw&?;G(k`jiD}bC z6pXYE2WpM)pgh7xm7Lzxg?WxRQpwwG%Kd+)tLq-ZmLFQqM2DI#3Ts|sD~4C#gQ0*!Wbzw=3XaB_lI z6B!DA&X>>q?&}4F7Pe9nHgtCI^B!_!p-p#@w!5&)b*4;u2%>zaxy#ksr0@Qlgi71P z2f)B8?d>j<)FGqRbt$hR4D^@1hB|{o5op(4p$Jc$KAz{<2I*pJ@)HwXQ=POyR&BD4 zH^j*Y-K2bLt^Iz4pgs8*<#2oG6a<7?k!Jn6-}~2ElWC-M7f#L(A@|Ar)fo~AWsM}Y z{-3e)m8IHDKyPBSaBMwaUxQibO=Yu}OKaVrCtFr^rBIP|;~k1UdAE6k%HLpZnb)Ro z>!+&xW{*^r*HF@c6Yd{x%iFT3mtjZq*2mm zs{UWuUztpHWmjf`wdxq2CsxT>>(goPR0`(_cN%hAdvDH#C8xRSc*r&0&rs?@E+H+X z>6Y7B?ABeV>dUTg1{*qC8wLSAmSeGdY4-iEX^W4s82JC)`+fI*PjZLJ34L_6wc1)w zCRH`0qJD?vNyTR;B5I}5gSFM>Ix6_!V6pSH0!t^9K-04peS16J5!fTz)DUt>Gc4NvxN?*7s*9VB%(7K^#Z-hPXx)wI#^EH}$l$*I+9tJP{Xn_<`s&e{~dz#FvIdPDM&5@YPr8IKuX_q*ei zqVke!*STJf-RZg8k#S2{S)R`PFYDa2XbT{U9&?00G>$)y?urO>D zU9uLd#TR&IYxFf;wfT0=TAxmPlVq#)JAV*Vz-&}}@wUG`uGTPeB$93Y6{uCcmd{b~ zS7;FfN%!Y#%-eH&uIsO`Ex*;E#I0?Cq%BVS8G>$a~W(i*)FT7&wQ-es^@t*Ya-CRy;W^o zR%cx0L{wA@YnNFgSq<8(XpV|z8`@?0^?A^fzgymFwa`>H^KcZoBw^2HJED?BAR$wM z>;@)Uu^<_2@BQHvk;yKNCmz!?8~0-Dx&7fMEVLC;L`fn@k*;NrYsCsTlFTA)BqqTKWFXX+0l8S1r~CO5E1g@1QSxE4w;iK)uEogs1$B^)i7lP000620s|EQ z03Zwq1;gQRP%I!8t;=>4fD2xBM0j34oXMkE6vZ%#F$O832ml5EK#U+I~11a>BRNL6mTQ`%^5A|9r%9uDd`MMwU}HFz$q;JCY#8> z(+tmX9qbjTkF+dwC_FMS=yXiKV2~Ix%?Vd01?e?M%UNvMCoF+Z+p~3T`l|QB)Zx?6 zD1IB6v}(W78~cHpNO0str7E&RS&9nY1iA`+NN-=vV`As8QGjEB(wfm*8&oTB`V7e@ znL@@?LHt6YhYS9_00ZmtHm#j5w6L|P6c=o~FdhsljXla4^thME?e`N&sa zrdEMkpXlPNlAQE6_tJ``K#O0=)E3;MXiiy`uU@()zNrgS2BABXSQH?va-dNk~( z7fB|)F8fDm_y4tPN&tn9Pm6X##3)72f9XyU^2T5WTVd;jjY)ghV%(@zNQUDkQqIjt z%w05oS0`1AmW`_UhvZS(#Hw&;MW57`p$8*vh^c``%grSYi?IU+bU2&5OLE>3q$4*7 z%96)49LZA^ym|k3`CLx0!~TybABPO<5gxs|D;(KKhrC!$TV{D<>XflksC8gjh$&IC zb<>7T5$rn#NMku1K+nrJv6F(}h$#lJ7zx9c?_OW1%7DcH2NB|YOWB^*FeEg_amlfmg+S@QzzL+TISN8jw;vkxzW)R5H|Y z6ZeN6{75b$3oXl?29dGObVdkWmH-xZ1qblWPlF3bdQ7o{-qs$#wLTmyQu_Zy$)2#{ zX?`GpNo85QX-3zs`TQvo27+!jf}~NI5~qpHFk0U2&0lD!YJfRlbgyY8;2IHtI=fft z1K(~UBb{JcV> z@&O%fwKAS1t|405L-w9$(CKHB2I3hagQr>I7h^leC}gwvK!7crrsTn;Q9gqulK8JkVP@y+W zyrLGp4*8p|n`&?C$S0q9EC5N={g~mT-LCY{i3d487f`QHX}=cVF6C)8Rz~a+&Y8sM z+j)d1p0Ub_8INp4mHg|?D=BauYYO*9Z%P1PKY>}H=+$QR{Hd1O-*I|yU$+6_jsP5B zC5fKeoAlJ#B(8Cxo;~bMbQr`>4Tv743ULRJ&2(T@(vZM;zbrsR6Gzix8-HHlIlsqy*u~K|XP+G%wAj8Q?*b#eq7+bKBi1}M2tE9L_=5$}# z^-YOVx>yw~Jvi9DQJ>}bDX*9XWJ1u%vH;F%qV}YMx{oZMZZzvncHvTRVkFm@U28W# zuKvY%9L%I9^4|<1zl_C{aAs{;-i_Rbh?cmz?BBjyaMk2~WW|-Mxnm zSSXR7FKR}MP|y$0KhB?OohK4U28Lag+2;kv#$RC}kJG-|JA@B4oP}=Z1VB@Z(0j=F z|5I5H4`2qGDEJ&Tm$G@{qoG@wClq1;|0goe4Pg zY*&zcTMJ!k+O}&4R;PX3WOTM*Zh@T{aD=pc08XhtfPDc1NzMm!e)I<09$t z$0k2+^X7^JmE8wKUp$`NM=0Z}r3X0Z z#HmHhiqjLgt^T|e{|<`*NW zrVG2mi!ZS>@|!O8a8nsZKttLjZ1$dMj94Bf5{*)tJk*;eb&!n2#O)$XE#PU=F7Duq zr_0QRg37kb(shASzI?!#$({QYB>TrCqX=c#A-lJLtV;5YYX|eUw|~g(LjGBMxqFB#(n zJ$amw=fWCexkpfc6zFut4~(De*4cY75#Y>tI9{MKzRY&>vwqVjDp+tONWhfDk}|@| zL$BY0cm^A?qz^pA=VZpSwU^&U%*bRboVX+)+0U`=KB5l*f`W<(CG{U=O=o7WWRGBC zfk^(Xin%c4R_lJ!K`g>{2D&Ks`43t-MED<4@mR9^K3xrr6-%m^$+2WI8-XR10g|C0 zq``shXK+^1u*?IIh)=aBQ%AzIm1le8@-f!rpD6N^ZfyzKz?ol|C~X%4c5%{H7KRF* z-Yin5>b;9G14v_MKS1sWu!@uN#F37hQ!EO&T1p0ch9P?7S|xeFc!}&a4R(bFB&cNU zDNV3JEONZANa$LS;|$0x_GB}UAR@y-Y(%`4#oMn-ioaj7L~BtCNpwI0rNKf3uHB#p zjkP(5>I!%rBZ-fF)apzR*$D2$tcDRVjrtJ9H9H4|8ecX`X8+0Lnr3X@goU{}eDF3x z?gzVxFV;I>6CR?<=0_7cS@HqK(6&sR(knr_F<3S@7&H{+iE7sH8(Z7U^p zRrQJqJ#?nW#EoQf|{FyXjf>qhBmf}1Z`)o>(e>)@R8}V?jBgp_?(XhK$_Y#j?W5*;7qgM|KSI6#&>y}dgR~7y1r&CuW5U?_A6ltKTepXE z!Bl+#jX4@@U|ug|sC#!avYoQ_+rh;8Y^o?2`aA0jO*wQ)SpVZ4LsjCvn$yk_z^{D0 z=#juOYqJ=G~qgshmH?Ws}cD~qy+rvbkp6^oI zo+L4_U{4*Wd2kzxEv1%^RG*w_j2idIpl0>ofQcN6FF()w30BMx-v>Jp4u}FGM|X2vh2Er&DkyGxpYuXr7~p2I=y?Yd456! zDFhrGq>^w!h7gNeX=Xn>L?GK>^7J?VIiUCvJ~jpN1V8R3Q=9^!0~ZG_Ez8MI;M5qx z1)^d}r@~Fb`I&I&AeafPe`*Z}plXK&^1H9n_aCvcbte~kn*jPMCbEA!k&l~IcuFY9 zbD5H%4wj^Jx6(nr7Uyk3(j>^b$Cms^JzNO88&A@xpfpfe%J2P?LHxmlc;}Ah;dnZl zF0$BLw5t>!QhQr{I=A0~T6x+d%N!b`x3Z1eHn>WP<8z6k(oQYvg48DP$pzplM(btyuid@5 ztyc}ezjXOuBy)MwXVE*iDexYrC0XJ5-A|^1;4;@1qO~}E!8Jj`rjTN-DZs)%?qImU zYtaxdca#7_Alu8)C0)=7|Dr!qKvJT$SSpKW;DRiW7hXT+k^Gm zRO*7YkM{*&EkTlv;mN#^Od-Zv%Zs$)<9I3Fc3z$=`X!0TJ>|~|F44!;@w<)HV z{SxooAP4ucAgH}uQ0j$>6$x>-rI`f#S8zrWMEbbe%TwC{&=aeuQC_nd1Z(;c;tNQ| z2h70sMD|5!>&Bq&6W1G$m|qq)H-VbBuWFBs7{JPtAB!Q6Rm(-@q>5;`n~i~Rxix=v z&@_QPk`Z#m2{0;#$+A%&>ah$O-Av1em?Yvm24=xi0UE&kk{DSK$5(NXj8|o@t}_Qj znxi)FK1#=kBOG=htw`uIENMLBNZv5l`oJphO-THzCe%iJMBXkH7l+V?L25=9WR;XH_mwi2ymE2tbXT}I&pVyP*mK-&$27h5Tu-;IWAQnet) z78f|LT2*B16a$5fIVk?H)N6o%Su!t{hOO1>jE!O*t5LCVoX_}YZf;i=q*7s|nuQAL zf^}&IT&vxh7ZTVIe^R?J8JQ)|oMjx%bNj`J!#oBngOkr&;mpXQ=jm z#!HF+zcpznA_|Ye8YtE~Lk;YP9)_}`r0rV@e_nK8tkJtY3KpDHP{A~GuoPiZ?VxlA z#Og6ol}!2|7JHhx5ux(GN9cy@+3fG$sLubW;O7Qo*s0yCxDr?QO$OY#5M8rN;JoQw&uS)MF?caJpFN$w2j zH--ItEDxyh0-su3@8m5&bwfBkrPe%%+I&j})(1hDANm^{7j|u5J9O42c$;;nOrt{g zs?NyX2eR_Vi9N9DWY=~TP7xmLH>tdQAhKa#VB_l)yra#~Z%l~B`k?3!?M`E%a6WP) z2~y%&Q!;bnO!)sGHjU-(nTkr%1sE$zi9|?fp=Hl4mJ*i*^5jdZsb3t^Wi2LOQ-ucB zikO$;&1|t^!3mOx`J{1Wi|Zb`sNji%+A+3x%UcOgyUaS2Sat;xw+#v4Wgd=Q!*^-y zS_~V3q>XE_*rWPLCqTFV9ouM7u$(P8pbdW192y1e4svhZ4G|(9aWm!+>AB7uQ4G!# z%`;+l&oj+KZG@Fx?H4SuaVzxj5vi_a?G2=PT8I6=LUCtHFh*~7n1HAlq3-FJLo;k* zX;yYq0uzvzQ7Q*-2RE21cOoOdCts`ngTky#P42@u+Wq@$9R3#6?Og`IdP4aJ1;lXY z924g>d@4ZOMrbdZxR0d8=G(WgrgUI>?lb7LMU6pt0Igjx2r03qOE%MoEe0ovoh{~| zGE8YH?fim4n*7~Zwf@;@x#SO#@=#exCq(d1jA;?c2-)SWm2YaGhe3EPEF#bR{~at! zDxN6iv28Y4j3De7@CoC6g9b^fl55%BB$wTrn>T=V*O#)FQT^ZtMQ*+$QbZqX-4kOT z>M{u_0BPU^V{8#1oVyoK_b8cGQJvoS|QIgPw#B_pqtqN{L6)xRqk& zds5$*lp@(n2?(EZ&px)PKqYh|zPcm4XYufsb3kGiM@}wtF@+vy#ei_cy5&zaaqx*z ze<6Qfk_9_jLTC(0J+b!PrbdTP-lb8}pa9>OEg2N+F?WnFMQOpL=@S?x(U|w6=>K(w z3n&-`0tS9CR!*PEnrB!DpLJDVgaeX;05qiFGma*VkHg%&Q_M-uHfN04E{!kfCW7Y} zo+|OlR}BFa6ct(lWAAbv3k`ap!V)~%l$>`M`gPV}o5-HJSDXfd-wW*WO>|%o27;v~ zq!bwvXjK;;hd$RP2vNDZmWxq9V>8JE#sn__=}IZ)$I^=lCd0G!wsURxc>8UXTOdEH zc$Nn@h3@%zm}g8sJY%2;EB1fm_Z#V?7jOmaXA!g&ss`yN7eC%lr(kkZUD1eqlw`=A z&R5!zM`|^L@FH|Tm51yJmXh2}Ah(hXam%98iSr3UMc~H6M2Ls2PD0p7#okM%R8eAc zHl)UcPd-G5)0Ag4;zxOk?zeuW6#1Bp&FlvStF02Hwynp3p6M}GVw)IeF)Qqe|8i%j zJDjDBY)XroR&47T3C$JlOEvIxvsY%L$d_u^W%m@LqzXa4^CT zS)+mNg1)n>1`<38!HjzzzR6SfgR7g z6<|`bS^`80y>at02v^1bt=dm=UVlw_Ii^lc=tub2VU>DTp&nS>S$|X>dvx)}Kagtb z)h7Ppk+}-lEgC*H(U^)p6MNzmp#{@Uk7=qBj;hpn^hw!E#SXO=0bp&y7ll{nAGF85 z=?6yV)b5Ip0TUsbu~0Y&<&M^UU3xoN(Jb&0ZHlR9WKcjV@eAs0dFbdH z19U7D15ScP#nLcL_mv*;qc`o1q`M9(%sV35k)ASzF~K`nwQYr`wAF~=kDQ5^-qGR0cTP^5Hv5Dg&Edl|^(Aon*%QNH{L|Ncob zuCbQnggQ9G5)$l>B?hOOh_tLrFt=e+zocq`#x(=R=Xonag5>Vecj0)|_evR+WzRD^ zl3VNe^}o@HxHD~rwnW@VDO*=iHmk5|rOB^ao0vAWV1Xr$ktS?B0~~7`ijCAzHAh1m z?J@0JVkbdRWek7{Dr>@FQ4llzag8ya0GKi)8tj9BK5Z>Gwty8wYFs{#b_?s7hGO}%N&{M->uyf7R8s{H{5zR z41z^#wT~DCY{*5(5sLB<4qvL0#jw!K$eVH4C=5Ev-Fk=uSsnck6ViT#AH98OnDZmw zen3#g0G|PS&~k>pE)T{qP{&|Bt;r1?K`1<{>`K6o_c^*WXT>%>W0$kBN~p2NK3VsQ zRhyZT@0)>a;6$_BBrB|n3I^Myu~#eLZu4GgmkPU&ajh9V#hCNCjf|vcF@OvDurvq@ zK?H5sS;ws}|;hPoOH+Af&gljj1BTUwsXc`j%sAH6kwV|>J-0gXll)8xE(SMYr_ycOH$@s zkp4M)O-aqN-6Hb9FZR5nEi-ta^7k68BReCF#?ANkd0((pbRKaQIm{W4pK~#W^iT9k>b7)#bUln=DsRiN@Cw2 z$rktDo10Y0JQWJjSP9z(oBv~6m2l=&(k&!Xd79jCD3L>}s=&8}#O~3ySOI0A<0384 z#GmoU0^?*`3oQLgqL()w4M)ZhT4b|XcVK1(wUU{OmD$yl{1|pMR^^fSaoR_Hp5Y*aP+8eYhp@ z33lOKk4pii2>Ua0!3v0NpoCtUrqrayj{)O-ezJHS91>3gQ?<}lKMMLmS^b&_<)9Y; zgd@LRTlYuqJlSGYl~G9?*vfzMjv-d5wUwq(7ve@~0d=XcaQ6S+8QM2jAkRUJ(jg>EB&+$&oJU9ip zzdO@1mXKwNUXGLY)cK{vm^5qpo}#3u2@hp`ZACD1N_gcR@ZuiUhLJEceT}^g)nIrQ zB_7Y@88c_Q!YvPe8WF1pVDGgc_0(Bj86JTtdTeaRbKE!BO0QUlJ(KKV@EbolXos^h zrIgV3q_Hm+RqC-*0k+jU_r3^Fx8ER!qcCt}1z#B!R7ThO-uLMsCUIm6OAw1k^ti}j z>9CeDnOupx9`4g^J`u-80x2E(W)2Phl-lF$ZO*%&5&c+&RRu?M_Oev5zKN2xg7iRBT$Fa1c@i~~3$z7EA)Tl+8hpIW~qdXQYUAVbo5v5QD~WcXX7-$*c#;cXz(ZGse2} zVnPY#bGSAC=YLuPG(ScIsKo-#!YjZSXJp48<2*i4`xifFwl*E>=9?Q01c8+5tpJGuyadp-5VA<{x?^fq1LkpJyvMF z@6M59#R%xWdTCdoVdvlKBU@5=& zP^6SF`oRN=U36c3?f2e$yM#W~b1%1&Ig34qWok=gZM=q+c_cI2J?;rd)>Oixdrex) zDc#CNqI`Z7BG2_r5^Cd8OaY?+c2cd~u~^b{)fik4JX7dye8ceb#pjMv>7K}_# zi-(jU(vo{dfh~{HQaw^5+b%c{x$o5Rnr^}7J(Yio=1js#pTF=&{Q%vk1m|;kXL2*1 z?(nRws>-FB+OvK8BqKni&(7I5G3?^~yZ)AhSghC_pNB_pK$y|0~;vry)(ah^$)~A$8;SeowaMPZ;yC~?+&aAmiyMhBos=EDt z#I-oZsE9!4maUmkI=EO1Wu3HN$Bvj_Jt=`bv8ZhW{N#G#Rz}$inL5|8`)PzTXoy*} z0Gj!{DRka9)UV$O`e-UfPT;VJTI4orGFLql)O4%if@Z5vnWwV}DYQsh)eh+&$^^ts z8sd4(da(x9de6f%`az6xZ4a5+)VIUyl0%H$BKBukP&$h#1Mo!XLPm^1!t9KNt^AAn z$1`=MEz)2ourfNpO}HJDvHEQ>L`6(EZ4_bbjaUFbZYq2l^rp}RZW@Ft;=oOdVd%UC zPLvlB4hru*2QMNHT=O$KC5>#bYeXHNMDy8X|jEi3Tg@RVbR!8jM ztI|0rVReFhb+hIFDsK{RZJOA89u5P-omyHLN(@bd${y$UhGaQo*BDAlkyVRLny9w{ zM&W)e-+$8S#YVT>$H`=f3mM@}vt{UF(m+Gb5k7T)F3?m$tQzE!z(32n6wB6{L5KqF zs_pUcj;Q{OhkqE9vkBtzsg1AZnQl?bU*b8@CoZS`V`6~`k95&mcyM|4iM&X@xKnWU37ciO@3F!hEw!_QCufd)R z8qHW0bW$#xl*}k?h?SUHEFlumRx?&%zt@t#FOc!5<2V(Yto68@kQCick|vmpfL8q(SRkBOb6S##-v(~nva`<=z^`iO;7z(@9MJG@&@T#bvo#^+U)CN}gg^zB#qH9ZG+KgG4<*kpVpzQxqb(D1Pu3u zwkN3?tiL?TL&G>Q695x2bti`YZoa`^(3B@ zn}x0kLmVndWCfbbMTIYpo6GEUff#`fz3HF+K|sIY|N9^-Rwwa`x8z3^vPUV@cS!K> zhb8%~gDVKF;6jKmBF^T%2>vS+U#P)N{`)LuDqZGPRY~-R1ZphIL8+K-)9{skZXV95 zxnqZIhr+cILE{)Ml$WU-fgXk!Xv@snq*L7e*9+iWT>gv+E3`~!tW($^>_5+l=AhLV z7-Xfu9taM1g?w92s>$B%66Bscr@RoDa4PPBRxg8v9F9>hV8dF#2n`G{jU8#H(o;U2 zUV@0?=WwhMPj%W$yrVkkAe3k(wi3cQ@jFB-Cem@x!^k8~vm+njEQ*-+8ZZ*1A4ew} zY$5iSOaKUE*^0(s1AHm#78aB@ZQTRISjs01Voaa~Jdk6FWN>zj@yO(MUe@Zeae`k1 zVU%wFre=zfDxr)PsaQ;k>nB9*SyefC9rLda1wRU%K=fXcP{UYjq>pwKypcF;%hp&e`a)=^%|LLQ zEb;4qI6ug2Pt?-*6Y)5Mp53z(mImBuAB+JF9zKMbKh&57+TaV{55NmBt)$U3wCPm` zbKIxQDG=LJ+W_o*()r$nf8coR{`m(ud(-6|pk!tEr`c;BV-Q-;MhpjLz zX=~T{0b*DG56@Ljjcjpw2e1E=N*-9mxn)z9QXOJko*c1N$&%ZDivvM<9C!E0XehV- z{g6*mx`>0-ut1LK04soK{7TO_3Tx)fqar))L)>m80Cg(L5-Pg%O&7#)4F6>CrBtr4$%(ao#GUYPKme71M|ovgvdg_N?(Qs?S&!?#aPsrLY(mQmnjYkg+=Qwi(nR;$fENyMUc)qZ~t3z z=L6#hi9yQncJdf1sC_dUhim_qB|l|rd8M-0_h-E|e&f{xB4T62 zXknwg5wZ7Ba?Nv~lyF3`dJ;tKYOCyE7g&Hm`M2^&-4LERRjby)^EpSh*Z#1BoirmW z$OvasU5`lqztwZoO+OR0RC&o8k$W35QUEwkUg;}$o5+Vn}k_9+7c)&uK>OjS)RSH0M`jWP?1ZZTQ`tADJ8Qlg0oA|86d6Py(zi9;E? zZ4VWCo({ctiOh*)8=e4N;&6`t({GTd2HYSD#`EBlSXHIH+&{5B4@p9C8W7iK?kt~RAr zOo|ZQ+M|z(JPf5aY2%YAS~`NMw_KwTSIRs&Bz8BE;TS+Xurbn{4*+%BEgJ%&((lAfd=Z?V$T1rdfS*5$`8DL*(tMR&R(I5%*+Df#?0grzhG&Nl!Rz7 zyphm_+*QY1ZW#1?#1#sv8MM=t^h~4|$<0}(5VE;=;^XS98%{qA>f(ak-vAfrSd6i?#;aL;3 z<~X3-WfEwk9(;cT$kMQ~0>6xh3{ylL(SuepSG7=P>uTldPf>v0hY6yR4LgI%GZne9 za?+KO6kF$%n|A_u_SnNQ%96(j#2)+aA%N;@)@Ad;z9OC1>Ki3x+N`TtZLt7HK)Ap6 zzn%$9o{M3>K4ksU#0&M8Ph_s4r6$hOSq~vyqA9Jyx{i0K&Zz9`Gl?-L_&BCmjl*99 z(}Vp~)w^PWz1>8G)?@MrA{1vHVhaO|ZE~_T3zrlEgIt4B*s%3RXD-KmOJ@be5mj7- z3p9}=;)^TX7At7L&HVYhNZuUbAZKAIww~h)#n0}lHD#%;NgkL!Y#~htMFS7f^zFF` z09BKDzV|7!4YO4Z%+#qqTNmgJ&xzw;&4L~_K$O%J;1K~pQ|zzWBxJ5=cwl2mDVM$d zH~SV>2&NG>kb|2R+;<&ufk*Nt0TLClc0~S?d7Jn;G1R$Trct(5OvN?O?a4;+i171J z&hMYJ7|G}9r$sqBCAFT4nnrGC%5bxTif!q~^4#v4XeomW)*gsJuNM1^@Coa(D#|xb zTVKFm<{QYjBC?Imf%e}P^U{|?;+S0_>0hzx-1a{zmo+QKY}cI4G8;iQ-#iI+&b1(| zkx|uQ7BUtt0LNw&uSBG?m{G>NnFL2@YjM_y5Uc%H=D-E)W?G7Jrj6k<{iC2!K!y^Y zL2r=k`NN9V8II~fkTlwT$S;S3QiB}`0lKbN#;JL-xV>CH3LyDyq!8BkSVkLGVIxX) z!icH{z=k6$v}kX=2s2jPm?c4E3QEo?@Fq@2`~SpnfjpGpqad zO*T4K*u-}Qx;&p*bZ)08WbWhMBEl{;k{BHdCS+2qQ`J=L7>?-rC0P?r_F8EXuc@0QZrw`ne2qHaMrN`&~XRk5Fc@2X|2TQ*45kXi+? z_Z0k@eCM{_LyMR%{Wjt5??{`t`cO2@(QT&qGG;Qxk(f{}ovzj-Bg4w8M#i+1wWT32tHF>1Eb4EznJcO3YG8Oo^)vB}QLTX~cDn zI1@xl^ycbRzB!6p*j*rAbPACN1ODIXke4$iK&efIPk@2r`$I(BpT@G&yXRg_9xCP4 zks~JYAB4(SU`D zf_2Z(5{cE=A4l{zYYFp7`3+X>=u{S3^$3j)%<6XS7&uBh3kFgF`maj%rHQL_#)dC8wF zv}$VvF(4V4jYVDxegRU4ZsxCK^+B?BA3zkwlJOFEAkDsY_CTvTwRr9k5)mXZ7fWa* zaLU9U;q=9+!l+=MuHS?iV&_||K;&^y4Nx36rkcceV{a*^R6YagZu|vzBWNRH0(8Lr zB0@3{ylO%p;81>;zzW*=a`J^(%D!>SP7Qof zQaCh+h2e=Z@bhdlq`!O;I*6+qsg-A>rijLd>2rmA5O;~=hUB=`^F@lvo56mbCuWzB z7|~3HT&i}G6STrqaOri6{h%lbEDJLE0|!`tjMEqnbM4%V%j|zR8P@=xIJRsi-RrydMb>^DY@jHG__zjiU~wjIie(fj#S~2wUwxtCn&Jv6K-@ksAL3idd ze?lcg7;P%H6X|=d`k{ID!CX3Vic{19LHSfe_)5Tn~^6iOJ;rBE6d!LDUhCzIfP8N!u4M*?IRa6?F57S=J-qi2hhIYGR}J zXl`G=)9t+0GWtsJnvm&LNKG12lB)+DurPT~eHFM1X+3E`cyCCmx1c1E>Ma?)kD~H( zH!x=HLI_2g?#TeWN(wt@zXPfy#fxEnt+9NESyujmsC^*kFygp|R;s$wA~Cp4F!@TR5!{0(9|c4sOTJ<4~ZudW7@ZjC8xJ13+60X%OW{GR~N z{_AU2falrT+(u0aA>L8CQQx(?6LU{Zk zNi6a$FaD&9(b7KNkdv2eMP#uER?U^K-^&^ZzrJOwfnOTZ3Mi#rsbjxU0rk96HJ`r@|43P7I`~{cq6Hly>Csw7=c9VSM{2Rqpr-6lY`~zZXjO>y51KiIx zw(Eepx*1X-2B!~4a)Bq1@TN#+L+14ytXXBpdAcV|jp*N% zJsax>0wom{v4<<&5m2jWG0-^AhQ;I}EHX@EaI`r&K01S5N)Ob{srGSoz%qMP5Gl&5 zZ@-@O4cpn<&AOBchuTtNV6b*c!MJUXW0}e#ESe|6Io<{IO)QlT$oS8LIq& ze$FYoBt&0>1j=MjDR`(r+t4bEFX6DO)cL$^GW~R7qqj7EU#irAnv1gUVjx#-^X104=P;z?8 zak>(FT|7) zutvUR5sSS`V#1SJ`)gHfuEj-K9$EAFyv0825aBTpiwPTwjkImi4H2Gxv*d+2DrYDl zoMP-31CGXT4O>~w!9o>VT8~pgVzI>O9iqDB^D(Sixw$4fX3vVjGQ-dd&Wma|UnAM)_!tH$s#7XVdp~b<}8rD~R5f z_^0fFQu@Wq#A!UOvu%R&JT9XhSLolj@2ag-(X-33MG9(h6^(N=%DNHA7n|GIa>pTSxeAi@B z08V!^oKv?xsbGL|8>&6!^+dqlgK&FNVQ8@~H`kg$F6)z$gza62Zp5Sne6I6Er4-RE z3i${Ij-$9TAsrN(Q=tj(%s;4bHfJQObW0YZ3Hnc_f&pn|n3`mJS@K{OX~Q(~J*H?D zz~w;ZXtUWjOHoH`c2*Mu$aMO=Iqx?2`;7BBg5QEqU^$GsnCf4wWlndf|KtqU*wTQ$ zn?4bXEz-wF2a5L9eQE*W1eN-l%@;K~%@u6L-X1XcQ7n3=9LrqrOF4;2h5(ulM@`X= zkAeNXk!gejU7X4&d>2<2$Tc5f{_!ppY0BHD3brjaMZp%KqO`;a)Bq1bc=cXtlFTb~ zHrt;y^9=Z}GzN&BYmS~!72DpcC zdgqGkOqF)V&SEL|+2UY9EMv{9(g^BVkl@J>dY-*OguAI`DCi1PdAvApmi=RrZy{4Ai;T;2`J0;*KZaQHe9 z5Jw%hXf3kKmO4Ue6e!y23aHzzX%BdRcbqU$9$zg+OWRW9z^5RpMgay7Vl!Pch>LrK zwxale3n#hSB-_hq&^s(;pCr0#=9rJXUqE4`o%27iA zh|a*GN85$XGTI|-qN-7bqiA-8HTJ4Lx{=oi5PDsf;$bbN0D0yF+>VL9e?&wuxE<)1 zEWs5yq|(5GKaw#eVpU3{Yawl3A1eCZrij#UEU6ilxaEn|i z)F~c{SFk@^&J`jh`M7Mfy|bFzHm^bpEOD1f4!H*?BUP}V?|F*I%U&89zTGn}8o zQ`gYA<7H!B-{}k`o|0hzaip}aST`+jK)?ieN^73F;gRoeL?$%K*-JiCZmXXxlEmoS zaxD&);!6Wj)!HK3sP1#vG%6dV9u(PH=vhMHWKN(_l`bF1DUN_tS&VOi4_5`PgV(3h z3x5a-`^hqxvV%+{pwn@c_?i(twSGoiE|qV0ef+Z@#^Vg1)0aD}_2&YP;2nS&5*!4% ze*x$^sTs^TW)i{!orHS*o8n)b4F>2r+3UzKC13G1Wkd#IWo8FQn-l4#bq&zein)ZO zc-lDm9$5H$AYicd!w`SBy27#2;R89M?LmwWWRk+F0QlaaS@y}42>lyWdFqI zfXGm#L6W$B%17GvTt5c}QGGQ50Tz zNTql!8jmMvfc#>K`1y_shA5rbOY*IzZPrx?-5AN>a+ildX4deK z6x+Q_TmgxwpfwSM>+Efw;wQlXZ0-KWO)y+ZM0lFsLhD6C-xuo53PP?V_nEgf4mMWR z#x&TyoIa4i6}&qO>-btBSXwV~5B&k7Fy?qll0%Y?bfhy%gKA@T7D#Ef(H8u5*!)Cb zh~&W7)DB2>6`E|VD+8|_m z#Ep)$P+Tn z0SpA#z!r6uEuF2dN>IetK&RK|8CNip zPQ!jRAKiER1-IzQrl38qn2DWVv-qQ`mg1y*w7Pk9^+Hccu!V*N7VM)`kk!!>yFYrq zX~S&X&Z>LTmnreGY0oloti_qsT}=Mj;U~)H&CNZH#g#7LRanQ@YX_-BM3co^PL<|v zP>^I2F?T}p<>e(~<G2@eRGP16*}YQ^x zS;+&%@04N8lxE9AP!rb4lKHGw4XTK!H#w-2L?q7W<&LJNRc!2dk+4R{&wWW)qIKZ$ z3M$lUe~MtWXv+xI#ZtL0(ki&o`1QsBi^Lh?ry|0ix6_JiG*wL&pCg{WY_}Qq_q^jk z+H=NJu$idn#4CLN&w;=ji8mkqN7*&)9vT_+R z*zF{FyNm^FafwB_j4ht9=hnX~XV~!qd&}U!FQFMSVD2i=25-J-5 zv!p@TiH|tPIb-6CBY5~-4Zq(x5(QXR)IcyyNihwSEoa}`t360o^lbyMAR;oDQP$0I z0&zJxK5K+`Xaq_p&c%!ALk0c5&|f4B;i&n3l>Up}+$A3O>NC=ji&Bp;!^-9VYWd@@TS=95;!< zr~TOeZKh4;$Kr~}lSs;D6^q{73Ow%yk8P4h@^R{?p`-5ncdfpB6fd*Mt=(iLV`47aj4#QYo zu)+rb48yJJ8KcZU?<);aV0L=3l?JR~Q+UHGF&h|VY6TYgSxun2A+n*fU^dV~C}E!& z1~%KsszN~Z2T2h&Wf{8z4?Q8c2WD)!J)|^Ba9TON!i5So-$6LV8$5_rgft_cHUTGu z!**IS5<1PJ02>E%0wtYXKf=XmdaEJcjR_arh7#_K7ne)DbN9%njbbn8xto=@;xq`D z^qX+vLjhQP%5nc=y;I(rLE7Zz_Yf~W5qnBd+efoN87XH-V zr*guXQ!~8!0HY;26DWXU9y5SX8IwT>LGpV_@3xx;K_(TK`V_SqHh(~FEgENY3E_)} z$b{I@TceE^6Zp0oQID@%LV8OC0^}3}TDoCdTp-vPsRMEHv_<(OH)I*DR)Jy6Fs+6t zrcJo3aF^TH-gFaXrYOdo#o#)kE&zhK|F*wtp7et8@&e+f-J^3*e@=l7xQij#vFu@Q z@IxzS!T&C3sLxA@JiPf10r5P*tRnNw!0Yj*`}=(Q_u`*P_u`ebIA zMY;4Eo<_NJm$CM_oLh3~H5vqS66ocmd(CSzua*9}^x8b4Olq;tvDoZe>-Cz~tn7uu z0D(vf>@t~qyN;yb3=Nn4qTQrYo>~Qg!wkMEY~}`-(sq0YKB*m_?sn^ZuFMWq?VzZ3 z(QdSx@vuV(3Lt9T3)~`xO=d)o=WZ@bcC@kre?4gB9#^1(i)16<9#-IX3)H4?+FmM& zaMp4%??;Bi2$QLU#@?ZMpg$C7$;|ngINYmR$h)z3m^sXwUP6E9PrqJ4Ce8#w2s+2Z zUDH>PiQ_rQ#Od7jzntb~I$$A_m3$CQnaywLtNLaC=KGxcI9-m%5jhfFBV}WSW8&Gh zzk(Rag2-e>0H6ZCd^oP_dVb)t?t0%>>!dVBU>_Z~dkF!d!`I#JYC$QrVEBC@*waI! zGUrU;s;*G0)iNRgpnT+OC9we$j%0rw6?RnGH^h?U2d1sZ>dwQO>MS^2k156t8#(SY{{Flh`LX{0EAd7dY zk0G)X@OVQ`07Jr&R?n6fbZ~T!3@k{f-YSTsa95BJ$1+t}k&LS96gD$GFTSiYD^uky*%4Fau9{`?P+eZfsRgNpd0b^B8A%2ttG5Rk_`6 zx7+P@yWNOPZnA+=N}XoKO3m{;2XdGPQU81Y8+pFJWAohi#v-iKt!2LD-v7p!#`jI$ z%e(OKkRD3Rj!SF7>xDzJ({4`lr@5H$!+=PmOeZxq6dvK zYUQuvemSmd;&kfO3dY2&l|~n&!cTXbPYqr_u2)5(Z>o>aZq;*Bkg*E22!`Uu4}dY zN(_8&ca$X2%#k+zE9#;zx;m9I3=(kXM^dh`cjd};+;ZI`?f+q4u)!38%W31fxd%C0 z!`$#{wF0vYfwh7tG>lxj>)y+Sr(nyLBk;_z8s&<7i8pb&CbTK}h$2oyIB80az}!2j zg%}yTsZ886U76%SpRbQd zn#Bwf)yQeH#_N$iI=W7hf$2_;^LqRMf@_o}ir)cqAb%8x3XUVGnCyrHixP)w79mOv z2~1c5&dBAg(X24?0DqEjz+gX!lRd(4X7EN7cgB_-ZR6k5bZO)0@q+)b00w3a2d0fv zk-NJ?CGN9rx19m+IsDT5SQ;lq8F7Jk{BJboZ3p<}G@>2rdD4!PC739G6MYF`+5j%o z9T+Ev2yyZWx2D+xAH3m-sz#6k%;j?4b~LF4hm!B7N*xG-U`V>{5SebMwLSm`*hPB! z^u9)Gms8EfJc*$&DId9UM;1 zIKpL2?&nAs1^}~0#;j36$0@`_4FwOfAGN#wC@T6fhaG-e#)D~q>`Mdziq4KP+^^8HP)4iCW;cxB&N7*-Qd(&Y zn6e_VAd}(QP?c3{JBL|Qe`d|N0$jGNWiy#990D7pp;X7)sLf_O(pxMACQF9}8D_x< z>{B{_`IR~6tnpfFt)ot@-7<3;*{I_x>hu7YZJTr2rtM?{Vxw;Bo*Q5~>L3EwQOC(z zT~ACh1$Nylg$15Y4mmnH)kw*7ZVPbWdQIU0Z5vJiniaJ!#xceVyFFZ?>!gM|*Gez! z2058H_h}Fl86qx>>-xfK9lvWUJ1Ij1wqIUYu6^%~e);yM{;k=L-OCVx5Abc}nac~C zqzH7+jZI>qe)nMQL?Nn*VZ)(^B~FZ55CfL~jZu{j4o=Kq%Mn(9gc6qjh20?M#ME?$ zIqbqN?7}V#ds0LrGC&yEal7|vN@)?K{_*MD zT^zaz41j?70E2=CG@uvkhwKq95dbMtnn;rz&{w+gga9j`2 za@uTH0HGImKspH1X2?xKcWf&yWIO4Azn7uWaZhOyAX+J{w9?MmF=^}KP=EqmR}^?bKB6{TkSlOpcWt?@ zs2fi^!1c=&eH(Iy;fEtgL@E*zA_l&-yVkC6^IR@l)<@X6lF3$8auk8fmgNWn>!6fb zKmvCzSF+dd1i2meCQmj4zYqLC8s*kW%pE8ptNjpV08~;ocJO$?hfF3^5;EO6DV>yZ zUDuxXAV;GKn7%iGCh%(q9{gp1UNCXG`)(pcexL691#&py&n$hr-0wZt0v&-+A4mE4 zpgy$wvR|C&d73Wwp6dq&7IT)s?AcA-r!Ov4lSt*@=xw5aX;H)68RNV z=31tZ6N$+uYQR=SQlv=A*xUNb$5~3&=P%K*} zj`Fulrj5N}l5;+B0TS!7J+vwl)iPoW@`~5u!dGq_0oNg!lP$ouO3D5`oB3=uo6YL1 z&V=v|Fdj^I*4mwqJz8sPCEG|W<~KH-`|GC~c1=nSsElRDUQu3AUNlOjFZ!xcs^xa<&}cA3sV$okJLp*7fChyUwOEUb#Y#s^ zcgED1HC|K0*0{F`xJ=ck!PVTD3z)RtTWi!HvNCIg>B9Jl!k0IrK&jVohJk{}LyMZA z;slEb7qkKvl$ai8t`Ws*9u}5+Oku%AIG77?Nnh0EBnMk10n1=5LoTV!Vqu*i1Cb3Y zxHYFihQY#^=zw9Li?iR8Z-*zJ%L_jj{ho9VebLWFZB&QvN%n8*;%HnG4hECtfS4%n z91hktI!qkS2M(r1=4imdTp$PIV4qM7EUppCg(@}kcE*euak98eSD<)?$kR-!IC6zG zBc#CsmtC8g`57V)kp)1J0S2s@5el85`5#U`xdH2wz~z(?Nf9xFv7n4WoaC(6EslU@ zD32kSLz#{ruy6V~!%&`BW{8q)^29R3k=!*FOi#x$h@I2g5y%yT+#gQ*9fOprH*Pta zHQs6kxL-eI$4)1iOq?i6DaAHc&Y?Q~4)t#IMrm@7-2ZSDo+aryALZx!wnmi2$@}4V zbM)s>zRy`oDW#ON9O<@AoDa&%8_K|XM7AaFZ1P;-FIQ;XS@qEcbve?&v+g) zKjVAkLGv=6_f1LGTU%;Y#>bpu{G6tp+cl3FOPYLN##qvfr?EW67*QBY7$eMByNyj_ ztk%4;x5zHeh(YF1rZrNAFar=;^o?eSGsGOq*qZ1mBULFRwAO0Hu3fS96n?vQW%tUi z?8l8i@CldDIG39y^gBD30BBh_+3PvN#q08 zix08LLu4w!^{RpO@;pSs7Zhn>;U^OA@B}7UF8@O0Ap!#g>t%#upU8_Nuy|ZXDEILQ z1$^r_;NOr~KeTvkz!M7!m{6J{2|hVFgMcY12kGfk`nB{;g;3|5_en($JE`a&EbtH4)!NvPuHR5gg`n5*@LYPWOX+QT zDc9ZW0U?S>B!#tHlD4+QD<^55z@?4u?#fw?vrlAc_#p+84YLG_rl%sSR@P*NqUlRw zNCF>8ibeX;Yhd2+Pe3_~fB^4e-pnb(RPA_Rl0Iz!pCme~mI5g+7U_$yOyL({fg~{% zQzDI*qIi%#eA2iYF-0{v>Y%9BoKfrLT%7JhM}phF^e0*s(;9S!M~>?}v1@1~-D(>Y z%o=|kRMjeIRLd}J`~@sXAvJTnZ`>~e`vC`=hIW)A&%JafA5 zf8kP?ZBxVBrtNrJuNM8m)2Y)JebE>F;X+&^oY7IwU5c*I6@uo3rxaWGumlznkOwao zl%95G#nL8DjjBj`$|=hNT-w>~xjxtBH(u#YAq=ydOFL^8e%kVzwvSCBrYQR*u|`wn zgoJxQ$Bi)!=(lC7G2jXAHsyGN|A)XVV9||H)Usr!<#2*M2{DwO6t0>SRpePx zPT(@7!wN1_)yWB5(Gdhp!^?dl0+(_GrXMNimYx-Oa3+u)J^X%8fRxf2-RDj`Qu|3W zzmu1$pa&;Osw&cIwT@u9kXoM*B(!1Ac3Ns>u-0lxvJ(Q99HcnGk^?MHEIGKa*K(xx_rc6N}4A#z9J+Sa5ivB{z(!dN|78YcOj`SpkHA z?R%Y5WiWA+$Z-UI7z`GI<*a>S_{}V)tBzRN4N(lus6+|DuSa>xE(A;{1`9e}TszfN zE>EkK*JFg*5zL2^FF4sl34R=~5*o6Wdqo(`h~>I_yG~pJpH8or#|3VaNo*`m*1aw> zi9D`^(Tqi;mrw!(Cp=vgEF!8bEYq8AuKxO5m{=2Z`2+p--r8f?tKDKmba+N zi#S4w$7;Z_*Q>M0?Xx4?tbl=m>AJg)a`sxzaxfoqAPNd0+aQ<3$ut7Qrd-|O$wf@S;Q*aV=V!fK8wZB2S5BzB>ne1o(u9@ z?eiK{h2y0tC&D&0d_R29Z8p!}(af_KxIh?&Ab2{RtV#4Buk<|dm&O?Sr7yzb;qs+Y z>A$C=j=PBDiVDn8t|U5`OSe(5TGujbxEp$mMiM`fBk`!;cY(hElhXK+Y>@5y@Ll*u z7e>EPlsk(HT>6W4??I#;MQ8E zwW{6qT~501wE_17(S7Py|2dfMyf!;&1=5S94BncMoz7SMz>#j-76zlI6vac77S-%JhnPFMq`lcJYv{f5C*m_u`D z4$YyVTa)Uma5|k%rxR%k_wH=DM@ngJj;rxsrE7PklyX(Hp|!PYz=sWR`K~^d9n^C< z`w93e%hI$`%hkE%tMyCS=;`^auwlbS+dzWLwsl|HXq65uCKKk(7gigx%MgVUrj3rp zd}2N^pOd#w`^@Y^)IA;WFXcl68~8B;7xZ@BefiH%masjy+1%zfpZ5Cwv=%K3t&NJD(krwFl%0n-=|nbKjnZDUu#;+9 z6(X7|r|t@^_N5DfM&`|mEtm-jOq|YL3zLZ{1+AV}VPI}Y7{(=)tiN6~@c(au%iB52 z23&UB7_;Mk4E<&~3rVw}&~XRuCQcojV2bLdPPKeOpAcY3@1?H@|Xy5mB9ko#- z&mzafa6c6}7!&#>2g_lAywU=DD<^P0%o<<8#tgV~3{cNZgA1Gj4tTPYsy(%J#KD?4KoJH%e2>T@qAt9;0=v8?e$$Ns zokOVPuGf4Nsu2MI01yNLgA@P&7z_x7g27-&EGU+Y`}Pz73tM2nJVG{xQ6l=?2JcJYci9Cw5pS@zW>Mrz*~lRt34BVJ!Q{;@2vaF zcwfRq?r{n~xR)hq5*Z*QY8O%e=#pk(QX97d;0;On)ncznobXym_ppVvhdeaIurBEX zEbAN#b4);)=J6maJq&I@qBm@FE^_T^(tO3;Y6hv~9u^=?wrhW6(RciUzJhu56=RjY z0?z3x{3mXu`ei}L1YoX4hr#IvZMM78h9G2m`@pfPl*k5CpYsG*In?m0l!^M_nP`F* z!>{}Pa|UYyEGP|gIZ+pwVKDl&7eIIBw~}oIK&WUXM4|+ADT=C;L^O|UZ{-#K#{ntf zBr9+&MWPJ;8#tGpe|j3G_Lr#OvY?xJ)qf)Xs)M_S@-T$!YSdm20K;z1fXPv7YyW?> zU>P7O;^-#tq59}*AF_+1*SJ!0(OH?>@=b=Oi)2MxW$Ou)#L9rP1nzHXTc`=QOPL5R zA(M@4r&L_$EvV<<4_+`8=dLIX08M;}rQ(cZSDaaN*M=@jw z>%cFLb+DjP|BIS`Bj8mTX9TELNZsVt?h^2Htds*^=p(M_r&PLiKw?1%XVP24!o{+3 z%D9S-2M}bqS}(Hr2X6(emCBBDI?EWLuo>LhUcgXYH`EhQwhxsEn0!#Q$x^j(;V>ua z8Kv+vr4i6??yt`)iw$SWolUKsEJ$9SN~EyXQhzzeJL02KHHO&C{Pvld4GckaxA7c%JD=6p$9yIc%wNsDJ)%YM(&bv z3E+W8K?o7RByej%+U1acwgCvzJ|d0QCOT;hN}< z%aud{f|QTb**=U^?_hQ z!bEGcl{Y`mA2e8zxjG?%RizS=%0LS;K9<~!XEvlcwY0mS+xs(Q0Sa;sm%;ynANJJ? zEIP};g^&PnQR&A0z{ko;1Ze+5dZe}L43foR2;j`bcbL-z%Iodu5)||)yrU;yD}e#! zZ3NFu1S7LneT+_yJBJP{65px$XWl=$ym~2_;<>IoXEC9MH0iJ(>zk@4NiE@C%% znZZjegMkljA9~U@-PUS}xT>p`SMjalb6?T%ZW5bi2nSgfz4<*f3Zn35ZxNzmIEh;uD6>$9fF z6wh>AA-TuBS#+8+>#x1}EP$yx!RvvqrUvl!fd4eEgz?i&xucB-E`}>deZRJ^|4G4( z5wLYFAWma>==G4*jtf<$>OAXMCrMu5PLyAUr477<*nNKnba;!nCHFiywmoG|B${Bo zQBk^)bY&eglWr0bDj<#&S-Ty$|FTBhLToFxp3mr^2)G1%+*q@3N^qt2!`vle!7hS$ zzI}qq6(i$UMw5Q^X!B4Kvd#@I=w}mppe+kcsRN02nmggp7)gN{f)-w58x^*0H6>5m z|4|4Y2tyTl0BaMKCR_iVH$|2*-jtbHfmK&D$Sw4a?jTL}^gwmG#DgYvq_nf}vvu_l ztN-C>CDOF)BA43)_siGLuT(oIuvD|P&Gq8W*n#2vppK>C0K>W(buc|`mHL z2ebx4;vT4;fkTcd9hzd$(Aga22e&0gfUDtYFI3pmZ%XTV;%3>>gDKH|;lo*ou0YOl zEcVfRAJrqdbwC@K(~uX7)Ls-L9wg8h`2;E3YC{I4Da}RJP?hg&XFU{AKdUT(e9qkQ zzoaRIUEJC8QrOzas%q~hp~Sp-DGnOm`Art#Or42jKK0Q;C{I9adYrluTbot5Mi~aj za(eAIe*Hu`Gxt`Uo=oLWZ1y~jSC;{yo)(At?~Q+gxMPb*JH7n@XAsMIV4L#;k>M5lNe9@{cP zH$nCA6b|{fk)~yXvTs0X#JO0ks*_=unptWf(osxz&2AJ&eHGubRfHw+gbzTRPm( z5d#XmE~I8Z!2MY<@BTA=G%_Cy_ejX+J4k*UJq@PT4^emz+paiQ3#(R(*(Y^Ei=cKr z(aX%%w}FH7ebs04{3&6TuH}h*jSOQ}tV=q*sV^q9fC}C;_Yfx}hBh`bM&*Gm`ys_f z*6GM0CpNgxJI#sXHL3JV%~%^gKr==oh#>_UCPW}cjU1klK^?xBljlBw%5dd6(xLZa zjCODYAcdiZ2u0og^<8hn)XcnTJuyZ(gcQaEfED2fBQWi62z|00YDA9YWE?rC(KJUg zPn}y;fvWa|YYiri8{(8ONv47ncT>rr;0;i6;A#+H$xaHD3;B}9*89-cFi)Un#z_jq zS;v)5RY%9(KTFGB=rjEGODQ(8aE>d3Ob3*YlDDcvWQ8_{aqlCs6uC(}jHS=i@x4X# zmiVD0B0BaXRDJOgfka|&4=#C3ms-=l6Jje&KeSAbmhb`e_~c6Gr- z2=vZ}5wf=dfsn4`cUN;UV2n~;DV|b~XBWEDCa%4p1Y7o%*<8o%1C4O%TMH0+Nj7Khk=paUg=wJ>a zI`Do(2N4c}>mne?wv0#$nhkMp60?j0T18pF9@@IqaIxsL3=_~g!^m?7T(A_0=N9w; zn#xKohNpV~d>?xmaG6mbkqu%*DWA&>hBB=v1ol)h9d0RSOnlJ`eVGj*)W2rq*<9 z6d&{ylTzRzD&_T1gdTE)x2sDvzwqd31FFLRTJzqrwGWAb!Qs*T2B!`h4LwZn?%UA` z9PQ$MqToG-&7$o(6c4)4<7U8jSKB;GbNf^FG3fR!hYN?wkO zPU;aXPd-3u__&YoNjU`|jBf6$u*el^Hst3QPu|w_00dyYdQh#kp%cynCAxcZ<-Z?Z z3n8MCd0=Ebc#U?~kS5;9@`zkYrl+))VVa(61ifFm`;LoRue-bNsSSN!VDMOHJmy8S zgOr#QZb7J`nmr42Tf1X%psJ=Ns}5BKfn#Yx7c8j&Sj8KQ8;ej|Jbu45CxtXZSHgn%G>OeVxke7~o2>q4fq_KLYcS>d-Q>;=K~Lf)M*5qd}^iM=n# z17v|JAXqOHj{ouiTXs}wMyosGX@%Afyl#q$0|(nr27kWcK8}W6ezxSkf8deE+%-xE zml{0!eUSc zuTp0f4`-Mrgz|i}lnJn{fnm^6#q#ggro92!owqKG{!?t%y>_A66L)_-YCh1*Mf;V( z=kZ~~sKgN5xU)^oWKNB?OX0PV0fRDu{C)d~(>(AqPary!P!SxS_YAf^W5lQFMOnkk zll3cHr;5}3)aV*opFb$uHRS)rm<|(Z296?ARO1wlLTk!O-k;2ygVFe$R={GMVjwe* zE?tXqnio&?LhTm=itr{>bQ6?Q*eT2#n&;NO)%+AU}chB8t9BKBP|<(wokHY z9$=zgZz*kq2xzI80pP>cd}9=j^*}Zd>wHsIXqy>4qZJ6S$iE)8pXQz!5Tw2JS1t2j z`Rs%j=b}bR9q}<(y!i596iJ)J;`M&-MaG{87PAR%2p*H;dfoEF z^(0Iy&J&OQbv|v%AoW@zLcPbsLqdH2Z;a6<1}p)~)C@_f*J~81A}|A1rU4Zx;#pD9 zfsnRat<|<*aO=nl2ogY<&k-%r-OvDEK%l=Kzb&ygi4{9hE%#P^4)4)7NKc}S@c76TOy9rwVS{X>vOAojH&y~b_uXflpkU|R^iL^a8-@!lW00aI`zkGn!xb=? zsN+%V)|n+Uf#p3aXB_y%YC?KMECpCUm<~+n;dgMx+z_7yUE10-S`*SmeDz3%8nw)(%BvM{^`m3N3XHY& z&{9|cio&ykD9^3H3(7*p`w=D(77PjC{#ACKE5%rk$6MdjGkQM7tA^wXV6QjXyFIFu zXF(i8B`=7#A0%8x$@t33AUlK67I7z|Np`5-NVyMp#gIzO<~Z_9@ZH!)A(hXM%du-{ zIr~#Yp#A|HU?l`t@sdVosq;z!aNoUW%U+cE=+OK-=81osySiV}8t`$0qHm_p+wtcrk_yEBM-9xQv8mm8F7Z^91}qlu-@!hy1Oj*)&OksM#FY znnXuPMFO+y$?7&%RC*Gl45@6}hY}KQU5hF~ti%Wn#S+z-8$;2Q5q#EX_X~x#r27R= zN7eGlq&1$4b&8E%?8fnSDVAQ9gMGFmccr24UK4OAoQS5M9aA;iFqOLo#74xp z687vPO#u%rUDiizcHl^0Y|8R%lUMHpd)W%MCoY7OC2}(~uP$PmXJ_4kQb|r8)VWnJFCEa}wUu>b+u(vSa&Et-Qkz(_M8z(Dt zxA58<9NH#Ft16SXIorcruiU_I&W(UH3c(kGuw}eXsM%>i>o4hvby6~16GzG46TlDS zqPBraAk(s03J^m=*qA1yj0scMLZMJsn4X3_U_W7!bnpPF1#&^RjbW5}BO&2V)YfmW znH0z%f#R)F%@4zbWqn0sF06;%fiSA76r688ja~{2ZXj;xQG3Ieu}V{kkqd7OZt7mj z+lJlOS?I4YzJa4^`dn-*r6fNcUKK=st|FsM%AMm$h^Ue2%nkzx2n?SyPv?Bw{|&8i zq>^eTl&A^bSW=KJgiAwOJWEU7*uBxfZf@pgj9H>UQKC4wkV1Ncq zCH~T*vtF?D>n=!1E!EyROD0QxgX%(<8RB5?DAYt;z1GST=@x1=HBUJ#7DuVW*7myZ z8yUjIDnUkmMd_Tnx%CbHLYT(?g>LVjJB`@SI_mcH=;4F0&=wgiXsA(RU1EZpJ@`@x zu@X0e@^v~fRL*L6|MW$JrdQG&QWCImk02C%a~o+WC{yArb0IwCzZL=-wq0D{eHt{x zoi8$rP(g(RW-p@7!>Y^c=>yZFQ$PswzdHWmn+P#SH9S5KWNi^9dX}wI;aqM!kSnLC z4lMZ&**3W51D%I?G$_AGQ zO!|(v2)*R;s-^ZQ?<8Uduleg)ex9i7K#&I%&Qtp7bY(;-> z@-OVv7{lifc@mon&)mxa%P6L#Xed{Vr#YvL+spvAkQb0~M}}+VLKiG|kK<2_V#oo6 zPG{yygEp`cfer=bduk7Bfq!MDH3i@3Gq*wLxnS5K&G8O<8Wc30xJyt>&2t`x8EKPc z4P@%DJpx^|2lzX*mT5_kge}D!Hx$sfJC$N3#y6)!eBgd`%MjKN4lfFzLZP-9dGR(t zMa0Nvg3{74JiYDp_!1NqVq89{H+&S`DgBlmr6Fb?l^j1}$r9bz?I4kEk6~-ZJ%W*f z4pD42LR{X-sGCHyVjMOj6Hw&!%yg8|DUfl&kLvmRhaQ6xV^$$XL2bi2xW*!r6ayB* zV%e}5Hr||7lX;KALx4rYFiCGnM>xU*(2@y>z#diOyQ5Bs*&2N$hQC-v2<^H;>GfRv zt$33TK#F*1Hg&Z3xSlm{lkn_5#i%iOFY5N`Kll$NtWObcrsxb59DEE1^ zcl2S}ysIbxcMd9&ofcEF=TXIeqmtW<9+gY+Nx)o$^5UYkL~j#c+YELe5R=XYD7p&F{gUb{^7edgdEJZpUfBK0S8 z@O~h}r(qaE@}4HN}aKR_so~1F6HJo(;>##1G6WYh?j4 zwU&%z_yh+G$WaOdMl)NEk09wtAF4C-hRedQ5~bgMKO|1V;i&%n7ZbiydGBL{^L+C3 z87OZUj^85C%f-wB8-mw3yNlkb6e?IX1_n2!8LbQB=g^k4GH!>pNNtE6 z#oP)%Ewn~zOPo-+6!}>+5oQ>SuF8s&hUy;7y74VpTEGMH?}u3tUrTV8gOYXj$}@HJ zms)q-vg1Wb)DJ5zyO1q)M^|$OAYv={!a|*o7OZnQJZ_9X92f*zsPwQH(bY2k`yktvY>SeDjwsVa_R0}( z&!d1$h0N^O2)+G!1os|{gZ0DVKjjb zA(QJIl?6U?E9@3hgVf-*&-^|*(4QGbDcWBp=Z@6FXn%3KH z_;^-2pTnoOT4&${QS0`re~`iQt;M=zzQ3``<+FXH*I((+y|j3)8TeOsE1f5TKT=J= z=Vj1(Hr*fat8&f&#F(2;QOVmucUScYQ^@7WPKfIk;l6j&OA&kp$X1)dAnW>GWn5!C< z_Z5mpyy5qAo1!u%U(4rZPs_YbGghOWjtekP$H|F3WAk`T2slDhl&-~+)Y}2Y?M0$oAG~uv#A`tQRG(OK!v@WF!tk-hheC00c(#%qdc`p_d zPkgLia~GN#(^u$T`ff^>oGRN>MHQn*UK;$OUL`=>@SQ>f@?4zEy z)Y6ZK)u(pbodJb+E)?gwZ3why77J*67#$d5m~FmJlr!wF8iyYSwzrT5b`-QVF#(dg z_`sZ9(^mz|ab*N*MQb&1Bf+TEOdGkp6kfiZ3!oh$3HNqxOPCBZlXmG+X?@qqvwpBz zDg{l@O7^(CAr1}Udj1_N;FiWKF^!8$X+QK~R?5^Bs1gd8-m<{O#3iKsw6q$dx zBuzT}=x^(uvOod4F0VM4oWf=;Sf)wRI^oSJK8K*vGo z1Bw*9CE(8|t|GIExo`+L>UhxP<-Vs{O*R`@r+lK z<+P_b2HxEOPV*1LO>7l5j%LCN@(l$y%w#8>AoEHGi-3dq6j!~{o{$nCq-YHhl;sWA zs3qzVMGopv7&r4OGC3Qb-d~V8iA|_ppWv8)f#|Id4!b~*-ajG^2zJ};)Oq((ibtgQ6ixjES#>o9e2DvWoKtIgtHfteXin7vWp^vr zAaQd@f3cyj1Y%E2L{jml@AKx~c<+|>6=HB$BNo3G-_f5yiIpAEhkg%VGEB8bc8j8a z{Aj|H_ZT=I^e5R_6bCV*&oTz`e2EV+g}h9d)qOBdWlM(9Dfks5eOwSbd_3>b=~}4 zYd2@L?^H|+P6#++H%@{%+xAajw#7Q*_l#(IZG-otKTNucirPcpe0}tW+)`Tr+v*NX z+J!C<5{E?4j;?ty;gE=I`$Y=S(e7Nn`D-+kx&YwTN{k^74oJ@=3Rr;B83V+W*ko## z`~^JVt`9W0_xTFWCW#!KOKrSar`YfQSJXC~$P8B zZk1sP3dU|N=l?pFIr~$aP0+gZVMurAT$O-7qZ;&qhvXud%A_8A@D~#$)4!=WRqroko(yHv8Ux6RIJBrJ+xOvKCD%ey3vp z1edf3JX-ltYH|DGH$yz#@w&HAvgs>m6?!e{202@OQ08Y;zI7|m{JI&TTM82@uj{xs z@xZn7sBhq8N@3-MMqJIYrtGf0g=Oj{*^rcD$83lYNJi?KLtbOxLmvQ<43qOfCqEm8 zTm$fmPYa$kYS&qPqbwAs7}#o&bz4Xk-e zoZJlWMehP}hs8#>+`mIn3gwY5nNrx!^%4DPAuHD}*$}jW&Sz|e+x9<1Hjv&tW)d|* zqzB4pmiFhz<3vycIBGsvp(?z#ekQ$Pv`Ro0mjMXVj|iJz#S*mZSAtdA-EmH<5L|Rf znIIA&hB6tt;y0xh=_RCZjr7QfOR%P7R&*(CD>IYM(bu?_5r~EwTtzdV3f>1eIYP^& zB{2Isq0>VIUxL(SJI|Huz^~CjZad*w(5RdR-3B%6J{=#FjkcIw{-ai7gTxL=6{d$( zoSiB=DcA!WjII9p86=1v{&)userE<1A1^1Pd(uAU@lOfP1aeDu9EFqAFPlFUyhFlN ztqF<-1K=A`7-{vc>U8QWoG;gHt>NzE5A_SU2gryvIx`GgGkIw!i#L`jp`xVUcO=Qt z(89}_yoinnFg#yC$5pfY-)(G%G&g~1S$Sd9CIXp{vWJEp5f~Cxane>u12BIeFUXm@ zJWD*#)Rgq|+It}Y`<>nog*Kd$}!Bxi(I z^=3Y>6_yXPShOf%3*5M*r#4m+x@bN-wFCL|^v{pC)Jq>FV2<9u?a+JWv$!L&4aIao zXIX1c@srh*} zm}E6{@jFL`WJY9dp-=jFI_=(&X1_-yb@h`4ryO3^$_RzUu;Zzy%Q};02}i_VcaB5> zr76&3!Ww@~*+52fv=9p$glfP3BBt=<8m4&#WOk6}&NtLGY+Tv>%h+)CyG%PsV!aB5 z7cQO49IU-rS;TVaW~;f;%>W;u2b-+^Yfs?ll+(6hLF68vuLc z-u&pD;a)#k4yB=D%OfEE2Bj0(5Svb|A^d5pQGiET>Gs3HSt$oQ|W`bAf{Tp7n;MdED!x$ zXd&mGPZbUpcEMmx!8p9fJ0A$C9XVjoim+UZ_>Hs^#-(QS@$L z6Lo(g05Da;C_SN9SsP7x-(^B_MOe#i&gJ8f{$e|40N9e(lLv6%Ri~UN1#TIUMjwuVM`7uKb*rY< zj7RDPaq*hm^#+2yXT{0-qSI^dAJed2;hQU_gSxc#8uP4|jGdmIn67}tzNj;3@J$v& znAW>!|@$=}j37b;a=>IPO{LVAb`S@S7YCPvn>tZvCH= zS_RGAUoFS1w8%+`BDvs|mMf5*$KD}^$~yQd^Boa6-Z3STfcH~{`2+AUy)qc0WgVuE zx)EAW27=5nN+jn9s5Pc7S6w7)$k!ulU=*>^(Lx1bli*sFnsB!?s=02vpK{#_l_-Z8 zMvrG)`0dw@b06m!3(cMb``(1g5@dBm;@VYI)80tg`P62}_-b1s`mGZ*g4`9$S znDla`ISD~I3w z`O1nML36whtB8X#l>w15JuS`}Dwg-X!WIHU{Dib#K6l}nS^ zE{32VHxa?Aj=rvnepqzX=H1F~KvEfry~;QnPu2QEL@7Q{8mfarqTiCS$YLwKsI;`J zP`*}ZGN^_zeCi2pRydE6g;;)-_?>}UzDw$$w`jK?omSl(yeY8L2gGq0yA?~6I{JW( zft*qZ6Z;*nXF$v>t`C}<=GkL6D?1OQ7^&#CJ%><2HK)&xM@C&IYakdEiDA}qgWT$W2X z9483lXERD|8(lMpCEU4g1P+e&4h41I*5Dg;f1W8m;TE@|tMhh4(4 zg*=|%bx-e%`UES^Vr?CD+IO#BV^I8Fj}ee+OO}j^3ZPPy_gaLmpLvkNmL;9wuVYj` z>I#E=QQa8u-^7nLT7D{6?G_}*Z4IJ7qnH{}3i|)Ose$EZZLYLnxCGXFijz9F@|a7jw-C<1mO^!sbl86{H34(J=6qyEUg# zIvacQchJ9I`XO#vV=Z6Q>j4#Cr#`7>b)i5k`??dM1K;6OQwHD(C0S`_Y1$+A;&{Xt!Xp4Hw8^*kUTC;mdz^*b z4Zd>rZz4yg6W$2|b|qXuH9P|QP(tgzuZzvmyQlctDC6jnS%gEVN8sq*>SMTtg1T=9 zqBSAF43q*(;&Ak7JGzrnlb$Oe7lM#Yz%X1$a*zyxY<#;E89;$*AlW69Fa9LgVZsFJ z13B-x9%Dle{o?ExJqK$jPmJ08y38R>&gU#F&$hQU(v$nsCIZ!9Du?y z26f-Dxt0TABygJV5HQH;os16cgvixNkt_8Dr?|*5uwU2FtaDzYZG2z2)EpL z8j)>x1)T#xTp{uXe5rqUQHQNbu>ozm*r%H(ZMGyym$1js3_K>r^)er4H)ydrHI5s} ztHUu7indV(@Jpo+$F>uK9}@AL?-pf8>0 zjqd3-p|4(5b7|ybtd^j*7R}$^-`WT*qnE3YCX?IJ2r~_%;c%xb9yPbkq>dB@ootXZqfx z`GVyyVHlxX5Da@Vy|mLh#>h*t%Hm3-`1d8pvOa0h*H8f2p)ZC5VZjX8D0Z!8z0ukJ=LML(!VX7A=i*-5M>8P=0uV=Q1I zS@EPRFMUm5KR|j|P6TvzUZWx;?Xu~OjQ)iX_JS!CJ*0Uk_x1ezWQT`*F2yB?Od%ui z9UjNMmU(PDo1{TSp2kSP)+R>_&B6QRhY%ABpqL^0n`+N*CbO8fV&-?z_Q&~e)G0w) zv+Niu`w27MXPWf{Uoo@ZvsHpl8n4$9k3}3eSGN*HgS)S28cYe7;E^$3799pXsYeu5@N-dMF%}Vlk?^BVmVOhzujO58mZjDICS>acjZCgS6+b2GV zA>VWFpJ0n`u*1*HxzgouPK((#I@$zXhu(B(_wn(P))zLXbePXu56U~iJ63zGcL+h2 zE%7D8W;c**%3H>40hkV(pO&xlq&NP)olsjo_O^=%MBfp69B{a7Odd!`q$_=T|Gm>? z6YgxYos!oM>;#E&8aVPV7A@ftcF24t(}DLRRtWDSBOv3}_Yul5!=;MKLyQ7FTJER4 z%O?;nu*nf07S>*KNpcMF_k?3joBk2~lMxCq2(L^QaGJEAW{sS&&IOfRWzrRpFmh=+ zM_PD(q}Cn!xflo|6RIFxw5-5EfkM$@ysKL1T1+N$YpfNfoe9h7w0na&#}07A=^ks4 zf<)usA)-9M@_L5ZnTH9AS`Na>eQ9pw_^Q)|%M5obO+h;v|9(4`DPHFR`K&`*a*Ka( z02&1a4;`R^C9C^6Ty&>7$p_fh;H6ar&nm`_L-wmyrsTsSpjSv49pmdN-O6Ho#bk7F zZHNSD1ZOrk=LpvL14sUIl;G`47VDZ4p)J#%ZCQ3 z%K! ze%N><(|s!J(JV0Y9H2;n${vrKF-b^53y4VX%qX5f20CLgw%~th@?c=k-E<`sq2hmG z9RPwO`Oq`AF#@+W#-~&TE;^GM@IvzFKWr1k*-PM7>Eq=>i>P>tn}!zIXhtm8c|EhM zDPNb3NkS4Sc71F*TM%g5H{Rn6YVDsWZ_^n5urH|Iv!%-269Llr3( z3}rAQ+~oS$Fpo%{1mhvOvr#f6NK!8P!y%_6#y@@oBmRs}S`8%@OG&oHxAl?h{ZM)t zv6y(azJVuaP-!WlrFV~u(2#u?%9cDyWV%wSwJvLy2Wpy8Im`-VyQ~nx(Kj$67v2=a zV~Mv3E@ocPI~ojg{bTdh-=3&CB8vrx498`gfNi3jd>LzoR}*NnrK%>fMnI(z<{unw z+Jk48al>P6lx5_`Y}eU2)7kh_0D>!+!=_L{MSO-c5gv6v!WB5Qf~De%!%m_j%pw2)Fv0LTQn;6j}z!8-p4fk-0)78MSk5YUB;;&ua4 z@)1PYn6{MfSw#MQkK3GxSRxl7M z-=KrA@GSOxN0~a^Oa`1%;EL8?{O~NK2-+1qmLy|eg;Rr{o>>P&iGwGW-9Q-$jG(s^9% z2lP&ne^sBe0k|?1)H8>7&59g_yXgdQkaE-y{x`gM92RxB1GiNCFd*dO!ViE4^S9(d z-wHI#+e(7rR(rPv!-X5DR6*8mPDj-0MmsPTL_weZHJVQZ#D4&t!w#3>lxms*+exM? zY_dEVZxVjSe}JW{;;t!=4uEHH)ExMsDKm~RGkqN={cea}Ff=X_-Y)dr1tsl1EnpRL zd9-!g=;qrGF}s#su(EI9la3m!FSddzqqv935N2lqhL>%^^}mu>qoN{fEC%#W$cjcn zl~tTe%T=dy?Ns`7S6TiUhf57%tz|hdh-reAOz*A6r#(>*j>nGv*OlHet9%qPU*c{q zJp`13T*4;BW`uEbOi=dM;xRvGYZRTayLO;JPScl;1WT-?%XO1Z90KyGTEI z?}$eXo=)S-HgGt==>|}NjQBvX0;i~Gb2Gq7&)e8c;c3WlnRLTOwW1kIGY?sqrYVLL zZbtS4y!YKYnLBO(8Q>6A_Ex+XIeQ{0YhZ8H%suAPSZ_7;aR>)Kl2BuR))?!pgkomN zrmYSA>mtheT2;7c)W!?(4Uk>~zjn(7lrPNT0>;@^yUCA5#(!#+PDl}lD5Ar2AERz&!3+n3QsOIM zua(8k$Nn4&Im|)jl+-2(q)ExW;GeUP(Py2#vQmJBaO`I38Y1-#WSUh-?>@mRGDvW_ zKYRuz&JEd^dYE@)R-z^(&#zjj+~}g>yLKJ^YeWjca-M~PM71uf4hy!Rt23HSLe9s( zj59#nV}>y7raG7b6ubrwNe!nZ{JDgIyq?j0;;T2ZLo7`giKelcQZP>xb#?M{g=QDDux*Xe>4;9OKA*D^_a*I z_8AJF?S$UXW(8ldhrg|O8qU`OoB#_1Xp&}tvDVIeGCVJu2vweW;5fDZK&M}y8wAxv zV)5m=moE>-P1vgCWpfI=e?ztTaN5h*{&QZvB19FDNCZlJ?Et zd%Ke1##@8Ia2ujrhS8pf!_si8zL8RpCxfo;{|2=g6Z~}Jd)zcw5|oxI;=%wNxofrD zqIjjXinS&glcDdKP;X@Csf|*T5eCClTUvXihXr@=^Z-3J1L?NtZ*rU|mnhPVQ_lyk zQUVOLuO;;TC>!1Ew+RA~(fn8S8iI8)sHG$D-LrP)ON!1&-c0PxCgW=#WLEWcthRM2 zFnDklQ8w$gwGGJwS)-drpPo{@D%D5Lqdvo26`0a9PU*j7_W@BtUNvF(Z^^@ddkHik z_L#P!-1g9C?jbUtpU})8HtSH7MaoO*$l(EgCkJ=`Dok(gj<45{&_halAvWmw7U{0R zR(0GwR`byh^5uwf6iu~?)44?Q?n;3VG58yL6u9SEpiZp-1aXbnz`#iD0`3YKlls=w z2m(V$#yO1Do%Hz&uDZuxh-hTsCA5O4Kn)@Z_vjXk`p=}u;0e_G1cjt}>E1GC1rC-! z2@h+OL9VYoPR(|nsEwOSeVgK`+fcpfQC--M$9Ded`(O>)r_nLYNd%9|Rjzv2aem}U z3<}cBHOg%3MB@!=!aZaLQ`dT-19VgFO?ldT+WD&{;}qs+p+4s8lFQg+l2Z7&(+YJ! zauHp6R}2?HUCZ%Pg%AY9<$r~Bn;w|5)?0^&zMw1{fjHR?F-9A}1$2od`xAT-{}ra0 z>5bzxXSh<9^RBQqS@frhOjm2)8j8(~HljO+ceKklB8E>m(D#gqJ}_33-W%5%gz3C+cTo?l143+82)et#Cb_iy>zUr?p45D7=mU(=*$x*Cfa;m(yP#X!f(Su&r6Ys z83~`)gsPB6J7lpHG6#%fmhf`E^sb#*P35EA@4HEbLz_WMlX~_>nq)BOeW&jAw5VVh zgw0?ysxSJeq}pW=RP)2U7nFkGOGMs__S^OEiRqu2*N&#M))Zg;Ku3hXTUw)5atU4* zYDpoV9yj*%Ab}2p5F2#+H@zzn5I$3n>blM^R~?1N<2S0J!OZ#VqK?|@7?Ob}g=5kY z!(i?cRpBM$I*v@nRTu@If5!}dDrd$}n$XSW73G}cnUzA$ zC%}*&qZkBr*q;-6&{9R4SP!6ol zAgIi0F&l7}1oqZjT+K)W0yGRrvXjAx>-VbUGPRvc*f&P`mAm9=RrgaQUr;~ujLtc* zmAiF=dzi(_oo%b!K`{hlQkw?Gsa41=!Z~HcEQ1E8pY4Lr4OVB^T0r|uDhmF zqmXsBSySAt^x-%8;YIH!Y(=XMBvytDRWW1-5B#`>68NqV>ncyd`xqxs{eSkLw_vD; z|Al7Y0}+-e@G?O@*WF?7WD!NQ2f^i~yVbo2N>W@a<~WK*qybB!K&)`q8cs=;ZmYzg zM}*E3>W<5HWZgk6HX>r~ri*g|+UOgX@thg(4+Pgbc+P|4;m-`TBLZFSPV3I`c`kxnd5c<$g&-&)xSSRwUK9 z>$FIJ*L^@~NZ?%eC6&Hq-egW9vGed}s*^~v(P+vjCECF(bW^|QBU&sJ#-+NHA#yCIfMi4hVeD$ zK`jIH{GBW~PaEsraTVCfFvgun7=p+QmRUR+8e7dUwr8J%zs}{4FO+3F=4GI?fO%k4 zD3non)P--^MuPl(R@c;IEDL|&R9bTArC)q81r5mm!e_iJMQsXzj6MIE*wi$$_1_D| zv_axBcchS|Z5IIDIWtUcv-Ly3I(=zNv%i16~`+0vRlrMv+NL}dFW_FW*)9U zjP6_WDWMPyQ4{MxT=Ve?XeLMKJbvApy{8gJ1}sYek`fJ4ZzqW8(_y<&Rc_SRX7(iyik?^#3dDhrk4%*^zM@ID!c+(B?A{-&*538-qS;x zB51Z^^W*wEE5vb*1 zP}o662u}00MmoW_V-^W4S!^;7z2oMvAv+#;Rj z6yR`u^BP=}>OE>z7ul&;1lpUYa3{FbJ@xJMIe5DrI0J$aArHvsjYC!7efM>Kfemw+ zAx(!d@N;Uf{_Y(xJl*B3CCB_63`J+=eCS0lNLZ4o%6P~gl&kZI;SZ8(2LgOh=)HUa z>(F6Ip3*z_d=60yIKx}oJEfL$mgH2f3>MJNIw$c*Ef8rs(m&r%oztF3KWp0}&SOOQ zwme>KCZwix-i~sn?Q&<%6b~aceS40@V^d)#nOk56xGH?_s0y#{X-o>RyO~5LU_}Z3 z`pmd#5;+6I6w3_Uid2O-Ma|G=9m`GQmdX3!4Q&gcB6zKX6+9s=&S?4;uN(WVUfFi+ z0UcDBYszr_kvKHP_T}k^Fz*;dXDB7;A(UJ^$=E7r~d_-=p&kudCex9BqQfdjnavM5WVHB2q+-K z4*tw+D^8LlAksWxp5`5-68URGEa%h|)LpQl{*kpf;OKo8^vHj&Vw8l|Sd22IA+Tsx zm?JJJ`|Qe;5b?a^f%2^=yo0RJd(X|*82dvmU7*esd@E|+=~924i;L3G&cItP%4Ms` zjTA&tHRu{TN0UqhC@uj((GU#qw5qONu*R zbQ&3$3h}SRiDq#>W8JtZ)e9EIO?r3N(i|m7E#S-yK5XQk1!ipBbF>ZZ zh{ZaEOrl4{BY%~+yMLhPB?RIi+W@Xv%o7wia;%(=6VtxKaioKRQ~)|SPXD7O5QG!d z2n##hBWbL3dIQTOq7{>`5Q%{)e>3@bWg(MOO<@8WbHArX!!MBM4s+bkb|}6O@;j2osN!De_F8mW^a+?Cq_vvd z@=ut_36yskN^LI{=br(-=}>n76})U95(tw9UWuVMD1RHs*I*8Py}q1m|-tT z28D{dvMLBWS4h@rgH?s{OlwFNQLm{|z74>6=}!>%+*7Lj1t0u@FSBtIbgxJaX;h5f zh(b6+av5uXY;CV+@>SwjZEl#^?_h|srzbmd#;10~sD-8@Bg zxVDR+6h2wEsuzgiBcUHLCDEXVUmOab5yc~=4ve*Y&~WRT%c0L=hrD!VH|Mq=BqD6< z7bD%d7uBMz1Ba>!HbhOgff<)k3#~!S2k7w0}2qcj@ThZuua9pclQoNFsdFb z$$tn!wO~PH_KX3z1`0Z|hM~?+?Al&Ag0VA;Q?e@#xrlPVMM%*}Y1`ggN-3pGNd}?? zu?1`e)xDD6&%Kxn_n!AoI&?e*9vPZP?w?Lh>%|@^o2lY)fG0{IJIL?6_~KM`(15A> zHm0O6^}{iW1_qLOw00a&jvxqvmgY=p-ros2FW&;f47I>j#PVn^Q0II64k@KN8+;A} za)LbTq~l_-S&7t!o-ngnvLa*uwbIzLQuC&cx-y3&sZHkdMeo3(Gv0UOl;>#82ruvP zc0Dr2dOlM{Q#AJC6>U>>NWbPSYf59hp7*@h^InhVy{Y;=Z(tGmbIS2QC#9tPgO(N1 z&@y_M(Ob`8F%GOla6%z8AxCZecFWyzx13F93-QBXvoH*A zEz%raM{Rg?BU5kYI+Mv{t!N9a7(+1k?smJovpsrewB~fu`gGEIX0yHW&SY{tDxq=~ zlY2Yz7GmC+X8Gn!Go|j6d`;k2i0L?a|Grn|4H14z;4BM8>N1gfeI?Y7CKKIZHksVP z9SDNpUmT`tgv6}*J&K|wN3rv=8-8L$;AA#ZVdllD zj1ILJUj<_a?DztAyAixPaA#AOs6_H%O1*q6r8+QGzFRHL=!n2nO?!Pu zo+?emH@E|LB;3YAw!%1T9_gA#F>(ylblrB1yhk{6P>uaVGEOx%4t$#`8M+b5(x%GR zKy<_S8+SII859aFuN}k=X_CeB;2He0h&#+QwuoZGj4O5vre&ZbGj^C#m_-A7&IF{gAj1MBmFaNXIfNnsZ^<8oC_eX@4@s)dU z8Fr?J%}lJrL0|J5v!I6;!$L7|5!i?zT*E+9g{@!`4}pWgK42a&mJ$mggn_`}Dnnav z4P%TguHhOe3qZ`>t&`t)0nm*z+UnD3Z&6&W+{v3C^rSU)=f&;hbh>#mNkgJQ1|e@H zY1t6*PRA$zVN7YJd2sgCt2tkfG6e z-w{Zwy*PhhI3kryrjpLz7^7eBTXFzrK$yR|<&{PWcM$6ekDO3t=U+gfW#11T6;`IP0PdM(d2sKL(1CyEyMA=Y*OOu{ARa-C_ztqc# zazDhwaeRvt0D#e&@8NBG*4*^=da&==_!A)Xf?EO{-~#FURSGG2VGr0mg6qO##QDE4uTsDr?g4ATQ>TwR`7DRs#A0x}$~N z0c$$k{f%xbbsBX0_`zU8g&(HS!G$9|BB0^G0u`K5;fbIl=nPRf@NFh!##O{#VZ`;F zZU`@;hJ3AagdY-u3sFJuWlKf%oT4a-Tb^(%?w(_x-04o};CSx{|H$H5Hme!27!y;A zfCw#8!kmHP2p2uBf5*5^6x^pN*J`3Q(N4tMz-ctUDbQ^KjRp`5ZQu9R>Yxp1-u!zp zZ9L{RZzIHOem9v)D3Vhdt;Oz-SYqyM{OH%)Y&oAaFr&fb%qzed9VND1q#cC>qGHgm zS>oo++opue}U1Y9oe@ zYof;cvdx>AH-E)ev-OIc2f}1s5BwA!kH_PMHPV#dVG-huc-vpG`H+QTAY}=HHd_W% zXmoZRAe83vM>{G3Q|0%5qqmUIubD%kHojULhd5;SbYi@5-{LA)_p0N?){FV?6<_%L zpWmeK*ZqF27c{O_s{`EK|3m%#zWbfF2SRpuc5?5=N#`8yZhSdmj4^&LyBl9lIlA@t zUuG7wVbCwH#ioq52t>&2opxnz)^>E~WiAX;Q=H#JiGF$PbFX`%xpVCg_$i~OCLmOj zE<~Mlk_!2gkBc=yWAEj=R55FEP0X8@BG)7fQOsJ4>9e1ks&B}>HUuS>`|>;GFXp#+ zGh>gKKGm2vAC%{^`$DZy?uoAGA9|rnKQ6m3xPITtx{zmSl#ev&!NFC;%TQs&5U%fb zskw^WE;ZM;5itJFQNUc{UY#G6YFwdTEKO6|ceE&$;k4vjE5_7gu~-b_j4=};)>hGq zN}7N;@6YZe*#+*GIQBRQ!3P9i9>Mq%L!gTYR&Blrvq<{IsuB%s-;RIl&P-5nqC$J5X!VnilbfJPP2Tn{DF`*p^ zh;U)ou^M6$GsA`qntq8g#^;d}gmcDF$e%eeI0DFldJcrC-CU+ki`L|MbN9~7X^ZJ! zPSpAqoGD*GH{Lqm>dlrod$adynX=EGSSXJpBKtXEi<1ZW?R7elq!Z=`T55=1t+&bf z8s9-dLPA4BM5FJS6Y}DVzG~rK(9y}|{@>bc3R792E1)$b7hnIcVyaq{k_U+Yq%(P%UpjmP8hc%^dE0gN~O zT3H*LN%%%n+a%eJ*ffUNK-oWFBF&YgRZ_O>t%PfGnljh1r0|KMM1(fi&CJ& z;R!5G@Y95Ah8HhBxIhaNi@7YYM&Y*?1mW(WEm+una|8)v{G8_XOCSWHGf%$F#9$J zH>Kfd6b9ij86kg0qtR$Ix&fqLG&hT4=EDy_Gg_Ic>LLe}6S6cLA~$u*csdviTZ^r| zy)acU^k88+SeOkKHp|U&xm+%{_ue!|bCwiy{=Nx4U%Wgl8J!nXo*4h^g<1{wR$FP1 z(#s9aa8D_vD;`K_a&Gw(U}Vu04Z1}zPMzQ3(E&p9jU))v6bZCeT0!68(E(CDWk~+e z=zOo~rjGN=q%-XRI>d644!J` zLWGM--sHUbk!MCOhs%wpTf4PqT~J5u+XoqK+WOXX&B_hBKqHhkw*V=m}@UBw~dfIKR-I(OVUUzr;R8X2Jr8G}GXQj~@V@mU`8fPbXFrADN zp~!fPMvVH=bM~BP7Jp-gjW>>D;(Q>FwLZ(Ak?q#Fn=OG?VD3zV|_Sv@gollN(-b##V9XTD>)zS)sXYFh?G`tJMs zoYP*EQA%3rKnHWj?;Vv<7-X2Madk-&&?h&Kl|C)i{ZmYv_hHuj#x`F*m&tk_ruh3w zGRUVPUz~c9Zd$q}ZxzVm0}Dt1MY%$YO9n3Y@p5TIpA7YnMf5lo?I?BW5x^<2%5kUblQt0fX)IA1R)@S z2o8tSI2;ZqD_L>(uj9*MdDglEGa@^|{@+T{CfcaGlQ0qngNZO6FN#z3B!~F`VALiT z)5&JM-4jI}7^Bri^RA-5{rht^r4{3g>02Qb1*?p2@1k)c$h$x%hP>!SpdxsuP41n_Pod2dp}7_N=mylUFf2Un~Q|1p@b`R5(gf9Af&|O z;|opNrLDClk#@<25%5SUDtUxI$lF>U9pnkZ0Kw;$^1%M!@v-~cubJDxi)JKIn$f1} z6-}rZDX9aR(Nh^k8b8#OLWMIU%{3*`C`ASH5Uw;-PgV5xbQg7Yppyw z1Ft?5Uah>|nI8WqwDz9$qBFcG6JF67+CyicOrABlv|t3R8#>?2G%~Hd0r9|`$2tP& z#^dpLyvm!?dUdZn9*s1+VWD(RjBCBOhP%z>3kHDu6!X-CzLF7%TcJgno;kXl)-Xc9 zRypp(**ZlwMJAhqODC21afQfIi7cEP!sUdr#kpK9v7lB{p42I|b~?qQm@RsD_be86 zxy);R&tzyJ^8hrVh3Iyt9Cm#9&dzHs>Y`}ayQ5)KLO$TVIOauwOWiEa9X^F5$(2CTWz&A7K_CKv(i#HDwT*#)rtqnW3YfXutl$y zT)&CLWI|lX-LF=y7UR4viUt-!1E+p`;K7g(h^AY2yLVI$Zi`Y%X_QK7rPPBLOWpF8 zduxQEqM{<&ETWAtRljr5lG8|cJ=I+|txjo}8;#EN<|w+iY3hD1#usn8#UG}TrgDJv zYvNivAsU!BPH{V7tN?l(uGZQkNv$?(UaR47IGl|ydiOXT4HtcV-qhND+!h@T7magD zb+{qA1M}jOZz9?FjN~IJ{LZtcXGA8+;ltv3W+#wALdU4a+i!^8n5D*Q@ zl`lSy3hldr^zcNld+~E6X}@TBudQdgwCtkq%ZtXRJ&1b!ZT#8m%NNCs7;oRDJzbXM z!*PuPJuPc#BVz|@<1O%--}w}7oi8Bl*&gVA4$6d1^0jj)FylbmxHmPl&6;(WIcs$>q3IbW#yPFuTCZ;_-fhIyY+({FPcB|O8DBmV@&(CulaNzE^8QjJq&#pRLsoWt0F6C@_vFl) z> zDkYFgDCs=SBhpBE(+&b-n^H7rkP9{qI{Hc&ZM~=K0vKVmMtzLdya|;el}M>l>S;uP zw7(sMl)5RGeS5U)4EN=}jD0m~vni%wY6YfNneIzJMs0Ltx81&#?&i%a@kNRzwkUJC z^FeSgge!;i*yB_9-R^~cL#0#dC`+sNc+6(A+3cQz6(cNion|b4`Pa$~CZ@X*F7`1`T=A#a^(Lii8a?Hc<{_TOu znqTako%7`TNItOhNFdGlX>S9~M)NTw(O+S*s16t(A22??bKCPC7iEe!NSThsym=d@ z>WC`irRjjVw+p8JyN{2}$L3@6vH941bZ)oX4PUx|r#;QeFj&F&37}vK$ z6bTy(3^iAg94An~TwjU`-8^(Opt4$ZFp0*xC(&3_)8*5Z5@`)G+HM*@DBgL+8lzi0 zUNk}D)M_;`uH)$l?bW@WPI-v`xAyv&HNTgj*&xTWEp{H5l-34sa}pXFb2|0lwB%6; zI#1|r{CCcCp7Z{Lm=2?1ig@Mlz|dwNiDk=w&Dp9Q1ooWE{hs1+uDZ9swMuL=IiQ+%Icvmi!Sw72Y|77gpAHuNBP}CqlrE ze1q`rr+20+pJRu>(Lj}y-##V)URl?+G|d3kCpirQr{2pwsYVL`VF#ivB`S8pmg)(IcdTced$z#9*YJrLy34d~`_3 zpBcpMN@nqKMz@`~a$ZE^w{l=0h87{b(LVF` z9BpxG`MUhsgoLDB1*0Wgi13YZRQ-}E8(b+Yq$nZnPDjfPsMhO_b%=aK+zzW!U9MmLNR;X7 zob;}hhH^zKpm>PdvA;eP(k|@ejh=Xc*(2o+xWK3@*9=o`b^BRcv!ZU;S^hq!90KDS zL58cz!4ogRYew9w|AIXte_J+c0)~OT(pGUl_%g{A5$UbM@ih0kk@YWlue;I9+l+U@ zE59c+-rMwX+6RhUHQ3Ab!Lj1E056F0*PZ})m;i#A?S_H6Z?5H3a6m|i;o*o6RwOPK zWj~`Yrsn@+*gIg_PxHp3rco81Wy1rQ*tb{*nW@@y2TZJ>ST68y_mUWmt@G{>P)uI3 zIRIokOy-T~elYj%kgZX-L>CE*ba_}<_~UOk1Z_c}yIO<%KtnAi;m~G#m~W}L5p3o( zQdrr#1U*8j@=d6qE+WEJK!chZ*Em4oFYyn4$lO|Iagn|yVm#^GUKw!_9r)1klxi8cSPzg(>lG76xvHqpz|Hda=vy_ojIdgp| zV~>LW8+~a990lRp*R z9*i1CYd-~J-FeoH`%s2ImFY=%H-Z~0YTYW%|93Z(&IxcGojTS z6Y|W29sS?PJ)b++@;e7ESMtyw=SracNTj)8InGkL|1`Pm`-7-dG@wwEu83N9ra)nc z?N$xT!TxWc9aR&#eqXa|5pk4rU@@~RkvSp>HWCMgMj5L8?;Yh>uO`u2#hfrg0Z}Qv z*O|Zc%G!lcCt#Iz>47^Qj_n%nJ}y3+wNLaB4RIVGtg#hokB^)|QRA$S?QAdT&VbvA zDx7C`DoNp(;;~GOaHJfurOUnB>72A-+q~96Ru*1H!c`aTHrjAW3X`w$n2iBN778TK2*dh#%e1iF0|t@W#yljSQ|a z(nhZ)B~>6=GJtvr;I8e@~7y5YrB6z~XQnsdE7*(4J+qdQQZe_{Tas z`A5C*0@9vg#?*$|vlz=H%DN}2fyqP@akT0fO!F3(>Zp;deoHJ>7>t%NxH+Ka0rAyT zf}w``?tuxrQ>wFmK)=|_H&*8Dcncs*xiGMtTaZWmWt8((Q93D`0s_TPX%Z+bgwN8r zOx|&`=RxqsX(z^MNugvWAum+3;Vc8 zF0c@~QnFQ{Q;c}T`+Rrp1hXU7Gub?HLoCN;ejJiWO#=lOD=2jV_swZSKXxW^s;K&V z{vrC~vp6#rtVdu290e%H`45>^+g<{mEh?z4#(3Kvnq-22&MG`)CPGx-Gi}0`Jw4(A zz;*;x3x^kS6WXu;)|kmb*KG(LH|t_4A7FrjMY7(ivoXIxEIZ-xmx{Vl5Y%(Hh!-65 z%v{#+jP+vk4s=%He{OC0&1Ep+D`T{P!kaedlZ1`}^WHnr8~lFkt`UQ3`lx6$ig_WK z(B0Q)cU)0lWEdh@aXFAu=2W?2Gz}fk-+e~k7rJxU{NWYJxiM&niX~Uji>kMvFr<QuQz4GPp@L0+(pe2;+xk@Zi4rTSn&^k#H;qV+&<40PmnTd(9*T z3dBCollIGdA}>*;SA!yNIqz6zmx5c}j~XGLXOQbWw>d)BtaJlV)M(LcDEEqZ%oPYZ zxpL;s#uvvp8>F9wGSsM$gf#J-rrDUk=nzQhDyL(KeG937W7&T7Aok9zd$3%8L82xL zsdrM#0ey($+-Oxh#|sp|7c^`;LMMlkp`loQkx>3l(ubuP43SYx0T#BKIo5g z&B<@DcaeoCWDpM?`F-viH0gSh0%JpC34C0ODrYj451n|OQr*nve4k($3vrWDF!}kb zGK>?6(U&gpz+cAfVYD)?1|cI(5znkypU?DovCQb>C^I92(E9J` z4<~VfiKZm5mtJ;M^Gs0=#oT8oB40+TqHikTO|7aTCxxW{AqOpb>uFHW?%?J>Bzl`K zfpIh$be2Pa*;A1zaT+q-oo9-or3Gj3>RiYka-2~T*2vxZ<{D9YuT&1{^=|upJk9KJ z=o~~tc9=z48HC8ui=R=V*wnpiATqFnEx@x-`d^*((#(fC3=c2B?^s$tQUK3-UAxNr z$;BF}r?jfHz4rMo;?BG4YFauQl~O?w3( zfmgMwckE^$gY*hZ|qJKq;|S*~_`4ZKLd zuT+MKC5i2N!R9jzsh(D<7C*@qOZ|oXZ+6VR+tg>D;>{LbZRP@cW~dLBZBTDi@*!R+ z5b>bw@bQ3ho~F9VG*YD>c~=s9_$;60fdlNOgqc+UoE<-<*w=y;8WM$2%?q)-4<-1> z9mf|JW7ZcFn9S1YgrF3v!M7ogpF8TE;n6ZkI%F#w2f<a!)BoD2@ zU((fVas7T_WSH^DBI(}*5#bl6qQjxaR9E#C+M##iLwIWUwp-&$aC+M?!o73dTo4+L zXxR*om&748{Qgu!I+Er>6IfLNSbi9=TqlqNq&QR)(j=dQ->C_GpbQrIVy90IUW*|I zEhfPSB8JKY8XD+$%$8}$E~Xq3kNIY{fGri|vPM5tblLF=at+YZcHS3t=(j5kuI^E@ z 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

    3xsscljZIzPzJ(JL@t1 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�spjUJ0{T4kpnHFg*v$s6R3Shw) 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%0A{i_I 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 Xz+ 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 SnaB&VxpHUYMX&Nls-3{t)smt!o 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

    M$mIBi~Y*-MO?DqE2cH3uR79=9u`Wnc`hk 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

    n!~UW(rX)>x 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%0AmGA*-SR$pjHDQc9p(4^ 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­g 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%0DEP9AD)$sS{HF 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

    ))#j3Iv=6Hsgi`%!0k0zX>67Zz)qs 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 z z#bE)2Rs;rUAeS*Fc(EyF+R0K(ke5jqAZUV#!kYbbmLL%DAN!Qj{7xi9R2nG##{gSNNKbsie&kjou?b7*~+>mv$=uAh~HukicNNusEj|0Y~Q})SzoFiD;e`tWQu2aH{1} zPWNRLA?mAHYQJ{qgiIjDy#nlwiNacT`Ze4_xno!^2&`G9^VN^kuge_39f(;h0d^nc zV9g%;HDW~NG>nG@m&mlktJy&(mIVPJ4cl%}iiOLZo)<0j!*zUeiFe);e3-P9q|sv0 z<@#x`*n3#Q%h8sT^=mb%B%pY8PQPqT8d9*DS+xS-ykScGbw#V9pLqg`}g0Cvt(vPKYmxQXhcV{-CxF3D!l| zswb6x5k*T$mm9Z>1xJCgDo8a9EJcz6$acp($0N!d~D@Z!~ zWwmpNQT!)j)Fr@m@^a~+PHdD1on)^~MvAEr-fbO1g^x2Y#p zD>lkNvGGB)YAk+dvuUv8FoB$TiE+FVliv#4WeaDsW@vEC`1e@TSD1OpGNOW*Bsp|v zCaKNkZQO&SeLBOE@kK#~Y-|GDCuC48q9e;ZOv{Et0tQf>dMOG!%A0O;^i$kcn(mQc zT&S~*2o?jt3SsaztW2fCrAwwna>08kz_17;gPz+~0CR91l@nXOInC8x+H`9}*3Gb! zL&SdilDNzY65JHfh*Wq@Q9KdWAMX|-`e0sXIh4)GD)@Qq!X-3&&L-^Gni`w%_|-pn z#?W4Fl*E;^yo4^IfbqRJ7z70c-RQrUfX#9em3^{nCTVlCmPp2Es%^I%!sZk^O${3y zET}V zifu97#1g&Yx25d#8Dj3}Z&x&t>TC3O|EH!PGC3u0%Wak)!$DdZZZryFcgd;IxPM1z z@9!gMfrV6ZU7;3m{zvv3j%GhTy}egBsu&hfS-pMe*o1tEbWx^ivniE(F~-Rci4KRg zDMdXt)W?apL9-{Is^BoOa8&%9UV?=a%MGpzN+Q;Hp^NVd<3UIBTi!-z_`C>(T2Dub zkv3XyziAZD3|MUyKXbY3qsMtbYE;un0HsM>)&P+7-Brbi4CH4fP3stV(TGx#D zb3=l3h0XobpVz#_GW#92!B{du_jYBQ8Lg-V&tA+kpv%bKU5kGwT znk?Z(UADPSPk8Xr3N|lz&aQb|;aimpe zZl_(O<(FwRo_j(N1iLs)Ug-H(*Jzjj0$t8e%c_K4R&w!0XA ziiiGK|F-y=HlXHN$QnLU&Vm)oQH*(GYT=MR$CGTS?dwV91= zaUZ2mYTlyZ0ThrUHqVE7#x$zH{dv*U^TdC*3HJiE%Gt>6-^iCYSPbLgq#2a(P+PuA z<--l-8CQv5>^nY6(U@mw&Tmzpaw8)0ptLv#9LFw3tyD;cmIbWUI-FY>nQkY@?6IMX zW}Y23aZ(ahcJ89H_gAZp!pqfBJC95U*d#L9si7#JkXX`wVe3BsR(?5JSd0+Y`cOn&QP^I_9h}IzB7gIfxsg~;3bdLr9 z2)9LOp)+M^4+W}}W?v>nbTJw(yr9rQEuai4iESEkIAN^^=^;!!eqbbs<|5P!`no5cCV8%?;Ax|7Y>xI14W)#p4PPkf+P{)AqGG_z&o7r% zl{btdwrLlQxy9w zKciydgJF$G`8iCi`t!24aQTC+HY{U}-nv}RS~GQ0YEfFik)8=&Ovj7+AZfS|H0Xx9 z71|=eS*k*@@UvJ#~2OHDRrqf zWPQRkCr8XiO8*_?B(fbijk(?;1_k9Bo%ap1yn`kWBfWw)&@5LIeo7;=0k_!+sq#VW zYEcm}(o&orB~Zz5`_fyMLoCO_jE5|=`SYy&5^cuPqmizj##6@7U#yqy51Q1sA3Y~8 zNR$XYCwQ}e(md-g))hZmoiaMiUxfc&1FsmqXwpf%NsXQQvuOGn5H0k3uELlwPV#tU z>B!?hO}w_(6EYA`v-H{_YcF!Y{}ViHE01^&ac{nkUuMKx}AoM}~7_9GgYdk>G27e?;7v9iTe8@3W?BD;JEv(i(dFG=+Pf==X z+R@NpnBaDE-8Grvl+zeESBb#FF{+g^h?6}sUCmE5udh>`)P)+Xq~4_9Rhqx{J9ENmKpb!4nRceitUo&KG(_l=() zr#h$CXtbMhczde;fN0>^uCO%{yN#0VCmueO{=NZ`7rd#$hTQzV`(U#hw48qOQ6uvW zWm>{Wx=6y^Tz=H`M8fCT?uz5(@1bM{x}oWt z13v``56W|i4#MZizy_@SQX*`Tij-$(Th%&$Nd4{2f1+fB*FL3BsX}>cdc;xespG=Y zgdD}eN?UlaX4FkAjv!MzGORzM;19ao_aPQsWoMjebBRq~Shi|1z*bez?1kI(tj-h*-{fY@sZ#Nx#`P%Ou z*1a2kB@aIT)?-T0yM2$&%fQ{M+gWTw@-i?a@KU9&l@ZTljz*!>j!v%Y56@~QI3*k= za&INfUDCWehf}_9UzQ(JXYtIym-}JyD&|!&b3aJ;x%6kP8eHDLgz7v?g*#{p8&#C@ zZ%X6=Z`@r85k|Q&49V+~Kf8G8bASFW5B;$tBKPeFU1?t7&2Oo1vSQ1$wMlL|7%ILj zL44>U*DcDsyyw&L=8985@I{AW9hSMLrz*@>uB}ekAqyw*=`Q%LH(Jw`sXAV_UQ6N1 zwOd$ljJ@6x*{D^P+OHmbH}w9Sl-KD)5MU)6u!#X)4 z)|r0;+O79lZ!Vly7FarMm+n6lL5aFK@*2Q78Rzg6jB0ZP+rdaVX2pT;)ecm7dK-PYAj zAO`$&fM=7Ij$irinN~({)gAW+RX1mJG>fzN%N&oSk~H(tx5Y*9&zwMNN+3<^dm?)N z;Tt+>&1K-cm9dVR6tTI&>jA9m6iuM5-boh>YgQIZt`wg?Om!HsB<%B&BDEr|jNMmk zafT|mfGWpN7#*}4Y$4n0PQ^CU(z=%Y)!$7*ls}YGD(9<$cE7;Ens>7}`c+ooDd_GX zI?OutGow{b`5CyBSM?|H;IW|HWg@xZDT)rP*-(6Yy%kqt`4S?8UpVzu{6W{e6V|wV zI`o)(tB6UfFLqtdBM zr1na{r$~*Ux6Z~yT@t#qD#=rnGxx}Wnj1z*uN>Z(h6Vp)ydZQQ&R(5@BCdz7EKRx- z&bvF=0-%GpZ>uqD_f;vDRVrgh2FXSF4ow@$hE6Jv+Huf~g75`-@9WMVZ`R9Uh6bG6 z?Y_$&DqxJT5vFp+_kIrTZ(pi7yF3M(^c5cV=g9`1+4lqwVldecYJ-G3nfggO%0}ql zxP~J%vlzMcebjQd4u+I8Z;PQygA2u zI37ujVQ@VO#<{#WKj!&dF6hkxfHw5iLU^5caMUsDE9C453oZRKcS}D)5@SLG-a-7HBVdbL$APRnG216r>uNB8&!{Mr}idSl=7bO(G zFP82a$D$~jGpQ+04D_&3%!-!e%q7SOwq))5jY=uZSdTF0Q_HpUn9g+WIaOPoUzYJ7 zYA#aPpKIEGnXJenwc)@Df4jfhaTr)J!$aoh_}2P^U~WBSNVgB|9(Uz_#r}9aNYY7v zMnQ!q7$9QebxFrN8AT)r_Q_H=6ChqxvO7$z7hOl}KtX&=SIQu1^SruM1#Z#>*cOkmwmGZ0%QJkPJ~5&9Zd-K1f#LB=WWb&X zZYpfvSpw$EYy#-&^_{s5*Jm?vUF3QC>o~(v89XD8?IvnKHp)LQ^6b&Y^lL%eOQoP)FHTgK!rwED)DnTrMtu#&Vo+cDb77rtA>6NL^RAh-p(dQVArJ_r%HHd z6Y#_4!&*l_@75Wf-Eh;k3~VBi%hq-KPk8<9PTE;s0!xWAz>F5`(60v9`!;7)-peea zX*lZd5`c|rhU0+@=}*W`Q^E=0zXM~=+l_>^jS>ecBsn+5zN@wz^Fuo4KC?Z|&c4=o zhGU_CGF)rcDxIG)+IE!s=5+SiEk-~MwQ3~IMC;w=LP_YS@(h3#9wXNzh9BF7VLgn# zm77pjXY z@wLPLcQ=G5P@63RSE&d5Qv4Td-=JiP~9*hNm5?`j5%XVV}`4KE06bk-6A zOFwN>-Jyfm-vo|`cYwVWhLR5%64p^L16-#$E1`p0qw)o9*06JN>XId5Xv(4|B~0j7 z;wv+=fA;552kKCBYUcam~}kHhF+jL#vS<*^h8~*(;PRz&blQ{ zt}jC3)!ER%#*elDdpXeB5e_ThFCtF%UY72mI!*LI|CiYP=1lro$`P^bd*0U0qE(qe zl^+qhPLHy%$81ao^80i-lpt|$)Gqh+)=xAha!>=<}*=N;)$h^pM;Ub7p*rOmqAB1~^y($57JlM1ujHYYM)l zs3#SeqOW}guI{w9X&|BJgu`z!$^`vhv3*FLxKaA+zGO-_Uw|`3{MtE^CmW&sm>yMO6Q*F&IHsYj-G$^wMh!=>Rh>q|7E(lyo(a{QT+dvmMo>0n#YjBHx%zmk zi+ldZv;&)%l_oi|e#Nfhq-#oV2C`1_XpMiJW0$|_k%>>q1}w?SS({n}jLEMul!a_l zjACQ6H9q0&QOb!JuV}d3{e|Oa2jvT8cr)JNA-&_JD+rp};C_ft$vcRVKf8 zFzN7aDQd<=X8-n8q6#ce$CkD6{T)1%zx|(+?^YJ4c)vI|tiL7NgzwGpX*Jq%jzQ+( zA59lb7^~oxvII3I0j=(C`JqH4NrIX4RiiX^|4H`2groN8BJMPQWQ-Hu) zk+bnccmr9*W-8}}`UxN48vg_>s>CH``18jd0v&a6IhlYqIIBWOav#GcY)A#}2l5AU zzPv4IQ{bwk=-?lr&HS+>IwpSMtig)C%2S1)@d`UZt#{qVIBd7|8~8lD^!9@u44% z_;scCf0VQvXT;2{6mY^|pkM3)T>lhmz`r;U{-Vj${UfkUTd2sl2{b^({X+7}^xUW`7Z)m6?s!dI9vhWCHDdk@;l zn{~}~dk6{A<48|sECe)u0>+?$A76Q4u!z`#6i|84{fg@HxH){0(i#@9J;7*^?ZhCH&yl%lTu`NY;Wn5U0)>qmmQ1SBj3Duh|74%^XhP< zh>+jSWS0i7`STL~%{kiad*FHS#;!_Fkf$sO%pYpfyJSXB|J5Ktc~dq(+R(5wI`&!< z>xgL&<7?}0c^CU>F6F1S!EHt3ajy}K=}g8Mo@o)gt+ec8iw?)pbLM!ntM+8oPh)4b zl-7GJdFORJJD~IMhXew4G3@e5Wph3;3>QE4EA-=;{VI{)6o)@yW#bwD+Owc}V=3s% zmrkkn;GH4d)yxhuUw_A9Dil8uDYxu5vJ+^0!mgb)HKDv~(f}_9-&$&A(&F!I{2n4& zwMB|}lqq-JP-D~~piE{ZnT?ycphN5UsU{g38`b0xlb~?R+imX6L%6QRT?ALm;F?dg z^Y_@3X`fJS1K_WbF6qnzag!gd%whNLog*;|}wgO3)xL6(w^-I2k*%lr;{m6d#VNTmv0^q&0 z=>8#{{MhCc>ybr$=gO70+og&~8xGMt1WvwLziuTXlfRyL6d|VgNLf=X76wbUS2zbb zRG4Ik*9QjU2)=Bhk&r`|aLmUjfb&(Ke-EBhKm&Xg3J4TL{^1s5)jMvYa(tKEm>^CTC0|gi` zeFoAyBjNZDDvOiuKV89Z$+Y-9;CJclZnt7kxG|6KXD9;G_|;N}3s3}iUA)kFooo_w z41JxM+c-Lt$3xF&%TDk81aonIFXaULBGP zH$CXgPd+*-hp=Fr7N_KM2MV{Ek`?wqn^l$C&tovINSr0IrCYgkU?IYwzb|3`F71hG zo5&H%2626M(F{>@Wjpbk;o#2ibjD5=v5&*i7V;Bp09@h*6HSj+-33XehG;r^0T$()%%^|)2el6J>Ef18w zj4=vv&+O>nliYZ+UU$N&mS6RXHd)n1l;<2%zh@_Z7^P`)ZUX21Q)1 z7lNIxpCjeGxiXF3q)joXVR-Gep5Me}@08<9J$X_xJGq%lml(t52U&4F^gZ;6uPTH1 zKt8cSUZk-(U%#m#&ub(~N&7Kf;BVIQ40(h;BynVVBrGU%7*k5MVi-J(eHa3QL4`>y zI_1uMp|HE-I1pB;S1RXdJTkr4U}?AnF0*c<)#OsMbbS1@PWC6^dK@iCcWF9)Et{>c z0awosT8V%if2h;s2@7_ZfRkflfR+~))zpE(ax99CFTs7^Z45wE&n<9P9OV?v=Gf`? zWRV`mE9~|b^z$34Z?1$ELIzx!e!BK z?re41NRtKt@R{SEZ&GOFdq`DnwMa~B{RpC(B{+!uQy z_B|BsM1Q|0>q)d7*x*O+8}oJJ)IAjRLn|Cxe9AQ_fHxiN-##_np6=d`uURNxy)bMO z#9zB(ZTpVfpy61zQnYMv2`^Q-!qlYmKK|y1s}iZYui=MNxH?pFL*JA9d0&|yyASlW z3u|sX{YE$mba_ktI+J)KWCA+8{j37oa_1r+io6k288?9@GEFChn>4I}E)M75e2w>H zSd~N7N)q2gi_`&b#Kh@s8+5W)lST?;9|7;$W+R_HH=VBw`J)!wcT~ei{Eavmg0Zwh zGnz;=tg~i~^Ms}Aj*26iopd%D?`<2!p8&Ev6u94epyZT+<7pcDBGT3^Oi`#>oB|x@ z9DGhR@R^DNSqcTSq-dX`D`4`kII}Zgu`DI4piAzOMeKS^nTK2CiVFIB_J<5}W~&>G z|GoOY-Z-8hwy9#psWL@cG87)g`$RwZ7GJ3c$E*$^P9ydM9j#p|ab~IAeV&hVO*6y? z8iW~JhoW#LZGt4*IeANo`Y>=8)kZ83KH>2-f#*I-myhuT!Ji2qw8hp=w7F^Iuh3p8 z#jN{LpaIh2xACD;bHq3yX_UpclXsFPF(>oC#ou7V5h)E6DLR&x+vp{!8QCF!QLshj z^0OG{%+7(NXDxhtLGcs>+m4QmITg&dSXuQuw)?l&&H%BS{2#7Zb~l8;Ha}{`guuQH z^^HRi*3#TL(lXm^YHEIn3HF7kImkKvq^16s8p!)QD>K(#1nfIM$7WD9aUZb*cOnCCY046KP14U}4*l1Wlp#AfcKcIN2`^-J-H7VGT4(h`WdNMuow zQXJ3_y%?U+h%vV-l`xEuz1F`Wv7sX??0}usD}YX>rA#~3e?mXAn`Dr9i3!>}Vad0= zF?O1FV{4!HRp^5~vA-HkiHD8RVG{AqE2J)IgSTt$8fmnM^>|@?hbH9iNfK?#iyuE) zb+wUEV^FwxV?oX#PFT=e?+@|}m3X}K^K%a*VIX+CC*JwlnVa=4Y}~)r_dT@dcKAAS`G6pdc^6;J>a`)V|9>(K#2+jXSSz6YiwB6h zb}oaUi3UBLDsS6eVg&oM+Dv^Eg?J3snN%*d^jro%T}A;EA~O<`Sn5oyNn>nUDI1k>dw^$kxMVt)mD^~^ z?zmAJk=3DjqWP-0N#5F88Hc^x)0>pz@Bs4tQ515PS~_DUEi4ggy;zv_2qCva>0sni zLzz+A;yMkC?cq|LQ@uR8c#m2Xg~aB3Vh)x(7B_itXo=N8DtQ2bCR!Dz=kPF?G?W4$ zf!M?uff{UWsIa5C3_OMxn{q2IvGTBpv-}nXX0(%q0DXR|u&=V|1zb zV^fLBTfEq9q#?gEzZ<|sIY+}&L4H`3jla^9WWln*`aX#BfnvW+P3ESIu98U4zEqT+ zq+&hnAhrJC~bf6&=m%T^xlqq>j ze?0=`$2L7s*mi&e8i~OHv_fGhm7w5|X<`Qu$tc1GU`gCYkQ$(YdZ93JTI!hc11ZK# zWw3B015hM5p-`~vVo*eI6cH2zO3+ExdqYlE9Ia^GZ!ct`4hr_YgRJ)Z$PN&n=P_c`!aYDc! z3VptV3|$8ia2f|{Q(&@~)OyMqN2LK-O!RV$&~fQZ)s>~HMIv8b{+zei&KC*?K3ok( zAfl5A`Q0p6X;!Ed2zp=qpPitaK}62~KXKX2q)BEG?4k=+kpoNay;OLywZs8NNGd?6c#qoEY z9gjAv4VF^NDqRPca-A*)wI)6BUeh)?m9B!dH3HPEiOJ5cK1u1Kb`>Wp-M~YglHE`r$IJ8~O)QSCo3(Uuv z7-KTzo)}Uxvfv6Vb3~@NR>)*nH)TDBcK|H=4P`li*ghctwt4g^Ee!=`eGsXCD0@mtyJy%Q&o5zV_6IpDhgee zm}a;tR$$74=g0;r)fLSEP#IZ7{)#Ys1VduEgiBT>pOar4>UL}vUF0>uE*+XzsCFYv zDG^PeOxzP8x{26{UGp0P2cZQ87XkvuCs5Z7oE`x?Yh&Y3_V0MzY#A`O%kL_|3VX)W>QX5Mq8$?!FZmr4Eh7YVJ=TA zP0^9BE7R3rvCraWUP*J2Z(FKs&Gyj7@22?Qk9j!4;SqWUNulc51@2IXt8Ek-Ls)6F z?KC5XeX>yV!|XX?S$;dQl>9&1ln0ao4THyo2;Kqnsk{|nVe&KOMj8Ck*kpVDpw-+uS~g2sZ6oV zj%^rTe(pU!X*L?&hs3cC@rNI38Jj(lngf z_5en}Im)^2g<^l1iM{S-WMqaS;4|sKl?PHf6SQKT5yl-N5JBnTUl}$pWt9q|wnG#S%^#X{g8*IY)AxL=s2yBbAR>b8 zolxX03@QDu^9M^JlXv>OR%9MM#u5A5iQ(3b9_O(_wC%hat-z;xdirZKv#&ryedFWZ z1|TXcYmcSxRa&f#jjg3#j^3|FW@^t>OG_(SJRQ8aA~+NPHUOorww@P%EgQoi2Jc(l zz|a)Y!NH5fG!<6%cf4W%t3j;J0dCwbQ6j&y&BMX$No4;Gepbm77X)qd6A55kf)huS zfEoxGmf*k%c@npYf#l!OXL!FgqJ))#T^!)X5%q`53$xiHj5D2w3fV(vk-W|39^h~T z(n#LIu5=!Yv84cBC2n15z9NV*FQ9y&AaWYWOxrWOmy|hW&E65l?S9J$dCs0zdzC`Z z;q@YjYaxg$8eLjUOvr39*qhMVKm~lBp&8xlglcHV?So#6eOPEHI@xde%mvz)()5CKQoN;%KrK%O~=i#o?0;c4C`Dm}%>-tYAGBoL#6;mAL3x zPi}6cP$TxX;gjdz6|k^mKHC(ZrPMZoIWVDN2v*843mZ7&aK+29=EP@CI_DHosG$i^ zf;eJIwLX}|%Pahq?rt(bt^w3DXfFh*CXPxCAT=gMRLPSxr~1tGUaS=raZ>^TZ!~c9 zQxY-^ci&jMbh`-*W{85O3jqeWgU^34rEEjU_MQa5%*={YPEb{;{Y+Wcn%0b*l1{?uCwmmTJl+^ovJZrt~2frs7cJ?YV33k#<_yfnEAB~KpOtZf&EXs;f2|e20k_S z=YQlO*54oibOpAAbaY>*keZE5Wgq2`EH`Qiea6(Puy95ZT8s4X}>T z`&NxIGb9m*n!RHwoh*BgRy9^IiTahTg~k2$ObpTB!r|j*@9{QHub(XOpih|&u%bS+ zZn#uxuNWElHB9@WY3;P^TSDZ-)9MFw=z!sd2-$+fkZA9vjUF8*v=6lLJTcoAg}IZi zOk7QU+6CqEdYBeU71e$qo!I3%HoTgmBCejAcDw7U^pNVYbQ^s6wMFj+fw#sQbwV;A z7)lH!2B1j*H%S3Sgk%=M4oe{h&2Kjd#Y_SPO^PJ%D~WX@4XUn=fx#OHMR40E6u3JM zMHGXIMI@J^K+e{V)}?;F>{h{Xt`lf2fgd&yvAaAq@@(%?h+7%GtHrC@%qPvZ8s|IB zpIo?1{P(aNqd??2Zb}_jU70gKf6f-f-G8OuKcxSCXlJf zDB46Y;`_pDugHP^=Jx^${%v|Id9otuoZ$F0{Nf$Cz!)z1tK)e2N#>#`=T-e^I8!Q@ zoLll<7CwUPOcEQ25)sOdfv5gyn9HI1J^2Qw=sKAvzb1E<-Rn~zsM1xJQ*KSempt1H zKH{CRa`i?0>0r$RX=j_>Ycxm_;*_F&`w`I@G>cbrgd!(2*$omA<`mYJi??{V4R50hmf%-HSVk%Y z1n+bN2gR!DjMD^^i*J|#ioj~DdjAA981H*2_o}cq6URBql(iSzAdFYADDc*X@-=8bd_6y4Iyv))cu8h zx6&=h*fhH6w82_hZxs$Q92vH(*U074=wdu>~qvB(5TQ zkcmOSJNz>SzQW;WwA$*s26JXqXC6H5M^G(fi{_QQF9K!LX{MV<#yPw=qQOGI;-f>4 z>W9O0OTvKXmtjs8QSNDtXhEQ)$x~-OQ6flmNVCWSWl?Sv6s_YM~}#4c|*A9wds)_PcF$GccHn$##YO#}&P6Cl{*XI-gISk_v=8gL!3T*H{oBk0{GT7H>kh)<}gN zl&yu;cB)d`?=howk*NT@%`^D=$Y5ydv7!@ynnOE;L?Sr>$mB(338|b$fZ3!>n#qv+ zA#@^aIEf(DI&@f)7z`b$K{y?mN>(^>9yg?|se++@)4EV&Aoi{?#!Da%7fh68{~#!D zQG0;7;L43e#Nt!gRhZA-1SZeDIL7S0miLa7^&2DjvK)S8vF8vJN z9Ui*n-R2qJ3)(HssNe7_W;HrG5;SFm^TfZ(pj9pZ61Kc#FjKDPsiLD@$pdkDEK(s? zEH_uil+d@-D^|7!=Y?SFpp7USZ-ZXt+6OTVT75$ zAbU6t4n?X1ND#!|BtD-+Qao9zZ@`KYmX_JmWReqyiH3_eBUwfOO-7(Rpc9e<;>-m( z-f}JN>?e91`Pfce)xQp4?zc53uLD^iDf=Ejo8(FZx?-f!h;NQQ9t-%}|+lh`B4 z1*wbLC6UJz!C5ALI8rj@ku8hLXi)h5q+~6Iznxu2%ZWx3=O7u~lw0N2cPQpWvO_d3 z>6Ms3t7~khq%y?Bj4veyxT>F&MyAFq93)%=@*{5##u)w)uq%+G9fh|j$>gHP3ld?- za@vqA=BVpLBqhfO=xale4P%XYzj|@<+WQ1I8&%ymaZ4{;y;{my&t1J*pd}y!6k+cF zmM@ReMqNU)>Fe{>nz8QG)DZt1L5W79EE7+GLpDgF2J-(1+ts<4@$niE*M}pv8o>F> zO&6xAUS(<8j)2{l8nV+aY9R<`Vq$_Fq}BGi2-Mg>0r^Q}AxXY{TsDwUf0dR4|XzYNa|v zo5YR45gU#~P)!PR6h~X@O@HWU5*Jw`W*~h$hWde~1cc#M=r;I;r`L)Zx0lg*-|1sfDpBm~QR9|0L_rFU1 ztGK_r+l0`?1?2O84h{Mr4S#=sX9)cbFgEV}Pp_`7@IO02egC7})6)ZS3n_poZr(kA z*E)k}{~y2q@&AvH{~N>q3Z>P`xJm-vF%Eamj3KFvEuwuPj*?g%Gu{w@FVjiL?La{Z zp-BesXRh@-QO~^k)5l9pj%7I;FB)Osiw^7}Ljn0P42LRj#J&q&d=8YK0 zggb82jfFcGv4%J4Gz^!~4=H}mvTE2GQEb~J3`saGx$!Q?<9tt_{+;cw7j3HsmsD{T z+kp+ec(%R?JEdy~=By9k(~C6&$6t_2!v^@F7k5MFy3Wlc7k*&^SWz^c1sy}jUJXBj zfS8t*UVKwwtI?eSux`i7>i5gP5JViLa0miVu-9;jU}v}Od`UD~!0fkKo3r7Q{K-7e zFHVBbvyLw6nMp34hT7lpVSA#yngi^fJ#8tQokE64*NN#0gjWss+)xiJxK5AielIKvB)VCOl$T_^E{ zYu3C{f>JV21!B@FA_PUxP`lbx)g&!}F3eWAM$Z+?Ws4iZy3u);pMJmHIS?XV_u|`n z26sQ2T*tf;bsOb1MJWEVdc1L90rtV!A zv{fSrs7&`3x15m6CEWJW>Hxesg5mldI>f0@W0)blUvx-34&Ob=#@} z9O<&ioKAyD18FzDVTZrmVnIst${aC%y4x17cINk#6%~SD_0Q<+Kf@Y_o5;5n2ko&WZsmpR}5jC0_*au2>>3osx5bR_+=IK9lvGCzK z-8}o+ZM!hK;Nvx%*%t2o-)V0I=8pQRBQxsQVcO}!8RLl8xOOT>qdM%`G&R@JVPoU9 z-A~w|Va7jMH49v|=+lTY)HC%~DoFdRuhq6g?q6FSNrP@EI-l9})94e%1Jo((+X!px zW&tIWU&rXCzwXbmMSB7&Z^VHIi&o)-oH3t@`fh@#Bx0XD=QcL6;V?%9iux7~0>gS* zZBu!+N^wBHU27B|?}jp8#Q`SAo6$+D*;tM|T(yZ`>(349vK)`K-ftvtIXh2W4ilO{T@NnQK0+ZCPcSb5o>U$1e_4slXIC1<@1Js}< zoti}I`8v!;H!lpFzm<*x;aX3)G^9AAMD_b5RE$~IJPj*-d2O5gIv7Gt3>WCCMZp?y zJK|~~tSx$^aN?L=zM_eKtX)p*Sci^vZNXp6a17&xW62K|M>h(*e8*iz`m;3Jf^$YW zxQ%O%qUq#U9n52PzH9ltRQ+bi()f!rAM~~yxb9a~!+XkCQE!xWXJ=Ybx*fyZ8Adu)**2^ptc-XPAAvBz;z&S*M>rp4-{? zH#<&K%v^SCn*J-k{rxN?JLK)H5@rHR%t*K!*xIuNyksT+r{tuaZ zpo^oeZonVZPxMiP2d>2zFyx6(5f?GuJ1gd z2Ar(YPcM@ox5NcFPss-Jy>@7DgP$`6|8bRFOWiT=pX}uKmB+kr$7qk z6>mJr8?UyCAJ_=yX|z2`jJr#Z9&tr3V~DfCQ(pW-KVDXruXyL4Vdbe8?h%QBbdnzu z!usVXzeV6x-bYrMiRr~4!@J&;rck_^)!W5eUETW;H#H!J?wVREvFzg1;E&bfvsEff zdipPaMLr6GfPac@_GiCNJ0(?D$vJCcm5np+;(~}KB~K82Cs1N-Fe!X^%ctg5VKU#n zL$I!{P44wnta~{SzD=dYP7Y$gO*8Uogk*>-{3=hXV%oUNbz+@v4tU6K$!=Tb;Gi9> zw0&f!p?XoI5y4c~SAmW-btk0x7bArc!v|yF_$@r!5-ddjGd1;z2&AU;ijK2LEN@SJ zd`=yp{0A2`c|zH0H7Eb>-s3Pfl?2IA^B2xNylH}khlK@EGq0eFw1rV`vT|*D)Qcmy zVs5?n(c;Hhp|AvwEq4(?1i@(n2ifmv%DCG%hW^K+eZ#tR%0UJizTJFfMvhhyk>`?J zPrD>)!ZdS&69dn>Jjl4_FhVuS`a#L&u0=kr&1hNx-1F+k#GNK8)J9;%V#>0!3tJRc zX*J3H%wQ!W1_cF01BF8kNz^pth7;+|kg$Z4o<)Weif$aPrlls7Aw6b60B24xsZIh4 zCs+Dol5Ka?d7c^>-^R&!_*iI0H?u1voozyXW8t$96V>-?e# z@8|OMgg~DEPEbT}hA0H7ADIdz8O;QJdYO}u5Opq7L8a0o%2Ru;eNaJ8Zq3!>1 zqPH=_p1K{bwMe2>|NhyU*^&N)2{iHM_ov}-T4Cr3nf?C(KS030UZYsAif@%zP}H)C zXT}GS;2=v%=QPLbL#Q?g1$}{?dzagYS>r=kAASYg_Q#?6C}RpfA%FmO9|_IOKuD-< z+)HfA5~9LPHle&d7&xA4M=b8GJthv6yBlKqwdYXQvY3GOCXlTJV}{|nSau=089ltR z!(8T>h=dirO&Gv{vNUQ3xG5IK1SIRn^p?`9;R2Ushc@%b6*~ILrWDY8dOn%;Roc-o z-o6~6InF;=j0gmTCN3ed*0#Docp&$c^h|N$@m>)ED;p?^pdx`)s7>05ZPPSc5>(O% z%_BG|>;XT#qmBUe=2o?!%hU499ulQIEg$xbxcGkUNynXo<90&IlwszN^}~ZFGs}v) z^rZ@qR>Nl5LPcDi4RG*I@!jg&UniT(yF|pcd?PpbjKT#87n1Nsfq4XtOtA9Y+mx0} z-i1CHH{CH$^Hgibw9AL`hI~k*`|gj$P=%>}XIkhVL%Oq`j|rM%I>jA1LZ>{mXDY_` zF6MW)s(b*b!c))k9^|D|$OvrI8Jh)pEZ*HSbu{hUL?~Wre@M&qz#G9Tb_SpxEB%-l zz+cP$fDMQKEiYyWKr!M0D(~)eyg2&VBueh%fW=QeYx`F&FZ>f1w@1wS3Jr{!6Mkwu zfUf^2d2j1=?P)1ny*X}_Kbm%OM!_GqtwL^sGhY(I_hguf90%I{@#D@XMb((38bKh> z65*5IRc}i0o&D%sXPA60UV6Mjd@|vFb0W*U`h@ZmN6^G-_sQtCy*;zqveGvJpI5tB zE*}x%lDJ#pkGzNSn9dlt{Mx#){Ara9$9{TD2+C7*U>7*HO$rEfkfsydEI*P2wZ;pu z!a{85=Q<|#U9cTK(vHS^3z;5DS5hs%g0)K=GNosHG!(Bl`Zw>mtKhP~Bs`No++!Hu zIWTxSE-qC*Xx=)@osF9=RAgWrI)pt4yt_w9>xl~epu_gW2vuxu9%GN`tt7Z%RHK9}&jV$<6C7Vc&B|U2=DMX&z}>KW9uRliRLPcSMlRchrY?2wIh*i} z<-(BxiUL{QOv~*$o8;<-=QHb;gEr*_rztu=uxF5&>!WRnk+u1k0XCwcHhz@3lhY4A zJ4aTKa24WVDDpxZfb$JVIXiou@P4-a4+M8nW8W0kOC@Y7qgs*5gbNB;k z{KF9?DWV|GLPxQQjfT-F<1q!({58a?j^#>O4Eqo&1HF?4^&JQ@y-I9KJ><@BP5n} zG4_&5AJX(}+*lZKKWEV4d_?mAB-Ja1coww)*Y`lDd2#xO)M7TG1Z&h{Qd#>CT>c=G zw)R0^B_wfDP9NkqD&Mn4R>+Acaa~i|OaN9o*oUD27SB?J^C&{qGAN0+Rne%F1s`g% zg09wWbc{Z;OYizL;m!+VYd_%}L?9}Ejn%H~#x3c9^n*dnrZ+tc_J~%v%GO$2+c8w5 zXm>(GuKaH-!T(YDPn7WgsGcuMnEvZm9X4A3W_k)X4V*LGOorxG7d&9a-VXT`wFaR$ z@c6RYJ2bftllyB0hBgX^^Nn9EoQ-#i7nDivY zcJZdT{#^@RrXBk)TPl@RwvsS~oFDT(_cj&5le@=ARS|z|R3--XF%y*B>xlz5D@&B) ztb+`xk>2>63HwdGRI{af6Y{;PC$c^-bp~f=Zw1hgjq_*7QbKS{y>IAZlPWP;Fg*-} z#1jsA0JwIh%%@cYk3_v)A0VsBk}MTdsu)67kBB~sDlbq9iMTlFx;PWf0vW=Kj!VA7 zP76-6HKMSl$@_boMuMCR_v2ZWV;-njfwo>A2q^pl$unV6-e6JO6 zH@#dM&hlkUeVkqIT-VweL(T$vUgIEbOIB~kE0_cT<9x^%4~<8GSNlcDG1nlIQa_2E z@T@Don*?2Ky2;69ED~T2^9DayEI;z0J*R_`?l8Xm zH}JqQ2+%hg6H<`BJI=NN5bI}PfP#9vam0u~0Nd)DMIrp*=vxo|oyC)aYlv@V8#yj3 z8zT8Mvm-9rl~8K?)LK_Y2dOG$M2l*9x1UEVw$$rnvh|>D*A)(CuAZ!B-rg`a4u7$M zgmt2dI-N9GIgSH*+Jyk#Y?$l2Y$~Z$%3-@i1p``vZ+#0O0A9ZGMAy8=er~dy)WTz`R5Rexh%nq+0oEkF|{*vZ1Y6L@g}{it^{;gs2;R z!#k{+HY2Mu=4qbVoMKCIRTSsf!P?rCs6_^(UpkJ*1l+*2Jj}qRK-8L-n=L}+-G|@# zWE$u}5*1(9$v!@Xsv$9U2u58bB4w0rK?8Ni0Ju4Iv?0hr4>K{^sC5krpthCYQPVlu z%+zEvu}+)1S#kF{b^~Up9x!Ufcq#7^nPjm_LBWJhB#=rVC;ZUjrA}RkQ0q(-$Y##q z*SYRJ1XH$NofL*Y?ib)fd2v0lBC=5!>&$Dyv0)Q?elTUODRtf^*YzWaYiC`5DY!XM!h8xZ0j@QB!z)McQ z4i9C@tzb4xYjs(fFbM-E!9hUtNo#OH6?`@fu9%%J0y?U-ORUOvXO3S}X@-dzMht5{ zr}Jn|g67K63U5;f*yRAN;r2P}=)2$e`vSP&$l>j6PSGprZL)9!Z3t26>LPfB^^`9&CNMeIXgu=s-#Ad#7_a95x6&L{jfCdak72|@ zsXfb@Y?+pV9eJV9Vt{P_)G=cfmZSInx@s3ectXU=M)npHHi6kc4{`C~ zMouunf>#uaFfRF1dPPpZ36Gx@<7Ua#Zza z?dZgre1MsSdpdg+`%x?-ygt`CXJ+!?65JV%xBhgD*$mKCNmnXZ(H^^0P0SeCvC9jm z#GsE=f=%1;_ZjDIyJwILv)*o2*fNTz;A0n);sAe ze;Hw8C#AZlFJ1J4ZslWiQyyggPogxlkU2Px28aNJ#%-MyiI&~0LU&hpX6a!uksILg zE(%5KLvdb>CIh|sJuLr> zkohJ+BPSm&Km+SmJx#$MeglzmgJP$Z=H*~C2})nGG9MeQvZC14G&!%95sFQ9<$}9M-#mr&s(aT>?@HfU}vcQ?O4N;Svk+YV~!^2E2J^R z-+5b!`I}xXA=C0%;nzH>^fIfX$br(dP1*-u%P}xP)Ffy8Y0WPPJ=N351vsV>v6XFE zSH^{~VOt<-a`p&9DKf7~PD%@Y0f_}4lbccvI3F;kz=989lF=*8BBOuUMtsCeLaGL^ zW3b_Bk`pl*sPQy34#>fl6RD5*@X8=!eKZHwiDIRJ+=g%9gki)~D&d5j5lM;3aagnA z?n$&~brr~bqV@8A1oP+eRTHM@@tyj({JF(PfRDgw0npwp4=zkXT6z?zLig+Twj$9; z4HF~QA<}}C%`u2x_qb|Z$te>ReeSr>*yB@-+~iFh7x(5^Y$$5S>3||4S%vUiXKusY z-qO2|2?LXwbiEtl!CwGo`D-{_fI0D~$=zx8Cg1sBi0lSIFD6Frvs%U37<^dvzEENy z*g&82{^_{T+3Mm5D`;%CBVE4Zj+w05pKQps&$7%3 ztT=E-DB0gyF}`8Z0bDay#B@f%m0d8Itp&eHRT@Dd1(a z)n%ZW;pWP&kKI&XQaj`K3?A)pChfo-X_%-0tSW3c8UJb%_in-+96$LZN3ARLLkKSU z9S@|cQ^k@0dDWCzpqmgo_(B0xj=4y^P}1;qA6_M(@*HUu5Tqj?KxMM1$SnPlcACb1 zWCb19_R_%P2*IP&L&en`XeEYk=syH7QR`+u%qBq5A98z-$cxS)SRc+>N_po_c~X9J z{e>u=6gKL^Fyx=djg5kqMk};39&7d$2#5(6WS-`yZV?Q=&fI6xDw_mJ=T2# zS6%Z9zAC(q(i}R=?>V{sl5SNsf4V90;b8&>*VOCI1HruEturB<;HYMTB{5z}lX)4a zoL-`+Nt$GL_u_EW{NvLR)F+)pTFTQ>lrF*hgwbq2&SaU@-HlZRJ~F*lV!vC>(}Z@X zkubR3pk2uJF&lov6eFb$*j1(g?nBwT0yh9pemw)SXAj(pZ@p@wO4zr(k_YL8*RY9i zUjl-RL-VC=g_pkJ0h(!LYp>%B++4T}QvkQ3b6aFM9pesNi$t8Dr=dd80|OaQv~8OG zKgT3XpeW%F{~PUr&M~|wWQ{Spg?4N~9GQoN+io$w#G2mJ2Wzf|Ya66a*-j@dKlP80 z|H}n257*)e#zTH-UEwX;R5iF{);_OS(m*uKGgIGd&mtX?(?ub|9{~k*l~_bUaz%hlL&7g^4468Zb(YGzD%%`DS^sN% zj(ULYBVuu5ux9DDCg+R=nVM{h{i$W#2_zQYj58C(pb&$`vgr+&krRO4@U=1{2#dm2 z(b&q7mzCDDA+i}JjimC8hZ-+Zt%lnOK5!Y!+I%>K$WJ`tZhFJ6L}snODg=oxx6h^t zBPw}GAIpRl8{gAn5wn;inV&j+m)Gjzc75!n%`RkNww~B7sb=44-Ior&nE4T0daInMc6R&H<1x8DskNA4 zTu4p?o)}5qU3_JT;_bRfRbM0n$x6KPnH*evPqMq8m?i${*p$}ZYFVdFnH@upWT;hl zR^I;lvEBe5JLqNwAVU9s4=tljfQM*2ngz|_OytHxjU!1}arDJ5ZpNwS9m|tT?8_ib?pwP3 zH!a#B4H*s(C;tjHtyPqpZrpPG4GEeJ`O7L6F_?H$Y$dr2`5UgZG8d|HCq}7=Q$BCQ zazIP4t3E%_jd8fnqK{V$V8sKPb-$_`x6>ni$Jt?3sBvA^ zg8?p*ytueV|3)^M3A{vzZu$SKJS@r`=MC}u0_#}#DuBhP65$fri=fuJiS#<7m09du zzr9~oj1eVg{YpwQY)3;PVcY^Ca`_Gjdxs%^Z)*=_>aL#q^jjQ@F5eq>7ugigdk^b$ zge##!f&cQ6Z47bbI>_Se_PlNEV2s==J!P#I4Cu;tz20dZ_K zJ+L-0)$hIfZ!~2P4QPr~1*q=3B8EYqPGFqKv)~OA&gf!qy0&)uFx2g~1X!F~NhNVn zsqr4_ihQq1{C@gF*qYYmxt3OllN!oll4irQzOYrimI@YtU3KE0vY|T6gH$UWtGS z!xEvdEE9nKT0qK!!khm|?BL%iUsgzA7EyC*sPo%U4!^56BcV#{Vhm^TDkhH2*^PXP z7GO})abzF^*e2%&^ZH*B(t0n*=6QE|lzp8{x=Ji>4YtWr(TV&{U)U z;tvbtG1E%C?Ywr$YLF@;!=~!)8ZaCg19o*SF!b-k9=&i7Vb;{MFG4Z1I;nz z$CIJeTh-3OTX<4Ke4(7qX|T!GiXFI56R8Az`*W^&Uk>CP!A@D;Y`o{Cf!rWUH%AMr z<`HFK+3f>(nmL$LU zCF*oQUkBM?h9_cl1t&Ky-G{9RNa`J!IN5t)2kRg}RSxtjj02*g#-z&#<)92Y9Sm6L z$iXgz<5m2>71J6$=;t}kyuq`hWxRNRZ>xWcL?x&us{o(ql)yA9pr=wAX*ERCdnpqNGNRvLpu1m=hSeT7JUEtV8)4%} zB7=Sxl>k}&HU#LoE*g$Ay5(|DA!06C;?vf?2vUKr1W_G5>bqHd{QoV$$S3uQ-B@^40qVtH!7L?Iz1c`zV#T?`QeF86+*o)2qeWt_#~|l7xaR3 zk%LO79W}EWM6>vl-qz`u`j>sZ4LzuWjfzXBCdADW={i!;Nim=*&U!dcVP>3m3IkBw z;&bWt$&)9qIphaET^#&NOsYJ>`ku4I`7R^fH^_DMam$U3>3NBq&LR|Lm``tK7-MhY zniSfwo*B*$W01pZf|c~9HMT2+T~WqqZ2@~2jWJnR8d{1Tvu60zv6pjWzjVd8Ug^eJ zbjX-BDwm5iBPeoFoxDH~-_vLzg%@v*!pS19$T&Kfv)l#azb!z=bGv{YxWyD=X9o)e z3z~^646By1a#wHEQ8k?$Qdu35#Kcey-NScS3{|b4=sZ{-D{&;J)WL(HKU{r zaoDFhMJBkc7$9Uty^s_7o$gZmof~Bv+A!OF;pJw--6nc&_=Hvp)`}DWrpj?8N5#T#7(ZhRPMuI0qrFqwhaXrIgy^H^-w?>YMmb&lU>uTjNa z0-6L*%}VWPM>K-lzR)cEREgm7*Jo83;xg^nUb30k{pu0CpE_u6cSN=_<+8{fEf7%1 z5&nihn%IM3=y$^{A)mVbKgwzB#5iXo_vkUBBx+C>Bk{#fkIrasAJFM`1y&u-hL+fX z+2S0ZS4SPt4c3$G%Oy_wkKD3;|C~)uf1n;=#8}8^E+tiadqPZlrZt6r=Ahjaxa;^~ z(-Y%sprt@HQM}F34`GV%d&Bwd?i&Y`kiX_d0w5#MN&q;KC5btz+bxtwtw&I`LAljb z-d4z7vq41lgU^moc<@NudH$^7b#jssy0@WF7*gl}=-C1Pn;)|X=R-Lgc|iirY?HV7 zF~|g${ZVPi!!S^yaxaXyK22Smw{2*l`duiWN_^bg*V1gP?PEX%N2;X2h=6^ND%R%g zc#Ao^RMF#k=oNH%f?7Mt*0?hzvrYl_iV2TVzv~rjF7J9VS?#(}DQd+SdC2RDHRCe> z5E*3a-&RzvhwB-DbAvWUB1z-g(de^ib&nvx<4~rw2IQI1Z(J*rFa+~*4SkeZhU1k{ z>G$Z}Sw!3VmAhWZ&~hgn`&UfzG38EWqqP<0d}Bq~bigQ9p3sCl6^ro@SRX9fKo9i*X8v(d~DsU8p8SM`oxUk?L^4laiU(xIe=`$*lrNVX~`(>9t6kG{^4Q9 z0Nryi6yMLE6aWI7`oI3moD5!Sd;}NQ%c7%cJuCC*W}P2PUX}h} z;@m3n!p4|JMi_)Kni7^#*?7YiMk=RvqMo1Md&L0TaO6%pD+DoFhJ48&O1&5=4q~@V zj(>SfVJ^RkytvYUr=Frwh=nmj%C%Q)s6uJVmr4|nbzZ4LH$_=tH4xZDvJazEb|l6D zIP{)WC{bh0V^y1d)wsk@rlA~!T)x6Tlc&i4$b6D`F~NFKi1n2Sd%7^&)!Zx2Aq{}{ zu&>9`VutL`LRZ+YHL!_eUK>F|3+NIFR~A88Te;^h2G7LecB($~Lsb|VUWq~*AbNPj z)=Zjkl>978(q6Bqai__5?z#(EPQ6bQBMA4fsCt8UyHtZ+X!Hv%+Q&7zc2{0&WlU_O zf9^SI18QU(MR>)%X`Eg?1OyC#%(JnOma|}N@E-s!vx0UR?m$Qp-@%YFN&R`~LS&cA zfFZPhNah;M(b1rl-IqFzH121c=^ITduZ7tl4pS83{bwge`OHaWe&2`;pvn_XdX>ZQul>U4d{_aP1bG($m~)myZm8J%?+h())6DsVjlP%HFw6Sx^@W z?QfyA0^IWfJ!jySsb?gIT}ghWnp=etN4;}&F1`+O?sR7$u*{aQnEvB>ARyh;gVUdy^q~83n?PL& zurS#pjQOtzs@3cnvQWKs9njdnN6t}+D)-ZKaYrjP{EK9^PPe*QbOC^H7xQ}~u|AWA z(+JCo78Bje2b#vY^f6HafHzx0YyR0UJw&B3G>pQbSjxOJvF*bxC46KnW(x@ueQblie+Hs;(ttZ_QZR#tSl<&O@(O$^cQ?JY}lD z-&%yDXX)g0ZnZ2aL}YwPlTt@~c2Bh-@wGK1m>EOb&3sVHFWs}~k#@ITq=g!OjC~+2 z-%7Bg5t;sYJ3TXKwr5O;4<&=IgEaG@_Sr*x!_j>4amP=qxtYAHAwJh4eVd0zR z=9%71POnLJlp5XDibhxd=;dq_xRj0{wd4n{N|!2|&?(pEV>kOcmIv6(XQ z%F5r>Su2BW1$~GPLaIwIkyyP$mqx>cLk$f9fCPk{r}%Hj??caUpatLMf;9;2t+QW8p8P zIgw_dqX34#D)cyDEchhH#dC9iq2~dO!9Tefo#*THFbm6?B6o{GLlx z6{8au>VIdUKR&SvZ>OGZ~A64kPm-CreFL2t3i5>kF$G{!-R!u4L zXCO`#G57!aGlttYc}Sd5jo+Df3!M+YG?SUNUy$cLY#mpmXCap^0?JE<+g@hW&fNU( zdqxemEtZFLuf#Od9nGYuL*>^VVBW8+t=6k+E2};4lD>rMh%3Q4dcR5|qHct>V67k5 zdBdIN1APUTcJzi|6nh87XtwBxd})iHq!c)>Ow0Rnz9L4-M309k>;XPvvL!#n zd!AZRfrmO7M-e-#=F*EYMHaZF^0l(30>!N~IYe6t>LQWQYTJ3TBA*d~}%0Vs^; z3n7X!y4d%EEYq|LQMnK$s(kYB_pt952_b}*!#ara;n@=^`0$QB<}yu%*gPgqiYg#C zTMRrE_Qi;`p@+VZDYp<$cKXQ(dQJw_(@=5bGTOjfWqlSF$rH82L`@E z6&$_qKe~Gl9ctCxnnzSTW!j1R$5pW^$EmVGe!dWkHc7a@dHA7Ww9{R7WL(QxIRl zO8~UB35cyYUr7SWKx_~=D#gMN=|1S(U>LaNE`Wvm;CX4GDPJ!!;RWijeOg%ZohCDC%DXPk2cbuMlICJ5iar$Qn>UY$71gd>BtM z$r35oP$wCb2axdtsVI9tS*Q*rl2zgWC~!cMsi{BWAY|~MC4@W;(AW`yqQ}N#i#9S` z3?RD)3>-Zk>Xcx0B1?r2NN6_=ig9FfI}AbNG|TPKa6g!U$zJQLiOz6m#l zXNKF-o57~=&2U?M6WEl#8E&O#0^8Cz!?y5D@ZA@2wCV`vzg&X0H{_tSJDz@`2;F>< zk7|xE{Yxcy`vVT5yQA5ci;%^S`6%Uv(~nfbcQ4|Qsw$R2D>Y8#TezZhU%H$pT-ICYJ7pA$@ z0kt{+^Y3XnV~&Rk%j<9`g?Z`zdCY@!n)6cUaST6z|LpnYjIw}`cp)OVg`|rYvIIMm z+<0Y(4`wph`g{nTA8bN7hwTf{g=bZJ+VMhOoF5{ub^VK}`-z~HQ1hmMGsG4`eRo%UD zu4^w`Yu*`0HSNT??!9nTb7vgatgM~EHKKk%MsJ^W3*s^DkWTZdk=>{|G@dQpSluFQOT)~3^> zVU267NB=2FPZyikcD1*z(S0z)-S$EzipRP;X*i7dnseLBuhhCu`Vqtzqb{9UCpJ6f zBvG6wKsFL{3h_(zoANvoD~UKsC{7gMj+195N-gEYo=W^uzfhJ3Vx{X%GKz@;umCZq z62D}!DbEA3(r%NC;zR*VH+d$a)YhArQ^YSt>125%Ryx=up%_tsz#Dcd@k>^k@;nkN zm1>evOccOclV>7IeXxl=h4`h?n4CvqB^ymLiW3E(c41E;eo2@q%OkPUbtW0bi2?{T zc_yONH=3AJiC@A;$?{07B+EpmF)~Y2Oc=BfRjS2=&q#c!Ak&m_VgWRnNHf9eS*GR` z;+L90@;neLQDTxPMiij0gFTh_rSeNz9*C7Rm?RV<3UG$WGZCe>#KcxsBV>C5vD5`R z6<<2&YxKs06FM4*k`|ZbgApH4cB##U*pl)R$s+hveCaqk@w0k|DdWTf_Lf+*5>+B$ zz|KH?iOAB-7_op$OAK0wDj8ey*hHP+Eor$}fQ8j1W{D?6BZwv62uZ#zEU}HqP{X`R z=Fx|rC07d4&svfz09C&d%>KMF)UkBR&@8pC1x)9(^fizehVOXPJ2bK-MTn&sMRZ`@ zlFct3pKwVN5gnb~=wSKeV6x~hY19XmCY;_J)pgXhS#fCi-%=Xx5WDTu5liqAx4?cW zSd)<7M)?&*@TBv{HSi7T^CymXqDKPpUJd8~`hPRYiPdyDc^4Y2Wnx)1Qujr=$E3qn zdm_$ia+%k2FKL|y1l*O*EUC}V8%8i1qcX)Ryp>+m2AJO;OjZtkf0UdY{(dvEGW`Cajq99OOg9=#q@a-tZs4yKSt8wp3d?)tEy+(rHkvn3o zQQ~K2j#$PO7VH_An|px;e+KUIS|MrNezEOmK-4p`Blj9f{7mkMwMG)Vkvn29k;Hdo zj@)Z3_!*fi_ZlU3M()bJVu78RyK>h^V0Y%O>?IQTow<{1i6nk!cEu=OB%nynu4M1D z6q>m!*fXqxXYL60jHTk4IfA`mt9WFN;Ah$@8kKDG*H}>r(WJI1Rj1W<_CQe$`@pH8+D}uU-anOx z1YD>1;kaY^BCoZ}l-7H;p6^3xZyfgun@OftP1r!K+R}bc>;0y=JmVT?_f~}}7>c?~ zvOZrl#^oV4IiSN9QIo;e=Zo}Z4iZ{~ah`Zr3R%zj?Nc{LsofC`cvJ22&i}19`-txt z%F=Jpm+5yPOkcmbq3~U@Efu0upChU`wzlq299C<032s|c_lEn{pFNAy*4$pjF|~Dv z;;>q~7u^0d+Vg)Gf6uGB5ZusIVtlYq*c1K<_rxDfKrbXXE+M5Q6B4OpS|X98B@^Fq`@yCW^O{WaAj}$smQyzW zKP6V+s!nMLkEL0_5_#w6`y^!!Rpcgt__YKtAhrK|Ot0cxfn*#KQ@_wMf}Y<8NpyHC zl9~cw(IdK$wEN*n8ZF1FR0AM*bOkP@Hhg)Ls>rpLzz7VkMxm<&Eq`7Us`6GKF$2Y@ zRdfMK&+o&eS`JlcOaXDKUVqDG1LS@$6$B+U$n?`Gj|X0oLFaS%lEW{}Qw{|Hk0)w^)Se_m?-$yET+qet;-*2q--|)xt-`OacHYH1|)GkwL!8ZQcrYiVcsD-}(@TO8?%{4y! zheRFd_N%brV*44ZYrq94X%lflul4G(a@aC=G6=0y{&fKOo0?9gVZUu8ziJyHbj`um zOgM(F1-~u=*D-@k-dJ*_nZkcd8=4TQV)CS7eZo8E%HTx+QjrkbB!sK&6$PF$iNh3Z z%}yFH%zy6gV2N8^a@BWqi3(t9N*X-Wm1D6@!cZ$hA6S{q1MfEJGvH8U=Qqn`Ykc&| zul4PV{zfS6vwuILuG%j8Qod_(kUSw+rD$X4ixi(%1h353#=djVcgMb?TIXW#X=@0gz`$~A)qrG@%I_V^fCs;b0l5xsxqjY3S z_F59+`6yIn(oy8X;HGpeXP$hn2{+R@7PND{gxm&fh`Kr+f75a}D7jkxR8zuDpWx!MlXfO42SBp_I{g@TCo z5E^7u60Fe>VPuVfOQ1%MxvJwyaE88Pg~wmw5z#Bm@Eg0uHANxW^}Xz>dwewr76R;L<~l=)yh=e>%U#n+`z9OJ9gA@NS-p$8G_lnF8s>wF%G{2shv)(d&Uo#koNkFwON@183jiqNT z;n1d&=kg=ArX|D7iawg6LU;C|*#tZwHjY5Aw2T}dBxrGH@w;u2BkX+*9GMj$mZ{ag z^RV+xEtHELs6+CViWyRUrDEbA!6TJ^mYy#1qnFo(#l`^@F^|9KN4dhP*aYRBQ2xaQ zMy@D`ncD!p@h!5QRU#=MT~zVF6i5~*im4(dugsAz+)3CL{!c7qG_j+OV8iOCE2bn= z%tmV^39+d)He0*Uc~)QIm}RN3)lz~P^NL~CF*~3M!&+4=7e(3%73|T5QKZPU0PLCxFjO_7M~XOiLljyw^J#&(02CG(7IE~i zQ4)Syv2EqeHoB_5YbB_o7QID_IB<;PJ|#~rr3|d#_N5`yLYYIQ1o?vvjw%OUQbZ?$ zPM{DJ;3NzR2_7 z2p-etJLDj=-(7qhJrU2dGbo(?q{{3`SV%u9kMvQT!=vfDDNq0I9kN6QX@AV2lrx&NBn^-biT&pym;d0jG=oB{9kQSbbrMFzs0JzkD$z;K)vTnps>3CQ#$-fuw2M~ z+T5Ne7F8Mz^W@o2mH=&Tx%}4>WX~;=`|R>d+c@0-R#kPdW_<@&aUb}^Xr?6Zmy<4H zOQ~BY`&$$Xp0iC_FR_W^G3Jya{`k{a1aG+_C!NMX9liCd|8;tLU0ppreS$70HBfdT zE8hICVG`&N=MTibTVIaH>`P9$s1rgY>u8ZGjI?8ne0LvFlraXz3K=aphE@Z=wGygz z0yg2|cT66NF-maiXbMZ0U15~})pjcP$nvdE4f7ah;{d$KwoVaXJ!n90n#$9l4FUhC5-8;nnv_H1#Z z+Aou>_YH~7_hv^qtk-`yCvOmkPs5%<)J&s%C+AL&Szf zgvP;txjQ_HYhv7n_%=)RF+S21<%^IXa4C)G1x zWgCyo_;H~>dD*gSt_xaCE2+*20M~lSw*2Gj4%E( zJJNR)6E?B#GyK9;XEobR6()3NPURJmc6S{&SmTw(D&O58?94+_3`NqErt1V{yqpSv zdF>8=XBr7;6iJ(!t`q+8N@JDpZV-0nAt{F9aLsiEC)$WW^GvTs=wYd3J`%kF#xf_` zE&dBuPHDs5=fIum*hH8SX0^Xw4x*cX;)6i7`l`+Xi0Pd}Koo?$mo?2eCPh=|x=nR5 zbnQqMkPj{k)+kHJ2bM)^Bqj9Y1p&sn?|yh@WW3r89lJK=pvjn~-Y^;#XSgpnO6`%( zQ^TcI>aL5w+=@sDPg2vn9|1 z)z&Gc0v(la3s4IxU1v%}bSk|qpcJXP#wm&5seDU7yEff z!_kS=951ix*<-|1YmMh*$1)%3h59=WM1Vtt&~YnyY~!_kKZ(@hsv4ML~RK#2%C6Rsfe^ObJ~wb}0%?!Z`Fb+0*eP z6~f(U<^VB&3gO<_-mi2?G`J+s(FL3`7y$sSmfON4lj$3>e?rHjct7>nlV{}$(j$*h zo8Bdlb~mQlHO9a=1_KkDWxNiYeR&rOulMg{(ImYx6DK(!KUWdJ^?d*D#z;0ff(}o3 zt*_6?eXyV%OfYrPwU8yk;pG?WD9P+&7KGdadP)+3QV=M`-E<0P0H{iqCB_a#v+rpW z#pR4UYYQ}~#x2-N9DU}1)58$*P0F6&^Ew0}gkvz2&Nzv^H7kw@XWRhj?X=pv)g*)Qf|fK_??Rt-}o-MeH=!(rpQ?~$1ac56plIM8l1yJ!x=O>-~+ z&b<0&qt%kzxiatF zcj{&9s5;^SHZ_rbr(QjmP1w{l_MLk1+%?|Rlucx&Cb%XalDKiiN@h-2jwP!zD@)x6 zj4uxU(b16(=dK%<3UwnK36DUyaXq0>C`3DjXJ_xtGVk?zy&h+CFXzu#u=LbZXx8hU z!ZfsAn;sYT&dw2z*xRPFNgW9*^*BDl(h~}WLbOwOcJ|C3Ew5QwuIz3t%W`v+o4Ciz zCy#__istYW?mM1hq@JRD?>O%GRD0^hL6Vy(HtV{Z#iNL%;(DT&EuGxY>%IuEm!suy9Tad zWy>B;*QaND>k}tATc#w*cbV5F7C5-ejCVY~<8cj~O}U0$kGHbA^Fqk+-Htc0Jia+A z>^g4lN@CaD+@^YS>K!{zy=5J%V<#%W?}59iNxfzrtGk~~O*qI?FIoSPf*F}&Y-+;6 zow|7wR?3_eb{6xEQO;tHo;m*XcrD4Csp=-I)PXKnl4}zVZsCSOVEyc)pCKLCuUa3s zPV(~13GtZ6lK(hre#Gjd*D3yJMu|U8?X8X4Ta#-?jn9y7@=RXhp5q-0_Z>ODcF0uq zjTn!3#5;^fjKyS6 zvU+L9v2dLs27-?HZ{2q}HAe2_5mv%GzWIqyB1ya+;ox3z*W;-As-(IDy3{+qRW|MU zWw4mU<2VYj(#Ufs@QbipSr)0YPnbk|z4b#1XHs;1`tG#(b8>UspHx}i`t*I{@r5`z zns^PNY3^3?)iKRF0Ofs1>E=6=WoxTAm^7=CH+IwBr1{*+g5ly5=CiNRRoa;_xC0|xIRsA_{Cut)I#Fcgh-hk)^UL>xhVtE8qkT^e5+b73 zKM-=47#9;G|FW|W!m*n4ll-Y0wSbO2t~Ksu;5rI}(r{YC?PifHI^dO{dH#fUctQ`b zLtT#y{mOfeu@&jSD0?p02~`@+d9h-0_Ls=Vinb%edHh?^#?VIbD3x4FAdNuaUFGnr zB5c--yU5!4X8x$!q^V%VSg| zzZbU`z93v`oAwnhW*wE2lp{>BD~tG9INQ&zzt`|gU`+aErjD=hJRWnO7$%5mCqZx> z`UW_u-@o7gE_cOc#4XXz-QY+GIx23iC~bb?rg3mpoyt@l_>c~REfX=76p!W<4|ko) z+d<>TDX-kT;b9iwFN1;PCzp<(7T`mB>k?mZN9KL+wwaBnXBO2n62p75>&cf|P-7R) zfJf5x=gPoOy9`@}gD@7?H6Sil1&o%NfncI%qylAvmP^EQ-6W*4mQR9HXDlTgwWbcs9c#Mi-FWrnn2}Nvg7j1o5yVlYG;yYRe%Z?8hvUTel|)&EYLC& zpiQN#lxzzihlN3=QuP7QqgBpX=M^X_H$T?3)?qqZa&6#{3QdY*2G)R)5h&5ytt#!G zg0X`Y)@@{gfIOlMX&nP(#gJHrQmDW`qyw`-cM_G_0XrB#S9T%jlr%8S1?8ba$QvVM zF!0;~tF64KKx%VPOlaRcCNoeSDlRRNpjwR5G+6uuOa)ujLbQ=LrzJ3x2CYKqt+^S9 z8AfVb<$al01~|USz~l-$F)-6rm~MPrOO+6?V>o=GchABBNSUUr3QSZj zG2!a)6e6}vi^%N5@SJ!a&Lc@Y%gW}Em<0Mil)MA!sSiw`R};v2D&2zvk9L9^p_yaU zbmG(I!fF=bromZFJ%~}p)xhPW(viu#^xRyeZl7*xX)>;>4sGwWKE@Pt9QR`|b zv;}i5#hZlAq)|HR$UF&eW!IX2PgR7*YCtCB~iWKak+lEwUP{~0bG zPdZC%Ee^SWjg|AZ9LJI!CYQnLXkaB%>L;4E1&)kkl5vi>6Eg*jEwnL7Mw&_r%UvMrE~-iq7GI1kc8=2&F(!%@Wjxd%AO+h-9#9>1N8St7E9;(BW^u z7h&%0T-_9I4m!pTL=8(Q%*o+wey^4Cfx)L5rWhd`C2^}YENmVo1>#vtShhOZm=y9J z;^uQGCjAL(XXQ73@^yMYU_GvbN)Zr`f1yS>QcR*2a`FbP8_aSs-Ec5pC_;ASNZ;oo zG3254T$li*5F3GF5DSHgoAZGKAbyC%|b`maSnR~gQXo$Bp@R3jP^Y1_-Sl% z1S7YWmQJdnBURs=tb4rB{8lnTGmlckEmyn7)?_^xrG^QsE}yTdrnS0J9UP+4rtXGO zCLkiW!zE}p?p zw7)LC4zrYWV*Grg2-5AWBkiuGK#A5&vbyq}{@t!@?}{-LcyZN{1}aLr?m!EnUXr%; zomG*3+i;*&8wpocTmNiVQB|%(ThYlWsas#<+}UHA29cnNL7?Vs_0*I<-dHS2L=+U9 z;Z>!;C$bI>MGii!ff-LnMFzmEK7BRdr50?>VsCD4|ZODbh9R;N2vZHL!q_zwMeJoDW zx4E*VWfucxCZ;M$zpax2hwgb>#OVB|zfL8Ej~uMpYRTX4B%Y}`mCm-+LOYAOm3gPP z#a!$+Vtxkrht0CzI;@us2S=kWQQe|{x5c1MM2!bNL4^h%1blUDHaS9e^3~0jufpp1*R1_q zjZx)uHC(jSO&289h?K>SbU#-v%696`#cX)_*0 zf*F$*UBD#0DI+(X$E5CEI$V0&5goSdzbTF8G+lBZGa4_M>nU9=nfTctdKXMg)xCu}9`L_CBF?VJ=yg2$#^j=yt?yU%Bb3U^;@6GzICOw(w~y_qUwKC%n$Rp zlh2=I^dfI~lqQ%Ye68iY6VIPO^s4Rmu4(WlCOit_TmAAR+&!$wAOGu#&-nN)0=D~7 z*>TH$lZ0pC;dFCH<1&LmzlT;s#D|nXboH~~Fe&AbBEj(n3i4Ll^kG0QG$c!~G3KxQ zgi?@;V<__g-@WP>kA3etR@WtVrrjdB-<-8xK8_8K`3WX%+OL(0SK>^K$TZN>*I-4N zyOyDlNOln6-# zranx_26(21{8F2?P@{cHe#~WaK0@?;_e2549`0h(F2M%HZp69?UqOB5VuDz{1P}bF znj0sLcZhZWt~LXkKbTvebnVQoP4nKQ>#e4yJMMPxyv$@)tbhUJXmNl?U`0MSebMHGBB?vh0<#%Xx zx})i2<#PNd*K*B{Qq!6mi?*YimK|uz{|LY?jRcxC>t-<3FbR5RRx%sr@xLb+!HSy1 zE@U>R!>wbHn9*l(@tepm__Q!gFZ~yL=)c&W4Y7RwcwXumj`scGslU(qAobCoeWZ`l z$XLp&6QV9S5fbd{Qrk?mwwhX*JJVw?>E+aE$7*)Jwb2Uwx0~2lSeW@I>J|Bn`HW}% zHdVV$j+UNNtm@iMXgf0(W&84;ctT%c z#|bDb3S3{w*N;(uqf!$?^5o%&-%;UndOfGe^i8X|Bp-F5d0F=Ab-5i9t=XwHP_G%d zXymYnU#B=zZ_#OgwrlqB=(KB=dT&}sUG(m9#Jr|DDHMnj!rAFREt0u0XxyE0Wn3DR zBi-3yG;_pcT-z^=Cg?u>EJtEhOB*3)dfqQeGH7zrQ+`T1{b2C*or7-h5Qp&-wWxEM zBc1mS-50&bMbKNK>@LlCimzDC2fChTv?A&)%@>747=WK8 z{|jXJL+om0Ljp|!7+g&YE=EGv3}oO}0`D#j0Pk*P^dyxp2Je0lc9rf&0!U&JnI)PY zhyj$StcU{Pfr-T~LV=*JdxOc*h;WUdp-2csLr_psfuK^F05F_^qd*jb0Z>qRWF}!y zN;v=oOsnHX{N9eUUw;^l^m4bRwoh~ysOoEBeENqBmy-)uczGO&20#b z6cVwTx`w7`BpP!t!yh_VD?;Hr>4mboGShEiBLz**W(e|VwEB8#)!u5&uDdYu7>q`G z-R?qJo*7wKgAq0?{wJgF+67mmg|ctsd|8aNCMU7j*=*Kxx-abW<#9QfJB5Q$q?C3D zdBjbckU(DM$~GI1nzhB(xH6k{ww_UHT~Zz z2oa(rN&f}=jw1D4WrXD0_n-ML#EAMfnq(+3-@Z%^N_sm5ZJa!AD=XKN(z3;@lynJ; z|6QPthY>Mq1s()AC*1*QW{a<;WZ2dRryJ**ZxIq_ zH4JCBv<82rzA24Y8iV5+-?WB1H7FsXL$L3x)gHBh8Q?n=4)aPA275#cJ20W4VB1$c z5aWAXEZ$cPfO)kBr97gA&P;3|Sx9Xl8Xz&?C;AS9a;MfuA`Aj8B-H2a+n^-H{Ppa= z-+n5tQ?2FSwB%Qt%I%Lg(vg!9qD1xZ8axOuDk@4UmD(8?x(Gok7P_ziOH2YkxE&^> zXc$>sOae;>g*>zp)<}d|OeT8O6pSP;E{;}90|^owvPbj)j)HWY8*nxpfk-GIhBWy1 zbP#L|pT~6o-#IrA5l*1z%b3feVO^Uxfi!JLM>LM?ynQ-Z>crWiOo1|;Ri5#;mvt6Z z^kCPvauMIoB7;0DTEqG<(Q4sfU5C+d60jhlGYAY4&KI92*Xd?&zjF95WP&!mn zf(F1c3?%$Q-Wn7{SvuYm41xQVn4J8Jg~=#5)Aay+Q49d;=ne`I-2$MZjw)IZ0%Ilz zff|qvf#!8D*QeF(05b~;MlRaf1uY&hTAp)tekm~sRIK6BlqRH$R^O%!BgP4^K4@KrtU<~X zGWfN>!JYp&oc$B`LUCGmH9Mt~+ELxy$VueDa{v@ByWJNJnb(FFu=HJVW#xEDbo=cv zElC%hu#O@i`2xP5GE6@gmyna4gV({z$!xFttFn{biS*#aM6rn9?`dN*q`hK>fYGP? zN~>9NA|KCt@1gNrdfB90Qce+_U*W;S>*d8|B64p$RbV>^k1$c}vj(9~w@ zyfL#eveCPd*a%_Nl0>PL&+Bz|#63+)F`vdKe+M<`0;WjF=YG>U_yeej$*1qxdZX0l zS$KWp#ms(p*2c@+x@mHq`1{sb5;lvrYg34WkfrBYGu zg-;d9?5gxRq>r)kjn6v1r zq`lak9Y^Y+haIf0g>1a?9oeMX%Ro|vXR>aD^O5z#K$7p?1gP|!fSDmfXmX3Ep}m=r zE@uJ5pVDmogFXEK(%1KxHNLM?fkSlGk(rY}uv+-{eAW|-O($oNip8`~ko~rx;Iyh) z;)XkAUiP16$S=tQq?kqp5JcQv&jcB<-z!QUk}%^wIGu}cGiaA34Zjah%w%gkCb*ZU zSHe*`R<|PirPl&TYB67$eVFtarF1vz2Qg7aogSF;i>#`skcH^AA>+NZx><~2Pi4kM z|25uthXl1_AYsS?#*`m~KcC4S`j@Y8pJ56`qS=qE7$F5nki5wuK0?QUkp!+ql!ZJn zcRt|F5=1F~d44$1azkhcSODsahcZwE2Fl}k1MqqIWDJH9pxZ|jRep(x%-`tL62lNC z3xYzCa}0zQss#+f53C}spogXfBT`YRD5Duuk7T{4%+hiN6g&*D+2qOhF!+RQv5nMs zH3Z}D*4%KKU&veg`Q+51)bVYrGMlB%_Lv6vY5RGtkgntGqBYnH#Fy-JB>3np%GNLI z6-RGRx>f3`gT z)ILgc$3JHucBw&(e}Ak5>^EX&R-FGG=SI?Oru42#XQ)(pLiyX-+G>sWK|U*)zy8x+ z_n@n)=Zuh<#O@QjH-V2Guv$=G{d$P#ex?1`}n1LL`QiUvob^~T2dwdUOqLKI_o;d$?^c6&we=^MDKc~a) zXy-Q)`Ak$CZR`vew3#gEv6?XCGB9S=#rZX-NHv`9C-R*2ElfX5@BGg-IPQtj=UF|x zb4Vck*%6XVNX#>{<&9Neu!#r*equ@WC`JOfKl)AswM-%n_6ng&6oiDSF z?&{$@bhWJgP{I^fCDMYCC^$Eh=vB4If7;5_FVV9mrHCH@*L-B+6VF+IH(I01rpX1N#+UaOqdW6BdD{$ zp%auG(al#7Z^4_{%ohu{KNJ2We!cww7&<<$i_0&clXf*m8r3p%6(_+ ztf#5fZ==7#rae=-2U3~XVTJU)2Q=igbib3LUq7+ z?MvqAcqCIHxkiQuW`F@`=7$$(rwYsA!FT^0*g+Z$Zh#|2L zhh9ZXa(+wFhDfayHbZ!tL8Z1slE4Yegcqh_D~$qF+kv-c%W#?;ATDTXh13d$aEJuQ zpbCzF67E7P2G3wZoDqomLqJGwp)i9b945;EgrZBJiD#j5Jp@4t9~vFbk`TRMF3#-E z3ja()A*T;@xT^x>%#=#aMTVlu3ONn_k9xyeycqTz&(=LA{V1+s2jy}>=Y6!sHTwy- ztkm2m{77(ml_VUPeR~XEU5{`86SjcCaHR5Zy1i)nTL;30g%OnVajyMKou#3cHXJvi z2MNI?A6yH>*HLiD5n7*`>ixwglT~5$F>8`O@t+u`wQagpo97$K6p+n}DSvWCdc;o? zj@P`tX;2`EWQr%iSw_GwyM&{2{g? zt?XcBtVD)9>Z}sxb(|)?B;A|vLX$%ka#stt$7XF}BIx}7TVfpt+D&u(W zj||R2U+$q)R)9_wP%pIT+>5J(o5m1xfA{Q=1^~(X6!TuI*P~2XtXf8!glKm|M$zB| zKKWL6R*!l(k%wxJtT*i8PO^&P1CSKRx~dMI zkG(fjU#Y+{$Vy;2=nrkLf-Rc&o&jT9N~RBF+B=%^CFr&^&STdRxHUa`=p_`&qR>L- z@P9*JuWH@WCPCZFUH{Qs$RN!ewHoA7x|KNeEImAxQl^lYCzFNRtuq1)q!#(f0_~)W zL(E>cH%*Kf5hgf{i%%I<%2!9CIv{KU-*X*#01Zud0aev9w;5)0>Z+pa8KwC{@A=Nl z`y1+!(io@wwvhYI4lGU_{4%Q*3jFjhPO<_~yYdIJ6QwICv52B%{#hX1!^_MJj?kE# zhbLAyNbma$2~GvI=eu?Z$4PLMg`m2-WKpAU83WtGkuF&c3;BbAJzxG#-Hg3_F>HAr zutxQ4)&)+JXWS0R@6au3aRp_gYv(w$RNSx{h?ei>4$XAJeWq_*j3T6NMOz3%X;!$N zmec0^?(Q93ZF8$)Jo+M_fZm{4+ZNtgo`VK^6)_w-(keoQJPPRENz4zSjo7nbR%TG$dmm21&vK{Qwd`pLu+`GgfWpwEEoq^IcrByp|W{5!!Swt~nswA|2SzyL@fLRAfDUfTp$qw-WMKTmE` z<|Vc->I~f>6Z#4ch$c6t>TbP8x|*AD_;h}}xx>_C7hl})7h{>p`k3n7a8IYNJAm{z zEM0*gnSa%HTmh7gYSlu%Rh*ja5Lld55I&8qD;kz5Zzxr9OB|J}v=F_gxHVNs`b#vA zyx(D|e+~J6Y^X}m_Q%UeuSHn>;QZ@8x(t)Nv|hUfLZEvTwakJP#^)-i=xGdXOb2nf zb8Pwp#HnA=h#?ADSs+ogD%%Jd24~KdM23DZiBjrt5`90-)K+pRQEeU;nPf@9ms$U4 zpQeDZlj5)_%lw^yYjoY&eg&O{-lE)1h9_rcWr9CQqLFHnJVXJDzL4R|o=yLXN%YIS zY^bPw7w*II7Gg;7Q6TaW@h2 zu_ForxwurNQ2F(|=N6cDMSrxvAui~?%`o}uq-Y!+J%rMx0A&?b+5}Kd(04KaLbNt_ zCH4j&Si3$UbnyC;Gy;ok9Dm?hC78 zi}`GdvpFmhFeh2VuJd6|J&H(}ii4eRDH$B*LPYW#mB+ejlj%pcnX`2uYU38|aglUi zxk90_7^Cc*UdANH`OB^%y}JS*s6gmLgy zjzDfN%@CbuoccB*O%&-2Ps-zfsqzAA_Qa~jj=XmT-!*p(%n^n-_vq8!v3ZSGtQ@aztdDlkw zQkBvm928laN-kB35+7yD zOQv>FQ;gZ+puQR}hhO|IhS7hdJ4Dunm>p-2$PY8LlgBwe=VxBVElHHI-WS{V08Z=N zuyHsf!q2h;w_ps-ErW9*t{y3x%lgM}%Q~_uz+a{1$}EdaAOFx*mr3k{ZB*@>KUY`= z+w9ku9Pp+ppmi~yu{psi-h^K6( zAiuc#cwHEZ5go;lw)7QOuW2Po`0K1xB63S;|JiuTzMEd0lYNMAYAOhIYsSK7f<0tN zK2Zrl=ojoppQy=w@m3ydk*;U028nWxw zw7Rq=I#Mv!8X-6I>Pdlgb0mw9(%!}mniP(_TOBmNHuAQEPO%Zg7vw*(P`Oc#rrn-mQ!LglGs+)~UWn4=ih2}%Z&hqWtzGwd>@E77QT;V3W7TA`S zx!hz+FckcRDmI{h)}5M4Io2Pf za^AWQ-8uXE zhf>SAMui8Gx%NZGW}NApqu9xu9Yj+PKCUhNK!8Dp<|L8nZZj`24J}kJWY^S##QH=t zM;S@HimxVl{;z$IgHN@=1h6WIb>4xc2o?~SaJV!*nKDl)_V>)hkdncu1KAE7_CDhg z@1j*+6K>&H|79+{EzjUzDJvOICy>RiEOO7Ed^yZDuwN@zVkQT<>+w6#tvP(2fI0U}5-GaW5kXOuP{U~uDB0swQ z-MHQ&Dx75yg(+@~yqXMm)yEp_c5VapnWFkuXnxjTQYi8c!a5iW!44O7y0q1 zdWhE2mqSt|>}J-WA!?^A#rVI|&)Hf&^Qu)j3rh5+DUD2fmpDJ(nZccaR^dRHfm*o! z`*qGVudb&RTiW@?dh>BuK=)Z=k?#kx)5jdBDPP0@{@%JKcu4*@P-RrIBQ(NR`pxj? zO`zF_VVAw?(DfBWoHh7F1)1X@yKPsR&JWy#s)UggJ__Ad<}0K`UM-X}L5l&gyG$ww ze#hZJr7)XrBX2fN7}w%I#==y+@Hh-oK?=nl=b&9iTm33%m*GWQLvDouG>LTPoY30y z!EZ|L)mf84JQH?%i+_2Ld$k1I2f|ZGdYOC1o+kK}`DJBbAGJAjmcORgcsrPvwK;zO zrPoZwMA%yK336sDP$D9#MGB6X&w`0pg_6%rbe$SF9|m(XK5`{ckVKET6Tr_ zzU!BL9);)(UE9wRcfH@?$F2rBxI=}o{tv^4EQEHHk# zLl|sM%ykwQBk#2cqZp5oqZ(fS&RnzUGSaMN++9AXB|kX

    f#~yWwVuABMCnOLb3lj)T{=!)x!S=GVVvgCgC%T@;(SuTyLPm&*1V_f@+hbVPFBmF}slf;Rv z+=RB`g>efQbreW)L>J-L738D2do3w3KLgc)q!i?v>zM&EOhLG|uEUdrV-ZCU6EYZ-gl4%&od$H38^LhM5Rtq8&L1JcGnQ^0gVxOA_rkQCgV%$0a*?kTtOmvfr8Bj#mqV7tnvFv%{I|lF z%FQ*iMmm&QZBm&DzpP2iwt~F1-kk!CM5F2hy*m}(!jlR~JFa`4@rX}lq$a-D}P@km!I1e#Gxl7<{;&wsIhq!Y#NiUFWx!u z-Nphw>gbv8=_64Xbo^Hu!CAi?XE7M?P@u|PPZnDp4+&PdW4a^--pP^t7r8DW*jKkh zcT$mE#(wMh|dNuP189w;jSMW(O{=e z0d_9!RsD!g>ogTzNHiS%8n+Rx!zY3?@+Pcx-vhe*zaXpo9 zqqU+~d{RO#Y`|&Q_9eO$o8Ac8={e&X=Zn=z3vH5o-TKxCi{kYsI<`9t|>#p@SIjC0VHZob<@*~4@?9Bst(Az%e)E1ra>ii_n*DB>A||D()<$6luK>ZJ^WJB z;fA@RnHi4i-a?YW?K$2)Ra-f}c-z~E*>1$=liNEuL}7x6D~0sNX+>AA>as&7|A(!{ zxvr7Z^C~=VoGM4-It>!mu%-!pV7R=H#dN+Lx&IkBwU^&*ngUD_LnfWl+|XSGCss13 z5oVVU`eo@i^56sgQJPpX5XKhxa|!n%6$`IqYGo-OcaA*wkK>%2@?r}**3;mh7po*{ zr}4hfkcvcOU1}{BbaP7)8?+E*9k@X8L&2d~B1A|!KT8dTXDjV`27T=nyjVxHkf_2? zb#AiISmV??Wf1a*R^m28K}sTHB~U@JTD3uGpD<(1JR)u?>hLq>FdFJCMH?CIC=HKr zF4f=UR}SV?zos;%&b}gy!C%AUXpP5s^7!n#w1SE$ZHFm(MGBKI4y*u#zTjaYY`aQYn#5Rw@v72&QgCE=(%0~0%~`aKQJ%iEo}jL5cX5QAWP1&EH^RJ5s*jzp{JRL+@-J(zOc#s?Rl zwJUdsot<_`DbH`_-6D1y{DlKj@q~*rU*9H>>0c=E)fTZ+XYR1!GK3AkY}Tic5y~_) z@t2H$@rwkWzbL@@FE2<}natbAKdpm^J2GHs$-}AxW$o%YE`P*vqo8X-A}oH06(kIxT()=zjlt%|^73<#J!3fg@(GGy#2 zHCdud+t4sc)@OhaY`})@DD$^{f=uEgNU6>lJ(n3H&;@O66Fkz)3Px_z37l4IWF0zQ zAyWbG!fm+zqVxTbVmhJAf2&@jWmK9=<^V1&ndFq zYYfOC%e83H0X2+zCFFfT<^;x4==S*(a@ONs#<8addY9sZAgu5|&st?c5@W_lVht6M zekR~gre7@ZIEKTWrU`%(+R+i%L1lCUk8_b5DhYeuSFkSc1kdL#$ zjT^Su(Kl17KZ5FejY}|tqpEeel{#<#dCP-1kGrjUwQwH268t_r6Oeq$`|XAwSUgej z5NxBCY+^@*|4JIC87~{WAWdlZ`Eoc~G4_*fSM{%f6)kFbePBn%3GT&bOgn4Q0{YF} zl5fdQ|B^ZdcsD2kBQncSB#vMGp_0$)b!xcbyMXHrto2gSj0An?chT!<*GMX@Xiq z6mfm)ntVQyR3?j;byn+Jjrr-J%V`73@u!WXnb0>&+-ogtLe3@#>_(g!;LAw@O6l|O zvx#WV*IJM-jpPA(n*zLhCwmrhiBupBZrmAodJvM96l1#4`H|ZD0BET&zJI#e^57fI z(Z$nh0y9Kbi(QyuGU!=zPsQkoN+>P5cjS0(JNtP&EU(txAMhep z=43=F!jA7yRkuGfsj#=^Kzko0yNcuRxhYn4TRW^nGc8Z$S7cVc5VXdUm)lg|iflop ziZE^{rpMhO7N&K*vaaFrPzH&uC^|w|a?pd%m2uuI2T%O2*?Ev4D#0`eb~$ZSJ># zZu3Itp8{D89*ZwW=_)3HdZf5lMMgYSAiz7vrwHbO zT0voH`sx&mah_0|CN394BVH_)4e`^7^TmzRm9C+x9u2gs)oLQ3SYwIZ>)L$HXCrn8<%v~b{Pkx zOfYRZXNtW97Uczx{!J~Zwac3e$m2_AAp-X)P%j^>1-Y^LzkBB;gII5OH9xGPaA5z5 zeC+%FQ1q(5FpF)1xl`l}`pVRw5-*d_!Wr}VJlli`zI^_BBUt|a<@W{o_59WG#ed)L z{ZH#x%dv-Kg`o1k4lmsrC~~|+&kbfK5dZ5-wmfqXP$D~Pu0~CqmL&OFA;Tj%1Rw@+ z-QWO+EECdQxrAtX1v8fIob4N*d74LxDF!g(xA!$OfN1GzJ=>s{NvV4!7!#eA4Geb@ z1|YWerScww3haih+p9E=vo}SBB?2t{THjXeB~sE`0i{P@RRzn@3IrtD^{w^a1_xai zqPNySA@FdXA$SjBpbv^qLoCVDuNZt|bG|DYf`D3vK0=NL@CzOW3Qd5azCw_YZks`X zlKS9J1fcAb=nUeoco( zbNxbexp3P$93mO2q_AEx@!v%O3_%hx8S~O2A)SMvVQ-Cr0wNcPk>czuAb>&_fDs@E z$Z!B&W4w)U^G@aB`Z#C2V~~Y9d^8iOdBXNFkr@%v!Y-%q|3 z1cyb=l$gwNz)y4kyZr$c8G4WGL6k?ugR9ZB*s=#Wx-LuI} zy{A8PVw&AO0yp6t1hwF%Rr_!f9_Un5sRpW1Ma1)S2ue5Iy4Be-rcteEzHs>&zMaId z)A)<ot3*Afv9*^*?rl!tAU|-r#{tU;5$G&Of3c1}8W=I*dcVtFep(w? zTb^fSKeI5&7ey@G!tnRW2!}0k7m7-no@eL7pX9*B8PBGtWSd%)?YND(L^D7|6M#_Lw z2{M2qmq}fkfjMt|Fn*6k{8aI+zG2BGwlm?Iph}eNjr?b;e2ApU_LI2OqeH=$tw%=z zgx(dNMns&*2Hm}k3Q8mBds2Hgx6jhRk*b__dxGv&b}Haq)E6qYg;cg2cQK3b$c9bc z3R*0ujg9|Zx2g%iUu+H>`#PGDY*cNqtd1rrxy;24B08LHDno$E19J590#?}h>gsKm zU*3tB&h6&z?nDnj*omeXKx;uIbAlv&vrcUJgHMv7&3sq0w@R3X)8(ZSJ6+fe(%}L* zaiZ5tfx)X3XDoD3%aVal)5(Dg3L#KROhqxxMHUH2(na}+lZZOqdPfbTTLOe2(fxSP z!I4vR>3Tz&iE?8wP?}XaH=)QIs@KXb&yW8=yQ^YPaEodrR#s>&EnE5J>7!787VYZb zAg5yt1dnl%F4_h%N&#IqlG$)+355m+1dyg@6t$VrA(s_zOAc;h*QHhJKSkkUb-lv* zRNve_t%Zu11`sWCC(F27VQ=-q>fx&&l8TnuS3JRd3gJn4spzfg9jxa{EJ>)-s z$goTZLE}+Q4lF3z<;C)55+ZL^m_bpO4lC9CML_ITLoE%1ww!F;5rP#k5;KJ2Xx_;N z8ia<7;`sA6BVD`g+mEv3;rfHJ=6*;d(M-T|uQrpXw&pv!fKbR_#q4EMdtWM5Gb@r5 z&DahvKS{~X{xxWKfa5sGiyRT~hyODT83?OPG&l0ljI5e6*L^9*zR34D{6_YoU5LX) zLo6|CArjK@5H5S8mUQI@wndmUoqzWs0jF(xvzIt%v(2|?P5@>rN*Bmxt_);Y$u|Nj ztbGw1ac#+HtC*Li3u5>lpek2eX^L9h2(-77L)XgxDVPO#l+1|N( zl*wp~B_3`vm!+XtSa?E_#>SNIKwCj;jk~NJh%zZN_j1YVu6m~0X6Df3ii;=MT4ua$ z>Lb-_Lj`I&u5h4&BcPQ_w-Wm6Q-}nQc;R!MpiVCZpccal6+_5tJd|$40o)(cOgogEYRPgQR0J^>EXf2^V|T#awybVpOjxuOd?Ck5v6D{evz{mn&c?X zVGu#~Brvw&nvtr{zd0`tYh+KA0Z7>cS_>Ddjvb44U9%`fZa(zI;UwNsE(va7G8p1& z{TK9&#QaPHY0_@Kw>N4MwX8v*!lkp}9F08|dv|FEhlHME1nt#+I`DBMa4=WvRLB>P zhg`OVcGO<8a8=MHA_Yt|*9}_1HNpqJs4XCEYEQ^gopblZlK+n0J}m!vr{lE*L~C;e@aYqp?iTCeC7@G|t}PuKl9YM&$|a3PtjM5 z*b>p~#~Mk?tK3kb6+WilCPjN%VRR5dBMCX&WJI6#^Q`oi0Q|w4@J$8=*oQ*NDVTOG z4E{}`xaN>8i`R*I>{F`9B_k3=Jy{_C2hX-xlKNVnC_aL?pd1V@5Z82APPgPpfkLsX zYRF6`(ETuAJYVNYXZ(|B29SOHsBoA!=%^GmM!Q8pNws7KNBu^wN!td;+h0+^x+Z zKDDGjJc%alQS*0)b6U5`tsE+(QB8>T8vYl~5vm4EC4FmiJMrUvnO$hmgZUqna$rFy zsIn2O##4D^Ka3a(<9ra{Dt6 z6DuYm?Z#1wLr`w;MBHC%P{z|d6gR_*z4@8zIyj!rgU9c6B+T7HKAQ(sBFfoP2v9h! z*^d2TmX4T`mqVgMQsKonh3qBmx&8;Y#tc%}M2XI}Vo%YyA}N8)_*L-(^8GA_zE}ep z#j?*>6JjGeTwLWqn(wgDM}ESPAAo?}t|&ss8lo60J(Yi7ZBah%kzk8zGk!Viitq~% z5egkS$TUq(O0Se^ai1j+XdrQ~f;Qsu1=TZJDbFrTyECw$_;KCEB*Wc7Oc zmfFyEh4=pKkM<`Kn*P4npDJNe+`>Z>ARH)30+S2ohiMDIKc-TuKTUfGBEK|+5qA23 zJR)C}KT^>HVv$?ktg;BE5f+Uhwii9Nofh_F2@7d}7*&(esNks;=5Ltl?xvW6)VNK; zP(Yp9H+Xca{5TIw1lLy!nqd_7EJl}eQb;$A7?kou$>ThPS|old3ZN3*qbeqyF*2o` z%e$NySquNAo^$==VN$J?RP4DEc4r4pW3E^gv&%j5wb@r9UvL-w;mdf>7Zj59%WU}PgGyV;;O&mneXWrXEct!iqAJvtAxv% z$pFY?>v*KZe&#-+IzL%=@53GS+~+4-A%VSkvVlc)(2^q5$-OOh%mwp}TO1Q)idIVhd|^=1c~ z)Cul#7Dl#dfJB8vE9-BIuvEsWhy{ar90<<%uNlpIr_mj$#ak<4BIpFhuRXV+YxHPL z)YaqHu?bcW(jr@1`+1sP>oI(8{#dpG_xO}d(wB(>g{z5LySW??vHrX`}}In^Kx#~-7uv6KzfC@D&?{fTypK`0eTjrs+-C; zi1?Q~?d@uO6=c}z;RiJkMgDH4GY3$8XnEN%R97KvYinWrDmrd18(R!5oKhsSa+K4E z5hcJPXlAJu_Vbvry1lwLl!Eq$gf!@YEno6PpE*_~S2=qR4@>rr4vFk$p^JK8e}U-- zU7{8gUEm|6m!jxd3ywm|^{ov$Gt9zRh8-LBY>;2c&pXt(m1jL@SOI+o?cf4Q@S+g= zR>3HE_Ek>9Z}c}L64sbq55x%M^I%_7S9ddt{h zNb;M%WE_z;$W}?}e*Wla;t;j)Xfo5fpK+~EW0}K`%8gVO`LLl3MjVVcLjRKPUMB&dl)0&swD^Y`(+I4+P3fC#n%+87an!i3 zzo5iK=x+pt0?1}gW({l<vzQW!F~3C8O^>J?J@H)O)H*Vp=^yQ2dR zi#z%^@>!BFMtS#Ds1-0>iPXi32aNkzzAyOH^PB)%uR-^01n;{PWO){*YhKDlB)ELB z3cMxT`khY9l%e-K{(DcaPvcB>XL+v{I|(ckww2z^a`ksUXI2+JHqLl5_uir9 z21g4%ylr)bJsSr|^bY8T%+_fJRWzHEW-MA9JqQKGq^xpTZl%!RqfqQ@0JOq*@>+ew zwuW&x78|Ziq};J*vKS)igz_0igK&i=ydGvEU<0XADt6;cQ#Pl0VNif1*QH*gh~owU zS>uGC!RlgG^|zfE#x5!y7m&z5~ILrwlf8zf|U^#fU*im^?hk!#lLaqc6 z3#FqZmjWvfBUX}E0oCo3Sqi`|FEWK2`&v|^;$*rN?ygF|7O}KAnIl*KLt!wYaKdbzRtNyMkRc7R|_=vd$(xn zX{CH_py*8|+45fN6eMFl7gW*^yeq2lUjMQ*npjv1w870I9>ss7?$Hr9@c99IwV6f# z9Ta4ywBqb&H<$0+Q;|eqB5P z8)D>k3L|j8L~rC`8v^D79O;wgEiMJAlEXMg0(-r+=PGqq!i+?f!1b?`Ri`C1aIs=< zTpenWxE{kqG~PD?lDLskxVwgXz5F4WL`G3*HU>bSFYx@2j2!Qz<-*p!NL#pLBE4a~-9d~`aTnr{qBoTKf$p@kZbZg0}-c-w5 z-3Q`1An}n)tM&7KAZ|SDoc#mwX@^hO8+kBg4}{eS-JKFdyedKD@D9I45Dc2%ZI`*4 z*@C)Aq$2Ydt|f@ov>`@hizkYRA}Dq-0ME(YepnxA0MSG{9=F(Fix|HH8shqOEb~MR zG6yF}#uFm5^0zW-j+3U?gB^<`S?7vJ;6AVHcz`gPcyx)3INyKu82s{0e?27KIX0>C z(p|%nqgWNYXwo%z5B@xzvr<~|l0eaZwL0B5-dlzwIlEZeEp%xaAj0)EOvA=9L5R|V zkPmO50atLpBJ%tIK+CZetsc(I2;BGh`R<_~NT(05+KXHqR>-@3E|~0#z~U3{#dn6q z_#%1p4A0TW8eGficQ#R>teUX-<*Xs*fQto9RU3Z{58N6m`6AE;xswU;gF9$yt6bpc zGDy)5o%@(wy#o|tx+`qJvqJ#l+6*xFjHJTksPbSQxxc4GSx6SPL6txSa=VC3u4L?+ zSl|tFl9bLW#oU$2#==Ws!B^q34u4m|TAuFdM!sryc@NadCL&J-{QYcyCu_YSEfyt1 zUA+1T_pbu)Ko-tpfLRsfdrb2IAu4GI4iZyI&lk)O1xu^ghY=&mWby;7QW8d+FeS@U z^oHOcf@79q1=40IHZuhGO@KVI!h=*fo5;aOOoYw3P&+t>EX9+Ad^wLHL`Y!dw&_<` z3Mf$?*;!rraRQ&5#-e`jDO&16I5MT4jnJC5I(z%G5HV^g5#eIeQbEavwZFWbm|G|b zUewwuaxE^fN?zMRd}KQrR*29YOo--V90g4cRb?(iK3FAk8rh>BWo_f!n-9jGsMuOR zuX2kStnZ_XZ#;?~VmNIPIEzUNLt)0ODVSUi(X=s#h*@-zU|VTm5v0ECqYOz8MC%)u zS;D>-X)oC7;WReUjd{%M;Om4iOw6R=MlZj!cp*BliF9H0*$b47q7fj_;A( znhLB&MzPaN(Dbezk@4NMi9qy_bKS76jTTG^1j@B|cEGe+Je6_WBi8>|&O8?~ggq=2 z$tRi>Nc}Ij9SJaIycwuuXh&N=qgktg$alrp8pw(L+ZQl$a z=E(oLp7pX2y^s2(c9U}jOVRtN#|i+V4E^$?9PFwZzLXDTE15Fh$bEd=aoAma0?V9( zy`w?u=ySaviFR_l-o2|e&0=Hq;N#J&n&rB6P8CDmXViurB-#a|vma-t73aAJykY@I zz1i!9#QWNqt;`0fxTXNWd%m28P6s=o)t8}zUtW zGBIF?m)WQUi^h}-_9DPsY{h^9RVK!wad**~aN;#n=Lb?xC4~SEMT6BgfH`6-Jix@I zH{Z%y*}mv~(p31w*~052(enY5!(BEu2LL8Buq$edjLRv$Mq`xCfx1(&C7H^)#8wOD zfKbSd2WH!uu|-~2;B;Cn=`xato^M@LUCG&_@v}*jno4C;Yh3CXglahQjN#cW0=H%= zDA_JwDU0E%qC8HKS#1kT`yum!;Dmco6PB7|K?PgFJN2~F>f>V!K$Kw# zjg3JglL+FWEh3~uQT5dQu_8$rHz}&jFzdm-AQjuXyyfM6ZcZocUkngB3IfXTE_zW5 zC1dwF;!mG2Gr-k`IddOS#T(B20!m6tS{;=Z7=)L@N)c9%y0<)LTmR|y(ZvJCkV~zf z|Ar46J#&;eEwC0ZmQwE^rh!YDIX|XtD@(@4U-Gsqx}}5lF}M<39rfwQ96m#+^+U)J z{lJ$XHXz%ySt_oZ-$UMgVaypib}fqgU>L`ZWL|tbcLGeZ!ca#x_|VQmejhv7I6%gN zvVv$PjfT0aw-@H&LfA?$5F;w|woZ8#6HrYaFVUsX4o?rp?|KU!x1=tZbSd-?z*UXu(F@uRaA(c_%crP$(CR{qFeu8(lz$UY;8lM;Gp6g8C4sgDm{Z z16uH!oK_G(>P&ODJUr~sjJQ~z!1;e3@i)?wCcJ-KBRQ}M?Zw9;uO5Hy{pTLK?Z0#c z(+DDajLPgzx+&PDha5trX9D0!?zr2QN*|`S)+N|PL`Y~8DU(bAVG244MG4tfZw&gn zuIpape60WB`gHUUJ3EfxqrMO?%?rfKDU0*W!c=vhiaNuYz05Gh zIm6WqN@Nbs8K`<@KQc5YMwJD29n|5fbG6rqhm8lJ6(_n+#rxh!wPTh*N zR$>sXEXg7e$!?FB&L^oRtUBgCu~b2w`Y76`6U!BerHE>)9Yybf3d@t_M$w8?Hf;`D z)?$$Xi;|PZlB9<+m%9<6%k?eUadA3Nr>yLRg~O85sp>WrSrL;>dShp$RbFODyhmM` zdb+YyuN;wONmmbtsd?@zeo~ zZLhbgY|);Bu)%ep=pJBV`PI5G09iQsb0H(j1hO1aM_84wUw+8supJ#@iY z&b7GT*@Fz49&xPPXAe|8Naa3zaLT5by9cIB%YF86l@OGl??cXveJGPPkW3bfHBc-DgEbHgMv@Igk~K9A zR8#YMHPGwTJK&EEbjPuGz!w|nieeZxP#A(>1A*Z8HPH9<4tTHUHIV0ZT?2I;$2Abg zS=&I?*6L1a?|>ZmPCkdr7dXhUzqd3wAm5w72l=u0LC)^|Oa6@f@Jk@D^2+SL($0pm zDWftxGy`!ME4dFn&kKp<3(jU`R~-%{LC|~7`_8uQehz#xgRvh?@FtM&O(B{4*LMSf zCV6hr<%c_a;c=!_VOx;2}kBv;Q9a(BwE8UGx&|0Qxi1 zDQ(AI&D~RMltuIfxX~zv;CH=_v(;&T;BT$9)>>Qtb)%)x)6(dTYWf5J(&*J6_*054 zrIb=iDW#NJYd^`)&6Y;=vv4H^x?3%~KkzS7iMZ=*g&o#(bts!dv+P3@fp{GVNg?}9 zAoNWkxn2q1tk3=R?0?u^AhguG`}7Y1OB_!#`f5Q96W# zbivm0)qT&<%)eHBz2EM zee)~LTgM+?Z&c*=DviV+%lE{vJmTO6eushF@(TF1wB}Iu$`*=3R-Jyb>h#|@AbSo6 zeFF#Oan8~kw0Y>e19ItIk?UX$N?}AAScwU9^+lMeFi~Ne!rTyM2@Eb9-*sKrb>DSe z*L58T-Q(!+dj|AQ_aVmd(>omz$<_bK-F+J%7}7ov1ZUj^!TXkk?=MK}{=+5kxHWK( z*J@X9t=IEBAU>xV$8j7tvr((zQF%|_dZpP^m!y5I$Nb4&koQU;w1y9cB~jN0zwCMM z*|T)qaqW9Gyk_5iThCf+y)*Kq3ocbSur!%_5PrBsW$tm<$lOEK=&`XyZ40K__kBjl zpBm?n!~8;;HLupgst|tv-*fNZ=eW%iQo(EF3LvCcQo!n_`$)|xUT`i4~`x# z2ZSH)ak!0IprGyuN#B}7IM#-D-^0lq4({>V<+%HtcW>Dp)R5+*39piU>Y}m%lQH*SMM2u2<_Vad_?ful&KDO)ALmKkr+?40)f5;d38?HN5tHPtJ0@_WcTG zKJWW<+*t13D?5_%bRCu!Gun)X^Rv!9`W^Lh?hK046-vwI5KgY&k=*q^C1oRdMv3OQn3;MDoRhK2u~qXdLe+UE?WpdG=-`FQ=q0e+1iw)DNn4< zIpv4}l+KJf012kXO9neiTo9m?1doyrJxWzRP(n(86f_EuQUe=Ov{-@Wh%*Y*8HFjE_Kc!*MnO7Z=sIB_ zbHV_|34<0!ZWR`Us~{tEK<&sO1SJt*ND=`q2_$*JBk76}q?kYwB($J}CJIccKvEJ5 zlriDFKn)cbcp?KxoDhTtc-TM<9Do4@C`KI+&7|=9!UJJek19UU1q4upz)FQAL@*V^ z`2>rV^9c>-6Qw8TlcUoK*XhKI(+L(-Oz}h$NDvWqI_V*Y)5#2{6DdwkCrZvZk!o-v zff2nBg-;lvI)c;!Bp?q(NHZ8AB_%;xqQs1&ttDDas%V0RHRX_xx z1xpK>qK>8nan!^GM@28FDMJeULI@Ac5HcX*i6%}ZQ>PLiP9-{=N^UrnOgWVtol1z# zBxjsSw$3D4oJpuSlT3kCwIu}vQVwSlDrXWXXA+{V(@2Zc$coeG>NJ{y>f-SbgU|*U zEY09FV&cW9h>Flm6&)E?d|rG3b45`XC}`jW7FAhCWHE#mL2Lm921}S7xWJ){DrXE@ zMNzycQu0NS5iw-I*a{;|4Y1hiA_f#=C_zRMW3)V-NUEGjo*+5mI#ULW^E~3^Ji_HX z!UPr(NKidAVaaeFd2)0fIf7LNNemZRSV^2lUI4^t1PczQkt(MVq|*q|NwjqmeUXI} zPMkzXoJ2pIL|0BCDkl+>G-Ra7BFzlaSf!atb0y7`G)>T)K{Ey#8lZUsO%<9bG&!JI zLUVLx>rB=eFK4XINS%2)Q{_xi*BD)AmzS<4x~96Gx~Oy+ozZoMm@~edadigO8Bk{| zopEFaml>xSSD3-Yj3dkl!VD{B#9)RKGiR8oftfI7rZCflnIg|NLZ*w17&2eT zT#=z714YJ(%o3TRGRBmVMHydmcTvU_)ma8q8BS%~pjF0FR~bycjOiLP#uzMe*d+(w z=eOby{QkT5c0@ubMP=ETQe1x&g7S=U7*tv5Ql?EeBS zgYN_UE1E%UO?*3&Ku@oU57v@yc}--(Dc8uYwFFZhlFcF6#~>gz*C4gKj;i?LgFcQh zdVj-;K`(Vwvx1`cA|1!^cleKGkqlzf4$1Y!5t}Du@WUdxhGhyMHfu0>t%}z?+c}+A z#7u~ibSSE@tLLd8sA;Xwm8A)!cB2k2{|Hh+@3f6WDe0JO6=@gkB8q}^lXhiys$4>1 zzUY`72Wr;0m_DUGMv?TL1hFJ%*KO73UB}-|9GQtzqj&sqpy-=8II0J>kX%J_o7uGh zgbKR!7^H&U=~)BSr_ncdnuq#On{1P*Sj!r{L%)R|NV6{a7(!o2>PpqpY$;SWuMW@H zJ#a<3*Hw|WvXB-@zY3is{Yz9u4eIc<`Fpk6uKstOwbk11ti?UNX8px~!jI?>&8K|I zhj1xB@*#Z6r=F0IkeD1XK|;cvZ8nF*Or@w4bpef{E|8*9oRl6tvQj`Hg&wpMz(J9w z&B@}ojjrpy9rVBQ`y$z5)7JMmTqN5do^5arMrgYl+4SD?yl<<8G_BJ<{M%UPgGhsYU73f^-7Wbpk==1Y(Oe?Gp;h>D1EX zG$^K?AGet#=uk=7J`QNBWs6WR=~0|MKxOl0q56R;hc%UwW&Z$`LvQ{AQ*O5%sa_-* z6I7r2^;#*0RB|ob3evt0^=S#XAaCX@#UXSGc(?oXKc`m1yIGvm)#u*YyM-@DKxm%^R7KKf^j@u8qT#z=m7iOyD`a@EXG+VD1$5vc|FrJm` z#a6_@=^d&SHckWS@GQ1)18Lq&T?A63S${^A`+UO6J(3{eG!ShZd+%p0k!(HhyN;Ui zlusb2QlLEDbMLrAf%14*Nl4*2Yk_!{cJH{W-J^%syz9IydJx5Ao|4WdA~Ud*$>J84 zE;4;F1*a&drmW;tbj6HXYps>mO1n@>Emu`*<+>=2|6d_^pW5V?8o>1?o0 z-HSM-JaE>&KgA)*0Y`tcrR8uS$}^gV_Kj|ydPQ>fZaHF>hbzQ4c6 z^G(jF=@_7aWZz$-fw)U~>UTjK*1S6RmwAO@(mAh{!!`zUfAi(Et$mSY_m01?_fD5Z zOpaaWjpD6fu3-yTU1!C6FNIMriFuQ8K8J(8AyOXekuw?_G?2)BWA845nB-B!ZJgWQ z@v?ttUtj$$h^zJ5?>f)3<;?yNb`S}Bn{5ugw>hji0fippH*K;CH4x2RZKT^S&gay? zyfKJ`)qIZ<7($80nr;kw)r7AwEQS0SagdN3gT(O@zpxzg8hsUnzHkfzLl5-6#|bES zw+vEkE=}+}jw?fO3<60zE+H+VMMOniLuio&LLowe2-*4}r0LXwNr$8+t}G~F>mcoi zI5@Ogo8l+_<;JiR%dRXt5mQ`&zQI76VOaK|i$U&O<}&x;kL(^f8_OdOZmaEs*aV(WU>&dj{PAhq}h|B`qVswC)?~j?1vP&!9H~V{;>1`-BmW4IzJo!C){L4E9NWZm^Pw(d%P1H8nLdne3DN z++?LuO$-)`VOZJyLEm7wZ#_zYW)go-)#?7R)=#lMr-cbkFrfq!u6UR*G$b?xMunje zLI5EIsvIHo=ux8JwH_zbvIht^G~G}ogdP-Z*vh93XAf~m68+rudvf~|RUdon7gBxt z*8hY2{vOqbENNMS2`8Y?Lj|FsAuD89n!TliZ0pf`v&A-t?L0!@xDvd^!)wkX1h4sz zV9bNqX0k?UacRn2r65>>WeGfb$E!$&P<_a<$90^Vq|H4x`_L?hFTVc`V)OSkubT3w z9Lo^ARv)Ja;{ZVdUdbcJ#(VAM7fsmJ=W8JP9KN|yzi+j)u0y}NFMxi3v)_8HCEsEb z#GWPpK4?wyK~NTp!C)j=Q}cR_qbPq=rVL(P%Up4Rm+^&L0NJ(mqIICbQ|f2SKxYup^Sa?|abuYQC=nt$opU z&vEs`Z~NJgeDNDU`=ABw2j2f4e2YJvquS5!gZ^Y`dYxbH?iN#P>DS=;6pOzBrZK}Z z{KDo?7R{T%dO;BUzOP>_X5anA_P1`W{ocM6VaUr~`9jTI>7;M41NSz(-#Z?0XultS z9C6L-HIAYfh9LNT_j+E}ah$cax>Fmz+xm{d3xYuIo4`l??|sxUc0c?vHiG4qB{3R} zMx)VaG+Hbci^XEGPx5n%J&{;RRvoUSRUOX!kxiJ*b5GJZ7!G2ykMBEMJbtDB_%voR zn{gc9yg$ZbBas}&Vr7q^wbq(HvJd~)`>11uYNcJCr+^@0z zqs@mtdI{vxY+^KbciIx#8`;>{*x1}Ij$wXHN>4k+yU;X~%wj1B?PHw~T{qz0K5|PXceV$o9uh`P2>A%l-oA=w)v(#2j3lhe?P6_Hk@w&d_Ps9Np1_k_fsUdDd79* zk=y?JX_4D(d_N^}8~%PFZWF-w2XUM2`+vACX8;5!!0UYN8v)thR6zcqZ`7bX?$c9s z{1ec_^9cCf`QU3DzyRML>cBfb2wM;^1n@26*#jJa{|DD_;2XFH1K}U9?Wpx#2ksn% zX$Apzh5+t-!!~E!IS20i08Fz3aOVc#&Ny)A8@MwN?jr_Zn}0CPp$@ize{cwTr+xvj z3RuW%^#_25@DH!mx8WdI2p&Rt>MsBjp*;05rbL()VR{q*>;a}qm@Z*j1yd$Wo4i(^ z15BMTeZmw9(6CI=N;U+2JU8UgWj!%^*!$lb?RNt&TyoCMVjH`_Rs+bDtz> zwEtSIr-#;*?{}k)CvcqHmXu8yQ}vA9Rz6{BI=SbYFX+>%+RCk^#8x&vn9BDLkXuWM zs_em(+kBKke(!nl+I)5OrSs?QCR>)a=4Cykax%et}3 z_sv>1X>C2EsIu0-?+)rJfe-4H&4CO!Ve@@nly@TWayonrQW$7aKfBn&AfPje}*;dGUMuU z8zrJqMB|7C5{)DpN)6PPG-=tKVdd++IorzD8-skzQA1D^`a*u;QNH1k`5omO78QBz zhGX*m{=PEw(&fsEY6|M9$!nL%-{!17TovVNpc~3XyKK%bHe6qbz#NH5;>Ij-T}=7X z5R>oI5JO|jtXTPeNXw#u;X<0Ve6!?1(|s4xBF(#%uh2<$5fvSYNMe$xBrY{jZ)LM1 z!ns>+J2L%5%1GJ7>4@_EJH~x(s%*_>*}Pl%eh7--_q|h7m8GPLREfI0=3~5ex4d>A z%CQHqNV7)1waRVa->+6~3;(_^dF}oPvfMX4kjfIDmUX|Ym_1rnzMl6UNVyFx``xMf z06@ug?pMk8otpCfC#oo`seCU0s`9-6xXSl-WwS=UFJy)^Z_`UVfQhX#6meTt=pw2@nVseE&f zRVwFjvVCfvevYHB{d|v*5lL02^N|TV0fyn9Mz`S=DOb=&|7;l;AeAvB+)314oYy z$I4kbtf@j*kS5KB*MzPhd)(*dIiV{^t~6)4$#8~YFZ=LA*-ZAc*=#nGbsc;&*o$xT z;V8~93|5jIU>dOJI1b8h9ASf(z0(`8mz7qwf)P^ooUEibHu&%@y#Xr|@OA8=JpMkk zAi=*iSZOIw=)b``5R0&tdwq88&I2y*CC`?zzmxW~Esq&z{3P=&S_dq?DaFuy$r{KYH%#>9o>1f z-IbfadH>Ruvl~2fo&L^o4tyL_!*MvrYf@kG{qP5;)|%r7M~%<%L~q3LT89_39p@dn zh2eeu{8+=VG=tbMi)Bf9>WlA<-!_R|(=4 zabr7k%%1`W|-yQ?4)87!RLc;~4~)u;x|!UL4{3TYldc zh9Sp=)};5|QuG>GhP*d?;l4B4y>H`|H;OcG?y02vB>7vGvHS1)Ua#^d0z1HeeUUuk zS169Sh?oG%({&%Fd9APRmD}uW)}Ikw?)TkG&X9ax{i`C>QoLTP=Bsz=e`QVY)cbw+ zemF6(I@2ZLXgnf34G09$<-y3s;fOZ_l1`~822ZL{43H!_qomA{7)!oj5~fLq1(N5* z2?)g#CZJp+lDrqd07R4yiBr7N=HOf5IT51?BHFw;xRc*Ap;LnNaB$%o1WS z@kJA1tgvvRqhd=p1s4vAE6#~0lz^g$C|-aCgcMj{pu-e5bm?S>K_^89+>;rIREi~1 zAfckG3Xx)wVTC8gzkKO(Mb(t0!BZ0!SV~w(SVcA~3NyTBVdRWrj3{al#(kyWOuXr9ROL=I`XDnxe4h)D4hNk^VILSiIF z<`#isj6`~M)mK&d%IT_#C%JlZ#YBln@m0~$7%;NO#gbPPS}^gfCiM!WR}|T^a-zhO zZ-~qV0i|k5vOd7zPf@Is6p>;|ME1#Li3<#w%YAY|%JfAgkzy`Oric`8L1U*_B`d{7 zu`t*q3&lRMPArmbVwu<__Q)!+Nvx4AvPkR^Ys3=OG!;!fQ@iRJ)r@MUa@8`GOf931 zsbthKsu*>v)}V$_!Kh;D7uAcZRnOW*<)VhEVCoiCi<(8vs#sJS)GO+jYDKMr%Ik(J zEo@2Jvcw54D<`}}>B_AnY9amG?8(&jQ%Y@4PL1}PI5=gF*SeN2x^KWz$`kH{?O|9` zT8cwyqIi2p?46pgS6c46yKdGy{UT|}?nS@GjzL{sdn9B53`y&`|2d!Yq)7Heg|yip z(Q%yExj=G#-PXU?T9Sso-@SM5z1M45hJ`9f25_F|d7kH03nQ&J={WAYjw7dZ9QU2) zd7jsCV94vXy=Gdn1W)tXZ93)kmHU0WrFBxISvT^c*Xkq{#TtkE7N*C$UZb}jgF^3f zKBqY`%Xc?dxbGWRl2ymf>Wr+P!|jgG3Ok4U{#zSn=?JSjw<}$BtZkCQ;G{?kQdeej zl@w!wGO5b6fxOpRvXp^xYaM-Ia+F(Z373uBT1QS<$ZbPVkS2Ya*Zd2R+Y2$E`sRIT zmsoPC>_VujWpKDo=@< z#D_#SKeK>_j8SFt-4n;x=XGA!z1L;wJ|sozVf(cS(){dyQ?vKCX0I$E+ibp8lcj9Z zBpN#+`%`bNCP{9qJ||Qivw^(#_c7$Q?!V3=^3glscfGM|kpwUEh2HV+@X(K{<9|Z+ z=~{cT`DSyuV6)JW6{IPafCD4L3eSBqAtuxBF{uhtZY?NX*|b_vwsLDh$;$m;ZY?M> z$g$j7P^vP0(MJtEg9{Y7*{U;!6Q>hfPz7kwU2At&qTC(2*xfb8INhdm%hL{Fa2;)7 z3PUSOmnd?dS5aC~u5xQdnbL|9ME-JXMS030P_j@;AO#Ivi!3BtxN@Ic&fMQ+vBgX7 zbBooMByyMg+%lEvi$S!ah=~GbjL=6FN}FoI@FkyDQC;f>OkC>JUs7JZ!j!75Rtp9r zmb2UjUvM4Q)qLr^&Lgk9>s_s+BPeaHq#?ADo?cEoX-Tna>eRJha5^J}Q?KU}Q0JK^ zs@V99Rqg7};-kI^YI%YHWQqVM6S9D`xv8cgk?DsuEFihuR8yu1palagEh)O>oBqBP zWog=7nn7xq%XjJTNvp#SGw<8SB94Ba$LuL=)Et% z;$-_~t#7m>>5apdx>unEr77R!)`D_G>6J@T8k&}Lkl|SbR_=4EixOZAko}{zMtQmn zb^v}KQXWMz1wWi5WcXFb_uYrs$5)b-e&6SfL13kx3qff4z6(HVnlu^w8oe>2JpMkT zIG;m#+$(9l!$I%(n;T?*lVMja;z{Hk%a6UU~g3U9j2w$^KJ)Uggh^=Xjp`kRDT}N0dgnj{j6uCa-9@ zi}|@r3gtC_bBk<>g|}r0CxR=VLWnWNAkFS_0t!``G9kThXTeC2{c&if02!{h$X+{v z1tX*rTU}hC2}yHT{btWEBs-Zz=<0-XhzE`k7Mat1*x|2P(X8F;X04X%+Xr+PQrWEK zvnQs7YH@KT)Kv(Jr0+$}7$Gc#XdrY&*OJ<7FO5M63@HSLH0hO8l+={9SO=y|w8_4; zM@2(~{1{T9#|b7_Yon)@gF_>SsF*9EErh}dZBazlbsMd;mZt5Xg)QWN4(G}hl8`>? z)Av!oN2uj3QYn$pb<}qpWOrOq$2f{&7=qyU-RpT>$8pxy>b*nXd#5R_=^gqtz4PiF z`X=bIh^2nT5=UcLNs-iDp9S0-aix+6-0a)#66dMr?k5vO<5n0>V@Qp`#8endWG#Ue z##3lR3}k2j8cKzv8Au2o(1A^hFK{5R0|NIbK%izNQs9$C)F5!B43QZIA!huwLj_?1R#>CWo+VtyQeG#%SLNt1WFu z+OM(fW%rJ?w5*m|YAq%5T22L{K6Q6@n!DFg0=1-6TlDqCYfS>p+R^kRBJx@j5mhNc zwH!}M^6J&ASFc_x4y2^|rXS@#N~*QKwY73tBO&FYwA;PQrY#7m*jD83tK2_?xUF;N z&Rjz7bCZ^s+{fO0nhHva%BOGCi%;Kt?9Jy*z+vO&zICOP(kex0qoWzn=)bv4C%&?{_G-G2jEEMW_@kn5%Qt zF*G9r00000GZp{st*(Z4|j|}Y(^u=0&$+kC<+1@WPm}&5MTg+ z2++)6W&p}z{}(Ggb|s@o7m;79a+Cv|J0xk{E{Zw&oT=u=-+9vEDgzz-ymE4OQf(^U zv_K!X15?MYe7Sm7bo7cB4c0}?HppridOL{$Sm(HxXS~^`qR$BLRmpw@+Di&OrGW5oa z3`;Y3;)RDv80#5Dxc>kPNvzr zyJ$^@-#ec3JIpgQMet7TH{p#%(BfL~Kc(FvmW9L0jKEXzn|5WVFrl1LyqOGz#ezr-PyjsQu^y%3HdnJGLG zh}P#lG8SzsqqOzuwx*-K8V<0FnAH4mOWmptdz@@(W)h;(v?!FBTo^dhXV`K~EoWkC zK%LV;@P;j#3j5L^nD!714Ji6Wu4TuGB!6%-qUz^hq0AQGNuoK6qR#ml@LLcGV0L*D zz*x9}P6$p|%c6|3Nj8>>sdD7tp?;cFH%RJ9DzX=)@P;GYYG_M<%>L4!a4)iS-oj`26ayO;{_zFPH_*QjM~3!ZWoS*s3~hVw^1t20 z4^qn8^~s%BG7F7hH4NoV1BAQUUn#&3``>+DjE+teMH6@@_&Ef71#h{R}dv1vQ8c^!^t&UV5Cxngr- z*kmNo#3}ZhjFXXTnqT*8c|(&$-K8VDtN+q_#=leX2f8oca?8AHWREY~ez2%$g=J(` z*k&MvG{G=C*@~q@25L`bA3JO_JUn5imQQ*RGs?kfybtJTX55?ZCNw70tRl9)x9ecI z)@^Ys>yY-XZQJoB>v|?j2@)Yz<;sr03~FJk&T{c1or!)bWQYOUJGo*3iD`i6 z9_J@t*0-jy&GNh(XB1{=O>SjvdWP1w710rz7P(oZE5qdq^RW9f>mgQggL0V1*Oyw= zl9}TSe~%m29T~cMZw4kDARSQldC6>}D1u^W?s3))Z_5F-cT(n}21+n)9?L$~{$0(c zk}h;OH(u2z3y28vmWI1z+nPsXRbtwz=PF4+-ZG$qw?nX4{Xn<%=ob8fkm3fayr=g6 ztA^wIu}PF)%M<7@_Po4~eB|X!mGGWgy&q_h`a$;B-k6@`&}f6$FDK{%0HJ%N;L{>S z)=uP199PAAd1V5Z8wKEEx41$3hK{Z+SsFP&Ww+MYtx8a{DT``Nw_06o)qszZ6;lcd zAVR;$7TZgxd}c=lu?zq+K+M0CiL&b$`5@zJ#Kg+9k84Us)@xmvor^j>m^93Ps5FH>mm>RR&PjfYObRG%O4W6`6_;9xz zBZ)zi<%?n$1P7C9)XXmy&D%|^86D)H7fI@z1@^5RxR&{dQfc3eQ#Q*`v|sX50~;Ye zT%2o;oLq-0r^~KH@Mm=_Zn5y7YMPuG{V>v1GBR(auK7GJ?0FX$Cmo(hx zEr41z0DPrI7;5POu+uW|Fx++96<28mszTkGyc4kRRXKpkZcYyc)DZ;fD=p^%;sYG} zJ>1|Y7D}1l8p`}t_2&rf`a;I;#0{LmW|}8_=F>fhwTnH|?nopQYNER<8hOk|Y9RwX zGwTuqtSWg9$9ac2Y(`(y!UlOJkX;{+z>D7`DwY%v9%uNYArHm)A7M| zT?eT-u-pHWL9wG&F;He&+wK~YJ|Bv+yzJ^6fo0Mb@^SfS@}ph;OnVD-q#(8Zk|BHy zZZx^P^ET{~u3o1s#t4F^oyJCTC$4vH=p-)|v#6tF7D(Dd3IU(uw5kfGvWPp8+nJWC z>3+lMQ2+ryOyA|3+*Ep;ajTvcb3n+aD3eo!~teFFwlOxFpIsoMSkm{#CkDSW^ zP>fMO-%c;i9O(o*JT`b%(3t#C@c?8eJ*3k$f(GJN=%&^Q@Zl%)7eRZxS^B`V)~=})+&bF1 zy2Uy#tl%EZ()~7n$Tx_qo+4GaIP#4leQizzMNrWFcg3i7&df~)$`kGwV6H{UgavrT z&4_R%E3V~=0{B>N2FuFDqU}N=+St+W$`iz#D42~UlEt@)VKYr8EOlk3u|Z0}E4*^j zQhRE^@x=O3koU-|`>xe7xxnTT#?o=779XTI;aB4&twkbcAb!-i-RgUiK=S z{22eqbRw1?ZP557bi1|%lXt{IUY3S0>iEu0CwWJ5wdzZ5NJIpKOv63OnOH!aiY1Z} zMoU%1glekqk)hW^j)zH^@2|hAIRDifg_pWiN#mOjhaIyT!#5Fb)K1LP1%vrmX?X?Zf=Ix*acRHEbM^imtYC=X zkU9BAy(dm4vAKZ1KYt^LuX(Q1M^Y>f&`uaNN)A6Ng~86Fr)ZUja(!aFx9rcKnY|t| z8|xEL`sEnfU$ouuGZLlZT!wJIiX9X|)+01kgwvFT4-Gjw8yM&sp2Xm&2!VQtcFza@ z&&gUZ=v=R0j4wxefoDrB$EfQfHmm1-Er|O z5l0fvlF+mLW4kf|TS-k&@yS4}pzNDaI?cQk3o=o&SPemUk5L+|+cJ=j8q&(9pP(c? zHk*|0W^9@kmgp!-=cB)7gH%d!s{%xpq@0&e$(pBIR6C@nd$>`pi zCsWX|y?TiT%B~DY2#L?rH2uU6>ysJv9fOepi)~!HHdJj@q0XJb0#Bwt>Tzl}gW0H0 z7)yL^8VdY`j3Zvf(0MloiMcIp?OFUS-#bsiidKY%7qP_7ls&VqrQMm(TnFEM zofzB#^lyx@*$cC(&$r>TU5+t`oxC`5Pw!(9AAi z6Qw0qf?{?$A<8Meo29W$NQp<5jQ`^rG$L3nwEesx;FmlZNL@N0Ujq4gru1_$QZ<8E zn>Rb-yaV1Q=0dr&G}T*Jm5$68OgbHN=@d|a+!7Mvu$*_n51vv)Z;RLn0LQs?r{(Cf z{*`VLTvf{QAHSJk@03u^?!!Eo?Ia0P2x!Xpnt(oYV1bq4;HJ358Z+u6S347x%rc0P zmxW9pgo15tW7+%?7oGcP;_I$Dbkds{9rZ$fG>xEt@N~w{E=Rl;he4{D-;^G@K<*(o z2RMW~&B7CSUi`Z8N=oQDW-bdOAiIoy2VMDA%m1KFUfH~p|L5=8Xg$;`>1XlSKMp(u7t z1>vWPOQ8;&@T%P4&Z!62u}VkL8DAMC|&bf^9cUJ_QCn>P*Ds|++IZ3|z6#XxaiPO{_c zjR2MjbA>*q&;jW4K+7HRy10Ajboz|?`rY7kyBtGTL;*f|K)2V`H`E)vktY@o?{+LVzfW=2={H9()X}h>tO%0#eLb<|>q^)Tw27I)f27 zu^?0^bt_C$x2ytB1;}Upv@4pkqH2Z(XZ>mU9u~?QR9q{rjF7#<7?kU$m6uH(INR2X!qoZ$(UbAInSl~8A?3jC)@7%1{uG! z&k21=*bP>94p*Rd#;j5bX_%W zx(YNgpSf$ECYwsvP!@dB!?!z(G_0UDQq9)b%eZc)eBj?^m^b~4_(p9~S{F1}<$;*2 zk~s!^u1w;aJr)C@i^_R%dEk6d7Adhvo_s7>)UKMpDb3Zm$Rb5JMHYOAWBlt`YBtP7 zkb_`kZk7zCC`E^;8#jzO?HEo7SrLRwj0m1!3y<+JwpR`8cP)?#1A?*HxXc2z>;1`$ zO^!h8zdW2!l;lDUVQR~PKHLBY=pdJ`J#=`gGt$aRYQWLO>5S%i>O);X zP6)utLUL>viJjBkhap|Xt#8NJl3!1(?2feh`SL&6ZQ?%bfHw_q~DtBK=aX zkKo7k0HE;Ch{AK!)gg|Zd0~Tcs)U~6rupS_D*wTE90O2S0@W2jOedGAMxf!CAW^2 zjat_%;?n(x2cG$^9ySEJ2Vk^1*l2BDUCpjY+pgqq28CbcapAWzAS02KloI6y7odeaj)lv3Z$VakEZ;BrDJ^0TQ;QK51pylqP@ zFn&#&6l|yo3l4ICqcvsOcq2}o*bDKKUjAXfPns?pB zbD>7<#79HNgf;b$TLZv2DDHx>vaJXuXZYPIRdz}7;<_E!OH+imfYca zbM1*6AMi}%pSQ?UDxf0jpUrK7Zu2s;&hzm^tY$ZEsOrVl5lN*2Ld=2g_zf9E@7kV3 z2+l^{YBx!rM`5l+PN_qRh4OXmUj%OeL3|?6dX7*;>0RenuF*^RHfV7Q6Ly~f>P5s1 zx|Zux6*gpxqGo2>j>FATJNR@087$B`xQGSiz_d63af}XbN)_0gr4H>2>Y@m$a!==Y z6#{qG+^KBo-iKKbvNACa$sX3sQ~&uN4m5JZTi2h1@=u~e(SFY1BlvO3L;M%kB2YoCg#FNCD>LX(x8>88bOytvZCuptjG4Mx|6!3;RErzTte6 zqYWJsm1Aqkn?iaFr7fomPnH7|8~?986uz4EH6flK0@2~}G@jIFs_d-kDtk*CSnNqu zY+BNzn;yy_z*!qeQDt1{oR&Uow7T*1{D3khX5Rx?w89XJb;(qx<;%mpy;J0PSP}SrOAg|_!bgewJ&(|Q`N`*{ zmUepukpr`0nwYgIiiaj>hV|F71CrX>^?g{CpHFtuNwl{j>PU$1l{DzxE~|S)>Y=ou+{&DC$Ucvc`xtPD2j+`!tGjCRD{ST&;JUYU$3Jw4b}tm z{;~EiOtKdLXOE1Zo{x#aMOf#H5d5ni7dwI>Gq^4F`D?s5w;W=%dbG#9`jrI^2Ip)y zwYWcY=wB8PvE?y#vzVzw=^5G!Cxz?+^~F3|A?qJs7(q0rBS6=3-{ZoMTf32Mb1I^N z$n$_jO>{st>aGx>LqLsb|CxrJ>31bQOm>fbp7AHUew0tzwrkRFpb~#kNjj!o-P5X* zwqkE9?nA56WcnW*K`Ccy2GeZ3gWd%K2~C;e61C%51|T5tGyc6ETOef2IfC{i^#C(N z!1UDqR8>e=;0dEA2^DNtpb(%gtOud8uV>}ivC4DAcqP+ZZo@s z13Y^`b6GpAwlMTStLWZDeWwm+V$*e3>K|nbwV?CA> z7V+kT3QE9}iTqY%($x}%7mL9#VP@;oIu_&`wTSE<0z=ul8&M-8%y2Mxj29tARwvsn zUsv?8GHkeAiyQrG3uCj_X)Tc=J-eEkP}x%F1{85*Oum$kpmi*LBpJ-;US0iW^8i8ht}*A)5^; zRq|~~H0g@aJ;V<`hiVOP7g~mrVJdlN!VRkc_|5|@c~9prQYTZwr@jnpSv_NQh~pxF zP94D*@~)pLtUY=@4TPO-kGrN$Yga{l8i&si94hT~O{PVg?bl@F3RYZGGBDI~471kI zSZ?^v?#7pSW~Ca-n<#0edNu>;ZDH*MkktV-!D`G{o*Feg*k$uz4(z15ncHG3b}iLD zBW32DXW=$~Os_2Zkd-h39jj2QycKPUei2!qH3XYa8GUkdg8I`=AIcbV0 zlZP?dOs>X?=r&}SscYpj29~$%EnC{5ro?WJynBgd#*Glfw>BTcd8iDdj@qKdgvtqW zvUOS5R(?%+(7l5X+J$sJDv5$ZkLY%6scrH$Wi4L~4nLuLx0cS~W5J1B461rcmpnKa zt7A2*JMui-J3i?EONt;h`NhA_R=bO)Y=b4=nJO+zQt?m0Q?RUn@)WGqw;N;X{&>jy2 z?h%*#M$a0_kq1u&YJk^(-nxn_@=HaN8jd&;#0#~@?+`l`DiQFOG#!fS|PT62y)XOms9{k1h` zRX^30ph;z)KB@FxODl9cASmylp*6j@KM5P1M)EGF&jsZk$ev1-DOc)Q?Y2_Z9&$g0 z8nN3*`B@7%MQ@oogckZ-lDdlfn==r7`BI{B14TI84ynSzA!J28Rg|4mN&(qrT#nY? z-5ywB9Wdi7WAI~qd55i&Eq#-f?@i_oc!Ao@l#dH(mDqV&EcheV2oODK=&qInjRdFe zFZC%Q#-_KifhhnqCILnXh;NAV6oq#d-sa)YDbc%ilKs4W?mY~{G|P?10tMZl@12d zEYxnHTI-NZ-%Y?F`y}u#iu}mBH&XZ4sN*2_Df@&AAPOaD%I1#q|J(fE_mF#B+ZLYR zKCo=`;54#q^_fiz^Xm7cd|}mOhE!Xz4?|?#`3PBEh|s1}f}HIn?qo#%rlM;u7_vW>zOE*BC4vRyg}5*WK9rdD{A2s%!JSS$l0@a&Z{r&ph?Vo3d?;y%EDcb z^(DP=syRVt<(p+g^PS9+nAT!A9ZclJDux)8QYgIhl{b;DCx}7yj0DTaHmxFel`DGW zkv76VmdFvXQGF0U4qWZ|w;~aqXG!8puU3mt@jFWv&xadX4`lg_OiE3@N!yr%N#X}@ zVP4hGoAM;oT#d`p40cBkTvR2`W5UHWm~tI!Q?X90fPWghUoq=AvsuQcbR=V{vPgVF z!F0AZAp)H+W`tVIx>u1JVoKC4@;Sg1sb5@{XQPk<3I0I=bP>taNT}uD;`r|&W78YO zU=-&<`#vx!yJg+Itj|nYG4A*S4I|E4tYA92^9Oi;YF9$ekg-s z%BZ4RYixKh8?P)?s~wyjyX)v}vc))|%2CSnt-~^*RoFpzx{qI90;VF$WTmdICwR%L zm?85|j7aCCoQCvNDfhbNj-m=_l-zonYO-C*KQ9YsloiqJQ;r%pD6}$qxtGK?(Qp{rHTQbG{qJUq(4{>pW597=;AX6&|ntVLGk?3MoM zPfr0sv?}!PcZ;m$QePCgq3~B*r5r3-s7T^03p;z%_hUlD>8)d83M?X|wGe(O)pTA+ zyaAe_O>wyMBDL=`-oRkP{<|&Vv>*~60Q0GFAo5_dgbW*aXzz`$D2iMNZ0=o{2wWVw z@HXiGb?k}y{n&%#0(t$nSltK3^Mh5FRme3KsWS8gkUDBf3_66iw_rh&zzu4Zb-ANX zO+y6SVSNY~Oe)UT8fn)@h7icR<5p7wEB}6~_-bVD%NKP<*qCWMGj6vlB7x?Qne$==7&{Ss|T?OH0d{a7j8gR?uU1>`Yl99IXcKQ^K?jP-)=4iFfFswq+rQE$lQW#Am&_<(5XNXXUgYxp*xV1-GqIzhXcp6G!SKrTUqmPwW4D>7m zlR#d!0eGBL#~2-Pa))FxV}fCpg8vGZ8zX^Cc|1=itEx$mjhAsGewR{4igpljhcNQ} zNV$vo;pwQZrp$_`Ong0Ub?lNpafc!RCPUku0I!_LS3{EW+`mvPBreR#7O_!a7>V@n zkV)VeAdSsv!7<0j0}iYp_5c=>2hq>IIA)-h8{{PhMFbj+R9Oe8C1uPrPya57+pDZQ zgy5Zcbm*`$=^?jM3;n@SSiRn^vZ?Lwun|G&WNlo;2Phrz6~@`TunA-tJWFc>Y8^P% zZX49hDFk~-RaOYJ#$q~w3zZzX7vS>YJOz8dxb}O00X~-@3`ScI8uwmRXNb$kq+Lo% zx1@+K7y|#{L8;|R7-Dq}ZRLrFO#oU%KGfBb0N=ixYUy$6#ZR$^SUHmBUR|{dIjMI( z!U*dHpO^&&sG$VIKaRWw;iQ9HQ12kB#_jA|WUi|@ypmqJdjNY~f(6;k?zIn_WDg^O zenF2al++FI+5aGcD7;dmD}wO+vH>2PrJ4X@AN9dXpNXGXr|1n}%hK= zTNBeCcWmFADufO0Y8C1WUZe5UUwc-oK7dhUe5-f#HeaQ%L_iv7mj^YXxO8?x)WpB6 zlYj2J8tr5BHX#gWIOi#kH=E_72BR;OXf;lAj8?&3FOX5)EO7gtfayH`pRqiI08GV+ zyJm4faG;772Bcw-t)5a96u?t%ohk=05f>PLWr|1x2o?79>5%zq=6SmmjyS2qX`xVSdr~6CP*6g*Emf+S{f3 z_xdDP8V=5gdVD=9nC8ZtC3Z|YK757}Uzyf_rYwcaH`JwFEu2|mprhszPR#Q!NLxKK zPHV{Q3*fG&hS3T9MCdRcgF;$GAnVK7o3uK#fyULYgrQn77x%`@5YJIGLFhMpr=LCD z6XNlb>+aM!{Uu`4`%Juh%y6o4?@q0gB|LduM)}}-Y|--xd40T2bcvnLGtn9NUDW$9 z6|!K51^j~oZgw^@>2djb1Urc|=6#kut$iY>AjV8;rw#wukQ=4}E(OqEs{$s204H$= z47WpxizBTXGp+30Aj?By^{wuP1OyXu@4e-LaB$uc2jo?h4??u05|^{GSodpsFc8aR z-1r9&HNJ)*#|B)sJz2|+f zk$P-~3cT}+c}l|(Z^W0>eS}nNuUE7`FI>sFxU9G^{$)S3)WSQ*CY(eJ_PfLNJE_+m zX>~HkJxUWGNwWeh3<;P$emf#9UHMO{`P7zrs0rL~iE%;R{#UlWMsb*K$3{{^hQuIy zN)R`jk&vSnIpxI`phz(f--Vk6`D#2iaS2%g`oX@WV;xWuqavQj>E$@Mvhal~KX5Lx zD!p;*mO3{Ql`WNY(gC?lK zM9&~L2=E6OZ}E+r-?IB2!+TN)BDDJ)_a=k1?bY{zdx zbMZxb%6vrGg;Y)^KdI%mpIA65pO_*BuYji;xm5MT@0)w_H zxO!;Na5{1&J5fPnK`TB$S$bG%eipZVJuz`^B}!R&=M%fl2H|wX;Z3zY0jikULb1uz{$cShSC&nZ!M`6+V%-gB*h$2?A^Dx z6&?4`e4AZ_Al2kj2o6fDKhK&3lqG)yu{PjWa6AR@_EE<4Yb`zD>A*)_)zU`TgjY#j zUQ3Fa=<<>~q1M;&AuY%@vn10$#f#6HNDCW?!wHJ@9MP$9FyyL%z3rL$-(``VBP)ZB zyz%1Y@U3OlW;`P>iA3E>CH74#M9Ni#mA}G0f5)FXwC9paVzP=J<50JtCu(jMyAp2XOx_Pa+EpImZtXny+)($~1M!$q zN;H1JMq7olXd>A}sVfUDGtdhQNsK{Mdi>mn+kxZY^VDhBw?LgF7tU(a?otqZ z%g^1L_B$_X9NDeogNFSV=s|L!S#8#xcAy4{Ook+#BSN4^5-s7s-5o&#pN3&As0a0_ z!NoTq`_limEj16{(;z^Hfo75xMrNWz!URgUMr?Ti+~Xdw)L%Bsn8%QHZ z>H~0x(32d|k)Hmx4F%ZUs#O93?rvr_JpyxTSb-g3J0*pF=8@LE8iIgzkps#i8kO~) zipPR2*qp4+qj69eQ$EteBke+DpMLGN-*#)3zD;}p($1{Ph&@6>NpAOM+-Ono>kd|p zk-c<;?gEIieR^DwM)QJFShSE08;4o8-?bxmBE+QU)jsJ10u* z!P;|}!r`V-`i9`v7KHUc@1POc>m2C%ZfyB?uk_vu%+_mE$K7=oiRQxF-2tu#$6H?2{;v2zhc^%RZzXk|abop|Y3>s47*mvqaH| zLge=_4_B>ZI@AMC`?7&orw92ku|rQgLC*MLvc(P|I`;(x&$3t&3Kgq`c#&A8s5(p) zD8-m+CApEr#C{GfGicwd_H(>oGa;J^D96_$#YEP_k`qo3k6?Sh&aSMD5=T9?hv0t*3S(HDUkH(E< zSf5}vPd?4g!njN(&qfkAKBvy93isrzH?_;cEs?vq%)}GAx8HIAENS z@M8~Q8HI)?98HyLbWgl%rCF=ggAccW^Q#C zed7v{9+T)-(*QNKbt1Nf_=rFZNVP`_6%5~S^h4DIvj>8}od^aSFsLE4PFzGt3`)N= zY6GokrHb*)b2`>RjeZbDm=6jXTW6JPCE-OL*u%`AtYT(xY+BY;(E9|wX)?xD7X8J` z^4;a?ZoyA$c*-W`X&@&yCrqw2nyU}uT347FxES|9nw|T-o|Ythw}ypAocu1$_xLlU zR4{)Ug1z3lrpzNAk?>T->gPG_I_j`C@IB~q4Skwb&TOqD1XD;8yICgXs~ZqzM&Zt_ z_kwkxlv#=JthLDng)5~6-z_HnFGdG{BWO(2wsJ*n0~;BU<6`(^_^{Zs4*=95J8u3a z1Ym@KkSgV+Q@F%u89`Ox>L6`W=vq1~67o6W$aV%QQ57kMwRm17+hsKDMwqr*7LuBb z_ZYvM*h1v#6u8XQ4aa>TLv2&zFCLcFX|fl-lt-QdYjz%rbBIot7J3$}1-6|H4-nwb zM&nPE!&TnPR$KEZl*x@B`DtR~g?#d=NhH$g82-_*YB3HS*81P#(Cl4O1Ie(_Y@+8j zMR;d|xR%?mnhI6(cHGadM~0@$;kq3Qr3=Xs0H;0H6|_++QnGRl{ceJj(r|LIl0UF1 zh_yoZc#Ly^GShwYRz^932#PDu-rQg;0&1nE)Yb=wk?)GtfNM}V?u||zDPwATWBP?0 z5hhOIAQ-4A7Si0r_qELPq?G)>T19ps94z?8iq7o=5wG*cu_3_6loa+;KMJiVZB=_* zq~;&vL>%bQwbNmcQSHM~&rIqCs zq92WUY2R8#kHLIGqf-Ttf#Pc?aqQ$o!sphy^14%vJv`+-p8A}%KR3SB?Sg1)u!5qV zNu`t#T%!^xP*$?1$Cq-E8og?S$SZV(^CUUk5FPU_W?oh?4@7PGQJHlR^~ZH<;CV!K zEXL`rHTFdttlX8WSd?ES!^9{IkXS0~u;`)s=!nAV;J6x0f{0y?Ue5BB3W=6iazN&V z>&E2+jojS9*Ex8~x$l(XAjdXR6F39&y-U@Vu67s8T@#`jTM`C$DUU9o7jh2)42J8} zl-6-=hO=FW1c6r$qJMZd*f>1GooWEihFiaW0M66=D?nZCM#p5VjP0-81HjK9JFApG zMJwRx&apC9Teh5(3AfO{#;Qm!;N(WI?NjzNN>J@lLa(%B5S{pD!x^5d^#arFBrR%$ z*b+t`J$6f?iIj3OjC#bjp?czIc=6Kr<~acV7 zw7Xo=O@#L35G5{$iF;y|{;MGFdx(Z@8+LLC-WK2q^OF47_&T89KYfzhV^iXnECZmL zwl0YE5xg@jj6K;5LKU!)bTXe_OjX{Zm*Kj<^#JtioHH{zwS_CZypf)q#;6nWo{8(Yni8vJLjY?M|5MAaq~PA-MQl> zAcx~5MUxpGv@h4?_27^B)JYz0DSsLt;$3(|to6Zy$Apz)eDr&ed366iAPCAM)8I&H z5L|@d^Qq8hBbq&)oi+eH2GDP7kZGsi^_+o}3#^&zta5}lZW*QF zItG4HIXE8OD=e3v#_`o|i*9xzF1g@06Csw_1?hQNtt#NPGVGPlm0G0##0s6y&RCLJ zAcpVpzx@%l-V5x(S7~z}uj-IMugz5G5~9#6b-`fgR%BG?FQ(A9ZP%ZPZAwutIBk^cc~%^QXX4>ax*VxUZB9qmb4DBN@XvFeVD5 zz!cKnLd3OEOMAQ*?d%gyC zp#OFW63QQW!ktvZ6V3Lu%H9?tF|f=&Eiw$fGibS3CHYIWpNS4=jxTa41o(d9%B2(@ z@D28cI`r15D>`n(R~=Hz86_Vb(J|6?MGT6guC=j(2F?f;6MV2r(?!iJ;@_d8wDIIi_`A z)yQ(Pd(wB=PV<#7Gl6s!uoGdSbcHe3ZYS?h%fDklJ~Qe--xIzv(}QEX6&Po4-*QT@ zn%+N0Zi!@~P;e%v4qc`%+q%)~R^sJU(SsVkIcA6iB5X@|RopNFR zs0=IZKo*mXB_%zO6RBjiG+G9WBITP9N|X&4EHaDAkF6DW*msfWk`llLN*T7!h7;|D1^I(=rXDVqXLn5qCW$A&? zH=>RnhZOPp*q}pc9&k~7KmpX1A~xuaRsPa90ilJ-z*p{0&3iuBjYjva4vn?ZE&(fh zkQOVQs6e=yW(ZTq+QAJ9D2jN`6mikq{*L*Lp<>>OAW6fnsy+)(Ms_mA5}hM92b9-% zb4wNML@9MLPbXdq+pIS%(AG=z%fau^zlIUy8>HT~pK2_i94?yRoi;`6D`}dxr>nG< zI;}k6+5LEbF~l%7Ps;u+JhD8(Jh65KQADtZp&jd(rO*`_#Y>CFlwtDq#FY@@Q=&vH z#VwUGa zQgv&JPe;0y3JZjHs39#i-MrDv#HDf3@H`u2FJI!`kVWV$a)htMWIzG)@d;1XdO#%=Vv*!iRlV7W zxONh`Iy)+S49|0SpVN|2zT{@FKBs&8Tk;tn;3a_q*@AFWT7a&1M>(*7$m|X1cqwJf z?fY&KZ%xmcp3*C#09ML*L?d)d>cBv_)ep7iDGkn!vd_S}1BxlsOF!Y0o}1j(y;CTM z4biDNT$x}QkJCNeLX6oD{(2GK5MwBqs&fyq+QK;nR1YyyQHU|P0@r9?Eqh%PcnR=? zK<-*CIAOtWnRW;AntwO&n@U?#3fjt+5(cLi*m|gJXwD<4{>bFM0wu zhtczku)?~ZWUDZ~%-v?IkP6hviU{QeRt-x*m-d!08P8J^2r^*~=!i_N3YdbAwjLtT zn04v-Awee6*9Tb662KWIj?PZ}g-k@6l@&0B_(=|hrQF4l7Hy;CT%X)4oOFx|??MQ9dI!OkawF&bdU30!N!IjpV%C;d}y zbw+B~0QC@zvyg*fu?2&*}j|oa3XatZlbvggT>dXtWKv0d8Lq(_jYs7h+I5I zJ%M=wCrEpTZQH}uc-Fnc5|~X;Qcg!+$Y!K8A#g(8bibjgT&YLBt|Q5HoMu3C$du&} zXXL(EgF`&=2rsaAsvOni>n~3$Bm^)&xxbK+7v^7y3I?nqLi+@J6l;VwA@%O9;c}m; z|Hj_Cw;X>g!FTaIb(vc6)_CD6)4dj2tucFsqS0~OCEiCdmQB-Zz3gUugnn|a3DRdK zZ$qSA8DW;(x0k>O024rCE&)_*R{2!mEf6)0B{cqv0l_;^N5NN9QuNWtKeA&WZhl%7 zz-C_B0{!bq?xbcuphRe6F&cp24x-hKO#{^k#zYMr8eU>as6@>I{V3A0@{Hq|D5C&#hYnOTt^vxtd7EchUr3*7aK_DeKp7#ISA+>}quj@Rgn z7Q@A0%9acv+)U(l2D+1kskH>CM2Fj|H;WyPq?@MTD;F!*_Lq*grX`>Uc&S|&?FjfS zd!MZc{kuTf;!GD6GpWGT#QhiN2QBhQp%ihUeAK4qA=p9K(^Bd0Qt32pdIqPY%!7-1i3d`L*xGrrn`(@ujBmB_AjIN!89-=WM33Rv66NZ_+2n>udf$3D48zDcTY-}-Iv(&b<`lL{y19Tx=hmf{ z@g3Tpck7E5DXTqWN0?T0lZ~kXVnc2Cp%Tl-{HSyxrWey-U%RGfxiI6*sTPkWMtWr+ zL*xsk9R)_lqAN;4XvG&pWq1Grf3Bd;hv3!fXz3H{k#h`0JkB)rb&+Lg4PWX7rxX!t?<- zFTCQ3(Ds2qjF1RuEtz5UTmdB=RDd06oU3&-g-LmzSNE%g2(Y;=Kt&@rLB(^fT{%p4 zvRdtP|LKdqR0iIF^~R`-aWJe^k6ZyTbEp()n{Iz;`qEK|5)1ZIJ+_>{dK+;A_^LD3;MJ@CrLQxP#=myik} zGaDztrx6G`tEvJ#71VAqNZ7|Y?LV63e#}YE(~sjs+_iQTHa)!=uj*^6Pk%7^j@*AR z)fg%ic>{h;h1Gs^q^}0$R~PU_s$$j>kyO@j;>nu5;jOj&?YAJq zz$ZAOQq~`l=s)rS2XX(2v+s7uk{4OL;y!f}m%gkWJ+|+oP)uIuMbQ zg0j~Jx@D}JuH`rn7HoGVs%c>=(I!L)%mY>-dS7#h>#Q+Cut>_nN!c;MBRlHVWr!)C zb}m}9N6V0*DiNxS>ELXH0~9(B)|mi@KzP5u8vAJgJT4=sU3`L80N9ovu6+KFglre- zm=$1$h40hyfj{@Rn9-GSLbw*+9yl(Mm(+IN7q2ii-VEl11Nu<9p<{Iti8X#d?LcHz zGEfce!7w-@$u9xW)X73BP~yabDCJMI!6!0tpDqt8jQWmF`)Cj9x>Qp5PR&$-E8=iJ zUb-6ZQ{40>xsl=+D!9T6oIg?}v_notbPrP#>!oOPBQ4;;aYRZ8VF|!mr*z1j4)&zI z)Q-l-9Ezobrk8B@MK63KL{F%P&|Qe0P*35zF#STk!Z%^6Z-q(i_XzkF)8mUnnqs7W zD=y*J>4DKVGU_kolX!l=7vKz(3*FMzQL$r0GOc6C%Esk(zd=kF!0zXq_wjLu`)h#$ zi${rxD6w7Fcg!FwSKc7TtzVaLpIkXdIk_ng7g2(TBto!fR2}zfYc|9{E-`IH#SG*vV$XK)_|G|d>*rhuZnl=ZitzRdVF9yb2G(zGm`jtS_{`+(vc zfJ{S^9#%@zF~Oqn&>zop%v`aZaAZi*PdLk4aXcEXO05P`%o&NZfY}ndtNhIhjGBWm z10w;hy(}K)UP?m-8wro`QH)byLb(JfwoL#L2w!Rqu|*hrcrO11BU$heFDiPp4-%8UU2rw46V_QU~g8sBNKBv;~bamGY0Am$(sT_8Wrs zmHa^9hPnsytmoV3!!%-(BGeHutGC($#lkq96uJblcJ&>@l5qc>ITK}tfCTq_KHS?! zxIERhI??$A_VeKD(3osjW4tW7aw5`f*B;ilmS9kG$jV}z6yGH(PIOrAweZC{D^ZUF z9(9C&B@~>kSb8oHAr2lo4%gCU!%dpvR!_BVGY5C$Rr_qG-0GnM6()_4fL=AhfUch5 zr&TDui=KCGx)^NM0}t$DJ3Pn;p4_?O$a{lh_9a88YcrUIi5+vrS^ku$rJNMC{8D_Lp;pgFe(7>z%f3X;bBr~P z5laVFP-3vu8V`Pv%=)*W+La_I--xZ(=40Ecec#cCBjlfc7Z!<9$IJ-_b8U>@Xt??b zdQag<=mR|c(w`YF^%j786EGCy2!&|?noDUf^WMV%l zZtHyLHUX!LVt&fjr^vF|C1ZXMZ}2EMRd$f2er7M3GOgKKTEg^>-!h;^Tp->cT1S1r&s+d5&hXsomQ{4};h*8lV1<^6gy`@>V4 zQZmQkR4tp)oc0$s&ngD;x>YAep*cSnw7k~n6FBzuIFszUocyTKZ!UXB5NtdJj=Qt4 zM&6$2lW}{Zl=OQPC{v$c2iFRtwxT}SfN76$e3T~)avH;2s#)BugCcALVEW+hYPyyt z>WB46DuumCXkNttj3ojePBImThNe#g($0+d(^i>7PTzR86yLZ1E96s8dBY*<%JKTO zSYcU+`g8Uc)%nK}d#U9(Src$+{Ma-49=kx{sEF)VFA43J@ke-D(N&^y_YMCUKAhZC zb|aRoz^QE;^FDi~a(FZJUMxPCj170L(>w5L!J|$HWW@;k9lHdL>6|=u%L8oAd4X1@ z@Gm`hJvK<1YJY`u$>$twwGs46sbb!pivaU8yj6CQor#=C``Hkg_fCz$SgG|M&;rsH z1dHQu^j8X(1Ay8MjE|QMYFE-0x#j#B57(xkaYKjm&-@h}*-L{M4(#Erg6}lNfY23w z^t>mmiq8wsjM$VK-Zu{aT!Jlvgcwj_uMgo?uZs8x-z$A zR1gB0UsOq*+QG2!CH%Qo2L*5ao)!G1^)s{3P0HJQ4_Ql}mkdb~I|qE}eTZKM&)s z=;FJ`%VOX|Dr%ZOjlSV9-TYJVORTNgK}<|~q$@fGiIT}rU`!I_yZs#ekKo5CK>F8o zKTZO(&GkPa2%9Ewx2PjJs(WZX{_Y;pHr9Z!ezv)0lm+x+omT9kSbZU*D`1$?XGq?q zekwRpsRdT`iv9Op5`-u^7LW$%bft0%0S>25JG(5KiO@KwT2!@Xj$xaN0}KMA+2-3@ zcq;}zf;-y5HKf2dv+0S&hP<@bw+&#nAfqR89b=E8G-3dR<3O1=1RGusghyePpHQOtVXtFHNQjMy{6v!c zBSU>6TfZVDpB7n-<0}r?9H%h<=|PAspsTj&Do#fl7cwB@3a1qpcqH{6?QjRHsXx}o zX3wIPFKq|2OXLz+Ic?NWGA=abq$uStH4{;hN@;Ukm^Cb$R@eE>TF6{%`b4&VDa^Sp+KeSyB^vorR&Me6qp>Z4gdf+i8#Qs?*Sz#l z8dlnmZ`hBTaL3E;S@8sXmVDu{H;R4~T+z>6b3WPJ2qQ>cuf)o^UH-<4B84`foB5Ik zq9S5>9R#K?6F9dNo&XP?Od8l3QJPd>+kh}4oIx7M524apu7l9SAMdjI40*_2Xn5q(R zWU4*X+|lBK-$kw0X?lNu@lTtWsv=ONRErV^4Ta|L{cCx#tO3D6rVt?)wH*h|J@rA^ z2h~XpD%pvfecn2P5JW_X;)WoC7!gq1A%GBpG>{ShNeNHAO&3cQC|t+{5%ZDRaM0XR zACx_n2pS+Ov3=7i0g6;qtF_%SUqo)TMOkkSxLCQG0HpO$0W^Obk?9Ub_ zUod3CIKfCM*GGF9fh2Upso~W_i0?t_ZQ7JjYasG$-sv{au@rF1eqy-z=9o)nFjAtd zKe6IRPVh7Q1fg~&xM$5rA-}C@{n*Y4R1cpU%XZ9S?Abv)EWT@$ws6IGTOpriWura; zQY~P*&J``0a_xIwsmI@Pp;@Z0eXeQ%=2b|)TF(*kS3<6Uh{SUPkRsv?GN|Tl)2Y;_ zaZB*GVeT>Eo5ZG*eQRA+)x>$k#IJB%E1G*Cp@A8eGz`H#%jH-?o46fO6HA98X2QLws=u%>|`%Kl)ZJkEb)w!Sf}G@xj? z7yOWm^N)hnZG<%q6jAmE8|88SBeV65VWj~@%e~--T%3OttZpN$4XuNtDMjnP6NI-0 z%|RBGvGIPFW0Oo8Wm}@Gjw{QSg2WXkPZQu z8>E3DP>_8>U&t1I za`fe_%E9W(X@zyk(1A-91o#N4=zMiCiuO=sJ>)4HY&byqKtK{)FRRtViQ}g`eHlu9 zDXa2j&X+gK-;&7s(uWJw(h>PY7F&(#)@K@Q%#hpg|hc< zO(gxi!FsKt5S=?kwZXN_Z}8D} z`cxTo3XY##O_wl{PX|Nj_64kx(;v{3POaMwSvPP&ZRl<`NImBjb3~{U*&>~P*1b#1 zyR_cb_ZmYN$c^BGN22H>M(ED7?mCyza=IF{KJ4bL2CVNYz0ZxMk>e=WKMv1P=G+MW z#__fj<;jz`PPd8NYJpP+q!T9zOI9o!`I%|b$orC9}b82 z#;LoAeIJj8wpo8X*sMRav%84axfOwQyNLGI?cJF!;V8X=aXwUZ6!kh}j+Z11no?YZ z9jrfhspK(r+S{;_6?1eK0kK8oUrgKjh?6dJ%J3^t%^wz33&xY@-Z;P8;p6ii-}X_- z>C@V7Gr5{fthi}Qnx&rI(rt8^fF7>!Na)rZ(T7q3&_^Xpgg_8kD2k>(KfnHxQc<)5UDBnm{^Lg_ zr(1codqI#7CP_ClIr{3MmX+k>z8fXwK}kJ5aona(m84H?XwGrd6B7DEg6vM^QSx{1 zAOfQ;)K49gr~1$oIy*J_*s;Tj61g?pv_nUe4l4{&Urt*lgJ6LA>OY16O(7=W4w*JLpbCLI$nMmgw+FEF<><8Cr6*yYw$6V9)gQVvgyXo5+oa`& z@X3MoWq#pmzK)U-(C3~fS;tgKEOH&n=XpBF9G>TKqV+rGu$%Ni7n<{uywh_kS*tjL zY||zWsxx_L&N=DkAju@naoOnpy_d|nN>G3^h@P-%b$j9HORq9(Vz6w~b}1FLq_R(quj);CiO9=4#+~G&&dM`eL8u_7*VGb+R!l< zn{?>#8AXtv>UibwZUvh07+p$14IT6E2}$aZV2rCkGc-w$Q+tO*m2z@qWMrHsGv>&+ zjMXt(tE9b3=uu49*e=7^sAG<0oW9I1UHF*Kj6)aKS6PCO?GqdZb3G)39hK~CnIkOy z>64%C$$ldJRQfrykk1emx_XV(Yy)W!?Mae&{*hD23i}3K`h1-t#i350Zi-Z;lGA-A z4-5o)t>1OGzDg22-X!FpwGx@3IWKd~>9xj8y%E~^1YyzHR%@-GQT@4N2_)pNAf6MMt`3r@z^V1)|-1FTK_;j$iFJ zer;$nzn&xGFma}n`SqD!|51NFzdoe?(D?Nb>QCs`NvJo~}D?0DNdUW-FtS={)k#Rd_S4IC;P zFj!d`mkVsg!JOz|M`STfo){+|%@#4ZJ7ZqcS3~qX0k%9UlUaap0iq1RZo8ky*@6 z<`O`tHGpr69A6e5DLn9C(Bn<&;zS-G&o_VB?B@iG=Rhg!XZ!yf&+Pn6wIh~z($OrnH5K5Oq8=Bh-5eveKe>5 z1_lp=`M}l+o)}0n7c9&G1fdn9+(ZaoAc7Fe2r>{!NU&9cttKXzZ7Gp)X<=r?1=$Oh zsGt_R;e{_vU6n&d2;*kZ7Og7okhr zI)Q>bB?VDWJSaG1AaWq11|4E-EP>e}1cL`~OAl5sbDN!zP!4O9T@q)aA6bg{&Xpk}n zlO)!dI%CQhN_??|7F08!lBHmxN)sIw8xl@Lfq@V)@SzG0GC08#G-zTavr&}>6y297 z#E^oED_BfH1r{q*G+~uQ71;dx8forH3b`7Y{yQA^ngB5MVUP%piyu z3{>!f6~LUFP#^>sH5Pn&)hHaww)6Dw`pDlCIEpzz3u!prisutJI)#T6NROT2f)6i-;T1hIvOElPO{(hFI% zkp))xvlA2-isC z1EU5QMi*9?Ej7rp1{N^^NbHy~bYEJ%U8x6I$h_hw?a4AxgiEWWu1l`%oG<{=y7Z0+_LT4g$$Lg)I%`bLvSx|HPiNgR`vC<@K7Yk|Zre@%H^7`xH4B!P_(29FDI~ zMZ(%k(`01P`b)P?6zJ4Rot&IH(yg-qr7!cGfzp@Q!C6F4EvhBzejV%plBR#Hjmy-c ziwS#)A^3T@kO=VQEGzJ!}DUhZJd%kw?)l2Xv&<1nTYTxG^ z8l!{gDXONh(Nfc7N=Ws6R?>P7ma8v)N}3D~U)={5tFNwuq}880X|?xdEsg@5J1U98 zI@Y&A<&Y;|-BzI?NZBh+Pu)7LK-2Hg7+sdxz7<8VUbl`);_6g@vieiq?h;C)J><$! z2s)QiC2$(u9b7(gRHt+YW&I$DNRcH=QRS`QEdpzeDiwuvmFRXzL@3R=G#@_Qe>jOf z&mDUYp@pEMV^c4Fpo%?xty(@@`C5~JxB|ke)}-)jIvSeNrKa9D4i!}sPRM!4^hmJJ zi6Trdq1)vO&)s=1{=R#+5fmypcbA`=!e*V{X7YX3i)8O@A|#!c)baOulO;mmZUTC^ zHiD=L}ivDg=M}?|lszQQ+x&D+6&I#6gx2_}yKa^6R z@hX;d!(2wj#%3%QqYm>Km}8f5yn}p>@wzJk?gDIv0UMaM1MJK-`Cb55O7}^Eys1p96lcr z;M5Ucpx!}tr}GXxL3a;sTBApmynX@=-(AFmzV+=_THE2{Lz3<^TB#pwPjAjL7IdlF&;~bSm>EG(NLK&o1f^Hb*EjrlzGMP-~ zF37gq9ZT9BtKX7tX(M&Q>8EY#t;?*%FE3kqsq7nRI|zPn=lBPX&^J?;RdR-Sy3eNr z8Dn%!vDMzDU`@GViWMwKLIx>SY>=p;LIMhjCM9f2Shc~04X(E?+p(jFwxa_zeVyAo zDoMSd%8CNZ6i{?VmU1f?b@>qlCJHEU(2tvM4)yeLQXey_uqq0b(At-q5?D`FSVb8D z1!L^x4`;tVWnUIY$g`3t40Rk%BGz=Ds`z`a)n5pOI4IoC(E)?K!*m*i8+gA0_v!bGUP}G&=*+5ng07G8~ch*Pc*Gjx(Wpt{oH4 zzgj(?pXYgAN4mXAJ&$f3Ifv`eax@1Py`Z_F$-{Y2mDL}P6ruW%W0&C}&WgW3G-Tui zJ2ZLB=eWv|7HHm3mQy*-QQ*d*6Dmok?9Mz=WxKo7^Mk4wHCoF`YHH{tv<3nrqg}3G zG`$pUqYd19uLu1Iqpg=deEg^Zob`vSqzNV%sU$U_lC*?MQWHJ^PMu4OusXocTMEad7L8ENI&OG zSjbL<^SsOIoOdJE0>wmxl#4}fk()!2bck<=X?4iNA&~de!6dEQojcO%j`a?#H+QVt z8k1Eri%@H|_rBY*O4=_LRx)oQwf4ey8)w#Pe~Z-YgLQk_(q!D8w1_;}{?4sscgspx z0ZIfuFlNk{F+$u{lB9(w)^Gjb-n(;!0h|=dR0(uRBWaagnHQ><|7yg`W)2IeXe^j@ z^w)Yyv7Szv^G!ZCA&~T!n-H~{H3xR64f;^9lb0;D4)vxz)aPc^@a?6PTD)`Jp?*gW zXpf!Z<&T3L9opmT0GFP(6(D_?-}9Wl3XtCOJg?F^?W^GahFKVUk|F4 z>^jdeADD2f9T{f^Xp(2 zb~LxTQpGk^$y=c+dFxXpZ*8jNW%|NzPM%BqJDcs!y?E^TZ(aKU)+n^Ae{Erz;~_tF@K->)3{aZ8q5U*J+K1(PjP`FWs-#(JM*C z=(5IEW2;hsW^Qd&XrQUfx@JoCr#3m&Jk>ybHeTkR3M9jF@MgR4%{b##9HHiGZ0My-mcK5;@+-Q{F0<&g zjrG^_cU8&jv+=W4@;U~rw2jmF&>FhbS2Wk5-S}**H#^A8tJhuQuPOqWd61peIIXeq zPz+(o&wRFR_6^S|;l_3$%FJK@FdM4B{=!!*-0+iil{sI^#xmy`+h;3vRaq1D z*K=yLD*M3(WwZTo1OxIx%yj&7`|#v%J|tbMvCctGvpI9eKW zTN0x~Er%_v9IT|s!OF`jnSv)=V@SD4ar$|a^5n}bCF$o42{AvBNCSy14HmtiX9u%_ zlX4@Ixt9oWbG*BB0qd~`*~#ItIu}e&olfWGHe%9wp0o3+WQkDMbv{Si)oMBKIPPM+ z?F7>}~h}5sHzt*OO3Nr?T%zdfTWFO8sLmdOqsL1E5Uu>0-@HB*{b}VO>uSzO8 zm*mi>MPUdGT~4hMNEq_N#}1zyIvx_$K$kS>Cr$bS&U$Ah3Zu*X69FJNl%>mh^s_4q zD@)7EPrp)CtF=M(3bm@_%<|K1R8mn-PE1QmNk_FLMnyv>m{0-my7WBw9mrH}DdnLByq}gOgfoUpPeUQ)lvY*8tM|77egEOGmEG3UvJl5xSJ+ zaN9>EX}6=2T#@TF+aO@G>d8aM{Oi+WlLyvz=Li;EvGveyaq`s3Q)QslUd(mb`@m3q z!9p$03DaiS%$TB->X;c%W-wW6ZA`|DBr}j?LX0t%nd#!13A?WAW@K4dve5H9Pc{Q% z1!fk4APCNAz(CQ^)PP|E^Q0z(!C%4{~9 z-QZA(P&i>tO-&6>4%60>jg5^>&W+m^(w8nA92}e*IJCZC;RtWsxN!r=24AecJOO)& zTIZj;B*Ew80DgD|)z8}*R%Y0OYYVNPw=J%=u=;u1!nTE!r}=r?qA3Ni3)EB;;N)Vu zlCzRIUbehwdFkTjg$orI*e^_9oV@H-#u&4VEB;mn)rVya@v>VPN^=x5$pB;C$fyEA zP<%}}y+TnG#TU%p$ar!iqb9zP&@qogBy8cQ&o5p0xuXDS44USQGqkp3ZQ(-2y(IK# zCA}&_<-S@u&l{ohI(puXK3?_e?OI12K^95(`14r38*$D@FATOmrzgktC20@a1_uJb zex1lV9mB@oEdc5Pt+m?QAuFm6ZJ{}@9?svP)UmFrWHUS!x?S1+_S~$$mU-?n%dFP) zZ-%zKnBV;x+#vdqAWDy*p30Lv5`T#@1`Vci*SQmv}G!rAWn z_~^)3i^qK(m`O56=xGtZsVS-#2n)4nQA_M4!v`QLN=gQX^g2&ZP%}D)2S8JklPu=s z_tFy6Os2_?N=i>?W{%!#WK4bo+6;!r(bXl!hUSI8v9-l@QzNT=j+T}e92yo@R*sF9 z8#lLhYxf8Tj+PB_Y?tk_V*G}d5eJsVvRQirEdX$PWv?t3ol#2ww%xK@mWu-bXz4)5 zYFRDog$#g}9S*FO%_4vfvRkq4r$+4q_M*!Alt9UQ~Ej>Bxl%29vK0I0o;6YTB zQ~`Pn;G;zc0knKjfFA=`Bp@AFCuHsT;L6C=0e*M@_1Lks0+){iXqiLP3j%l~pa%#( ztVqZbga9p{03i^xC?K5UO%jD@dHFEtB5BbxSAJe31t>r%2Nj^b+in^QM*2tD(~$-2 zL_KKg_R9VW*?q0uPe&vD)>;p$*_Ku`&C8tEve}^K296mH6j5x@;{Z5f-~?9e00Au~W%Hdnb8`@K`-<{+6bdabA{drh_Sio+i|3>y6jrMr{ zjYT?WCQx5@X%Fqe-o3HxpI_R8zjUEi)8akPODmoS`Ro=37@;0`TmZ1PzYfwKIByX+ zw?s40c8gWQ;yUJGU0q^0+s21VN>94W#)m#WIx-gXFd8k#-)!;!Sq$Dth zd5|P?gkIObw3dmV8ZS~UsztrLz%>4=)sA2x8vnWLXp!s1w_fHP#$IRq4aK5ZG)o3% z#^YRFahcIzekLkPN*3Gt87r$SGnp?h^YjEoGgHRPR8?K6k&*E=N=i>?GcR8g6(wau zGse>(Atl|^(BNsFo}h4Ox1ZT2+hm<`Y_xu6vsJlqBgV_@l3lV)IB>#v8J(h2lxl+< zQAia%1IF9fnmzIxS#Q(S=;%Qx7V)h1JJZ))-2>{;3>#Z#=oe}G`k`jFqfNj$= zTzpJR%L@kp*y3YINHnPfoi1;&u(HSiaQS+5Rk`eNpv7BSqcwUYfDX2N?MfnM0Av>5 z*=$vE>|8xJHC3s21c1eNSSMt8Fn}wbyE4M1Cx@2DR#r8O4^NiARaLc$03OWX@zx5H zs{lP#{GD1u<;KPa4|r4k~gXQZf0bqNFtf5aeGi^tne(Vpu>FVHhlJf$SBM6A}E>zb9TJ1hw-Hy%`2{WxqJ8RHj$nJLI1*gX-~dHM(EF* z^wGRR$bMM7o2Ui4^Xd4CK)lJ5J$njZwC6GrJ_p5a@?;067;bP(;S61N8FU#DxQ*<8 zZe$LSnX?`ja<45#^l(!V_p}4>!f=EMg<&3{AZej+PrDP2p-?x@*Q>4tGDPI(0yIqH7&FA+Ta0aCGA1PJ5`%Lft3={oJM!9sI&P5)Gj{cOoIa zOMAGJS?75(0 zxN*Yfy_Qy3_Y&{RdKH>FSP6BZF2NV1qEeU9s!yF3-dZe#yw7Dm9Jj|P*}pLg=iV5l zb1>K3RgA9?s?NESw{jduJI~W1bmYWsslR3$eiLt+_tBo~RLr#J)>~_(^SdwW6W5GG zc8~~)?i_oyQ?{OipJGg@dT@5&3_Zn|G9|{8sL$CwyN(BP*%P^2f9xDWzr1uJAvAbD zEF|0|{cr|~4=0c>9A~QDJ@WtDN@}$?(*OC)6F+0+ zLoo=^6yh@4<8GWGF#ntg2J`Hi_TVA7;|{! zHtlF)ArytfBHWMT#2ea^{fac&lf6g>J?#z#V_phRXqSl)?pw*uy-j-sRqCLO7-Z5O z(Q>rMGWAt1dCs+#+Ltt1kg#0gziBi%UYsqEjK2^ZqliF%cZEkPRz82^CBJew?(KM zsY0(d{KlDuP&Y#Pyox1&Ba#;SJ}>(x261o}&I)uiu@E|PqK}+-lqfiN59#K{34$cl z=?pW}pId*dkr|R^pgkS;qB9||XMFGNoKlR1ujAW&-e|<57AZ8s`88t1h!(%jY9rcK zYpu<0ZPlaebVjVzMvPc%#9AZP>I+c6D1bFfi!6%LGMP+gX{?(4)*rEkT^CaCc1ZUH zXiw-t^#ZiV%Q?RhN8M#gDVHfeK&n^BwDy4cjf9`$Zl``6Uf-b7}`FZO~`db=SVWv;%bIx&2 zk*te;z4~-2MN6!;ZY`@j*u62wM=}TKeb!oQt+kz7YrB^%D&oU<`44{H!bm;sxv?a{ zbKK(`m9)0jDa(!DF0T;JIjO28Ra~%rrBa_){V5fd(s@a#p4R)xIQ43!n=C3K3_~ee z<;&{b=cFv9@-`9Yc7$)2pLgEvuG^*FT?g|xFX_W7wUtVBcAWDILzoUl5w?l4zg*NX zu}JpUrc!86SQOq5Va}D>Inm3Q%=nF9*xkZBdGJL#6^=AE&MU7++Vme+g4j5(UXRr2 zVI%k8IR7HD_02%@$8@zQTwOZ}V>PW7KV1uvK?-qf*P1NR8Kou9TG$WJbF1)$1~0AQ7J$>|+(TWu^v9or?(s~ZY+a`Ug^oSPka@ZCUYBGw(3_VkL}%z~M-{Ya>fh7_NF+vkor5z7 zja$oEu2#;{o@QICEM92qPEmi|`e(P%eHy2693vAPe#2TEH*ny<;dZPW$A}$=2UQ&3 zXQ3*2ZIgAnOZUmWOi35%*2HjaX=N=vSz=1ENJ(OB%^q=WS!=DWT(yf!CGXXR!XMs5 z*e%84%)vUb5Hdf%@!2@v#z8Ym|LeHv2q^?Z(8!f8=amr?PC#L(ejz?X6vY*?(B<4( z!6=E6+7-hr0+~5@>rbt)@Z);DUPyL}E-6wD5-CaP$&z;|8Za2FNef-lCLKOaPESx# zAGWd(mWI}Piip83S4L}bc=G;pBe|c(NuO!fBkk#e`8PeNJ(~r@0fhVL?H8L<9zxwRcopK(0p43 zEM3;6xx_@{&4@r|`$!Em6AjIb&v==C#SG5DtwtuS5oZq0e&)IU zd^A3D3xsB?;Dx4f&*^L=LgU{Kp^`J7B9I}Kob6iuv2mIg)pQMxo+cB*InjtHd^6v@p2sy-V#n~sA}aI)ylb zi<&f1j?d?)^&2AV*m14?T*pTk2`6Et$%9toW$i(=XpdOL`pqt_=WL=G5&QZZr&_c} zZOZW)sukqM-)tmMaCmK^J?a$gxi_BEG~y%b{!wp zA36f|*;wR*F6&gyQtQ;@f#cWfl*!}s>s1Nbo zTPUC|z&Q?FZS4=$5Om&pU%V)6)`dgWsF=wkBlV)DRFy?!x! z%%@(#AQGcXe>Ar!D(gNjpyf&cF9w>NY1=-dfuM7_4=o zsav}5Jc8wRLHc>)()E?gl?Nvfky31ZiuQ^wTi4LoDV9mmrR;YsEo(pF0!Hdj*VhD8 zEu&@4J|j?FbO%%yeaR>J`WdX@H+s(bH!gWR8rk>u1?CpdX^KbscM4%4l}3B0+ly6& zRG(Q_`3P{*E7;PVLy4?YDkSU`yS;8yA8VNvxr--VBw$Hr*jie=O&&)_-eaD-G#iQ){qD(q^={Tq^6!|3_5nD1p^S{Tgg$XYECGqeu7O* zGTr2aa zi#^TjB34MGo?ysTd4mcbU0bN}TREv~4EmnFHAG{x`CuaY$0g&+k0^-8R*$$98`guf z)kQjSKE%;$$+$(}TBQa$Xe63gk_nk#l>O%Zv-1*ocz-iD}-eiF*u`fOoBe z?|XG#K1!l-l=dS?oSr+bnWA=tw^X>q{z_!v%fAAzaYP4`CBvbS*KFM_{8B?TE^!mC zX<;p|NkGTTnKg-et{ia|>gC2MvTn-g;jt?{#wXtkkr**d!xIX#hsrSCnti?w?xn-e!YxSgV^FY!=OmJfHcOU>;HBD z5K}u<80vCEYJzaLL{x6r(4gu#=W|>RuK2nB7oKPk6eUTgm$Xqg`~QN#N66U>wF$2x zRp>kuVauN($P18V2x&$BWc0*T?yeEm0_B#e=X_AH7rO}z_JjF3SmyS zpGnP(=9+zKUGWSONLLlJtxruGFfKC&v_=6{>TPKCWRX@7uR;zn_wbrvvvXL5+!9$) zeM16i_;~i?iB`4I`q{ZDzZJ50j3@9Ob@JpH-s(_{7)bbB9+xL{RwnOjl#yBv+{bdR2}%+M4sarm_rZ z%5w-J^lOXir%iua{~Z<*MZ)Aw1%(<8_Q8GQ^w!O)%qR&PQkyJJmkW?V5bj^yt@8q| z6oKxH`x!C0=cRbX7vPy9PZQ-Z%xlN+P6Zg@L8;^2`_v$F=a<3 zk)DBC-ddFoc{{;_GJ7eI`=Va>zUDhcraSf8O%-ZzG)AZLcY{?()G`0XF+s9c{Bd%l z2RA}ZBnV3CCgUSm4A0L+to=^GVDWV`)(LD^GYif13k5)ARhN-Qd87cI%smedOjUJm z?usD}iqsPhGb2N6zN6{2Y!G8xe2qGF!tFRXT%oj-^&AXV8>=nMFE+DE`GkwF&r&LJ z>fxyE@_rzZZiy(WhYF$A=mlR$9iJ;d+GhD2pP)xTi&FRD{T;3tZkj{ZVPXt?hJONl z?=05UdgEuJkcMa7;P${+90RqJ+yQO^13Jr)7-a!bGjDWLE-vIqpevY75vuC+5KNJV z88;w9lVlVPVd6JXhR7cS(Ko{NZ#=64F7vp0PXto9$ed=mVT-KiLKlQ%kREF@Q3hL% zNBPBeK}V&VOzJ?r6b7Zzt;%gQT*I84P8Ig%nEDZT~h75)rfU8#a}|zy_(FF(U|q+pX&0o+J_D ziSD{jRUnsaOeml-{^;yU;QfD~$Q#iR7)4M7rSp(qyVlb@r$=l(SyEk8rQk(J8S+)*dNB-q5FqF*?;k=d{F0`8L$Y zLyE$Tk&F<9;Ua#lCLmRvF$g={v8nh*82)A+X}+E3 z;P5n}BAhlGkSzRDiS1FGA`$`Pt&Vb^D?r|rozD+9>Hr60szte${=te5k|E)>whLdN zCMXqKXQm`>SHxzX5lp>~jkq>c+g$Oym7~OL)QUC<&cjM-6PXs>R1jkpl@vKpUaVAb zAi#{^bysU>qF~l15$lJ=wE)NA-hHjWXnn$3lr@N(HiANaS$erAY#YPiciFy!MeNoN zJ+bf#SHNdbG}dgyVz_#vlLPPtdF6T|Z@Xt=(wRFcpiImgnu0nNgBijl_`2ni%*03g zBt@DLTRjSJxfCT~7g#Sv*g(TyntL7t3gyb^Bx>&VHQGeDO-0;Y(4LW&DS0-{Hfiun z13Ck_*~O;M4A8Dkt;QW#@T@94%k{1ts?kB(Tw?9Z4J|+|d)(~{k(F`?D~`ROEKg24 zxY`UMn65zI*z7g1>6H;Cg(zZ4@L3^!Z(Dkv&4A{<(!4GXd#LB97SV29;zZ-$ta4AfZ}9AaKKyacl$s zh7<`2>~3IjQ?{8Jv=4G5q=EdxvJg(&V zN`(TXPOt+838aAtAW60$)$RYjIU}lgSp++x#^t-ch|k9PG!m^#hT^k5nlLoZ<-sSg zW1t&r53&&p>?J~y6TYLRF*(|tI>h1ePYW04;1}3M3W?2)%-)KW3EqPbi>{q0rMwB= zGeS!8xY2>k2X0EknSSAx=t7jv!PkAL>q=6BR&c=|H|h|2E7;eo%-8K_T0zx3c@#tN z1Yv>9S_S3xB!ApWgTC|*!BLcLR>w;T%BtPTjWX4L?#orWLcx>NsZpL9`=qc_KAV1= zJf?+G*ANEw3V9wDUE<%`0@-d#HtTskZ-ik;t3=TH9Mvq)#y$$~Q?6B3Y_6^U?!wHd zG<4M@GUD6-y6qx(=K{3#mjIXqboLD#T!KP;4Z+$eZA4MjLa@0d* zyx;(r+cCLnhs;yp2+j@A$G0$sm-F4Wd4uajb~mt}@Y}o}W%2t3oqw!2pd1#sYoCp& zPg?F^JCms$ce!16FDw36?a55o8NI(qKtEFOJK1)i{;*SyK7hEpeCkcU(y^Ki&z;-n zyv7yUNL+Qq)u<2$TMpfdMev(>M|4x-vfR1c1l9RGL_|vE`)&24E$)yQqfy$<^NaE# z#%7@L3tLQ+)9<>_oA!NRTt-A%F(>Z{-Pm71JY4CJU)UE$2rG)-R0|UYufo>RS%iGZ zPpy$atAH~DWG}FzY=hW7q3iGh5ed8BEHn$#kX+0`N9>hb1f`A+(}SlTS1yMqq>orN zC9;A`eMDIICP8#;z>w*cWFTVN?i=LCg@qIOE+HnbmdPRjM2))=Tx^@5x#N&)JF!6_ zqnXXV)B4P8wW$Z>no;w2H)dpM753bWE6^Cf6znTd49nCNt%TVQUXWz9i|T0C=WAxN zhlF@pA5t9!NIJ&?;B5telREEB;Kil#{>-Jz=_b6=O^{SPfl%E`{XsPh$vhh>C}Xh! zC#}o6AlNLP@r8|c6ns*o%83V0hnczA(03j=R5T;#YUL`T*G62X`R++T+dJ3}Q&h?_ zUCCk=!WjF)7saB2Ix6>kOwu zUpS!Ua^05HkJA-=h$r2}VP%Zb;cTySz&8nD(IleaFih^lMN{#Yff#*470Qn8eIu64S z;j+-1VJoh)C_ljnSqrYsl>!Xv@~U5i!t_x-0HLZ|CtWi`np0W^X)+kw;E`?8jAUHq z@Gn8^l*=)+bRSH3(&IP}4cYQ3>R$>ptSNL&U;M->@5n2ZI~Bb6vXdC&0>#B3wqlWc zKGG=6mnuh!h&_UB_N@x8^xw|8--k4gyp+r&FY9pr@$>5#yUXg{U@f(RK3-46u&dA< z;{}LuhReAF0=FFvZ+HI0S==B!dP7g>jP-TBiMW-?LH#A<%2=7p>rIzjF5dWS475#Ty3hV6$bG@O%pq* zMA-&Z&+E-vWXH$#3;<(zi9jZ>Vy1JB`3e(a?MhlA+fT5{;yJUmoyc6V!dAS=RsH1B zlE$qzz4PMEEMWH>zG}*xjUfyGog3dn1*qKw6P|neJ13F5dRVJLH2`fCbycAUmSr0H z1}V)jM;v3iQfVYud$f%__1YKp^hO@jM5kbNt1(z1%}6*fgvYLvDqu2JXBAC3a2Ni$ zZOJHA1{v(bQ3JeSx3qZjkP0dbdPYn)xl1sh3lcp)aOZWVdw$@aa0eE7p=&@#sBh2y z&Ah%j5}}WSlszB>y~7Qo4Dfd)=_#3LS3*&oO+C_;o5R7soz}F+h|n z!9_JW)};au9RxGAl_5(KTt0nUx5?Tas6Of1gSv3ZhXed3P=`>mCy)18xp58#`eFN~ z$N_=|T+z&kCVrqPn<7V)#$fCUA9r9Ty?4+Fs*;=mcKW5^mCJVEdP6`q-)F5jy^YH0H^V;w@K4OxiK;ejQ2QvjBdG)O)Q zd>tCX1YA}SwrA#S(Ztfg?N)I)P=u@~P73$p1S&54?FGjISjVLYGlF-dI~a$Dkc-~$ zW}4_l(V{6O1J8!A2$@t5DCWqxBWz&T(SGhPpm~O!SE1+m%XZvFLa{P{nlKh-zy@`+ z#!1&-uB6hbJ(*O0DfvavHa5M)RV_$dp!d}z95GHEu`D95%<~4Lm?jZO8W(bT1++5h zMdY}ULWx0-?tHoK%@}}mSn)o(z<@R=Jm3OvhslP7X=7Vu`q7=Zp^QC#)w7U}KG?nM z01R<2@nAUHmxo9JTR1zw2F^Yf1w;v~K}G_%UrYb6G;PYo67bWgMZrP|qegxLfu>x1 z=YZwnW~VdUW_HA#;^^>?$n=Cy-HTe_&r>pKKR zTe8at3g{K^zIl+?;{w@NbdXa`U4S0D$aBIlGarff>jgCM3?#t0=RFLMnc2DdkYZT) ztF*6iHw;GZ3mP6H>vZ&RkyuV_pkGyQcj~3V1}M1iqyt9p7L)@qFI(F8^2r&>>dB=< zDj|svRC)p^tS)=I4>&5F;PW*6$RUhnIb8~pgmD(avw3-|3=m!Oyih7)g~cMm(Ipc& zV%lnmYGj4j_{)Anlv9{b378U4AGQLk=u{)h$rVH~ijZzb{{d?ldV#)K2p9q@|(l+)FQ-$FoN;(?6|wrh<5D7I{5 ziMAG&Qu9eJvGJWv_ZXSgj#96CLN`omCI9h(MX&96Y`n#93nR84d|=QET_-Atfm{s^ z@f`5oXh*SwtOp17Wz>NSbbxVs;eDI$|; zs^L;Yd=$94X$FWyEwng}_Z&(anyeRM)geV@lv`qJpCRg;H5it6C5;o#HNJYZb=9Fxm;+|rDNFsDYnFS+Y zM~joKY(RV#vHjk8{1sB~zC`|()STL+{^19Bw|*Zz#ge$k?i@g^{s;;kXv62{#cY7G zrG$wHH940T7V$U4Hp2_}G3n~cJF^H*DBkEG(B{0gDyg$JFX%!yYB&L}{`NYp9 zRo6lk>rCJ)fFIj=agDa;`?Lo|i`9EU2__lKXV3I*Fohb00NC)AiJWk0Cs zw>yh{Z~xeDz>X29yGl)gKdEdSVlnOw&*e|a~&-*2_=7I zVoh-;7P&;$?|v~b@&P)-*oK4(ma8mp(iJ`E#Rc>Z~b}>V^;8Z3*xIFhH_4KzNOs zDxiKFNUv-2Sv+P*Ln@kS*XMlPg2pwF(4O(G+M`J8RWw|wPWuh3#r zrk3@9^ZsG11?O+Bd zeL94?a(aM$J|6-MEAh>8_RatV1FeKgkWOV^zFlMMOn$-%8|ccz1fH1ynhh2a!f=sx zFukZLF4Ko-;t?bwcJF9U;Zqukwu-{NgR^lTu-xRZ9-j+FHB%~h94ZO7vP^gwRH!YVkbvh3M`w7B}$#{9b10t z?+q89`^ClQesS}?FK&FxeLutH6BHHqt zD9$e!uL=3_4;jm7fbW_Bg)-8k817=s)p99>ytqMGYLo-bmZ1f^Jsejwiyz~`(Cq+aaNs0 zQblyepi0T%Y~LA$1H5DvNJNQ6pAArTl289ObQ}3VZ^K7X-grsGRvGWHne(_|F-5*qQY46ibdl(G?ESEK zc?4P%B$El-NKmtu1PS;2e8)EDkbwp6xr?aM9!&=ooYYeV4GSd5c!39!*pw{#7P0oj zKVZshfC_rl!qG$Nx1ioNY^B%WY@CQP%elRGG<^DtLX+P3rH9)(F)H$VNe{D^RFnuL zzGGQje_rw_t+%D!TL(h%q*l8LS!DicYrT_5HF7Z8I;|E{dhgbcx~GR9q40h(6XD8v z6eC7AL3wwE4U8L7J5+socwwYF*9Ua`b=0fHKmi-WE9rwhJzyZ4x(*5}24fLCjK92D z+uJ{pxejJpIl%%ruoRigniBTNy(mVb&C7W{c#h($&84>=HqTgUwrmR}0`(g3dcqV8 zmEb}?4jvLs>LuX~L?sQ&X4?iQCxu$G=w{JFdE>y9<4ch|OgCU|wepAGS)+rX4k0|O z@hs%IOVsUVS*!5TyViv!NO0~D%8`u)LO4gSAmxW+(Yq(F8)!-vRw!b)5p@vaz z>eT^IrS%6Ngki`L%6CNK^Ppa?`&o5`&oXiE!KRxeaqaso&8^H4)~N^SG^ab9MnT~- zKAN&Rz%h{*c4>Gzq?u@+u!;D1(1)ixR{=Tb27@zg*tNjtgQmgKeGnz|;g8BT+4oGvKJ^O5jvO=b{-rv2@Kve_U@XSlO@c z=p!;9SXGvrm$A1AXXvLP^s{|BjqsjcBM}c4!)dm=%Xh$ko6=lw~Tko(+1ZqD4hw(D?_8WuQvbL=@#Xb_W};`n@^a{(W9=si;A*z2^%fV z+M7q-1x;C+gfCIB`Za7{@D&byjgQt&D*k&12bHpgQgV&MxsvO?f(CyLq4F9g zZYCl=1ZU}r-AyQw*5?~er&uRd1Xd15n&vdigJ!a7L=iy94EX1B;3H4UnTd%u{3qaIePGqM8d1AK>T^&+B%KJrwDomsUe#)d)z&?3U z&(^^MNe(b3YBoH1@I!cW=@}h3cXPLrF>Uh64R=YzLqI3et&q~)QPr%ILL|9h45-=A z-OzoghNmvQ!2yu&(r)jlapM)zySq}ftInv;XX_)f!bk*;dte1^k{q31rTw4LQ@{e}VO28C}H2S|ktDRuw9~gKsHWAE=u;NcUit6Rz(?Xcu z|NpNx6wuGBNogmu5-2}|T4AB&j8-D+Blq$_Xh^~MdQKR6D}}|L*-`~9O|qL`3$wU> z3Nrfdu%e#$Cg8Khk7un3qT{@0dH8T8SEsQe|C}?}>NE8pje*%LxZVlMT4zk)R57I$)t2QpjRje-x|3r@+nDK>>jL5t)_7Uy`a||x(U{W$mE71C~+StWhuMg zG~xyC;RIV{0S91DSi1z4X zXR=#dsWhY;1zy%v-iD3q#pcAOUcDFdMdW@DL1Cg zL&!4^Q67uVN!6(XG^}~3^G|+Y^e~I=>1p6;Zp(VAbCPQU5X_1K;VF4v2p9T@@{nre zz?sWt3)uxdnMN#-?rbew-x1>HT-SVgEA}ubiigIyo+I=@Xpxx=XjDaR1}l|t9QN!2 z22kG$ToM2)*rUBZOs2({lVU)ugX~nreQ&Wo9$k65&~w04aedDkMP`>eWUv zV|0nUP?a&}`*>}16@1CQlRiYAq(};4CUuDSC6BLv54o2rh$bE69yUoO?Uh|7`tl-#(K$@qzPAF^H!MTrbXJ9H+SiO9eCHU~UN_Q*eVGArfXgbw$>0lmJ>O^Lppu zwkourNSeK6T_<#h^8_-(+lhYBOPMumMCjtwdcDG1b}BIA1WlZ_i8A~MC&@ZaKsX%a zj=;6+-)V)y9s^uWDZ}>fM)pZt;BUf3_zW-d?I1y>a8b1VM0UAhtpdVpLB1Xfm~2ES zY8^=qC@1{N^IQmwwH)`SG`p*|04ZjXT;ARK#w0d`k8$~ldPWCmWI?5M)z^v;xY;6U zD(g{29r_DkqVModKB+Z+-JMGT!-NMD6j)P+trI=KD&siElK_*Qjx0(%m~Zy@5j_94 z{s|z&8;m{|zjXLkw+>ig-q^OjbVPiR?_M_sz=?IP@OSr`tPL{Nx<$}Kcpw;G#bQv(O}JT*6H-Xv=`2F^feLYMZD z>^6SXpkmIO{E=no0&hT9qWQ>=GI)F0H>62{1S$5mC>aUfGNpZ6Mz|j4qc#jKE`8Ey z8i`93VyO|4^C^lr5U+sLV`qdW#-(}L!kpT%J&D}|I073o`4=^3Tz#5^g7|Z* zyK{kKo;oSWq~(0aiRW~sh@xQoB~-M$92L7OUf>fwXLpdx_YmZ;z8f(JOC=Qsi3S||$iG7*&FxrqhMWMgx1E@lt1yC)`ah7(% zgB?+a%n9>4qQIk$vyd@j1-NOC$oXk7 zt6Z^PTi`l?n#J0oC#wWXz#^?s%*D_L+gGkKM6Q@2<=r2qf?cdrL15#(m0c_a#etVm z+b5O?5Qw#&yk|>qw~vI}kwc24X%KE2!vgE3*X-(wl;bJ?@(IP=A9)~tLJyGZa3}@y zqWSKIOkoTMi5F4pwQ)tQJ(N?(lx1n3``kJN@cR(G`p?D@P_W7Vj=&WZ>T|Xz1!oFs zzN(LTMzah{c;~?=SM%GlydA_+dAMC*-n6Uj)Qrm9(gs-OW+qwDnMP5$o{$5>*5>V)vy1Y zQzm)43@TtDfL(DwN%eg7fhX2Rqf;JnI=DvNJs2L5<$r0ar-S+hI+WEu!U;#%P{~$(Cd+^9=CH51bsj=M9w7KxX5TT^OPt7X)xE94(a4 z7i)88LIe{SiZ8ji(@r~8hA`@j;Hia#^9FH5v)WPh=yx{Uk}xg$gJcC2 zlV~But7rh|ch&$j!knkYp`DT^Q$#nL9NZA$&!tR&QxN^8^B+Tu<@G%aGve)fHof)3 zsgs!ST!VgE848%QBL-1vXdu}kf_~$s*RII%>SsbL_iIcnYnIJPqmuW*gjh%m7EI^< zE(G;Y3(2l>VIh`q*r|K0C0YGCV1v9v1nP$I9P3fM{yKDhTh|c^&GQgp%mApeDMfv# zt|phGYw~~Ruc|?$=&ZGaxCpRs4YQ;{aaGc(T4|6e6?i>yF2Q_+^#Jt1e{@M|% z-Oz?hx}DDO(ZWmf#SN2u8?>-f|>v>OMtZFd3=!jIfW)lCvc z^1`6y^P4TPE93bd69;tpuFkFlO|}WMWxO{iFJVKam$BY+HPfHYBJtHUC-tPFO$Hzs zl^z&$8ryg;PvgJ_!EfepCcGpS8srz1zH)Er8HP!0anG3H2%KL_S7QNq29Pzdz*L4t zp?gl__^a{UFCkmAlC6u0LSYVY;jK0nnq(L~e;j=8lB?&WC~TCGB? zDr~@Q1w#giDnZzLOG4*@amW~?%7vyA&@9RhE0)5SZD}jwxf?C9k5VVlkUr}H;uEs!5;aZld42EYJHD;9>vC(1Rj}#k z!c=|fhl7iov9zX`a+%(jzbqJ3a#}9T)L0!hh#v_pf@(51TeKh{r+ZzT%FYSK<_%s2 z_9$zB#aIQ6$O9!CJyN>SBjp=BP`)&QynY*=CH5ei`Wk781K)a(1(mnkXM~#A`Yz|u zLna#5Yp4Z=8l9A-m^tt_$}3C*Lz{>*(CKj*uWicVVJ0&toKZ7fZ<$&E3yrb`0$kd7 zWA||ivRp+AaEeE@F>b2e`~4XAin?gOA0rDHskp=oCql>b)a(UT{d|s%L93S~&WH8J zO`I=CR7JNW%OepRieOcE)HF|rQ>Y}MezlXgs$DkKP!nP#$Cb>#zlk!7{e4xV;M+z= z!^J!;pCb8k>-?Tvt+=EK992g^9HkJ0FLs(YekDR_IdXKukdQu!Jp)8ly;PUVkOT%u zoz(+7x@i{(muK%l0j|qn6IKNOZm{e@F^^z?vbrQ+C<66bDP$gkn|D;YFEQJ zU2ZCIQb&&$EpBj_m7X+V=6|wqVV9EbBg(HDV+9P03X;6?D?WSyS`W1#V61CT7L{pVRg3aa zIiXDcCXnLq*2X8n`xz6EN6TQ3BOM<2v&MF8PZ*UQU~+S*7X4l&knQRq)HgQ4Z z!dySAeS+(Evl!jqVZSH3?^1G>eI#r_TKV|isJ;UP&nMq!^C{ds`rJB#fkoDaXWf$}fbOJ_)| zp%Bd`>bqXtz{k}-^g&fl+g?y|s|=q&bi#{F{be@wMnDBwVnI&R@(dV{&i*s2q_Iow z$C<+R8SR9qTnO~PCY5og^3gq;Cjw8?lbKqB7?WAl8$d6hF56nBrT%*X%yQy%gl$0E zgbJwo5p-Xb2wB-ws1zn=Q#!+>EMODp4c+M$5*4hrH*JIFPfO%=Y%trvcA${x?h0!Q zYK2#V00mMhsO$E8pBCek!CcZ3F`~yk&v!$Yu&hhCWJ^k$=0g!YGOOYdt1~{F0K655 z{i-p{6fxmbPy~jWzZvY~Ad(vz94_nI(a3J_222QU8E7CTZ zfcP(k;#TdkU`hTTszO@*!dF_%G*ylRpEX-UvSe}E+Mu{rfGplpe>e9AM23VV7%XV@ zrz!&VeCLp^qE$V@UCZH+jcGm_rw<}-qE#xAsxS|?3wiv!pI}3_hL>wUP`lj@16Jzx zs`7a72yOXZ>aJ};7t5LpJ|AXye5u$)7QWX<>Q}mO@-iwE!(v_^s!d2I3W7||f7CO> z6sa0@UMR`Ia9kZbK6umHnVfT`q3Oe=)Ct2kgWg%%x@bAXnRrrQ-I=Sd`= zKjTBS;%o_8e3hJRm=@bJQ0{1gvAh3bJxVpgu+8qK`p!+VD!wrmbd!olae+(C$N`u3 zTk~}yf|K3PNlqIsv zC=*Hu90nRz4&?<11G_TpE390q{}^L3w*B!{&an_Z$TRYR6#dp%GhBDz79M+|)#oF<1j3qpDeU zk9Q7!K~@|^QV|gUQ0cU1FTYXs;zD!+5PHQUq}Y0hv0%>ulvjR20JDG&fuG?dir*)(wdooJxW@^Dj?K?45@r;G(16KsG#T>&DYzuy7j)ozHXIswgFr zF^VCWcXcZ<2ng`UE8j|?y1^>jJp4!T>1p7xcVw%F@hIR9%a{rsnI}4t>`Gz7N2`uB z5**cd8e^iNM)fx5oqD;Iex)ftOC+w#4xKW~u)u+bR@cznKPMC`8oNF8ZIS`JfKnsoN{OWkF5>eJuB5l)sOzd~&VJr(x znu)mxP($Z!O#i&|pcFVC7FEVvrCs9_NQ8OKCN@%b!2S*GO4v<|F#0bI8=ADWXdtjY zRDd6lNE6Z3Fx-?1O(eU@(VgxTnd&a)9?@dUG6V*c!zdFi7n=tHJ;Znn1e!5!EDtew zL=64PEm4AUuviW<3?a@L22i(hsEcZeS4tU?6Eg3mHriBj_VhjC*Q)iU(*uO{*4}Tb zuGpZf_Qa$LWe^q^oY@(qrk731j5fWJ5git;XWJA9r!5ISt$si{ypBO>6P3SRe@u-Q z1>;sW5d;KD0*N#iPCqf|8!K8;h6yraRwTq>Q1ehuhAKBC+Z!UOZ}Q{@k*$l_>+)3i zC;AensC{{8rR3>~!qn~3gX<)gJc33Kd?VGF@&`Y`h-WN8>z5|Ib(8&9hwtZbICTCW zvPf_gi8I#b=lIAOED!*SZ_V}dqrZC3X$SOX+YZwr!-K^~Mu?%IhYa-a3GGtvUJajn z+X%v;Fqat;p1`W>o?`)EHq>`XKNh^Da#5G)^vkDxKy^g0CQ=$(MieG#OC@5Vqz#3;Ou@5hu#58LPq4_Kd%&2zJ^(qTLiE3Z zjr!D)Hzz!7+b=bAmTRZn@L3lZULuD4#nwvEXoS*mGOHg{)yF=20~gd?RT<@Rzx?>n zYXHoT=SRK=gr8pHe%h4?TJyfnd^0hF3GDEOC`=Ku^sBX899qCVJUf~U;gdLKP{IY@ zx4ksjtth55K~>8j@l60}+Y(gco=ud-xl5P4YP{6hPJoTXTV>Z)ic#OQJ-6VVv+_>* z2x9&JkjQBj)uCrwsUSR?68+p=uxBqB53Jz?5_G z=)f~#(FMB(O?Nz*l!E34SARTpdf|rNltZTlI;8eUIds85SNNh6$Be=D@`VcR!b<=M zT0!C=Rn7&7zrV%aUtGecUjmz3Om})`&(wq9%f@%P^XF+2G6C3Qc9Xx~M~`!HKvZXr zCCvaS_q+7Zv!@0SgGMb)yg?O$l9P~DGAMO}(wLr&1nFBl0Mm_mE4}wFaz$@e!JNxc z^0;}oNC#^_wKtBe!Ae$zP%_iC9!Yr*3)|JtMCz~4Z{&$1=rfh4^)oLVPOm6h8TFW0 z?=3&d;1oJme;<)vQ)me)E_3(HBFWaO7y8ijHsQ&1CjY3E3hvqFjkzpZtnj$pX1%O3 zE9Fs{jOb@^4$Nc)izfwAddaNV{7g^55s3NP@7roM-SY`)x0H}7)TbsAQk zAuoTmWjb|&D3aI;L2Zr+V^y&%R!;b5jb(#EPiDU+OdP;eQ$HrdnUgLYR8iMxxv41g zenXG#4eg0L9F-v+X|MqLU`-=T-;Aw*5S6!fQ&z zC^g|o4{nhRZpV18_S&7SwqMF7lFWsJZ@{^^Bq9l5Q zAj*+PqyjN>>e@+k0XFO7`}Ubn?3rt+EdiU1ogX1^1SR|dzytVUSvJ!aAlD;r_I_qZ zFbSRPWqR*GK_-4Ta-MO}xhsr3yo|#bRbYdND$J_QFVz5i0}+ECOIwQ4iaJFCXuqrN zm{_|a20UxaM7l9OoE&zRiT3)o#V&PXh95-t2Zf{(Q`mkV1TP2sn5fYV_$?lGAL{1u zMWww|R8f#4ymQFkK|a9xBQBsRoWMuV5{1PndU{vBmqR9Lhj93g#iYjYeN>SbmsEo) zh>B*)7jPSuDP18BVw8-q6*PQ)9ukZ57>$f!plUB43oGdYFRFjzaBD2!ncj4CGn(RBK1MG`9#Plx;bi9F0?cQSyKStPWgq zxUNL%CFp`Z$_o0jELZRT$7=u09dw^;4^|eOHAOh(J64r;OirO^7`KtM_CdGc#dg?4)X`s9c4Z;(_%5?|C z?EJzlo&iy>J!~j6lJi$4c*-&4>k z#8{Cc;em@iPpfPzlXjHfqeeEx2^26>I&TaikMSGM;`;FH z1P~BEnt{(1Ugup(k!9^p=cJ9e{KeV=K#4}uon`N^_Bv{!P+H!qa;2qGJ-g}6o$s4e1zt0`0{FE|Pa1btxv=V9FkN3F{|cF}MvQz1`4>1$vB! z`#{E@>Gm|uMJJ!)!3m04QyI8*T)X4>{GLi6(ZBb^dIj6iwTG`P$X=_9BTOV&wb$+q zlspazT2U+5e#OGLm6mHiWQ`1hc{)k@M^c|Nx(1GHgy$LL40~Iqo2^&owR(a~L`epF z;hE}rMc2@Zt}?dL3JckxUy&AlvPk1{Ky3pv%^J?79d^9O0rG9{8_o0yBFh+1`44uo zw%x^x+6i!?)FkW=VDUO{Wt*P9^1a(twZST*6T5N9tz5Q_L5mmtT&srC=v6u^cgGacp78Y zzIe5ANJW6k0SH~z@Zgzz=8Jy z5}*sH(6vUG%YCkdJoiMt_PSp)zCHJ#08chLel>8&myfx_%wai6O9P+_Wr{0toB!ig zQ^ezUwKoi?!P}|Gia$R;GlUmFCNUWCM#cObA*c(@k zy`tn)P)=sc0{|?Q-}{8CNEcvJSEt%r&+ZwpNydY|!@GgTA%Is8`@N8=uwK*NfvYlR zR{!v|a79;>k=5K`iz5gmE@bPji%sm)d5_;d7%qOru=XXk%SyP?$a?$cK-}1$J9ifL zmepInir*o+l5A`pS3sxJ`9cI8Jdxozh7?`@J@Df}9;^7iz+JOmPi8CQ9BVX@f#`{` z+&Wd1EC>`Z!YF|VVh;4ZrXUkln8v&jvxiFsu^^pFN2r+3$j4FN4ORB~5ZvXaA!oQg zk0JAOpQbn7bO*IQ0g@l1ll!dW8P?zY;?$%N?DxdZ-X4oER(&d80Fyd7JZ$W2CC?sO zeLPkmA39?d-EfA>x=+0w%y%JmmzK~ZV-y?5lA*FVOF-CJZl;d6_AS6_k zpUwj^LY)$c%BTwExhAEaJ+^rUaBa!3QB)IZ!O0Tm`yLhtLx$*keS!P?{v8Za7A;H# zZvh=TcH^5SUVx}~?_;ym8|?OpwXNvepJ3Q4M3>4Zpf?jJ`Ps zc>w1`R!*CX^W1@PT7l=#4nDFzUkeo;9W7-k>#k0}!is(&b-WM5?7G@`w)mxBzKmZQ zy>JZb1wTY!E@Ms7n+2B{L{;T>v`VF%y9FMF5lk?XNDyj?QpAthOxYyBR1?3Sx9DXj zgPxQf`eL+vv7I%N+7G(MZPp}gkH8ds^6%eZ4x#0E!>x@U7iC#)xVo)>tUpBYKASN> z>3=a2QA}Hc-Zs+{+23Sbwfa@zNoD=dlb1+QkmvYg?-q@{EcM$HTX$r$6{A$t@|6o& zan<66yQr#Vl0x4$k<{f)PXr(I*scoqCTnVnCYrTzNB7e#9nrSMk?PRP8noqT3JFu# zRc5{U>_k|Ac{J0jz40- z-8N`}H7Ip5PHhIMvJ~YSboe#QIHjBzdExM5G$<>=>snNlCO>XbH&zA`Rbzt;nM#(z zRMI3+=3q4lc4Ugj*6vhBR-J6R41rl!h_}!^-7s79{fl3~ryvdk$+Yf(@|9OCbz4kfJRgeJ!HB zSP(s*$IJU3Jw^cFR!IV7Wwl8F1A6N5nkX?eOkqUYKT`O&iR&5}Ohg}7<3qYZUDFA8 zqg|o@)m%}}{q?D7t>lxyP6=cp=^<0La4H;7A02s}UC@qAZ1QyaK6@K(gUm1U_kGcI z2r*FrSRtP7O7k>n9@mDCN6LVA8g?oSnCcuMWdu9YaFC%`mVS2NOcMjm*4TmsutOmG z7F*%5S5?-kV=Mz5=24bVq>pqh0|_+vVD;3rM!PvBQnkJSi|?%B?c!zEq^_ zJ;!@DZbtS-7KYsn*zq?$4d%lK%X^nYmJ**nuf)Qqx`R&vJt#t*loFoCTiRM4+`JIh z06{kxRd=QTd*N(?15Ou&&~KbC#aCiPsoNQJ0`&D?khYZtAoI$-4qCwIrVprkZ4Pv@ zomV?SCv2;FNT@~9Y%x1ib)G33nCuIUrta%nKvBJ{<>eaSyDtYoKQ7ZX%xXxDr09y% z_b$AS`KqVL{}f2(wL>4QwI6W6Hz=RmD(tEAPHH<@(}vI2=rYR(iu9sz5B^?|m?k{! zA@_wPSHqNt#!d-W#YPI51_*3moa1DL{pkFCTrMt7N7hnYVh=~rYa{%tvzzY%4b1NiWWmH^E zkR9CJ-QC>@?(XjH?jg841b2s^!QCAOcNpB=5+K00v%7!psj05M-Sys_C)Ka3m;qbx z4+?g!&@z0Pko zSNjMt#86BMm9tskN@x9tRCMaezgT#0*~a5ENO`8+(0;(WD-((2TI!i3NX~WI3&p|9 zx~}X06U`@(0?;U1KTwT73NA$@+_zzOERn;8M1}}j0)4;Ptx`z;bebJ~$}Zzb zEK7A*WVPqTj~mI~*^gVn??ykgLJ}9R!aI&fZ%nDjMx#IXkflhEzQmJM7}0j8CN)|j z{Ocgy$ud-7&q|1~P0U9}?P~BvqD?_PE^;#XBtqhYkHSS0%h9w8mM&?$z;YY9S5t46K06LBT%cXjx^ z02fR5a!O+4a4Ni0HfZ$P=lZ&ZzkwlZxI1mm;By*c8)a(B+aGOHuONEojjwID&=jMA zAOS0qT$)s9$R68!weeoE9ufVsfKnDhhDqmi^o(3olodI&QGu_O1UbU-%pfRcyg*d*%X} zSXGYAd3_a#)!5GO7>2biO-zj!T>gockafh*F#Mm0Z`7IV|&jwtj=BrUlcbg z-C>3s&kER?nzolsYHY=-asofCn!SV9tF z0rp?8#X)rwq~O9!o8ntcw63+BaG!_kD&&% z#?FeN|DpJA|Nif{X?-d>q8NeUQ3qDON82|*3!5r$MJB5TD9u`@c0deBNROqcOUD>{Qk(7x{=1OY9shi1Z0&vxS!t2iBvM0<7&33W$w5VPWSD zd+4Q~1|5bb9jGkCa09JP_JnG^C*Xh6-0`Ekt9Fw6Ar##c%3s!HIgNHe^?>qtzTP0C z0m?BUP5O-86bVCfjY|!SX1PP|6>=6v4Cda#^yGsC8M@0c@_yLVTmMvQK}*ha?rd)LG?JS}87SG|p%+=vPc6~QmWMy@PTiC=t$9g3Yl!mqLn z-EKYp1D5ypw%&mYwSIiuXZ~lTFJ?DpB{cW0Yz4}0fO3eSff~pxM|ghFOx)x!(-+P% zU?M4Qo*>psV9|p`2yuObDpR#gGsKTLz6k?0=Ed93KDBd&2>?`AX5&AglhiUA7tnay zv^`893WJ~@jWzpj2i^0ZN{LjdgjV++{h(S86(_oj8#(Vf2nd}mcs~m>tL|(EkzRH2 zd(cZuB|tR(yvW>xhADBQ1r$CFWL{M5f3_bhtSNrAqV>6ly%ztyxr|x1gl$whG8AET zQH_ng|09_AUWj`AmN&<`drmriJwqo*q!~ zO_Gj4?yK*bNz7HxUw))KIt4Hu zr3f2m>s-vT1dWG8R|1Fx8+41svPWnBzlVB`?`R_ahmc%4h&SG9u`0O{{(;F= zv4gRVc|xMGM>h7AnvxEbYPdF}l*Ao6OWvmcp17@4^amd*9l6^XPI`Ya!Dyb%Mm!4d z3R~69;xzox`IjN6B43<|!zlS5{-wA$Cp!4!z%*90i6J!IBI-n(^U}1V6|(OI*a5nd zkoZKdn!j6Qpk<}BO9@z`#}aGqdhkrYc=Ct2q zSoPNvHHGzvn!j)(uY-nG#`qzejPao@*tJ38PsmFVWRFm$^1J=9O3f$A0J>25I1&-n zcovv4OqLcxKyW+uoKlLBW%>xrN6#R|&!}f+mSHmYynQHr7nKeVMZnm~O$e->iG}`7 zd>P{NlSDd~=d1Zj{loKz+ThFVXP=S`1gh<>(OmChl|oHIE)B`WY~FoZIzaj6tg_}> z1#z}iT~lNJ@s1rrP;QCOpSI!5!=9o{-z3i&*KtlopF=Nvk**DaDg^I}WeGF6Yw_p0 zuaZv>XWHYiK?(L9_#n`$boPKJi6R<@+Cdv3a?~-`hY>TBcwQ~)7XI*b^cIrpIfZAxxMQ34?y9pE z>VgYmniTghJ{2Lhc0ik<#M=1LRFp^dSjYGx$=LT~_ZYAl2x@@qK_=KEZ9zGYG>xIi zz*sLnrnWs&7(va|Mi74=2ub}*x_8?oP=p*fsm>+O}9Sey4{5W%ZtoAdNIvUUTAf=F7Db0ktHpl9()P2ECH)9 zu}6MSTKt6n(y$^gG*^nH|6esTtM;lATNuEiNDdDWwT`y{o8)c4sRE1o@riH3pKfGy z+tk^r?%`Z=eUv0>Yszk zN)Yx?*Zx25&d?i>99~Gs)2UlQ6A0%`sa(@{?MjwUVj(2GfH8SP`6AxG5L;T?TCA>{ z`<;FWR(()7iuWI@efyx=BBkss>=4WM3+Nw|KRy2ICb{4$@XC?2;~Jrcq>j)KcaQ_9 zmVzuFcljIFmN@2$zf{kwnzo&1`P*k)mV|kxYRC7~DQhhymK)d=8tZ_=gQWd0E5=8!|;! zN0JZU(>{GR6Pe_%jCtNV0l4YUs!DshDOtZqXt_{&Q*CdW4GbPQowO^~1zXcvHA1SY z2OiBqm6v&cJB`Id$=oh}pgy+QAYbxPJ$kvI4+Ri0Te+TK3L%=IK9jyD4wAmiq?!J` zcZpI~9&{8Hu94fcP0UNeyed{$QveW`_HRWu8_0`jFl zx6oQv)0X#`XIDF2Id1R5NlvIu*H`0y2jbM?UbNsuSr|P@49NM4*H(0s3H{xo? z7gg(L`@t2~Ey1WTHqS(?$oAl58ep@n&hm0TVWKe$e_QXzXVjsQY296AH_*jx`(kt4 zu;(0wC$KMq_rm!6+AX~E;Haf`f@7BeBs=S{^b)V`fg$CU2Z%h z^|C+n`i#^bd%0NjVvo!Gq)>ldF8A9qM~C$Dn)7qiBzP|D4H9SfSN>|c?@i?@)VDx{ z2Zr{6!wq%i_w(eRD_OqInyY2suGX2iDt{UHYtZfO%J?ez0S?V2=Z~nk#q%(~Cx(4E zLY1S)5mBV*j)o6MBckF!Q+sGr`WgJ|#yG-8lH}Kh^y7yO`XGy!&Q33sC(UYV;m(#I zNttJcNUZKF!=%&u5$A-#ITjqZt1A7%5(i5$GLHKODfoHD^EjLU4cT|1*cn1yr4Rwf zWD3$8RWAvlhKs($Gfc^oaFDDE{TWx{x=la0N#3UDI;$2^K|=r^ZO8y=Io9Zu5N9SY zFy}om$h4Jym>y@wATXyr@SB4%gvMh7goe_q1rVXn^bSvf_(d<3J5tgeBx#5Qq2w2n z*%e-mvIxx+8vd@!;wP<&ElGm{G$Z;ik6b~Mn!WyGIH~4bON2)ht}B82rjll9A1P>PG?=JoI`#rZkGQrrG<-jRoj6flZ4O52sXVgI95pj z7Y-KuOL62PehDZJp*g09Pg;lKzeNTIzA=~@Jzm`^jXg1kP&**ZCVV7>pDmBPXm+ozC0X8UvoK*)YCI_w3d){K~r3R@qe%ee*)fyf}0>(TG3)t)!I< zsxuuh%V~5tQR?dzLUQ)Bw`{lEq$}K5rPH1mh=rNlpG7J!fx1+*{iTU6cg0A8PYEr> zy9KW_+Ng6sL{aV=o3d6n^hy#vB0v0TFfB}!$(^IZ#hwBs6%vSp;D_GRi(j?q1=ZX# z1UdX;yVhvuKjHT;DTS_%9Swz?a^w?)V5A;Iv_`+4-JB9Q(BV!_Nmhq|ug%6uJrKOt z_o3a}HcGp9w~K28RgBfueJAH2vqQw!W)ebf%#g&_ruw9QzJNdlqQZ}8xPZVWRNYm! zlWT+?^j<*V0+4vf?BSARc9rksl0@l+>E;?i?qxXuB6HlYMF??41iX$Kt``uP>^maZTs*XH#(bE1HN^}**Hh|C1|={Ex&Ot8-x z%$4r9eFQ|V@AU@Dseb>!V^nrX`P%qF*FF9LQ*j^GCxb}>kVXm!H2nX8P2>HDz%u58 zPL!ijLpqFj16KKiJHdxH>n_oQmm#Cj32(gQ6fV7vy!!}sh zPw^P|;d9>}CG@2E)IM48cClZdD)clnG%{oe*vT=??U22ly@Pd4-N`9J0fE3oJbo^{ zyr5ICr0WU;MyKA@1K`I(FUerR+v2`+n$T0;kRc@492tbW5Bym3a|{uBiXYl0xt&FW zbwvaBVDpOyt6Bo`!00(-NP0Wl2;&;q$@Pr~#0c&I>@@~cHSgD>`JQ%!bs&QqaC)6X zyur$f2c0P}?%zOx$r3wu3*K`4d%z9={qn%B+4Ne2U9#?V2BVhi4{$&1UYJAR$E4pC z*k;`C9~h^5Bf&he4>}jXk6}Ne(So>la`v4wgr2SrZ_s^DC&mmJd{6mae5MQhqdMF!fXpL?a-#(TQ5{V&LR|BPawovv zCtS|m97ER_ve#uO!||4v}O z1fC&?p_BnV`;e3nRpb%q4#gJOHUJ6ust9M8cR;(j^uQa*965XZ*^$F;8Opzq_A^O? zIwI47M03CH$|>CvUdKKXseed8p2;vo+;KUE4dJdrj`(YYV?l9Bu0^sauE@ld z-DV*lU!CSk9p=Q}TptV~?HK~$7=g?K{X+_jC#x_2kW={hd(wwtJ*F0{t0f&;Bb zmo{9He^^CaRxy{n#zPbV<(WNeySJVhg7c)x}TY$HI$ET9P;n9?%IDnrI&H;1`aUM^8Cj=Vbraf@Jbsvlxw*uI>g+ewXBzELHK~t-ABR|bjmxUQkk*O zbv@->LC<1itONY{slaF%pVfVeK_%d?S@bq{XPID_P=`;2+n25pFnv>pV7T3Qoy4=e zBg2y3X7RhF$v}nD@~NgxqQ+c(MqZ2PbXOKh95(*^b^A;1zV0Z$s8!hic}R@`AvCH}adUw#!(g4TP_$!!MP(e9%AVlG zu{6iNw93BJh8yt5t?aKk{6C4TM~?m-(iSWR73v_A$iu;L_I8#2?+f+=M$cva_)-=8 zH66x07gg5v7`n_%QH}+iK9Oja-kP9jxj#3Xd~oTb;F?UK%FDDUW9-Vy-1Rp8)4EA8 zug@SZf6MT%Q)LVR7!0e1xN6GSgkO}o2KtjmIEyj~yUNfje=Rje|MdQQcyJfnSL?Az zNJ*sCbh>l6m|fM-CYG$4tK&)6XK690)c;87u5kMCPMuh%G+~m+$w29;zOR0|!ojN1 zrZgf=uS=$(Islvwa(pwh^41LYFq&=q^UTnZ-qTpf$}IYID4b~IJlePPTtB%%*NIJp&mK>NX+tGF9 zk3<$YYpja<7$tYXoOH6(1r)Su*2|xNp<%8H)>kPQ)4tFowY|zA;sLHFmTof?os<_g za=Ee~Z6hsf%gGTum{E8WO0wUT=jgsLWQRdUiP}L`@TIQM_1L zGH|Rgx$;tQyc&4n^2K~*Fa^rjEY~dqoz7k^GI-tRw`{8ng?1&feq6Mo|G8#qZ|JYn z04f_4WvC!}Gt`ULoOFMo3bt)uJl`<8Og&#_Si8oUHKZ>ev*u0)sfZM~8)sLda;><`Uh}A5imaNO zBq(brn~$~?Yr1~nVUWF;X%0WoWJ%s!(y*G z994Nr8gA2JN!lZ%Gfg_s$Et6g)?>ZZ9vKAXb!lTv3}4REoB*sWWc8jp$|{05 zPjS|W85vBbBJ#`W;Eb72rztPbUMB_qI?V>|G~dmx9Ik5Cdz|x<)_0tf{a>h+<#UVE zxJ53+=$LK_l57dq#jEB8j|A&R7`%ncj`S0Bay>i*&q-zk0~_Xb98VU0o<@+h-j35gymWWMi>yPyL*yK?@zFiE=Z+|UlwVf zIB!sZGt@I^SimII^BDkiN65E?aZ6IzCvJ30QsJMV1`SiQ0v8d17zp`PMEtVc{1deK zM;QDQjQp}xZb?e~vW)x_lx|5<`@~spNw#iD%!2|AfV1kb4)mF^uI>FD@xiXW!LH5y z9kIc#A0eLq0JdEbo=)MOjYD05A)ZfwGtiLX26(`$FN1NZ5klz<9 zbGx~4ft&a{2>5*o`1x>viIDku$oYZD`8~)$7FZw&ED!}2s0@213IY6t0p7p>MPSc( zA%MFuz&WrS>6ryMqlEy9gmpNN)q@kd@+|1?oQoPkP(+|h{2#!ZwGb- zQ*GMnn7A0mNIW&Qh%jOt6Z9i@FSjT&_z_urLnQW)2R?p2)={xjI07AYWIDef&*o&N z`ixCvyzaRb$NDCdOa7SpHS12k5jGGAzoAz{hYjShBAB^JwOqgVA=QmpzY4k{{FB!0 zbCG(HvrTY2=Qe9t7Rbdtv^~H#!U`hY&7;6`wFmdF=@7e}Yl3!7y`4*ec8!)JI7(qU zK_}69$vc1-jV#uKB=pn}FvK7GookG1iPeLrr@8zPJRPgI);!HLIT?&7Q3xODc z2GBRRN)P?hP2Ep|A>S?1M+%3Rv~M_N!T6wUFbuIHa-FKXsV^=jE~q!;&94zj@}qfd zfrWs5sr{{!t2YxvW~-g-FUOLP6qLq1W^NV;GAz{%gnGfX&w@go(CRGCzO=TD0otPJ zpw2f5aMW-pt6a`_x?_xGlE|@Pv)Ogx7Z9u`Ate?O@Ou4-ARk8aVd4&326E_5@lnmF>X%s7m(E1b<9_dSl!I*z)mNE;MpkL+O1)x0d0Pp`cs+{fs# z?w<8UY|-fNsKJTjhmj^@Y4{11`wE%_pj`(DmDAO4nz@O8`HhLKaPH(pmS06)K~ag6 zk&%t0B6H6IM&V`4CmzlrhvZl(Bx6?8Mq^L_{9(ti#E>cB055zoOi1iOfDkbN0%5-d z4u*LU4wicmLV+z&I5b29T|x>F2Tdy$N-sIuDJ6xWm7P%SA%%shljf#T z3aKc}u^0iMB4FH+P7Y5j7#!!dGp{1%NUW|zN zNu8fjJ&38Q#BCnRq++y>K#y!C2BlZLA%?BaF;k%L83T*;@WWNs7O-6`;JvN6qwk8A zm7T>3Juh567Ov9^SK@~z2+`R47Zfhr3-?QmiX5x_u`q+e1RJrJ^)PZvrHM0(T8_%D zZq&?H-6q{ePlqnb{*T4lTvU45^47u7V!CAXY4{vL7>alVMt=M}-NcBv#C52!7^du< zQsD+?=vFLLBvw;F%~37h5eDM4fgUO%A<#!l?f@8TzF`9I&1n?AP_PV|5rkMz`5BU| zHg5y8n6pW_*dp%M961eQ+{qjLi9>&V*~B^UyUMW0EhBC35jYAV%=rrv3s zAx~v&4xK{f0F3a=(sGG!kt7*71UG{0vH;cS=C3dbs8DheA&~fH(NN^%5W>&JAuz9l zA+Y>nQ&8PB@=CcMfQWQDbTveY7bpBs+;=1xytMEwflU z+T5l=96Hu}Xlz){VhCn6r@HhC{Xtw-lIr0&Ruf^ju`JqqDE$zKP+W?X zEy@J=(S#6an(V_;B&>vo!+5L|2r6Wb=>&0D#Oi7GBV;bSa`HqZPb|vz!4yS2T4&yK zc7>UoY8OF_arIfq@$jysUDKjUqYS=Q5%&c-x<=fhHSbsgPmK6*1@>IL**TG&=e8s$)&=GbO8 zEiTPOuS4<`%V)eKhd)a#NKF66GW>rQQL(8$G3M@Rk-htRkD`2a-H=OwDfe*f&L)ux zI3vrLxvWhhy^kYR8XttZ>zIkHb7H3*J&z*;aIPm6e~OmP$a#$-$!eSMKT3QeC=Urn znfDks1Fy+Xq^Vlsb)0! zK5l&+gRtWA6O;{t0{Mo&xkFwV+CGN8y_``9ILP%?$qZJZ~ML4r#pOm#Xvm_f&eR1Gk4>WAyE^0F4 z7T;0!Ibn!r^g4948m=seL4#FOoWm^jJu%#zJh>)DhR{F>RY9Coc%vLooYj~-3$GIG z8iw5pA3?^xIqp3)wKxN*++q+PLBd=Bie_XEncvn)M(|VU9)6;X0uK7{DMcbiT*i(< z0F@$C4uL0sK{_m<9N@eG0U*7bM3gfK;p+^6T0|N|;()_90B}f=*s!;}D5C6hUVvr>}R7o%yTj? zH~h)t(1jI-3acS557V$?9|Yh}h4w&$ZQ$prIE6yeFqo=WCGGyQ;VLJ zinD2aB{<#?p6L``4serYdo<=HF?vZ@UVK^$2!`*~X1D!pqbOh5!3X#mh+M&mJhUBP z8)eWtcRPy?O%UeqcsI))-|-iS{OulhFNXpbZ2%hID;&JNkytc^EMbDTlx-M0d-foE# zQBtMtm*lg}4a0t&4G!x$KIR~3=xuDREa>Nj1WS?;>>@3y<}WQIEt0cSWWY(ZL5TAF#j%NsVZ=Dv-0 zYZktD(#&c~s5IcgA2oWIUAJlWcd0H`>Nb0VCg1s=^HYrLU{d~7Eq;UmQ-?O1m)G`L z%zk4mAtS7L;Sn$B&({OJQpQH`2W*RHoD!2_pnB!R=pgrt)jJN<@`|OdVuJrH)z1Qx zjX_*3^Q@mm1phUZg6rIx=qSGYink{9taGfvU3N734!GpFrR@dN0|I zT?Gr=>LSCl85c~BO8^L&*=(0Er(*8KJOhU?RjE68Pkfjzv&Qx&I~qv*HWM1JrZyMD zt6$4&U!7Zke>SO#Z%>8lx|DiaWmL?6iE(Cm`#l2pkG1Ts$7tXNH6Xj)*2 z%JdaTaLP-%2V`(v(8(~I;d{2{lQ8`>G4_!E>uNRh6VtliNFXP6S%KtR#%AY_P7>fB zIhh<%L2awi;)w+n96LP@YU6r=_|ey46sD$yP$En06FZ0zNNF+FpWU;`_}1CzLkvU7 zM(Kb_1BI?U?C~gd1+EG1stgT<8uh@;J;%-1j4Bm_6`9vuo}vKs_l#|eJ{igxh&Sk* zz2z2XF|;4&zvb^jNQe2f$5h^KT@bOp4dhvjs-o(^Z@=Q8H3X1Hna~`JYeq}B?PAjw z3ff4YQ1CuFEofB+J^xixKrlUxJHf2jQdU2#`OEyt{pfL@5qOiPS!-Stv9ZQYr#?QD zW4uZFT~t7Tplf=UkAhZXkLZRY@`tXx+rDjveYlfl0&8Zlgc9|%FVSl4cIyvNid?u> zKwTG+;8Aqkent)-<+2uoAGP)(W8xV^Vvv0;X-tO=Yt8B<#9ercI9hat&YM#qz|XdOFNCCe9f6r=Dgll#7v(SWd_zgR2ETFCunold4} zuV0jrTr}Z#44eX5T(6b2OUe$%@Lts=8!F#con<4;*od^LTus z;88fV!;>|wywo=LskDD4ucC+=l)S~-F9j)K4P&C3u=2#-XM|^|s!>T@>|0~w{a1Q= zf>$Hl7M`VP#m`9ETV6{!R13#ezW|uxb~LF>byU!M9Gb77#VQQGe?qv7peO%GI6QnG zK0U*$DX!rQR!J2PWrY7$Q>)Pw<{WHLf{|;V8C;p;=);Wh;8i0ZSw&eWD*g~t`p6wO zvw&AwWm>M2&3Sl%O@LcnD_l|QFmxGHrDGScz^$yhyuicCO!2Uxv3xZ(ZKc?y?#deO|ik&B<1{o1`kJ+eIU4$ULE zGC_#b^Ip*y^r=x{mn|0Ng_PyLAE~=Dz+Up?lVZwmF^w#0Re%BLyRlLzSv@_c!AfftW!hpfzKa8mHs{R zd&-dPe9n+;Rt_v#AUzst!IjXuVMlnWqkhbL=GDQ&{qW=99L_c#F|&tgak@0pEGoQT z>mWuLX$`TVS9V8NG=mW|O9MtVz6UDy35yJI76r8z0AXRQ>z7|%pr24$>o#Vo+b#2a zdIvWO$;o|TZ$-^Hee{vti5u=o1Nye&-ju|1?{WL_e#U6=xgnyE0nAjmPg-pWzZMN< zElvPTJu1ZrB+`0y0&%ju}xPW&U z64794WXg~Gq|kH-IiOis>Xmx6tOR#8z^b}O*b(S2$^}xJUcQH?$3%!+R)R! z>adyF4!#wzEH5rjd0nm^bjQgjoG!#to#@ac@-0;-yQN~7r0XN`&HNmD!_LW>Cl`kI zpQ4aXjY)1efMcc{;j*wA!2pC1BZOH^qVSkelQIKYPMuL@*)h?UVzYEX)A22>gW!q_ znaXmsAPYR(x94_~{1Z&qmiU&sLBpFv=AV9!Y`~?9n?C*-YS1Cr`Z3enJyWi?uZw@C zvSWKppY#Fu?2!3a?_3wZA{FS;D4%9|du>c#!@tMVJyW{(1gxe69d`0hkoVqn@lWu9 zPQmd%URQ5$$PXR#4i5IAfxe9L%g{hkZth8rpg1s!_z4Y<2|VuCo8}*(f==T-wVpD2 z_+?3YX$}sFJ@0YP4~gCH+auyVm7dnX*gLe11&;i|x*Fr1>4kTQ14NU^95l z6Feb8S7UJJ+Kxu>Fh?wlV*-`?&R{Hk_ye|_*{@HI_iTK?jf(f2*uMeGBm2(CcxS;w zh6JoY=NBKap8IJHJkfc-e_;CY?Xq}J<|7sqyfe8M+(|IaKFiXWK-vQ@SWbG-0b{1W z(D5Ph7C zC7!E0_^7giVD}G+tH5i(?nyL$Od;`})I)|OU{h#UIIzkBL<^3jV)W7sjtNBh8-km6 z4(lOUf$EnxsNh&_SO*-Kg9Sth<`BQE#6u6 ziF10qr_<35n3{jg5F8m+kLyrj1#--6(?Kl9ei=K5!k8wc>WR|b1hmJiM;rP;lGX5a zXzQiqNGQk0+1-o}U(&hUM$@&s^pPz8=p0-V;U-wS71Ogk(E1Uu_d5Palv&p~DOrZd zT?@_=wJ{T{PO~)=-2Bn?;-g&VGe-vBMM|sew9r#JMZlwfh!EZo5gjb=suPJHB>MX% z3Lb9UgOZdK-km+aooH08^x1XC@?;id1g=wI>)+!DBA$UXTvRPBI149y2s(C>;tv|` zfhsuJH9RVZhG%{H#Z(P4h|Zs#Vqkm^br*)CmNAGTC5Q_K5G=8g6n*Wx4jt672)lrv zhT>1IQe>-E4~L@sydvV_x?}7{7Pr4Q{JCT)yrnEFC3{M|z}L^1nbJ@C2Y!W&)Kp(g z9?u?O>b7(KZOp%;d|HS6pUquFdC!-zzgeQME?O3v`!56V1+r5viIZ#cu>Klvrn|0K z${)=(7SqU!9n&axx$N4gbJUk01CRSt0ESdu9nRbkQ(CK`BZ(}3L(sJ4?fE0f$-Y)r zsDZ1ev`AHiRT2%gNI=v*PK~D2?-GCgZKo5pBXZ&Zm)OPM#g>?6qyjb9#oZ_YyCS^u z?=v6t;iNnXH;L?&6xV2!Kt@GX5o*b)QP}XbdOP>qVv?haD?hc-O);p%G`l4;B)ixw z>0y85CtP-LfX2YBZq;Ach8$J03}pX3qosLU;IMSapdGkWtF(->lmf~K9S`p5re(%2 zSJ@S&go>|_x)&DaEH%-3e+HTYW3E!X#8NNvOhvpUBT#3rI|CanO`?VZLycs^6T*@x zu~E2&KHD7kG#$I9C?6yzG{UmZK=r6xwu?DL*OVmph0ZjKV@feCw-=qOYXK;?I+r+pYH? zO1|7VAaSWagOS!WIE}~z2PXMT z-G3|V)6nsW0hp^YOt}=Rzo4}FmZZLG?N;m5N?|8=r3E`127O-YMOl~-#z$qdJxMB$ z9>a)E^g0I4KA3|_{a49nJ88cykz?ByyB*aZOB{exV1DS9>7{YZRDpMJ`YUGodd-QD zaDP8UIn9LUHN@e{-+-e@i$k%CHLSHouMwa%cY1VqQ6Zyz{>R~BP+M~Wy=sV0HxB#t zGmEoGd9l>EMERoBdXYv(Nwahmjz+k+`Cgn!s3sC!qVjL$_O>>SMuV^qhZ6`c@2Xr% zWE7u}!HCo&b=hp<&!jkjEHuenC&>J!NivNj!_S6#T;8YJLVw6B99sSxU)XV~|2f;~ z^-YYNM{zet3l7feMj3r<2_A<)pvyfvl@&O<^F9Eg6gpxW%?{d%0bG-WI{_unV&U0G ziIF%*A1O zdid37SSm z!Mx+6@hFCucrUSUtzonC|CY;)HZ;dGnO}WcEj53~w(BKuidY9E$6{_DWysOton6wJ zIW5%~w}v}XYf{&GU%Bgkk1LUv?8~Vh;aQ;|sy$_pA@T9oM+mZbk9NM%t@~DKf$q)u zO-oE$V&Sr8gzG`!dP!U}mEHmas(x^gktIb5TYC@J`{hb7{<4M-!}97dyXpZkqD>-( zD${2XewFo7xw=|&T1J_W+cCeUl#$Cu0Z|E$Rb8(^n5QkCv+e5CkJiV2J*%dQTR|k! zu0P%Fg5}sHINPFy4^^OQdOBZcZLScc0siE&o3zGXhvRfVmu3<=>qGzU-Sa~P-wgX$ zT;!|*LIMHt&ug{;p4ZxHcVV>NdQp0j*d;$v1fNmXie%Bdb<2wQO3e`*)br4hc!30h z$oFMU@?Mgap1i7*aL4SR&2riKy5PBq)_zt@*rf*7gq6(5W+HD%c#7E#eaY%nA9c2c zL0YqR)P_(;@;sNvnlC9-dpz%|;5RK`weiZHB&r-62hW2=xKXYg-15{yO?b5=>rE-> zIF6P&>Fc8?uvv$c^)jHI5)a^mz zOuQE>6j`jMgK}*e1Knhop(y>&F|^(0Z8tn~e5eifctmV@UJSbZWk!iof+`)%EF9WZ z_($1#%|lhHy2a#~nc@>QhSxUu2uImoo8_7@u-%Jn*DL0^S2>BU3LB}v_4r+7FdD?4 zRzlUnFe^;;>$fv{GUF1WxEG_S5zrKJ&oQR>aK=vJSFm$X=AIr%M~pb_x7dHEPOq!$ zME`fZj9|5)lZhJQe_780yGWL~v1OT@m67u2{NZ_P6;D|~>U$>7xJVT@oU*HHZBNJ5 z!RtdI=?^JsVrwbkLNXsnODt?B!V^ITW8Kg9bMj=jPPEk5-Hg4k@OVm?ccQUeia+zC4<2z@*l}4& z5IiO-)mbl%<$eKE5efALCpT*2M5Uu8L~wpmscJ(9_-o>%%{!vR{ETb1CW2~k1@sst z<(N*5#)1v$W!$)srtL@`ZN?smEJjE1BkXvOq(?z@Y(vFC zV|XK*4|!EVa|#dcK0X0@D*F8=4d?px^b+%F^3rGptB>m*WrccjOo}Vtb`G;6nyqiO zk!l%=EB7CHd*oIczr~qnk6b~Ep7MF-I{x9fV`EbPZdrJOBXmriB>UUNrLU?=XWkv@ zSH~$vRC2afv-I7ucgeK35O1CV{KmN+4;I!?mxhLv3p)`Ct8pr6q~P)G_RwR&H6~|T z>hq+ujM$~El$-oot~JvPwq4WqE?FV(tfO~q*N3b-CQe4Yyor7D=}F`z-WWabTauLV z%(m(PXy$h~dvbksKCU?eQIPs2`9(^2N-Tll8QW^_GnsM*HS7yg|1)t&Z=kgaul-hc z)oBSIf@L@+>sv^q-PHpor?=Zh1sZ2RWzdp^e&L?)BC_$3~031ud|7`-$L@93ab z*qz_UL{IJJy%o*PCC%W+$UbT>C=wyA+STxLX+fF1WDs4-KnG0$>r7QSJ5qEH~?Z&GGdkE;sA#! z&lu{!{seOe%=d_NsFvsaz=da(F=`YsOVD4cZFfcK2Fc9+h9N{KW?9{$28gziY313N z@k2m@Cgka5T*624h_YURi^_q>x-iL=Z8Sf%Rv|UQk|IgMuT8Xd$Ci#Nj}w1ya4s*W zR%r%1;TSbi^msTRF3)MTD*vyZN4_eP`q16Hmd^PYD4G}jx_wW4@`pLcMw7?Vk>xiJ z1ziJV0{!8p9QT9xN)wGA^j70+yUpX)TLRohe}7d}oQt^aoO@A`FR%!6tHSAi(+ec^v{9=XJ3P$|TIn;v)1$pO0kAH!Atdc=~C)ORRaaar02$bybp&^>`jL*a#Hsw~gMh z=?Lf^dBkxd2!{A~%HotK7kSLFC-Ac|tZkc|!Mc|CZ-el&1h>5j3d9L}hd-0G(~5e) zAmN{|k+!K&H1A~|5q!VCfXCg|&+Z;IiRC9>!TJ7w+vvG!*hlj-Ei#ww+Pd~%&7oYQ z4E2?xL=UcU&%!C*sW&X4>CbyU2wDDDfZS2KARR_q+fiP;?RU?5MHk zN$NWI#QW?VrdT40X-*U5l?KcXuPT-&YSkgkcVyUpZa-Aa5E0sgv2{H{AxtUIIAs^@ zEyRl)B;4ok*1jlN>Fd1DsO8b4J|oHHpumM45oGE}TpJWd4TesRd$vhUh+F@ohLabe z`~!a)IYiPIscapU>W}Yusy8UiR6_B*8q6>H^t~@i-t%G|ZjeJhHOS&G5E5R(Ornvy z9rj!o55Kj{r;NYy-jE)LBK;qVv;Pa7w+|}oQ+tAOm-@o#NG95EiEYS-A=ji^q3%w} zOWohPg2F?<8br&prY$7tUTRzew zJ^V;%`fnL9K_cX#vljAvnYe|XBo)Gk`Ee)7}Jy9omB z_*WveUP1qgMPKv(ZWPLES~MC&+A`S^E&Y<;Oa1h!Bvcx6Z-`2Hc7J*Vja(a?Jv585 zX}g}nB7I@Q9{a^Ki7$XZbT;@09)k})x9-5=UjFD{5xc`Z163!?n@zKIHv&B`f} z|91Yh-8uBy98l%fNzS%F$ToJZxJj9Ck@NUP_9~1t9F3vGYV9JEcwJ&*ig8o-F0&w+ zrIEn&y}olzt+l5;8;Xq(v*AywzHRW7>S#1?C0!1?P;BQYu6*oY-AF?<_lY9(IdjWa zb+NTEGoqa>f||u;d6rngV?UcUYs9F}L>F;|4MN9x=GOh!!wZ{owgk(J}=uEL4I@ocDv0m9zjpQ`Cg zlmn#SeRtX82&ThLshh`}tpHq9r|9!N7QdsH?DFtu=)Pvki9q@8A9_+|T){URv9dPc z{#-J+z1v8xk%$oZxjLt}uSla891*<>k_!O>3i2pd5CpnFsNa)x!WmFP%`^Zg%#VX; z#X-ICsBNYA4(hiWA1H0`LgmNFdWYHE6>*`_eY-;6wZkx;L-;Gnk~YGP0{R)v=h1@rGEaE zquVVj?j%U_$m@jhd!5KR3JErw1?9@L%n^r$I!!nmi*?$o3IY*GsdfNjm*ORX#i%Y< z%pLg$xfoOqBgiZdn0C`2h7{GI2+1E?6@WU9f-jfNFoEF=n>99_4ntH$y1znUMH+}D z0s@*XX;vC&QmGIQMEIF<&fzp}d5;sWpURhMFW$NWtL6C;XM4zR_bOC>~9g{dTcg)}O%rqI~xiZ_@h2mZNcGmVowUBkF88M_80g8fG;{* zQLmXZv6e5I4^R+x;MXizQc(Q73!BN-3H6u4jZN0#A1d6~9B#EGSg2So56qGJmnk5K zvc@A6ynm{%zD~EtTK}f~8(prK_I@ABIPGVLb8NQjiaJ*ohgOQN=RA-CtOCrANg&po z8JA9m=kIplMk944u_to_KRaxC!j;K-p|>M!p~rgU*h6#p%hR2(LM>OY_y?Z)^hdPe z#c$o213-3Pf&WD*2}X#!#$RqqwfEuW$0nrHhlV$vsJxdfI|odO>tnf~ zAugf;s-zDGXIiKuO9VoKw&{XC*fL?E5_4ATf4+Ru+wOYPcgzqi>;0%TX5lebD+K5$ zq!(2C!?GLNG{(s5_b5;iv%yji`-5OhloNC$F~cpKB0?XZ(MWpAiK{Q8(p%(La%w2N zmvqXmM;BLDExJyDg!Qt6^qJ5KRt(!l17s6*jX$!D!t~YTZQ(8fvyCHX?)#*YIEoM( zb~)KNxfrAxh?o%GAf`UIBxx>Q-jtDiF?4a`DtiJXa&d}qv{uZgwh4(;0)t$W@49if zy38Mi-k5e@q+49x66jZPbi@6&Q&1gdr&m%>?N5BegsmN1c$0lVBf=-NNUHb*l2^fa zSQTM%h&S3@PAHVy#lknK)ayWcyIx-2E@R>Blzznplw6`S$u9lhpyY{LxA>MxOHmBp z^+M26TXUfA=LNVkb`xWO{dg!mC!E8MlUe=KE0habF_tPNkq8Kb2AmqU_)<*ecRhBj zVG*+k3XDl<0#k6usCOr6Wm3T;m1cQ0iBrArT`sJQc#Sg9IVzC@mSKSO4=WywSRV)q z%podS)s;brO;tKFA^gi~*Bjp$m!d&92#62_DThiF8D1J};uS#?e8TYxJ$g$<6>-+h z#TOk5Y6)$lRHeC*#)_5;3)u7_PugSavv#;6*BQ~=6?qBe1j7jsx!CUMaSiychV|C4 zrA&e?8VE_;+zPi?}_$^8nSa*$1Kh_Z*wlt-;;g#CY_V4LFX!=%QH6*y(gAJ6QOpA}7R9 z8rX=0UP6>jRUDcx8R6}Y2W^BijPR^eHP8*PA&w`G4yk>Xl7-xAuLvKXUD|4Kfz+jv zi!tIC7);5Xq`c>WcX;c?1(1y49m`e9Zfj)q_!Yp6T4 z)96!z;1&k)GI_P2XL@;Qw){3C*IFV+zi@@#^sChV(%-oiu!61dav^l|-5@`a!1w~k zaHXEi^4P5WWh<`OUhzysd8;J;a2sSD9;gd#xDy;lpAKJridqxkmr9&>P0L(V)feVf zcSiDfm^2a%hdfk7d>b9AeZ4JXoHZd594)0lzAWn2;OK|V3l%UjjH-uavqZGmkmB1##1>z5KNAhCYyc3ftB#xE<3!Ykc_!Sa_T%$8~ZX!k(?RQPEJ|a>H`dwS1@Kxk>YcDr=K&VyyT$R(&oP->Xyi^^i;Ls1!^4YhEyhqHE zpCNkTA}X^jUigU0vfT+UqW5G2+y)J( z$P&bnD6nhis0BuX);{$M9j#~se=|TLJiBJu62s1U43QJkZwenwdr@z^;C}ireq%Kxhs* zNL!Xb)lW^}w+2_WLM!Tko}c?*n9Sajw4?DR^R`6g3GabAMCvASpMCyW<58B=Ez+gY z6hGfh6Q&s{^iE$VWEFQPEt0;(_tCINzFf7$Bn#wW)W}i)5s~X^i}cMW3Z}?ZfC!{- zla0r^gtGff0><{u=mKR({vxgk=?^j>CH<0QQF&e$`Y3!)Npcf{?Z85}0kHFdwg5|# z>VWyx)RiFHpR0yfr2+xIwvEoAypn8ThXtuq9JL=hl&jZ8a>KH*=b>66;YA`TYo79T z?t>=bec$wdGNu6W0`|E!tu^xwwxqeb>OaBXrPD-rxui~dE+l%CR7R=Xeuw*;=mG89 zgCJt8F>>fxnMMOPej#`gFd*mmYlBzowcn<|vB6sUp_~v`ufZ)4e;^XGT{xmU*GwTc z62%M1t;Q!uGqvCWLSNeuAfy5ZeX!~i0icIAvUrhE--~$-sc)W6>!mIti>f7s15~%0 z*N24eX;($GoQ%o_NTfgDb`IKoyCuoGtMGyqIVA;BIX3(oLJ5vHCH%ZY}AYKWkYps0$uvsro#rs3% zMXQ|$41eIL=cDe;pwWJXXy89iz#$I)VA5HIb{| zFh?|EO$Y)Yr5vi25&$I(%H4&4+|jj`$4wRv9+jJewxrtfie78GqXG0Pq2Xob(?TR@ z9ycU*p7eVSpB)w;p0p8nnsWqnNDci9B~;_y@Od+mnn80~ ziY6*i(L3T|ZR9#X-zTw1hCh@M9`bGOdxIw6Q5J%81#{E%>PT^KIia&=;C z+;osS(qw64iyAT*z3Aj>m%z=2!J+s$okW9loAIcR!04G^_F4DxprHDOD+Tf(^*-PA zXX7-7-7%E2tx~^qoR#ZxNYyH>w4zwQY=iA=#sdDO$)h7Ue**c?mE|F&6`!n}5Kn61 z^Xxy-10;Ti+Knl~SD!{Iy)OFz{e-o|xVr8~eE{=LgYn(#NZw4l^l|ikdEf{&ln{u} z4Z;#3q|b`BOGfDip#}^xnAQ!-*IhtmECp62swj)B94L1cIMfz8TV6r#&REYWkStAje(OrGk@ zy1&reI^Sd8&@?%|$s>op8K{H)Uyy@C7N%9Ez3%y6pdhoB+_;EKyQ=+q-L^(az0kGx zBO|(VjZ(}bRSqC6uhn$Q%V9aBLU<7L+ti>o66+=&=fg!&!PncRxUo`bXqFJo4 zEaub21O!G6AG5Pb#%MrpST>PI_p8QlJe$qdv0oE&A;f;6$maCGW@cU_r2|D$@Lu1@ z2}}{%Gtv;ID+9THel}c1AmTd%U%iIcki;zFoF3aumgj~6jbkv!rnMSDsO?_$uIim- z8~I;{hVN>vJ<4b9g~e z;+HmJ1FKhIjKKx2|07O~2zRSjp|NvZtpFm+JR#}iic5)?J8byHD5a&3)U({YO z#99h$G>(;h&qp=UU73YeOmRTtxVTvc^jn{$yV+INw({`R0 zFMBO?<^v1h1FB(BBGILQ2xthQp!fr08T+VaPs;lJh4#L9sAb=&vnr-#Ty@brSw_qN z$)DsuJ%dxr$LtDQjXHhj)U1+`@j)#7CcOm5AwyjTc;MbUFjjG}XAal>t#)0r4)j%g z!n2x;^_T8jH{4!kIYIpcE#f}-?rNKJ-R(b|{+iN{fZ!&`B7762J``nj3T^sr z?A@y1Ja40=C3`r#m zK(1i+Q1jjAC15u#n)l|6Gr|j4F6tWrltDoo1t{I(c5I%?z-+>C^jTh;n7nPGY&_m* z<_Sawtc~Y$zR;1CdVNS~^U))0{Rx^;b4U(HrQ4JOlB~9-M?a^hLOFW^Vw6iuZ=*`P z@vm_?i)4}kj$inrvyMRQ>wkwZDb?OET`|8}MadJtXQ7G6Ju_V&&{x*_UC74%Qo_!-It_Gw(I9Wubjx-p@EzR$Mz;;j{) z@P|U3=Lp(Em4|r11v11iPV*ziY+4Y3UMU$(QH`AQqXndJ(*1yLG0)GbMs0W-#b*ox zT<;Xd`RGezf`PRX+!wZVSFSOOzi12C^sJKp$D{ERbD&|tM216?1UK7>d@Pzxu`0P4 z2%fSU&d`1i69u<8SJ|LV7M-i27M~L)j4W~kI^^hk7UdzUx)4nA6}KbRUoQDEyC z*+|1518t~DKs|CAM~OOHENkA*`KJ0 z(nfb@=QKi|xlav%uXL<)uR6DU^cW$6kJkG)4f_kryi&d(6r#!O$6HG)4nk;^W*2a7 zjD)so<4tLw*b9oQo>5AtJ>Ug>JVgJR@QVc~Hhgj_!lcG%ykyrB_W1+#pl$-sHSLql%FVRYSEsq|u@kkWFHsgb;^&wld@$;2RD)_FXqK-5ANQwZ}&TBa3_~C+hE3+3*rE7=#5?d_@{w|!b;ha zuhRbe02JaZWAas67{pPZ@>Vs{UYVs|d@q~8=MO({jO{>3@8T+Ak6}3a(C#)U)NisU z%nZ?v9!m+?6tB(Zw=Z06hQhuk&#SC*1t={I7791B!+j|;QB_VD42#`NY?lcN8f**a z?Q!6%S#d@lB-F}EpyF{#SQh=^xp8#-(G$%q2>_XqF265oL7h7hfu~z~uzhPNTQ^_* z*0%M<6i=23{D*xeQ$%ze!Y8M(Gd7!@(ZsM;&^m@Umsb^>krT+t*65Hv%?ZQG-l|zi zt6k!a5VPK*M^MFXvv&(_x&Z#3IC3Y1!|EVC zBVh3m2n?Q(cm%TWgU5-&<(89t;gC_{K0vMWP|>;fo0mbj&OV;*1_|2ppwY`UC0jiE7fC_I!i;EG_bv037 z)rQ<$&TwYYUF%QB0YpljzIaavEO$Q!r)b^Ej*)}z|BzP0*=-dj&T4@Y2z^sZO>#cJ_+ru(+Ee%3dM1|TZOs# zd(H-|(vryY-~D5VZod~VHc^K$f2KZMelehqwYM}MkAc;GQ{P~;?v!}th{l+BtJnQ= z9Gf?r9=A(DTOUrQ|@k$_gE@Uh4R~ zh-PWE$|(zv_q7O_El*a=A-?BE$pTgOd$bu#v-z9v0{z|7!+Y(D#QIe|pXlV8d?glT zZSGqH05}?MOX_0suGk;|><-&yTFqjGuMcfS=f%wOwg|bNP>*B&3I3>$Po)Gz_HN&F z;E>%MONO0wd`$=W1arPr=Z`qI{6Og(Y0Cpn9bQr4wwg5+=NAvpB+C3dM%=~!ZF`!` zon^>dy@wSXXDW7?54CB8b>up<$ezA_lF=97dkp)8c-u^m;pjf;%6E1mR>^z#+eth>_>ch!Wy{_ zEizA@_t7Z5L}>5bPX_L?!&!&8bB6}>kXm6*HOu}5KNBAOb4S_Aa!B5FG;-*PgFC@0 zV&|f;;VVj%)xR&IOQkCq4vWJ<(nw>-eI11wLU_|u+4XOR>yWXffyc`T&QhfSM>rE| zcKyWv{z~d!|&O)Jpqr3@v zc78YGB?+$h1L_AW$hbGbvQNLRfDst!?vg?Yp`7WI?D{vub;z*Qz+ojscd4L)Bb*66 zIlp(~Who94rynGYnsaFCv+M)+Jb=`i5sWUxPDx&(sMmD6PcBwe>)E#fNEPIWC#ca3{DcPe?Eu%SYzU;(`FtC<7~U0D&bY^#Wy*$w(ie zfqCHU{$Pndk&G*}I;S?|239>(u~)(QoJUri0{oeT=pswL0PB<$mjYCTTf+KUwr8`8v!m8ue#XWY4uj91v%J zlZxDUUcvN(8CI5^_DXD0@nVZz9|=XxzzawmiNXg=7hUOV9BkaETCw0E<098mG6gFc zl_D$tmA##I`@2mUzGIf*`34!DYs&aM!Ez)3n=){H_4CZl=SXc_a#`hUHJv&YP_buGe~$Oh^L_^bt2n6LxhzHF8L4&?Ca?(s7C*Lk{wi}K$|Q>u@~=omM7~_a&Wrq z$Z>Pz<$`vc{7q-%-v|jjPsMDLu&Zc1pyHQ`*mDS|Em(%f({f=8qX632C<(-y!ua4X zwac7wi<6^zyOBzt85;A7|Lrv=B*ibtHu1@Hc9gWhIbWhTEC+xjt|MPl#m-h8jTk2b@>|=YPYfGHx_H}S?OMh{d;^dxvbBXBazVqsq zes-1m?w);kiRkja^YoT}dzJe5o_&3Z=={F({+137u+pF4Q`}%;AK@2W;c}i~rQhLG zA7Wx(;uoFba^7O4ALCQwH74r!`16BY>Wi%GlYF9^Oq@sg^{ZU!v#jj9e4@iloR|6a z(_HG?tnA}_qU%hY=lS*fT7S>MO16Gku~vO`M1N^-EpqQ?2Y< zeWGJcoY(sGb6x6tt?Yw+qKi$OC;RoAUFxH)?5lmEvrU|L`}MdUR{(|w}bO`OO3 z_3K^g^R4W1zmM7rIjmT9F&>$~X5dSVX$g>PQ%eB!_gr{S)=H9Z#sue*3Dwe4<4687 zK8OR;U_5YF!9Exd%l~V^=9!&%xoSZqLNFfor=I~7_ev{-l+OT=PfAVd;Jg0E{|>8U zazmD0XMAU*)pnKxD&tU;ivbLym8MFZSdDtHY+t34WA|bzGHhR@kek@+{}jCyR(v20 z!C?UCrE?W56gy+Gu^R~eraojUW$s=CNc5o~lc5>r;R_ z0qAc}mG}=lu-Oo7hvTse#Xma)aB?zLt+Qv5g1bX4UJ~OP_J90{J_Z?vsM&=lAMNSCU;U!MtLnFN_5lrduNG1efJL%EtVuHq;Nag+#aEAj2Cwt9yFztg+c@VkVHfx`ShwAw{!#sI`HSqmx1T~Xkx8Buo9Z32fP8r7e~9};s|nC^QTS6=zjo%ath~~)7W2KMvVssyu|=!c>34kfCjgJzdpKwXit! zgG!G;;f$9vr5&iQsW^4|b{}y42V~P7996ct$`<4&CbauPwI9(Ct$uP z1qL_x2?HI}0>&Iwam_n?gX@O{fj@a(7(V&pajRXgW{8cYfUrZnIFX)g zA$t*}Okf=jMd?hTWiS3h?K|pTsC_}*D>X0Fc~9L7HLs6)=ZQYT4aJy+ry&uL6E>Zj z@CzA}mj#+`FcykRMBZ^W>A7O6KX1&+R8u~M%^LY6`nYDj9+m0?2lNCCLn*32LXR>2 zY|w0BUfdP3&f6WQ;7m&i(8RWd<#)~RDd6Ue5FCO8U}~;o zXETHa6G@Eb0OJb`(iis&*}`0V2;X3={}8^xP-(0zm% zOOEbE&UZ*f^Aj?x@|rSRWd=?3GdAi8Iu*2N3klvaf@2>V0)h=H^!Yd=*9)f9NdWpS zhd4$bmuF3^uHb)HY)n8&D>g*(w}`9ZB5o-l8*>J(RaX#f$-ifu^ z#OAhi&e{(ZbX3DAb-2$Ume=Tl8%@Fo8b`T<@HtdjK^NTEG<=|86nD7KLzPwZ!A)aw zvH$zRQSI8TC)s{m8t0ak@e4`9HZTe|MEsQ|e*|LrIdBEg6HO@yoy;b{d21|N`-#k2 zPde+YxmzXrmhj3RplV~`oKm{pkbz_6FM0su?2lN#w+vp=y>0{BH=P z?pWlT;Yx3`B-T6>c56|O;ujo!KX5wq2I`p*ON%W6R;P@4p9DEzV&7Rz;U!u?*NkY2 zm23$yPfp5{6V^QC#dNN^-szH>kiHjXs=LX8{vL*rAXXp$T&L}gekI9bCIsan`G_Kb zCI!*^T3Yp%)|Tg5V^UB~0fZ&O2}S6Zh$kpPStKx_3}J!LbR{TDgj33pEhC;%fUrzt zLK(s$qG@`SMMTAmiHZ^t6Bi>QDu!a8BE?0Bh>D1bi5DRzCMsg0FQd#QfSpu9e}8>^ zegF9O_5Jbr{i{9$e^t@$EijoI9xG&_ph7{9hK7QUf{H#GDhdi3Dhd>|XlN*?QP5CO zQK6$pLx-pqozU57u&l6;-3a};CCYTI;Jzx}nB; z{J1E*u=s#5356gl;klJ{*|?|*%7`l3sqTMVG%uCL&IwKQhQ)lVUqbH7645hrcG7ef zr&u#mI6Yj18wsqPHX5N_-&^xru^&Kq(;uQeS$Q3*idUJ|O1H8CI+o)j2M_h4r%s5# zT%|uoW#kl%R+L@>1Tg`h;T-*}Fa!u4-qP!_sam&PqJJ(a`{z#+6aL%q`*U8;<&6Zb z5ba<4Rv`4e9Z;7dmPfO8oRQEtg-n?vy!qU`(j7$sKyW5N?g#MG&mcje>i1;Hj2f=| zm%EB3$cby$U7)=ijB>r@?TWjUrv87pYZvGMxG#cCs)RMx`BR3ezi#T+CfJ`RZmLE{ zKp^dmWa)nMit<`aZftX_)`e;~2D5u_Fwye+J3*~q+bLWjGikov1V}5fB7uswaOZ|) zH}b4Z*M3BAfQNSDPOZqoQxd@o%%Iy6d*9ZN-14Ms=@y7^c^-v9Mk1M=z6;x*YO_Cd zQXDJng8)#HUYXqSQFCAnlXi@=bFXPe%DCVOFoO$1sZjVGIRkDk7+{&@WmHAs6JS9N ztni?W3h_H&g%gF<%K$4|GjYZY?&PEy^=DXbH){_L?gdiutyiGH49Pam)C(KJg=7xs zST&q_ZjIsS6?f&jH#aB!2aUP$9a~6uh5|X@>QJMkCCpi77^xzEz&@;31D%M57W0nD z(SPGoxa0$k<}X#t-;|4X-qPIFnX?N}=W}Do2B;mMe-e0W7{F_vGz@Rj%x|JzAv0>ErlW4W%d0|7oV=gaRtQ82j&n!`SG+D#Vd!U>p7r%RnTMr3P{4SvaW z5&iq;rR0L}%YcDzC(-O-`c9yrL*Q#B1E4gZY4zL6DTToMg%B@S>V z9N?7%B?Gr;V~iIp_H0oKmD+PjlWDPSp?|Qi^!07xadCNW*P= zR)T5O*V@1zego+r0CCMVpcRwH3PKiAa-oWa{e*qFJ@rYyT2YI@I?&%(cu4NFeOt8Y{ z>)3fkSV$@bwKtNV=xW^(l%4TQY&H^PXrqJIjYSS2pQd=*5lRaGRfV~H0nfHcjr@N& zp0Zh@tt2kVicFqcKpa7>Z2eSiJIw0s2kw{elv(qmD%Oj$R14jMW{?AaiUE^=0FCM6 zjb$~WqqB+WKN7~}(mB7*Qxv24O+~;H$!$$;dgNQ9M-L>4w_S*_q4tt*_9D^nMGsav zs$Vep3orvlZ(y8P>rEmoKNp6{ViX5d+5%*5(fciif(rwTiw4@v^x~I6T|p1WK%wWP zk7){!wNPR~1T=($3#1Fe{kxWxztNc?#k!Qf+&yt061eYaE%6?q(+ zh#`vbWwXq@6HVmgR2#$%3S3@!&wg?Ye8c?tZhFv4wRbFi1@e;woXQ5%Ev?@q* zhjy}T{_vE`Y(7<%c``6y6d^OD398k33KeV#K0|n8@*L<8Z!3=i8~cQ6P&#Ag%tb4> z0lE@`h#zR6mj1i{XR(i8x#VElV3EA`n%@+7WShjYCh==u+mTY*adL(hL+rh@J;Lt(xojC~-=U+;nxVh5U@kmP6 zOrCj23t}<{8h%v8bA0Lp`t!sZWvsgCIRLFAY5?izPR4X_A5l0ewGfK+q4K_a=QA7I5ly5QM4zh4}qc zUkOftX}+8VzMyYz!9(?LlP;0$DQRHo730Ep^tE$%sHH-@dPJr72F3E_KgY`@4^i8w zf|QQB3xRm@g$o(6>I2)Q7=8(AW+bb8d&#_$j-tF}R<2Qs@IWSowRotz2d%8D>2OJD z7+Z+THVEW)n^C?;)R7GzH()y=PJTq#-+Lmx<;t?WRWzXwS#%J!)zBE$#!plz8QwF7 zN-0qxG;*I-OGHb4;7IeR8?uz*P4CVIvmk^ELM*%I{Z4P*pb`K?C(ob`WZUXcdoAaxMDJIs8y>ddu71f_#aVhKat(4~O}W^-p( z=kVVKwv0EFOW{6_W-XUGyuGHmTz#8_t&bBK*D~G0|ihY-w2{zyep1~KF<-RwA zOc5~8-)qjo>vdFkBo559m1btW%M*-m=tBBFU-7=>Tq|V@XVigNaGegyyLc*yPpX10 z1V%w7Fd>hAjN?-lOIp=d>20hbT^i((AW@s;^LPO$({Fo5Zf$*nzMQCHPe>=gfke^> zRRDUuUCXOUDy< zBK#2hECS#DWaijoCGI*Ug3eFzG`+xv4P6aC|qwR7Y+&8N|OI2DTJWUcczQz3OA*3^S~8iUo8%If!|`h zWnI8MZ8`L87==P;yKoulmX`5bR4Vjr8Y^g6?@MC6MPxpuQfTjU6*B4&xTHkXtA5*L zCWE9Wd9#^TAXj19PF!SZgE`?6g|2vlNr>{C?LJ5#IV}k$&IuY$-2R*z(MjrC4^nM7 z$kYK-L0!N$*0TsO3DW{;He2fVE@ErakZBnkYy2|T_s+D4a3g`o@ zd;F{6#ow(h!wk&kvHI{VP*+G+@3dhF73?~pLW%bDl=7|g6+Slc5d)U{3VFi8Un9?B zo$5ifBzW@`{k#8}d5mxlu1~hqk+c%J+^ab+wrjoSdo{KC!-^(sd2J%WuvM1SdNbSO zCaF!1a^GsG`euy+o7C|S4h8OEeCUHiX1pi2-~5P*d}kDYFv_tj1G3-M0yYqiz+462 z5kWK7dqmE-fsi7SAjtuPhF4L3Pd(2GSDa%O)Egy2F*QxPh= zvT+#Uf_omaOnSIN$mkHugS8WWE3zhVpCa~5B`_4AIV@IBZ-T@%=e?5ef0xY7-t4_! zHd;@bo{oqfY;NZPY7@N!4fczXcqFmeMR8v1*{tQsSC`UVS98O?X~4LWH5+9(jXA*ef?mhrMc{{Xo)&HlcLj;t|52K zflw=Hw_&LS1DH~9hSTMr3;P15XCMDbHFXgF@s;}+4{^)nYPT%47+uFf9<8QdoD=qa z{#K_Z%f+4wCH%1Vp>J)7`Y@DafjxR>*d{ixn^>~P!-q<}^@EH;u7B&pHCid|K0f@M z7b3Nr@UgfvrJ0-p0leB%1JsL(ok1m@t|Z%7ClGdeEH(XdY)5ul}mxZE+4BUW$o9TmC>{v9Oq7Cv81qr!>kOM+CVc!QNZ z$-&<~r8>s~=c~O9VSBrah@H2xT(Qn$zWeDZhuTgLSxMs^^zm`mOLeJUYjlQI!!@D*Prs zG@eieWLvT_tH@l3C(XP$JQo#NSu_MgyDiC|WSQ(Rtt26LV+v1A-^a6*p$ zd~!O+jGZmdfte$=#4P2gzpL#DqdD|F7@{N&(R6ac*vo<;}@8EDt!eXY>h%r>J2 zVr3$f%qD0P1o8{x5YspkKm!d}mdeuWx3l640Q*>xf(qyq5DyHE{(Wgq1PENi>W`#{ zvg1Wl_L-jPf23?=U36amfB!lC-1rFnxE(I8wY0SxYh_z!2$pNyKRBC<>!9BnMhkS7 z>VFmC@;s^_nlEn1lh+7Lj@@=dNOlL7mUh>f*Op^L6$#*fLhB|r5e>F>e(T#&SCrd3 z?f0*JH_RzZDEJ;m3vz$ikWyKz#~-Yt@Zn^ZH|q7wM09-$i$@hMjIXl_=4@ozUi{3e z;$>wTZ>&}wFYv`rIQ~i0?G}{xL2clR_i-?JWG@fk6)C~U!t985u^IT{DQeG7?f7bm zr9)FY)A-^F*e%eTxn}@}ddEAb`CaUio(XA601(Y2qv`x}UW_-Vo_TUeJ-~>Rl;C5e z;(Ucccv(P1|_@io8)>Id>TXctKguU&`-JUZMQR zmz%(6=(zkz0>rf~+`!Uh$7E+`MqSFAz;5mJmB@GB@M2+wH@ z69=K;LjSntM)Fl@sKqSd2rsWfXR7pPIGL3`IBW;SnZbF-!BBi$>fJz}H;z>j&gw&= zYuRmBjmO-J{!h>#SB_~cLyr?&o;<09I$%F)R7y+sWKW_jGfPFqZE}8~ljQPKwp6Q2 zsvk-&;`Tdfw2o6>WkLW!SE4{VE1fHfVj+x{KRLxYum)E4nG*R$eidL~ny80gP6APj z!c{rO<=HD9>0>5&)|*ErjdvxL;wgHR$W0p6NsnkmC8YRxVH|_46c0_}@$PyqO9)gh zsPLI3YV2#F!^cQ<;5e3GNlc|Uixz9A71YVpWx8BSBIa4d+UZ<;b63$|bRvmAz#_$= zm3*#z^8!)4ny36qM#b4ZA=Td@RuuxSvovL<0Rk(w5sL_ZcfSfYJ%i21n`xUWV4I(FS)Yv#` z*cP*@&JPWFChDr}4r4)VKcK}uiRd)8A>uLa_Zs;)Iw97Nh_KxFg6R}~9)b2?)7Rj3H7ypF&ym9VD}#W^6c(38(rW~` zD^a*3AJvyweoZ@&nUm+-k=a2_CXX$Tnq@7imBHju=$DB$*M~9kW`iUt;lpO*`&v8{ z?*%xL6{&=itryi9f)UscW^-r+7Re;XUmokY$izks0iDPY_JnUTN5OSJ%D=j-sSQ8j2`-tfIofL_zh(PGZj?=(O`-h|L7rr zl3I9JY6TMVZLZ1_qq(Ru9k?TlXS47ij6;g) zYUxN38soa<6bLf$Rg@I#Vz3?O#&|=wa$OfJ_EvfGJ4X1F2 zVXj|AI)a<`d}WgnT9zto+f$Ou>Y;Vm-?vYp`vVwR6)OZF*SIgI9NCg>@$BLs zmrvK?^n@q~4mdhW;QhOfxru)%tPwkT74MLK0U*=flqcxdTpq7M8Jkdg-~$^zF&?6@ zM)*x?_=wG88;??S6n&NPP!G6ksbyUBR4p|-nR7B()z8&2dB1d~KFtGB9zmJaD$@6kD7lA`Tn}BHwP# zw=(6ZV;fQil9Sfd6uTx|4XNw`Ah@ycB{SCp^sSAjVk=(+m%pHJ7Sfmav4QR_q{rp$ z!Q&Rqj$-F2uon+qPKsWEgo-Vw&(OiFe(`8Ywtf#TeSo8YiT%Km^a0WF5Xv1zdrzgK z&fr=jQNH%X!j%LX)FiqT7#~V0-v#a*ApjcS6HGVsIngyibUf5dJPO05;kuB-DQ>32 z-{aNX2y+wwxMVg}IK5Dx&5{&+V_wJl{7 zKH~FN;(E&coZYFhT0T%3g{|;FzpLl@@$e%{M+4cWxBX6j zi%b9!gd74-GS?lem$#Q{aS_9tbV;ty$N-fvQdgjD9x&v z)Y*~ESau7v6#yf!%-7)rpOE|Rv%jvEFUIVh6VgRh6EnZ4RgC&c#Y6PG3m*G}uTk+( zw-eA`UUDWi75z4}6=`gzqSG`)qVdtP+tKMk1rp$1OFG7`;b>z?bWbzm!T4)#{Ue0x z90=K!g4)2mq=Yk&UP)-)M)7drEHlXq&Jj|YuHp~)BG+B+_Nj8A6z_FFRQnW!0x@1* z4+L^?1o3cf#|X@T2nB4{{R~(HnLl*`HySy_kT$Kd6l2VuL2t$t@A7)&FzU=L@*xyQ z8(1JifL)?T_9+orEZ9!a`MZ;`$QrjwyUh(@*Y6I}@kvLO4QWV2ieiB^0Zke!4&o9{ zLkkDI3_3Z7@*z6SNB~N!?zFZ;TJ@9zt(2|id8nR3;@MmL$YE$FJU*ji+GH-!H0UlO z`f(6|Fgchi;PKhy`i8pj1Fx>#g91&!b_EYQ!{NZH8GqLR%!k~BDma@;!v6rW%OjUE zD~3rSKshqUSIeZWajE7pFdsq|XxBXyoO*vaFZt#+S|JP2D0aXT;2Dv-C#l>n=0lQC z?8&s?#H07SOkU_$&4Fs zmbFWUu-cgyc^w&eJ|uXv7~_EW zo1g75L51f-7KAqepAQMYv!XW)IDkHc1Zs0z;7Be)PKnTmI7xD2Nu%c38TQ9^j{)4B z1gc11qEs+m-J}C`Rse8B0B|oSuzrIvuA8_qaw~Js*ZCyu3g9;pme(oA$Ffflzy)hg z!626II&<&Y8~Rx9d6p|$xqz6xc7`Z0M&GO?WJ|fXlu}BWWD52PHVPIBl~${UarsoS zq*b2kF}$^QZvD~L+F~&}3_I#rZEN+lh#6fxl}04;rHjY9^UCdwXK!)&*sRJy>(a$j zWmZD$hvun_8BrE67mtL@p^FB*U|ckyl&>W#F=;OzN#m86K;$a`qEnaBb_c=IujoUa zpD!IQ8`i5Tv(8=RZwN2US{j#T7XUWei$;8A8qQrk{ZhVi#VlW_=jZIsw;xnv8;);R zB#Xk>#nUb^p8i4ksZE$)JXNM)rYiuJuL$(S^X=#6<5t6`dd!SS{#nAcUOD`^vDm0J zO6g@Dnq4$>xSC~%P4E^`E3dLeiV;Yj{1QZ#xWY2R9Q4VsC<3;x2|yj`RtI<}<(aCg z7X_Y<^vZ(+y1jb1Po_yEd-d?VcyUpnbtJ#b#=U5aE($mu>6hq7k8Q2G_3F<(jCrPV zhjq@Ytm=Hxu=uU(;;GlgV`V^5;K3n1bX5TAMC$!ZXcj~Wotg2IiCGXKbYLa~3K2Vk zp+X<&(64-L2{9*S$W7;{bI!JPA$QSGsQQqE4B3S)2{Ae?h89AIL5KC7udia1F?u@2 zKN%yWTmIsZ6emz!^PEPL66K$t_(M>Jd;y+QNC3n0ghKW58l{v`P8p@gSi8zAMi<3+ zT~S^*A53Y@?LDFNjIe=AM0CJP<>d4S$zyI{a5w6Ye7$_&hpwLYA(zf&i~5B&AsrnQWgC0Dw1M^pAH|y1{%LnFT21yvq)kB@L={e707PeLIp1sPj z?MM4NGkf{GJp0SllQD~n2WSenJ??mR78egY#CX`Uh&&U$@_m^R$cfwTkL1L8cz~Q> zsoQ}3kEQWs!=6A=pin7y7&k+NX!hJr| zr%y=hMFZL^y1i)Fi$-7a>T&-0VUq{E(3JIC6f;&x9=bE-O&x3Q$wssG=e;9#-ks=6U7nES51s``TF{_U8;fB}jR`9uMqN z9lvgVasB%BgAPJb@-KhCdmz7dSLhY-+N&t&%H7^(dIvKYnD2})Q2Ap3;r~2_b0GYk z>wfRe2}J$`V!j^^=ziV)-h1!4%{hOfMz0a0G4sqb-`5WyIw0hMfd2eBAfV5@^Jv5R z4aYloOW1(%n~);jxfJOS2q1j<{O}Hl9}ajR@}uNI1Mhz5@WTP`Hg|(h>|B7901c5s zf)&UjxD>`zXPTy#i8ZG9=r@Yk@)3v%Ic>73(K2x(J?FF*n=++OTP8ZUE47WB8Elyu zUCtfw#U@FRIA^3tl8XoFIxHPYuayMy1GU$7wW9AtnQcF#TJ6SD)VProb(DCfozz;_ zEL0*$`RbZlM99M5ow3Zz*sUyLdX=7l=hO_ke044cR%VdpEA-bhn4m{=+--%eSy+|b=T#P| zM^l9X`Jpu|Ji~AC#%G{=5=_gcmSu6G`+bZX(tFF3AukcEzQrF zQA#PLbRIuUpuFg%vzAE(2;{vHS(so*Zsd|*JU3A8ZS7ecJvi+KXNr$Fa(dXg!Ew$x z`YE*}$w#N@nie133N%5D;lY!Kj)F^yJijy2H8C&TIp>HNA&oAM9@^%GL+4SQix$}? z#J6yom+~=QV`AL7dyc_KAA^lP=e2O*L-R2nMDsD(cH@6&KBmf;%+y-FL35ALazqYX z#CQv@)HV;gJak5?BYr@S*a1AEh$CunBp!j};RQs6+aBZXExh*C6WhXz2Bgu@y2$FZ zE_T4j?V=2szJ>4jn5>j>Yd5XI6O?Q6?esC3x8{CmKE@rkX-`|LwzW#*RU@`MUp3}5 z>hG44l$A(+LOF4IAC;it4>4}VR2NT724sZ$T)3k&R9!Z%Xx{o#$p~Axu=HD$s&q(P5?90-5n(&7iv9rP z#yIK5)K@R`lgN7nAEKbs#AMr#{TQF|n^2GOoQ6Zl!op*m#$-T6xX)X-ix|H#F@G)eYb|l>`XyE+C@w{9wjk9@t<21PzpS=C-4847tFQQ*Xc*GnLTK-;aV`t$bfAJBvMQ7L}`t=vDE*mk+;Kc*X3;R@;@tnHBkdI+0 zJf~^^HkmOrXr>Lh+qftL~ z&1J)K&Y)Kp(-rWXqJbJdgmK6#zjn+lL!3paoo-?j>jVtN$-jK{6bzuefAUR}Zgvpfkpl)r{r%!K9=HSsaHG&ADLp~jegv(1HT~l2y`7AHJ zI=8`>KAl#lmk-R>47MgSE4y35n^#chEIcuqkfQw9NCW za)+dX6?930F!^mpc;x--(l+pj?@$*E44sS+!IQ4-=7^Gc{Vo_Q5w4U zA|0`rZ}7-Jm$1mzMjirH;WoiCAk2W6+?Ga!K;qcK#=??+FH38bwhn2XRMrKX0jQGxZlqjTX%fyz~5|nZoP!iYq6avYs@#6!f zo9JT?eFV7gsUBvipp=`m$WGMQ+e3{TCzR6ym$>pkNYGq&yg?KzRI!2-peL^;0tw+t zr(WZD98NpApgWkIeDL5_zMZ6%&Wc%nHb+^8H*>n_1mu}ckFpG%Gr1^Mc;ei=oB{pd z^1F-{v>A>HLot`+*X-09v@#!D>f4FR=cb+0`p{bBF(;p>z?&1w&gnRMI8lK&CsgBr zJc(2Y;e!u0xz8iZsNTL~bImAcRPL&*hTFkb)**JXSugqd6^syJO1T9oXLLtoPAd?hJ*Wb66}Eg8Ean$f&WX3=wv#3^zUPC< zl~77KBTM;qYVd$k8KJr+Uxg!IxkAf5xNs8!Njs62Ogro}rMU22KBd-ryEM}@DHf-b zDnv;+ji{xWSe`E)CYF~wN-B@qX+*7aU411e9xvXh5jMOlc#S7)WXgYx~PWt>7;xs7<4ZKHSc?xoL( z)$qB|+RR3qGorPo?PecfiRYRhwME_(7<9yS&g`g+z&Yn$Kicu)X`m`x8UlDuQDKVb zi>-aA8yw4!3Qu?lw{Rpz8ArDiGaxivp4ouJXU^h^fFa7a19_N+nW}F>zGh!}#B{XQ zICg5>2;CQDKZL5yaDI3&hzr;94adSD4wVUIgzzGj;)SDSrv^^W3Uct!bK0G_zG24K zg`;Js22M_lRHVQowJ8;dd=+)WXK&ZIhg3lFwO_mD!ZPZ^+K@x-Pq@K)t%eG%@WbaW zpHYcqx?l#BhC5QyHPKtR3l}-J4e5o$@EGn~dp0pL#{@?9!t(8svW*ndu5a3J+QVou z4ly4_EHapEL%n1-+ce+&%B*8jv+Y(vRNUz@mZD7yZzs8_g%Wn62IZl{2lqtM)aOVk zp=C|6gNF_uAWS{+g*oa<29^B@CEocIo;-ZQiSLUC2+guloT33wx^U)33F?RJ} z1?ltAW5}?(ot;jh$v?Nx`@s|(aio&Qxm!Ag5ZelLkQRUL)o`j%k>p?Ya{aZl1UTUz!7mq zh}a;g^bq6+AX8XW5J;)pP(e`XA;=FvAVks7Fj#S>GwkrIk^R%80B+*jAIxa5P&*=( zTv|k2C^MWXa&~TTrj$C8eAA5PoN>Acb7+jF7rc~GD!aaXeAJp|LU9K4h6o{q@q&(G z88o=PiW{Tr5+gmKAdL<=^TG1$0U-jq&dFASDt!K@3c43QuzWqit0=lJTrUG!!+kETIF4aM$XD)&56^~DdM}*7 z)Uo_w8pPzaGSri44;llhal${05K=T40q zINGN23cG2Uc86-Mp9E#O+sUTnChcjZgA1MdMxvS5*df_FrO8*0+@Vd#JAaKB&<-y2 zIkP@eq{nmy5Q*}9@t~vq$@foeqtvO)w##MooVo%P&liv5!ar1UMmr??1S7uv#`xHs zoP0Z~Yv9AK71^aSm2QG%xF|enC|r30Jg1<*&nYP!`3j{_1b#bdC(b$NoO8}O=bUrS zB~ik}iBrNwaiWT|;;=Mv;+#notk|$`pXa^P!p_V$In2ylT@>K-eUmKQq zzI;ZP0|DW()_&u1&H-tyfuP*yR0t#=b+C-qk#r5Gpn&qvJ4x3h!7?1r#Fo(vQ(AF1NM{);n#HQfP_2}$#&B6I zp-T)RmjQ+0I#b)g6AjB4Mc@3zv%jzn9pWL)ItM-A8Yi2mleElpZY4bP8VML~BWVls z@&y(!Rg748A!c;(H2oGaU2xHY3X%&hydX^huJE}n+(Ib1xQ0cD}x z4gjz(uFin4a5wl}ilGDN5MrKbhfeGjYLFDJoALyT5>eiJ5WZ)GQ$i$25I_9fNJPzo zC5Q(_Am)lVBdsz2Soi~w);MU&WoBk(W@cvI91%j^WmhtxgeNZ=jUJ`zlRlsH>fw6}Y7d{2T65AjAPrQ4 z8-0$Xl-l1qlG$e8l`2+hnMvvzc~d=Yi5nD3)7(iALLeBxGty1kyE z%K(DHZKn))Pd>+SGuYO{|4^bugg(@qL{-lZ#--Ih$ntW0dWWmN1sI)|i^Wyr94 zHfqheuQ10maf!`n%Rt-O^c}5Dj(%J7hC^jjiDg9pDF!aj{NTkf4A)gxP?hU^qb_6E zH5r`GCRlfxUPOEF|(6KEhbQ@CvO6tGObP zNF>TiE`sfJqS^71No2iqf(XWAwp|XBaeY}5Bcr((DhU*Z^JuN|9jEQ|a5RP@4;?i! zg2@ZUfAQcTfxAKnMn+pErjoq7L|M=gc!Hd;px>NO+TUwb@|zP%B=S&5OL37Cg2 zijM?aG(`fR4;NhNk5;eh=y{0(Q%97ALKn{kM;7xjg(oyanER{7%Tnc^@0cDtn;tq- zi7{j=wjmaV$iWDP$iWDP$ia|@-}Juf#>=)1yu*QAn3b5l0i`$Gj2|47%8!+$q73+n zZLSA9N!&;sUS64l^b*T>E~RusaJU_&jHJimX1E^k4$esb;M*q^BhH93;+Pb1txLkm z)KcB_=QP9*<+dN*1@RY<4X*n+t?a^rv{pIioVA>m$x*((TA$6WPP-;bkk+J>QWV4l zEFDqyLzd)8Q}*D-OpB74#D!SNNkxoCqbVJJjF;LjcZ2-WAf*hNqEZL@J#I}p^q(v4 z)!vP|CdMngYhXpuXs4ezkT$C1x~FtL6vGqf4Pjq5*a{aPKg`tHh3+Q~^HM2g&!qIB z^T3#CJQIgYd!Pkq$gQWYVap*FE%XlENQ#60l~pI3?TD_rW_ozV%1#=klxo2-70_PaoO6;| zo7qTaL0TBW5>QI5Z#{$LcId4G@0_J1n~^N%oU7T1XWDc4iET5Yul(Yws;ZHjQF1%9 zkEok56Q5=?^C1LBF(Jy3ASE}awf31`L&&S~Y;yRpjRshzyygUz{X@8rh zX;252Y2PS>QFLG%A1u@E<7FDpD7hpz1fR2J+x)3QN+~V+{HKapRny;-Qp%adkdIPI zX|}|APR~uqPZdpIEi^_H#{{Z@wK$#)59_{j9uwYZtx=SA%aN2?o{bywWFl!JT{PT~ zhjaU7IJhMzq;io9QKDGuMqCpB*4mkCh+NwTe$G3C>)s(T-2*UdcEdB4vsQV#k0H42 zeU)tsc=42LVz5TN;u=zGJz0yvH3nb}qiF@qIj6%=3t;VL2&gDg2bE3T73rm0k#7_P zAB1IG*@lDbzUtO++>9RF4k9gtmV;;7dvMiNsr+daaC>iA4js?1EO$9irZu-i zPgzx!)2Ls$n_+?aRhA>;i2J0&t=s2U;6bUbWFcMxj#yEkCWUgnmlYzjS;E;`E|s@U=!I|eUD%uw9|8i{da z7<#Co;Ne5>C!Gzu_yr$ywvjO)Iv=lH$MIwoeHoVY;+eKON~%X7PK*GDEC=ZEH_vr|Bouh}t=8Sos+wx{GHXrLLx_z$nxKynL3kAw3z{tECjT6E0m?gX zmr;ke0lb8H8IT)pbc#Kl#wY-+c)bj$4LAC0oyM5-Y}(1ROY3`cpND|wlo#Ic@alo| zVk75;DV{IOGY?*`it+K1JoB=b&+D9XhFn(hOjq`8xsl2UEAL-YWkH0{p)m~cK4&rN zoPDt1YFz^_kDg<~7%R0Fon(3R!3Ty*xIaF;3g2Sisc{2GggnLb%##NDcWRhOrPzI4 zSr8#~tV>74jVVfT$ECRTnK~lI03uPoPVp3jpCbq9$;2LVP{EOdWFr@*{Pf2KC11OV zr`UX&cE>WPceVj>8cq9lI?+@-Dg!~o8`2#;X)^Uhzix->oUesakM6Z ztZ=22PI8u~Jg25m;-_05s<4$E-CQ8@(sekV=^oVQyLhHs?B@yV)nX3IzB+3iHh`~O z+d1wId5f|bFU(;vzP@gLFNQWDdQSJAySy@`A^XEVkjsDY7aqvv?ky&|M3jm!>!B%< z{G8IV{<5wf%P+6)vNSH(Ic+0;$Q^ch2xEuYdi7j9m#glu%HzfJtV@e$+AFUnYq6ea zDzJQYmWn7!T_EBmbaAM&?VNt2H5~JzQ6t0AbIuus6TT}f0#OkRMB+rDZe%+(V2~K@ zb{|%O#GE)Bg^o(CgAw$E+m@R%#_6xU#*NmT<8)11?5H<(b2*iXq1smR75r9=7F@*j!y`y1yrt+aaOC(y^y--y}@q>3)$r`|4ui6;~G*~;c z=TsP|#E^99Rw^nfDX#nu&nYQ{&_|SLo0uq491CZ6QB2V`E?T(2Zp%b(ft6Y&dJJ}I zndl?zX6FZU;j0OGTq?VO0Af<3V z*dv1w)~Y8$>K3%~L7JsV3~eaGO?pF|cis6|ayM&l2};O>fBzgwg-*818aFp^P;ij) z(P@0VwHRq@F(?doD}D45yGc8-&*#!36)RfAj99>z2}Q7LoO>~xi}xv<^IvoF=d`r$BLzNC@T`v_K2BhQd%2Gi%*qFm%6fH0m-WyZ^g)7JU9TbQV+hf$Ij!AX zL2$Sh6(1vrFFuCcjjKEix&lUqi+_nYErac}45Ybw4{@X)~F#^+QQC>u>sml*Vh zE65F^pfRf7{|{h2#g3|{3VD>3>(A-7bP3C zhI_rp;W|zZPIV#Tq2K5zc@@G(%=&oQfHBpj$wy3nydnT|a2uqCdwIWHJU`qO*I%Af zU9|Akg^dy83_wgrI^he2s7I{CGwyN`!1#;1s|T123F|N3!;5|P#bqzsqvuo?GQ6{@ zn-Sf)X`{K(HSm?};9waK{u{bH)B!u>f!jmZM29un7(-s2uThV;{4;i!E51ewhbr$b zpP2Qa9^Lw>!tGIA9)ajr$858Hc}_p<@))DY>x@y9)%YWX#o)o;bIx3qb?MpZMI*u- z{tdUC*4xnQll@*O!WUvIF*SHYm4EeFYBiK=q$dLDL1c!+bAB?;-^)fBSr3hvwbsq3xbjTD4Lg{o`p@F`<$?5(7tYly|884T@INJK8m=V`D~*G!p{>xXoHcbc}{VO z;^TYI)cl;=S0y_LGj@m5rXlVEc&65B9kz3WGbhbX@aA;t8t2cUZzY(S+&&bxk0Dy+c#c`(RNm(N}i2=YCkr4FRz&aB6C z=-m!w<=6#=j%6@}FvCLRD5ZRlMoN{$DCLB7+DIo89?GkdI%u7&q;(Efl@)EytI)b2 zAmpoBJy!Q-#b!V2=6e-ZyQ*S+)+GV{DvK2xhJ2(l6ryCPFIdJ8_a1Oxd7!^?7CC!; z!C0quzsqa2hALL;u+v(_2?1-pTGcsgt3S*VxiDTM3=D=uwf5c@%<0_f^jVjW^y=5e zW7#?5jCQ{0BJ8n^^RiroAyF+5_01WI)zuUIs#lC&vejQ`H8ID-0<)KmSDOV^a-P9>hjtbhWAHuF z#Z!6K&Utb0&InK;lfsy&DS&v znAqGz`G%Q~d=4+3AMY!N!QxkzF*6VJzw8J6%KZzrS%*$D?qS{X>*7IPHmqBsoAYeQ zvZ}T6lJ>Hdhp-=)5B-n7TdhlJ=T0SjzHbg=$a&~?>JFPCv+ORTu zc?JuYp?FShVIqVf(ZllTqRq0LC!8)X8GX`wA28hO zIhBSiv~uzaB`G&Rfs#r?lq5vYsWd2gPFXR9KBv-<*ODcr1xrfH6^D}BEj7)g%3TCCI>eJfi+;;#8I!v(-|N{bP`I#;e=hbmXqW$BBH zR3#%d=|RzQ#MR#1zn6=rS&Nc)@exAU?S&VIU7l$eW+3t#ORceJgWCpkaB) ztA&wTvv{NuBdp{V3k*ie=-$eC^yNk?@mzxV(q;=vNk2yo5(Q+H+0G25PMLHJHd4h zUj{%$ljt?R=Mci~Ib(boa61I?&vPE+=cK68t86P@`Sa?z<=94pc!zD2r}O26yu*OJ zAfOl?3|`>c@K|sIIJ3{A; z{Se|CHVi_dgPOP|y-4K62;q+uclxsudqUp3_-|0zv|S=3a98LcA*r*ZZ~$Tn#fTvB zLx>?SojdK1lxG?a_edF#WXbXjr@!~QLsJLOx_*{as@%J@ zll*zP$$!Lft>+Y$BL7|{L-wXMR0sG9_^|izx})o&FwP+W1&t6ig&-q(galz`W@ct0 zK~(OJ)*Lf4zn`Ed?#5c)dC(N+I&$E+v6FLiYRx$$-yMX4pedxpz=aG(Ui1RE4WdlUc+l(tN6PMU~GkfRhr#t=db5dZ)H z000n~LDK+-dN1B9x4`#d*!qFBLDLv0lw+&*D^=UPH@b;25!Z$u~TmIFY9 z1+*u~@=41blmKEh3PRiA(82>1%T{bUynT){+=`_Dd4iAbw-(?b!}H}DPH!s5vX3Lz zR78pqF(fAOhX}<*DL)=AEaEqDud-tSOyALAl4&R!s#F{$4B3ummL%dv`U2YysT(}A z9U;u{(|NqYe@R|;;Nipi7cTKA;>^-^YD?9!Ka0W7XeNx1l^93pC32=T(KtFYjeKw& z0v@rrH7sd3%#YD9K6k4jX`K<*% z=m~+@)F`8?A)HWAXXT*N9Z;Mq0_tQi_7ZJDnrk`f(QJrVG~jTbKBn1CN7BE+N~aMd zYV8dFhORfQQz;LjFzcS(sIIWNFd@R!iyG{Yfz*{f(zFT>M8Nc2Jc0qhNFi>cJO|K< zMfdVlr?m4ZAnXG*Zf?Z1|B&+O|Xkz>kv*WkoA$9_jIPG3-?N__biD4B) zqJ|;HISZzLo0vnk*7i)r$}elirYK#3W}RMb)Tf!X{rKQE+#ad_yROO7K|Fu6rt4<_ z;r(SZ$L`4ov*wls=qZ5peS|Tu=~kWFN(qaO4bY})Ww1X<-41P>Veqpuc8;*c)Eo>f$D$p|3?!R45hZ{7sw_-#&81=}e{Y1dD9iJq6`+0dj?f za(A0jb~AuKQ~uU8ndf}LkHy7RmE4Qc3b5LaKggI5+9W7036= zR-M#RgR*~rG!>!ARr*Rj_Wl-U5~Aptlng3%Q#vVGa%EVW2R1lr1T%`}3h13)H^mU8 z>LLlWKGdUC&139fitk!S6q=Om9F#r{BANG#1=iN?-?)bAVWSCQyz#wSe29_u^V+y! z9nIR$2Ua1+RC{Ao0Y9p@;sKgI*lAMJ$|2ByNq#cEN%k(a^pH=yX0J%G)?6NskS^IN?U^~YWQi|v8GZ zY@`G!5f_kvi1NmR7n_?kW(+nX{$wA&HX*|Gr>5B{G@J724Dn|u9y~AMPgow%gWM$t z`J<~l@L4?dN6W|7yp6x?Pj@Rxe~RCV^jHj1_q!rA2@kzUVEZhG@rgUJ<4{5w%}gMf z69_k!0COfakFAW0C2wrG9m@|DZ04i`JKIG2az%xaT7fVzK~2MMbd9uHVx(F zUk@BD*7#_n^OBcaObG{BP+jYNahcFU{n85h=wjTcIqeVK78^Aa($5eBrUu-7yMmB# zy-b$oqg#$m%WKNSC1?b~$n=596m^1%Jga6w=<#}WUHT?EM^nd?cP>*c+=3CXqt8UK z2%w*3EMLRA0~zVPGD}j#;IOjVfgW98bye5BqJV48c=>IXP0W_Iu{L^pNu_RY-2wxB zX-flZq-%Bp6cjOP_IrtiX6%cX$ClN84BLu)N-sPMNAYK8H&bujbSK*iw`2>(VOvw# zv7~B^m2cO7oy<>zg@jyNA9#_eLC=NiQuMrRi~=B5@zlyRie)g!xVUfs@o%$xNafH8 z(m284#$TLTHd!|VrwRcZc}KMUcY>YcLeR%eBW|>FzmQ#}NA88qlTedbaJ9xbF|x2o4ahqLKrCPRYDv66|FviDbrqb@bAvUL4UPFra~oJ0-`mUgo@hA(RpOB=dD$7X=LB zi3Y~3aGc|4@nqx@remdPwFcy*QlMUOGoX-$FoG&qnSq2kutw8v9kMGBPHEH2;QGb~ z8fa%j*@n(-;ST6dJAHIMY<&5DsjxUIJAPjTJL$93s>;iMWcCQ5X=nNB`maCd3bRYx zhwOIewu0fD;+~ZYM?$@DQ%QN?;|8Q7WVtG5o0P9hY;Hph#X>Eku3aP@2AuP6#mARja%ln7Zf z9NJ|Pik96=g=%xi<}!jHx_wVeloDi3gt5~rUp%Y{7)aX-Vf2`CTo=p8lLV^;utG;Q z0kt+5AG)`C7_~?R49I5bPSjT+(T%=5r1b(^rPyRrn3o!Ap}egQwvVby7shh>t5HCu zwHNaE{d5&1r(7b^_=%=?9E{daz?h7fw_G2$pxMumfVJwaBfw?^7-w>!9?!=j2a`Hs zbAydw(hb&SPkP*$OHrzbFWMQ*bShqY+IBEdKs@}i;3U6xB{_sM25b@Y|38L`=%=yv z)Irs?54tog`+<0R00|*q78rPqkY8cg5DK7S%N43DJK$43Z@nIl<9aM#O+C z3zGpD1dMQ8r8%NW(pJ^|-^bfRcqevcS3(iZUu><~M1>3=1zpP2sFZoCp$_D#%U}^L zh~Qp>27448NiMLVlvAGHDm5H{_Emj^iBYwSjQlU>Kl<++`z&T7_f+P$%zEWjX>;m+ z9L_2<>E|Z5nu9b0sPS{fqZ`&cG$!Z>BDc-34sK@A`9WMk*nO7F(KBT&L~2G&bP@f> zR2U#I#0Mc#c{nUwHd%^+PjOmSFs>A0=*qU#5tTNf`yY*H5-4_{295Sitc^s%ix(6b zFin3_mzJ!~1DTp||Gpc;1<8o#X;ki`%biG&TGDgaq-x#x(9+d6T7zmA4CXWVR!Yiu zVg(i#RHotWZ|+3_p~Er;mE|W%m5UVV1ptW@wJG$c{)m>)dA@(r7DWtL)fP7gnFVQyP%I=blYJv1^>Frc|?Y51#%6Z?FjzHErr#-Ar+Nn6e_ z0D2h>Eb8V)!w&x^$*%<|?Z7UxHG&ogT>Ia6ssT3mos?3b{3eq>~#rpzZ*A z;%N%7=jdE%Sie_<=UjSN(*9Dc!EZ5!I|fZ&%YpIK0%zbS4H4R_RWrD zC4{DK@Yt5EF_Ig8vl0qR!LS0)ktt=|LZB*Jo5Cc~DIE@~^2fLQfWS9DiVSMflXOasEob_(xHLIRse4VXP-vV ztxZq@Rv-vA@oFZ5y%jRhF#Mamb*GTsU*UeP^?blz9du2=+qlNSi;Aarh3YClGTF2f zN**=O^nu!!N_aCPuZdtny%N>e_<#vigurHg_r1a?wA4Hg5hWml#y4o61H~0(yFIvF zMFo=c%`>A$znZkkWZ5N=D%DMmai2Xony1gRw7)3D6LH@*xz3JS#SyPvapETtD+9+( zUi43=QSvCvU@#7w*GV=%A0td9=(NnSjY z@Z4ywk2Y6ZPKTy;t zC{|p#&ves`jaVGr5Wf!co?DRm-J`w(JRhu~LAu3>4=J{xH8m~=lT|JD_*7x2EfCHK zlecbz9Z5?ACx_oFN@!5~Un5HZeE-9@QtVl2q0!Y@ek+ zoqCJ4lW@p+1WU>$r}-G@|Fky|t_2eKK(PlzEipgBfS@(c-Puzdu-Umumr8aW^WeFu-To4X5XJoAL*Yprxq7bcixmLKz{@8PbN)y zPB{$2&cAB=bPhocsvr!C6S;N2w`ZvfTGBBux?7FXW zm{^lho1fDpK^FP6C)61IvC5+3FjT<^iyrMCp^S3ko#j?RN%BQni<2Fq+1o! zL6b~lQ{ELFePvbjXfYLwW$&24c0$ynFJa7iTtOxvNH_FQ)r`hg?1!yxl{*dW)$WC0 z#ry$b5SW@D6Ep;e`b#Zho{~p)*SlioLPu$+i57_z4EX0Ui zqxU^zeJz^+xhSCJN%GWQKtaFH*-G!Xb1ZiPDflB;VwhxE2Me8`#4<)B5ax#or$-## zb2IFgnn;>ae7i22jH7~EWu4q!3Bye`jt%e1oz~JS5mbH;edR*DZ-NOiYc|?2peG=4 zc<8(O*l*C*&Zl>|xjP34ONHn&6s)`;Ls*|T8BneaQL^;c$2c{(cF{}hs-kWfp}>K= zHS8(q4uRh4hODJFLU!)mLA`Eo!DfjjJ;C6o5tX^8;6S)%6YexF2^Qliqajs)WZL^< z55=6x`C0n+;j?U%L(dBwg7kY3UrN4ZXwn7B%A~O8n>==#m{YTmZBK5h_P3jeReZn+ z7^ftgf9Ni(o?PBM=Dd)}j>Kk=g;B>F8+gghZqW zIJV9vh)wTr*c6srDmd@n)6Vu9 z$bk=ue)Uw(3myW?C@~>f;_5Ru)hRc>!R=h|>Kti^QQTG zeWPf4^DAFHe+ETFs#qxbhX|OG5Br8xyu?S*`hchev{T~`doHGcqJ=6X3;th<$6_;t zrF!y+eix~HoE0D_b^5~yfSb2CGN;rKSnkgbZqB4tp?JOaYq3DK)938wucNQB&*(2Te(4Qe~hjeYLcNEE!H#$U}Hh@b_Ioj&qie z0QNPt5uEU;95ExKC8&8gT$!7i!D9jUjRP%UGq7^!GSOXj5Su;8A z7=J)?USNuaWIR>vXZ%;kd}H8{wTj#$DgDH;g)+$;P&xbpojIp*fG=OUg_Ln$rzDOA z$bKcLg>{4Vo2&XjX+gFl5(Icuxt*TY#DxbzzfjC#imYM5PYjldPvnMj-NY-Bx1{mn zk4|Q@2%~}=Jt?gJfvL9OkCC2MsW#dg9%OE-UDsfR0Y)Tb!T7OeVOYQOI$a1<<^X?U z3#8+-<(1Bk(2C#BRV7y-lh91s_YDBL_jVB){zCZdpP435H&I7I16knrHU1VD)*Oag zt-xf_Fzx{vkr7&Gu^Fq&*_8Gnl(zX(M)kwcf$zB~rO(14)gYPx5ZqiFjv zx+*H{vYR*Xt(Uw6U*(mZ^J$Yt%3(q}mVgRQ?=uj0fkp<$V?FB?F5m$s&qScwu@k5C7RW@xli+iBnb54uz0d zXSs4#;nTA!SPc02X9os#auBnYv={Rs}QBKBXpR_PO!ZLuJK<_JdD4S*mt!&!sE zQCSfACo&4&H9_E?kkFagtGCpZBf{W!fM0}eM>w{CQ266#LX4`R8X})d?G^yBh?X7M z`5l+htk0I$Dzn9piE!?Wo=5>~^eKnr|3JBZf4_!NCOU7Hm4oRnoQn2^bL^U z+vGRQKNLApaxn4hUNx+<2qNs0j5t{;--d`sYSd(c(?hBS1N?I1{t8GIB~D7#;Fdg6 zU8;++S_aBjU<7G($`lNaPFA@7*-^!ee={m&`bo$QLSu(R)1vO`iF-QrH^)l8Sh_vw+F+hm~=?Hd)y=*J-5ZFhSx;{aq@CK^6&;EGIjYUzC!3T#7wU zUKpV;sFw}E@Au-{;sSa#CxBno5;hMnl<|n>x}#OK)DkBh?L5K^1}{fmd9qVUf6dN9 zH?KjZHo|GsZ%VW7Ju99^xjy0srnHS-*HW$ml&-)cB5L+PpnFvF>NEpnpBG@tY5bu} z#IW!S? zZ@ph@7y%ytCg^5SswX0P_8ziALw7#as;aum#CF8(pdqPZEMK)W)0>r4hA{#f-`1?an#fuVmkS0odsYq=blk24TB#e2sn83&@F_Q&0FSQN)=&(7^y?S+!)CPH zbCj}3CkWJihTFt|`^#$UbL_2F;WlA+g%I*DA_Q(_uwB#7+M))J+C{&P)HiXIqN?$4 zDvCIe?GeyV}d>H@>{ zUyIlleN)}4vVb#jB@2)C0SGuOC0)PbE(i);1CFExtrYKqpLB%@&mO8weB*_DU7BX_=7zY#6qDLFq87Th{*KjE~R~gyk{g3y+stamE-_Ffdsjzz4?HAI8L7^k3O%fj4zSSsTsG zqnqhq2aM7MAkU5uCK@?=?U#u;4GG|Y!+XW364_cdjX!#p^ekMb;~IdE(<-SOGmJ+c zh@(v~d%S6;BZ`nENCrLafa+m{atT@(AX)wrOE)$G1wygq!I2BL;ty00T!kHU`y)E- zF{XI})r(P9i>6hsmrd)}Zc1^8iQA-rs<#@R3`Qo}+iKMG{%|+qc4O zn0MQA#OPf_4p2S)ERJ4;0BlzTJTqTe(fpW&YCahPD;h$%2l)sZ7{L>$>f<5oM;P>~ zJQ{$9F;3E7MZqE(H(NliE+GrZfE630HBMVYr%VgyAZPtf<>D0y>?1j6f@!%$?VfS* zz7^pj#DpSHj`WPAv&WI)0}#bV?qDP-9)=zbWcg8}mnHG-!<2G;oBaF8fcKbSf)!un zPtM6v^|cgF#4G42QqG6!jbaCzccHO%c=^GZmf3^IIzY$rvIG+;Bx&EAK=AFu^;bwinX(nBj%cSdXfmP} zTvc(xmnHnVtwv1?$fhxC;qJ5mWi@+NLrSl&S6cT*K)FRJroGo@lCt`$0kb&@nr^sj z;|<)qyoi9xEIQo9mu|oi=s~A>LFvW3qjhL4H;mYO6VKK&r#0Raa) zk2068!KvQtva{%UnA(-i=_9Kwoszuo3I*H9{RKp(V`WQ7+qO?8{X^$Ah-`9#iAfyZ zh2Gq5Y^^lk_Hsrt@D4;%1W?MIa(ATO2d*?~A+xO^!(#Q!S7J1}mACw|Zv+KvzHN;MvC9^$nj(~r$1!?VqPF;mT< zMQ~gH1~ka-aEu!bymS%M4$tQ6bo!y?I8eJJxUAP4q;z5PC+#xJXX?b=PV49L5_%J@ zL+>(e9qv@H*EAaUOWN$uou7R)5Cl7nA^H5~*I_s{pWkAB4#RPA^th`ZaxhCEPE39N z^%y+7O{D`VY-B+77?a9}n33Ku5Ev2G%j>Slh|t#cW!T4uk6@bZhvNk5*9omBg+|J* zqQgF}BbSvhNqqX`JWBPv$cr&nW3gP8toAmrETPyfaxVVd6jjX>AQ>vfbhGYo2LnV! z`zan``le_WI-zKKrg2kPF)7-xgn{s4jg1#7&1zeU!n8U)FJWm+R?7*H?Ig;@V&eWZ zx3Ks!Ce35BNRQD9~}O)iY86%viW!$6D=vTO`D)DUGFIQ5g5%pN~PvjBt)`Q`yM(jpq9 zQ9ED}h(hvZwsbycHY-9?6X{FSljPZE+F>Y;IU^ck(G}P*-Io~$qd(SL4`UU(3WRGL z9g>FHz+w7aV{=*-8e1xYec5%~#xqUhSZ>FJYT9V}L3rRzv;iv&+<>T*SCBznBHoSL zv6?`ki?S8EsR#v;j!hv!RTeq8hQ3?oOrFo*W}G$^3pBifI8Xk~wKsO7hyFc8F%s^| zW1r;DuU6N?&mrr;$8)(X8qRjZ&EVVHMmD~ zKnt`F+4>@0hK8m#>NoX5sAoG85CPT-mO;YnhB8eC(BNK++!`B-aRFe~hAq7M4C+M3 z((C+&1nwVmHG5i653uP)cUkasoRJ_5NR;+>h6xick@A@3g zcwI2c91ZiX(8aFR0~~$A= zE+~C8)TZy-qVNw9O$q!ih$sT-pKg_k+v+yAhG^X@4t!o;kgKuR)9_@wB3)pQo_TCH ztZUp&cF=~;c!%LJjj^(chQ_OzEiu{Y`x9m7#jfChp5sKlWF*sQuGktlL%O7dc;7dY z*%}Zh^PmB;G|@>!%SJyWJ^2n396bj-yhe#YDw`{oR1;64R*d0aosjKat&qNwaN%<$ zB3UiT{}l>tp+q|^p0~A+Te+9fP}6vMOP`gekB|P6SD>%Vt#dHhCIhA+OFr1r4AgzUfkQI{~Me4_GjYN{KJ}C#Fa;Fy%njcSW zzHWGPR3xd7Jh_2dt6B<$RKM+fAP_uk)uI7eyb&wNXaME>Tyy>AWa0Fv5jrw2B{4(E zP(g*Am@V|KtTd)rf^GXyvuYe?tre{M+Q}$WYt8lJd>f(D0e;nRewEoEW>NiH{_Zgv7>sMg5dEnXiH?$u zkXi!~MbIdr7_y*?`<;MIP(4J_9LMZK;X!FZo0{_OlPLby!&d5#%SJ(5XT<({JzVeY zJ1Op6pAHaM&U!pt>2$cNLtS|YN%FcDCQ%6rE0aOEWx@b7`&=XJG*$ZnWzg>$!MJ_Z zmqB%=Ikq(ro_oN^X6LWf9NTIt z4+_Bg)q0LiaI1P#4VX(6#~9Bj;C7rEM^EF#%Z2X(fjQD_Ab~r`x2#b&UcqJI{uEsn#b9kI7jRiGmzIfdOI+dg zDe|Z`aP}i;BAsz#V1_wiF812Bv8|sO?TVNn*2&Qmu;>%eKdm)tPMSDBgen2iEj16S zq3Hb5TS&Z1f)49UYDN@=>zZFymuhulJw22&;Gt1#14vCi%Bzm*RYxKm6S3-S@JDw`cDnB^+DQwWp(l%I=p&+St=Hd09okPE|%X9~J`k z3Xp12=OJk(%rSG!ijgDJjNAzxKgSS>1Wv010|c|jZ3GaqGQ1?OjfyC%$Phne8e*f? ziIgyxuIQ`dM{Vs~h0ysz&GtpBlo>YaWj6Xx+ss$tj}-e>BJprVpFW}#z|n;vC5|r% zAf&ZF?;BeK$V2Bd{v4$B_Qe?1!JyH~WFzHo5{v%LCh2aO1`w~F1$w&AHgJl<-YS$~ zeY9C%PUZr+Whu2yTJB8Po-_Q@W<_2hQt>6-@TJCh$6S6QmP8D;by4 zu?lkf=;~lo0Ks+FTSPW8@|BhEl(#G!(`d7~?xO^cM?_1t3I;eR4Z*yP_owWe4-iy$ zjd$qm*k7i+*0H34sVwF42AZ}=($Js!)Mu6qV%XDxcTh@?4u|~40bl_~FKA$l@;KCj zPnt45CC;05MD>S3-OrkW_-C`D9Srswd=nmhDpI>v=8VcWm*{g<;5z?+TBrofrbwy^ zF${2YUH6BJwpm;gXc#@NASh#qgDK3a`oJ=nD`$hhb4?~!0$5j{>ai$4`4}xlDbm%z ziKAk}3pu2BE6$IS)j~d&0$XqitO*nMK!H07H}j>MCc`zO;JDnGMl1WROI+J81zp;F znQ<@UO?TWu=f=|}O|lvWLMwnNUU-fP=Qxy~oPT&RgrUffd^zo4eJOLsr^!=K2`Hvq zpR46om!GRITC`+4!mGpgPA7Y`&qG#RcXSMif`Twa^2G_x0ou4Bzu+8FV@<&O)QF z=d5p_yh%j&MAEGMs%KonV~c_SeMv{0Uk)ZE4*$@<0)D?VvVB z>yA&*I411$0*r!#%B4<38RP7E%{%)Hfk}Y=s)Zu^J54$wWceXj)y!8*qZc;+PK(0R zjUWlPcu-^B!~jchxC>d0?ArVnVc8-m|Lmz*|M@d5*O0~HUX-6j0pBje^GhFkR5wW1 zb5QAw@x(-ZTwJ%Os0n)5u;W6J!p>ohF5SZb>=SkpARbxW!_0W;&s`2Mx&5i@H!iM~ zYpv#*s)Vn0O%+PJ|3GDajCzyn$eCGyfdXQ9_AL;#D`TCmgK;QwrC00|!)i>)Fqp#5 znd$h4M91QAl($C=*f`7eNF7+b>r41mRQeKTgl!e~Fzso`gOau^$CgOGkhGL9yswng zbIr)%2I3sJ#I#4o{J{DR1X*0~2B2j6?KpeJH}3%rf@5ixZtARE~ zF~i+fLX1Flw#&EKVcDs2;U4tpNwD;F#K6wPLj*Gutr+_e*-+r$OVUAVcw;+TR4Xbhu*jed_!JgUW2qBt z<)rDV=Wc`PZhLOcaWKa+w z;Cthps!9t9&aAT!cOvu!Iv8om&`dt7py2V{*ZD5!xsL2(Azu*k@sh`23t7P{jt zN790R*vu7r$zwCLs3A(Smzey+{%Vjhd4GZ8mqG~6CmS6E{;ir53ZxB}z$|LdMhHj1 z6miS+jjjG&-|*N<7VjLIg>lz4@=M+zdwb~CiY9GbahvByHh72UGZ^sx|76!oIbT$D z7fUd}7Zl#vA_*=|skyne*7g-yD&9#bjrKGO<28RDYE}jZQSXSLTEV`)j0Ig zRzck+HT|4AoYo~OOn}Rf7`&47y6DkLT1|7`W`lZ0iuOr3BiP9pS559c;yJIvnvK-xsKqO^kk;=ZC{G6|D#MgEnVF0DYic`lJ2^i|8)Fs(+4HtS?!CsaOF z3Fj;8=+2W}gukbQz;QP!Q)Ieunyhy1fn|DJXs|ai_R*3eA}nD^kgvcO5Ozr9tct;! zTFW@M`!}EGzAY71vV83@-~+QkYE>zn1y^yvhQT`9h` zviD4>aq3)7eTEnV^Qn`MgjwDfSPwP13L*zg1EtFj7X~pNkXmrr9LBe9@1!R8QZQjkv{GQ-vgF3c}8Bb(2GL*~)L!tVcxEWKF{{){RCpei$kT96h1k~}2%N42q zk4Lj*=JAJ^3eQ^MgZsCZ8Ou03FKn~~;hi(%N9Lu9mAp|9gVv1vo%X!GKW+(T0XAv8 z7Zt#ShICwF(nt!8A_AW;)@+mMy!^yZuy%ei6rMl8Uo7V&l(Sa(ZUxi)Q2kz5cDg(5 zLH&V0FKZPBKi&Z)p*Bq|lJ4rZ-2L5B7S5&OqM6DkCnU5};>s(Njx}4)@2#F^huc>SFU0%VsJitd&Thj0G@x zvzIqDD6Ncw^l0<(%HW>f+>XU+M+NXo_wCeggaXvX%?{$8pD72LY)2$3sFX)$(zol` zj?xj}Dr`;XX!I2`i~j31zsCyp#YrRNxduVy)TtFqm=zW3DzsKPv1iuiF*VPiuXi;u<5%+)AhLE& zcW@g7`dhi46^!*+x#scI7<6~CM|I&uNnv_zycbCw&)DiX-QYz`P!0=jpJ#{?JBcnNGR z;>h9!2_s{RSaAnmJ7-v3UE__%GKeTLR+Mn`O%1|xb_YGnkx%3;s^cuYlWm9Z2=R5; z0Lr>3Eg1+xmYN>%jehH58=m8!x4rR;-$1s2IZkn8e-*S#;i>W(Y>!oLh)ToUvIwjb7`QeV*}&rlvE#bTDAMRslQOt>+T%oT>p@|jrHXlU zj^3s-t1>>Tfdmy89tn{PWK7b$;Npi4yAipn}l1&-2oA zRp2(9c&JO%`Ev>@_c%;Ik7gi-P8tifCgXk^ovj*VBcwf%|!Jyq@OPpP2 zKk!*;DpyB4fir)C9Z1HaKcl2Tg6G<0j+`=v;r>_h3+Qf7$|3@wP(!8ec}*pSzAz>@ z>J*S`DC|5F5pT@1(`4Xktz2iF-79tkzv=NtF##R}0lF9`!vR)NS)NbQiGRAo4N!;` zw-Zwg+UQ2R;L6M}1OP%1+1nXnH1TjmODQAw4y*Cpv9?LU zlw@QbVdg{D)WRCHK+X77!Wl1cjKb(%}vFm4*w5Vl`c zBn*2;oCaDO+23|=>Z2wqEoQOTWmtPu%8u3*V;lIeXC`Jaq~k^6*yCt%-$uXDA`VJY zEa3x0Yu>v&W~1XU8?Q~sF^0H=%x;!io{Q-p8G&8{j*0}^74F&@b`0Ti4w^vA?C z5IH|L=Zw+Om@Y8r{nJ|q2+;krEA@bax-L?_yfNga`Y6F_q2}khP!fwX5K8!;&HPr> zlA=0`ql932nKXJ6VvHfC2%V&j^@C)bxx)yh0_;y^aIH!;8+LD>xd5{9g>kvX6CdSs zuAt}kC`x9(Hiu*0*Bru?C%%4b<3N+LwpAqEg+M!dbbmtTZPP9O5prp@_?-lNm)23Q zjW-u%d!FSy=chY^ zk&WCd@&0OYl(&oM<~pZ^rtv~yaV#Ggx5Tzo=0pBhWMvXK(n`x0GV`LqoAhN{E_mmC zlO-YrTU4y|W^HViRzr5Bs!6VAclQ&K!H-Bm_2Pn%jqo0f=1(1&C``e0PYdPr2MPUg7FkR!ADaDdMP=80%$fTiFu1t zE4Qs-7k{7d=wiF5Y8b&|OoJVr6CbpJt{k}6z=p*{7#Bh z-j3OR#KO)TT2g^u3fG-f+7M2iC`6#X82EP>jN3t6k@7vOv#?sPviMc{#%3BSpyZE zDm+4vh%#e|MR(OjcxbUlM(6&j(0!y8t}~$aR2e03+esniZyK~oP8xUY&2eM+Mz@Wx zsFO%1=Drg}h7gWcnMBN?VF2_n6<$ayuDJo6h5e;8>kw3i$&enjms_W4pk_eYrZ7fj zrs&N0bR?r<5#aS3kxqmmbojaq01xgcVUYS0dUE4`*SIWOY1nfPz}@0rpbBI-5r6U} zWekl1lQFG=mM5+bp75-3)u(C|91BhpM4EKr`o}o7exP+<%1^~s^ux@$EI2NY z(w8d(oi4|_G@m&cQp!V&?AG3^CnyN3l3@3yOELRkHfBHN5i`(lB_LJ7t~Vz*g(gwU+6&JsOL2wkzx62$LC z^vb9y*^I7;0qKqcRDsOzQNEYnyA75ne|MX)x`-h8>kXTxY%+M-qzy*p$;JeO_Dl11pJ%KE1uX`HD_BliVZA(ZRL+EGZ#kiK@C2Bh9SAx6K{V{8kyc+@P zFWI+-6Vwg`_FKC3Z(&%D5|+klC6b&#jJy?=oCzz7`OL&u+u#ftGu8kX&KmI!I+lGL zSGN!B8#CfWu~}*yHRO55KNxHyu{IVDBY=x(dd+DrAOr_t9^wkTFTV%TDpUOZ@5o?V z)ZeNpw3p^y(xM!*4;}zzS!g%*X4!s=6c(IHJy{p3o4*Z4D$-!ls*DQbpw~heo!5+J zQgZydQAhJiWby}!I~1P2zY=H`YH!@ph}=#}8|}dj?K9QNp#emFGH%Sy*2>!@h4yC6 zG5QRf%7uiHg;R0Q4`>ur|xDXdW0F zAbf9OD{NkUpzlNE^3?k!$USJTtQ>x5lGQ6_g>AC{9eD6rpK>Yjd5T}Ru&X0s%a~oM ztXi9cFSbie%(2`>V8ftHuyLG26~;ZK@BP7B)HsgE*d%UU!@fd*aIx;3xSszEJ;+;u zJhrpacJT>dpVZTS|AM~ADwpXzq)$)9D`32lC$o0sPMn)6qrKS73Fg3ZjBrYk=3UxT ziN8Ap)?wx1fLJKJ_sE<7Lg1ee+ZtoPip_snT3X4z4Qv5U32?n7BR0)rQGK4x)GfMoxfAGX=4FfqK*Fa- zeF7!VFSpL@GQak6+s#;(iKNs7BbZ-1LDVTRIAw-}>(eNPa(-^U*3~51S z%`c|81Wsc!qIxNGyM-G+KK6r=&{B6YGZW(_Mpa;3gJIUa*U_4(;H9!xLQ# z{hUAQ`e0VKD{K3|SBpNt?^*u$4T;CEa8*eeS8+tGcwv&$Ub$1Ix|av#Ji-#ixuEJB z2AHi!OZM-<`8=#$ zeCsqxu>FYeAPz%rc`;sxHiSJhrBMT}| zUm6}cic8Q`kadNpU$kL)KPd!u2{Yz{rPNC^=ix$8prnmeOGHk3vM-{(xTW3NK=bk- z!C9;XNvsO_(-BX=M-G*ii6jh0SZph|nE7JRGka);Y7s*mglLV5{0Rljm8Cp|ns*Cs zwjz=v)FwdElWP;YjwG3U&S0L(D6g6(4&%jAtRI~jko1~A_7`BNl6P*TO`(U8at80t zfnb5IF6{RtAW<47?a=&7X-H}45#l8xSx^2vw|`&M5&R)1z*@WN zyg2Z>_c~?&83bulaP{ym8vFR7^ZPwFw}IPc}v#kF=dld!OFFL#HlHK=b@mtjPe%G(Tlp}<#lQk zOJ}iTVNDPHuxlY8)X%*EO=CKfX5%*;#`!7cq(pYieTXPR+fd5*k~qhQ#{`5oZnGn^ z+P)WZACZal6KoM1Gw zeym?(xEyNm^9>g>IUW^FgNUHCpVeN*?=F}^{bikHH^QGabIeW~)Lzy~JinLI5(B68 zsHNx9i%TcrB4ZHa^qppL*k9O6NbexdV&_6%b6 z+}avS+iir%GeI7!4?l^1+hCZ*hFB8jgr#Md@*ZO#5+X^F5xB_HHh{&MuEZIQ|FF24 zncJbyz3T%jaW-Vh&o_UOC@ACRwqKAcHegf<3(NWyBz@k$79>>e%R~bY!$ zz5C{x-$eS^97TVN!&&{piPJ_kgqHUa0PQlC{uJ_wa1?$jRc4n3ux5jxIe7!y(&L1k zJUEavujQ7Uff;KXQUFFu>M!YbRy_*DLzH42pPceBjgI=NHu>V`Y>O|d(#l6Q3AIbj zszIsQCz*nBDP+tRD(0^m`9R+JnL*B@~%1j44(zORVObkF}m z`NM>)s!;-|#fH889N#9P_&d@T`heEuUuesnHP530{@Xy5WJY`!h{i4k9!Y_Bg>LCOgMk&&gjd6V!{$lzLu#?lMj5!OEhUp}%2(#c4i4 zqqSV}xje0pL`p?$Dp@amW@N8Gur8-lfzK2wLr=;2j>5>aCv22=vrkq zi{uvVq66&)8<|*Cp0j?#8>EdY&G4(Cu0d4hwLTepPf64#2Xq|W1ijufQ4>XuGKn4v zQKLN2@YN{RppFB;gsb~`o(Dy=Lap=aA2P*5_i1pF%2P7jzz{r1$iX(T*Z;I(Gca$) zUdEBBWNQbZGc>|a5hk&c3vL7kuRxdw;MZeR zgi(Coz)A-PiSowf&a|)gRb#RuN0a@teQ~|hCkZn%!%@%a03;J|Rn<`pR`zKm0-Ad| zWNG$J9Sio#oI!YwcBQ-vARcE$@_=DFqnlIy$B;*3QzBI_^&zRKuwO-3s1u6xWC(jz z{>VYW!;p+>eq$%rSG4HFFm3&1gf)VfH6_hPfPqVd+WoKfv#3c@Yf%eFC)jR?~{1kEkm8s(kL9d zzm@juA(-G%#B|W4b_+3NDJn60xnsNTpwE<1iee^Kl+EbCz3JlCb9#??7da!&tAD7z z@Rc(2QkL)=cN9JHkTBR9Q z)pqMa?d#Pg6Z95!L5O6P4OpYSNJ9fBSpB~fh+F<0yMFp5aeau@&!ne9NAO`d!69Q` zNiB?VvNfpH?I3#POP`1?>8kYBg|~y`!M&@{ulV6lmlf?Jor5t;|255LKf-F}nojxT zforjx&OWl(JFr|1rfIJ(h-taB)r&M4gnjCondSv{*>C@%FP?M>WTa^RZ^}8YxQcSS zL$GRH%jacDk3X8g0J>ZzZy2v`vyuxeH_RUU8K>C;A+Bs|Id4?sfN)Lp!W}2QeYHIT z6t1O%Tb|u5?D!%Y-e@!^o)tUZrq1>}2+c=-(i^fdiT;_Ab!c20GzN`27Ubsw1xxUo z?O=nPbi%^jn7Gp~3av(iMS>1mqu#o3{l~(tnJtlTSvsEb170HNmNfy){$n+2N-)mo zw>{4d9V>tIN{2~6_=b8T=!anM0w9s)uU|mEkk;~QZ=AgNB&v(wj2q}wJj{~EP`uxB zkpy25SG z65+OR0O&-RvM3ZB$Nbg9mu#Owv^@wCtYUybCn3FwdKfRAyNY>D-d~i6Y1RSH00r6e zhqtNf;Z3vfHP8LwWjXNkGvVBNd`oyPML~HVi zIIBWDeS?qNn! zX6hRb$-}{|=h~JXh!(_zaD)}UpP+UiERd>zXSbz3OJU{&3(fr25tD^eYT*M3s~ST| zjR0?F#s~<`;0je08@_6+ti79i!06qLIQp)5$&+)s4i89txknI{x~PIL$3HM5j68Xh^)ASC9D z8JZ|sl+la$#7Vee>;}dMcgx`l>H9_%OeYS=xjYQ01YEK?>`Pd2ok!p?1#GZ;uSLKR zeqY7r5Npi_cIUrNj@arw9^!hRh6o+`JkGtaO*HxYho&^I=9s1g*}Z&fU>(FPM2^JH zuo%IQY+<+qrmIvfQZOuXWcB~@wH$HB*;+A}zes<(A}7hbGfajrgu~EkMhy8r1p!6; z5><&FhU4h1t~#9Ka;IOW$CfrOW@!IZTg z`wTYmZ00dmoyQGmDsf4t_g+gytmUb(8v&go@C3kwFM`k!uM&Gc2~lmjt?)4{m}j@B z?x{vHfZKMEj0@tG2m7t9$e8#F8piie_);ddu2Z$r+MVztnM>$F2|xwW%q7K-Eo!A0 zl2uLC zMeS>My^z;0ud))xIYZu6;%56*I2Rw**^x9o9b@^Y7Tka^RcR%$&yZ7eo|smlt=s1@ zVo;4Sk%M^~#UmX2mqkXI9`7Ho!)O(swT{!y(VRP!nvq2h1Pab5HXwy=cEu(5xci|) zm@=eNE+mi=;_TZUn4CplDSY3e#;Mj{ceX|=UuCmc1lq^8`qn6$J8A+BHoL9>ULUsodj86}qeV#V0OqBJ@gy;^(U2$t(@1bBRgYQ*$0@ z7WpJk`0?sOmpG%?D(`l5X>E2 zujACX!YzTEqy^ws-5rE|zsBUzk|~D*l6fK*$Yxal9Ip}cd%ok(y-`F*qLDoAsgg?K zZW-&nSYyV+8plX84G@4!B{mORGK3Eys|rSK{)Mvi zE!ezxZ@|QwFQ&63@-KI(zzmKJc*tO*46-2GZz>MlkkBtxyH!d^e0M7SA>*(n+aU}? zJgUo~@Yc^&pcO;=K`L>%@dp35i}14+{@b}R3mq4fTI1}YB)-+C!y0I&?BJFP7dZ+U%Jx+$=M9MJ-0jSPb)TkB&uR2 z5W>fO$5oS*)JGwG*|_jPU{RGHpdw8mI1U|IsW_|Da^--0dx|9;oAduI3`4T@wPwYW zsS!Q-^yyx6r&EHDWboYFW&-|1?68QuJPUJNoF~Io(8k28)he~f_~mX|Myz#4@y*V$OSorvtYN-B|{Bx(+=J9u4TA+5wqR=g9q^H%m@#Y12B-Y6EI25!k z;~Ot%R-$!t#)7Ig7~+P9#d6 z4@GZLpg*fW5;gxQC#6Mo-rCEnWnrpC(^#ftBDdm&#IN}gRs=yrvqvO0+<~yO3V_;u ztxL|;*5YbETzj;>P)~O9>5Sbvg2n`Z!2+kLPY~`E&V4O76+=SW6xU(DG*P+1sh*4&M`Y}bbk*=Du(=OxB5WWZY8aUhI+H(1KP z(%Y65-hD|Dj!=*Aysd22Ke~$ZOxH8RcJV$b*xFvA*V|(WQ~^o>?P33&-Q;FycU~Zc zgb3I#rOjKrzQyF4lle|MJGcTP;5+=h^e~6eJ}|)IaK%}V%=uIfJZFuUTR83S zrVcwgjqx6(GZ9fr`Ae&8JU8N>h;VoUx09Ab5W%7ORbEi4c{w`ZVt{0t@Zb$Z-90VZ ze8T^JKWNYI!)=Z5nws~fy^x{yb7v)a=xgq>8`M+U%viXoOv*#=9WAKXRW}Yy*M-}E zlg)5_2#bOc%+pmf*iE76&XGD+=T_N>r=?Sdu`Cxnu+iCb@iQhXa&EBOWB>&eXN@c3 ztXH?ObTq(hnGKTbm_WSW9kStNq(K0HdX7^lZkNLwPV$!kOV^frUtn@#JG#QsQ;Xo` zungz4R#zjUY-S8K69#``1gdhP_POu=FTy0>!k#L%ci^#oqKLIkR;f*#9)D4P4aO2O zY}&1Ikn7w4`><)%85}G9v$WmL-{H}M4H_$#Aade(dMP2wqf_UlN_K9)M(70$H>|B&1eU-}ODnuK}=ISnrUP<&M2b zCl-4E)iVdh$HH%^%Qh-szHlBgmTJvBbm>o}a~Di~T6iBgtq)cCi)Mrth7~m-#QT;D zS@wR$!HjO+BSkrrFkLNy0ivqo(8hBdFt>0%5tq$2^{VynbtyYW^y!+VmHJt?iPfeH z22$=fN#uix`9TOguWSn*G5)R3O3pm zwJ<(%3qe~{WeytrtoQmi({zP)+;*9!2QbcOaC$tdRL!gk-^JtUSk4poJ;xLs-wAiC zn^YyR6kEvf%2sl}-J*8U$I5qf^_%=)*a2-}lwA5?z5&BH@{BuK65ph|)1N`#vWoyJtCfXbBd z>wV0O&%hiF$Vy@zR-3@#&FMGQ*+PxdWq922-=01?iM_2DfzU$}dC(PnB5MW=FAEeM zS^%IxU%xuSS2sz&C`_bOf3V&9p$TCx?24f@FRX&2#}agjT~5wNIXBSUX%*yBtlAd` zJau1Z(o{n_GMG0)DO+HCG&+f?(#NvK+>`y{7}L6zrVQ&#iuucnp+3qDZ)PFB@HVbHF0p8_4L_}YT3vReV>>9TYB(T;bNw`A@r_lGIPFtNMPab zQ-U0p%j&NN6wTR+Flowq2(dm1EL3E1-3qMe0v!sqee*Q@Ff6OAS zikq`OBM+$}MC~ghb7GP1{i1%uw+jW;J}SBwtbW(=N{_raX|`^&?TcZysuXoYS4u3u zTXNZK?tbhXOR*>JcwYd+6Qb7ISJ&^L+nOcU;!3p9j>msJg^NPW;gUc4JQufGr+V@hK@#BL;$5sH^{dQC% z5eT&{BnedczPLg_v;fnTpHyOic1sjXQE>GmL;o2){eY|4b2>r8DR|slg@L=*fk<-E zK3NX)Uea2IfPrw~2w6>*3tjjHMj~}?<()<|)u__9!`sFSCqUnB>4Fu8<<)Dh5MXOi zi-y_VB{8ce+b;`b4clM3@7X6;(C5ra@Cu*n;g3@0SGGlE2V)4R)u4T4wf#|5JcG?> zhiaa}n~HOuj_1Cx`NGB^;1vwNO1o%Y8VyWFQzgrG3tK3Pn{>)59b3qZHvl^tOs7c# zZq9>#q~F~`UUnVxx9PJQ5pkgwLqxFRsDNKq9#MZgI#`}HrJS=>upv{CxpZ#}KO7lT z(mT1vKa+VC%OF-~Th)Y^kqEg;cEhK5QVR>7*lJXq=njO$7MRwAa=P;m99S8VVAR}y*!*=3 zw1leu{)(UBf0`Us2gEm9?$t?h$T6VJW&t_x+Zx2>1|hikSrKt5i&*<4X`AfwAa@|9 z%FL3jY+HCe|Bm^=ri1;I<>g@YbrLxHL=!-|;8M_gu7+;;$kSsu*^Q|K5+_8Kg<%pa z3(m~-=~9Q;g!CuEi_)QMKJ5q1tbSIu^fZ7v(4*B#lS%KC3hzRPUd^X%E%u@pV7?ZO zJhSUcisL6QIVSq%zuAZ(p?3$eE9;A*bX$7pA#lZxbR6f&T1$5t%ShFF($tOE0Oz8E z27G2d3F%*+L-`Iv)pv*pOW!a@Gs?N-{#prD5_%cxxml?JtTHlm&U>K66}etcCo9af z!{iHXRjL=WpIaF;WEzs%8TTc=HaKK)HbDFfQT#hPM8|d=Z#3ii1Qs2XzSS|Z4Cfo9 zk)Fzvu~5O?Y!v@LN_;2CA<<$Bi{KU$DkrPq_rA*)Gv^>J9*KcegvKeLyVm8>XcatB z8C3(xgHcRq<}Z`X@#TvmbN1_O&`l=U%}a*?%p5z@H&slSVv?|aV&yU@&iO2>>=r|jAj3zfyso=C2eBO?` z_Vv|PMDtkH8RGw{PwdnpQ=6ga0g^9l(`DM1@$ChFjA}1l)pcLW-DAiw0-TtGbSxFc zTA*lQ5=u7IWz`?qjKuSa5#B?Mtb1C<2y|SQ1l82g8!<){B$l>?0tLKGb*WY4+g`{H zXv~L;;R0HzQr5H6hMNlv1HfWMM#V|EDgq{x8#l6WQ>U?Eit0iErk8EF?&7YVNiUJG zE@hpQNi0NWNjeZTMlNe&xw=S^g{Z+RP3z}n9_~38>Rynoca-@;kRAT=HnZ8X9FSc> zh36S+R?eJM9f{XZ(+2T^@{lCJ(g<}63!eD$hHLn1tN=TRpPJ8@wrZD?f%HJZZ=Y3Q zcjQalsD@MQcuqL3lOJDQs9Xsa?8hsrVOIT_FaZh!&9b{Fou^K`+;kKpwNXk+WfZ3e zU->_bvmj%M49D;~U-J<9zAe?i+si$eNU!aV>NdS76OqEYYG40)+jKy=YzMNJZWl?q zxMQ3U8&Fs(U&3gz78~EMzAfIX&!+mm&t7Hd%rIdynrfT?Bzuh>Nr7>M9Au$84{CgiW-s@E& zAHOg6lTUZ6#;8)I4k`)((Xg0Z5G28w!hrUG5XebvpC>la{uUl3m%^5u^^cHND@*Yw zRckg(x`bq6KKSaV=(ng_4vg?^WIH?C#vSxkt_LxYpO+09x;Wz3SDMA`SGY!v%HLWE z*Cztdul+U!^D}$fnfNY9Lkr{^a-&mI^KBeBfa<$dl;-*fIcHkdZM36M-*bK^WUKBo?=6s_QfpQ?wUMn#zQBOoIY3#;Ip>a!D z9z&o^LqYOB>6CmN3dQd@NUStHZFZt|{$W6XpX)l!@(J}5xF zA{JeRepiMnL!!YgJey{0bFn+J#tIAe!QcX09=lkxcEwwiXj}L?8mresy*m~{THP+# z5id4n$_=2TnG&;8r|h`|30b@%pbd0<)i^OwJ`UG-o&&?z0-5*J^OHYGzmN|kz%}fY z_K|dz>OwNm>b*+Qz+4*`YRiK=e^pod#jf2m_q>~`SK@rIOd$)(V$D%`F^K!MR02I_ z+*!x6s_=22KhWx!_7!{%*0mwz2^~BK%QI!e}=+P}B#V&by*8)dvW9*p@Zn zNehb2GIh9PEOC}g>WmrB*iTL?K&-wx@COdR_7xvo|3;X<>WLf(g;N!_pnXqxgzw2o zfC3zZCm;Edbk`^L!$f2lPDDWOtQ(zZ!S{_bdrZ)pq_GpnSp-|XF%ZUdKd+hQO|myp z*4_dIZ%r1adWtlo{`zq&n;RP()8M|%`(w3D zd&>txFNx5^x4# zPFGDg^%LDmn4e_3!8e*eYyF{FNxWhbd zm5F!9pWWn^al@agx!Cvy!88%CR-^UvYNyat97)z&7p`6j80p%k|sukHt5F>w!75N(}uHiu?31LOw|R`hOKfz>oqL`s!y4HlAdLGFL@mkHeY}|OD2WA&YPlbT zT!CAXFxKRz+zF${DbTL4z5roh_5Sp7({z*ls>cXYAG z=!kEpNutAPfG+3ngaUIeu;`s=*?~OvvT*S`lI87^Q>wO%2>D!YH{U^Wed_|;8Vw&r zBlADB5U7v|66y4)5@wBByHN|#bY~*P8xI}HfF3*qV}|UGwJ8k@bueXc6<2`pTTkZe zg#?ppPR;B~jB^F(56RuhFqFt_>Jb}4)mG)C#T@Vs-JTaYz!P|2ICRnHkU9#&_-Y8< zbP6qCP!0+-cKyhi$JL9$n*Hf=pkq-#If2-MBtkBUZlcqHL2t)Uv_J0wJQ*t;(atgI zmMD%z;j&T?f;dKfMuL&Qs=wqbgrthesR6I}chSBj`KxL)Vel%B9=G9J7`G!e9*Rkk zhw6>U3xjPpKDod|{R;Z6v%_`&f!%+|&2P@4f1-}IqpZMpY|wsviCraUtxSg5xHQ7#$@$(j|wQhiB z0i>iDg%Rq^ybCcpbm%iR0r4qd(9s_#w(iW|GxXJQJqQR8m&)XEI}Bpe-5{~70JEl^ zZC(oa<`qgFiVK?oPd+pP3a{tfl2Pi7eNjvnh@WFA`~KVqPH)IzeCOK@DXqdF^q!&s z9G+3mu*+wkq1TZnaVnRQ2@|9K&#zG(vPh=BoN221m&SgMg%;|9?Uce6cNt9Q6*@ut ziVkjOO_#=J=~*J$QhlzJ$8PBJ_``Ip-i?eW2$&fL)$io0Rj5Y_E(w7)Kt@T>FFb_# zt(=0z{sc(@v>)(fZuRr#ub^vqlXQpZ4g1DqF)x*QV0^-9oQHx#aWNuV|22SeDnWnr zmnwDwVX4486-f@&1_Oa2J|q2878tA1U(xzp+k&>d6wQ=h8wY?0<~@Yz+^z^~?%j>& zgG{r~w7ej={HKw7=3UFryzlRE#8MBFO(O-U)8v3@k4KDp26CEzk0`U34RD{LMoCx% z(O3)qcMA3J2Dtz;p|UDVN)!Oc6GU8xc_dN~mdqZ=0%D4S|Hjiq8-ix#qXc&yzDgwP zTItGjh!j%KB2q|vKWc-v2SmI*q5|X(k`hj?uO=%Zp-jJtYp5vXc6EgU++eE@bnpSz zz8LiOS{S_)7HZ>%Qwlg!6GoF??X8+%zp1xg^qA=*2+gR$S|=NYAfv616zCth9pAh5 znOb2SRMEX2r0#rK&aDgPJTb~;3XjhE6J}}+vE-X?d>l7Et~fb2-?{y1T6JD%MqKBj zJDrkHxc~*io zQ2pL~89G&)Lp{^S5hsLPz-dWnH@HV@l@_Q2HBbE0(fWmIb%$;HMHlrkG$0aJ+Tvm- zPEs(T%tgoqow5H5yULl~s7$lcLMM1T&5I6q1cy1>m%x52e7QP^7_4eM-gA0fWMd7OfznOOqkJ za9CrMg7u#n28$V;0hiAcLM6T_%tYC0Yt0*gm7V`tqg{Mq;3-dOlJVNGF-AxRvjmLp z;)l}3B?J}C$iORGGxcIuQEc1UY53-B(FiDesJC=YX%iRA!6`po+}T}rqH&MLj*<-S z?aO4R9mGun$wujr)(X2sO?OtT2pRimgyS!}&q8}1LeA7x_wYZbCwX3Ayfb$jse*a_ z=CcwHiM;}fD7ZPQa-TUU>h`j)-^H0x~D6`nz=SF`sG(v2RH4hMbM z6B)noW!XO_lsN)`xC(NpdcCx<=fHq3Ghz&$agB2N)~{F>`1KVAJt--=TqdFt7_LC2}{)TOb1t&E6 zFV9W{Wy<)_E@nyfk>R%FQjl(5T0sTJc;y_JJ+XW1veB>AAMgVQw={OAPtqL?AelL- zWizQE>cKM!UcFUw`F5ZZEAz>n2c6CgMO~jSR#oc8n!Uce@-;)Dlt@dLNtU;FM%L(K zkUsb+01rQ8cB%NW7g66s{AvsTC&$7~BhV9Uk0%5Gu4q{)zP4uYLpyCQB)`e1SJ z7Mr2poye;(0C1Jg8D_#TKAhvm#MS{M71&P$6bKRV)nX8|$H4=_e>sKKcU;wvRu66A zyQU8~;o9E;gObGMQ)?MzolGVC{V6$onPj^) zw#>wT6b&`~Sd%GR@Vj;+!gy3RXTL2}8rN<{?Kmyz3aBPv>LlleT;}cHK4VeZmOZ5% z7W+5tk=nX2#uNMbg#X4+o%TG8Tqf`<%R8-#DbM82hK2~OW9Wl4Lok_Gc;|? zl44S0SNLzgW#*mTxbJF1hu3`EZY1k3BG;Am|FYPb_X3Wbm^Of_2@^~R#^i@Un@o>K z>8A6nWXq&cv)+FmClY!$HF2o>LA7|ylqUw@2Q|;}vHlXXCpWI4R3_jcPq)fqXUX33 z{g-gUp#T*$0m|}s_cEi<5P~G3%z4!La)m12p}Zu#3Bromp?(6rEU+D;z<$j;(#u>* z^Wxqp^fvW28LAU|C&#-3PZ3xkJ$~#XRvnz)1^(9sX%tTo5H5>4CJaR)R^UD%M!-Zw zgiFV)3>aW?(4-(jqZ3+j5s^qY+_E`JA!)LN$g;l`rsAERD&ga;i3re{$FI(4WrUEW5XS_np)Hj_ z3S;z4VJ20!q%Z`HEI5b~loW)LpkN>YJmKP}$djR&b;5;>!-?7F1SglzmnIxTkW3iD zBRekaqpO4@iJK!c3NUZ2fE%Ra-4MXQo30N2juZTgFXq4K|EI_vDm-6H-0_*q=iccQ zIJ@1B@0qW5I>qV_kkw-I1YiCwmL*f8*_l?+dE%f^QT}b7@1`>q!E}P`XXGr}$T%>F(k6ObYgL$7|=VDmHRjnDIm!DH&R9 zX@LYAUE&m-k=-yOsEICI&aRIYkQApW77)V2Ns$?j;Jq>61~O?CAkfJH1p=vhwZ+sC zI(Q^mK<5e+Rv@OZAPk!l0vkq!QGfxW3ro!Sh~vZ?EQ%Plh)n^78eez-6c$Y6#9L@GFA3-O=T8RG2{ z(*F=NTQB}p`H#B)usQ#qL>Q&b67N!ji+?sDY<&)=DsL-r^M8c=7xDbh{@;dX(u`{1 zUl>N|Nl7Uy?XWaO%2g_JyL{@9gAy;*Q8+3Ik{wfJ1$6+_mD~YPRXH#?E2y*%&p8Wmmi=AB0Q&AS!2 zd07Sr|0vdd#p=b^*L9YU>r}HTp9ISCAIw*mcYX7^d0BVy6}S99nJ0gWSo4W$pf0KZ zcvznN;s2l0eK~Mzth}l>`!cHj_U?Az_H~_ggKJOoRq^j;<@Dm4>R#5}-S3&Z`pdmz z2EsfrGdh|T6_vSV%G|QN58T<&?16i4_vk)w@4fe5={DUp`}$U5a;03}bx)sJdtJ9~ zr&fml-%r*c_@34g`G4L6Krzom8$-oAo|h)V04d%3=8MsNH~fm?TZ`*z^ITKPVxqJ}Nr}>u zl9G~6NlQt`I$z5lFiq+|o-2m`N1ueX!PoNKzoZ{9&FkKgFdY7#DRA>H(lr@yvg95q z31i;eOYwTMuisSPtkK&!@ON)L)j2JF;x)H+p8M^U*Y}lPs!@$sE52KCz8-L=Pkl%E zdN0jef?fSR{r?b(fqjS1+;>^kdg{8TuP`ZD${aiOwA0>JyA}8UcigS`)F{SEp>`{- zBwcC1hG68sQPG+;PxmyRP<@xj=%irye=$$KSSaBC$05IU^HBV|SD>V%B>n%B|7YMy zR~ow&Hz}c%N=T>PNS&v9m;OJPCtVllG}_m#!~ZYj|AYKLkpKVj|4{!UlrhPg|MwyE zPryHqe**qr$3OZ1IsPBWNx6i?a}QeeEt>yd;K^~!=icR0sccdzAu%=Kx+LC`l2Vf; ztkWq`az0t&IYHXGQ|1nRBX+90|8tpR>#aP!|*C+F) z_@?`sMnx)Kvr^#g)=?nOROUT1isIc0Z(I2Pt0zM_&)4$j$li}2NjjH^b9h*9y42%4uIOs{6#{chl(%ShcYv!pYZ4os5e~%|E zoBvNUdZpZ~yC(|VK7NfZ*F{$=pQ*kXYya|^Q*jpm_woO~C#}#fW972&YJ2kc{D0O) zd27bnH`w(Kt9bW61Yw5k|6{QKzyD$I|Mio9{y$&K{^RX7isGc;idUURlXfdl(rL7F z;F_eeFN`RH7mOSO*A zDyTV)w@T(u6kaF$^E4%1*btZs ztkVkiS|Sx(L={-4k?03||3_yN$kE4142gb-;1!N5&~^`3t~-X|0WKmlqSZqCaEOf9 zNnA*@hPTIXAyIh4(TdiJSC;5%b|3d5BjRM^IF7Rmi;b|^D9T{48H{L*IExWoiQ_nq zqBzpR5z4Mu;&l;q*mYepLbxkS1_CldI7<}H?iJA$?9xP6c!uS~oZP;nZsSfia8LQ}hGuG8$ohR|$@*Ak&QBVO69;5yBS zw!|wVLX+k?(eD2&Aa03g!~}k<#2eo5%7)TdC)te+rLj)2I~zh%0Tn0NrG-PZJN^Jk zV7#3Wq9~feaO#cx?qEnlv+zp@O@rU?iG>3>9m?(6$j|cxf~sR@W7K5Kg>fAlTa4 z!ojd$Frse7KCjoM{SN}KD-w+{)2(X=cK>R;t}U-C_N&*mxDF%gGTaCR%Lm`D#A{um zY`jm@EiSwu*lUSCu=l&gjYM(m{U0${LAa18&fk|6yP(-I9Ah8yw`;h5#xdrC)n2Yx zO!gXUKeYS0v>MIja>=@L>9b6F%0eKs=e&X z1si9vA1tpso5g;l#w*^~>je|KqU#3QjwgUvE7}}8{^o+cMC-Dm zor%_3qA`|yq*@rnD}2#jFWKwoC8OcSC^g!J-Ph|Cd%b{WFdFUt+$!ShX9$QE*uDRQ zKy4Pn&@spzxX+U&3>@v+Sqx^Qxc-q`MB^A6$2v0$vo<7ua?D)m3$+?q3&|O79C{&k z#UaxEd{TJ35H80f)gB20QIz4vp&de4UN}o61|WtLhhB)?F-Aml)kqjfd&kt!GDrh( zpC?TWq8-K11vK_~f@TKs&SI;jxh`zzHH(E-tc^~zR}J^qj$&v>*%fiJ818?t&~SFo z;Hu$d;t0dVh-Cj39b-^(-Ov?U*V}tkBn(|U!XhDZ6kS(n3y0=O0|gFttsO_mQ461- znc)?C`NASp0O1P)G2)OZWn>bGe$R)v*U$?wC)gE-UPvS4^h?J47Y_#hCgG)>_@h8z zlfui#3)eV=iZLGv3>g>5iQ(2xLSUoltLKBWLsvuklTsLFp%N1va4c+~-LX2Q5a6 z(Ny0HH;Pwi3nvokKMGMjWGMdVdckZ=1~kS@2srVIE*oA`Rz7f_Ck+R$p%LdALWz7h zkm7}H`GNa97Oe4ls&YjL?(A6(a+|))wv+6JxR1D|TIDcxhG??-+9d z#bB>jp7H0k1eZI$uK2Q#l-40F95nHc;utoeKnvUs`v7@0j&DU+6Nj*%NSt`b(RIf> z!MR-H_#_V9(Yoa1p}-EU3`qop_9_84n-Rr`9*(TzV%IgkVrFo$A+&~r5!oGFVlAY= zbzLqO4&)f2F-)G+io_tIOB_Ymz2dzh1sLF5u2HJyie1?d%;l27nayTDKR-W2K!EPm z&vjj(AJ>IlGq`bRObs{UUO+=*M%);~jjtC?c1PJvCX4MRUUtr_iy%SJ>_8iX7Qwx) z>viqxT`rf)6|;ea-Pa9kxDa+nF>1iThGMWEMIdNJMP9EW4G2K{cg12P$zyl$-H zU^mAQ(9clqr#71nku%qY!NwU1Y;b>Lv@t?|T|ZKfL3q)m`GNWyi_vDIjA#s61owBO z{m`!h@-GpZ0~xb7i})lKS|wY=h9m}I4>pRm*U5i4ROE&`Mj_WY(r$R4W;7aY1|uq} zk>lGbf%ZV2=<}Ru1NV8(@WJg!@|wv+Q6|Pl7cCZ}{kU8}wEPgg%MOJ&8mwkr_60;6 zdI9LphI~BI51SNTkw^%|L%MLE=gbvjgkT8#To?>yUq7%JZ5E@&XfW4oW?|xxh@;VJ zH7m0&5=N83T&^D(O(qj%_jP435hlWDI^^I&Txf@aJPAoby6)^g$*v4Hv#tyL1PKHF*eVcHhIoq5QbqGB$P*jJwIfO<0$0Air4G)^6{gG5V2S+ z_5%nH8D_KD3`meX5&$4btyZhmf(Y5sM@S6_2na~X5FTO-sgWc}4kq%Yq_CiWrII*_r@XL&Hc7 z2oNAZj2J+}W55vuj<~!Kqt6sWh71{Uq^OS(MMgzNu{>wq;Kq!7guso7$@=IpG&D41 zgaig8H6lca5J8fJgd{a1MvNFqawJBd4vuO^jvP61gwzKOQq9Q7$Ox&dwNciRBuSE_ zOv(`k5)u+plG2YBO0}e)Co*t5!lI-fG9xZ2NoncD;L`-|#o$u}P7FRd;C6&XOEo1+ zKQtvZ`>{s~`LN(Bfe!|_F_sS+TpVfO#^7FzI1Ye|$>IChn!@#f z+t+WJvGTn=SxH6RlJ|A1dBxH|GFkt0Kz`TFdEVvp<`r|^-s{vYSKxVrUEf}+uW;wO zU!HeI@lLP1bL~S_;ND%XZ$^RV{#~wpy@xsQW>o!Qt$b75Rke?=InCOcyAq zT(IkP`#KQ!jdHD=mPTjZrNEu0_y*C-aaPgQ%IUe{UaE7s(zn}cKJ!M)CnuZ}u%~%t zuxk{jK;Av`s)1zknoo_jSM_QYU(>wVXO+Xgey?`fXN8x$-{6X|E{f``i#tAf_N6-W z%AV$R1@3P4bu2fCswyt~PVc(8KJy7gcigwrzO0*nd)I**i0)E-Q+&0G<5o((0#~Hq zdUD`}n!?@ev&!|{E4j|Tp0TiR-S;S{gSurulJdOI+jUNN)S2S!>%4QVl`l_U)5xfa z2`FWky%go&t}42cGJ|UdCUArKiu1glCoUN<^SO69pvJeC>U^GfqiUD?<2u#9HTQg$ zCIdQ*nUz!BQ`~t9bvueV?ifY!u4KSOQM}9L73*%d+szDfbFR8&-{G~Vdx!7tJABWq zd3u*se)0Y7m3L7T?=HT-b@SFdbvsZ^bv|=Bj(eTwGu1u4Zmr_JNR?W}cgaO|3*~f!fOQ}^{b<1GBx=C&pUb#lE6bj~u2Gz>xoc&tvF@4qR<-gC=BssgUYq4QM`FDU-8T{zxd{U&zyOgJXwVPhpeKyNLk5UiRvOnmBW(Lg0o`fNy|;K zuirK2&J?)Ui{oplV^S`aN=R3Dx64;sF}t-T!Pac+e{1W*trxfcf~{Y(=709G|4;L; zX6t2JTM}%o+4|qwQuAA9{{Md_dS#B$KC@@?%xs?K&eWOsa||q{9CxM4|2Mz@d4)+% z<@txxzQgKoTe;nK`P@4tOMp$eHLF_qceUH7Zbfn5J*S0#TKJc9nPXj(k|jVXTKJc4 ztDn;oYo6k_+tqHPPEBW4RlRn8`*EBl<^Owdc@mey|My*9*S))ar~F=?zL)EpeO5P$ znOk?xJhKyDOWyTQqyN8oDO5i3+Ecqwb&j{_u2U!nG>TJ=Wv6+n*RJ&xL{$~{%bf=~ z_D!vMiiSm%68<0Sqg1Ko&U2bubJw|DR(aAcV^KMSuceP;Ukc1W-BaMIr9_2_O4I+} zn`z#TZ|=DBduG0tC`R#(Z2IzLSsv*bJ?c2Gz1w%xE%`+;Mu9sN?|P{|Q{c@jzWK`y z%~%=DVV>f(-^eK@GzqU6s=vm4PVs^8Zjwyxygk>Qv)jUQgWd z|7XcPs5?OXv`Y_Lty%X2M)j~&J~x*hwp#OvGu4{0q@;SOUh}z1^<0%Z-f2_?Ug^2& z|DQ&^)2y9drCm-f#pTpeDBkIGr+Am{sQR#vRKG{Hgbd}=RRxo0$6P3`oWf50fK zr>Z9_QBPeGc&h59dhJzASgg8Sd9uP$J#pz0^|S@|L`C%kg$2qg>gfv9wX*VrfRogg zEnT9XtgJ{K5CuhLRdubPoT#1-c(RIuio!i@k&<#M01HQmXTV`%c}M_87{STLsu4vT zArM$hZ)Pz>C_)WV*f?O&VIL@g*sOvRVhy|@K8q0vp%x*ACm|}2h(NH&<}E$q5(Ao8 zF9GP_$>4HrmLD9#E_Uc+pCH3VbR)$F8^purtsJ8tGXoNNq(A%=D;iM&trdQTTOwSO zr0IX4p(N~5Mx9sd-1!?`XzUSV4iKiWN6Ln3{+tk4mWvyTyqGuo*bkiO*eOZ$c}u5C z*yDit9;Bd!U#5WaRK~b@2C9hB$M)&dN9@yQjOPGI&l>UTV@vR2NvsmgdNiU?dU1>D zsn{VTL{b0;tP5Yr!W#~tz>{2rpz*_#5HOmA@Bk2!B8VDOknuFsJos^s5X(i@;ntQD zEF4z6@ITbdZ=%io20|v-3Y3r{1akAnYVfzREIC=CC2G_J0{@{Ip%)<LPWZ^*$UI2+fiiiajOM*-&0RuQVCZZe-dL<+^aHY=% zM`8;>4Be?B%1{8LBI25@D_RBmNa|N2s(oZ*F~Igi3cr$sIm$Jh$nIgd#rIpn{@>?D2S24?rDL9A(&(V1p^~2 zST44}g2E3YxXF1@f<*!ZBsqwALj*TCd|+irqDhqzNrb?_6b!5f6@;n4gD@l*F$5Z$ zm4nrt6oLg1%7Va(IYXxPKn`WDDCpKnh2IJzv@s(K0n{GB!j^IVP%{wYv_Bqj(MK)- z0Rznc8AUK4#0@7hLfTk8oe7YLY4Ae;Ig9@v-fWSXFi2ts7*rr*r@|5yMZj_7KMe{} zM+^vRL-fSte^p4q#DW0A*z)~XZ4iNyCms+(jQYYfVAiX6@Vf|M$p`YDX8dE-Vs9+(hhO>)KL@D(?$?EcwFVcr-%VuQ30?43?x7y1D_b$h#?0>nqKAu z7Wi!7LY*H_fb#{M4NBnC>$s6sL^X=whY$EH5JD6M7~1 zW5fbo&V@pNz#0hn%yiIU1{ea+XA4e`!wfXKXafLS5ODwl&^W4CK>$23KRGPcIOFIc z3mMQNWppi|5fg_S09>K)gbzlP2*D~23XCYgl_Nit|Bm>7cmzzG*Pygb>l$A&XfbOagL;fXJ`Jt5H01XKrAw5oo6#yt;+Q36pG zkuugWv1bo9fs70r%;16&I;61&%M=NSDO&2%W`Z&H9Az-4fEhS2vq#FEJvJb`bYKSV ziU2h&;8>$imJNG=h@*uR6>w-F0F_S=5^auH;{Tsd6L1J&fFDqZQ+_Csc^H$tBX@trDKUqYJobD*|rdxMaiY%hVqdMGyzam2Xy`A|6 zPn=g2bIIE4x}Da&u1{HeUANOu4iSh5#MYR>*0|+`drm!>y z)mRX~OU>4}Mb={$L}-F7nF8Yi;t*PY)nZs;Os|<3MQG+?Vk-t`Ylj#KWKTpB&ZyPd za`oAA)qW6QtJaBt*pdkWg|H~DB-aONc+h-^aAw3{E5}fdArZ-z6ce)bIpazaV}eN$ zbBI!6ENqEfmXcnxmke7X?e$|kqAiJbtc^!AEUqLl1zta1v)7o~j@k~HkgNwx0Wpp< zuOH%@Gp;1IjEot7H)ll1c&p`j*+wfOiB`s`TF@(meSraiMY(tY*%wW8jWtmeLlGv% zMAIfl_^hlYDO7JN5~v8SeON*qWU~Rg%kyBpu|RmDsAdm0R<94 z@KD1GNu>cH0Q&}fRpS79w5Wm#BXlqmK?7nI03#K30G0xV1oepHgP9s=h@ebPNRXWt z090oSGQX`peArk+Oqie^HY<=gLWm%E*ujPkG`JwwfC68nqM)F7;s_^xV3Q>aETBNb zh#-J)frT{`OmF}_R#XuL5OHomvz1S%C)WJ|Kbi5Pb_hS4?W~yLku2hfQA7Cpr%B*Jz=tBq{B9T zpD*rgv4j#w7~w+?HpJjT2O4C6ri&Z{VyGmQd*IljB?nLef^dMr8Zcj!RLEdWP-_NR zACXTOhYODIjhFz&0E97wFIXkvlBi@$8j_eqygdpCgIFN2AEFN{GzQroG6Hny5Xmt| z4T${tQS(6yGPB8Gu@@|Sy<9HQ{tL~_2oqZ{8B8_;#hk!oqL7-E1W`n>qSq|OG}dz1 zvG&T1S>lgq8|h5YX6pqM!eryoj}Rsrwq{;x=XeApLC6G%tIKF#Qij-?vgL|xf^eLT zTa4J)GQb%mb0n~?o2`H<5`^Oq5lOW}O|B$WY`tCuOrhbC!-)d%00}JE@*(?D+fm!$ z02Ur!TYnfT+n8ZW>=g4hW35@K^KkpK)8WJm~rCf0@sKq1Xl#Rh{i zYRO^VoFTwfG{Z78;3Z~60)uj904W@BCIB1sAeGSk?6#;WVv7dkkubrJk{s4c5HSkO zhZ6~AFetBC3`l$eb$}>jhGmVd84T*DDwYMv6PB4QORegZGJvh1@yN;SbtB;CHKRQd zHQ>V5ES6=6Zq1fUBwhBEz-#7;@#In3*FdsixWJSg(SrjWVkK zt$~I)a^BPs02b7kDWk=&czI_wAZ7tDUb<9GZ9yQ*jcG}d0Y-@2@dzXOm@x(zRGN$s z{qO;E<3tlLxRAgTm75SAHQK9)I6ce&!wW2|kb)Z%x)dErDoJQ#Rn=!t8oC9{C?km6 zwt29D<~2o`!C>fsgD0{p=)?fS4T_VX9kf{t76b?nJBZ1rR1^YGSe|Z7mW*`RfPTgk zG`PS59d?@hPy-DCF!ROB6DLAD#wg~X;iYMc6B+DfLj^tDph5@$Sn~i1C!DZ>R8&)x zBQ*<$_(s^qsOOdu;u*mRxp3LBScF!D1dvrxqautVgd&U++91{tUX5dH5nDh^h%3mC zk1#0YVRzUFaOntbmK=dXnrjxyVzCegbA_W7t$qFf?0=9$K1lVd+MgjpLhx{XNg)Fu zh1fs}Swjlhdh_!3HM&Lj=2P=jU#@T0H%f5DEB5U!*0%?BLUKZ+NFiECAyZ8A_EMdF zS=Z=Jk#dXfndUo13Iku@7@&PnXTYK8JPn zus}AZWPI}C2jdV}7>l_^(b^9R%MafsFjBD(i{knmFZXl!fa@*_;Mh$ zp@oG#sH}Zi*oXF~6vNl6Xm;%wh9d`dv^JbsH9{+UmmNbfTRSGSHjH%%frK`EjiJpG z+R)n2+E-{3utC;}VT=fu2m`V`tmP3CtqC@?uh801%-L|9$(V#S+Z3~|BH|Pa3&U|q zoQ0t^%HhO5FfP%sh*RN@AGTmev1oLKR(ux-whQ~=lO*}}?Px<=hK+?ttPNdZC|bM3 zCfS&+g<%-Jtk@%AIEGe9ENMPs2G}1RKSB|#EA(MUE7}jI!aK9$hx+x`v>Av$M1=h+ zM}(q%*%4-ctjHz|V>i(SbV;Ylf30&F5lC;$mJkR*seLKPA&Z=YJX!$>HqI|p*E%N<75Ox1=? zo2@TznOrVli(}$JKjL6sNkUS?@HD2jn?x1SxF3AlV2( zvN?fdlZ9lHM2bM?OO4{ogUY(p%)eb_ULMrFndU_*kxGs)isr0)IliX3<}~YOnipyJ zRP*+|z10fO@KzGhUXdnu52QJeyQzrDLRUtumGv=KrcG6Wey zSm6JcJQ>0f5V9aazyJgcND#_=X{3dJw{zf_qH8h`h9ljytdwR?f!m6C({=yuPM7Yf zbvKA+<&>Z1MJmlxJEfWnms_6q=-f#>&9krHD5uulkjk7_UgtQYw^!Y)`~ULPI*d*Q zSFLL0CZl^)q?OMUis}H|KqJ4*S=iUlt=FvPI>+dVZeK3lIo?&BcX>ro-BS%Dv*xKY zXYE|N_o{ARmUZEX3_xds4Fu8H9PT|s_=nwaxJ zP2})FO|bc(CenOR6Aye)6Kd@TCit)H3^*ruec^-F~ zp2r;~&*RR~^SD!_BS(q#6RARP%aLjSbS}^+NwOte&9Y08wL#M~*kKA0apY|FNQ2 zk)jWO1_qA*kJ4s|C~cPLX~tUjx;~wHds#DzVk=T8imgO2L{Aw1pX134u#h5yB5wG9 z*OL(xAv1s>0~JX4AcF_^8Y-^Jz>xtMsVPn}Kr$eM0y6l?z=Z*yGHhVb2JcwqJuI#} z@4GWQkn@Tq-5h7C6Wv)baP!w(_qyg>2dd`(Q$2~n)8}+^-LD4TBP9f))2#v9djp!(apT+ck`j!zYsuXb36qL`QKt+|{F z?$W$>Ja^{Kfoo5JxgYSSGxv3!mCL(z^El3-D9&Xp-7%J4^O@tgD%drudzY-kPU;VL zo`2d32gQ5lT+1rB!|QJU@)cC?QsB0df7{BFs(qY`Z0rMq_^dO+^spU&%4P;0MKJDGO7$-5M56y+$or!tn6 zGhd~cD(%ua#)7q{G6&)*EvtNPE}4g`_|9{;` zN#WnRLE--`3IDdu2>+Ii6(NLw3xfUNKbW;t@u@y~w#e~A4g%_TkwOqXVX9F2Dx$b~ zl0g(qpM)DN$}sT*n2%Eg0cdGzc;1E*u$ZZ#&i@NRJP6vrMZO79eqa-ZnSTK2IjO)w zi7dZn$%X-(tD8T=M%5TN4W@qpidGjK+^Bf2rwG*nBsu)A2NV;oAx%7Q1vF>CboWgU ztRgV81%qEe3pAdvVAsZXDWk>(W$gVawJD2eP7$xAhG)Tww242U$qrOF0YHYg@;7Oy z$k9`oNs;mciPJ}!I)E&qgERig6FU4r#Rfgk}ZWHZz19;f82aN*+;ESXLh+$gT;)$>@@w-!|%HJwKhLDKq;fH{+ z?XmL%oDYJ57qCa->3?WJ=Y|=w7~_3l0fR$o+Tw$ds1t=Zh5R077-o%N=Xv~$!5Z~c z@dP|U02; z-pCmfNZmk*VChG)2M7#UA*6~Z1qou{n81r2k^PXcre2zYscrXfQ$%qgz@u0C4iy&Kn9Ed3Bm|4fUH6FH8XZ-K@AuSUrT~Uom|#> z8Ycn^2$_?g9f2j~!~xEq5$VB@1lYmLF4*G$4O%GiF*j5ggQf+}$H+t>hsYRx9(D%I z3IId^=V3u6auDOj#=~L)kRkD${Og3<0Z4La;a|5MQ<$3Qcvluz}3 z!@H7>D4+^&;zur^f-4t5{3wEYL6$m9KPI4tj~14=;ztq$AavT0FHWJu_e2dbyf}gq z3gV!Fc~J+%4+$3fyqI(*j1r*~KJ3GV%?n`2@L?2ZBrpRSH$HsfsTWmb&WC1(91!GA zn-3N6QiKXqGkn-&2{mjb=nr=&@I!>Q#oIKvsDg%&lDAeowSWW>y|+G$;ekQ}OWvly zWXDg36W*p#vqKqAuDm7VMGYE3YH!0xAOR2pwBBM_!wNc0!M96RfaP#O@9hwOBS!_S zx8#=#fPB%#+i%)}hJ_{n2N05h3nD82UC^;|0}49+tJr8xH46ME5k(DSz(C+X&KXA# zDM5{Y8;~%wODO*@JV{w26#q@oSu&>e|G|#@RD^*4HB}ujASM1!5Tt~SI9&LD;0sWN zAY%CMH8^^0ru_eus%Qch!#^*M87OF+@NdRIMHA|n{{_$>9jNmEPL|TGI}qJfe5+Ca zFZ3VQAs=Xg%#Cv9d$CImF8=?GJQ;x$8vzKuC~cN_8-WQ-QMPFC*$A?La}xjot~Fys z2TBx1FjzAduwimT2cI>wCkdt?Qlzn48B9HCB7$Qjm?GrF9DmGJ>BZY#ZJdk_kUM*3B7Nj^dEPWMSB2Cy5q7bL zSVE2wl&mdVhYy}2FmCYJHM+oXBC!m-_2)I>59}2)gq(ljmh!w<~p#-FuVi;9)u8Jki2)x5ozy?!qTtrrK zhS0D89hVwhybvey+cH{Jayiv#x^q9Bby(L+^;NoNtbIVbqk<{!D%Cu_%4*OmsP!`l z)UE%AK)3b(5Hzs$mH=iPV8sBkjDX|+?V3CV7_BZT0{DNM0RrVcLWC9j|3ffPNbyFf zP8A*ezxbx6#tKLcVnF@BojL;z5H%xhF8F^@0hLMsRqW`4#{b(fvd-LEIABZ7|Bo=J z5W^G!J|ywv|HBukC_$9M)egS@w^>k(h-f-gq4|GH#e*Rod35&h-RihfC>kE z{~uaFWCsdf7+Hde|F`N35A3i47&C1+ERI517Ird#_o=|2|s&!h$aVdM|z?^F7Ul~Mm$NJ2_pT6cj z>N~wrOrs*-uA64>`nP8F%)WB>Ro$zq;+tX~)J3|tqh6|gJ(%LV&)av(H{%7u$*ns@h(&s6j7?w0|R-)=lKR~<>YzNT5;?91!6QdZ^LvCquwwxY|7rBjS= zzPWrtQEa8W`M1rSv1}_7sCHn^JQT&d(nL{g#mu~;t5sZ2^Dl^}a^~fB&*gIFZC&N{ z&e6S9B&0N}D)!wJ?|S-Yn%CENnL{_qbGzqwxvZS#cF&dQ-l}O{-bOJ$bq?KIE!WM{ z{qpbL?AyL9t>W@7-BD$(G*2j;neJ4pxGH|GI4iHYtd@AqKaJ5{kEd@2uDOTR9AEPl z?mWlwnoGQ9(_DePeRB`1c+I(T-T3m~PIbJfT<$=fUVF#C+_hG5R(j?fS8^3+@w<0c zFVE5{4|aWOAQ_Ej2Xv}`xenYpqcZofs%n&9bg#Q#Qw#rcsm_@<^DafVJaY%`@=y1? z)2n(j17_c0t(;poFK33yeFMo{Jau#C+=SA)@9H9Oz|4T%6dJZ45B>VK2z*V^||i7L-%g?y{egS9@eO;;+^jJw>uEu z^oU>WE^p%-@0nlTzGy!8@AguS;Av|2|A1SEFGn@*`Ml|hGkSNw=-%qR z+E`k>s!X@eVU;&~xjoIlwY*%fc&C>Kbr~>kw>6t#^qPTWvaj>iGPlKXP#Fzuct20%y)W^_=#qX zFHUdfIHObduKVO2sNOThC<^4QndkH9%pB{Gp19zsuw2aX4(gU^K2ad%n{`K-19Qg0zFo(<&QpzhILOm$_Huc~!WqpReY&NY znz#FUnu-gTBhx6oQ%ufV*Uh8i!X=mMJnMLlhclX6e?QLKH_ffTU)lFwFBKOqSF5R7TDhlthXQ#ymAa)-x&r&TV&CPu=)9b#Z`mvJJ>sawyu9xC)w;8K zPH*;gj&~>CtL|pqPK!{y+vu6Qns+;Vv+f4bbe}2C0Z4CC@z}8LU}*ue0lWe@0dULz zmsXtbfV%8({=YZjZSWTO6kj#(nmOMNxVxF+3*13dU)##XO2Vqa>ZA^tG^Kg80#m44 z9<7_#H5t)*O>(1j3cTh;3ZiG4 z^~%dXoTeMaxAQW3ZrQc5BVwoSe&~wOp`Z)uwtSg+y73Np3?{&|^VpViBj-ZyOb&_{ z4Mfqv0}Vvk8X&ofQFQOP#=^eNfxlGq;O?p3DMlFx!vGR7V2FW1%mOwsOeN*Mb{;VRS{_a@%Bx#cK+>t&vjoFcsob8Z>uX%wPIf0 zHn~+bK<}J_Q?kP{VUN7)UF1Xjyh-2+v(bd9KUZ|FARAK@NVizb?QdBIG;S66BiZe+W~)< zb7_N%9xf(uVZ+5~3mLX8amw2*`*!&0OtBBRZ;7v&49@ z9pk9rp#sA$uSY1#)AxwV7L_VmtEx#)$=A*I?oCMqweES^nzVAqDBkgGrRjFFaHw6tNvXgl#gtNu5~YPG2}D_Pvvb41b|YiEDS>k5%Tym7 znVADS2aZuMa0hQ*j{tWt?Q%;a^L7K8MfV7&(^?tjndZ${JczSUoVm`*J;f^q_Ab6@ z7FMgEgn^=i3D1|DNevSdCZYc_KUv_3%?T4uE^zYHWRI;$3$`YwiDr(S%ysu2#)301 zZ{wgjrG>dfp?SS}w>if*h*2aTXHozr8Q7SZpEK|B^j$Mn&f30v6x7}QOS>%DVo3_N zC194k5-PGT7c?s3+UU$$Yp-gNPKlQ#KDH$vmTFiM^IzVO%BtMH=|*v0bLWZ8Y+K5q z6i2Cy5)@k!o^r3*fviJO{pFTOB@b%tpShYm6#KI7@+{~P5P3u#NcqZlOgyQYJPGwXF z+*hP%ZKos(BmshC3nV4{XJ5ZaxY&?jF*4)7T*5w{$y1#R;*Rs?rBFsNs5q}%Zv^K5 znchg~%(|IHsZ>!BWe`1ck!mXRlU`H95qC9hN1*$#Gd(94Dt6Ojr9L7jofTTZW&y4*GgF=g(6yrq+#aF%z^j!+q=Bp{KIL_Jj`z} z#VD%z?SLq#C@S0+A^;#FMdSui5H_NpjYudfr#FayWN~wS1+ILbS^2iX+qdVc z+r+=^E?~R10`dyn?QquB(!9LpGX?5^9C-7ogI_KZBuJ2yTAG(vm7`iq0TsO7R=`#P zMSX9o%S{vLfVK@OfQqy4@*_RXzjUt}E6q2E>VBDXoGyRyaqMfdQg_cB`_w1C<{yx! zd&ha1ig$bkuTQs|m8$!YqJJT6ybw75WiQoS2u=u?PqVst?)88?E2lz~zU08Yw=D>r z4+epw>TU~So=Im`b+-jk>S^5#Vgpjcf2r!;cX;)2?6U!B0%V8nhZVLTGuVElDUFtj zq^eYH#ZeT+zr0Raxt!+Gb;L(ANN4N2~*?1J$;e>6+2|ExVAdNqAE4pJ zO)4r?TV>@aRd=Lv3sn~+CL}CYT`s;limLn3x_K9=ykhcOnKSS5BWupSAXdk|?(6xt zxs3oGI)Je0h(Jft9Gk5Oo6YuwyhB<+ZrRAwMv^)1EFoE$rS5$HP<(m1Yg5%$X;!6j zzrhs$Zr1j#IcuXq6nF2@?%pG$@Mx0+9G#k@gXR#o8T82d`o%Cs_XFV(l?YgSd= zO)K+SU8LY8LZrL`byu8borz*p1@<$q7~Q2=-5n{-+GkIJrjKKvsp_uke(^n1)QXSe zEGy4^qr04WIn8S_`XN#pohZ6%dW?9ws5Sr&tZCtFwX41R7^5NvIL_@8$iv(k`H!bO z)nL8?;{R4<<+KS!v6ZIF@wJj7MQb~uDBjT&u+f;1ASrXYPoxxx1WDP`oZ{b_r))DX z{$I=6W^Bsf?suQSDip=GnUuaal?)8>Z89rlX#UGw?zdOo|Br8zsWzF9GMKNja%yB| z<fYZ8;l4WOf6wWW!D`0Y_J|q@z3^3 z;>14NE6pp)_KKB3-9@p@W#=F7vd-p$;s0G*|8H|y*<4I)BcA^+aZq<{Bb-OV*+%tC z(>6}&^pUrXx9{FXQJhW0Q>GmIY~mX(HgU@)f_W8Zahs_0|0T|{la-@vAsk!i`*mMi zSj83=eTlPKJm-mdaCe-|x+%}R?ow@@P-nh2J5`=mRwye++1}3om$sL~aaPdV-p!Y` zSF!D@{J+rK{^Bg0t&g04-j3?SLCL%3*w;t>|2|dLtoF?L==shki8L#Q;*;h7`H(lL zi^C35y3>4Gi6f4wIBwZX_vqP^#2ya*eO7zS|I(=F?qPz0qYV`A;BfO_=5_yqDc<}Z zo!AG*)c?bA{|!C=hMX_oVDnIKsK1PRW9rK{gvws3q1>?3OZS?^u^VhYE7d1(yTSC2 zeL*e!b3^E>+Q9Sw--etv*!*@?8|MENs5Z#|^6Wch1I`sK%*6zf$#>mp{sB}onmyIJS-mO9B$QnG9JqLq(?Z4cij(V!OG&M=dojI%Nm%Hw%<|0Mw%P)7$Rc)n( zx!i76y6>`=&hr_}T7vnisp%dyH9_5@CMi*w$JQ&ZLLW_7z+H9_4YsN2md zE2k>(YVR#)=s19$1DtRGEC-P3c|wl|dZ_4mGi3OG*;R2C$KBg{ahIoyE?03D&pxZ& z&2{sxR=%meXPP-iclo?WRAva3fv1c(WoS?aRT)so_=1c#Kb(14InB!H59e-Flz+Pl z-D^;Hrub+j<3ZN!^`Zee(3>I`7uIX3W!h7|63kj55Ta^RIh8 zF??dQIfUK++$7*BW(fQO3A@l?Sx0|O2iD;Q7=fQK{y7X~OHb6I&&d~fEuc`G)+ z>kB5n(BKO#Ul6$y#+|&=eW!V+*Qp>-r`OIiRS|#zA zWx9aE#U3tP-~!EGG|ed2TnO0_!wwvzbf+tjckM8#!$uu3>Hwfl&$unl*dm54thP|f zzFvR{3V)v*Q^5hMbTe2&6}?@nszC%a3ZgG;|dwB*m{nlJAQ=_oi2Ewg8`i=Iz|3{J>Yiw zc5MV2Z?D&+iAp}6wQC`rYoVw{48DL9xSiWGRHXd{IbDTONvB%*L*8g&g- z=3SbBWHfqtd-J1T=X=MokLQ(_SH6QNTAu4J)u;~Zb>Co$yJcTDkC%};&$^2*$2_n6 zmpccd7%L-XsyTh;EHUTJ9NioR=D47s0SXBI|ChT_PIoZHMYrqi%eqJWsOthe!NU_g z@`*4{AaQ~VC)zjx#tP1zAK`7Re*VB`#26%8KTDqj&Ef zy1VsOT$B|lig{Zz56!z2Ct+uYB+4XFCNZX6ez`-TI-GTPrz!9vWhx}fAYoPYBog+B zG5*ZTU5*%Y#L^KkBaARY1tWS!_%LGpS8-NVUVAu~W}aqlUZkMzsNCt_?mvyuBGe+f z6tUyKJaaFj8cVM#NdyQa5ebk)^dQ1D#G4_s{;RYwm)#He(^|Mn2m=V=Mu;s$0&?OY z=JUkuexe(f;=W=P>0Gt1;~ysYq4xvS4@W4TFGNInGl@TIDIPji*3 zt%7)6@#U&kbvG|k$yJT(frK75*+WwgLu3zMnrBu{k*o|L%m83;YJj5voY)*5VBkUJ zAqcrc8f7<4^JZU~uWQ+;oy&bpbqBW2~Zr}}4_ z!4;#x9hV(2*a6*v$qqhr7(xdbzBHXW2maEYE;HIoHNW@<_u6^ZVI*_FAqO!zK;duz z9B9B{0~~ZXMBQ+E@`fV*pJ(0ItnPK{mpjxi`+5qz*>@z}EB?aqHM1|P>fX#0cW>q| zcXQp>%)51CF?C*T;9~<5HpE~98XK&wC+6N0}F?JoD9Vqvp+g`?BtdxxTV$p3f#<*I$BYy07F^qbJU1(>;>1 z%U+srd54>nECB{lE&RJj_o%0u3)U}p-E^k8NlI3ORz1~RvKs7FzucjC=DDW4)9V!f z<*qr;{c_hhj$*8)rmlZ_%RM^tnF6;H?)bcNLZ!Q@r~21)Lj7`w`sJ>3XHK*BmAuod zJ_B%ZG0ge@62--!g;!h*2WS*mt-Gsw-SK>-Yvrh>CMi!+w6@dKn$s+)VAgWGS;4Sj zK=Q&DD!dQ^`9jqTI!G7hl(_SJ_sGaRa~HGdc720ry2~@~?wPf))~&IyFYCDeB?Vn* zS3<3QYfH*SdV(yymPGx<2!|3+hM}g!um^D=F*7 zqC%Sge-(7QtFYwkJScQ;T?%tP^LROhIRB;9?Pf)$pk)+9i&9()Q+Zu8kK-&HnL^Qj z+2u($Nu)>UQHn1Q@3QWmSylIXx=Hh;QPDl!Or7}G^-lBhi6h-Ss(T8&XI^jC1@VvL zEF6hK694JetF|Ih(E9(fr+BA%I_+uh>+8go4RrnuS&e6aWQwvRI5(9E#&S2O@-wF$57A7ytke2m}EG%U0Tn z=o*iwQdOCRxEi1=mu5~Q!n3!Y!R}L@1yPgydCJ6+pO!QB{zY0aa_{JDazbmY-yMJ6 z*a?AX(9Yh<9I#5u+YnmjvboFhJ1}2K9X(7 zp9sn8iPzqkxmMBXqXqg-&*>QxCqu*dAI`@CWxa5S|BcYehR*JLJv*Vy^dWOFetr)+ zR8SlUKV~U~b2;p`7bd|#_efL*4wdx;i&G8|Xxh0w9h5My@=hbhtX>5inhOe(H#qZw zKE)nx^D1`yqJ8x)7aNCXtV_aAZEV|=&yga2)YrJ>rX$!7&xQC2teDpc9msZ)+w4Z$ zI&_C(+@sv($Ff1@Gzi+UYmE58WOHq^!MuSbP3CwcPp7ItXvl!zDhmUZDluYNE9_gA z5MGt^{)YENAuY3G09so+8jbV*3s&19Ht@kiS8eJL!!1#JCsnuLkSN$Ql0ys(PIq12<9mv13hUP41ZQ;BbUzrZlz7A12y3fnmq_|`)MG4OSVd5N17eTi@(pbqxi1R zW-Z@}^NA4a{$)YCy7Wy^iqr%dZ>YnK5ae=aQB#PG<{}NY50NiVPFx54RVi;^@Q300 zJcrSag&*A3-hky5xwz!^*s$vu(RLmASC$?zg|D4$eoD$RlY~Jn87rX}-Rmo6xsgf& z3d@PbSF+6VP6IdiaH<>K5$hppamrkS{v-Xe7TZU_cd`h@;myqjkgBW_+MBs zoXk5|e2qQth**#riCF{DCT0Wd!rdW+4NHGBF)-{Ln)Sp|B&;<032#Z3-hp)wmG|T} zecAgm{tbj|b_M1Jy0@d~UN)j4f?UB?55Y@OHH(FQ6~YaH%X)6^w}!}hTO zoeX6+4pGhW%Z=-GO?~vUJpTT<=2>5d2s4O+jV_ae@Im(VB?Rg5Knx(*Ba9{Ao76lQ zL%wIiNBGB|xYlD0_vvD_cVsdgN;qz~CoL`SEaJpZvqgBhz>m>BEtj4?5wEk2nlWj# z*Oi2e#=pPKGBMLmKiIEKx~InSyv0YEO9Vw2BIq+S`+ETJL^*EOh6Ie9Va`>-!t>Y#s3ZKK>q^_X8_8 ztc~LTzrRjgwbH@MdDMadgm7 z#x660)ZMy)r@*+*dkjoDD#ke+6DtN+-ve4dOn&l_MXxC3+4wws*Z{Rg5m~E;YrQQDkQ39uW{58OTD`LK5I@qe;7EW+OH zKWcBK!MS;+!Cnt_Y0!U!Yje|}(pxysGiuPKG;n_eI(!EO#nmTR^!F4&BO#|6pyQi( zN0w*?cexPFHk~JOPC#MNz|Ej<7IL8kAqz=VSlG^{u zSLo7XViJE!m2=-HfXjjtINO(~7>*2W1r+$0bGsr%%;ej+aYeo$QIz?x&4JLa&?lFsT z^mgioE7efq$|xld86xAcvgzU!`Qu=!7M8+%ON1>S16&M@fXoh(_@@7mv9vC# z1Y`5gz>{Z#y59&$1j z@B6BruHzaxLb>=LDzyvhT=VDnN@mJzWzmZsYiI2T!?Vjb9 zO46I>zuUyXM{8E;Pou8b7T1qhg!G^%P6)OtjU1JefmRalC^1NYRQ-xzsKfz2PHe=4#Lbf!9K^3-if*YPd_6X9~KCb#W+125Mift(Xxd zHK-EqFafq)5q$`=*%kOn5LzT9&@~O4^I*LIcP|gnn4)tjNzqB6mV)SFTb|nX?iz3~ z+>Qtj-wb0F5-TEeBco2z#)Wvyk$*_T?u+PkJJf=Mz5j6(Tf!?V%OvvGzee;q)5*c~ zRqAO-zJ;X4#O(HMeSU#%2(lpgE{`#hkjK!_!i?^=9laS zS5pMKYnGL8!b~V)*I)bno_By(j4lc$&(D;m8(q)s8>7~IVn|?{O&MP4HSge@$ZSs-%oR?rrH}W-GSka*^^uObS8W;WPdLU}N#;E# z{~Y=sVdqRN{QHmkMWonce(MM=fduo*rAkTz$XQigx2?bHQ$RT+9fTne8>Co+h=hME z?_qVUKz!$U{$a58j->GIAxV%TA54u=1>A%u$CJ#wQLD{*duzXv_DiJHFlYbty)!uS4oid4oRxDOA$zmc;)*Y~OP_-9!9C$i$jZR|+dvhc$iNJu)e5>(O+;vGkQ zV2csl*Q1@O!@PLh-Q1#U;tyoUcedB{dFidg!!H?~H5!5^7p*-6O2>v)HVFTV-om+(|?iI^z}? z^~`~w9?PVwI@=?lsVwc+57V-iDdrervr9XH#CmQJs}X8*or2PIn62;8RQ5QVY?arL z{oUk)UKV1hS8QWdXcXFUZsNX*fv2*8B`;PgKb{oAQ`1D?r0Uh{#3%W86o2^4V0j7a6 z9VfT_I^qkK z1MzFU4t)KW$u`omJ&HdTl>9^E9ct1ChO5^ov7-n|=A)F1%4VgvLN;T-D71VPUi>3d zy=5TkM(}*9obWU|Jcb!ZTS1qzhng8zVp)~-aWM{vz!%-KnAoIOIh9m>Mv4?4e1rF_ z%f$6VIJ&}lpNHYps?w~OY5#Ee9+uPw3Q~= z2_`DQQ5qZ2ChouZw}ya3y?c~{t|tf!LkJ6Dvm3MOmkSuRyX`w&4_uAZTBL+VR6-#i z3fcnctF0C!7x}~I)6pjOg}q84XlAae3Gd`xr2D1r>vmj|@fU`pfX) zGu3vnhItF}k#D5{*yy|^=rWxy=fKBQO{}-t;?Yy$Tz(y6onmDOuK!vf4K@u@14e+du^}f2Etz?RW731LLz}4rD;l zoW~-T&auQlZ5Z>MvJmqzl3S2RK;4&0Hr8;UJu*Awtho`;x0Yc79}yVYL_`TIFQQ+k zZ2b%RgHn>G_Ti=kDNE&<)K6l2>}tNvQEOQ;Z#(O{DLo+-JF`F8+wPFSQ`TqUhn?0R z_UnlW@IKf)c@suDnE8$ozYe&+{Y`cd9n|2ewY+Ex=vC@VcY+2;`D}_J_3TAjX{QO> zfD!2>gw3nc75$`ig67N?U<(JGH|auU*Q$-XjO{5g)bBn$nm9C5ocKCNGlmzTy50gbW5B1$$rMjnrAEQ=3q*^CmR+)9P8_8D@N}=k zr4n;JCR!oahYp+tnTt^T00+VkgjzOP7)kf^`-buYE#Wb=4d`0(JS{}R?O!Estxz`H zfCJ9Q4xZN;_Y=-D?#O(MzY~Q+9{lvW6RIKUJWG&F(L!lEP?%eU4Q>~#<18rx00h`+ zd8`ajWRBr+a!!gr&1oGXkE$pNp3u`e&@AWuL0=R?*vYO^98J~ z6-J5mqdzHuGfblqBQk9Gqy7^SrFu1A>Yq^2mjV6}D<#rFTkGZwAsbl3-^3aTLTw;o z7LR?uPC7hmHT7@A3K#$P$}feN;HKoAvD zq{#;}Zoq&!V|lVq_NV*$9R7gnLwskcuRA#D3U}OyCo}EOVAI#Aca5U@trS;#XiV5z zRe-c%lYsr}pdpseTWK39X!7C3m!U**^$(Gpph9m~nz&nxtEeIjdyL_$sxEc+0{Cpq zh3Z>3wjlGrelo2 z`uq1CTqjDk(D4?hdM)Aog&oVCBkT{O=;$oVSy$xEW~1i3_W7x+ZCcUUt4S-KH)iCv zA6vU_d<-gjP0?Q&(9THlrHxqu)RS-U%C)2DsaIAfFSArf6lFQu?xscSXT;=h2w3j7 zpLN1X=cM8aq*e{>I1|vRL^1(&(^1KX4QC_gv;zOohQn4Vulf1n8C9pH!XpF^H4O60r4&KV711V z%-iSN@{^4xb7+D14W->(8RJQA8(&`hUE`?I>^ro&py+RE|9DlXH)$F)0Nn}0_SN+K1ViF&6s!?-4~@C_fwW2zzr3{fmGFju^c0$qkYfB_oSh{I3veEm{*AEohP``09#V^A19?1Z z01h}-OBcC}}om`;^o10C@Wsf)>=m}Blmzy}6f=A_d0POoi{Eg5usLa7jk zzIJ+@z-#Q`c}t`}B(y^8`Y``SVcE)Z{x1yHimRw@DwuHU{(P87#iW#3Y&0|tds%U8 z6_ZDbI~L+f^LFbw?{%eDtmr)@9RX1=AvWBa4l3Ug#WxwYZ^I z$KY4uYP*V%g!w+Zjm##yvmXrrH0dg#_XJQEU4J6kM*g9$p3eQbfY+XYBMSl3p->xT zqWvT+MBbS3n7=3YfHS7@gY0Op0Jkh^IfLHXJ(n1+y8M2(!Dn9$qi0&a9&Z)jl>Eh` ztr#s-Rk1K_E}mfjzwcQe{fXq#e--XJ-b~{$xs0D3(|#I>(3PXuR*(@Hlq`hdzCYS6 zmIA*sU$&M6i0jJ4Fy9_X1rbz|VNP1F z?_t?ySSrU6eEWePTKkcOMc%-?rfcN?To4&f$Zz@C{CW;fSv7k>EDNT4%I!Ggb-x&h z-DY>e59mnS0m)LK_@aIDq-y(~DMF~B$sUvzb`NyZDE!BwITObz&Z_9Ve`LfW2s;Hn zi9Wr>LqM9*eh~9PHA4t2X@rPAgKMk-9{A}p)|#UU6cLt6I@WVz)eDvXOnUw+4&Q0d ze_>s#Jx~A!Lms7D^M_qaknf6awf$CT%_NSq0#o#e1eHPq^MVb;Rc>8YxP>UU2`s|r zFVA8z`2__XQ10PFD|}z})Nai^rC3BR1m9}~Lbs!&LoORlDUYW6L7zmh_iP%<&G2KxjezdCl9f(jD@lOV7 zWZe6a3bgMJS5yC+dha?trKeVI@pM!bROeois;4uYE~1p76UT6VmK&DtKF~?v#9`$Y zaFX(t;fvC#Pu++5L({E*Yu?Qba%An4_b?C(32y0H9*S0XY!c~NH(iMZ$p+I zDH2Nfy%vs`LW^`W3ep6{yQOZ=tOP3jfR;1cwNxB*%|XIl@fVf(X>eEi7jQFk9*hv; zhE{65gD_JbMB0MF>y3kd28HSD>V`*$XTkLo#ioO zP^j&gQxSW*-+Q;hsE*TlqdaZp`pYH0Rp`n-FHzmkOBsY<{nzMpg`r?r@pFUNNWj?a zk|Ib*cW{5{S^fvncP9e1hX@uz{z5uV;fGdwTt>Zj$~fIN$`>D}Xs9w{qRqt-zt;Y| z;x_c3_D)3)s+@n?zHOAL-9SspSFM#6nZ*43}^hZw>RZcY3a`LKt; zBJP@q!F0ZNB-DlF8e%Q$ro>0}^B`B#p7-ZMhp;PcBwGJVW5QM?3VzWaH56BZxTvv_ zZ~A=zRsHlO#-mi!h|SP5N`k^)DxRa9{1opd-SJC;rdbRy_fIk^U(I={v3L!xb?kdT z_$~e7JvJ_JZ^Bb`CXJ)ECR|`(puO!0_BfT0ic8x{8j&v}lxiKzTBo+cn9mF+Tpq;B z?FC7x7ZVT_4z8`3hfzfh2=YMHMVlr3y_#vwx(}!P6!hJ7rLBEUFecTO=E*44d7lH9 z0Gy-47}gZ}m>I5fL4nS3p8UK{!5Bo+XLbeKckkGxJl8RdjusN<6n$@E&YUMSW9?m3 z7+C3VSC|=Dn`>ahY*(9pC=O^(X$Kz0ND~+b7yQms$6f6?XI=Q7Q{w|uKE$MmX89RG zWNP9tu&4(FsnFRn0Uu&X2d$VvE)Tk~!4w^!$N~uJo2i~{#}GwwG41i-tDwgi-~2pP zV=Vf%pb0P!A@fi5?>A-_U>OjRx6G!)M+dhVki5Suu7XZCYKC;iXqkbQK+#N7s;;~e zW{j0?a4X{1aoVcv&=HCK0QXz3cjx=<6g$1IUJgUP17EJ*s7vZkmIh#)x+} zXW$+S57C&wyKk`0FETaW;Bl+*CS7j5*gyEzP!}zgx^g%x)lq(gb~opn+=_@bOme9$ zkJK%lf1kx&b%;+~xb5z&aGL?9KxA#?30?`L-(8rvNPVRm3}?Oq@&Xr0dSdM+qT=`v z2mCrCyL7La8>6;g%4D+v8on+k(%OSvQvv-*0qF7mM5-3;hgbYLqp#QBH{#*G4P)&$ zY@^9aO0fxOanJ02D_V||#w7-b78hzTA`OXyPl8WeHjveQI%j7Gv|#2-F?f`v*iQ5? z%RWZGYxjW1lNT^f39k4S4bHaQz&xq{=E~~TbH$BqjHqoaTUHpPo$T%1Cftj0xLb_b z6c&*#pHqtbo6yQNr97_^gt?|htk3d%3?&%ZQ4IFPanu50pBiBo=1L$>f7n&NB_ydk zKqWPrU4seSvmGMHe8QD80C|0yU;iCW%N!iAPj@3Kr^7UM%FUoVB~U6OHoYqur{HoX zxv%uD8RF+J?3{Q=225Wbf_9@ZT!7H8279uYCRUULTk?wf0dl|eRJ%wXEKXQncuGbd z2#Pv^6WWP^0KmN-aX@tM>USYZnuH}}O&r8&A+?6^&KSh;9iA`cbq#ih*yz8Zkx&~# zB*I$F|0G{=bt4EtCU8$72cph|-H<#J3FY-8EkMWNv`!>^$o{r23LH>1DwtGRX{5&& z%JzJTq__b4e1P=P&o6Gj#2$_n<%*>@gbnx#QsbK8k0T4{WIV$iSL`-wsRLGxV{^DJ z0z3Ox?f|`nc}knxRH*wiQCUqo!kFwKzo+4)G{hW=IOR<6io!|tt57ePN}Zos4>J&vAs)RO|uPK5$W)b{A2nY#!i^tX#c zVl!l~shW{SA$FjD!+>vdVq`6gJKKSN#KC%=v#zbN3T_-)B1sKW(7F=ScxjR*O8qf# z=Z@N$Iy=t|`u2I*hnEt5wz{QJx2^bj_sl=CSO~$SJ;uZU%~?Q^SG>A|-%>WyVloIS zI-f>Y*F1*@J^ERs!VwY?BKse2krJ%6mFuW|`OK|Qy_QEN!i75k=Nl_y*2?w9dn@-s zFGgJ)Z4Nys1k6a$IruNv^ap%sb&3pYR~}oIa`k>TZlaPg^=$)%i+u@{F=vx3mA#mn zTxxz!N-y3t>uhfh=H5pyuG4jmUqOYcJ5 zL~?IW-x+JhynM5trLuS)tbHOD+CAwUMFlrkmh^n=sMI$CnLVj~v=IBmV8#+mlEkDo zJ;te&B57Vbb#jfRIVwY97s*!CgLgm4!&PY6S(_W&epylQ=;o+psN-s|+}RQrZ)}JJ z^I(h?UmH+6&X=mBS>?EzcUBRuieL=UVkw)!Q);V(kv}=^>M|-6>jmTkOvBVB_vADz zENx=ylD9Cjnub1lyq{`gg7J@n<)QTD*rUK*NIU8Hlg}bgM%l``-1^-}8eq~TsXH*8 z@IcTyvx`PCG|<|4U~&5#Cf?G25KtFGU=wd_NH-W`uHf?L;SPao&Le6@VSEl6(zED? zjE~iqZPg3;p|=n>;*bk7V3rGIs;TTSYwi#Po{3leP4AJu=+!$U`%qDti4xk^ZX^~{ z+OL3V`~y!xY{}_ZVy1MbK_6=HiT6Np=keB&FT`C1#SpV&QJ@khx>WT_oG8QY({_U$ zhQv@{Dbr|V)0o`b7S#O0#UpM_&iaR9o(TzR*)T1iP-2umShf-ypQM2rkW;xO*jat@ z$+_~FPBD;ZxuSwBaxoi>1|ibu;)%x9+(K}EUdP7&5k<7sK}^My+k$UBC4!JtSX)9zUx zEeT3dO>C9TubP=rnQwX9Vr^!8yhl^rm0{7U9+t*j zd<3JEfM%%{#vKX$klKWGB?ydd!YD`^&rB+`SQ#)W5qsY<%Ikl zs2rr6vg`)#o&^~(j@V#XX-QF(1ynFmhsaLhT3~`DKb{RJnUbY6m zRmZ9Fk=DXiyOXO5O# z6teLMUdhdLX`YX|ea~gDCH{J^vM^cw+N^uvGJ~Ww+n=KCE>)Sw_v6{s&kk>BhzB;_ zuZV}$Xdhkk^-E=borC6bv*7M>!5~vCXs5XCm%!l;-359s^^jj1_e9J;Z^zZ&x%RRo zylpY(^EHVL<`0`i;QHZt2$x;cxGdKMAg@EPMKX7O3;EW-rK7%pTWIEaQc-r&QKRAl8V zG_AlzN>{vrQc`yCf_<$NsSPi40NOym3RGN{35vX^qpnm$$*!Y2u#8qioOaF@p0HnoIte066#LnnvMlx?rM@lj0TmD$qg@|KmYLK!!BRx6djtTqWgHn z7y)KC1eKJle}e|oyxy4?s+CngZ&^aQ5+JTNnU0f~RfOWCdp5oAdIaYfssiaG8R1Vy zp_^RD+-ndCvmL*M9!bJ;k;aJLj5MFoN8@tQ###?p`m>w`0@l%h# zJ+n<~!6#t-j;-bd@ZQNCLN$U|%A!k|_L|`hITPUtc`m&cRPOo==#xDOdjuQ5y1nv2+CY5$od{Kd?YdLFRb)YJN%W zQc=}AT@V3h;wUF$y-yU)t9kJIQ>1#Bw=WLZZ*GGkJ(%(v);qfTA;Pi&l~)Y92oKj_ z{3@)%rybV_!iu!ex<$WCX(ZwD-_AC(-ML1QL+maE6c~)eL%Ki6GF$u z0$<~hgxlCavl1^_M=09xYvIPIM+u3qfp2A9dzh>;0Cb|5*S{dZDg6P)9KcOT@W>SXJ#-(s6;;GL`F zHON75ULleZOMXihzGp);m?a3y=IDx{J4fO!RkXo-EQ;Dx&-H8jqYJf=o{@W^KCQ%# zP}74R_lx<}ICIOh%t|a}$a`cRBHNFE4Jy7G78BP($673L>4OP&tk9GC-V&^~f6+_S zki$A0gh%ayWJ9Cl>K^>pnNt+DeMbj`M>WE)MkEaH81 zUA}bdI+It_18UuH3pJ!JwN@~6!>eciY!@(5MI%pk*^OY_U6FIakb>ydp_z`}?~7dQ zjqs7reA7CqX}J?8fflntUcTQbZ`D@5m97%l!FfPHB!|wk_htWn0D9eeMg|Y2%)Inj zrojhuR4HP%KGeXEQn)zLxk{jU2_#DP{ut|Maah4aqfvJnS~B7rL&M$}&;-KC99 z;f&6YpZo@#hJ6?BH;v{O+fqCgnb%}#gt%MT7dpM?ZPtQF>zR;sx%Wphl7V2Xi;ws< z1{(T8ZgZF`H^y&x0m7~|SL0tD{C-$blm|cvs$LZe+31O`m@%jDhqOO?f$nXQA{FB9 zYx_ant%ALiQ=(oYa)+G{c!&1$eJdMk!GJbxmtt;AhW%z=rGk3z>-9Pr+zz)0yeT%w zqnHDF80znv1+_8!%)CM|xi&Zdz+2YKv~2P`%JX^|YHydAOu{l(Vs2r3Y>EjIP)qw> zOnwaO;tRw>lWJq8!8=6=Q74jMhr)1>Nn(IYlGxOBA&F#1YZWU#5|1ik7->)Nh}5kz zwF*?cKx{BWf-M2--p1x0OCs%c0?wPQCa?5|z|OM=PUVk7lrOEhCi+)rcUtO6OP|;K z>01I`MeizM;07Qzoo=Gi4Pq0(f zB_ha1#Q(v}&}k33YoGxw$aB$7QogLSmp_iq9O;hn{DfHzFm(tk>A;vRbh5jVU>Z zetvLNW)iRfteq$_bg`8xwFY=jdIa|*kk)B6gpBs>{5W7o5;?z8BLa3pDS6JV(UDm} za`3!dgx6G#G>pZ6yW-$C8Kt@)bNn5Lm2SMRh;#?vlh?I{$b6b(pn)*AWHrdPX9d7_& zcnAXALk%W1$rub(WJz69l6-GXSy1{Cm@W4{&*VO zHt77mpsD^0qXN#hi?9iIgMGo0&<+4Vk!3up3R1dJU8q(`(bEf1>-yccj|qH35wqEQ zfLbgq3?ESp>}`Zy^eiZ2IzI7qhfkrYmUx&?3J@@@oG<7?au3kUHF4p?f9edU|DEBv1mp2S@R2F)XxoSTlTX-mi^eOIrEZem2p zYbe;c;Sdt&$6F5q@hbf{X21XlB@Gj~%QwBf3#etQMjKXnn?&jHr*P~SUC0Tly6=ym z7Imx{#tdqvcLv5m`eETMYVNR3?O?Y%*Z!Ri)X-LR1gm8W;kQRy>vr%=HQbuu&&J0g z(Xd#BXJYo6E{Kt=KOCWC7dFifu_y@gp1)4>a4A8L!)74WF@r4bR}MD`JLD7}Ht%*K zYd79}_(DX@P{j>2htkT@%|izp5;oJNyh3&DjUi&q6Ls2NhX7_{^t>Jj4Y_%iWR|+V zxHpKGVkM9%d8TNp5U}|(lrAJ)hXySY+ZGrPLk8w5ESrrW$Ur8N+kq;`kJa9tS;3Rt ztGDk}8#LZX25{}`cA_1VEafwO%2=>8dF}2x7E`WLG@zfi%Sf{S_+}PAN0wiQ(QDX6 zkHrICVtrpl^n`0xpYM^Ip5qEB6j>1((x6MNNe$qZEjnc9a{}d1U<5J9(s7#=gNIh5EY?j zlWaU&&%ZI2xOcpG#d^cH#^M539^^N6?7dGmdiF=7-?Hb-9}`=(cJBFp(QHUXb8|Uf zWr+PL7Q?uWcMH+{`XK*r$!?Y;-x}y7?J@|{LGBwy7KQd)H+c~MGGmoUapJd{yfPsX zMS)!`_oUTD4!-CTkw|mTQ$R5`dpsWQN!WDbRZhS?XV?a3YP9UEY?;><{V;U!_bM=y zU{Dc~WG5vNNZtmZay;SNFplf~T#JCyyhD;WFvhRDHWw$HS&g9~#>ht>nrgr>oceM> zI{}_9OZ$ahNp1GyoOARuv?z7U(M2UttTw=4>%PExnY^E0Q$;MV#+e@#|BaeQ5FnF6 zL=6^#RIiAGp5*m_G7`)5Qa6cD+89}5avl9xY#$q62jWhB$b^$6a+25k)j z+Wlp@X|UkZUal@jR6Js6_i9>q8hoP-C_|8Pyt3YHp*!ipAg>26`v7E8LFG;d*fz?eoVjMS!T8h`@Y}!tK z&c67Vd@qqrJ3z=8IS0yz&b9Je_;y^}RWlGIRX*{b1A^(lY2c9nqA*sG`#d^d-yqEo zBlr(BDc{3e_Rz@r@QR>g=G|G|PGqEOO-+I5H7e$$qv$JK&F*>BMpIRejbKyNOZW4x{=^ z+`jDdPsBnupJ_U;2{HM9_c&>GQ(E-kK@(OVf7xOKISv3%TLdJ0iBYEY@LNSvp1ZGvt9kX z{$}HARjVJH(dUNVBdwmsu!mdK9eeMZgl~qzGlRHvIneHI=ud4i!s-XaeW_>X+YP$v z&TJ^;r$G5{n2+xL-Y-VTXZF2atlHbIp4J0BEDJ+&_dEXV`w6J!?Q{2ICJ)(*&utj* zPPBV=QW&lad0ibAO2zE4icbP`W_ckSyQ>_3QtW;sFi*aWFpV_RHwo8Iv_BrAA^RdM zdavs_Mr6bmSC;orpiWjmsSyvU-|GoX@Q}1;VC;4 z;{EY{PQqx!BS>NHRb_*f5oeNsRp;$Cqy3@;?x=fB9P>Ct={9_-Q2e5_3-Eks(+-qq z_EeXWN6l-p_s#Z_J)X|)0JxqbHAIj>d~?y0zTuHcOkyk<9d10YyLzM~13{Dq0_5Q0 z=+!&<8$b}359#$nz?L6vkRaHZyJCX(Ea|?CTk9HHnMDCETVvo;ip^oi16?JU_rh2W_;cvo-osWd8{m$k_sSZ-8gNTS}xr)XqQ7Pk1>B0*5Cn(pQxHP$7QKRh?3JcDop7w!p-48a21Po4k z26?sU$tnAnD3F_S_u*b^QJac$8AVE}qPCUR>kPNM=B81@q&Q8p-0GsVj-xZpVbu`+ zgWm^}cZMaCzF18CFYlx5&vEZtN&Tjle=WcAiR_Z`RV=dk4W2O$vo;V)uS1(>(Ho1y zT;W&jNfm(I)aumr2o8o>IIKOIG*6PF3kiUp_zgu#&iJ@DtaJBCRsYL0ZH8;Bxnw#2b!QY)9Xr23k=cSDaO+fn@|$jiWh9xBmPofTQo{AIX1 z2@0Sm2UW^j&9xdlajxxN4K>$+ecaCwQ``CF4-WfZ%%uwe3AerELnGwUQos7q^qEW0 zqAGJP<1QD(r{6_$vKaJvA83FGhg&w2h5*>2fgb@6R_2K(oQ-a&Auq@hkh_X1>Lisu zR1ggU=5sh)2h)Yhhj$x{TFK4YmkB6%z>*)?DJMl@_4@uSUSGpS5v?{J9E*^w+++gP zCa_L2*Jl}-qv8dPi~UN+*3CG57D#-rtThtQf)mLE*z+)x)N{PDj zN2nS&`x^r{)($Wsl*Yz`xN%f_uA_a*cQbS|IdjA@E!~7>;(W+9FsW;5&Nv%B;vOQ9 zLAuCUdtWx31?bYnY}o!O11IXg97;`Z?*jU!hA8MQJE4;kb*@FmD?ukC7M$td1WE8j zg;pRuy=9-5)y2GFN_3f3Jq7guhd97T&BEZw9y~K)R34x15g9?~b4FR7V-i$(2ZsUq zPwsntE>9~6#MES6Eir>khUvFMvl zsoDP?Z1T_wx_XvQly=Ga28ISDSXH5%Ut$phXJWQhR$i7g^Ze05sFj@JsSZAx|FYY$ zeURC!PMOju7X!g8m&%reWI3@OUdB;ZG3~)2a5OHJR~Bq1$#Q+$2?34#m2*(A{HZ(A z>bMwtO(+0u$tZk9MqT?@!?2Cov}}JDa&!1b084LHh*l9u9T))A-VR6D9Yi~! zBON{)qA5iD!^)gGC`O@_eKi?qsy(y`ztfOJ1T^x7k@Hx=wS~Qy4r8zf*#n9STMxv7 z)@3@UoBEEyb8`7}_s+V*KPDhi^g^QsUQEi}FNA`#WMwdfG%;N6A-WlH`8zcQ9?imb z8^n63sa{uyjY?yRrUFIjvEEd8+jcG=48O;PCy~D-d;ssFuWs&DgKiO72a=MvL7x5e za==UZMbYPh;uX@(nxdn$2fi^aj>0|^&=Q7HNh8Vv_j zw}g5O&WW4JO_?JCZ7`j?_g-={C&bg!ITh%hz90Ffc~i$oMFm8vF-Y~{7N&%c3q;ZJ z>onbpWQRhYZ<;7s&VteySRqJhGuUt3(LQoDOpnCy^fM43S(VH8ksc@=&MLti2@lUA zL?|=`-BRDo2a*iM`IJg+3B;Y3jjXz373xZD7SGh}{?+Fn_ND-qy4C ze{x!}_<6kyt5lU(kiXycfh)(L>8C~=TK3Kkx+ z0O!akuJFejik6Lqx=o6yLfkwLz%YYBrIR}E?o!toYH8PWPS6Y-sEaHwgiuFnHN~3+ zDAJF3YeR~*@RQ>&nupGayYiY;Rq*h3SLZ>dI}ZezQs*hSr6yPNH#7jFTM3xgl0vU0 zf5Ag;WurM|)C2|=%HPau7K+JBPcJC>aXBL9PM4){yTf9HPjPM`XB?2)->!wk3a5bw zz{Ijx25bjcL!y+C>J|4U5FfNyP-Wt4x*cLV(?-}{K(|bC{5prv51_^k0-3u#gymfT zTXUqu<^~2>ca(Hzquiq4Y2cGgU?@No$d;p3Unz%zpTe(NsGl>S>-9=7qhopnB29yM zqO8&;@h~1q%e+mISi#EKHG`Do&|DoGxUv>-&A)RhX1h13L1ic8$6b)XVxGjIaL0xO z-md{NR6hjjQAhZg%%k^CXj7IJ=(kn!rO1m;eYxdn&h;6w^0Vbj4Be?fJgsW;&n**K+SU7{jfqZ%=75wi1n0gQs;y2&~Vcq$uf=Cvwq9psVO| zk3myZLT**LmmzW#xEBKNOk6VFbH3`yGxM?UzUp#?UwxS?QKP3(HU`*qtSOU-*+OjGzlJEvs|a`tMQ9@qRy+7pK;NP7Aw#aQMosIdL?+lkEq345;C7V#y9oPE*1 z@lU`I!+op%BiD}%+RW_Y)iI-v)vT*Yaueh?!$(_rG^BE37g>6f_LW2~P)&(Q5(=QU zZPBPr-A{wQh>mh$QzOrdlGIvKM7!Lj4xFeri%he&%Ir11SdH*d9=Kk_K+Hd8$ZW!_{T9hQWknnFn~gXSI@MXG|NMr@?B}IX+$Qh8?Vb8;b0P zxj%U}mSz~63PqI-)lekxH_@RVd(33;80R(zj2^Dns;e3^iW7u8 z8-DK&TAD4b$|3={0!+G#0W&viJNa9i;AxNTV6_%()^$u zpz872hZ%@FfVhc3_y19pexc#UE1FD**sq3y?|#U}&%n}v|6`KyApPkK7lEkrcF$02 zVWhbFVX~+*AfQfP{89SIR8dCDJjyacx6A{fRpdlL~>V>LSyTqxQ!E5HJ1pmFlrVJuHZy5E8aepfgo5!T%$zxU}8ZS zTaJUqSoKI6qTwJJ;Tyn6mvR=Tu?iw1%)ExxL0%U zO&|GQFb0=rBMU(9W!SnDw4|))Z+dz2sr&j?U$Lk8xX#Ma)|U8$7;Yza#a2!O#kdg+ zCWlijazc7mq&&sM4+OWXTYbfvetXm@v-6C&=;?Qjjsr0F``Q~tAO9`(02;;P8Jw0Gu3&na9 zkhM)echjJpf+|@M`L}=Ty0y}jedaw~_%%)vrPdl-7c(T8IX#H#LhFY4+*jL)gb| zWdxUDBEf(Hi3>ZR&h8#IzT(`hbce9+Im4`2c;n4@4E;2{EGP_jAM4(x@#fBZlaXJ4 zzXwX}5#*||^8o3Qa`_-;Yf0w^LF-`#E-)``FXY(V0*y6)u-E?P04grYUGW0Y*J3Bl zH=ro?BLPgD>P|2FQ5&*(MeA_DL`S6&Yp_8Q5??6y{dm>4lRH2yEo57dzs8SLD}e zHvq!yC6QNKyT&rQmYI<|nLA;a%uWNg4p`|pQtAWx?JNn#vaDVXKV?2_mg zxr20#ww#s{PQa9*B8}P(4pO`{W_egX^u0&Uk!5(~sK9hLmNKx#mCf8tzw+NR_EGmP z$eO}E|K&s9yTX~1`mZ3J2g)n>ID;eDJnp66pU3)CV zGPG=&TjI=FZiba5^Gl@6qhr~Tp>)z%BX7z@Wj@(J{=kG-hpuItxJ<+-%EoF-OBJIj zo^l5cq&r?Y0O)xzWBFBwmm^o`TQ_o+{BRNbZ?28NjBK{mi9;XYKCg^Szfm+gM`DQ$0^PP*P3|>;$xm36Kb*iH`!6#3@!sG zO`~7Sr8QGc=M8#s0?58wI#xk9lT6-D-OxD!K5*Deq}PN7C3@t^EgOWn*=jQonNJIM zuh)AX-HHY*V8zfs55RHb+e?4~WB1s(MnCKSe9rzKKi^0DM_W54^TgFY%FX?p!3tzP z5a~nc`Sn)v(dT_{xM)hH2svZ-tcN1*8$!G&4{??b$^wz$Sm&w=^Oda9Y4iWr@x{Y~u%{bve;erZiL!p?a5F& z1-=@$5c3wta<=*zgB2{iJH94UC`&}OVS;t!Jb@Xxux@avbV3M z%>F5d6ZqQn_s6%kpTK46@|4hXk(B$tK)I?*@X^1zs;TF~`~Ct4kxei&?};pF=B>}p z$aUjSY8$rr<`RH2wBKzT3}k^m{qL&K14Uj*2mC2iXj&kcn^~Cg16$tC1o1^`d2I**uv?uAQWu#YsbIRr#V|CLk z3tunjfL*eQKGA(2cSz5i%(A_>Qqbx=+E(D$$)K;&|9Wx+GwbG=>4%nb=cK1?+(!F9 zK5ljSRc3n2O)qQMg=`z)>3kIAUqpIWx9CYu`CbbYDk=n*=BJAUw~Y#DOA2W>8$HA8 zVin5;Ljv4}bRwg|rG|uz0|owEXLbau43RTM>NHxMJgpbfXh>_-ap9YPIFYz+A-VG2 zecZ@+e{VXs&|Xc8UpvQOF&?4syu8=?3tcfF^~IPD2%$^^a789cnWq>w$6fc@8UTq+ z#h+`d*aH^!PN^2?V7ZFMXDz{>BKrFHumHP9!BJ8fQkU(bw?9gxDE&_dA_F7_gmU<_QE zQ*lMCS_;U(dZ=CZ4^~#mT+kWHDa&}Y+_{aAac5_lBo6C~ohp29&1GDU<^)a zbH1DkJtX)8?fBHB`_#5G!RgH07KO4ThaT-vK=X`yP>qtdAGKoW%Op{APtXW6gw0Kk z(10x5Zsv&63X|vFWDsd>4>DyB+_=;$Vx6LIsJ(2Ld~}La1fV*X)KiKL$!6ExdKF@{ z#Mt?I{+JG3fDIEuKm{y?;6O(DqSyFnM6S}4VXB5imqfGzEfD?UhqH%DWqTHrCD7x+ zVrXN*B|wBG=(BjDT!%tRV4L-xpNEw;=g_ATjBNU;C#9-RR#=X@w2*>yz22`?zz$PL zj~+E`%bYws?jfa;_?HbYosUsbPvCw%ROnB6tG&E#J<{;OO0`tZvD-{ta;cf72J!pzMEcL_ zBt#`=DrF#_*-GX0bsc=g#c=U)Q%0_CeVaVLSLg{D`NJfr9cF{1vCbKDj`FgTIBHG_ zTP!s1U^DM9uV?}9P><~&KWfG&Q-bd z1B8Y#{oU0&^J5b$$}m5yg~h{)d|BZeu5`kP8NR^iK=B`tc^w-J zO{61ZCex-ShH)m)Dlo6}LBjyhBsg8(4$CWyh8W7w(F7aG7$M;Ylok1E9KMAnQ|VLy zKs-M@UYt9urqXHEc-T~Z-^B;(hL*rsl_N*E?J1i%Yr&T)bX=n8$&FFefmP?%S(AxL z8Le-i733|TJUjiH(xsiKyRveyWNyx=-!LPKqd*H!c5#ARpP(hKIZd}*dMYR$GSAkf z=HyfxpAF^}ziPF?=qa`zd>us~beu$qO*TnwHo+2e=ghCFvDNeJQf0!Y%M%~iGXnf2 z{L*KM#6gZ4S0x?>yxlJqb8k4{-=>eHew6{brYqkEvh4j)%m{5hKnDH6Q|2@;Jn0?E(hsX`B53By(NHiTTp7S!{OGD(7Z->+??%xO zP<_BvTy-p^CCG^wPdiH(Si&Lv*}08a%@(+)VJ&QBlBw)ARPIj!u5j3@{rrccKn-35gC@!QA^asm!@RP%a@7#Lz#>dXYpw18$K)a=@hKW-8 zTyFqZPA&=E9JfR`BIfxy>oD=}%WBGA8AJ<#UkPH@>;cr2vNL1=p^VBdv%`&z>4t)$ zu*gUmLrF@5!j>rjFC?Om2~X=*C9a)G7Y(6EL`OWLXD+fBvbBrrL6Bs=jmPrY=|iR( znpp)3ly?#hPE+))Zb;Aw84Ry7WxLY;5BCfciQ^W3uevj2Y?{P6UL4Q-<6;#5sQeww zuTGrX?joowhodd=O)-Ez=-dMQ#- zDdYj+fnxM<4RRjz;Ig(qdn`PJW{X}`m*x{LJ3ZH8NZff4^hA}lVOfwRr%rA0)<)R7 zjp&50^WAQ~&U1@!t!yDa*^6cpBYJ>g%u1CYmq&yN8XRPaoP-=D%Y=+9@SIXKw)nR6 z-|Upa>vRd@E+mTyqaTK*+m>Qgvn*cLXvAW4qZS@KEqus!avAB)OFkp_w~*YPpX?SP zXdHDi)5esA=ZI;E@{t3Iv<7@yC&zbyz`ryaC*<{tz00>^w`l=W+|$b{-Isha*^t+P z!@{!kX}^omYo@tW!;PqBhWg{WN`YZCG+f9}>bRK!^I(qQ6ae-uGsS@YsLPZF9%rI! zmdF(fq2X5HKLB00|B+Q}mmsH2YNqzxM?Nz1N*+m#rpjEbmV^pHd!KqSsPMI7r{5wvsXA0+$#lcwsBj{T zu16Qn^P50fAOboLsW>#gA#%DB01TFBV-0s1jc~9mfs4(mV&5QkB{0@zC;++?WT!B? zzMX^Kcnbf0q!%oN?8x6b<DP)-12t#1^fnKv|P4(gU>5OQ^c4)@xN6QcdsQMY)Hg;` zO!T7XS){hTm&NWPdf653szcy;vmoDa>j{^55N97?a{OAkGsu@-SjjfddAngz9=)xYFtCQ>y1^QzF37ZVFQ|B3JNDJ^BtAjplBl%LRb{L_t>pk-QNbyjM+uv>_38WDm8*zWGb_$+UFxf6kjcn`a zOMrSO^nL2`46}rE4=WDwN+)+@PwNNWx4&1wo!3LcM&K1B5hBV^t8lG0`_M3LQj>G>0JVna&|BN7P^-uCnatufp# z764>wsSn4aslzz6)2Pz8ksXW`J--UX^oC+!MIYX1&$!EIHH0OKhRW!UZB)@b?kw9Z z4~&Y5z;n^L6O^Z;Rbj-3>~coPX~eR9CwiT@H4shsLJ18*#XO@I`i()M%v0^Bn4x`2 zv7$;0O-0nu8UF9mv5$Hsjzp?>i72m@gLB)^whNT{_kz0VHEp)7-J0fMr*1R9i?Zm^ ztK^}l>_BcR$Sm-2xgx7_L){&|3Q%x%P!Z94$Gp9^JgiyWlSVMHUj(3Vl?{u@e3l)T z-lk8dmAo=0-d^@U6bb$4&IK4t1|#bL1-yq}Ej=>@ka6dka(b{>IxkKsj=*KUkmTFk z;{N7J?Flk;Q|0a@!S^?u!QZPqBOHrDdn(~G4=s}^;j9&~yFI7*N}m(uj{tK(jK3Cr z7LZN-iji!glfVL}pJBHA{YI#!4}MSADwC2(bS@arngfSGNGLFO?^9#>91w|#Az{-H zmH#hIs@(%3Z8$v?-Nt_x;DkLezLv3Cc>*YHN&n}wihlgjtFCX;$t#qJH=OpMZk?5Dt8Bmx_=UB+glUH0I_x4vsYxDc9}&3 z2hSJzDEBenKoU3IFO%}PLZWR}fNydgj_SWXlBLo&!+pNiVsM~$V{6#z*`D%1 zS?QFL8^TJnrv>nmI!8ur?uY4(aGz^v8Tepp>!$G2M7nMHEcDo@O~wEg7oV5{Ok2Jd z$%jK9#xHlBH)cs=`G zHw^39X(e7`f;n&~6>Y zeP|ej`F&leFcYhc_&2-!lrz(YV!Zsz{5u)|-%%4=Ze|PTN5VPB z(&XzF&}uZMxdb<@CRS_{y5UfFpZa?9XAjzakLC9 zRPqoto{!I4l3}Y8-yqE06+|u?beMSpP`)K4f<5^ys{eJ=AU- z7gA1Qq$~G5M!Nxwa@D;6q^oI({@kA-WBpW=)RDxoeg=>Qh;+cA0SiH*r)|%O-kn85 zH;?{vM}!JU>B_=}JY`iR-UYaj`7Pq(yq$=z3oW0=jTh7)qE3P8g7P5h`@?WRGBV(x z)OKX+lprk~InQmkNlKne7qw!Y0v~kWP9fSvl>w9r>jV$aMV}3fqZrPF)!4jt!!ui9 z6Tj-Z{KRC>Cs_l>#cQ($jBht3019&Rk~|Ie;FVrSH}a4PlXhLA8PhfNfi-x3ZV8n) z#CdVZ=nQPY%GfP>4pUx9fQ%5pl$i+iKws*O-+>z}L^#A29`LNeOa+P1%Z|KELEzTJ z2?j>2$iy7ialT}_Q~|Txulm1xxrrv{23I2;p|CLYf~~9D&cc#GeuG+pIqODsanp zdl`1Brw0!k{%R}N$i6}Uv>@Xu((pH$|IkuB3V@<1?kJC?Mvz&xeH-1ta;mh=ad7`7 zRC-RFGr)GaEC&&6oH)?{O&gl*8goNS_ynT-jxnP^XMFXgFae0JAV+9r#qW-(r9nywWGZIc!$d=)-Q>Z>adi>O)=NO{MG_w~ zK-&Wji|s_J*RlN1$OlV3fkYz0OZAsjb!8SVvrC}tGolvHl4CXk>cTuE zwJiX#MlU{_qTXSgHwmSS(Nv4J0_9EDc@BlMK!dV*;tj)uNJSx6OEInnCJp{poIk=j zDD&DukX&Jm=gEN->=U?QONdH4rBVTR6i~>Ki-jc=)MF8~()EaU4;7FB%JAnQf`^8% zXLT}QqxpT^Gao#qTmFXk>={1;&_L-{ec_L|U))-|#4GOc7fM{zViPJLy;1_7Rrvor zS!~rn?ouW@cWzzc{!6h0=aatvSnH>Sssng`R(OirX}bACR`0;3Y=Wh_T2u{Vc~K~s!^2z0sOKas43vC1oex z)_UyY1v&YHOO*-+9Ogzpv!E6>NO^T_81dmn1vr_0E^vlfr#WO^DG&?dybtmB5O`5& zRf$qkO8Ar8saNNLvph7%p245hST-5Rke0*rc7E*{+AzO98U&ZggFITV_gS&RYPBOa z2XvStSY;_ld{16Ewy+0_=|=Sm<^1}Yn&A_6BL<|UC?tI-chh-ECQs&fqZ0~?MPb## z;6QzrV=6hhRR-SAvsfH~)Q@o_yM_GTx%}BL*35BiowZW`h?NTae*JwDu6=+F=o2f> z?$W{f3jyO%DJ7aQoYb^K%^-Zyj+*PYWv5LHyB6yl zDj83L0^OxOH~F7{hX-{P=~!sEzPSogfgA-3vJ%F%oW7Y&bJ^Qhkb)zt`Rq7~kGv_) zll?wcPdZXAwAOvw#*z}IZHaGG#X6XLJam{~``vC;Ff{H-sH zQ((AJgQYfCV7Z&U#EYVRumnF3w81A-E9o4wM>}`3FBPAfXmuMNdy)Q3y{lg2AvoU@ zwvGy3o&v-Z0?}hH!=O65HD5hlT9VkgB z1=N9bOvAV*$v$1MUji>*&`*=FnKLXh}*G`c$sAJqmiqd^W61(ie&MDL>_3{^(_&igZ1nbuR|l})U_8# z_f0qg=qfK%^oJ_cfR5N_P5cN?1tF}-@n0{B3YUeTqc(2_M7;~8OR0%M(&s%K1um}9 z@fYgo-jLDt=-%wqQ)fsZZ(8_QMxd8(?3@_-m4+>XAtc8D$WYofB zDC#P(_P1f>ytFyEy6_}j<=)bHbmWw^Iv9mF2@7E;7@Q^u-X^~&9!X&_%>pH3E#H%L z@!=WMUXsL>YbF+$2yI>lU{lFX!?5K+()126kXr!GjfYT}3O~^w`ZtDH9XW?7K-B|X z7KlFcv>qA;tti_UgmgyJ(xAEWo42F$w$Z$N_xHrGI?#0tKV#bS$ z%2{51q@eg0kQ+kePrzqpCW?y^d*_^KkTzqP-GzVkOd@5Sofk%Sh-i^#(7CP8AU(`M zYICi5#F?T#+e=#!G2a;9)ra#rdN)+5rU)+L1Vtp3L-1xl+lEUl%y)F|bpxm1?kQoj_G{-s|k zmex{lY1}B~wYZe-ED~8x=dVWi&WNd7Je;&2E)F3?r4N!$1yt7+bA3q^JH_8VVwzj@I3Ld)u@2p}E%KAtKO!hM!)V9D4(j7a9wqqiP7fBzAIK3aEILX!4c_ zbbM{NK+?WQuVG|}i1aEV2)Z4Coe!y z+(uw|4z4}c^qnt&`pN@BNUHY|AbBa7ihg5l+)#%D;e`Yt(WnY@P_Mj5PRAH`(v==%g%d@BCpb?z|vg*3WBifk+Ax}KzMIe z#wXf|?D~g*_}-d>3Um7<5--=~NO?t> z8f$j?P#I@oa^_@yXkZFsxa&)dYc!X@O91VwqXmkVVe|)R>Ou<*GHx580e&;C03Q&Z za3kBed{bucRYHgZcCHg)LkV$!pDSOUxq1WyRs}la!kbGF7}GW#vcZ_`osp0)W3COW z4-pNc6;hkBmsEW0yxr`Uq}w8UgoPSOdvDn^w1S`7z5Vz&4EyI66YtQD&}!WfEUa;3 zHcF42NCB4#e+k(Mq@LJ*e{pC(ytA$4cP$Qc@z=1Pfg~Yx5HbTHr$HY1i!Tnxnhom@ zc^S)W<4=ns*4hdU^1~o6Q1g`66YJK~!-5Tg1AmI{Ct{atuJEyg((fY)mnHf zsGnx@ep;IusY0(@t%BM|Sv!7*7Y>pBIz)?UE3IO9;Z>y=N%climM<6-`@&!TxAYTCT0U`wu z)JcaHRz7XD(%z){$8y^_({<}9)S6-?Ph+{K<`HVm|4{l=K1~#BP@4N1&p+SGu@~^S`0?^1fj>6M0wsWk1W|7s8Oz^3v|$aqtdX4m84DgB9wXoZfH!Kq8RL!UuDbZv$8yI3?l9txOWLu9 z9Y@$<#hret&)VWT;HZPCjxKc|;O31RD%{lEFmZP}SKf$K_^v#Z>hlSZD^2I+k#!sPLDpNJmJ=q^MIkH_!bVsXrs&&1|y}-~`>eiWg%&u@-}Ve&&EP#}#vQ znL~j#S+wcWrU5ME*dm7m?sQ|EZGZ9BzpMDOO||Xs(zIcWXQ1p_nXHO)#_;c&L!3t+ zAD<{Qd|Ae-uaP3&Gnt)z#e1gaEPslAs%&kwye--l7Ke`G$hECwx!)Cs5+(1|B5G-Y z2_dnDU{`{Wl8jtekZdB5kQDySV);?J!a~ahyON}ZwWSL9Tb3MP2o5?-zyX4fPn4S7 z`c=2i@MYK1a;?q4``_GxkLJVPXyXkf-bld!b$on$U?X@T#^a1JBy8y+{T>G4E#2xIGy;m!3G<59yXYka1a}#ySrw?3L864>l$%r_|~qmguCy$h6rm& zK*Ni{*HaBT)EK}LHAJUsEHNVuC(Us0XD}QFS7qb)7Goq~7!`)fcroTpNU1tjK{j!k!z!D5?9bw^<8YY5e z&`;Q^^1E&q2_r}uTCK)4CwG}K=R>PEiKn;5S!S4t#qew)nc?H^HY|!bM$`&h`Tr=i zu>3!=uIPt>w=A$5tqdZkWGv!N#u}#~8D`vRCL;?Oc(^+aMLY)67-GgC3i?6$_>fS- z2r(nQb3K|V)@K|f#+y%!F}c28B1RZtgb{_)Fm4EA3I(GM7)(w>5rZ)UsYVIq;tdyPG#4}XC0vx?bc-$6xYI4lY!RfzA?{AK#kRj< z1+`#8iz5^jalJ6yS!hNUnkkOv zil!^PD<?pBBiE0Pr+4ewiVsv?eGTdUcrZ53izRdlIBi8~V<`r^mb1JjgW znm^l2JMQ$7vbux{HjYCoZX*@b-RT@k({+k8tSN3&Fv+j=X2p?0%tz`e#ZZ~8u2Il& zcmL`o^Dl`airclakK!l_B~T;+#Tlodm0=MI9iZ^>s`u^h2?}?AB8|57iQ5xLPu!nQ zv~lW06HW}xiP~SDT(2{8z*@zTma**&)0sJhi_R#S_sb^MxYHSW6I0xsW;~-TVS>&F zGQsA>%ES^TZum06)LsG&7Ka#j32{G<;TXDqKUTpWpH;EGxb09GV5-u~5n0b?xJnHG!^|g32yfx$4 z95Ly_=Q&qi&HFZr`o*ee8^{b6I!7dN1ePNvFk%5loC!ar^^3C<%j#o979+YMoxFu!6`DB?I%7|Vj07RrgL=Qx486uJ)*365onCnj)zA8_LKZHsMJ%kt| zgpUvscpAwQN80{xrpk@8o-u2OCJiUnVkN@_nJz&=6cR)kL3mSz#hQ_V2m;~|AeI1v z1|X~e!Gxk-R=1v?Glml0Dw3nUwWc$ksF)SMo~F#wbfxLKX}WIK4_f@d#1APf`9Xs^ z&iP_>`QU^PVV3wH!u^?Tf*9-}kRH}}53wFN9suD13La(@Wt$t%rsm0b*ORKO;*S&W zvW_CgN4n0yOdj#TB#j-s*dg2@$(S_8jP4YrPg7%C3{Sjd$6Q5H_Ibu|h;24pr{)<+ z8QwHq%RE*w{}NV}BDU@78Uuk2a&&;gsjjnYX|uewoFc|YQb6@~U5iAt3hH0^WXmNNV+YpKvpi9X{X{aM(5S;q&h2($eSU*F(vLmSGnVT{}0gF4x;Gk~T6n4#eSMjyb* zy@olqh9;+DYUtw48hpgeaq4+u*0{Tv+Y&KDVy4qT!x|dOxU*;wX$ZgkCf-}KW{Bey z6~1eR8E)=A!;~d5)N!X-apNlk6EY0BJJmJgm`<8hcI_|eB`X6H9Rr;uF|5hIV;B>I z=k6ZE12A|2gXiv4U)#s9Dki?p_ueEJl(;*6Ar8?CO}^xX+Y4QszHsu3gUUJF%ewVa zCbjJqwpOdxjm<6Jf^37>p0Lfl{KEHbxZ2HYN41kX728lGl z>yeV$-1vT+(HvVxBR1~T$c*a8xznN}r{NcML~A&r z(Y+!OS>d$Iai=ys`x@3_y;?{uGwRYJDr$k2=;w2|IuwUk`ls|ARz{DLJ1J!K_~>FBtc*Vg+Uf@ zK^)KOuh z{-wV#)J%Edd#9AKjM5@EpncGT}2pf+=daDYYpdl+Z^BY)TNKgd_6x z&cB4co}Nv9J*|u}#s1 z#@{22z#4%A5!i@8itvFuO{Hv}r%|d$I)xyH3&ADj5h+%1Qo^H_mut(TUiraveot1% zI>AedqW#&H)sd6p?jFU7C^JM6athn8wTpV1%j*i{#c<2##`!#f(g+7d3MfQS9H3fI zFq8yUA7)fWst;(222vXSl}SCX6elfX4(-=StNL@z7K8mRDa~`MN1K1t^+bZi6s3m~GHx zgA6zg5YgbwRNMWWrBgiVq&?p%^FiBA$G?i9@7 zC}@L%(cLFU!Q>`LfgvW&J#gY4aBk;~yZcU)JKZ7U zj+eNdk=wE2PQg0PYqL1#z#Mny9ALswI0tUdIbel$YYsUFm~aiOp}n{U&X72#z%_7$ zL9T%l*MK{XljQCgILE*mr$ihBXE5d%IC7^P15Bvi--odn7T9R_-)fCp;LHM9I0Y1O zryJji!&xe@g;O8^38cX#;DfWiOL|j(8He@@nwn=Mab|G|1aSz^p;0F7R-Z|`H7~vR zyfDH{$DZ+>%QdC7Yc$3Hw zi4Y~iCE|{Xax$8$^5zFG2K9?%_NI!CB+jy0{XAv!R%@#8rz-ZY{4o3154T%{tf(fts zJc{HuE9(1s8i+c{u9aQO05R@vdj?o>1}G^cju*mINEcjGh>|a7ijXzm+&q`cd=WAW zjR-kmkt4*NW;~?~vSyH(SKA;ygE$q0jk{?3m>@Snf>57v?KI0 zXwU~6eTeD9ggzFClO_%eaZupH5I&ON;|D%|5|Bs&+DO0-2@t{Ed**yHKW4?LxBZq@ zuBoDwtj#DBr=rZ25tJ6nHJ?nE42vft?=)R6s%|W>a5C~{3=2T4E;?P_be)X6R7yov zNupTilj-tiDtuA2QM{Uhy(W{wdz!o4BdF3>mGRWt)1)}gly|8YWvZq(V>o6(yS3c| zh&{YLe&9d?Ckr@VC<%Vh3~yy&KA9|>j41utMxAWNyQ=DJ{jhG8=xg?MZLR6iMh`Kr zM;CY3gGnBCKV5<8;T49cjLgv*YIOc1)pl)T!f59cJp7 zado)dltGiIjk|l1nI+#itXt#@wyXo+8cLdCF zr)3>)%_In71c>qaIen!5(GaXwKU3HFk^1LV>R)V2S{_14sdh;1>iUU9A&_P1`aN8 zR4^wDHvc2FwqFf{8LX{Vkc$OQ)tsxX$yyS{Q|DVf%)Rl%8#KH@d*cEFz(Hfz_BUmK zCI;xhjYHf3#0@fTv^Y0LU^9nf;|H4`*vuTs^Su8UrKr<>8AYA+i*~GG5MR&pRvM2g zyvhHVRmE)W``FxUDsbAyQX49?fdU(I*f4^PA~u?=p~#X=VQQPdcvD4hA9_;-lYORZ zn6ZZF?)%m(o8B5p)Br?{DbyIF`qY?d^pS=SX^22Q>dkBIX!9>U8f(z_0u2!j49-x5 zYLxBoX=GEcl$@CdhoZoM!lJ?qRT78TfJHtO30vtBjXA(wvdr>I@?R)>zdXzZ#~8yW5_W^ z6i&U5)ZUEYkJOZE9@ZF1#3)0IEX3dePD&`i}`g*LXi?kXhOTKgZ3`cYw~ z@(IUo3&*Yv#kW|(mcH3ojC9>tVEDLGFq+o5JC&xUrXerC*>ti^U%c@znu@+4ke z&z*)}SaFYiG2M$IFW^A(0tPQU_m^dHUA&=PjImw7+&!y7fSN4Sti0d1E1a4RxTx99 znv{z#T%fou7TJQyolctZ7D8G$qQx35KrJ#*#AzBN((E5yS@@9!5@NCd$^wN&9ayY! zryomwEapvB#;MQtSny!MKmpbiV2c8Pso|MTs5OBm3(XB^QgvK0=87m*;95%MO`6P9DWblrEm&)}Y{AbqT;nq7NY3)ZVP>}Ep7cR0 z)|$3nx$8{&Dfh>o3}G4X3WHT~Vrt|5eaOT#hUtjuHPa3asc5>oQelP)&%NbwR4|$1 z4Ml~&PjiYUI)&%{dA2E-P?QvJoRdP0O9~sL5J6*cZW5=W7$gcaW2xy9=A!W2DHny0 zQz+u(-&LHUJ-MK0a))B1A6h7^K(X_;O7uh=f5MDA^?qJeVn(;xT(@}hiK8t~Os5!c zC+GkTQg(H?<|e1xpCB#1u<- zS>gky8G9+4|1%a(i9?jwLWvvPrxWVcy;RG}Qo>VW$KB~pd9z(VgxRpJ^>!tRSQ1K* zAOi^*5-4y;Bry|-87$0jIU_<1C8 znWE*?k`*g#{HJ;I>J;q7ug)Wu7;%OXq7g$zJTW4PQ`F7m>}Ok?&*d~h@QIRyq-h}5 zqGeUYqGeT#{pVOIinWL%cUBQQ6a__>N#kB-=I+#n?`zgFLv+6;bD5n@#2RLUW#JxYKQEpv|HK98NWfMRFu_On+|+SvrW(K?EJB{_tZn%oTqZ z&r}X-T&NW^U09A<)Alz9B66tW)K0CZ-Jho{hXim)^Q9=V=AA4Y$T-Czi@Q_Sq$L;= zbJ7iRZXk2IB(*nqPQQS;!H2UUjtys6HoTk;fX)D@pgL&Mzc>u5j(J+wnG_tmE!S%G z1KM4;Yw9{zt5=m83Qz+KHGpv!6NVTc+`UFaBs2sa;72t~@C)DPf96Idx$Xd2{6vg}1)!T3P;@_N1I}!i?h0SnKU2Q@j3B1*!aO zhxb$ZW%-HnkGGZk&kX~?bhTAm%6dy&aW(!VH ztTdy2#wJ6xA{q=G>I*J)Cl>&7@=dzxPOtBvQz zmx^`9EY39-(70F51qZls&RAxwf(OB4U>WwIo|Gs(M>4CuC@`3=-h55!kJNMDY9nz8 zRuY$ZRjYO3mKdZ_U~7Lb?HHse@}F1^;BZb46w?Z`BAS&LIIlwJFUF`SflsLu7pAQzZ$ zVRQirbuoy=v5RgjVia;(?Wa=x(w#UAd~9GTWW*UjOc1!x>^Y$Af1S2i|DjDXi3muv=KU52VvNRp(0EU6GE6IbZi`*eZ!)0 z_gSY5i}T4udi};r*tUCmen~8AuHmg)g;lHY)>up9TAksoFM^cP`uOe<&ucTDsaVUl zECaJOW@enGYFeDNW){fqkljE%R1{T^ZOICG zK7CnX+S1>632*5hg0LyHAsp($C?Fgv(!eTyGvz%DRPz1tS@G3ADpinLrruCTs0ny* zPACBkA(yq+X2-T^-Gsf}&eE{znPD%qS7Vq($;fr6cpsL(9 z<1n>0Ri*f)&6gU!;4eTd2*N@VEL`!Th!;7$lwQDiVW0~gU6&cUEur987WOvpA0Y@}uj`lp^?Hr&{_=4ez7)vW#l|Iu?%UhlxsvFS3j_B; z@n;=U9Y|y7wpO%6QwWKu2uX>r5J!yD6{fh;6?VF#Hts=3WZcW|s2V|Hq{e7w^np7K zKUZyQ^V&K7)5LMsSr+wCG(=Z)`)ox*tfC2s*0}TBBcdBRA`*ypEU6`pySKE&v`lyE zQJf`CnB|N+{V>asyVu!P1*T4gBi}(PFln`M_oEh?mY3EJwRQ5`Zm5Z8DC42LgHni- zf*C4`wWeD~tQ4wb9GfWw01F)Sh2;e-POi)`M%Qa;MnOkNv(lY^3H-3;D?YY)!(Vu- zj>X7tvV`Wi(-Q22%D6if5(+{jNQs~>PVt@^Z(H-e|5r8F2hN98WtIE%h zFpe|TIUKLO<`op6jO@oxTaw|n=%n=v4+{+x)en9 z_*-8x=Mu~;@vejxN|1mAGddE)IIX|O-}*sY)73UfNOdD1GJ+G`2rs7_tQ%j{X=WA` zp%j591Uf>vA_S!nCXn()cfz8RGNzLfB?_D)$WhP;kcFp=!qpL_+TtL*3J2MH!4zYl-oqUj`*&2%055C?@8 zMv8R{__r%C+u!aq#ZL(M6K!p^@PIYO%5RtI&v?M_Fma!jrj)!GhQY3dZE_R<5dyG5 z08u~?qyr%k5QYGu3e~9?4$1OfT)&tu#gu-##d?378EYGQA2fYH1P&kAx(|Asxapjn z@w}-@$?6y4t6GU-on;*-o?$D$hjZAPnkN%2y=%34!DRIlZQWu08Ok+NTTVkWU1u;S zN}9Z};R`lta_^d$A-g7@S5YKmKebw9hzDnM9;i7w^1$=Jr}JRCD|w+P)}ULJyd>34 z$}m`HVfmM^DB?ViL=oq?>x@dBxw^T-rGqx^T?bHfa8!!BHM0B^p0 zRk>jx3;O}U3>^S80Gea~Cj%Wa@RC6V9TP^}y^D8DnqWfIF=2v18W_Z|bsh8kQM2aC zt6rUWQzb8lzw3w&d90I>6S00u z6ll>=pgRh}bQBo5I|bfR!0ISyU;;H0>N4i*8$x*aC0wb=KvJ<{k5&J z*flVA4Q$}<5O~)>*D+8A1GA2SpKbv{x&_MU7N~U#G*JK!du_#AcM2GF3NYEVOJGcw zfR-)+9t8O45MZK1fQ1f$1t?0RG%SW;PG-;a=9B4pC#o-=NOQ+KN22o;B5@>=HX^y= zi=-8a{w7TzsR0rbAn^x`@qjWkhE=MIAF1;Q8IQ>Dh!sa1;7A-tmTjubV* zNF!((i8Z2u1L9B;mvfe%SHoY0rP!oymIIO;z(Achb;#6Fp^g%YD(8Ro1@q>=YvyfZ zC6c!p*?|!-j4+a95jUJRY0?CXFC!x)64amP%g6{xW6_IMsLNXq>FCIDr=B;9SVOPr zx^}5C8xGLl6J}Fkp~SI3yKJM#DL6FBAX) zTCj{@-JC4XQ=L@G7-M7r002M$01yBn-m31dg`DUP*&(cM!C*S5g7{$rSyJc758mOk zq{(~TRy?Ql;SswD?Cl*)Z@w-HsE*j(UZMh(qNx+n|147<@X6~ES2ZK{n~FUcJfD@S zxQku}kGvfMQ|iHJsaTkkCJX^e1dZ8kD-It;mWWcHBvuZZpOdC^-^kD_ETe}Tfak+n zae-QG2@Yu|j<*GS@sKr*i>NZsHt9KrbACN#GnQI>5i2J&_(>EI@NWRORiy(4qc3@q z9B2T~!xOuMevx4S2P1||*7uX(b0hM-#)+f1b!X8SdUUlly%#+lt~Tt3Gwy8-4JR+VFc0r%*84Q0uFbbG_B5TAQ*z#_AyL&kY7qMDL- zjGoS4Cn2RA{frqT&^$zcx1o%BCbvoRqUVRs-f@|7Keg+EtbJB^_kI2h$xb=m>P?z2 zX1FtJCvDFVjj%xfiTkEjQ!7#Ylvh2Wxc2*SqVaBU|H4JR;We5?eCBQ+)KKiHbby{j zyTkGo-L!Z21_-`qyn%{@)jm@zfZ;uUx|(PetJT zpP1c*`fYrUqm1y}$niC;!nnz=zT>!_Z&2a|6HKG{%rTZKl3_jkUIhO0`YwGGSF4bSc z3RE+lG`*ZkqygTSx<>F*mEH1Lv`cHRl=_0a@Ms|Fnv~bI=xl6MW(jqeH!Q2JO&gj?1&qNfgJSKw5(?RIY5Wx~ zheXX6U4?CkmgO#DthFaz69Qg*vu;GkbcRHE;sJ}l?5EFP==M?m z!D$@i!ZKTYc~thsr-{6xl7E55B_~dXG%dC<;<%PdG775Yx48k46O?YK4T}@`yMWK_ z2TYgRo*N0aA@{eR))-$ka@uSF(qBjRQX=m?T3%GJ*UdL(3Dv{3Dyz(9=wScbZiPd0 zc+8Ze^B}tliYbmc_sokAtRRL8o?$jC01;47M?DlR{kocBqPsU8L#VZ)#}-_H*s^CR z{%v4=YpB#)|7oZbbqm?LYu4m7e8~=r+%ldf`7n7qebrLMgp!*0T362^q$UT!YmKcL zF7VibK)+T|r>vhD+8M2imuTG8@yjXlet7@vW;&pE7Tl<3f&#TJSupcPbXt3D^|G0<(@HIg4MEZK{w8 z4FfbAOQ^^Yo~VOoMJ+58MVZz0;WH#ISvXiU zCiIe#VNQ?)v{WPiOX-keS}Wog!)5oZqQI$R*h*d&&u{#QZm90jjc+Xs^rb)0Zhvc* ze~L^fIwl8?^uqQmLxQaM&JVJ;(N?0o@?B`uCxt*>w!k6N+mIUZN^kV<+COvz_eYc- zPf+waebZBif&k#$$b*NZHfQxv{%iy-8q>Qp*eJcPVH=!V;TJDwNKU?eo>`jwoEu}a z|M%geO7VvT{yYfdWo`L^GK@phqhIX6-F(w50Y_T){BeHn$sC!5^8uf*u*4`kB>g|J zuqkHhCj45))w$g>nnQVRN|dBV0t6bUV%2bhp?tPs8&PS?4^%FE`589UN*%dLyO=uR zR}6J*M*!vqCNRL%`kdw|{@y&bZOrG0RQlHBFWPV_m;k!&YoZaR@y2 zrMFEjbma~0laS1o>`%hWhq?^(BBd`m+Vr7jZS>TD$et*-+cIg*S(>K-ffJ z`lCYyUSCIE48wNyvyP*U>|y?$XiMUX#nTUlOV2j1Mge7X|27mz3)cDUw_~hYF#hK9;H9$^_1DCH(=Ab`#WsW|_Ot8IaZ>8A0xzK7$=LB3|)s)Q_i2#g9F zj63FjOQMHB+PZWn!A`>fs@Im^lptBVe6ENl<%-}k71|9~Kt%ayST|oHAhhv9Z;N%j zRX)+&&IehV&4F#`o&v@o3)U=+ z<34v5(tq|&CWT#A2c&p}2e(xShb<{EpH%PolW5Jzir%JKDQXp{25UV~ldGq*5f6|? zE&Jy#Gw57H(lx?N3)F%N3?y574o_1<3R5N$o^_<}HbKl5K_f8s^PCM{^FB9lx#9k7 zFyooP!zq3!igootOaMDT#J@@8JDwg}lRoIaFRxI1d5|X=@#eKIq+*vpZ;-rEK0jYj z-aLGExU(iWmz)8ANTtVy?5p5d4suev6{tQd@RK7PR$PO#TMWf7f(W_O_@>b>mA#Ey z`G*|T;FtFVquRGk!?Hkh{a}Dms^-&-hgoEFDvOLY?Z7(k_k z6_EYfg`tb8n)|cagmezER880RgTOyLM?rgh`U>1w* z9p_>c$ND0qa%zb1STgApL_?zozr&I)uR=u&C-<9hn0DF$#S`9aAA3x#iv)fn z3>N0N%i|xx!0>sh60s>}A76}IsEz(1X#SK(Gr!#Fhr&_`?5lN9dD}6c!&wYB0$rRcEUo~HX*qu|>CVRjo^Pe{p zif6RYhNUrnB9r#uU5GIfclEahbCCYFNw)wR$GF=Oh^#k0E;WIQTm|Cp9NyQXF)ZOVZvQ_}fBLbb1vmkmVE#F&CS8xf-(oI`Qcu-`^!pv2h z_o>_XK(gsPpNN^(+x%W;L5K0%dmWsvBZ(Rv^Zz?osp!?Stlf&ga9Ug4YjG-}2U+wO z3GnX+A6!non*wS$a@^1)g8nPnv*AS%k>X?Rsu`(xrnspo(*3k6?;j)Ym;k3MdSA~l{Z+BzV$GG^kCz_)V=A>;SA#Hq*wmF5UH_g{Cxy}2 z-FFYuw~6~*KdZq3?{wgF4TWJ;Y>^l1iS_5TM2%a zVHNh6{XP0U-z5&|=cyT}O!VrPe&Jm9YLDtM94`e|uAqtOJG`yBq=GFw7m=ZKCQ)?W z8EO2ua7+Rp&11$fAvudfOk|NVBjiCW2TRN;N;3VdE^h~2I#*jYfoQVCuPH6k9%0d78+k05^3?R&ka8&4|;b1jpGf^KwU>I zr}aYa=*#IK?Ew$kJRS9!qQ*-g0p+fg_%j|+vjHLmN)m)6^2zOY>0_$P#0SXN?s~;) zJ+}bSJi(;(!(7+)B}k*9y~k55Q7SFmZX~y$2drK2?Id*_yhvolGyI0IV3UfECrW@D zFl*geilbq~*V;n?4c1G#hRX6uegQz?;Q>bnfr*qmXi$WXq#-x^p6sGV5$Ly?n>s;7 z*O6$;Dk_>^=uL5wWVd{7)y4T`A> zre34M9Kb|5iiL2G`>+QTBfNoj#(4W~apvLR-kC**)eUIx)mDjC+#10 z4|?4Wy82LgiQeK1dIh-rH_OOQkrq}A3%xWUQ?-K<+hX7O&K>D5&>g#?knBQ^qEI|Q z3!!fz`^dpV^-VJ(0U11pjp2ein?8e(#-0vB7%^)z=6NmInl8KPKf!Y`yh(72B)!~F z!fS`-71c|}B{vjQhh{%^oy*y(k+bW-<&;UVN^|4wYg2xS z@w2WOZkNyWKz<@+fv3Zj-%}biAKh8GnQOFq)86#26OWBr6Uo6ymDmSr(CtVeW&G+& z+a0995xh8s9G^m-97s}maOS9c0X)qLk$@ubdcC=Op?2+QKNLFmzE2c!Ugj%w9ySh2 z`k*w*M-u=sLm5AGvq04YQ0I~O^#gzL9%kH^0DA+lNY>tC_0l}^b5z(PDO68X)7O;; zTp+V-f=S*v`$+>$1`80Xu#)tdk#H+#^I>OhO;F~ZO*Ys$;<)>hI#p`T6Ro_0M3Dx{ zMy;^(dJI74v?)&}j-Jo`yu(o;y;g6aHWWD<=@^Ck>Rg|+5m#S-$>gI$W4W?DQSS%C zD>^)}&2bLwBN2b`Q2u~{5lF?T^A#oNO-vow>$zI@2p3MbanspxQ!UF{pRlu?>G=st z--{0=Gmx%@6l`tK1NJ<;^>lyJ++pYKl>mUZk_?~xUA0_* zW-b?HZ@OW5SeJf8nxYU3h-PWUZSsdjd1`KtV(Cqa7eS*I1|`Qso~4-;vW} zHvV|yPU=k@cE1I`botFUo*5^9wD=us2Z_&76`J-R934J5_-K*qA9xL&-g>}|Ix6L z7#NYqzKFHNC=61B+Z80z(wTZUqh)j8F#do{BDz5GN{U;c5C z`%9^I)3URn3_2xA=fzY9q3|^1DHtV)KlQ5%XakXsWWYXYm;>Ai_C2{7ztea!slm!u zxg<$S7m_Au32OczUXf#bU%5x>{0aUZ$>*si&98%W4Uf+%?$Z-_k4NE#qKz4RERqL9 zk=Vc9|2FY|FYemrUms?r9D?bIq#S_9MzB0R>CtQ?|zEm^{fq}RW1D5KJ(q-78(LSrg$wCzn+(-|4 zbp9z2NN4RGCwFcrk>a}qBG==?|JCE`PWr|t(eubKQQy;n2+FRUW>U3pw=K#Ps0kF- zAosLEOFRBw0uX0zw}I%sr7?)O&oej|uL0-I-R=uhp9u<=6@oSNLvS&Q;|@tB7rY$X zOccu91V2=uw>j`M{-X#b*ZjgUnnGzhqSPXSVD}cPh_VCqw3pHK&=1KuPTc3}i9X8! z>h**1anWt+dpr+!_Wd-0LfJ)#0&zvcb+Z|_`+cA)!^%)MI!d6RILzne^RP7`W2y-h z@^`bc%ZhiyXz_h%?T&Iaa@_v&9aqX-M7U=6MpRtDOqThn)4hx*kcKp{7o(? zdCI+b785<{-k)5It--g@j)P;-g+cvECI>~^tK;K<5M$bbMGnue+!uIf(=f4_41ZG= z!Z$;Vwr984zGB@}(OX}dTO6)op;s3?!xnqX+WyM>jKyPQJAFWN8iIHhRvq)fvAShS zgaq~H<84IMW3gGRiiPkFll^6``@I1OX)u!fo+JN`rg&G$Xhdlzb?YX`U1F4l`B0aQ zi1+v;NfU-^W)w9SKTREBlYNqX-a_6DW^=4be%0Uj;~?p4VnW;b&FzQ)S1TpHw@y~g zaq*tFv>rxQhVL~)8z95Ag!mEC{)R_ZOgcSZZdfqj?HO_-32J7;Ew70;u+U=$dnMFUNC+PIm5x^}nq_-Ds z(>a9>@9{sDj6rvqG{cj-Eo|0uVTlPo3bkJz#gzWbme~ywv#cyI{%Ga>;%ef8?HOSs zah3|aBd=MHYod*CqKlH@rCwp@cydKUxB?GX$;gi=XDMj-+Kcluhm7v4EG`LR9RD)0 zKLkcuskAD!;6M#lb3uMz&w1rC9wdAA+##{{9|g-B?MK-8?rjA&POOXjPGzbWBd;!3 zR6vX5taNq)NgoR&0$19dG_AzhGp+yC*R=~ZP+flQmkM6CU>#EI4{&3Yz}@wqlPGr#}hsTnL>R*wyBna>8NBZL+1x)6FtT57Be zlrl;l+Sn@_!)BY_^O$BeNB(M19*KHd9mc5TJXk|jTAnA;gv1b+IoC7Rfs>hR1yz=s zD<%Fvs}BGjA5*RPq%}gEC5aa?I`Om!XCc9&a_3wPT1(LZU~@$8R7JONwLUjF4F(Z_ z^H#JP(YXXFV?Ro2=P6$s`?ic#C_7dc)TBOhz-oMPNmVvVfuF#<1z%}IrOLw!^u$P7 zER|!Nn2@~*xTOr7lU_m)F4t+1&jySr_`mWS0Jc;?c3!LL81USx$Yycz4JBf2{pyQm zzR!C~Rlo+joSe^ll7}bPvS;VfU={}_D_j=pyAq$>yxt3S*Z=q9Mf=_=H{{n(<9rww z9_xA~yZ=w4myAv#ifEI76lYc$1VXhy|HHx^WOm_c8t1b`Q%YMQ-reZN&dJG^C-Oi8 z47eu1%b;c6{t54AG$1K8l)M}!v=!iz1ekUoFT^NRd;^QKE-~n3V!VjX%3-0Mm{fAe1f8TRNJEjDM8~clX0G|y zM6IpPR!+jF?O#V=8I2tWb{TJP=+M-5eF@@Z@mz37-P(a%T|kO4L@!wy3mJxN=t1A4 zpmSwmY0Lg`INp2^0s8Ss@uNys8|OkTxZ9G4UVtH}PA9|>UYseM2PWA2A)YkFZ~q&t z5u{*^y6MS;P(D(*CjUGZFnYBv=++?~q`p|I`pD&Tar94_v~p1?6O_ME&6M60FOWJb zw=50~wt3o(j~h&T!{Pe5oVkv)@Gnoz*X zE7${2i`ZLUamwqtIGm)a$_g|xicX4nhBci>&gY@WFE&aj1EU?TA5+NDFCqLkJJgv+ z`cV0LOxxl0eiP~*xz9X5Y;Gb9Ji~#wJ6OIuIsK#H#l?-MVeV{S!&#{LXcfw-5+9_x z)d1&$H2#D8_XylA=#+*B-4_!b@BD#X*UR1|e4DHS4iO}USEF7;pk?|Pko5)P_TlR; zB$Q~LjJZNSjUpx#vZQv<4#3Jq-Vylw>LpM+*G@hnY6`V+5IDC1jG7%sZfK7nB6l)3 zY6B=k*FUyMb6*Pm$-o-k%2NWq2++mPgpdw(2fRBb^&?uKRH%g` zX3-9-*H;w`ur7qrzc-j>y98+^uXaWRbjFFnYJf1*T@2ij;D1=3_EHbOL{CuA28=<< z#%<~JW3%VdAQIg~9%yf=+?j%#JA1}zjf+mgOden@IxAav%XG7V14)%ydzA>mOnMcR zKU{XQvtiqh2`VhK%X*Jhmi@H}!lQ}K!GI!jekCsJ(2h(stJI~;fSU)08sK7@Uv1R- z>Q*iq(Y@nqP}--4>17VZ)PQMw?}N$r`y@?A&$PhM@jxatk4*FL(NTli=~2gUt=**$v8@ zx`Teyw`bAEKXBM@BWZZP98P{=!28tbH@$0&>tgX5xf%J>HI|efYgRmj88m`jCf)36 zvT8RIpQ5Z*pMYMJWQaJqdJS1SKNf`;v(%VPbwo-l{q?4jU}3$Zt-zQh#u^1nh;#5M zfJ)dR{JIkr?*dYxKS88sYnP#za&LpHhnkbBmjQuoh3mc?1@#TW-CJ1?-cF|OxZ?E{ z+lUT`AUw`a+9&WR?f{X{0M$Lb!U#rY`M&8%m>E!hU%U3%id%Cq^mO1Kg%@{IFMG{3 zUH`vf(Lw>ISA;dvIX7|*?^|d$L|Y)k7XjB4%Orf>BiN-Kj{VzQ#<{ zTw=lRupRt%;kf)J38>+TRu)^*_*)#uxU8`=WmJ#^dcku!M*!oU391a(nbA}I^vIY| z3b!9gGt`u1$l4H0d~L4a5Qxn%uX{aW2RUDKJbeLQar}T)3C=qrJEkgOb~B5a>=X=X zan8g-iw|j>D2V?7^*<7L2jd;^|K{3Se_tFUL3ZH9hkdE%PnL<|EqFdz{a`j26=#~g zJ3Lz=;_#R2&ER?!*8LVJyJ4a}It|g*9)?NHT=hd{z<b(2=LycoPazXqDz7zG|g8-7?i^~pn1 zIf<7`pfE7bg`7f^Zo@J&83PTt+_XFSTr z(y#a%pRbviIa<0HN(wMo^_0j`bGkDz%h~Y%Dsc`gy6$WAjVL;Tw|6>K+Wb`f|I^F$ z#=mtY`%XN;+l91(ZgXfOC$G9-aJnnBS5>eGH-;WrHgSu;KjSBRsVBR4zb2FKa2+_^ z4Z6k>!`!_-uaqYr7$-pFZ+7q&%iZQ>!qvej8Lt*kiIqa)B1V9{qj{;DA`v2 zH>LkQ42U>?WX&Dm*m|d07M)1$*BgRlu$J(;v{S+vEO5}=(H1q^PZYgEsqVJr{wz|} z)H{JV5hwqycDc5~|nl&{S!(P3+0d?H=w{KR94E4g*SQva%rF zMTY~`S4M6>X*7oh1tA;B3s@oRFPP?FDEelU_GN<;JGIpU_*LAiQpsH#?)fs9?@{ zTJ8f`-M$kq&wK$Q8S%X>^A9)|_9D}GzgqHpAl^D47f{U}qe?#$aJ!5;P?5AwzulWBUS4o{VvdwTWotp)W0;Q2MH)Eiq*vm56E@#vpA z%^AzY#g=IMh|iRR{uT!5P~dqPL367gLMMdqG~v_^~Sd6M^QJb`cgFz0w+;*L&xKYX=Fw7`*&|l z8yu^nlDJ<(@qCfs6aO0!PWbN@_+!iYw`*{={%qO*5ru)7Lig2xmfR&TxvUzHxhSYp z+sT^fsaw*liGuz;T_{Ik!%4p3t$)J#W@d}yU*>=o;BJD!1W({mp1bV!2w$% z)Y<#Np<`{9IxzX~#kt;*5=3 z22xbXkNR|U(f!z5B1zV!o?5Ll>DLB3(%8GsZnp9&*&~W0j|xdEBCKhx)z7{A>Q)!H zPE#9hC}#zhsX&yvXxKxf21NuM)rbZ!9z{J!HVp+VCZw-|JA_BoYJ&$)59V#23lqg` ze~>HQ8f-ca+!;{g^1TM%mS*^sh4-PYmZ@Z-&Tp&?uu&{MO~8ifZ=PIqJ-QAWW!AL zzNnsyg#>RmY#SU{g4Ck`eF(G5LK0OTK#Nk~H`H>ZJ#yq7_`Fi!TAy`bnLQ{-5H@dE>1l4^$g(Xco6NDy8vYwJVOVasapKAtF-xv^8b?-nK zdl*ukKr;eHiC`SG!gFTALYKPvI*77`GBO}~LJ_Q< zZ4QX75~Hqnufe9U>Xt(&9xM5@5XQX)D?rj?1b}K?BC_O?-hqUop7YnZ*e89m8L5WQ zEpad;%~1s@Y4t&g1_taML3>7L`6>Y@YJ7tF91@DU=|^`$2+CTlG;}SOMny7b=E3B+ z-(`6oA|!I&hMiyObk?IIIN^#>XwZ7*g#WJr0)EeD{eeTG#vgMhM+9QbDHV5F5fW2> z4VhmK^anT%!zc#jwG#F#**uw*W$=PefeLMY4(*A!J@=s?bA?=ATSk(J$qoXgk`eJwYbgt!{*9x4o-bADtBtpn0xj|g_+%SP>LW-4fOGCKgw zDvYvV-9)kTjB9xMe0bzo8UQ?Bp=txE^x`BnDCZ+CFR&t2ezWA~YHnnQSw~1GNJ@!7*Z493Y|BcP81FSbsNifaWv_4sy8>@`&zAQZU3Vb6^a^ z!$4uy_jCm1E>_$rJQ#D?O3Z5F7SyOq?-@2%io~w*q$9!AWZrPzH(fPNL6%v)xeoMv z#bU5@4RA6oW~IdQJsY;<$3Yr)?&BID%tx~w06Xm({3U+Xv*r=fSh5PF%+?4i{8EIV z`x^S6i+N_Z_kaYx6{a}*C;d~aDE}b7U)vE6D@Pn^G)Lx7&l<`TIg^9gu?ObxR7ei3 zT%dxh2&L(A(MOQq!pq=F0M}7tI6Kj^twJ==?pQmVou{nb__fBjwLfJFPd;#e@z*Wo zxxik`l=BAe4{U)SCwcpqjgJtEe1}sM4;{J0bI}LY5!}eZcjBb69Z5T?IRT>!wH+V- za;W7Dcv$aY#&VeR04zRf?yj!LF=63|=OJMZpO%A>EBV!Rqv_CMIo?1~rdUH+(o>#p zizVnwsf*|6L*UgLF6L=~u3F1qPwgPWRES}({Y2pLLYBeQxiu(LLGzwrd(@{{1H1kO z9WCk_YG;jf_-U!Wr)sSLtBLVJ=tTN%FZgmKbYDL&SO#JMhb*4qvz7lUkHbJF#0jJ$ znIv!y@`|Sgq;R69~0JXC8FtjuX zJcV00QY4HRlxGmeh;BCrv-bm@^--9s~S@jzMan{x@CoQVJ`2smF1vF%!lS~lo8s*_b4>) zIIYD{!RA%&law&P4n7+NaJ$F&Nmd@%r(1=cYg~S{#oVLhP$#lC!1PTYBigfZtODt` z(l=$$_Y2v;0o57na#MyrH5jTK=T@Z2;_tceG>*Tf2;r0O78H83#@ZsufOJ^9Xh6_K zunp$ILZK&BASNy5p^DCI>(J;7S~jL~=TpIf_R=K1I^b~LD z{K%i%6g0vWGDyp{B;63ySW?2Z*39!`hGjIcnFptbdT5P{0DDhyQl4I?=o<-CTgY5A zi?vF~8vw!yIJ7{fMOKEGX1vC#ZbE*y=L9-#Sd0*Rr!jo-k&sY1xweT%HsAI{dTA>- zR6y5jHr3;y~I=D$RCBTUvEj%EaFe(X19=C=ZwX}+I6WtJh! zbs2LB_G-};PaOhgHMt$;l7%5F2C(ZQy98?sE~Gc`Sve{i!vC1yyI#0X0C@0-$Hkex z4`_a1iO}kSoh9g;3_E@Uaw^hS;sE_9^@K0C_{;?qTPV4k6~;8D8X(B1hziDI4%_s@ z^e^lZ3E5m{`l{PI`=y7_s@mqS>E_3IPPgVi%5K7n#aI^UG{IMOp)+jlLpX3#wXw4CbK$2>sPNu`` zR3%q)w`d;2=nCihG7XE)re5u3jPf9^li@5+HT(FAvAE67l6t&d)WJ(ec+k0kH$FtI zN&({QVhzLg+pJt))&FWz7<3#4Y1(NLJ6-KARIZ!wenFbgrjy2O&kwEx+nnym){`j* z#564mh3>3igN7gso6nPecy%wI?hw>{gSVy>>p7wZ0r2kkwo!tjRZ6c8AiRxz<6wXw z0os-@pLXR)^-291#_Emhu9R4k@GP9`ZR5=_P@w*O*V8u54*1NHss{%T*wq}XKr*- zY;wzmVU`T>7xJ+YCqP8>QA!!vU*wx~Nxb$GMKMVNXr!B7dublXV_xL1v>Ti#?*Q!l zNX)Om%Zj>5>QP)(Pd_$HaOp@be*TYrx2vDSjE20YIK}g05qA9KLHsHaU+&hJ6D=H7 zyfg%J0AF7IYR!rd=dHU(y7oJxc!9Pcggf{KF+S+wV9Z}NDVMRkYOE6oj*e`s@~Pc1 zP4Sk4kRDYiTRBZX`INXE6d-50N)Wz$Svu}{v20ScLU8jC_)d-ZP+N!NdLyPwg|Oxc zwwKoevwg1|9y3;|pwYGvUHDe?XBl<$(ppyk3XYApz6#tOP3Mh2tXb744E&$~j#b>+ z;?t^upivXDjb`3b5 z0W^{(oL#~#0e|EcbxVjtI_~i=Ax-VIBZH4@O%Z*}P$i2ZfN$hQxV;k=YEOfUT?%UMy=Y7Dneq6UL~I5JES2h0XMY|Peq3!X zI*zIht}f=y2KM4Y@pf`)1(LA6I3L_A9Db5uq9_%bG8Tf`NzG74D$A39y zh@XG3isfUkf_>!*X6Qr!86AMnfv2P0HE^7CxoOYZZH3;!<8)K?5u6b4f|#X2j!aMo zT%QWZ-;PMh)d^DP@X)3pGi{D}m+Go*Qr|P@4&qQxHrA?`?n|jaE0n3%J?Mk)C9^>* z*1F1k@W1lv&>v6{7)ZRBj0mT^rD;B&k-M|Vzhgbu?g{&U+ zZ(z-?9#qt1Fms+GpQ79$VwZ!s9A_t(ZwJRk_ZGUaDeGG*vk55E8J=)KZhJo);AWr&mVn?8z(Y?Nj>S@|A1s)w4@x_W{9TP~<)6|EM4 zJ`!iynY>9aZZSbJF(|}dhXO!DxrS6xNz#6%|ZJ!Wd;W#3fBkOgC z*o+?T_?6L+TGYSYRe_)#+H)l}cz9I`)YXV&{-sNe(cUFH!qgBu1Si<1o|hQ&|Kds% zZb(;xzPAOR&mv$gpb|Pi{*#B@$ zu<_}_AXscHUB@#|?Ta$Nm_&c$Y=2N8+U*gMz7?L}QA~%?V{eW(Nu)|?2@zQgo1#}N_rlWAiF~?8 z!?iJ*ETEO0$Xchj47&bKCd#?N0$8Jd458WEEQ~M|RbYt0L4NL?WliVf9?X_IE@a}5 zYT#&T_^S=Z$<|MUzc|~PYt#_|q5a89EX%FJLr4okDZxh=Ne6p41sSCMEHcwAfJl^Q zX69k3c;Phu16&DilfeO^Im|zR-^Ojy3Z=&8h^gQ}AC!jcwQPaEY zib5*zq}J|^gjfY+e`J;+EkjuQjALjAjxrJ^whrFWs&l-$Wewh>J8?D#+NN^;HV1(L z0&2N`^JtoBN4Fer^2E3)xq|n>^{j4-ArO-ge0B1p@jQ@#+%(7B{jCatARCu)o__Bj zULys1>ZH(m9ZBpqHzg=NEhLS zrB*JO;a4lVvWkPrJ8ggV1bQL9Edz0fd{v99Z}w zQ29Vu+b!*W&*d2Iub#b{dLNxd0}7N*DQAq|f^87=ylVj+qvR3nKo>3Gqj><+oBEQ!klbQo5W(r zeF=^&z`XLqb_9~7Pa6PQqmNZ275uIAiRH$6gNGfVf)Di7xEO0GE-Pr*>P{|Y&FM4f zf`-#F^hl^-;=8<;dJ5O0r^uf0x&B|#htds^DN2m#VavJRV=Gzsy0f-P%^BLdhni6kMJ8zjkoz?nVa$GE%nMh5Fdbf zJdwxWdg2fFyyNhXR!M7iT>@vx1K@N}zT#4o4fwN9HiALI;*QL__%8!TZASB>Az(q4 zs8~djR%ixgxrKOx#89CNYh*OTgw-d@7kE0yM`I?`;>o80<4}ho76LG3K`pS^XwoR1 zV_6wk@V!+IpdVVQ#a-;VFc2x@Z@HJ*eR|dFc8?=b1=N(t9Y)l7+j&}kWbb#l~ZbhMS2i%GA4fn8}x6igK)17xiar|eWnMnl7 z5)jMHf-_gW=@F_lzu7}NnU1N4!`K=C#jV7VXs4%O4sWbuplMp(d*lTW;<)KjId-O| zDN9rw=@kLm#4ugIY4rAA1>5=TvPx~y8v!i^@qk&&mh5db91K2lv&N{zWv*mR70k+K zE4z4U^T!Pmj!F$YXJ>Z)!klRl#N7v)ea!xqH-r%x4jYXp5(&2z0;AKu=RT9K=88uZ zW{IKvanV9{!4BwEyC1IVuX+KZ0f_J-t#Xyj{^HM|ZSIsdv<`g;^ED3Nx3?v?dgEuz z4e)h4ZQa^ovChiS_{?=(7h2TS+kOJM1d|31#U@`_`M+iu7X$@j8z5_kAXfQ^yS74?CJarMCP zzdK`EW}pGRzVNVtNJY-IZ;2BUHuEI_WtIzbq`-brZ!^cDLxH1_$b=*?C%8Ak16;44 zT5CldQL?CCS#>V=nu3lqx}KQkP@)l$|Ll;XgEy`jB%88+x?8+oFLv@kry0sM%M&0& zt4>#^Byz%B8cq!H1k#sX{Rw%Q*$~uJEwOzT$l&9VrkFzsfSMgW_yr9i~K zgw`K)6h=DDC6>5|1@6?K~|F0Gh0^(>$E z=klZ_OXSsWjDl&%&k@_GEiHC{|AF42b@5|8#2hdp<;mQKf+1UHB!@6ku|m<-_mI zN{ilJoj#FG2~OBbku#@hN^|ME!7wpq!M%a!wkGQjRo8BK!|PVN)O3tso0E=&Y9gT6 zs3!ig%ckzi0hofWVJX)_>PtnzS13^FAW2{ZFopjU)Pep-4gFthZ^$RBq2J(x8?jI@ z+2RzoHj*^_8YCv?33>b6yxmwUkw3PD(VtF3M*otVz&P*o+6whujIbIi>@*-5#k0{| zH-V{Fu^#71x7!K2n>H9#G_siSYBv!oC_ZX>EUTz)CUkmLKpB!`MRq{d{BX{Ci2aG9 zl?y*?+V!-(KM&hvJS}>EQYn+*{fcJm<@V=zEqpv^Zm)39i-J?lcmt0kcMHP{eS_}r z)Tv~E++TxfM}R|F%&&0B-TBCOEelyF2BiG;c1+1GE(XYpJRE7>bh86%NKsiLZRr$M z(Hp6*P<*eE={M?ZqmmVersZiH*YnfI)#N{|UxS~G)PCbcwH3z`7k2$@N9GAIq9 z0Xe;E_OmYfy1C7Y_r0hM(EN>@J?pbNNo<31)aRaOmwXHdNio;LFgqWpkNMp81ef*z z9YAM@?3IS2J_SyWjWj&xKxi~|U)2w!947l0qnK%>Ouzbi~-ng2{8Pwxj ztNhh%%nYWj5P{cMZ{?ju&Z!A}WO9@%y??UA1-t4uMa^$0|{{-cRW{ad!!9?R_nx zmE#nG1@!%NE1Oo%&!q2by~mp)_%xe4j=zmM5T}`BwuE5rbvi=*hUIqt_^I0Ne6%CZ zA{QFo`J<$64vgX57vXvBLXB=UP6*_mzh21;8=rjW=i_`*w!;DSX8;KPO8N8*%<7H? z*0q=(_GKf*PNBgGVS_=B8fCEak|{K`1A5@eY}2=F$wr*#LL>bD!jTpG^(PmphID`qA>rAahA`DzCeeawn z7C#cpTNG4_Uz>kn{Umj2eiOeA^TGPJ=gZ^APl3^ePEg-V6IUCuW;+Vx{RleUx>J#X z{HW+Rg5#W-^w5hWw>Nse@H;1DzQ41#dh>q~HGUNKj^D14Oob<$i&Z_FG@#snC+P%s zD)F;)N|WVJ;`Syl=c2WYyDJuN1D6$1TGjjK_f0Z{Cta&<4*nS6^K}jDrbyj_D^Lpg zrIBmc7cJ*khg4WQMxG`??h!(tutqMOT9c7}Z(bJ6<4I)0n8w8_ANl|!AXmishm z?yt~Clj=;pL~kZ348S{Rx3p%cxy7Ek#+bmZd&OL7A<16lJq9lu5nBJL5y;c`##lE@ zx`gzySM7d%C!|si7Wj(18_`>IME@3^b@^lSKGp}q`gjcI^(`@ccZ#kHsfqqV{&zgKr=21SBe4fZa^|GVg+IlgiZcJD0zAHR9?Ut>dG~N8lR0n!_ zs<2t1_kzprGnM~Lam^2JL;<_cjQl>(%*_KzcK}jAt-qw%NX+qj`RW_X#E0E~zs?DI zrm?B{yR)hQWxkwze$`4egXM_cnn!}Ih1w-Z4{ugrKm-K(rnj3 z^t0mVz({GIint0Sb_YeOk~M(gpq!T|j>(pww0(dkOdUU%Q%^j()s~piYrsBA!PN5b z9svri6pE7muUs`G3@E(n$j(GEvg}A?uiv6^R`x z2E=p&rI*S4{Lt%uL`^M45@jZ)OIIz)N~a`2%`Qk*l<=QMlcMV5qym}|9Cp!9@Th|a zgs0{*kd?U7_=p8NLVkn&XN#)?b0?a;AulPBX5*qo@?yd_rkCdcRf$%K=z#Z3tQ3a| zNmm*YvV*w%{WlAH+E9K>b1ZerMEre30x1LbQ)IXUr~nJ8z1XBQ?|z4vC~A-;A0(_X z(qN(QDM?zuLj}>&iMF1Q1RKEM7znH!*+{Hr1LrvP%pOM5Y4OEnU?3~qVZ}ZN_g)E+ zrh+BUn98(S@C%7SA$(yn-I$5O%6vtG_)hP9G4glNG*KF-kl0NzMnY6q%91W0goHRW zi>-sS=G9gkAOu$JS{aEh3pQ7B==dR_?_?BW&gLk34Iu1m%Zwa zW7^akUJ-r`?N*Ja?B|ZCERi%0NZF$stQHLQm%MVR1OhaSyyi1pve94E2>~i?2~@+1 z)O;vM@3(`2%m^-*8#)1=90+=35UK1%#v9i$7CTv1biq+_65T*+f5Knf8Gbhhm^(%7 z@uwF**Yk+eIwL#;_7G!VLGe{=G-)-Ja5_^Id#dtc;3K01cu2vt4v~9hhaw(EhAp-Vkh^fytag;CGky;_E^6Fxc$CSybq9;7QiOkr}jzT{^__5uUvj*ASOZK(CQ20Ktigox>ValUdt|9BAf&{6p7NmV^}Y5WkJ< zsG5KDm3Ki27`g7=jKuuDB`7e;HPZm^u@rQCMh-PG@Sp@e!xqo=h+UBzOpLvdlJ_zx zt;~U@Me>DeD!R*Ecwn8X!Ne%FxHh=q?sSxIFd_vNq8%0V(M%-0#&iXbv69YGz1rF2 zBnQ!qV!kr7UlpqkyNCxUr62Gvk3aCM`UM^`X}_n5YGT$F_`uL1Q+f8)vu0&?A`%dg zOd(0WE?6@=!FHvJ**M>XBpfER&7|jE!8b2Rm3csAHXxXV z^SnL?1Jum8-rVgetz6fK=}d#=t*tvbw&V)J9VcVmMSmmfz)f~yA_&ocrn5|M;)xw4 zfCWxz4xX6u8jX_-3D3}UmI=O}iRRaZIB>VT3ON zSYLZ>nq^jb$S9A>mqHBowe`dw=b2W2kI}35ONW#9f~N;K=4|0{9r9>boYq-C=xhfJ zex%yJHE}*ZO|F^-r3nYw;c;C)5eeddEe@WWS`vuvmW_a?MTM#qm@wcpWDt!oBIqKxKrX(8i1kr2=qveoDglL_5i zzOzCj2p<6kT|jV6#9{+N%yJMrV?v`NU>}$hCH-`k1g1VJ*_hnpvq+|>91pkZYXfE1KGKk}NLna>#k! z$8M{x{muRTTVQxF`T&FvKUb2^kGby*UEuid0*Il{mD_CLDc;2S+B6q)<1A$@>?0T7 zi04=d=n2#$Y*f!(Wpog2)2HkPOMVNoXNY)c*YYusSn%)PG$o>zYQP_+cS*yV9w)}r z*Xk@0OL{vBj&_);|Jcu)$ILBG@u0@&5MFIeZPu(xVOXKCMlY$z%Cz6iwGtDD5vc;} zbQ%#5kQ4^0T8cP$CB^e7PJJn5bx}>87+eDCS`&TE|8TDOkkCq!!g=uQYo{&v{bH70 z7Ck$M$7PzZ0}1~1`_X&S-Ruxzde_S_G%KDXUsvU*djggwvp?J9#(?l>WYBdGXjUFI zs7u)R^M{YO4E4jnh}W^w8_C#0^bGMriD=0Ro;#*N(XR%YCzwu$C`tL5CCxFXbv9+$5spG z=b5Ic)CJgVaNpNg{CG|)x-|30W44#z`$zRJOhAG&#$eP*H$y8~QnolG@3l$NK)R@_ z^Y}zE=f%m3{hF2j!j>N=j-y3xzP$Tezs#35tSendCPm4-ZNLE4zRJ8p@4cxM>T@r* z$6fv_ARb#O?yfb^-A`;oiiOpmX4RJWgIw zJU^ew^$Q2f*~(2zz;C+~7G!$0|HZg`U0{mTaqA$EZ==K9{~mBo*lY#ifU7cr(TfI&o)WtY;ipT zQ8|v}-T(S{@&++{;HEAx`la;1Vto|M8t7dwGvOrJh=D2-3p5g`|t4ERtwpKu%Ku=(`J zai+0yx{eIZyw(TJO;D#vF`z6p5J7i_9pQjM{}XMb%=_lD=K^>MlPGF{g;bOF1W-7| z+qGi%5{{t}I#CUp`jP$_wEXhJE5Hr61pmdtPe`LMlotk_s!&SWHWc!QUUw;!$nW!=Pug_QG1;Nv=X!*3)GDT1N7rO@Ywh-U!FdFVMZgVlh zBXgI~HHhDd#TaoPwHJ*_%K1LCgS|_HQ-)N>NqL@3_vh|p#k|Ndx-eFWjHU~(Znt0R z;ZBMV1+VCz5z#b=&P{!hMZ5<}^4&za+}sSzA_B_syJh)D4-$YBkvNc7gKUTl8+H>0 zxZAc)C&V_6^Twm@egzi3OR^iXc}FC2F=>In>Pf3pgz~_r$xpKerg|Aw3ayNMv%@V> z5|^;YVUiP9@7^}1e6UNGGbSCcK(K5Sn7Z)D?4x$NtaEyxN}d~Cmt-M#{i$bI<$t>i zZn_U34v!XQm=Pw1Xr~2d-_$?@RQyY(8%D2H3x0}Jl#7Ld5+vNkxiIb9Fux>9R z5u+;p+eVm$D;W+FS372tgEOY<}#aYoI=hhwxMj$w1%whFZfW?gzYo&qhpj(v>u^bEaIt~~iJmdohVf)7leGcv#3aZYHDRR6ZY_;o8kZNnGt zWIt<2E|`TKVNR{Jz%QJn-M4tJhb+bK1+)z@J~0h5$@c9saD|O^c6CACZ@1xLp+mnw zDid%j0X7LTdJm+6AW{BA3cjXD+6`I}*HX-S3=`1qJ(m2^1!oOm!86$>3>LWf9iGI)-`XqnA4f?bHRnEOoCaGuS^JgIN zR|nohNf>9qR6K<>bo-YA-F*(!XbxMHczPi#P**k7rCj88v>0+7Z=b^Gi-We%GIRQ z&r5RY|0={UX^}x1tfKt7f)Rfv9TSeyI`VaPL>WNh68hKL$d-isUx-^V1YhbHT82z&VzW`CqPtJMAyIuIW;4*N&Jx+uPU{U>tr0~^)$*#L&LL+7*EX^Zxp!; zx@`Sq!3uf)u%@Tg{{q+E6FCq4_HRa9(71!bD<3*E%_QAyV+(7rk9b=~Pr2{-32u}| zUn>xnlU*apHiyv;Z-*;)L@ym;>RxK7^&XUhudo_>xOzU{?w3v~)@*fK(vJx}rOV)w zf1k=|um~I_!=h<>5GDCg(kd1{{9b;~UfoLMX{nPgVyyPm02)f_O@{7?=0X^zS#$6e zXF}!$Z90Ns0DcWhu}|SejxoQH7Yy7vi14eUv6#4AVs!lv=FWKdYA#0T)eys&!I+<$ zyRrv68jQV>dAsR3m?VL$fpal%O|o)87Qc2O%65`L7~L1~)*o}u1sis`8Kim}%z2__ zd}(53BAZEeH4|n9?`FD%HXGt9S*RCyB;~SJASlkTHRJt>t){&$axl(XLoL7r7N0{% z%WV}*k5)K)gzv$Ayk>Bu(GRygggpHblYHPPwzmqcR1icX16dLUGjI?GsL3r?I7d2v zY4GrAHJT2cNE*mw9TBm`j7`AAM29@zlA=oGT7$&XkeGjBYxG zDBxdRQg%kf&E2E(cEp(E z0KC3cT6g|k1z3Th5y@$sk+vzm+tx{EwNn7vL+E?|{o#Qj78F68!gQ=hg{@0bjAu0^ zpBz9Oxyg&*+y2C8fhqP{ce{|W0reI^>al>>mKw+^Q33oRLj?mlPbICVd&t;{=L=hh zjAPpxL4NWTapr&~WBZj1+K^|F8XTX%MRihNbA~*?u~4an!#(m}8H-mqshZSRAfzHK zveR)APlx#$U5FyT;tg?@j1dV0;j9sTGU&I<)&a5b9^>oLQ2)lmv)(_IuYG=z-nWtU zOyD4gzJaF@11bmQGGgX);#nGQGWb82I*xa%OJ==o@t#8*pKH7#_kQ{W zA&FaGn7MP0Hqx(seiQGZ@@;>?@NvE-ODG0KPj+}KQE&O_un!O6DMed2=?YC0k+|C) zn@oWPl)u@}_}**WWXZOjp&RS-CBUQ<{%yT+b_c~X%uXfz1I70!TH1qNzj@$Mg8>)= z^gYL-(QuPII9kzhr@{_QZ|KrdKWX471!Y>oKfm+^b?=VW=To4~;JwRyyK8st2NSl^ z@(yO8+qv!(Hsz<$LJDL*rI0{Ao)|PtJrhv!f4KxEAm28J&Z&x2!U&KhG+bfwe|Vop z0f1PpV;g1w9v~vLSQbV*!Cz(Q?*RFx7$@^KLpjc{h;6(m9PvBz+4q0#WSdh6Kf@z5 z>V1E>_-I(Da1dh_`W;xrz=gxENbX+S<#F8x4ek0l??wW0o1BSHfmt3>@?|C5_X=qF zQNl^sTjX#R^2DIgkYy-8n47LQ4je-c8piQ@A$Fac?zOZ2LG5F#ra^rOR2~DVb`4Ur zG~Ol&6~kf1D+5b|v_Ma5B)DW7uVTR~&;7(8&V12OuBA#>+g*lM zA|^hZ7D$ot6m)l0$Z2mm7}Z~om&I16%DDItJ_Li|;|gUq@>mfO8#zE#P!d&*Ey=(i zEE$*D%n;?seCdP9MDcc!E@Ju}`g7ts>*9+IJ+LK&ykkv|TtZ&VjvT)QU!#MSdts;K zz`N{6U<*FKAPsSI;`rZN&$H-%jDhuJwl$6f6*aHc*ItB}qoK}_hvVK*72sfi)Xr1b zg^dJdm86dy$oj3GtmIdeRW(7@#w9-bgCn&p3(YG%BFiiQvov9*djTu-)DGRTVsL>9 z|4+eHj59T)f`rIe@w>s?j!%twk*+)d=HuZw%|+bcs2>fXjCniCgK?@DTx*q&K;FGm zt@l0ue*L<3woV)Pf)QkMO%}wN#5!BHF+4pdW7e|T%MPYTy@8$*1r_{6@s1$xW)mx- z?tlD;hccLi=;?Z}8c@&iO>Y(>2rNrA8qy8bUxEx8a(K|>^}wG1j|0X+`;XDnbaK{A z0F)1AcMZh*$zRJOxw%*K+kDlIW8PhCfk_L$$Fa&aa`xpjgXv?R=Q5YA6&z{%)nAd} zl#ui6@J0ka{O@zePe*36Nzzy>5UJCDS1l#HUZ++Xz7Xr+2gM;j3SC>Su}&Z2ejTTI zgz!l$M`rA~{sq@$w?1oTBi?;A@^`+(S@1E3b(E-&Gyrfm#w(xm>XQ$FaYG;WG9rre zIo~Q{6NdbPYYw{5E!TCrywJv%(2JJI(nzMDm13Z8M%Yo-t>lkX96~=l4w}CM2b9miW4L2=0=WF zC59zWP50oRZv-s|8;JV0t8p)*RUoY@0hKH(BFsDciAhSvOtwGR; z@1LG?3(GZ?wY&fSZ*VOmA96d%^rt!N9RnoFN7t+Gl?*uF++~ip>hDRW)-W3PsSpSd z_1-q=(KGSxAt<%RD;WP2+Uo*+^g?g1L?-PajHw!STP69)>++@q3S^-DIJV`f9nPOr zn>cPC>z?1k05VzohC#QqE?T0sz4?Rk&hafgjZY? zXLHhwa$PQMr@ZJtq*a;Ok7Nu>fVj~XhwiFf^Qm>m?hGbOwM*|=MR&M`$ab?WOqH`jUDhcB947CtMtO0>J2FWa1N)EAx&-SHIi`T zDz`h_@^4keFtugo8r}0IUeD|2`|OgzE{%4Exjt&WS+}a?s`WbbOv(B;HS0bL*|iB!F!knAc5ZXJiANRCRgD8keq&sk*^alp;I1LFu3D3pfG z&WFZ-%=#Y897z8La}g1uL!u3}Wy}UFcewyEb3UjN%}PMb@2d5A0+T; z{gSrW+Oh>DhesDpTF{1}nA;M@Gi|QLn;b)oX!K*OuF9 zf^oRV6qzorWS&DqE)LmGu6sT#ZoGp8SY*doEmGiZ9A0{Eyr~ZLs_hKQYs#{8Oc|KH zjS|*^sx)?mRP9(Zvq)^6hlIu3WKw!$F{SF;lp!EAdrm8R$hDH(Sy9>iG$Ekbw3D=^+*7?6C2JSbjr3a-q_hk7IOpt6K)3W@NlU#G4K@GW7m+PooDF} zq=yI~ib1|(>cMEY)fxotlF((WcATaj2I*IhmbI1R>{glJlkVo`^_ zMdry7pI9TG*(F8KfXpagJy2c74)(Bkp7pddAo=tCTkE|4^MT5fVg2nd(jhi6$~U0$ zU=OmA(;y3u2URv_^+GGO)C6RmPk0)#p>xK`)oTLap7|XkYDZ$vT>93*))2fQ3k)jN zO7)N`q1=solnH-U=Ad9t%6c@UxTP8P_i`cw_9n9dbgieA##h{QD*yJ$0JgreulWF4wDo`*T@hoSYmpC}v1NnH_5Q z6!N_NH3E!+Lvo#LC&3{`>ThT@{Hfm+ngWlOOkMuKQ(B5x$)5fxO_}PltR*5> zAK6cX^}bIci8m+Kh&g4ub;Qv2V0@I z?Un;}dSjC{mPC*K@fw#(@(Ic?!llx~1GWPh1|swntlh_YOo-oHABtKcn_B_&S}8B2 zJijx0qtdeZF{)6(hxn!80)+o5{Gx_{W&`L_D3CO#sG_2X)4E{lIp6y>YJ-xiv=Kdz zamJvhOF!djcm+ym7}4~dyyFu_of1qjIY^NGJ^sKsCCkH=Oc{~9c%ZdmP)OUHfnOQz zhX#l>n<&Un?ETIzw2@VYJe}*hSxH;8e22g-M4gb*d)PNkXkp=taLd@ql`$K~_HT)x zs$xRtf(H_24fDb#mdX3l_DoD{v zP%y+Ii;eY9DWO$RUQfoP0Fj{_u$trt3x|Cx0MNkrz6edR`esv`v5v@&SGqjZQeTSj zAXSW|wuA0@kG1&q-!Tcz0Z$@^M8$PexV zXyyq9b|z%REa;D@xfxK-p>uQ;W8{XFn=`V~}1 zjaG4jt~YGM6@HU7zXZ(q@eK2Jx9>rtFrx zN=_8E_Bx+R_UV7nX{lsgK!n#egatD{)zp!$cU#Lyf8vLP%&lglf{?zCSNlY06J)h$ zZA=rj)j%|;xn}~{UDd?6iFk0{+y2jeqDY#!Iu=`5AORa8(t#N4;=*1HzULz6teRDx z8Z^(ks&If>opRlD2%NuF{RU}&s=Wen12F55;&o43n>wS3a5K>eNgwteyZD9xpdk9J z=Wn8)^!Z)zYIJ~hTWZwy+J6{fhOHIB2?s(S=FiN3wESG*LVBGa7R-OJAKfJ}gq{SL z3hBehXXTNoA*rl_lL+hJ!PN_7Ml3hQ;fgg&0d|wuwE;4@*4;jMY`y{sR+I2}Cj%+0 z5)va=0WPM6V-DI+JThHHLRmQN4y+zjlR<6I5?y`XX&X4&5nrwb*~dW|+Ma0ECMC!? z^AR)y(}o{Zh{gD++vh>gCh&p|ybNmIMA#OS^r-~-GIrJ7)XYB5FmN_c=6MUKoo}pb z5YH)3h(`%wYU#@=fafaG3geJGK@tbMkqZuHb1$`{tPZCCDr39O*e)QgB?ynM%i>=x zY`^RH z@hKjbJw}@S7Uy=y=0Q*1um~i6w*y#0#JQN>W9U!&k&8AFa_Wwg&yc%N{@-df`==uy zc|Z5^{U;BFEj<8(TZ>J>AO680LxiR?(5UvEU#8J0o~}k6Kj4AzD{`%(l$V7Mer#T>sX~dXtnm5kO7W zf%^op22c_=BEM}K)rZ>XD}TGY{)CoZmaUa8&`7c8Ee~lv+@6W_bdW;%?29I_v?8Ig z!6hcicRlw7r$Q5V)JjuIXckrr?wfr7q!?i)e>X+|KTMR*BI-8WfNti>EmQ6KIf}}N zFJB&%wt^puzT;2^Vi@}>Am!R zxEndVE(U;hUOYj(YDiY6<-?EGf$`eCClm0GB;WRDbsFJ&X-NNU|5fw^oao#x<5DLE zw=2kUN1te)w<|3NS!c3HYd;RXQ81;48sI`Jl{`CHK=CtcCvAL#Ao=z+4wx#w+)jv! zq1F*q>V#EkBiUUm%FuJu_;o6BeB8gW=rxzchz?URr%??hF(~B8d%#fvod2K&BXRLB zhmoNRPHXYE0;kjz97po!CL1ns3`atsJqM?$Nbn%>+n2c3s@=uQnFNfN=^SNV)BT6m zK?BQ#v(Q_ufW zha4y(-8^MPQ<=30wcxTy6*JV^VRprV;{aVYWYxK8)OyFA&e1E}Mm*yi^$}SVAn~&M z?$6L0lS7eU0#|rjsb-!k7V4n^eGxBziHFj?b?7ZT3e<6n*$uWlwS8@iClDeT&#ZIc zX!4YzM~?2vS|Wz+>oFdI2i(j)!V_`?RDgTP&DzQv6R0t=;B10DF|{&#*l1P?GxD@Z za>8*no+eLY;|z;AH=Ai1gZjWjj`f;S&}aoRD~AR<5aJH`y`Xi~Y@TYlo^6e(ZPp9j z8CzZ;9by5P5%L^H{Af&S?lj$iXB)ONafKQ3fQ8N7&&Fwd_UY}n2R(5yF>B}L`M0~V zmN}%}`9Et4+#Sc)-c7oV9pan>v6W}ZZtcEe4@N#29fd6t`)<-7 zYQ&%snC-)74RjyObWYL@{5`NTyEW|4Fz!fP8|05#?R;Qx#ASFp>;iipuX^p)_Z36Y zw1)5TY)Fg`g7YiN@Qen(A7w%NkXklxFld8`3}CyHV7b(+yHu(-T`SkzJjA>&0vRC^ zKS%k&j8!RuhNKN;^`JBm+0f0bCE{C)qv}P8ej?aBiDlNikow+Or{;+KQtgg9s?g zMd5a}Fz}IqQ=B{l%Sagpk@fXz=SWrWB629a61ARl6UPH{!@fQM01f@0>!hFIXl|Id zyYpRz+?TKjl`&O|WHzlqr1@n3vj(gRm4BSglBV#yF@T`6QzJO9#TG`fWFz|G3)z_$ zAk_jc%yphZ&AJHIlv|yPIW`YpF>P!*B5VDmcm6b<&z@Zb1CPV)7NC3OqZ6;zdi9gN zf5rd_`Jc92f`l|KnvhJ_B$6DS?JF@+Jv{N+>@4V#jg~54Zt`N?I2D&3HQ&a%&6dyj z7?xY<7YEq3N6G_9mzs@LStNkwF$L38c5Q>SVqn*CV-#?m*`@pH`nuo5?{aQQ&s!YG zo+xyBdIMsT%-#20rsOu+l(`SrCd$aW?}YEg)!`0=qj!AQ4J2W3&psk2Jm_rOIzJ}U z9KV>Gw1#Qnvkl^>CU55E7l`W#h)iMfB)`-RidF8ju5@!{?h)6g5# z)rj|-6T=yZVByqvSEMm^{bdZUGN+@%W#auctD-2!>)IN2L1EdG!|h?$fG?0#ilI=X zo*`TZWNAr*0V0cMgCQ^pQ$xkD=+8a#G(El8^2bB%C7PKup|xGcxRNjb08}>-)g_s? z))8I}N^#SGXS>jx%DVvOthf$DdX%wVTKeNXMmH7U`k=B+52J7@{qSgpou|D)8oh)e z4xYsSS1x5U;lzMlp-3FXnt=rEWW!u1b&MG8ty1K4e(|fF`6N{$aUNG<{)Ew4+IjQD zfl1IW8QJ~6TlU3~In&~4KDr;ymlfuS)rO9edZ_rmMEqFNBo5bkO_#~>B{saz7*<+h z{cDUNf zcNo84VO-Xs0lHW1jQKdg*Nqe5w^q(KS^?!ESY!WEmC2hMO9gPFe<3`tbtRaOn1>Zq z9DZlhfRM`QQwUzBK1Ht3{h#+j{q`cID65{%7_uJ$FJ-@pUf^ z=T2+iRevtR%gCwEFq#8UHlItviR9GEhexh^)lCZx$rZ8n7eB$=%~HyEfD^UX#&KVe zfk62SdYl|1to8}bP*^1PCSq+0X{1H1UoAi6%qYE=sb>KJ z;cjpLQ#Xt}qJ#ic>lEYQrXk4yK*o3?wOz1zk@SuIqCGvi6X~hR2!Nkb@YtfEgkbg{ zt}APq7w}@EU0;Kvd|ey7GGr$6Tm$h++$R-rz}0%rHI znYfq%PMcQc?N~@e4|?UbH1+s=tbH}@mx!W4U&o|dy;u~@tr6mCu?#u)LgY#h$&98k z42&AE&-}rLEDpmXAP2nsUu;A@kAurE{7z3>=`u07$pp@JsWkKL(`HuMZYp{tH){Vj zwza7A-rLlg|7``f&}?g4zY%X^^AlzlG5WzT<*!br2;)pjk#WCo3rJ#&Q*S8vOMa`C zmpeMU8_S7MB!Q@w#TY=B<@KAw7IEj~!N}0S5e|PhHClj4=T?Ae{8o9Q;*X)T$?S2$ zCP-C4HVhZnbVbkABw>$54|Z-Nu$F4@0tnwM5`1%PWlH1Xx$4CMD8xM z2+WfBPb9WcO~h6{dV^@2GZY0_;9h)M_Nr0@%S*DQ5ndKXO25qbLQ|bG;Op}lyBI*a zf=m{TA=TC7LCr0;bq!xq0ydG_W&s-jAC2cQ2A47Us&p`?Bm*p+ zOO1QZVBQ5ON7Ry$-T-aVgKHZTo6cxR)@vEHR1GdiTSS|( zVI~W&`(JDQs!JPB$IH2O@J_Xm$;Mhu+pZU<2Vv)z&oqLBPx|dH(DOqXCByG)CHf1m z)iY^3Z-@#X#f4AitRvk+e^3s;Ah?IyhrROL=r^hf(h+UXp2#3#k9ctEr6NftO0A-h1YVP@6hngo5@F z=?=bo)p0?+U~i4*C={VWKZ&$}xWeJhrGX&KPB*Fi6U>sb5=^)=*1)bY?3jtjluewJ zt$)`0mf-qdn6CWXu$N*zpHRd~^3ubSJx9tHSuDP7eGzF0(2mInm#P)~Uh~h{b#7`( z07ksvI#5FQDCpkpc=LWpk0O z!(-K4WtbRAx5s6Uo36b7wF%E^Q&)i0Yg_Ot6d=lxm_Y7fSlT}7F${1Q0v-E&=gq4X zWZ3nUaQ!oN3}|lMGgFwe3v5EPk-UEx#cr#(lUnx=1ntHHDzN`PQ@yH?e6uc(v=<7z{eM{SlQoi_ENghKmm zxA1uXQIVx(>y)^QCg|mt2f6{_)GGw|4pHQOOX0~iM%VXNQcl!wh%fC|9#6jx6v?1q z?$5uu`7SEjMNOfSm7xW)x|nCK3kbK66Fcr{GKF4|YqgEAGsXJ(<_jB=NLnTlNt8~{ zD9hYD3VHtGq(jWasmAU4*_c$=RNY`mNZTeH5P{x2rbcD@wkXJp$y3aFqFoK*dF?=r z^+INrBE)ntDfNS>L zik+g)iLxc+QU1HK62ft1QPD1fR># z=!tL`kv~@MkK^xJlX0Ovd!vU@=}_7_^b3c}%A(|Ih%u6$&~#PQm~%)gxbc3>Trc+F(!FR4n6@X!DTx3i>vMq zkv#XeBpr;x&sh0uXl=FfGY|GdG-OmhbYDBnAFnz5!01KNsid)G<;GnV3N6xyTfh7# zSfVBPHMrBxomhf7EYLU<19ly3XVU7y^hozQ;b;e#Gz8QOWjWLT)7-rT|(;aCsPv<+~Ojzs;d_Js^JfmliA!h+FN$iHT8jUf8@dXN{h}nX4G5(XH~{ zRK(0Po0i6MJqD6r(#ylb^su>ai>93X=$SCUyhMFItH|CW;cY83$GmAd;!QrgaMFS8 z6RQEw29b))#f<;A8UB!kF2P};`>iF9|9yj-D-OQtY`ClY%NsdSWk%{TZZ-$DKbBM_ zmV`K6?$s;f*{*_>pWiMe0`KWDtF6wepf57!>CmmeBYQP4Yer)D3VRF zDuzUB0cuGJ6JCfQCIbZoQKE zCIZd0g?NQ(c^AQ%LN)S|d9er8-P}ZbG>CZd)gh95KMvJCCNc_&fST0)CKU4S6R8cV z^90CLMAk zvyJ6Qr5Q}TMTP~^8rqV~Tgsh8N^I5=nMF;BH<0~>y+6bQR()wrc%VtfA>snI4cI&x z0!0p;0y+uy2n7is=bb_O}J0WmhP#oaf)H(Ck1 z4G(N&U~>RAPEoUjc_NxC%|qu5oGO}g&9#y^lQGI-?dV+M+0ADE%53$ubro4N^;ay6 ztRJ+aV}cRh*ELg4O0xd#uUJ?hI5a@~aCbn4u)F43i&gUjg5yrLXm7b$1LTN14KLuu z1!Na+;!Y>M(RQ6FBXHJmz4>EF|FOmWPNGR~{(v(7FyihOAQJ}7Yb~JU76?+^vH~Bd zfE-S1{tDpSP(Td@mY@LsD2|53{JUpO8QK~F+)Ut$2>=1+j0EcN+R^$*U?%~Z1S;^u z3qP#z!-^jjL?Da^91#I15Xb-oz<|I*pyz3}b7yzsuI8d&rtVFPqOG}Ri7!kPD-A1A zQmVGDH5MzjW4l&Yhr<6W7KUQQcJ{+qM>8cwwy_A?Sk$}6v1TfC&D3vv1Y>$#a$&s*M3-NW&5>^6~4~3`a&W8c4&X(fD~Mf19E@WjA6B=t}_&|ni14spk1xq z&4~A{w-+5^!m!eDbEh~LqeI&{(D>{5WQ@DF=J4{(fyMok@EC@5 zjwEwL;O=s$A%~G18lZ^)-n+-4Q3A~kXj0(RdVd^e#BoF%x4L!zNqBsbH3thTc*&ZJ zgM>JYc*p<+FrbS&1ws8gd>Ie}1CTiC1jiB_I(OTGpq1RIvt@HAq;40|nHf03`)TQ2+{R zI6w_5)S#k<6L;{H`#Zr;6^eL*L*Fc6zJ_Rbr}x{$vi7;sHWF9`oFP!FK_5M|9~Qpd z_Ri;-l(e@b3Gg8SLJ8O)4K``$k;V^c#E?b`1?o%{SUO^jc59xYN^)k50(IujJZXwX z4;mPl$-~SOW_B>+M9mp^oMFQmCo|BP(SsQ$m;rz?ytpYtc2kB0IxjHi^)=OL&TBy) zQ0FyEm^rUm!W^0M0L_T z4v7);7SA$%e0HLf^SkCU`=*SM8!}J0JH^|zHGbW;okHe@%)F5|VJzVfV~jfu!n7CMOnC7#d7$9Q3Dtk3=O`3`EyQf`a=itP|G0$_r(?{x{h~2h+$(9vfIg-J)x{U5YwXAR z;dG5@Ew*SO(ku>{B8!(h)%GR}9LJ)KV_^dpsVnxl!iOvV3Jl1wq6;fvu)+uhK@d#x zw;j7!q@`}&GxfAe>RH44wi@30<1X(Q)!R-`gOvogEi)Q-&$|jRUaQc#)36F2clW7F zJnk;OE&Voc){phGtlhS&)oxoVUSiO=7%whnNX(HD(_%eSpqWB9g%di3OK~HGm>Vfb z-A`1;r>X6Y6thNQCJG{02-736g z-*6b;CKC8ptSGw}yjbhD)%`FLh6&5WlO@>rwz?&t!;U{Jf+5w9bV`0TQ#3z?fPT|lQ@PEL(jqS@Ar0AmE`PVqLv2{qyf z7c_slfZ=j;E~g@v+`R~;`uU~^Cq;xrocR%lmk2L(;%G#aLvK@V$sK%<8+ z?oLM>t>(=_opKec9&L=pl3kmcDGE|Em71wk=wh*C*N!{mYsb9x)JaIV*lJ7r&~|N7 zE_<#WZP$*O#ft5`NS3i3+8>2hw!_JawHm%yhc#nMhcOfkU10974qNE%aTk9&h(1BC z9Ma^lL=IZqK`ByBL@2uJ&vveVJ55mUUJ58h%IdaDokNi)eI|1_I|Y}{`!b8|x$A7|@^@a6_2PG4z_yVI7E7$uz&lpCd%4Qg68fN`h0Wdjv_ zW5daYBf8#dVB_v?yH?k5rUoy5Q-hMb*8sYE4LI&jqhXEHFymUS#%LhpH#F$*rd1kL zSeBfo!WZqnrPWx-xci57#IgkomDl};1!o2}H#3;InZe5pI-em(-x-X2R}{cvv0^(l z66e=0%kG5T1v)WwSjWN4xMnj><0~ai#r8Hv2{yKjv}aQ7)*gGd@w1ff(kRdn2uJ)3q&-;FYZpKZmMX0 z5LDp|!AarazTl*IxRg`d{iJ$J)&F8pB8FKEDa3%p{$bUyS6C}fkw9G?iXzq-7H#=o z`AL})U6twTUyE6|b_lGZn%CkOkV>PQ18zikH{4AF&vwRXy?9o6C=ysDrBl1#x(97T zwLxl5)O4`*GYI~!R*JudPZGuv65)kZLLFKlG$?45h5~Jb85*ZZpiN4BzU5ECIt<4b z^UjI--a1qG&T?uV6^g2BtzrNQ;uPjr&XAQliOjjRWm2{7Qjt6D!z_fz$>>GNY_$Tjymlg6~fRxu>*6m><|7#I<-E3lJ0 z9h$1CgxanRZ_Qy*EHWzcpoKOqIG}|eS^&KkrnC^jE6ocC??rm*r&hA+nIX{pG$V=x zzKAhN1PD%UW zQYX#2Yo57&M%f~wlNB*0vla5dlfs54C5x0FDMwgP!vYX2D6yb&ExF)ujd3qw<|o%h zku*4!P^8rgtTMF{EHtMQinWp%!o@Bpo(qY8P!T~j2!kkkL=h83hA7j+zZS=EpCnqX zl*|(5oS_mrl~65WO#W?)7z6F#0iE#E#>t;D-cJnP4-|Krq*G!RK2v-I&=Y|kCA^*( z5}3nQ*D&s4OV;dEJ-Lg)z$&XJciV2VhONid4J(1@hp%P%!(4ML)~-b|7V5;3u~@Mk zqnVni{H)lHi1Ev)=9l3sqhXx2i1ACmh>JvwU;0IyS+O0~+j6}@sR7D~f~o)7SZZmjW7_-Fk|b0vIoaDeg{nQt&({a5zx{$(nmX*My8W$>Q!sO@f-7+&zcITI&QgF4qY_ zoN)3YCP}WX4I9pUo06|Ful-q@0#tVwseWDBf9NwVJTSmGT8b#g#j)rBrnB!P{) zM}isLtsV(WNN9oX#GLz&)g&kPmxLp`fpn_EyToKFgz2tlwjl^=P$v%rG9Zu? zdmwo3-UntrAaOqUT18-vRe2MQ`>x;2vVW(6do!FT59pwuZB-PjN+%h*X*=bnZ4P&9 zky!2C(P1789H0yD05lu`bb6AB)o$+qH(m#3bU?a${aY-i@6@UPyHKr;&)66qf;CX6dyW(!8bN0E0!RmQ4cqw=t zcsFo(H%YAU9(`OH<8I9|yun#t;M8whHP>o5SFvi@hb)b|wP>cU9c9{XT}1+narX$2 z#d-v|c?7`8wJ=cQVIaoCz(&J5@wTxeMn`fsZ~+(I1zawea)FR{!4Yo&hmbLVE(3@S z;E20t3^YlYDNtJwoC0Wh0x)?Nq~Td0h6PtV3u2xHN-CH@1#eV7q?-vx2+R7KW7U#22wv zQvWuEkPZZeuS-J8u!L+Ogd`;Bh7ixeCMW2~bRJj5S(6iVf(AjICYbRn`N!2NkD~-` z%0P=L0~|6K=bRdobG2X3S(wLBmoixx*8H>4;&!4~W&dJnulp4XK}YtrI$5+-L`wlUWGe$u|5gk>|C zZp(B`kl}J2>(*A3Xd-v&yscvpT~u5vHy)$`0$lrpAanon9YfJlj4%+DG;Hz=IDR z_;|91AA1b3M>t}fA2$PcAqB4;X9`4}T&+DSNYlp4(AJGV+DdZCs&JhbeKn$tC@Ah!ZyBXvR+swT0&zfhNUAsK7fZCc!Wu%Cbf95@G#=t zk;c6yRtg&3p>szCc95}SW=ByS9jHT!I;PYy0v#T(_@g*&vn|P;nA+9c+}$dQHut05 zHMhGpMp61SrxGP%rD0KtlKHnSCgGh}ll{e4CZod%I)>)hz#L)bz+sM*Q%#wa>PK9K)l5|Z~a-VUf0_TtWt}y>aIRJv_E2L7z}lJ zW=h0(cG~3QWHK~C_>R{45D)FzMH6(zLxaTKi(}1<0ex|dX~i)_4Co78yLLlY&#rx| zRg3{hFyM#*7r=1`99qDE;qY;f0ewPmB=JU-H&ku_;zk%Zthj;G#su2v!fOMEHgeo( z*FG=?^xaa6H3szQT?1V-2K4#3Y9L5sK;LQVjAbk*C5bmHw$nr6y#SrNt1@0d5Vqw4 z=ovK>1alxNMdEz|&xmn9qeR2k)uA&W4Mody#)!Ma*r+^gT*1b-h9PTwu|~N@&KeQy zUdq;0XtfG!tcVKjUJ6)ci}f~Jtk@1t*O;zb?;a-$o$S#5i1i}zmi-m0)lj3x7pH%5 zD*m+i%66&7Gd9nsL%+QvBQJ|N0q>?W#Y#RrOz+Dzb+Ex0q3C+nJYVH{ElF2WGTkMizH!D`#`pUPJ;#pB<$?Upft zGR!EWRt5$h8De;3WN{ZsOS?9cSc{b`r?y?I%bj@fIAR*9``cd4pS334c9IsS$R*F6v!FZUW5NXB5}PRD>_j-iB)p&J9oo%*=MSaPQ|ml#*L`^yt!g)(cL z`nbxFaafrwUWSU(GB{<9kXhqo#JD>h$>_*Hfsr}l?qRTTr&`;gFwQs)0}RGtXj;QK zzrwHpj5ol@0Sw)uxxf0_s%hOd{Gu<^d~wGYJbVH4g*&aECy&ppQz!ZSw^`ma)7;GU zuN9gqTEn-AI)M{MdoP6WLI*EWUF)Bu|F5wg$n`bZSYADrmkXajwpd~d7q*CCj0VQ2856{qCR!Y# zg&23L$$y+xq9jK2DN!=gZ zRb@^p?ix;QS0+pm!xTGGct8p{q(GfyGHvHn)oz_1X7Ro}d$4oLB)6Fi3z28uQ1%)Zg&p z8Mc8aBr8>{oW}gENv|EN?(Mu~u4DcU#%~j|-E6*|ttND^CYmt9#FBeVh+#tK&P31< z6GpVR1RI*gI0cKqS?A{^bhNFal|@Uu=n_VpYHP#)vh>Bv7m#Xvy)R50AN|HhN@yj% zPy*bEV%?yp#1VH2;v~)_k%UnaP^OoJ5f6za_mCKa#LbNB;GzZ>B)HsCAS&l`-Boa^swm=F5gjN3k0Q*dF1}t7WD!t`C_;oDM3}jj2$2XM zB0M@9g3Ayd7A0>Bjw4w~;ajeXm053EmaMLx7BE_F zTAcW}rYFRbI~4*9{9@@U_5^Vzh%Q0AfY<{FJb+k&qhaxfK7O#{2O550lCckMd?3RI zn-4fXcv;wFnWIdWC9>$??)Z~L5r?;8l8PcGd$^(pqaJv8z<|dC9z5tk!<7CV%-Esy zc1Xd~fe=rJFz!C$3{I66MNH=KOw}GA{5tK>{>av?XEpp?cMfW}=WvvRDAv>5<+^Vv z;-vXFsPS+xgM$(dKQ{z&!xT3tInA+n!{`lA+`$`+)bN$mc<3pOQKEvUr*wi1YV?cP z1~E2>UPA|J5K{xJ1_RJg0UD5?!3WDASkTaSX+5hof2cxPEL;4?V$o@3ob!(l76@h- z<9;y~#~E%;XTU)M?+fYb(3Lh$b63W=cSUz)g&oqht(_S6Zx`h5_hCm`4>NHzA zFjPnCa*1xzs=Zt;OSxHht-+KOf<6B5Hy)g+honbG6ur=U%>fa7!vDWBAknj<$mjPiA0QFH=7N@IJQfoU3;O& zxtLgQy~VVCp}$17zLebe!QEPfyR|4!cZa!YOv7FE8E^dU#tuCEPqI3fv@d#bCfX2x zZ>ul-6>XEKa#j7HjXzN=O*k#SWa8W%$xSf`V!IZK4%|HjD{hM6rZZJ(OkPT7pHyEQ z$De&3tq3**cb}__bAF^MH(i5dc^qY=meGiOvBkUGbbhq?rSTCF9vfMNsn*7Q*Q}~3 zpeDxMEpSuq3sBL~wN-qY?&;ZN2s2F9rkJC3#&%FWTFbSnPdp?Ych1 zJ#Wh&;-1?k-$xW{kFE~!?2_Cik*-l}Rg56#0V@Q9m#wX+(zZH#aaOe})Gki~h7Me} z@%L)oCwEU4Bpvsi4(IT9ReW()b#;gc%8Jj{xCeh5e;a>8RB6IFDT*fKCZ@E_}lpN$rxyczwjSutl!3;CX%Xvx1ej#Kah3~P>CS_3w4X{ zT_c~`0{KE2j#azqA z@=g_0kd5W_;dSFO6VV&)?heIGL^_~Oc(uy-gB_xjkI%=3hIYnd`o=IZeJ^*@XL1_a zY^ZgOXqQAeEVNr2e?%|{{mak<_#<+I5D)HNX0et#+oK<$t;5Qr!^#uhR`@$(*v6l( z5#du|$b9X6j`eC!ANC@u!f}4JL(3xskev)SQkGE}eU7|l}S6`bfGwxQNcVXiX z=YPQqE4(MHJSO-+areQ|*ACIy?$$}e`?E9FpDB)3Mc7z=RBKG4PDmhFCAC4o(WHjMhrmI6#C$Zs^T((a(`MA{F(ftIpeUjBS$%Ylj zO*>&sJ71=@)3g)wCp*VYJ4oE!^h6N9Hfwrf#@$yOFg@|&rY9}9?b<2&i%(Bh+v?M}?~=XVvtIJR+; zeO+vAM5u5w$i`oi725dwBr9}t$@A7H6iYlMtUS5r8sYpe;4g=Tiuj-)2obM|55r%0 zjb5D9YqYy{2;*205m1PY;qERsHEHA5sAanr+b&V~IR6V5e?1p}n}%aRIHtq@?}+v! z?8o}io`gYgbOIagMffnCki}i4O(z^tFT&)Fxw_Hz7ZVdM?*0K7CRT_R-6x4e(QerPkT#aXSBkDqM;xw6yKz{;i1g@)I4pJ1#-FYZ z)m?pl@VBoW>e=|i-*v%4eA_?tVuj_6KeFav<8PPH_}dl!CXKF<&&J=2v#Q76uGdD_ z6}rO8Bi4(Hw6G+L-nEM}Edkx%w4{kUy+6TQMN;POJ#L~-kTYr4m?+jBP4&?H(Z(pM zg0!icIUq;_r%keX)9kFye)hxD;;9oyvw1f6)-_chSKsccRl8-oI5;^J^%|UbpHiXt zc1PB)+ESg;v}<9LqI90&sY#so{V9`z9|-2CK5*)b0xCM1HOx<*Cf!vW&Tsn-!ax-j zqA4*D2b_5Sl-Ywpu_)h(rWNZ)D9jyvbdrUF$+?Xl~ce_@-wS zXJg%Mn@ifmW(boi+4n}nB#uaRUqnROoAxY<7-E`VK5z)Uh!pNlBntiZtrzLR-txAY zG=V`UdoYH2kpvWJgJv3&CgorJgh`Xqi=^3hf}&_~xVpiaKk13K`q~=}lRqI1Uuy__ zFcshgQwLVKgQA`~)1TFui32>GUc2OHl}DvgnKsB{gQeNU5lyg}NFh{lA`_Ur2ADSB zvR|7v(7Ai*rVSu489)Q>PAA^;&M3At!G@;oxP+$dXwo2!UZR)WXuo&c=1MLZF^$g3 z+qSkPOIDiP`!;ta=M$3#XG|s$+~*3{u8W3$iM40z(nmk84uvtGYh<%L7{^|r<@t@j zjX$Ft7Q#3dS{|F_5yd*fFpjwwxuHmyzhd>&P6Q1Tk|*xk-X(b)ZMSCCwN>>ZF0SyX zB=x1+pky=x004jhV-Nr!AS5gn3`c}gv1m3^9~1xpQ>K()-KaFuBORs;Qid2q00000 z000mOIL|Jt=!&8L1t-nqACROGVSVe%C!Ec_!aHO9lQ=O{IV7C0T_3JAxhux3`=(tS zs5u4Y;|z<0iMM6C&6?W+gqr)of%B$QjXf!`^~x=)t09eYvCtI=11;&QFSM2qwE$vV zKBm(1Ra14)!+Jwr;~Yt)^ShHiB-&N?sP1l3X%vPBx>&;fBV0Eqs>9wC+(Lx&eqRmU z8I>rHmpUu~IboS7&cI*z50%n6#iWw7TGo(gN+a*WtPDVQQCRn>dJ#7V$u{ei^Z~!mfw2ck70Md zM@OOI+|~eKf*2P-_iXo=Q42KX#(~G&koAL-;LB-oY zwSx#Yt-lQ*#s8Z&F}rcTSWRmjB&szyOdxSD_Iq`i)D?*lv2Z>N4Od=^;IrFll2;g? z7nTULcU#`YG)zW&pIC}TF5G1rI}+)0{@`U-zG$L(l#wjLd~&y)oVX%}UGm||W z#k%Km=%+=lrigazu#J}kK!*<YiZA|ZjeovIhuhKK*Bt~PRD>Eh4!sJAH{lOJe${t%OOC1Dpr z5D6$0E?Tvr>zqPwg=pc%!dBT+*QUTM3PEtjwti9U_%|4a^J}}|u_?S)o9sT+Lrp7R zV|@f7m0@$~w?Q1dNTJD$vXtwCEy6hu9im-!DkA71Z^p$V7DKOGjgVf>SY1&%+_Yqg$DGEG5QY&^U6;af$@lGncW!dcpu)t}O_t;{y2Ea!C7u0Mk@^a^c%J{|^ zYwrp?EA4+F1;)y9v{S?Y*iee?_7$!+67a8^3iXa+3jVp;6H7y6>q9V;mc6oYO9S5G z?56~?dJ`GkCbvW`z*Dg9jHpn>RtvAvO??)?0Fw!s91GdTag&_7^xDs(UH+S<^=LGKI_CqgvB;JOfLpfv$x2{@Nt&XF9g z?B8VeL%`Vn}0{S~rLf)(dV|`!O`1DThQJ82C{xw`Xi$IHsHz{Q&%9PCl5f zZ%GX`v|x0=xjXFFie_s9VODgAwOSg=PedJzUMX0=m`n-`M%~;~g%(Y#VOQWzWcuDC zqW;qA_P==dCwgSpd-zGZ_YL68=~1Y64?$Yn6SsQr6rA0qM;|G8ek!x4q%!N%?dl-H zAJptXfNLa&@^{*T4HXCHJaIVhXGVkL)ER@c~i(YY-Z_n7Bg$mlSxygslDl>uuCXk4W5YG6RcGlY85RWYf61FC}&+s2h6p z+EN{tU*^3Y&7>a*jRgb=5>R2t6G?2OdPS0e;(wZ2sCBP9X>)eU`}heT*HQ+buTy{* zVia3=N@Q$fagJ|~oc-rG1)-m}F#=)b*=CZEKlIE8aZeY#elJ)~Ezfxdqt8?~LRK>b z6-0T+I9QlFejy6{HpC3?MX~>cvYj})%g9+VPw0e6Vj){L>>@MF5KxU;!KbfJPelAw zUh@GQX9+O`JayVaN2I3Jeu9{Furi^O&&mIl73KfzYG4?vnzXxSD)=U#KP5wP3>iK4 zYSD|n$qTX7y-o=je<=7XlplN6^Y%K<-z9;mTJ8dp?&Is{6R)n?n3qf$OhsREFqZ%&bQL~zSnlS_=uPhYU%40kZ&!a zBVj3@J52f}DHUu-muwkd%VF4Hev7aClqFX@7;?yENgxAvEm^%c25H{9SZbJ1>g)nqc%XRrh~T`*6roN z3PM@(+~ChV^WO8?lYzwAb>Bow!`9C~o754YYp>W=Rc%)*EJo{ap9B>%*fSWV^x^8j z7z;#8&H9`4%I#x-N-(w;jk+RMd{PIuj*awC%9@YwZ&fIF443&C!b|+lglw);U)HX` zPf9f+3c2>Y)xk{ZMvGxB9uCh*WP?N2>{sEmOZV`vtgbhfR890@*@6PTgJTUJ5c$37u8mP|Ag=t#~~95e@?d}=yPBSvB_|c@UKdC%_<;kF>9`)+>kHW z40ZZ0$drv==IL3|r)&Tg2qOy18EjaIQC>oZZ<}70+f?4`bPbV9+iq>oZ)qi~`p6(0 z=p}0urs13I#XjguD|l&k-ogOJCH7n;27$<4𝔚-u(<(>TT97UXDOn4}=f>+9qb{ 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%0DQ?{ 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 z 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

    I_ zi|8?ezMIg~ZYI%-FOXylbucs>;1b&!aE+eElB*hR)ulDl=9Q0YzztZ9DTF#WsFBP# zQpM&yOU*jg1?5aG=n3v#^Feq{maOc4SZo4jwrQ-XL>I1=bVwdCo~Ue$I5X zjA60x5O`USSQo(5+Y;{ZQ#Jg1L|^H&44e68h?mHYseDGepk8KfBnywsJd2}A&#A=NqRim+KY%9gTm@3>GiC5`gp}EMb zgb0Z$WF?-^y8nhFbBEC^(rGqTmM3oVpK0aUbEZ2a&Vzz|qGF$c$DJgg_XxLYr5d>rB@%M)XhW>z% zuC+lj=Fe6dwTs2^rqMxfDDTH8w!sSYC{`R&$th?oQ`oVa~uKTyGa2FSo}q^o}3 z$X=;h3i+;2@bGozX7uGta}$^FD+YsJ!6A~u-UIoB1`2@ZkgS0;$f9bqUFq4lp`x7U zjIb8Q3?u8Zf^##dV&+_Qh{43sM|Xh`hYf�K34zt_8CIF9z=a`O$3Yl*P7p5adAc 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

    #3*2{@il$`A_VEYgsfMM=7WO*9{6#I%O=a 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⋧{Z|< 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

  • >K}ondB))15!4&_i}9Q-{Ffq#YKmK*_DD0)8>7cX%q2M-=O z?!(ddLhYh4__V|DDn7w%$x~7&P+V|!ZjpIuUraG=!~#0ObHtyxbh-4`t*>LTURW(K zpRSrAJDtB+hyj~&uM|3mN_=GoO@^nyw@r|8r$Cm!rI2tAIpdZ3DUGu&tKG34D+l)S z6#pDKf!!o;$Uu+fO~5pZXGN*Hbx9dFjhoO?_~^x|-hcL=EnU)JVM?jfD2>Ah$E8oI zZ;uZbDKCX@H+PR2grY8m846t$mi>ijGtCjYFbYxJ0cwI{JrNj62jbMlq4{M(DBoKh z+NGNe)n?~jp6nw6xOk~kxp8g5EnzGiz9*3|x=N^prHC&~q)j^aX76t#XGxWYG@@a^ zEh0o|F?_%a;xL_bOecy+guLu*{9{&nNJgiX{!IO@7*v_x|I-&2b}Pvb&9_Mt8pcDf znwK9_;328-G~tq2AnV&qn%Yl^G`s_e6GG>+nHT^dCq;==A2?ZWCczP-fV4}=JzxVx zo=U__59_T3Gu-*OqKLD}v4`@&AUtqy`#DMCjDas|TMfsv0$L%f%+^d_fcHRnm{PKA zX*$KeIvB#yuQe!YiSU6fWRj%{7MG}N@%ij8m94 ag$N02q4}iF2G@onCNzxqHRo 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"] edition.workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["max-encoded-len"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -paste = { version = "1.0.14", default-features = false } +codec = { features = ["max-encoded-len"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +paste = { workspace = true } serde = { features = ["derive"], optional = true, workspace = true, default-features = true } -docify = "0.2.8" +docify = { workspace = true } -frame-support = { path = "../support", default-features = false, features = ["experimental"] } -frame-system = { path = "../system", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } +frame-support = { features = ["experimental"], workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +frame-benchmarking = { optional = true, workspace = true } [dev-dependencies] -sp-core = { path = "../../primitives/core", features = ["std"] } -sp-io = { path = "../../primitives/io", features = ["std"] } -pallet-example-basic = { path = "../examples/basic", features = ["std"] } -pallet-balances = { path = "../balances", features = ["std"] } +sp-core = { features = ["std"], workspace = true, default-features = true } +sp-io = { features = ["std"], workspace = true, default-features = true } +pallet-example-basic = { features = ["std"], workspace = true, default-features = true } +pallet-balances = { features = ["std"], workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/preimage/Cargo.toml b/substrate/frame/preimage/Cargo.toml index d420accbd6d..ee572b189b2 100644 --- a/substrate/frame/preimage/Cargo.toml +++ b/substrate/frame/preimage/Cargo.toml @@ -12,20 +12,20 @@ description = "FRAME pallet for storing preimages of hashes" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false, optional = true } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { optional = true, workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } log = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -sp-core = { path = "../../primitives/core", default-features = false } +pallet-balances = { workspace = true, default-features = true } +sp-core = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/proxy/Cargo.toml b/substrate/frame/proxy/Cargo.toml index fcebbb5f3e8..6b4251e1bcc 100644 --- a/substrate/frame/proxy/Cargo.toml +++ b/substrate/frame/proxy/Cargo.toml @@ -16,19 +16,19 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["max-encoded-len"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +codec = { features = ["max-encoded-len"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -pallet-utility = { path = "../utility" } -sp-core = { path = "../../primitives/core" } +pallet-balances = { workspace = true, default-features = true } +pallet-utility = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/ranked-collective/Cargo.toml b/substrate/frame/ranked-collective/Cargo.toml index 05ce76cad2b..be48d5cad40 100644 --- a/substrate/frame/ranked-collective/Cargo.toml +++ b/substrate/frame/ranked-collective/Cargo.toml @@ -16,18 +16,18 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -impl-trait-for-tuples = "0.2.2" +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-arithmetic = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +impl-trait-for-tuples = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/recovery/Cargo.toml b/substrate/frame/recovery/Cargo.toml index 2fd63597da9..3b3a382fe6d 100644 --- a/substrate/frame/recovery/Cargo.toml +++ b/substrate/frame/recovery/Cargo.toml @@ -16,18 +16,18 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -sp-core = { path = "../../primitives/core" } +pallet-balances = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/referenda/Cargo.toml b/substrate/frame/referenda/Cargo.toml index dde522ff89b..eb30fef7894 100644 --- a/substrate/frame/referenda/Cargo.toml +++ b/substrate/frame/referenda/Cargo.toml @@ -16,27 +16,27 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -assert_matches = { version = "1.5", optional = true } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +assert_matches = { optional = true, workspace = true } +codec = { features = [ "derive", -] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +], workspace = true } +scale-info = { features = ["derive"], workspace = true } serde = { features = ["derive"], optional = true, workspace = true, default-features = true } -sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +sp-arithmetic = { workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } log = { workspace = true } [dev-dependencies] -assert_matches = { version = "1.5" } -pallet-balances = { path = "../balances" } -pallet-preimage = { path = "../preimage" } -pallet-scheduler = { path = "../scheduler" } -sp-core = { path = "../../primitives/core" } +assert_matches = { workspace = true } +pallet-balances = { workspace = true, default-features = true } +pallet-preimage = { workspace = true, default-features = true } +pallet-scheduler = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/remark/Cargo.toml b/substrate/frame/remark/Cargo.toml index d251aacfb5b..44cf5ebc3b4 100644 --- a/substrate/frame/remark/Cargo.toml +++ b/substrate/frame/remark/Cargo.toml @@ -16,19 +16,19 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { workspace = true } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, workspace = true, default-features = true } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -sp-core = { path = "../../primitives/core", default-features = false } +sp-core = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/root-offences/Cargo.toml b/substrate/frame/root-offences/Cargo.toml index e7317d737fa..dde264f3949 100644 --- a/substrate/frame/root-offences/Cargo.toml +++ b/substrate/frame/root-offences/Cargo.toml @@ -16,27 +16,27 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } -pallet-session = { path = "../session", default-features = false, features = ["historical"] } -pallet-staking = { path = "../staking", default-features = false } +pallet-session = { features = ["historical"], workspace = true } +pallet-staking = { workspace = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-staking = { path = "../../primitives/staking", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-runtime = { workspace = true } +sp-staking = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -pallet-timestamp = { path = "../timestamp" } -pallet-staking-reward-curve = { path = "../staking/reward-curve" } +pallet-balances = { workspace = true, default-features = true } +pallet-timestamp = { workspace = true, default-features = true } +pallet-staking-reward-curve = { workspace = true, default-features = true } -sp-core = { path = "../../primitives/core" } -sp-io = { path = "../../primitives/io", default-features = false } -sp-std = { path = "../../primitives/std" } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true } +sp-std = { workspace = true, default-features = true } -frame-election-provider-support = { path = "../election-provider-support" } +frame-election-provider-support = { workspace = true, default-features = true } [features] runtime-benchmarks = [ diff --git a/substrate/frame/root-testing/Cargo.toml b/substrate/frame/root-testing/Cargo.toml index 74a3b8f479f..38d91c8104b 100644 --- a/substrate/frame/root-testing/Cargo.toml +++ b/substrate/frame/root-testing/Cargo.toml @@ -16,14 +16,14 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [features] try-runtime = [ diff --git a/substrate/frame/safe-mode/Cargo.toml b/substrate/frame/safe-mode/Cargo.toml index 7ecbdb6eeda..749c4bcdc70 100644 --- a/substrate/frame/safe-mode/Cargo.toml +++ b/substrate/frame/safe-mode/Cargo.toml @@ -15,26 +15,26 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -docify = "0.2.8" -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -pallet-balances = { path = "../balances", default-features = false, optional = true } -pallet-utility = { path = "../utility", default-features = false, optional = true } -pallet-proxy = { path = "../proxy", default-features = false, optional = true } +codec = { features = ["derive"], workspace = true } +docify = { workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +scale-info = { features = ["derive"], workspace = true } +sp-arithmetic = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +pallet-balances = { optional = true, workspace = true } +pallet-utility = { optional = true, workspace = true } +pallet-proxy = { optional = true, workspace = true } [dev-dependencies] -sp-core = { path = "../../primitives/core" } -sp-io = { path = "../../primitives/io" } -pallet-balances = { path = "../balances" } -pallet-utility = { path = "../utility" } -pallet-proxy = { path = "../proxy" } -frame-support = { path = "../support", features = ["experimental"] } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +pallet-utility = { workspace = true, default-features = true } +pallet-proxy = { workspace = true, default-features = true } +frame-support = { features = ["experimental"], workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/salary/Cargo.toml b/substrate/frame/salary/Cargo.toml index 25911269a95..c9b72da2e64 100644 --- a/substrate/frame/salary/Cargo.toml +++ b/substrate/frame/salary/Cargo.toml @@ -16,18 +16,18 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -pallet-ranked-collective = { path = "../ranked-collective", default-features = false, optional = true } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-arithmetic = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +pallet-ranked-collective = { optional = true, workspace = true } [features] default = ["std"] diff --git a/substrate/frame/sassafras/Cargo.toml b/substrate/frame/sassafras/Cargo.toml index 2105ba13314..ecd03c47db6 100644 --- a/substrate/frame/sassafras/Cargo.toml +++ b/substrate/frame/sassafras/Cargo.toml @@ -17,21 +17,21 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } log = { workspace = true } -sp-consensus-sassafras = { path = "../../primitives/consensus/sassafras", default-features = false, features = ["serde"] } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +sp-consensus-sassafras = { features = ["serde"], workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -array-bytes = "6.2.2" -sp-core = { path = "../../primitives/core" } -sp-crypto-hashing = { path = "../../primitives/crypto/hashing" } +array-bytes = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-crypto-hashing = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/scheduler/Cargo.toml b/substrate/frame/scheduler/Cargo.toml index e851f876112..0a6b646fc8c 100644 --- a/substrate/frame/scheduler/Cargo.toml +++ b/substrate/frame/scheduler/Cargo.toml @@ -13,22 +13,22 @@ readme = "README.md" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -sp-weights = { path = "../../primitives/weights", default-features = false } -docify = "0.2.8" +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-weights = { workspace = true } +docify = { workspace = true } [dev-dependencies] -pallet-preimage = { path = "../preimage" } -sp-core = { path = "../../primitives/core", default-features = false } -substrate-test-utils = { path = "../../test-utils" } +pallet-preimage = { workspace = true, default-features = true } +sp-core = { workspace = true } +substrate-test-utils = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/scored-pool/Cargo.toml b/substrate/frame/scored-pool/Cargo.toml index f25bd1f1769..69ecd527eb7 100644 --- a/substrate/frame/scored-pool/Cargo.toml +++ b/substrate/frame/scored-pool/Cargo.toml @@ -16,17 +16,17 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -sp-core = { path = "../../primitives/core" } +pallet-balances = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/session/Cargo.toml b/substrate/frame/session/Cargo.toml index 42ea957ac15..c7b499548bd 100644 --- a/substrate/frame/session/Cargo.toml +++ b/substrate/frame/session/Cargo.toml @@ -16,21 +16,21 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -impl-trait-for-tuples = "0.2.2" +codec = { features = ["derive"], workspace = true } +impl-trait-for-tuples = { workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -pallet-timestamp = { path = "../timestamp", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false, features = ["serde"] } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false, features = ["serde"] } -sp-session = { path = "../../primitives/session", default-features = false } -sp-staking = { path = "../../primitives/staking", default-features = false, features = ["serde"] } -sp-std = { path = "../../primitives/std", default-features = false } -sp-trie = { path = "../../primitives/trie", default-features = false, optional = true } -sp-state-machine = { path = "../../primitives/state-machine", default-features = false } +scale-info = { features = ["derive", "serde"], workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-timestamp = { workspace = true } +sp-core = { features = ["serde"], workspace = true } +sp-io = { workspace = true } +sp-runtime = { features = ["serde"], workspace = true } +sp-session = { workspace = true } +sp-staking = { features = ["serde"], workspace = true } +sp-std = { workspace = true } +sp-trie = { optional = true, workspace = true } +sp-state-machine = { workspace = true } [features] default = ["historical", "std"] diff --git a/substrate/frame/session/benchmarking/Cargo.toml b/substrate/frame/session/benchmarking/Cargo.toml index a306f9015c0..ba7f7acfd99 100644 --- a/substrate/frame/session/benchmarking/Cargo.toml +++ b/substrate/frame/session/benchmarking/Cargo.toml @@ -16,26 +16,26 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -rand = { version = "0.8.5", default-features = false, features = ["std_rng"] } -frame-benchmarking = { path = "../../benchmarking", default-features = false } -frame-support = { path = "../../support", default-features = false } -frame-system = { path = "../../system", default-features = false } -pallet-session = { path = "..", default-features = false } -pallet-staking = { path = "../../staking", default-features = false } -sp-runtime = { path = "../../../primitives/runtime", default-features = false } -sp-session = { path = "../../../primitives/session", default-features = false } -sp-std = { path = "../../../primitives/std", default-features = false } +codec = { workspace = true } +rand = { features = ["std_rng"], workspace = true } +frame-benchmarking = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-session = { workspace = true } +pallet-staking = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"] } -scale-info = "2.11.1" -frame-election-provider-support = { path = "../../election-provider-support" } -pallet-balances = { path = "../../balances" } -pallet-staking-reward-curve = { path = "../../staking/reward-curve" } -pallet-timestamp = { path = "../../timestamp" } -sp-core = { path = "../../../primitives/core" } -sp-io = { path = "../../../primitives/io" } +codec = { features = ["derive"], workspace = true, default-features = true } +scale-info = { workspace = true, default-features = true } +frame-election-provider-support = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +pallet-staking-reward-curve = { workspace = true, default-features = true } +pallet-timestamp = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/society/Cargo.toml b/substrate/frame/society/Cargo.toml index ed7fea523bf..6582d47f194 100644 --- a/substrate/frame/society/Cargo.toml +++ b/substrate/frame/society/Cargo.toml @@ -17,24 +17,24 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] log = { workspace = true } -rand_chacha = { version = "0.3.1", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +rand_chacha = { workspace = true } +scale-info = { features = ["derive"], workspace = true } +codec = { features = ["derive"], workspace = true } -sp-std = { path = "../../primitives/std", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } +sp-std = { workspace = true } +sp-io = { workspace = true } +sp-arithmetic = { workspace = true } +sp-runtime = { workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } [dev-dependencies] -frame-support-test = { path = "../support/test" } -pallet-balances = { path = "../balances" } -sp-core = { path = "../../primitives/core" } -sp-crypto-hashing = { path = "../../primitives/crypto/hashing" } -sp-io = { path = "../../primitives/io" } +frame-support-test = { workspace = true } +pallet-balances = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-crypto-hashing = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/staking/Cargo.toml b/substrate/frame/staking/Cargo.toml index 22df746d667..afae4652a4e 100644 --- a/substrate/frame/staking/Cargo.toml +++ b/substrate/frame/staking/Cargo.toml @@ -17,40 +17,40 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { features = ["alloc", "derive"], workspace = true } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", -] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false, features = ["serde"] } -sp-staking = { path = "../../primitives/staking", default-features = false, features = ["serde"] } -sp-std = { path = "../../primitives/std", default-features = false } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -pallet-session = { path = "../session", default-features = false, features = [ +], workspace = true } +scale-info = { features = ["derive", "serde"], workspace = true } +sp-io = { workspace = true } +sp-runtime = { features = ["serde"], workspace = true } +sp-staking = { features = ["serde"], workspace = true } +sp-std = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-session = { features = [ "historical", -] } -pallet-authorship = { path = "../authorship", default-features = false } -sp-application-crypto = { path = "../../primitives/application-crypto", default-features = false, features = ["serde"] } -frame-election-provider-support = { path = "../election-provider-support", default-features = false } +], workspace = true } +pallet-authorship = { workspace = true } +sp-application-crypto = { features = ["serde"], workspace = true } +frame-election-provider-support = { workspace = true } log = { workspace = true } # Optional imports for benchmarking -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -rand_chacha = { version = "0.3.1", default-features = false, optional = true } +frame-benchmarking = { optional = true, workspace = true } +rand_chacha = { optional = true, workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -sp-tracing = { path = "../../primitives/tracing" } -sp-core = { path = "../../primitives/core" } -sp-npos-elections = { path = "../../primitives/npos-elections" } -pallet-timestamp = { path = "../timestamp" } -pallet-staking-reward-curve = { path = "reward-curve" } -pallet-bags-list = { path = "../bags-list" } -substrate-test-utils = { path = "../../test-utils" } -frame-benchmarking = { path = "../benchmarking" } -frame-election-provider-support = { path = "../election-provider-support" } -rand_chacha = { version = "0.3.1" } +pallet-balances = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-npos-elections = { workspace = true, default-features = true } +pallet-timestamp = { workspace = true, default-features = true } +pallet-staking-reward-curve = { workspace = true, default-features = true } +pallet-bags-list = { workspace = true, default-features = true } +substrate-test-utils = { workspace = true } +frame-benchmarking = { workspace = true, default-features = true } +frame-election-provider-support = { workspace = true, default-features = true } +rand_chacha = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/staking/reward-curve/Cargo.toml b/substrate/frame/staking/reward-curve/Cargo.toml index e2a2782db2d..acb819c3169 100644 --- a/substrate/frame/staking/reward-curve/Cargo.toml +++ b/substrate/frame/staking/reward-curve/Cargo.toml @@ -18,10 +18,10 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -proc-macro-crate = "3.0.0" -proc-macro2 = "1.0.56" +proc-macro-crate = { workspace = true } +proc-macro2 = { workspace = true } quote = { workspace = true } syn = { features = ["full", "visit"], workspace = true } [dev-dependencies] -sp-runtime = { path = "../../../primitives/runtime" } +sp-runtime = { workspace = true, default-features = true } diff --git a/substrate/frame/staking/reward-fn/Cargo.toml b/substrate/frame/staking/reward-fn/Cargo.toml index 5169db5072e..5adbb8382da 100644 --- a/substrate/frame/staking/reward-fn/Cargo.toml +++ b/substrate/frame/staking/reward-fn/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] log = { workspace = true } -sp-arithmetic = { path = "../../../primitives/arithmetic", default-features = false } +sp-arithmetic = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/staking/runtime-api/Cargo.toml b/substrate/frame/staking/runtime-api/Cargo.toml index 19da2f24ff0..624279624bc 100644 --- a/substrate/frame/staking/runtime-api/Cargo.toml +++ b/substrate/frame/staking/runtime-api/Cargo.toml @@ -16,9 +16,9 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -sp-api = { default-features = false, path = "../../../primitives/api" } -sp-staking = { default-features = false, path = "../../../primitives/staking" } +codec = { features = ["derive"], workspace = true } +sp-api = { workspace = true } +sp-staking = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/state-trie-migration/Cargo.toml b/substrate/frame/state-trie-migration/Cargo.toml index 0870989d81f..8bb4079715e 100644 --- a/substrate/frame/state-trie-migration/Cargo.toml +++ b/substrate/frame/state-trie-migration/Cargo.toml @@ -15,27 +15,27 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } +codec = { workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, workspace = true, default-features = true } -thousands = { version = "0.2.0", optional = true } -zstd = { version = "0.12.4", default-features = false, optional = true } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -remote-externalities = { package = "frame-remote-externalities", path = "../../utils/frame/remote-externalities", optional = true } -sp-core = { path = "../../primitives/core", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -substrate-state-trie-migration-rpc = { path = "../../utils/frame/rpc/state-trie-migration-rpc", optional = true } +thousands = { optional = true, workspace = true } +zstd = { optional = true, workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +remote-externalities = { optional = true, workspace = true, default-features = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +substrate-state-trie-migration-rpc = { optional = true, workspace = true, default-features = true } [dev-dependencies] -parking_lot = "0.12.1" -tokio = { version = "1.22.0", features = ["macros"] } -pallet-balances = { path = "../balances" } -sp-tracing = { path = "../../primitives/tracing" } +parking_lot = { workspace = true, default-features = true } +tokio = { features = ["macros"], workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/statement/Cargo.toml b/substrate/frame/statement/Cargo.toml index 989f0c330fc..233b7255fc5 100644 --- a/substrate/frame/statement/Cargo.toml +++ b/substrate/frame/statement/Cargo.toml @@ -15,20 +15,20 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-statement-store = { path = "../../primitives/statement-store", default-features = false } -sp-api = { path = "../../primitives/api", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-statement-store = { workspace = true } +sp-api = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-io = { workspace = true } +sp-core = { workspace = true } log = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } +pallet-balances = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/sudo/Cargo.toml b/substrate/frame/sudo/Cargo.toml index fcbb00087e2..5d5d09d6923 100644 --- a/substrate/frame/sudo/Cargo.toml +++ b/substrate/frame/sudo/Cargo.toml @@ -16,19 +16,19 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +codec = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } -docify = "0.2.8" +docify = { workspace = true } [dev-dependencies] -sp-core = { path = "../../primitives/core" } +sp-core = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/support/Cargo.toml b/substrate/frame/support/Cargo.toml index a6c4fd6ee30..560697ab710 100644 --- a/substrate/frame/support/Cargo.toml +++ b/substrate/frame/support/Cargo.toml @@ -16,59 +16,59 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = { version = "6.2.2", default-features = false } +array-bytes = { workspace = true } serde = { features = ["alloc", "derive"], workspace = true } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", "max-encoded-len", -] } -scale-info = { version = "2.11.1", default-features = false, features = [ +], workspace = true } +scale-info = { features = [ "derive", -] } -frame-metadata = { version = "16.0.0", default-features = false, features = [ +], workspace = true } +frame-metadata = { features = [ "current", -] } -sp-api = { path = "../../primitives/api", default-features = false, features = [ +], workspace = true } +sp-api = { features = [ "frame-metadata", -] } -sp-std = { path = "../../primitives/std", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false, features = [ +], workspace = true } +sp-std = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { features = [ "serde", -] } -sp-tracing = { path = "../../primitives/tracing", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } -sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } -sp-inherents = { path = "../../primitives/inherents", default-features = false } -sp-staking = { path = "../../primitives/staking", default-features = false } -sp-weights = { path = "../../primitives/weights", default-features = false } -sp-debug-derive = { path = "../../primitives/debug-derive", default-features = false } -sp-metadata-ir = { path = "../../primitives/metadata-ir", default-features = false } -tt-call = "1.0.8" -macro_magic = "0.5.0" -frame-support-procedural = { path = "procedural", default-features = false } -paste = "1.0" -sp-state-machine = { path = "../../primitives/state-machine", default-features = false, optional = true } -bitflags = "1.3" -impl-trait-for-tuples = "0.2.2" -smallvec = "1.11.0" +], workspace = true } +sp-tracing = { workspace = true } +sp-core = { workspace = true } +sp-arithmetic = { workspace = true } +sp-inherents = { workspace = true } +sp-staking = { workspace = true } +sp-weights = { workspace = true } +sp-debug-derive = { workspace = true } +sp-metadata-ir = { workspace = true } +tt-call = { workspace = true } +macro_magic = { workspace = true } +frame-support-procedural = { workspace = true } +paste = { workspace = true, default-features = true } +sp-state-machine = { optional = true, workspace = true } +bitflags = { workspace = true } +impl-trait-for-tuples = { workspace = true } +smallvec = { workspace = true, default-features = true } log = { workspace = true } -sp-crypto-hashing-proc-macro = { path = "../../primitives/crypto/hashing/proc-macro" } -k256 = { version = "0.13.1", default-features = false, features = ["ecdsa"] } -environmental = { version = "1.1.4", default-features = false } -sp-genesis-builder = { path = "../../primitives/genesis-builder", default-features = false } +sp-crypto-hashing-proc-macro = { workspace = true, default-features = true } +k256 = { features = ["ecdsa"], workspace = true } +environmental = { workspace = true } +sp-genesis-builder = { workspace = true } serde_json = { features = ["alloc"], workspace = true } -docify = "0.2.8" -static_assertions = "1.1.0" +docify = { workspace = true } +static_assertions = { workspace = true, default-features = true } -aquamarine = { version = "0.5.0" } +aquamarine = { workspace = true } [dev-dependencies] -assert_matches = "1.3.0" -pretty_assertions = "1.2.1" -sp-timestamp = { path = "../../primitives/timestamp", default-features = false } -frame-system = { path = "../system" } -sp-crypto-hashing = { path = "../../primitives/crypto/hashing" } +assert_matches = { workspace = true } +pretty_assertions = { workspace = true } +sp-timestamp = { workspace = true } +frame-system = { workspace = true, default-features = true } +sp-crypto-hashing = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/support/procedural/Cargo.toml b/substrate/frame/support/procedural/Cargo.toml index b04af63de81..ad91cfae4ea 100644 --- a/substrate/frame/support/procedural/Cargo.toml +++ b/substrate/frame/support/procedural/Cargo.toml @@ -18,21 +18,21 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -derive-syn-parse = "0.2.0" -Inflector = "0.11.4" -cfg-expr = "0.15.5" -itertools = "0.11" -proc-macro2 = "1.0.56" +derive-syn-parse = { workspace = true } +Inflector = { workspace = true } +cfg-expr = { workspace = true } +itertools = { workspace = true } +proc-macro2 = { workspace = true } quote = { workspace = true } syn = { features = ["full", "visit-mut"], workspace = true } -frame-support-procedural-tools = { path = "tools" } -macro_magic = { version = "0.5.0", features = ["proc_support"] } -proc-macro-warning = { version = "1.0.0", default-features = false } -expander = "2.0.0" -sp-crypto-hashing = { path = "../../../primitives/crypto/hashing", default-features = false } +frame-support-procedural-tools = { workspace = true, default-features = true } +macro_magic = { features = ["proc_support"], workspace = true } +proc-macro-warning = { workspace = true } +expander = { workspace = true } +sp-crypto-hashing = { workspace = true } [dev-dependencies] -regex = "1" +regex = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/support/procedural/tools/Cargo.toml b/substrate/frame/support/procedural/tools/Cargo.toml index a75307aca79..f672740e57e 100644 --- a/substrate/frame/support/procedural/tools/Cargo.toml +++ b/substrate/frame/support/procedural/tools/Cargo.toml @@ -15,8 +15,8 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -proc-macro-crate = "3.0.0" -proc-macro2 = "1.0.56" +proc-macro-crate = { workspace = true } +proc-macro2 = { workspace = true } quote = { workspace = true } syn = { features = ["extra-traits", "full", "visit"], workspace = true } -frame-support-procedural-tools-derive = { path = "derive" } +frame-support-procedural-tools-derive = { workspace = true, default-features = true } diff --git a/substrate/frame/support/procedural/tools/derive/Cargo.toml b/substrate/frame/support/procedural/tools/derive/Cargo.toml index b39d99a822f..2292c2a7c72 100644 --- a/substrate/frame/support/procedural/tools/derive/Cargo.toml +++ b/substrate/frame/support/procedural/tools/derive/Cargo.toml @@ -18,6 +18,6 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -proc-macro2 = "1.0.56" +proc-macro2 = { workspace = true } quote = { features = ["proc-macro"], workspace = true } syn = { features = ["extra-traits", "full", "parsing", "proc-macro"], workspace = true } diff --git a/substrate/frame/support/test/Cargo.toml b/substrate/frame/support/test/Cargo.toml index 6e861ad769c..697e14ae1d3 100644 --- a/substrate/frame/support/test/Cargo.toml +++ b/substrate/frame/support/test/Cargo.toml @@ -15,29 +15,29 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -static_assertions = "1.1.0" +static_assertions = { workspace = true, default-features = true } serde = { features = ["derive"], workspace = true } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-metadata = { version = "16.0.0", default-features = false, features = ["current"] } -sp-api = { path = "../../../primitives/api", default-features = false } -sp-arithmetic = { path = "../../../primitives/arithmetic", default-features = false } -sp-io = { path = "../../../primitives/io", default-features = false } -sp-state-machine = { path = "../../../primitives/state-machine", optional = true } -frame-support = { path = "..", default-features = false, features = ["experimental"] } -frame-benchmarking = { path = "../../benchmarking", default-features = false } -sp-runtime = { path = "../../../primitives/runtime", default-features = false } -sp-core = { path = "../../../primitives/core", default-features = false } -sp-std = { path = "../../../primitives/std", default-features = false } -sp-version = { path = "../../../primitives/version", default-features = false } -sp-metadata-ir = { path = "../../../primitives/metadata-ir", default-features = false } -trybuild = { version = "1.0.88", features = ["diff"] } -pretty_assertions = "1.3.0" -rustversion = "1.0.6" -frame-system = { path = "../../system", default-features = false } -frame-executive = { path = "../../executive", default-features = false } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-metadata = { features = ["current"], workspace = true } +sp-api = { workspace = true } +sp-arithmetic = { workspace = true } +sp-io = { workspace = true } +sp-state-machine = { optional = true, workspace = true, default-features = true } +frame-support = { features = ["experimental"], workspace = true } +frame-benchmarking = { workspace = true } +sp-runtime = { workspace = true } +sp-core = { workspace = true } +sp-std = { workspace = true } +sp-version = { workspace = true } +sp-metadata-ir = { workspace = true } +trybuild = { features = ["diff"], workspace = true } +pretty_assertions = { workspace = true } +rustversion = { workspace = true } +frame-system = { workspace = true } +frame-executive = { workspace = true } # The "std" feature for this pallet is never activated on purpose, in order to test construct_runtime error message -test-pallet = { package = "frame-support-test-pallet", path = "pallet", default-features = false } +test-pallet = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/support/test/compile_pass/Cargo.toml b/substrate/frame/support/test/compile_pass/Cargo.toml index d6e0c66261a..60896ca2a10 100644 --- a/substrate/frame/support/test/compile_pass/Cargo.toml +++ b/substrate/frame/support/test/compile_pass/Cargo.toml @@ -15,13 +15,13 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-support = { path = "../..", default-features = false } -frame-system = { path = "../../../system", default-features = false } -sp-core = { path = "../../../../primitives/core", default-features = false } -sp-runtime = { path = "../../../../primitives/runtime", default-features = false } -sp-version = { path = "../../../../primitives/version", default-features = false } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-version = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/support/test/pallet/Cargo.toml b/substrate/frame/support/test/pallet/Cargo.toml index 8607339a2b0..cee0eac6f1b 100644 --- a/substrate/frame/support/test/pallet/Cargo.toml +++ b/substrate/frame/support/test/pallet/Cargo.toml @@ -15,12 +15,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } serde = { features = ["derive"], workspace = true } -frame-support = { path = "../..", default-features = false } -frame-system = { path = "../../../system", default-features = false } -sp-runtime = { path = "../../../../primitives/runtime", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-runtime = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/support/test/stg_frame_crate/Cargo.toml b/substrate/frame/support/test/stg_frame_crate/Cargo.toml index 5b97db60c00..8447cc12ef2 100644 --- a/substrate/frame/support/test/stg_frame_crate/Cargo.toml +++ b/substrate/frame/support/test/stg_frame_crate/Cargo.toml @@ -15,9 +15,9 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -frame = { package = "polkadot-sdk-frame", path = "../../..", default-features = false, features = ["experimental", "runtime"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +frame = { features = ["experimental", "runtime"], workspace = true } +scale-info = { features = ["derive"], workspace = true } [features] default = ["std"] diff --git a/substrate/frame/system/Cargo.toml b/substrate/frame/system/Cargo.toml index a2a8970814b..3d056c894b9 100644 --- a/substrate/frame/system/Cargo.toml +++ b/substrate/frame/system/Cargo.toml @@ -16,24 +16,24 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -cfg-if = "1.0" -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +cfg-if = { workspace = true } +codec = { features = ["derive"], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } +scale-info = { features = ["derive", "serde"], workspace = true } serde = { features = ["alloc", "derive"], workspace = true } -frame-support = { path = "../support", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false, features = ["serde"] } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false, features = ["serde"] } -sp-std = { path = "../../primitives/std", default-features = false } -sp-version = { path = "../../primitives/version", default-features = false, features = ["serde"] } -sp-weights = { path = "../../primitives/weights", default-features = false, features = ["serde"] } -docify = "0.2.8" +frame-support = { workspace = true } +sp-core = { features = ["serde"], workspace = true } +sp-io = { workspace = true } +sp-runtime = { features = ["serde"], workspace = true } +sp-std = { workspace = true } +sp-version = { features = ["serde"], workspace = true } +sp-weights = { features = ["serde"], workspace = true } +docify = { workspace = true } [dev-dependencies] -criterion = "0.5.1" -sp-externalities = { path = "../../primitives/externalities" } -substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } +criterion = { workspace = true, default-features = true } +sp-externalities = { workspace = true, default-features = true } +substrate-test-runtime-client = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/system/benchmarking/Cargo.toml b/substrate/frame/system/benchmarking/Cargo.toml index 022f0ffce6b..47a6721b93f 100644 --- a/substrate/frame/system/benchmarking/Cargo.toml +++ b/substrate/frame/system/benchmarking/Cargo.toml @@ -16,19 +16,19 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../../benchmarking", default-features = false } -frame-support = { path = "../../support", default-features = false } -frame-system = { path = "..", default-features = false } -sp-core = { path = "../../../primitives/core", default-features = false } -sp-runtime = { path = "../../../primitives/runtime", default-features = false } -sp-std = { path = "../../../primitives/std", default-features = false } +codec = { workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -sp-io = { path = "../../../primitives/io" } -sp-externalities = { path = "../../../primitives/externalities" } -sp-version = { path = "../../../primitives/version" } +sp-io = { workspace = true, default-features = true } +sp-externalities = { workspace = true, default-features = true } +sp-version = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/system/rpc/runtime-api/Cargo.toml b/substrate/frame/system/rpc/runtime-api/Cargo.toml index 8b71ca2a139..901a035b647 100644 --- a/substrate/frame/system/rpc/runtime-api/Cargo.toml +++ b/substrate/frame/system/rpc/runtime-api/Cargo.toml @@ -16,9 +16,9 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -sp-api = { path = "../../../../primitives/api", default-features = false } -docify = "0.2.0" +codec = { workspace = true } +sp-api = { workspace = true } +docify = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/timestamp/Cargo.toml b/substrate/frame/timestamp/Cargo.toml index 93ce09611b5..2da6e2d5a95 100644 --- a/substrate/frame/timestamp/Cargo.toml +++ b/substrate/frame/timestamp/Cargo.toml @@ -17,24 +17,24 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive", "max-encoded-len"] } +codec = { features = ["derive", "max-encoded-len"], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-inherents = { path = "../../primitives/inherents", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false, optional = true } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -sp-storage = { path = "../../primitives/storage", default-features = false } -sp-timestamp = { path = "../../primitives/timestamp", default-features = false } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-inherents = { workspace = true } +sp-io = { optional = true, workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-timestamp = { workspace = true } -docify = "0.2.8" +docify = { workspace = true } [dev-dependencies] -sp-core = { path = "../../primitives/core" } -sp-io = { path = "../../primitives/io" } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/tips/Cargo.toml b/substrate/frame/tips/Cargo.toml index bcd54461406..abebaa19aed 100644 --- a/substrate/frame/tips/Cargo.toml +++ b/substrate/frame/tips/Cargo.toml @@ -16,22 +16,22 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +scale-info = { features = ["derive"], workspace = true } serde = { features = ["derive"], optional = true, workspace = true, default-features = true } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -pallet-treasury = { path = "../treasury", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-treasury = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -sp-storage = { path = "../../primitives/storage" } +pallet-balances = { workspace = true, default-features = true } +sp-storage = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/transaction-payment/Cargo.toml b/substrate/frame/transaction-payment/Cargo.toml index 4f7da9ae46f..3e890a8f7b6 100644 --- a/substrate/frame/transaction-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/Cargo.toml @@ -16,21 +16,21 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", -] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +], workspace = true } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, workspace = true, default-features = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] serde_json = { workspace = true, default-features = true } -pallet-balances = { path = "../balances" } +pallet-balances = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml b/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml index 177621d9adb..02ce212deb6 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml @@ -17,21 +17,21 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # Substrate dependencies -sp-runtime = { path = "../../../primitives/runtime", default-features = false } -sp-std = { path = "../../../primitives/std", default-features = false } -frame-support = { path = "../../support", default-features = false } -frame-system = { path = "../../system", default-features = false } -pallet-asset-conversion = { path = "../../asset-conversion", default-features = false } -pallet-transaction-payment = { path = "..", default-features = false } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-asset-conversion = { workspace = true } +pallet-transaction-payment = { workspace = true } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } [dev-dependencies] -sp-core = { path = "../../../primitives/core", default-features = false } -sp-io = { path = "../../../primitives/io", default-features = false } -sp-storage = { path = "../../../primitives/storage", default-features = false } -pallet-assets = { path = "../../assets" } -pallet-balances = { path = "../../balances" } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-storage = { workspace = true } +pallet-assets = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml index a4a8efad869..1b92ecf53c0 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml @@ -17,29 +17,29 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # Substrate dependencies -sp-core = { path = "../../../primitives/core", default-features = false } -sp-io = { path = "../../../primitives/io", default-features = false } -sp-runtime = { path = "../../../primitives/runtime", default-features = false } -sp-std = { path = "../../../primitives/std", default-features = false } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } -frame-support = { path = "../../support", default-features = false } -frame-system = { path = "../../system", default-features = false } -pallet-transaction-payment = { path = "..", default-features = false } -frame-benchmarking = { path = "../../benchmarking", default-features = false, optional = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-transaction-payment = { workspace = true } +frame-benchmarking = { optional = true, workspace = true } # Other dependencies -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, workspace = true, default-features = true } [dev-dependencies] serde_json = { workspace = true, default-features = true } -sp-storage = { path = "../../../primitives/storage", default-features = false } +sp-storage = { workspace = true } -pallet-assets = { path = "../../assets" } -pallet-authorship = { path = "../../authorship" } -pallet-balances = { path = "../../balances" } +pallet-assets = { workspace = true, default-features = true } +pallet-authorship = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/transaction-payment/rpc/Cargo.toml b/substrate/frame/transaction-payment/rpc/Cargo.toml index 2c9f814460f..d2fb92a6bf3 100644 --- a/substrate/frame/transaction-payment/rpc/Cargo.toml +++ b/substrate/frame/transaction-payment/rpc/Cargo.toml @@ -16,12 +16,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12" } -jsonrpsee = { version = "0.22.5", features = ["client-core", "macros", "server-core"] } -pallet-transaction-payment-rpc-runtime-api = { path = "runtime-api" } -sp-api = { path = "../../../primitives/api" } -sp-blockchain = { path = "../../../primitives/blockchain" } -sp-core = { path = "../../../primitives/core" } -sp-rpc = { path = "../../../primitives/rpc" } -sp-runtime = { path = "../../../primitives/runtime" } -sp-weights = { path = "../../../primitives/weights" } +codec = { workspace = true, default-features = true } +jsonrpsee = { features = ["client-core", "macros", "server-core"], workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-rpc = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-weights = { workspace = true, default-features = true } diff --git a/substrate/frame/transaction-payment/rpc/runtime-api/Cargo.toml b/substrate/frame/transaction-payment/rpc/runtime-api/Cargo.toml index 6c0241ec5c0..1a384c74b31 100644 --- a/substrate/frame/transaction-payment/rpc/runtime-api/Cargo.toml +++ b/substrate/frame/transaction-payment/rpc/runtime-api/Cargo.toml @@ -16,11 +16,11 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -pallet-transaction-payment = { path = "../..", default-features = false } -sp-api = { path = "../../../../primitives/api", default-features = false } -sp-runtime = { path = "../../../../primitives/runtime", default-features = false } -sp-weights = { path = "../../../../primitives/weights", default-features = false } +codec = { features = ["derive"], workspace = true } +pallet-transaction-payment = { workspace = true } +sp-api = { workspace = true } +sp-runtime = { workspace = true } +sp-weights = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml b/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml index 4d32a5123cf..7265979cedc 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml @@ -15,15 +15,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # Substrate dependencies -sp-runtime = { path = "../../../primitives/runtime", default-features = false } -sp-std = { path = "../../../primitives/std", default-features = false } +sp-runtime = { workspace = true } +sp-std = { workspace = true } -frame-support = { path = "../../support", default-features = false } -frame-system = { path = "../../system", default-features = false } +frame-support = { workspace = true } +frame-system = { workspace = true } # Other dependencies -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive"], workspace = true } [features] default = ["std"] diff --git a/substrate/frame/transaction-storage/Cargo.toml b/substrate/frame/transaction-storage/Cargo.toml index bf647ca13ec..3bb97e0cd01 100644 --- a/substrate/frame/transaction-storage/Cargo.toml +++ b/substrate/frame/transaction-storage/Cargo.toml @@ -16,24 +16,24 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -array-bytes = { version = "6.2.2", optional = true } -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +array-bytes = { optional = true, workspace = true, default-features = true } +codec = { workspace = true } +scale-info = { features = ["derive"], workspace = true } serde = { optional = true, workspace = true, default-features = true } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -pallet-balances = { path = "../balances", default-features = false } -sp-inherents = { path = "../../primitives/inherents", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -sp-transaction-storage-proof = { path = "../../primitives/transaction-storage-proof", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-balances = { workspace = true } +sp-inherents = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-transaction-storage-proof = { workspace = true } log = { workspace = true } [dev-dependencies] -sp-core = { path = "../../primitives/core", default-features = false } -sp-transaction-storage-proof = { path = "../../primitives/transaction-storage-proof", default-features = true } +sp-core = { workspace = true } +sp-transaction-storage-proof = { default-features = true, workspace = true } [features] default = ["std"] diff --git a/substrate/frame/treasury/Cargo.toml b/substrate/frame/treasury/Cargo.toml index c93272af11d..33e74b0a4aa 100644 --- a/substrate/frame/treasury/Cargo.toml +++ b/substrate/frame/treasury/Cargo.toml @@ -16,26 +16,26 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", "max-encoded-len", -] } -docify = "0.2.8" -impl-trait-for-tuples = "0.2.2" -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +], workspace = true } +docify = { workspace = true } +impl-trait-for-tuples = { workspace = true } +scale-info = { features = ["derive"], workspace = true } serde = { features = ["derive"], optional = true, workspace = true, default-features = true } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -pallet-balances = { path = "../balances", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false, optional = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-balances = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-core = { optional = true, workspace = true } [dev-dependencies] -sp-io = { path = "../../primitives/io" } -pallet-utility = { path = "../utility" } -sp-core = { path = "../../primitives/core", default-features = false } +sp-io = { workspace = true, default-features = true } +pallet-utility = { workspace = true, default-features = true } +sp-core = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/try-runtime/Cargo.toml b/substrate/frame/try-runtime/Cargo.toml index e4e5f1940b2..16e815975b5 100644 --- a/substrate/frame/try-runtime/Cargo.toml +++ b/substrate/frame/try-runtime/Cargo.toml @@ -15,11 +15,11 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -frame-support = { path = "../support", default-features = false } -sp-api = { path = "../../primitives/api", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +codec = { features = ["derive"], workspace = true } +frame-support = { workspace = true } +sp-api = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/tx-pause/Cargo.toml b/substrate/frame/tx-pause/Cargo.toml index e44bb90dd7f..fbb71513c6a 100644 --- a/substrate/frame/tx-pause/Cargo.toml +++ b/substrate/frame/tx-pause/Cargo.toml @@ -15,24 +15,24 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive"] } -docify = "0.2.8" -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } -pallet-balances = { path = "../balances", default-features = false, optional = true } -pallet-utility = { path = "../utility", default-features = false, optional = true } -pallet-proxy = { path = "../proxy", default-features = false, optional = true } +codec = { features = ["derive"], workspace = true } +docify = { workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +scale-info = { features = ["derive"], workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +pallet-balances = { optional = true, workspace = true } +pallet-utility = { optional = true, workspace = true } +pallet-proxy = { optional = true, workspace = true } [dev-dependencies] -sp-core = { path = "../../primitives/core" } -sp-io = { path = "../../primitives/io" } -pallet-balances = { path = "../balances" } -pallet-utility = { path = "../utility" } -pallet-proxy = { path = "../proxy" } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +pallet-utility = { workspace = true, default-features = true } +pallet-proxy = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/uniques/Cargo.toml b/substrate/frame/uniques/Cargo.toml index 65b727b40b2..d41d322bb63 100644 --- a/substrate/frame/uniques/Cargo.toml +++ b/substrate/frame/uniques/Cargo.toml @@ -16,20 +16,20 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } +codec = { workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -sp-core = { path = "../../primitives/core" } -sp-io = { path = "../../primitives/io" } -sp-std = { path = "../../primitives/std" } +pallet-balances = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +sp-std = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/utility/Cargo.toml b/substrate/frame/utility/Cargo.toml index 00e8be75a3d..0ccdac6be62 100644 --- a/substrate/frame/utility/Cargo.toml +++ b/substrate/frame/utility/Cargo.toml @@ -16,22 +16,22 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +codec = { workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -pallet-root-testing = { path = "../root-testing" } -pallet-collective = { path = "../collective" } -pallet-timestamp = { path = "../timestamp" } -sp-core = { path = "../../primitives/core" } +pallet-balances = { workspace = true, default-features = true } +pallet-root-testing = { workspace = true, default-features = true } +pallet-collective = { workspace = true, default-features = true } +pallet-timestamp = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/frame/vesting/Cargo.toml b/substrate/frame/vesting/Cargo.toml index 7372b842403..3aca5683465 100644 --- a/substrate/frame/vesting/Cargo.toml +++ b/substrate/frame/vesting/Cargo.toml @@ -16,21 +16,21 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", -] } +], workspace = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -sp-core = { path = "../../primitives/core" } -sp-io = { path = "../../primitives/io", default-features = false } +pallet-balances = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/whitelist/Cargo.toml b/substrate/frame/whitelist/Cargo.toml index 61bbb278019..922f9124d91 100644 --- a/substrate/frame/whitelist/Cargo.toml +++ b/substrate/frame/whitelist/Cargo.toml @@ -15,20 +15,20 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = ["derive", "max-encoded-len"] } -scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -frame-support = { path = "../support", default-features = false } -frame-system = { path = "../system", default-features = false } -sp-api = { path = "../../primitives/api", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } +codec = { features = ["derive", "max-encoded-len"], workspace = true } +scale-info = { features = ["derive"], workspace = true } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +sp-api = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } [dev-dependencies] -pallet-balances = { path = "../balances" } -pallet-preimage = { path = "../preimage" } -sp-core = { path = "../../primitives/core" } -sp-io = { path = "../../primitives/io" } +pallet-balances = { workspace = true, default-features = true } +pallet-preimage = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/substrate/kitchensink_runtime.wasm b/substrate/kitchensink_runtime.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7ebb14371243afa4956a107374b27a4e686f0360 GIT binary patch literal 2462034 zcmX_mby!8~L6AM$sbZ-?K22Xmtp|JTBrz-va2UogSGi zJw#I@dGTPTj$jdpoU^ps${IjURjMTFB|4ymBJ&$9k+Phz z6b5Is8AUgv+^5!6R%75V>Lp|PPRp;~uZOS4YQ_pMa$I>SdKN6#rDC;%ABF1eKF~hx04+r{U=0 ziJHT8e17AWqp6)jiu&|G#TJ zujcao&J6v=RMbz7|LHnb@Iz`W?yk~hk_?5OnpG0HW3C0)()w6j4Um zyD8BQ5CAh$=|ogJ?MM-{Oawri6p(;gBW69k`B4`O8)Z}u-OP?q0o~MYiZzNuz%vzv zoJuPhN=j8T0*}Xy8wRVR3)&H~Mv)0PG62a1lo)`d0+b9uVu4M8m`}LU!*H%Bf?_*x z6k%~%a*sQ99!F4d1AkE>hgWfXmd!vKXR#W;LIQ_Vu_!-U0*9uWlOP(Z?wlIGO~O}> zcWNUxDn!~EnX&_14~L##3s}MgMVXiNGf^BV$*P_ zD_P5q66-7|Wkr&*6pkk|#->3EBN-Gvr|}gAG8Ex(coljw*yC`RC_SXuM5i$p5;E9h zau6jkMyFvY$uPxWa5xm6fQwLdypv#2r2IN2N!u_|bR{e%d$t%5hh6$UYG_(i)OcwKV(e!%5EmV%$Pu`T^yI9kj8`v zRp4h-A=FNbBUVTg(q2(QA^9E8{vO^CzfGnP&CVdr0UV{&ZkOf z)>C=%;x3s#viaueUG^uibG=2`#scLf1=;kaQsoU_$d9Lz<<(pi#;|d|<=7gbV6zwP z=}slc+4RzZvb|w@FKXQvPpL8IxgA4-Bl^%ApThl>le81|frO~n_~1A=A)!BDG-%3QU=b)hQEhjf%o5 z1|fpQgEBu_U!jsv!ln5ExVYd?C~H)aXy~3$lqsr6Dia{s7GR5O^%KzF0*=M8i+dE1 z2hQTi*~D5=QVT`{Q*lIila-`UDB9L@zS!*S9Rx&s*WG=FRB9;=8)~AK5 zB#b*RZHG!(x#`ByFO~<|K8aYH`-|$FayO)eNS9KW3r~ z;IPt4*lactqYD6z|B^Kdi(Tff z^lzvQ(BVN9ZQ?7dlPT1A zZ1tH;Vzd;}BzPnUH-#iAGqMoG&H^dY-tPS@)`gZz?jKjnl*r`&xqH*h&MImwE9R05 zk?kmr4R*1E>|x<)I_1#21NnN+(L1^Zp+9>jPY$6np?l{_4+M>!^X)#H{8n~W1Hu3lx zuK{H{bMmto>TRrq*)4Nd2Ug$Yu-RDIlXiSDFsVtqy%Kt`GzI}^Zd%=gv!7vaHAvy` zu@U?=PqfUX0Uasn-UXes^6ryViv_M}bq8Z6+syJ+-iLgn7 zBGoaOEM1KWsrs7al387i2(kLe<%tAcwMn72I0bRkG&HQB|p3%qEjFqzQy*v?zD=wIEC{`|6_+ySt zAZ)>Y-hqFqqz-pz6P$GLx zm;kYED^Q|rVu&-cPKCvhH;E`j)~IXm;;w=c8mzexm=uaL?6NUDs3dXL%#)xutH8MN z+AS2{5VsONFHHEW?(Dn?rF(J7<@}Lx|A|Vwi_FH(r+!wB3&jM0d z3YNt7&B69YI~jpIid`&=xcZ6ENM9j(682xx1`0>si(x=jViJ?%8wNwnZge_{3jk~g z82Gna4ug(x3FSi>ZZR2R8?sKQA5BD}EiF&PPb#a2ugN9f0q|qvL}OHx=eO=>Jwnm8 z%QK3*VsJ)LRF%gf@?$+hXBS2oMfOV1QIJp|7Nm=aeuIedwBJE;30csSg|yAz_K^HW zo6RicKrBIu2F8SXbAR`LG5wG`6eP> z1G$PxdaZ#ZigHS%O3dKXk2cbe@KM|^yl>V{N^LN5*&)(zSg|1zn6>bG(hn@47-l|Ym{Hl0PNZ%-O9nK=^-2C0$Yh+u-8={RBeagaQYPspOB{m29=tyP_DAK0|wb!Sw}=4GcIv9 zt6-khrP15xnr}EPJed}G%qTK6`2+a8afG#fiLX2|Yc4!PJ-2LeN_mw;jA{f^9f^U; zA70sJil4Ofj`s-l`R-w4(c5RzUdW->Q}=`9KBs z|2R&Bu!*NCV2l2NSxdBn<%i`(BrA&v0{cWxd8zCa4l1Lwz1FbCw3dOQk2x`C}@MY#tybHi@Q$HYdf?WCs+ZOQd0!GmaUCg|^inHA|skpVOIRp5>_}-!k&s%365#!A_`f6yG zu!GGJsxYOYrcfo-5Hh2o^MfV|ED%Ou%#UFHBs=ghCdxRWaQ|n)U+PoTn1!CQtOqy; zaj(2O6WB?tR!|+$z+~V^;Ee*n9zHA`gGr4FBoF5XN78^Zw@2`sNf0&C!~>+lc|Q=$ z(z}?&jM-M*BN&?0k@BpgXsmdFy^5s5Z>9nTY44!lD>9 z+ME+Yvi?+(G)HK3G#mJ%5?FH3rC%3TSB6nB}C&j20Z?vazYPev3v?)00=qi`g@m)TXyb#z-hLjU3B+12V4^c8_CaNpsL= zq_d&QAJKUU?FRsJ(sezkyy}jS(~DG$DDuorN^Mvf9uekWN|JfhG}b&=ppASQx_m9v z2``mIT@O-5#mP8|)66He5C`~#M!zNx`QnIe`+=&NDD$(GKrf6JOc)zSIRjN9QiBl6 zY-3?*D+*0u^~P$`uyR89txZdX^w9OFoPkI9{xRZF`URiM9Lw<@mG4VULfi^nx< zIR#(zmVru0a?}6_v^`i`mynOZ%cQ;s6RzSz-S)(|sm|~{v6i3-!T-#2oACP)$#rOVE z#0+V;1&T_`r-IWy z78K&L*imL#N5@W6k!)tcKVdDk@O#<%xb%|t()NDruGq4Rv+OhL>$iOm7@=i00Yk6* zP^ISnctPn&|0E9*;AWa;da3cI!7rGxSvdYiZeak!)kO$cGUXu{y_;vLiC$ z5Dc8LrSyojxL^`}xinJkhHgMK``fqt4A`XF{hqjiG@XjSbppbN<}YyO2y*a-bY(7Z z1L-vTcs9u{MDd5JJVh)9NMCEjgrLNHs`q01JI1!@@)px@=Ut9grYB1~mgbIR3n3lK zf01(CSr-^BMEKGFHYEay+y^J^rT~v}UT81q@$ z362Z5!I#d5_uA>?S|K1K2D{>)DNTeti z<(e}cxw-WkjFNk0V-l2((G7I;N~2X&w0y)>6M$R>dLQBajyz@D9Nav54TZ&V@LtC< zyz)|Uh%}mlmX&Lg08>F;VM+i=jj>o!HuvK=l*H%}y)=m}xpjLWrDiG;W zB}p0v4kRPd~cj<|A>l+JY$|y`5qDsp)8pB|S^3eozeSL$RyaVns z9`65fkkdp*R}7xx`1(`&Z|rn#E)Fwt9!?W#qf6<8gfw(LBa>1kC;QsbZM`UG)Wn6f zbUiW>9u~hCmH&}4DlRR=PXaZ{JLqd0Pp7OzB2kgiX}O4xk#TWyVs@t-Z6;u+XH?p= z44|M^nq6p-IF@m+m^epqQ)?}Et7LHUyi$S}HB@Rj85>WJ)*-TG$_~ppxu_kj&{W4b z6Lksnh;!46Sklwe6X8jY9C(#=M%uLqsD1{(G08*vl}r%}6F}9OD-qpTj}#34s%1$e zO$7z%%RfmIP0I<9PD;j8$!$_t1Cu_TqS4ZxP8sbzk_IxC3g)sX6e+}{ zqa_+(7?i4M7tEwoIWBjPVjG}|!pCn=N*nCBIcN>Y*|k~I@F#Y$i1qM!SmvR67^seQ z(7Cy^bXEfCttn$syuunst>XHI%EFq$8Y689QYx-;E=4Vo26R1R1LVq}Q__}^PABIv zD78{{(?TM`E0M`4UnNSz%hdXBf!^yIDL_w8SvlOngA1}g+w543 zf|6A>ietj)#1A$*yrNF-?0DN6e^}BkoZhdW#m<{pLl7ohMA|Xtd^1~2Z8iB*E5{mT z|CyYh-g&h(Vf->#H(0%W-I!6@-ejR=Am28(vUpl`@88@ZesFu%@fz3TU{1WzyzL3r zykJt%XoYDP_vK{Nt_Hg;PmMKoeRaJd(YpZr$FKU)4MUJ4Ve9B|xUCVvM<94K9Cx zutvVdUyBaS4ht2h=+z(YVe6)hElnPlPr1kEwF@TaO_t4w011`z4#d8BjR)HL;8`O} z;FJI2U3L_<(GT;gMHh+YreAj}7A^s|rY>!ZAud&Z!@+*{ci+QT!+b;ThUym#x>`e` z?)|G8X+Twroz_pMAaM7(31K^3Y#jvG$ZetF4mgz$G9AJ8{J2X^Wea9w=Y3f zs~tRk-EB_*)3e1VAHowj_n5$6hO5q|g*xUddLBkZO~d+P?vIc+Mynppi^P>yjZF(! zmB}GhY6N!H^HU2ICXLZ#z8LXGUwGV>$SN}|2ny3i?hdBE4K@C{{T?#=Mn{E@GO@Kt zqa)ay++W1+yffUxa@Ea6bKD0o5NlJ*Js0KP=s#>yafXlTZOZrQw`YktGHy$4t0o

    V?W3+S>c7t2jg^ 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�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 z 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⪙qF{L8I6Z;8o$<;1Yf4O(+9BXh1L& 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�|M&NZt&lyH-v&`>1WzS$lSK2fk+Mh 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 z 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

    3xsscljZIzPzJ(JL@t1 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�spjUJ0{T4kpnHFg*v$s6R3Shw) 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%0A{i_I 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 Xz+ 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 SnaB&VxpHUYMX&Nls-3{t)smt!o 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

    M$mIBi~Y*-MO?DqE2cH3uR79=9u`Wnc`hk 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

    n!~UW(rX)>x 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%0AmGA*-SR$pjHDQc9p(4^ z^zw2}@@Zzr{DpJ#`FL4lH-m*QWq^!JfjOo|{k;j|uh_XUOl4+i$~BOx-xGi`6D+?C zc|!`(FsCXGNOE3j63jk_Oq_!}tFj$>EbXPXhZvW~RJU^pexy`YvnxAwP2}2|4%gGw zhz+sj@%PYM4HzJ01Ir$FFw3}wKt$+Ve3)170pq@@=!?&M3|MAHhEd&bc(Y>P3MrI$ zq&;37wDD2rA!>1vwwmcOt~}l@y}M$@2As1$ZM=@!8~X zPzS`_OD(x}l5Tiq#T=|5*hn=|S}>^E6iJ#Q!5nGY^jC{WWR#*SunG=*8o9H4Kzw&< zO>2m3k?DO8k#4??0sF!k0|I|?IFx%L>z*b+YS?|ZcZ=XrJM8RXxiswWla#&f0Ww?` z#5@&pXi6ihkY^GE6FC}Mx$XLM?!$vU4t~A9S_`^%DB<522I9Ww}n2;zVbQ;c`IojM?oFru5xeK3Xs+xo{KP^cm(Qw_>2Bk0+Fp zk6;Q9E|;50BLzsgiKs%%>+u;T3KL14HbD%vmnhP9Beoj_s`nj@_VVH;ry6&FeAKI5 zlkm@uZx}FRPI|U%)o^i9;%X3#0NUN~crQ%D+e$i^!F-H>8dU_po(lYqFf&S7(rD@I z7=Abpt1HZDMij|9^<(-qh>M9wl8=3Vy)cw0h^8=9#};0I6z>TF!07j?h;4M_%43?C2ht@efZVXqEDr)e$yO#D zq-0kB1pe~FFTXlgiG?4_&0ko_(Bp>$i{20xS=HsKL!Js9=EFly3uM*6f_6W+p8)ILt%YKgf$gr z%J0``D`j%dG{NzD){q%4jzk*TG9u1Q0a;uX;4gZYTK&()Hte`}5Us*K^mFZ1;u0ra z%=t52`faR!=@)jHwB=JjkK*Ys0}8I(@y@Ml<(Wn28<4%#{(fSspcgTxnBREc737r% zumUjqH`?Ob%DOQmQsvWL7FQ;h`mpUSc+jW!ONnv;kC1=37Mdi z`I^G*OE3ux&W98$#->Th9!8sqo7QFq#k`i~Hi}p8#*BnIX+FxSk2-O&r9tZal78mb zlKEv>=4W~3mzrx|S3C!>X&$Q0c|HCD33Tr%*FwSaCLKV13D9BX>Sg>G?&E`F-p0o2v!gfb6*oogXj25n9osyoPO%HAd-4pY%{&vc;0IrbxvLD*_?WbHB69A4 zPf%YsXGJu$Siz3Wms#R7xAwoiLV5wbMnt;yrZ4twm{ce4=OelEt_j5|E z&WM^lHI*TGGIM|Oz;1rGzLKtW5{I2({~hS)iAyVfdaSgpj-KYYpTL1AdVPN*1z?r3wku z5+c=cI5rPkjdM}HuMrU^=M;FGIf0iKpP9pG{r1*wNkq+geH*o>T)&9)P}N<)la0&0 z7v&2DMqj{WP{ViYfyXxj>Xvj{n~z847BC_s$|YIqKhabHR{(6{ta-051v^nSxOl}P zTr}SWO?t*ivbP3jT8cYj1v;Wz2U$|AYZBnPtjarW+UE*&iwP=6&ix}V_np%Qm?t+v zjmL!76cqplFCK=VB`mrYAh$fo!mom2Fz~zr!%LCokyQEkD}IEjJ!3>;1ID@csgZbu z{(BLgObcmW2SFu)S!iE>AcBK0dRdUlr-D5f>}5=V95;&&3gshbx^4Rjjl3T3q^gez zW7CpmSsFJS{m_UDZ4}!Ujz@RG} zNn|nU1d?lZEr%Hk)o;vj;coU^q4cIdH(88(=OEaBnkRB}e(-#Bt;6O#^~nF^P@KC)4Jh#Va- zsK%|)lCmC@_NZUJnI{e_U{c*QBh3xg#rrr{LL9559hn{&Bm5LYQrS&&=;u?wwv~%o z1{g@v2qt(DARa9}w5+0)hoc%YANnUG%bCRzmAY{Yff|9}u4b#lguyT|{(aqoqJ{FT zeiq#x$7Rgi;TRRI`S?@V>P)}X@bJu!q@+muAB<^wW($S$7~1M|(f)ML7-13P80UR2kW zx^wKKF%@vG)lOutbyCSP=l(M|WVcbH1I0+cIT=6o-dmLh7W|8fNF?KK(}qZ1N%Ls- zrTKgd8u&N8Qc1H;I-nDPyyiVhV;!;VZ=8fS-lPx}3EFEv5ZMZwRErTzoO6*fhqwUz z2h}Mip30Gj*Uh=Dz>ibG?)f47z}5@B7`hV^h460=Pg~jj#DI#**-l%_@%mXoBh0Y} z*Qpfr&UpSTD_YRF4G@eqq9#AJ7U3+iEIx4*7BL{8QvF@_HR7m`O)cCOeFvw_h%Ti6 z2BbX~xIPXn5QE6gse3rRF3kvxTh*3b?WIU z&rhSk7VNwz{aax@PIuO+kWVXPHw=#)Ay8Z-h)l(qO8MMi4!8dM!JT4-v&)}h%NxPI z%gSpBKGHVF%s?rO{+kX-8(@JaAQU0beIUVhtz!Aq#cf$dE|Y*Tku#q?`&-oeA_UD1 zv@^Vv7v8uu6!u8?Lg6*izex<`#ZlS<0={n=l0wP0+wbOgwJLm9--3RD)=6B=JIFpr zJo;3e_hho1jc$?3g(T_dL!gQ@^PaJ{%i&6pP8jHJ<$kFQitf%ZK&>c`%a@gYt?`7b zV&8uF+LDukqNY#D2@1oZEQ9*;pE5zk#P4Za|9L7NH7ti*-Dcg@C#{8VFAauK0h8@s z?2gx*xU8vTA1mZH#lyy85|Otkvbn@{nUYn^QSX7>f?_Fs{{sL4OZmlD<|;~97za=E z6jRr&xG+69-%OzxksN}Iwi8#W0&dM=WFJ0LS;%M*a|b|n3Yi~rcwG!kUniHb(wX!X zds9X}_X0HlmrB%HbPdKs0=k5dXFJ_dHMQ`>@DT$%+y+0v9f4raLUuY+Q8qX6WsipfgDytYDl}Q4anwf-#duQZWLIqiO^BLL%8cvdRHIa@6L+O zZ0%aQTqna5*FP)0#+ZQQh@^h? zsbmGN)S;E7G&zl)jslG;m9*~Zi@W)PuoC0ah||nE1$E4(HBW22n6)yeW!U{O!GK3G z_uIChS}dj!74Lz@LvpD(`I45g4xiD`HZqLK-eRLdM{%TnGic}kW2bLQQ zZ-5%rcFqNO=`B-eoF^!5hEg;P6m~;^VL}u9x0@Q7y5#(fo)|g z>{}6ML<9`2$&e#9Q^3{47_ey%ETvJVoR*)kd{!d3<)l;pQEpi&Fc(JrXzx>X=U_hy zASPDOI@PW&)SA+e;Z$ezZP=(2*JNbCJMU!7|D9pd{%iu9)dWz1k}O28aN(+EYQHoK z=&Ml|LuxpQOcDtT_1ta70C1JgJIx1Fgtq3Y@*Wc}905SR%L5`l!m z2LbbXP*P>KTCz4&%0@!DFpdR*u5_XAuJesbsR}QQmg|#>zGh(pk)shpttneUEBiv|VAU{# zR9&=Uetp4sEY26ah^#t_XTm$KluGdb=6YI?@!mfck!VZZ&L&XwE^HZ}Ksj-7B@7U_ zra7{zXd9Zkzy*mi2AYb0gqZRCff5o65K5KD%l-=zr_*Ist*zv`flD);F3}`I1imez zj*BmYWiJ&k1Jj-suJJO82TBAVAm(fb2WG&OJHY3TD5wdZC0sJNHkt=j%JH$INBlg1(xf-8p&6~UERKOXG?cPRzW!TK zYtr;^_73P+k`5yaHb>HwOp4+pths*B`FooqQ$lM;e_7V@1w^0$9B}vRV6h?<`$_ki zfwG-dZCh6QdY1Ae$$edh8}M0N^#qb&&p06VtkAPD`_n-IewN!{1sxymP$RC?d2NQH zqCK6H_RPbyC(=WC?9^|g_iX0{q@ma4Mvv#{?6Rb4TlH2(PX~SM%6b86lNVJ_pTJi2 zw=B;a>7-IW$72v*h;XgheUA8DW-|J93)b4%H;>uWv(bf-xODcSAuW7ZW2XV9F`-MfO7NTJ{{$CkV%)E`Oi40?&DhQbOfkad zZ{k}frNC!u=10w(uZkHG?!=P9`xb?gaD$ojsFKTHlrwM=(Yra5Y&;JrX*adi(C@{P z!MP+>LQg4VjP+*k=_y2oy=-k^3s?2dxatwJp#DNpV#1n%ujYqwl~BaF4Wt^puGYrj zbEV4m7^V}Szk9GB657*&HuwjED@p{^+blwW7cOk@liu%&{s}fE-f1E@bkqV~?8Jnx zEyPd4#VN@Tq0lKBjU;Sur=;3OcT^>$-cD|OQCn=8FtGEVI@JhWg?Q&k4qn53mxx3v zP`I&wafLc36*nja#fC{p1oD|yh4cV)x?_}AlVy^P~Y{5G5{UF>VWQ7)%MH} z`Q2c&-^=DPRZRNI(8V@`n6PacV*rejFG|rwrmd{Tt|Xy`n)W|eHkOo>05qaPaDmk@ z6;+>rMkhu(16ZD;QCe;_YVtVH*>#QlAihwHGZ@d{AK@ypAHvu(DPn?CZYBQfnk=2_ zTs5VgnWr)ZrlF4bdy89NUmTXyhTY&%G97Vlm$w1^JU`xtbr@*+CtYZ_69^6}k!5Tz zf#EnLbs>F5mEz_$(yn6{0+xh=Ho>aun5aX+vbm9wZCIY&wedH1;!j(flmVT0R=vFr z;JHD6$#y?g&rH2-INJ>`JmV^k9@N zM~ewKrc9NcnJd9es`!MjAEPV7_Os+Y*oY+=?M&i7d+(OxcZ*HI%6S!g(mMy+^9i`p_J7*!m?)HW^ z@)<<&&piyj>_X9hdH{Vn6G(f@0dqN~I{25dE&+*| zzsrrf(57C3@VHsVw~I#c>;qx8;&PtbSRAw7zeZ#usRC_$C#s7}6RT2sfTNb7L;WA3 zosG^=+nnpHm+%Y2hMs`>7AL5zOdB7BXvS!j?&XYJ?|1{Quf1m0W#6A&2x;j?5zdX_ z0%sM>q?<$ulG6p}8ZEjd$$g3FKo$9BH?hiOzP#A@d?ZQ!IZ$BH$Uj8Px2XuAusU4L z#y_+7|K6;5iAXZGPcMr+kpf7yCiF>xy;5ct#|Gd*6r!-skOB$;kFx-M#C9Tz|dp+s2L6v_M8eQpoZ16XLN(=I_E6dnqs*^{pTut(oXzQJG3;ys56$jsZpY!S4qw`F|vyKsn@K+ z6i$k7rJB^>7iJv%@REMms%i@K{vUUJc*Ypu((DDn*nJun3n@S^2k+kgZeub0Vwd-t zv0fcf(6%dnzgdT2x`rf2onI}Pxi?k=sYM?&P8i%SfNm_Ix6M{}m5$VrD zqN#YH1+n>+A-e)o<|c<5%l1<~`Ex|r)7*%jlb3A6k~?XsY7=E6K)9`9tENR_BH;Oa zxo+@X8YO%eR&}2M^MKbcPCID6DS%_T_5DCj_s+AAJUx%9zC~kz6CHW#1tRj2%ezY)+lPt=#%8u)%lYQW)QS^W)I@M zjCfGix3MB`ZGI9JP9%#aCLj1lAD%wL{2+SXoFhuEeRfYj4y4!ekthVXteZluDWZk1 zFH;qvmH9DUm;OYp-J0W)MGKYi3^zIU_Q#+{T1gRo6AZvXh^NYYOt+l zZ=ywFk{WU$)foJ+vj+*>1hB|-)PUi^s}dYOG<{`W%Q~eBKVT@|T%OUD zV6Eo?H?x@;9E~&Zm)tR~{4$wn>dK6dM|q(FYF9R|3i+et2ZM>8Pk+S{TKGV_B$XX! zBNjqN$GEG&$}hOu{__YBsP@pvz!3eSj?j-0wOd-RN8gWj zmTd|Z0qN)#YL27#S9A9`NF!9lS>{$nQr;*#c2OF3@rBco1aD47IA5OG+}K6nMi70z z+zj9_0Tj!VIKs{qUD!vb(@3@e4Q#hB8K2q+=`3y{7UNVIizV zs+PE=`^*kAFv7g3C$Z|*0CEJ~1C)(29>wy$pcM*7Mr<~l^%Zb&H>-#;hT~=87L28G zI^_iqpte|0aerhxhB$agaJk2olqz~Xuv2qKSKrQC$i{kAM4drTpmJj*=!97SvvNe) zuCq`}if+joCB}XJi*c-#;I+?5(En-F7%o~~`4A4(AL1|g%fEI23A#X=(wN);;cQub z`q7HHwY!I(eq`ujl=a$7EpCM~Tzo;&Zq@D=X28X@oF71?~R8(EC8y3py|Ytl#ZF?gq0|o+Q_- z89Ybj-X~1FJ%g-jv=r@GQAc6HXzIRsVV@K+^76~;rznAt_+WuANw3}Itxt$(0j$vV zT2?ETbd2y7QE7<)Cc`BZWed)qL#Yg*Urj~1kdkWiD@aF|eU1*&IExhH{m4t*01~h<_mk z5`eARuOIYhMUGc_`*cw1Wv9@8RG1u4qfBdDj-K*CEbW9CQN!d51ba;=2hAKt>Hp<9cV zIa6o-2g#9Q5j{-osX@mtY~0M)WiY<4v;;ujart{38bW`zGELpXIOnnhaJD|#RkM+n zR>vWX{|`lwd5BS>Yrpq$hO3t2yt>TdqdBqt=HYH$PwN8_M$O}dRu0d!=NK798I*r9 z_spQq!n2qOM&GUmT4$PprRz*7P#-G;1Iv#){<@^yL3X0EI@F_WNej@?82eQq2eB*6 zivCh&Z^}Sd#GD%``?1&sgI}OZ(GMw0_J>oK9V;u0z7q5dSTx*1*!8dSD=z;{$bR@V z6+W-dGO_n5L3Yp9#}wSUavb!c{!Esff#_C&nld2<*;jX`e4wQG)70@W!a_t>2UB|< z=yLTak(=A#=ORZjf8>9j8xnDzMGW{{-phZyM1DDxW++wDXszmrL3E?~1*y)MP76Q|mmoAd|TQ|B{7yWj;u2hUbu5yKXcVaIL$$enUu=l4N5VTd0? z2V;`Blj{qN09cB1CrgCeEZOlb2f*1YIf1`El??WG(x75;KMMZg$kG`i**pYpBsvV_ zWhe5IPetO$2dl(`5HWQH>H3aGBqMia0Rdjken#05XwoK=BZkPon<_(7-ILUi+Z=aK z43l{eMvaCUs$a9(Bx)HMS*O%vG2%6}Z2J38eR?3y*mF+H}Zu^n8{6Tq`?GLOC!G01M?Hj9@9FSxKC zr*YP`K0IuY)Jzaw_;KrtDV8lv&F+4aqS7|9fL}Y~9)onhQ6}*564sUUAFl(pRhO%u z2w|$NA0oorUsO=E>p>E%)(ztg@G372*tgCKpw6YD`W1Cjp?oGZ^W{hX=XS>*;qRvV z9N7kUUqt0=c0ME95g3P6VO|X4S=2ZY$7BnE3Q7z26ojMuO#(_ftG0>16~2;J?Rtp| zL-fl?a4Z1hP7H}?2+rC+k?1HA1`1$l^n1t)9+LG%ycleW6IGz#q3p_co8+GZp`K-H zWj$c_C0q-)1~7K#_a|$bi$!hL2K$OT0pY7t(fUv@dH0Wb++zmQ6)ZWfySrkLVSb2c zM_r#G)7nt! zdKd-py`t#o0l>$tNO<3<;ofQ|wBN(zkf>oMSf^xe_TunFYxby`3@&@oNIzxR9nmyl zi|P$&dXnrQ(8H4{L^>>H(>1B_B}~BT$}$sQb$yTi1;_-O)dqlJ2qJcOE<03#=;n&ZAq!p%+Z75;yBVSC+IShv2tA)!h0P3XwF0zi<}J=-Pim?rD)P z*X(>lo`bE+4jaa9wr;X@exSTL7EJ@ypB_NT(!j(r$$0OnvyUywS!``Y^MaA;neX?q zIL!kcJ=h5M{ayc}P8KcG*imzSoEGCUk2t;oFrA|JdC(D+k`+v+0qL;vBi3l{!Pn;t zWr9hiMW6;6%xPw(Z0*Pd#Nn7N+RO!mD7&Tk+j+YgXV6_~$(=+9_XQ$kFm8`d*9E$1 zs~wGfAE^t{Cj~4OEWiVrW*93LW*=E}9=G_cu;c3~5~Kl6D~#A_JPIfD$#m!CNvHgdiC1=f?nvm@u04d&;v?!emFzO!J#Z+^`wTC{HWUk!G^c zW9gq5!YDZmq|M#0fS=p$pz~iKqLgiKCzabqu^_9QBKvoplj> zhUmM604O+X3Y$*}uagP;T zbva2r>+?D<=ye{WJ3WXrkPR|65xNLeA6Z_ue;^7VBHXv=&HCs3zvJ}}Y-HJc{mQgt zKt35E=1#2M19hw4TeW_$3jpat8v(B&bM;%%w7vK|b@x87Y${{f38aUkp z+|*W=25wmUiSjY?;{A09W&DVYo6rQQfO#)54Gh=CYoJt>mz`S9cJOYYxpRU_uhe=$ zRgLwAy`X#4=zL|0EFy&|n-{Pag#n=SK(<_%y%(LPEK~8eE++oIOdA&JG>&NTVX5Ez zvW5Yx!o-@ImYJ;nJ@36|trsn6Q~yW=C;>~A{IKFVx}@-Maff0M=_3cuhy#otzT-5I z>$fezKG6X9Ju(F%2N{jx#>Z)oKK!yx^=#9>B)g+?{#eh71vde9hb$C&BeRMa+e$&m zRwiO2g$#B43~qqi1QFw53YkE<0HR`DN{JznZ}TH*=6G8~}5H7nq z7y+q0ANeT0qcdUm7@Z&;h;2^_+B|Rx+Fr>rML-t914H5_y>JG3dv!7H0bS&RQ8Npy z$VZnxa&X1O0^J_AP>8P)$#ubqpzd!wUp}qzN?TzapqQ+e4MCSdFhZPUZnCaIi1-Se z_H2vU&W_Hz4ufkU9to%!I6&jU6o==PxVQ8#S++KZkCU@hTVx2faoY zPCZDFRFoGV3}h$QE8%W?@4cmzQU>`9g$tbvRR$!Eq#v0oX^`oX7)^^{Ow4+a8c04kj zWeQb>EE~ygwBtqQ_enHq6F2f~ZN!DCsFWPDHsUNS)q`o$%C1k{Y;DZtawAX7If+qX z8T(S~jbl{M^oC9jr(MS}yOyb^y%Nk>y%R}PDDC=XsRXkoCOM%*#nP8u?{urHF*kkG zlR#c@NhO!FwN!7;>P0a(X>a-f!IJJ2O8eJ6mEFSTO&?KJR$p%~dn$8_I9nS>oQNB7 zsUAs39&h^KjZQ&$NTR^yh$F#Y!6AVHmtrr|U8_tV^)w)GDoUryR9Wpg0WL=s&ep`7 zoz;syTN8I;PwbIg$fld>ykacp*U+CrFvj&gysMTgx6;7# zuz=bS`unTFUR}m7m3H|d4 zDvU01T)EwBGJPaN0Bl0~b&;q|=(0Bvx=c@DVgkGDQ(_l-6WMoshn@nvEOsikF(=Ef z`&5)oD8H^QO7-llj!h$%Dtpm^%aNDcJ?u*LY;C5@RI&IVW@UAjcV7V(@}20+1pN7?hrl*g27NigV=MqIx5*O!Z{%$;gqnD^1IoGeL?X zR-gnNG5ml6Tm9%{YuE}FFjc_=478}gRzK#(rV6IYs#BHKJF%h0nWiyxAcIQ_u7FuO z>Jo+;H3;!i^10#0ZO4v}1!wlvuewWt6m#44Mk1wpsi<&QX-~EmdwmFHYeKINqjtOu zd9asZZ`V9+JQ&CV*V~?ZM@|W4@)pY}7>Ts&cjPeMa|{V~+sbjo3|!i!-OkohZ_HVJ zN{%NNc0CPHyY6gl+Magh?FyCZO&@i)>px!o2UY*=z9+jBl0GFxW zu5V$%D_*AJs!*!bJcYF2B)UkI{owGt2`7ZSaGtI{dlRaRKB+SLA}42Tfpo?ew@qJU zOfD(O2szxQFLIL<`B4JDM5qI>y27D!0um@)VZ)dOj@naTqkPY}%UqRl$DB!RK5H2vojF>4(Xu%4W)+l023Q}OBD`XD#~Ddw2LMo*LkrwON!ASbLG zd0U7eKmf!KKJc)El^kxcfrc4kfPuO|Wr_zlAVmWiPyquLK%oK@kU#_;-~a|JAOQ$C zfB{G-zyL&0g2adbb^riC#DiLp4mSAVBZJwFSWpJ?dF|-n+}PBt$nl?kh5slKARR&} z1Xw7GamJM^jQBx{jDyH7AaDrsDG0J`4J>(x0+EG$AQSzNlh}g5<(jX38(i;w$ z;%>+^DdvPrimQ^Tk`0+I9f3=#R0E}<21)~K#{~(MX>Nv0n`}zBq&XQf)y0shQxGF? zNp(k=?qJCDsR})PAyb|UnL_b^OUlc%MNY(DvfVu(+a~~s0GD>R>7QiFb3nFGI$Pk<@-}?~vh6V-+bA73 zaA|v+zJz>l3&GE1qy`x=>U*FCmlF&`RO+O2l?9($=_2f3|xM@O+O@m zJP+~*6}tkLA8*qO$zQLQzo=LaxcqvXo|eH|kPITd&fpTfZF(RX#C4Ftq!60GC5YSf z9Ar>wgA6W#K|hqi+>Z=4eei@!Ft_P7$e_+g2Aym`;1bkr`W_kFWst$Aml<4wyG_p{ zgS=S=pflII_6cdVF+{gnMSPpMNIYhz%m*H*G>m24B{jUE;|eZA-KOWs;ch2~Ppu|ghPzGg${|lD zhfn~B0WL${rq9V?4=0CFBJgk-_BMShi?^FBB8e~tm*S0O!?K~fR&k3;tDEZdYN%3X z3vqPfVsRF6Vv?QFYv2N0invWrlSL(Q2@5VorA@E0eL&}AXY?%_a4CvA@yX8Ub>6_G zxZ89zLy72YO*AuS)Xb!r<*dko3vvw5Mi<5vVUX~G zH|C&%)rh+}EIvTqurNUmaj=j^71Uvb6;|uU>#`-4Gr+Gs<}7BW^~z_%WkHFQiv*dVHIRktMw91%`Cd@4E0 zq>%*np1>*fD20)WqKF%;XkqovFmnV9nylnP9vzoDMgWDCCWa^-4H1VBR;CCsu15kb zx+N^G5J@G_3NKW>D~_ye;R>_p(uNf^QlL^V3!NBGjNu~26I-nGZte*RGEvB2C5i>4 zGzJE^6^N-pWZ`l-DQ>wgbhtjfGO8E?3NSkKFa|O5o|-7L1q>aQL>`wea!BlQxF#ET zN?6gMi5uL--Qbks#bB4k7c86|P72+~V~QgUp4;tdiQVo=1Xq@xa!NY1F=~Jt6UWXC zC>>r9hCRz0V~QxHB&<+DM{izptf~C{jLi}=LBvB?e1`<6mV=#FEBP=7eLzy#nXk(3W#mfzG3$ta3 zDq*%9_3n7%U6Bi81Y(}T(6TEN_UJjT$OuJOa%l4mIjU^>5=^*u)1U5eW_Gzj%ndA< zH=F@!P~}iTAX-9)?A+{NS8FvA)HCc zVR-@CgBK|Rdr%QA1$&^&A_oBh2RM@l2sjf=moT9$C5)XZ=nBw6YPz(YC;_!Ifq)Yr zlz^Z!#f0dR=(Pl#$)-!zK}diN>+&YVM7pdU1T94b;Rn!CL>AUkR4^y7GX>RjDda>> z&IE!kYiBvpF%X>zgxl!S=CCsbok>WSLXT-FAxkVGdce|BR6<&cO6W|n57Fh2d!VJ@ z%~V8}9^9s-;H?D#I))-=vi(Sg+n8>2d2^vNv2@9L>_nDH7QhXV_m^ZMCn10EqAY+H zAny|(4`75W0<|@H2w4DElJ}EjBuBE5YHRW$SpZ!2ye;qCo+ruyK)^xB0MJ?xppC4p zi9TZbK-Z-zo0s7>CL&w*{E+P99^?!zB+p*UJ5I|!9wcXQAbIu<@{V(meSCwQ!H4qf zKk|-ikbPv?^F49~N_(D1o?+SZvbCoD7SoYc=FDbJ@3jo zde-@zjH9cxbVXv>;2N5hicF1Sm{S|fpbb>?(%4_NKe*uJ#=be!0%?pSw#}dzE@V-r z-m1=q$^mK&2T%$2Isd6**+_I^1}2_tvcs}b>IG1?*o|5kdb;6UL81m5>@DngEE~0; zvI*U&g;p6hm}Uy!0uIBr<0@6{vF|O$_$KFbrSpTMKUYR_(1~i5i5fg10yC0`!4e~g zV}m1<_`(J&Sbzp@OQrFg`W#0DlL&Y;e=Ny>#J->XwfB3%C0J$CxpPWcDy`lVbpsYUzJoQ8&m2Gbm-X`l@4i^O%Blb>zbR;%@6 z3Ow!XNDq_bNpgkn_eE-&6WLZSt&T?DBU#|m3NdTdD$OCTF1n;s~O`-d0I zB}m)clD1j0RjM-jXS=1!=zmm!S+_aPLDHv^qz_H4D{m50`{lE!I+Cw#NV4$HE`-ejg@muVOjmkM^fHt33F(avZN%QQGN zcV)Ws)a?p%=1d*=8vu9JDCF<#xjK@+bF!+wvhwV%((0x(2VL*0yeKl2R$qgizOIgh zZRcEpMgAO8UQoRyIQo~r$5F77LCBsW>>b>-L9n7wiGj=Ml$Ib-ym^NbiZuGjB zefo8E6eh9D=yj43OpA6#o{Ej+@scWOCZJE->>^|ou72qf%B4Ax#ktKmzj$_-zwAPtwAnn>8jV5*Zs$n(1xh&dc z%~60dw0Cav2Izk67u`F`z)F=?f>Kx#=}PShPDtMStjJdVzLod!;924zpPGoWN+;*Nhb0%ur z-OV+xS%vTdL;KTZ(WWaSJ~SH2(B?VL+&)=6QuCgCfuRj$Xp?_s6nOMY$!hO>wRgUw zFEF%GsQEW^y0f#YqcDM;N0cSgMw^yQo9s)bEp{H-$cR$0m9h-ZBZJH%PisrMgMHd$ zFR5Ws2(GTpRB)#OU1%Ajf+wMXj8t1=oz7P0}iwpFT8^!3V>y(3p#4MH!J zE0-FCKFmwVz-8UlCoW=gVXCgmuC7tYsF|o34?33%c3X@6o@Re-jiSn^P6=PyRAsbg z8_O1!@6}aj$?#%4h)dsJ?OqfyM*2Kpg_kJQprVQoykWa{%^DRNKwyF{Q9zIZ!wK8{ zoU=*CrP6X$$<|&`wl2}$Ey$TAR^al}L1Vhm*P1@>2L>~PiicvyyRxH1m#AY44IFf9! zQ?bGFiwW#P7t%(sFE-ez*hn7MYjQYOXZ851Nr`|W{XtJxM=ViY84*J+`nx;TRB26= z2qhw(YI~APPNYQ2?;`y%emq%an9HM%Cii$aee0{3R9Flr{s){*ee0|Ex93s9xWku?W6c%#` z`1+Jn>dPELS3A0-vUh%S*@~hPqmaK(>2fRAE-?}@Bx?$q3^ z-;8tG$}gS#x(9!EPJZprZn3!_P&gIk(*bReRU$s($(Y@ zD2*0*^hW@0*x~jn!UoG((X#-rZgtj6rG=@qt6v#N0{%Y9)uk1~Q2ok4lJE3Mo&gO2 zZK_K#RVEdsX;!e+Bh*Ny3SJ#?0WQT@HUfQ!L76jV7bR@4&y^A_w6Fd>*_vIlvz-w8 z?Oa0IE@>e{TbHt3+9j$rtx0^Uw3RODUVU|Xs!wIFviMYGciMF0t}2#|=$IwODA{6% zWh0FO8|X3A&_IeU0giPA?Kx5#MCq#QW_AVrpU-UyhZM6KN`b7fm9=wUrhv+G_ z3*7@fg^5Y+LZ2e!v`-t^qaNtfRgr53Jmem{{B}e1)Tt;Tuf4QOcF8VLyJVLrrSzA+ zmWftIXa@hH7ji1L7u8Xi)GkCD4cS?JO;0;pGHpfW)YWXXmqSAGwAJWnrpltKY}#s{ zok3?`I!4*rTvBbdrCN>(5(8{=x6-tbCT}kh?&+!C0NtsmRZ*%Jh09bgXP|^FmgyHe zG@h{aDs6U&nnT82pPEDDL4f{vLVu_+d7Sv-2Or|l!AcbqjuG%|SR({lI8lZYNrKi! z@rhk=mpvLG_QYOqccgCp?dXqsSOy|vi)DJH2Sd*`;%x2n;)5~*4cs?|m|c~9VLmdu zzW0gQHAp_e&gy~W6nL1voE>BqILP$o113Aj)5bxncWb~KWQvq&0G{x@N?@BxmBC?p z^@}F$izO5Ycxz}}KqwKB{;0<#kX`T97w@l3VSm5)7NJBum_O=?OdsNrZ(A*d>{0pr zP?hSZMN{=v1Zf|Gd+)tiWhx^o*g9_ecEARnw|nxQRIp1?q(thC4qHTrQ6OH7v5gu> z6^U`G*IR2+QCKh5$wJwlE%Sw$O`k%TFP3hbp7Ow0K~fN#zV5<61BnY7yeBF44eK^5 zBdjpq*fv$**Q|_SUKk?)qSA8PV8k&KY1nAGZB>;`{*qvvaZA-6!rp|}ewVoXIWf*}}`#S1q$*!Mpo6N3r?{h>t zv~Xb#!J#d{F@lLIZIpnE40C|7V`73UdRwv>;|m(A7kFo?xIH;+;IfBa*7KV!mSC-n zR5_Aruvr#_GUT*`+EA8g~7yS(LHsMJ&b|NA!ym;61J>5Mu>1%r9D4^oUmn z85M?m@4e!**eMJrU@XxD6)QL*hb12;jG%!9NKtbjafP6RObygYskWL2x-V>F9WvSg9quo$8Ta^qo>r|9_uMgQ!sskf*U+_ zVh;HZ*4zaLW&@2bGz;p*1~JGaO8BCl6V+AFb)~P@TEpst^TTr80O{nINsT#*ky@0h zwbgpPb)FW_aq=s6qUw{WEzCf<^`D}i7!QvRIDVAUa6;9Pf?)apPji&IONwRG6wCAh zQY<7`%TyV7pf7mH)@Y9AYFHF|>OGI;`pPqJZg8B0x#;Lf=Ro?1^&g$&i03b=A9P(5 zJ5lAyM>=o)m5*4rIY}waO%Tk9vx6BNrIX9{KeQGS6Yz z=R9)HgRVbQousNBIp`T=y_#jpBfrAWK5eiZJC8SkeWs_>9CjXh3KNr>!#)K+rlOf9 z(HiIs{G~l?@RJ59sSYGb!}I}uQY3KvYo#Y`qES?uqg*PD@;D8T9D=9OQgfPX&2L7+ zM=}iAkg%;rQ<|GT!2h@a(vLF z=pO%C>7t+@eKM<1bR_$ZtMrQm{Men;9Cp#xcsvYGhN~9|tyas%=3y>H)y;XF$<2A- z-<;G;a6Z#UHRQA{nKoD|(=E$D-;sZw^Uj6xAIm<6<(>!S*LCI@^Q-9f;<+qO+m1YK zLV4O^c?RWa(>s6mdC%)SSa^DV{_+9Z$$+Ree7yO!Ae zDAOjJOr7Wxg}Q0!)Z}?OeFS~cHn1rcYt7$5a^p?cl zQyq2UL83#_1>4hlTR}mYJefW!k|=QbT{HMv0KEd;pbGRQLXs*|`2c~-*J^7In6r90 z-cSLKN0)F(K8mW09!MN4JUOA~`anie^0{#{GG*9BFQdnP=`)>M7)Dn2@UzrqG&rjG4lh# z0n~s?{2}>FA~K3yJv{2^j;b>CQfKw|W|~c-n41YHI?*q)Mt63U#_al}jlw;Y3AM#T zZTkteD|n$yC?`y+tctp*%4!-!)mG}I$|~I@)x8N^_Ski(q&k-l3_qtR>RAKBOuZO^ zzn4@877f`NrDD$NYkmC}Crqf${wu1qxnCmKhY#nbI=Z7e>ePc0fl*sj!Au|ZFiM1; zfQwyU3hnwJDZoycRM}4xrX(doyHHUglnVOAmhDt<# zOD9^{!f9wvQp5ZoBRU2#E?wrlq#x`$pOcAp#Z{UJ zm1g7=0H+_Ez8+N?k<<3+Yn4h9!0GE!1pxt{pA`h8+Yq3QuC2+-x@CU=FIzolLh=&U zqjrP4a00w+72u_-=w(lmmoOzSWg)!m zLG%)c?WK?+FF%;TsR^eLIBmcc@CdwgIpC#i0WXE@oYN<%G}q}zs5G9}>7S%fX+iIK z+46bm`gz&&m$3X&reF4ey#zuNdijCzzV6~VlS_jKWnK0-kS^_c z&h*mdy^G124Dg;D0nNcj*g%&-FUq4Xf!-tPvga=jbh*J}xrFgdMLs2*sYjPRKUqrX zbEelJpoerh!V93Kh(B~0bOJm;$B_Skp9j3or`zvFG)q z=S;5=bUAeL$(d5R{PFRLsLSy^;$J7gnMU}zkIx3WBwv&|Q_%B)esl?RpPw`Nkh-ZE`xrRE`K1JE<<<_CqW)_vN{tj zJ2}&Jd7Y(%`Ak4>fCh3UT8h|#E{{BkmLhH~3{X--qf31t1^}HY1JPxYD`CKyj_9)H zF$U0_>Bw~%3xkq~HD75d;*m40t~yW&KNC|-$5<2**1eGpVzv@6wa;78tIVgnF zv=lLjE^AJsrHD$-MDtj4+m!|FXJw+0q0|*p#c!%)qN|6Ho}n=H(R`RvnJ8o^bt3{& ztTZZ$E|&$Vo-+hN@H^1-F)fcr#SlD^7=G7&<O{Ap#&$M@&LMM`L4GZjDDKw^ zq}Co)hQ%8zsijv9^0ri>wHAmat?glDwcdMgz4ularXmdFoU}S;{cKH%`au@8);i~` z^sDma-uvCpCh_Hqz0_Vx? zRI|)ZHBl(q^rl(~sE$UF#Dyl&r1~%XE(=#cUD7aE)Fq9&V#k${)A=NoCf=}cKFg`w zA80>i;wcmhl*p)Q68%wM^_)InCE&EePw|$rvJ#O}8%32>C+3g(FuQ`;6$+YkHg>ul4eubwtl8U??v;>yYb_iDWI1E`@Ypty^ zasVo01e*+uTVlkZiEPv>g0ogz!*(XCS40v9#z{t~wHan^(CR3mrIw1d)@qqJnLg^l zTtfY=^$Og+7paq_qrP|U_8n{U2?hA6Q!rI_kHml{by~vIsVeE|LBb^_GCP>HNdr%_ z&>uYDs>m{gM6=MH75Pyln}rggI{E_%iFUcCl!97J+Qo@3IW1MBdQ?MI{lwY{_Gao# zOo`AV*UbsG-c}Q;zEF3#G<|R}Wm-(x{bJ58B|@F*3v&p~V*0oTz`kVAioi7IlLZD( zur<}39Z@25{-`@I*tgz#EuEHTP9OEysm`w5V-uS(W*AWi3}?>R#EMhZLE1+lbyz%S z=_xwjIZN++3hO*SHmv)+iOzp??xXW5JoHU?&U%xb>zuA$RFl9u&zrE$LsBZF1g%m} zsqRr_t4dp^PhvkLWIkDy&+V=2I6XFJs7IB_z$iwHs?7fUus{MyRW>@GKR>Pi9OuU; zQya}iM>ubN_Wbp^dQl%5QfsZX)><1{Ypu1m{@h2j2ePZbXlvG?MBBImbfOxrkkI_c z1$e%c{eZ!<=;-G@J!jn~AHA+~@&Sq9^eg-iOTWUqQ@2kMNIJZ#@UhM?jm0SedBk3C>Nn$@Vqb)?(Rc@|4+`#n~!zUS@H& zibbk2`ye|!$!crKne^KxZn=v8a%>hi6AJ6>5A_Vea`jDb-Q zTPUYalns?aHu-7r12qaOd|N!YCdioy7h9$w=Q)NY9nC_tgw_N1C;8In8bCmBZ zh&|wURh0&_Q%v#FiCdaF*_nOSPPRsSy;iMNGg-Z*jb7ki^){;;y+E<*COB`kG@dwA zY&c59w#GX6!*mIyOqJ0nBJj068kP05RukD7>#rh~&8LmpT7Na6Ev*37TW^AI(>m5K z@GTu){Sx8zEuC}Mo9KM!I^TJLH~Iy>#J|3le%-%7meEVpQJC1g2In_#f`fnaDK*+? z$R5W=PrdP++_p<*kiuJv;06}}$xeA-x= z=_Nu%A;lXX=G0pm<7AuP>!1tVr&6QuEeigYsH+a|UJ=)0imu52(&vTpCSexT3pyoXKRfO@Y3ANFjQkzbuHZW5zndYi2_he`G_Nk3FnxbeDMVwYh z-mp?rtmKCSAL>=EI1)gBOWLbQ)J&z7m3HgVi|VS(OTASfao}pL^=7*=@?G$^;_A%O zZg-azxAjEPf7)*iSIL@64$8j8wZ4HWSiy!l?vhYQSz@rxOb#+7(;k8Bbx7Nsq55pq~ zPgKVf>MVQ^Hn6M8!i&09WnuUp8ZfOjTxX$(TRi;j67SjjG7=%Ci;oLAm~bMW#7r@U z7$vS7Vn{%8A*Kiri0R>LL(CDV19r7RQv?>t&@h3+GE^jZ0@EOa3om43p*n-@o;)(J z5P{HvMvP66;lwV7VGb%V58FM@m_rJYK9$MYlXo+&-CuvqjMtZAEh|_IgH@6v*-F#%Lb(%rWNL-)@29dzA4qd8=<2Do?;!r}Evy3H zN}Hjm;_+SRsS;Ir4xuTP7R6Lnk*U>bbOt&dy-j*sl7#7> z(A0c2_+lHI+wEp!!=m?-Sr^e=yi@&M`(2jJ&5g}X+1t?28=XU@SYu>h@7d(Nx1>Is zp3459r`8t6n~oXNUBAiHOpPKbiX<6=ragA-ck|4)errC$iOY{EE z2R@s$*4`f5ve>55Ip>^n&N=6_y0$D8$6T`YfuQ}u@6?`N5Cp?(Pc3WTjQ71D2!h}J zs6G8|h*ud1^LN3Uo0}H-g$%zdlHsSCv(^rKc4)%>K4sxqsvWMd^PRHrHsKf^hoZjs zi>3F5_Y1!Ze)+&K+}H(DD(d@v`JpP+c_8(+ zTq6mD{?iTMgs#z(yKxn4Q#%5p8k~=#)l+v2Z&c<)l z`hveUJg=1z@UIn;y6xvYp0$-Kq%Wv+Om&u3j55S#WB>pF0J9YUFenfVh{QsXP?BW1 zxOWE>01tVVKx#}Ei=|%;iG8Tnq(}wt!3qtS~?hv0Xv}OD8mMA&aX*~#`>K$1>}BPaP$Lh(Tu=I34#7138XD6$7rGU?_K*4o%-e&hX=^Qa8jhM5cpfCM>x*Fu)3ig&@=B zw5%m8TSvf|>xGm|w)k8JOx0YVlERyNSHQ<+XD=TdQYIodYz!1J>usR4+%zf-*%WP?AR8=9T{v{NjzKG0!q(Nzbqn4`D%t`sA5BP6al2ZV# zLmC0Sr@P`k;P8KBdnQaYL$?xlCX~11vxPPEnrHKkOLS@pxg}BlM`T-UdlubvQ0S>OL{G{30fg*XrN5aifpMbdA%*Dgr2-;7~#k zV*)t^)`tHl)i?tELHJ8hQF8^u%AK*az){AJ_qu!V!wSSSC`_uV!M((PHiG(9RfX?i z89@=Dgqi5Q$H2K++0^b>&Co&Xm^!9RTAzlgKHUdPnK3WlXmXZBGGC&k9`p!IKxzM; z9?vzCZmozk6WH~`^fxz~*q&6X{!A&qY}W*?73>0N0SD z$7EKD*Hm|Qa%R@%%oLBX!=B=E=M&}%!Ffaj=KAe#L(w3OO2>(Y6bs+4FUoc)TZUQv zNF?I~dZ3d|TNQIO$NB9+{?(clraH`rCvN{wpIsc6>QIBIqVse7#I8-OE=i)(pF7t7 z7K}qm9Vr>QX7Q2AM-3Zj3H#b?l*!W`nUNK{m>Dsq)5n~sByftXWVMg+8Lf~L6P6NzTi)#& zz%bC@5lR>DmKq(#*8Djhiw(^L^##X-kCi$?gLh~dX-0AaX|FUt$XU7M6Ajxm``9&X zsqmaZRDG^uIp^*Fm*$^g5YO~3!?i1^&LIp8E?RUaohRG;r|}vSHWnA2N5G)K82XZE z!34;xdI$b(~ev#GYfrWDK1K55uqV`w&3oiGh*K#LBFZD5gbVMRYv55`7-f|&Ba zXwt>PqY4PrHQcoA=?Gbpu3Ck?%s?F4(@1E>in;NZ!8*-x_XJ*$E5)1Yd4|z}$;I8gV~-u^Arx*3 z?A0^yMX%q_Nh(HJzj(QmbpxHUwe?8`Q*$VJ~{Q zsNb9XRFNJUszEym&B_U0>2*R6W@#6l{EJQ?f6vx`6R0j7#848fG{Sw5AO zlE`_j+fH{QROx3X>))bIn!Z@sAU)Y`&PEW%U_kIVM5oEUkpqkvRiW?%oSg+&EY*$i zjIA}&kYG@|AEXsw;ckTlE(RtI=YG#}oLl3D*KpQ*b3>VzEx}rKf}Kk(97ET6{d($- zmLGRXV)m$k@_H)CcxZK+#;lR^12^coTx!@Yv!Y*D=Mex$$G&Vzg+kqn%*6~E)}T0C zZ0^m&I@z5IIwM#QBv+HOD9#uc(wRqV5P1;d*SGBu^5843@mrMAb# z4bMj_t%pRu)y<)+?UNsCS zpdSK0&3YvQQ_2Li$bRh3T^<#9lWNQhDfJ1uV#9QFM3(T}VBt(Ps14^D#r6H>s=pGiSD<9KR6 zTDDpRp$7y>k0kTzNY>(~8v2*1y@qgorCx}uXSDoFyJhrx7^QJyq(L=gHm$_(rAoMa zxs(&;0wTdvpfG2ba^+L#H?oZ)5D$!!BB6?LK^7SJyu zZ#kyJP%IN-uIpnP$UPuR=!N!_F*yCRh-L1-D32*p`;ik%~LN8?Dm8%8QBo1jscdbsrG0kn*G)6eX7{np1id$)1=VrQn&(p z!O2$Pjupk@#Daa|acd#6_u!KxBKT~PO0u@ctg*4ASS3F(7Z)?Tb+l!E4PM*9sADkc}!taPGWJ6X=C$MXoT&p^Z zEC3|c%0PGd)T=yeQIfUr%Uq4~2_KY=$u8?U!x=3$ePt+0(Fs6Do8sW!9X3$JU?cB3 zll3(gMJFrN+d6i4wSOLHT4`PX*`g(ig z1*<@5`=-n=g~HyqY=;|6Ofpz=1XsKheJ9D@_@@a)c;qU}mXH-vX% zpRo^a!(J(5PLv{v3iah_2CVTgwosxd9|`eOM0n*XLIsgX-h}bjQD-CO+(O5XSA^h2 zQvH$uRYc7Nip84<5E!J@ljfSk2OL*P|GRahU|=^Xiasj#Ozy%H&`$=BffTT)aAw$y z^*L`~OJ0qePMNRI(`#7NEB<~!qmfO&4O%E|8Xy2+zfB-a2q@LlCaRN#TKJnCRz20; zbSSPKZW;!8OO3{I_~Vf^!5^RDBY&1T1gN+yv4M;#r&7xx1;71gBby1<@TWTwqNbwv zzx*an++VG7;$)9gxSX1|DLzZr@B{aTh>M`xB9Zr;OUnW64UsB|*SQrx%?{H6!ayq9 zU4x4sNRA_!d?{N{XtNC2G>yS8F|UCp#QS~65P}8A$O{_65Z_$bdj;-L^Hzh2A-8IP z#XU2rS87OaCqlQF#q_c!<|LHA^g(O5n9^97P_4WMwkiw_~==&Sa7$DMbBqXOF}Vw$fU zRyJ|ZE>S|4@7j>04k$VmC49%T^{h|bRE13$g?qTtI@1yTue7jM&33L_0sr+L*yWpw zMVB7|aE&XYSAnme94_3*Ip4j)=Pro=Op%B)hRmnE;L4>p1b*yYKR+w|j8zjk5kG|7 z4MVs(m>TRj#f%T=Q{-ucympw9_!%@Z$kCDEB3LyUG=1da`qH4`12&8J@2fVH9&Qkx3EnRdH>_ z`>nz7vXilF%6B)s#Y2MkR{G#NopPYy<2#ZaAbH1&$nv5OJ6Axkz2*s2?HUH~aolMN z$Fv)1nen!(85%hqrkis=dl`dvRXSTT29`5o4K+5^kisVi?knfMeA~rEvhJ)0rY_cn z!#tJCDf?nKEK#gG@K6vU1Kf~OYM+ghUrC03gH7mJmeJU>uZ~tDPkKxdw1DO!q@#W! z1gA~ctDM>0uT=2sbk()On;Y5XV9f$bgdRV5JJpE?8=~p`A(noHvG)H9nAs7`hjU;z8UeyH{Q-Aml~+nmWa44Z8EbtkGah)CaJ@*$HH-xQ98* zk7XGa`@7#38D_HGM27kjflMB(Gk=Kcn;lPJ?um59UT_brcibf6J}W*T%F3^`*Y(h0 zOBu~*!rr5WNK+wmeNlg|Rd>|4Z&-C_D@02jf6$YC>c;oBWl>E@&(bM8K;-~TtNlHM0Y77I9 z8!blez2H8ndI1=!-u*xielks>$lUR<&O#_z*QE@K0nS!vKTW5onOS-1d=By|kG(6l{VUm0_>b;J#S>oWwWj*Gc{%p17lf)} z%S#N)dhqTtr1Dr=x4i@+Q@4#30EI;v(+sxwzFKk6GalX$J^7OoR9gm9=3A_OK^PF_ zF|$Y6g8V)jzP*y+Z9Y!l8ncluTHM`kM7w5ji|i8$o1~pE?8v7c$E-)oE0zWgXUVBk zLos7OOH2?%{+Kcu{|E;W&2#B+sOMjy{@;KZ>=$>TVe1j8fv(F1I#g^df;crD6 z6srbqt=lHTgIsK|*?UbG3Q2tAOQa0+eNDZcrJNfBx+|-%y5%RVcZJg=OBpm-|E1m1 z&VfdiJz>CZM-2vMQk~Ly!E(5gSRzo)gJ4=XaK3e3jXE`CC6p{ZdBdijUv^yj?eucc zJ_om8`hCjLHJPfu_Ix?@Epj#aq=WjYWs7KO{>{vfHKkh*Ck4$C*PQh5Ve{i<(%e*M zBM|LR0tC369;ife6o;g*Zk9`RhNl+G$Uw%fU)%N}212{dVq7}xwV}DX$a|b({mwY7Bt{Cln993&C z6@w63>{WDx0%Gq(`fM%GuvJSB7`pkWOIa^0%qua8(ab6jbmzujKsP&9FPt_#b}4U` z)m*hq$nFJoTsGX|Gc&z$!qd-;5-dTt{wcW#!7-848Ke%$sRr5|`K`O1Hogeu17I1P zA8v`Pk$k!^!1QfO1T7AzvfirX;9b4figkV3Z^y`}99To=) z@sQ3nXJHvB6b5WNe1Y2$ccAFs94`i!DhD7pOw3k>uAdp?zrk^n%v>0R&=P3eo`(6)?qA4_rWEKGy52l)*#H!58fCtgNTA#fo%c08A+M7e+FO>2MQ z@&g$8-d(!MRTM!Vg_x!vSHiU@&HjMBdp^13&)T`WAPKA4!B|hm^(GnJOE`^OK>%k( zLe~uQ{H1yTt81-*?v=3j+Xoo|Q=@|nI|pbV!Td!x+9WqkQkp)ZKKZUaH_eX$_(h&xJ1#be>J}G zDQ5#t$q)jk$${X8ke$1jeBi+;thvn*3!%E|TCZ@LUmKJg2?JkjHP+FK_=nBgq|jEe zY!$>dv6>^38A1j%ZhweuM!glL|DbMUgYml<#iF*~Z&w zWQ}*MIxFWg%PdJY#)^`@nK$C8JCqO20Yw6#$Hz`^?B4ZjAwR*pJb3jhO^zml)yE3IN(7i!0onb0$t`SE7ps=sajE0amt)eqvK}+_Np0GGi3nYF7mc`p2+R5 z3}rT`FFL6}`oR9u0DOSECuUHnQ7!*0f68Rtk%h1ku#OCyQu+t5Bv z=~_j4IHCxgbfQU*bgQN|$l#lB+Rs-3ETnB-A;nCcp3SvzT;8G;BH?1(TpL`goc?Hf z!Wca_b(+3m?i~k99&SDIqz zI$*Y)#8P(KQOVO}=VBXYqQTh_om}+DNYe|F1v|nwjR@{m6C95%?F=wpEjGYx9yNhJ zfeBkVfnb^QZFS?ukyf>ojT<(amB3GDQ_AlHw9FuFi;(I0TtNyW>P`}!?B zNmUrGm7Hb{os*R#|-?tGPtxCb~=$F~+(;8Spri{MLy8ymm7JYa9X|aN2gDj&q1nH3m%(mt^QDQ|G1RM zg-}|vXk3j0|FpXBt^4Qt;o0Cou&mP^@^j%f%+HZ9MLXMtyPy3={=>4Cy;aw}EDTE3 zCD7S{`QQKGX}bVN_|<7|md!O3%5mETTu>jw2gxtzEjHehrC}|$uTRBms1iC6sFq*u z-7#`*@EW7Um2xjOWM-os-D55r*{N*xP%9nk6g;c%yGW>UNMk*WK3o=iDndAICDCz1 z0&BNZ2ZWoD9lUg0Wp_3x6O?HUSz~euCOZd1v(7;TGrRdZFssCD5biK=*D^0kW)83n zv;?d!pG&Aqi@voc;CJk%v^Nfq`kmPBF*1{n9?#M$6qziX`3&CeS5U3u6|md%l_Rb^ zHJkzW!UbAu&wI#I#p&pGq%n0GORRVUr&t~C25=FUE*&Y3934T?G8iw>3l2-|iTga9 zqCIxBx~Fne;bVcKkqd0NLZ3H*U&!v8q?}#$|w-&k0gA9WmMq1ZiMW?zyr0aUpluK)V|^|te>QTT%_V50G=Fn6GKHfv#N9?O>Dk%6kf;3DK+Vvi(2C@` zrAsag0jF0exj8_6U|Q&!#4nKc80eoiN~1|78eObNlxX?LE8$33byX&y14%A-riQ5sy*+QEZF*3fWoyPTJYDr_ zLXNbJb?oLU-WkFwG2+L{CeX1k18V^61gVh|i7<8OQ!MJ&uZ(^<6J)71{FfO$b%^SF zld3p1%KpFM!o*Uc@0VbV<~Dmv9eNRCvUPsCrzMN?h~w2{Z9u8<{t0c@MZWi5LvM3j z3wrDdJpb(!oI1CcyLcG5J+-Pn6T1XR0J<6m|x7w1`v@c6SNu1e-_R1sXhJ4@Rw>w$R6PlKMm7(`CqB6CBxBC zBDjo!yh7pew_i_}j=F61p=X(rFOaDB%!IeDJ}mw{Ei7bd%oC0uqj3GzhomIz zy+KzIoj5Ux&i50Kzp!gh7zx>Nl;RlAR{3WwW99n~qIcr#+Nr4?S1E-MxgJAc7rO@~Ogpa^9B97OuW9W!m5B^U=YB*c_@~+tt?= zZtY<7XxV%8{y^zt#LLW85JP(GtR%$o#1$j(q|hol3?os;%szMqk9$YfPybY&5=z#) zxDYEEghD(UT#f^rHw2?n%|ci=Y`bWhh-RPn_RH#iIpV2EKJxS4O6?rRegVOk8#{Nu z@EPGr9m2bk!#3~QYCy_!CFN5u=RUu!k;<4MkmgS*<6y)hN2zK6Z>EHIS77J*% zSl>>c6--a@k*++NMf}PZO=okz*_iT2Nkpi8FEFRKHb2SS0%iI=SEUm(V4FD=)FAZP8DYA04rVCi1oImX@Gt-tH>#U(odYnIS3OG(Un+L48;qrq zYHFIQ9a2bAXP&I}musr>jw(pKCHrr8|4f`-$2G0a!Iefq8x5UoaX7`3u7$-&ZL61( z%vNBACwh)$Y{T##990RUURDD{uufc}y9(v#CL>gfoM?ufPE-=Z^MRJYYXM43$K#r z_Y7bqfM_(eJ^ya=S4Ta|?K1fMg>as~T9)@lZ>|QprMwPnjyHn2=UszxDK47QZz1sR zleA@K?oz{zq6Uj~%(}1wX}T}MYL^EfTdG=ifW_*9xP`4SqRa;^Q0ZWX%hht`%K}?c z4{)5845N2-NLnw!cBO?}q!IdTWJ_S=@RJ_g_^!?13&iExtVbEKO2Bfo!$E#>!gtjH z@^9a}TBTD8y1nc3@#X=5=fPaiZXV-SI9!?M6|Is}{mx*vShP-F+g5~`!E86~{^QW- z!~BCvmpHYXEess^0wnTIt{<17@~@oR{kyHMG|oh3N+7w?n9!_=?8qbL|q`8 z6mR4rb#O^v!;2NP^pAM|i;Pj)^-RZ+X(`F*tYCUZPt(=gt&R<;K?(;vnaINK)3z=| z1TF{BONpDV2pgy{i%_6UxxRyi{DekMS!BwYVYbI)=#26x$;jiA2z$J>;@9uLM~K#|9kp=Uy0c0xRQ`mjDJoS{%!#HIoG`aki8oZ}B<(bLl2`RKceTmCT56%%G)N zro^)6uRTd9d0+DGRkP=4d-A|nZ}!m6AVCoG1Tm;pYpev7nQVpR1lnaCO&GNs)YPU2 z%1bm*>dfWI)1``))VYU|0*|wduC$g9!w_u_G9iaJC0j13dX6q50!Y+<=XDoFcmr@U9f)=E9o71g(LK$1H45W+H6G1#Md zqSRdX6h4QDQf!)V7ei&+;66cjPfRmcxQsp&?cpw+A!@mm6(599v^VE2CF`r{-2O%G zvcJzbm%4tn#NUsZOy!`9k@u)Da}3kAqi&oc#77&vbF_R7fthNcARd4+EKyaD%Qy)m zfGO!aqdHB;JoY-{a;6L-g8v2F)MeMq4aNv;*!;{Z9)hc`HWBGvXprs$uwCw|&y>Fc z-a%P$b>1CA*b@aRWC!c4{0kTsfmIOj9fKmGaZ}2g6vHavaEB*YDFP)6%c>ZrUwnJk zl)O`9Mg!S92Z0nRKa6IdA%d=p%1O5``BTpwl}MIRseHAwaGh3Te6*d=D22Uu#dr@RLHK6mkcWff#A$w?i_>cTSi{o zvFrFOC69k`_@&nFOM!80wHOet09^nF_}1Ht|ERrU)c>jVN}e~778>Np05yR226$JC ze^P5)z5G?Ew~9!@O|Z#zhNbW?V=8ibPw>XTbwmu88*QCwk9Y`|(ma%SiRipaOL|Nd zPxF)(pl2RUHe6Xpix@y&*-;sIx;U$<(#7@zjkkn)Ei`x*){{}Bw$rqVL$LJ1ELIQW zQl~AW7BnD)iz~XwI|&ctQ0)f{e8Ci`IQFhvHFc6hVdpiNn>f`(Lx4>#1zbHq7JgCh zRqJxXZKYV{udc}e+9XmZD|@0?Cw1Wc%2eTjS`O47Z9h*QY#Bw#?xXqYQIRui9el&? zcn0EMr#WfPK!J)xSf7#V$IS0!ptw~9X0SG#zczBqWZ9k}siT&=eaSj{Q-Cv7sfN9D z)i8mpC(DiW;xblugT1ITOnIK__%u=WAeE71{@M`MkO0hNYSrOQ_Q+=@#kus1SeRv{ z>-1?{MB-et5R79GORb6j*K=r)&*l@<9Mpd+q*~W@7|hh59+LgH)10!HDyb6a5EUiT zWh#i+npag}Po8}xy>wO(v1cI;*MUgkUKG6K&jcG(gW4)CIEvW%8Mp}|g<#0zYl2MOI1>(3cmCNhss%r>23cHqwQlsF_4-5%SCGRq%J19d&m zZwYdc8o{!}Yp`KzmnqVnqS`@O2snt{`95ch^(zDzVMAvw+f}Xjo0%$fyG7M%^)M8V zkMX(-U&v4SVPCoJNBq$^Eu+1{>8qZ1L_&yfsL@K&FbR#y-31M*;?n{pxFevFxeh`w zvyx9r0X09m#Spi`s2?yf<8JBb9UG$1;Ob7|=u>KfCu9V_C!gJIzoc9#Uo`fF0epgX|U00?ES&`h6Lgy}pb;pS?^`@d&QWaV! zB^l@2W?bRd)3-3l0||n9{hz$incz4iJs!Eu37A}o)#s}^*u?)iu_9baM^N$dMq~p5 zJgJ4HJI(vxy$l<0c*x-R@l*zJ`j(F8d0IHBRLU`>UxsOL%=E$(8A5jgFXNqx+XOMP zuV-^jB-*;%T4UF4rdBUp6_xiMsZx6-Z@ehMc5*QVC$oCHLZiK}8_m-I!#BTq|-rOJ-WJXFN-vV*$Vw3JD6hJML67GPxP7sHf0Wp#8>;2#EEss zQ&hT%Pt|a0rR3ct76=S%2M{x(t1ZDrrU@?f{ijfqNH2JJw?e>_ClR_ZRGP~k?jybY ztTesh#C6m?fHFuJKnFk;wvw`i46|^O*K0^oAkO3N;hobTK|U@^HQPiS6_!!w^}!%D zW-QDE{1H&_g9vi$czuPW3JhA+Le`BJ5^f^J?1k_kzK&zv4%8?y9mrEYIPhc^qh6WE z0XB8u_0TS-|2|V+WAZcDl@HRcW}qZvR`11dnJNQ8rHWbk3yvX7yrn>lRetAQBGl4p zVvpoLW*MbfTs1qcLQ?mMQRb=v3^Cl0PRvcSWjKxInhl1v@ByQ{F)}dYecSFXR>PR$ z=b68nt4FxqBgaD0PdvU|>p2Fe%A!*&`5JmEDK}<(00XG*nL0#YWFpaJwKj+VL76yh z+V2zISFl(VeiU7yp4kV=iS>`c6M;qBO|&hOC2yOt;898(;=qUBgBNv6cH)vZe41FA zIE-2KYN@;o0YWqR&=C9{VJuX9mkcip^b2~uOg#Lw46r6i2W#jQ0dRCvajfw}i-$X2 zy9U>DlaE&ihTd@)Y(c%E*=&Wsa?!ObFoi6FFFIEOu=*1?km}#-LLmv=|LlkQWPR-f;u(Uf9vJBago1V^ zA@bL50yfD~E~K-&zS;SjMNHNE9$_-!Z7h-_?D*^f0p4(=GpcsGdfaVY=dW+PLLZ>^ z#+h}3u+NIU(U)shK)tO8$Vnk5n;`-iPN21uP67uAt!cXspi#?J{m^@HWhgGde1TZM zSl2%OZgNBBHsX#u5fknYwsnYclQX>IxVHCXE3uuA>=I#>{scd4w_!gpvr*dsUM`$! z>)2W3>P{L*yYoa+oJp?y9mgS=MTBFBx_z2HJima;9&OMg+Wg&O*625o~YL`nE*Qn#`&82R$Z90-)oq^c!@ zr-4;|`*hI4%R4wJBCbkvQx$@Mwsza_-mj2%#F^gFB6)pxvb$f|-G9e92HV~Tz=5r3 zY&OL(9n-KhYo2_oBSL!Q$LCspTUoB~2`tk~G|L0#%*T|-*#l)(4Za{ID;`6A@IvAj zfp)$uDjB`=SH7n5@c>Aait=a8gCoZA2=7}Hk=udzo>g^A2)QGnC=t+gVvk zd`!+ozSLwsR;X(>qS;>co%N3k=E;xlv|ojn(P{d}cq_U>;8zV9b%PiS=agqWcQF&x z3G!{t=l7J9GijkNy8v!#6L$e&e~RQ_Ht-vfnyP3utprM6|2QyTl{)djX!L9n2u>Zc z&f9olC1zP?>jHZK!SFBziNlX=`GsU`=Fjdr?}aF^{lWr$EXs5!5Zm;Ej#*|!DZ5Qf zJ$v1)zT4~X1GrOL>Q!oDmgK*{XzS`jq2g@xZdtxd`M>)@>Yos#T>8NJ;fbktCi=il zxya+F3F~ZKZ>lvlxGHqzw=xcuO8IFBg7B!zd$C(o$#G*&YAemL8ECfnV{fV1y`sUA z;bW1Fa{Z9eb?Pct(7TZc|G*f^I3%#+o>Da|EWY9feQK3$NU*nr{oqDd5eZ{fE$r!s zr6latN3w{GGS~A}n1{xp!~3y}j{sKUyKzYDm6aykN}vyc98^`vfnRD31@a}!hy#R6C9VV{hY7$ zw(X!QX*13I((6Q#5mDn?GI(`r1s})PO3LarZK)z3u)!AkeC%sbKUPF=mhK&I-gWPQ zSbjv^uM0;j0T@I3CurH~P4N34>qkJb>#$k1};78vAk?lHn`;KleK;Oc3SiSn5p$05Vs%JHF!efknwwXEK)r z60!b?8DCifvjU^*kVKV_P}yiQZ^xD+%e(N-xV1zla5&?82TvBIlc*-(fC*44eq8Ng zw%v=dY>je+H@*thFAx~*UxwqLgBXH5cS+CO>RGM?3qil^Nejy{Sot!B)q!hos|Pg! z{I$HaN*3Tq@!(jXxD80*tu*D6QBM-$oDzy%TMhID_3R*yautNwb#SH#3W?3u2)GmQ zhX@iLR$AZ=Ir!ejn$J3W*-*Ahm1`h*0JC@@@w8GX`AxH?@FU^+TJ=q$t*KMagkCk7 zJET%dw;;gm)7ap$jo6SN1|RE5JZBpaC0SPBqnKDB5McnK?S-EwaEIQ$@M_aN`Ho!1 zwRVK}HOe=4t!bOEirZPuYi^lBWxCfDdpbXD2wCUgu?^fjKiS@+cU7`?Se2rVP&8*^(X-OO1 zOGI;A1|7ZjBGde+eo-Ys*r9+4C}&J`te-H1-+CZGpdOlzV&XuttR;$XEl_qM*H7s2 zQUJSD^3=ILb7wqwHznHnhYu;3E#?GswlU8T-9yg8$2W!j&cO+Y zfrsHaRnRjQv&4WNGBVjsW+Xn}Y7R4dgNunQZ5yt%iF61(WF~|12RQIr9@9b1T?By} zav+S2xG)KdN^0llRwa$iiHM)rM_NB`iDDY-7{C z*Ibw(mkW+WNi}^!L-s%>d?+INgl@(5U3x6URueMc{??O9H+ci6UW~Y$Ss!u(;?7+k zP7TmdO`4_tzia#$+S3q@9??&t^PGy^%1Ie2ZCJyc3vob8pD|zn4-o&gi8$xvS<^;d zu6Y#%s7Pu9chC;A}Q!4Y>t!FoH|y$|jh220nURr%5uPMZ{D zP+0D_k%UST70Pn8u4gs^n<#H83;HGHgYd##1hFD>QHfDEA=*}H^nTcyYGJ0SGvc>q zHwng5q8UX%m6%Z@+C`kHw6hk+n=xiYuJI1*1gn+D2a+>!uZYFCz%iGO2$FJJ!(uq; zR?Q54FgzKX~FZ3=zT_$FXewSOF)P;-e?$8JX+(A#Z%mM^6wI=-7*c?3E z3wGsq^uaJ-gSc56Xa&7M_kg3c=DYpPta-Iiz9M>8KhCcwVQBD018Nmy?n14~_L&jA ziTlpDI3O9K_}91n=fQz)7G88IHAE8CS>tQmOiCns0|D8z)0Ftgf%nH(?7$xNc!RW}ONvS4=;$ZLF&nK5bWKD-e0_TwcLT;+M*qoihjexVj0&PQbk-WT2h zDnm1ixzO1l3sD^6+p@NEq5IL;FYu%=?^;htB3`f_s(n8g645N+J*FoZg;R;#w@;))7`zIKbc8@ zL54&i4?~XDs%Kof!GL4SgQUh|m7=L{W+$E{ypU1K5EF{yR21F^L-mcBu8b*lc6v7c zCDy5kDA1uH<8%&+A|4qa!LA~3Ivzq|hZ+#URv-`>7fNx*dS&ho^bjJSSxP~8kA7jZ zI_LlQ%W`G%FdZ(!VBYuX0X2Pzu`q*l6aMHyWH4JT;s5q{N(0DvE(l^e5NfJf_yeZaNz-4_{@Ic`^k~-u^Xeopo+b?j2rxHb2)D z8w$ipEA>0Ioaqk@YC3e-WnQ?TWGiBPkxF)cD90rx`QlQ6*>1!T${QYVBPmwj0Axc8 zpJDVDhD2}1a;ctFAfkXoHdmeOZ!g$rj73u=VR~%5=`Qj#b|&9iZu0uYlUiu zucWL_Ab_{xl=S#c_#I$Rq%uDc1mEd;3&tknuTnY=?FU_UQ3Uj=bqoZ}5oD9I2;Fsw zpyFj_imXVQzLnXRn>`CX60KlKYWlLoCD!5nr%?8FL)TP>jHAVUXYT#!73cVu_)5m1 zI9YrG13>ihjO{HfQw_p3+*r&>4V zW9itkH6#VRn+|;WQ1H7mr4Bao{>mpfIVX6=0Q~(6AKsU`&hAS=#Sw6!lO=;OqMkSF zud_UTy(`7cmn+4JY{IUV&#!Y2_taVlCvQCw*@8t2WPrSB#CkNm5}Y+tY6dgq%U`*N zW192*pD_c99$Kr_A7oGR*G1GZiX!yA^^zbcOY#+@>XSQ)>qw2+AwB~17qwx&oRSk2 zC^2B7L4o9uw+A-7(b>1rcyl0EfCNRu6@p#7Hs&TGLRG`rkV7_u!g>sYXW zhN&h}8p+@71qsI04%{cSAYx#-kQvL@&pIUP#b6xtkxA4O55O6_7M5br!g4u%e|4nn@5IUV1xrqOlLY?uT4L*nJ66=Vu_H7@QI0D!b~Jxhs!H_+^Vzr9>n=BtPo z0S9AXQGnN$-EaqA+_vTzJ#c1U2sP}m)#F*(pZXNN5} zE~F4#={~dq3K~^3t6nzh_Nt4^cs@ra^`o!;-48L=vnQt@gWP4{l;FqptebqIHJ3P^ zwNEHO@H3W3;jbZ~qx0n6t>Liy80zUYqvz=#>QEJvmV!Q2-}5XDBfgHSM#W(M*n`SO z{4z(I{XRoY)_&c_DoUFx472*o&9IAZTFGsiXs{~)BAFYUQA%n4^(t^4jb>IyDBqA! z&N}ake=?WTlPrSkp#%z{`Ei(9FmetIFdnbdT=To+FNFb|iI|)6$1~IuUZs}AuMH}_ zNM>Bt8R%uL#2S>nmv65+AajJ!RN2Y^D0jpy>;UF;6>kE>?*L(gRyv5uQp5$rJ7*Ss z8JhOX5rW0N?b6V=sKyD-TzwOEuiG&?Bi=x4*TwfxYq1N*W9|BZr`&dP1-A zG(8i&y#klq9?h{+KT+extq5b05jDNruCSu3#^%fFDLlMAX*Yc-VMsv$PoK=C5R~-b zCI($HfK1E*2uVh(d96KKPcA@auQ)Ek^4ubhD;1Q#iNwuFl~BPwA!}glZcTn=3$b*# zZv59Vo4C$%&%7b=#SD%)I`O8*^8L>SxgXSy71szxI6l}PR1Oz1J2KXe)$-)V5GhcK z;T+ZIoL=9zRKye9ysh$X^)U96>vxl`Mc1@bsUTU)<$0-~7x9Y0ZiCN?G_JrUABaWw z5<9&7gI<9EE$@DVU_r24H?+YK6Yl#Eb~Tz*(>dTG`JO47nY0AW{FHc_{<=GVu&gj1 zrc+WbNv4y^6pBXz6CHTjjW=w44-QUClDu}EK7rmKiKy6-2vmYGQ5yn@M)x=;lv$pzM zA`yh!f$aN~*n(%mN`p_mn(v!a?8;#z$mvhuA;PYO;`~OnUD8m({3v>Y%2i>V3R~4v z^I;O|??2+D(X~jdC=(oRR52E2$gB5hs??bdZ;A%Jz*5NR7@E@I!kI2vkE(JD=46!Y zEafzN=!_3oW5;!YQ%1*R$(9xWI8w*?IWzy!{2<{WAi6O7xrh8q2YQW=tr3S24FKl527)me_}MBK*59z>8n~eHkg? zRdVZfSQjxIV>-2@aY8zmsOv7}{QkP@xT5lFxta1@;AUH36erE7nfj zfE#_f#+hkMUBA*@udHms?mOI#ri?-Qw7o+C&=h&Fe zaDj->1H8W7WrJX-Q8)<;2$4Oz=O!tZQIlX%1Sm<=1n~<#XDDJi>Y61I4r&~_M#zxj zU?w3O;7ga7x*h*Dn3~q)8S>ND?sIB%Mjp3LK0R+xK@qyiko4w2^>@u zMG^H`->Q)+H73bYkR~n_TzsKYs*lZn?tz@1!6gqZR_rm{CHp)@-CcsbSst!w@iPu@LB9Qe@t7f?=s#0+E+Z@D`~$n8*yuDRuj!v*gVbGP=f*0>SkDIUnPD17pRM*jy` zy>yfaSAU9o=I~L=|JX?!!a(uHSjLb4t0vh7DSHz{wz1d9%H+M>cjZPN+i3ivk{_T| zeTZ;DoWeI~o=@c+fKbkX5;?KC@=oQhBXD!=pI}Eenl2rKTQ+X5ZxS6c7ZYX|%?PhN zbTQrnkq`)v1u5sIG>rB8%PAoqw3C44V1%3{>@jjp(?=x8Bh{VmccKt7`$g`(;%7>~ zFU_!oyH<2RjD#A4EIDn7_TwczF0N3sO0MAfWUK91GfrR4v@(<3UNY$#p=&gg)k3u^ zF3y>Eaq+RHzG@!l^dX}*<7tC0(+*s9v7gPPXl$T|r9k3Bl__}`hHU#CLpOSRG;07n zij<4f0JCBNpx1NN#C}wR@lRUDIJ<>yNl+6ZVsmoR;S&wv{4rFYL@1J|3A+97Yuo6{ z(bad3g}d|SWLR5&(?>j11Qc(E6WyzT#W9H_9Bv5}oxM54J%Q3rLY)k|K`RP(wPlJq z1*+v58I#Shx&t<_ICUuw!^4o#-}&))nyKhK-kKt>#ac40PY~T9=XxhzPJI)R>D&-w zqQAxcd;I3=vd~Ga7hEh~#$Wmc)k~l4QLC)6f%0}U)0vt0+@#aeI0u;?>UgM`^tI{l zvXMxvdAqbi{qFXHKFUKc=$y!A_j|MiSAZouxEXN{4HwMHm?d@K@H7wu>j+Ja$oys4 z@-Vg0Sj_H!#J>&3erAI)J6A+smXRyxkJ=M<&TXS5f%MCa1a$ZxN?B2wqOVSX^adC| z(0X9*8j8`iD19wt@Duf0_DxieNjt0}Vm`T&z+JkR=CQ8~>bt6fa9j!OqFr$dGUx*K zH-j(9<0RdF8vQ3+V0!n1BbW%n30pV89tY^ZJ}%<%pK-Od=ssc-8929J2h{BX57 zmv#d#dAhqLws%z-9Y46&D-bZF`~0j<86+6`BV8Jfvm7oK8|ez!yTC22i)?b*iN20) z4x_Y0C38@Z?j`I3X@-%jq$oE5EoJJ{x{%YlF%bzUE!H6uOX0EP%+gjB9utU%*-4dC z#lIPRhkKO1Eg2d0E=R1mA+GK$v^D3B6VKn5q9X|GXvj@Bloge1XFGD|oKXk{$FVzZ zL18A;OfhH2(dr|QjcEVh~+?^BwLPOj|0zr7KvFGqEhvy7`*<^V3U7{ z+$G`yUvN0-j(K{{2u`E|y&6SQ$I;t(o?3-C<(YbDx59b3kXDlDQ0cha>nlmsW)`WZ zv+Q5;SeFcVtAdsVqpdO&w#1ebY;MXlfO6bX%dE@)UPBc}q#D}85(cB9uFYcszA+gf zv7L*t9!U(s?KHdzM5@cpX%3(3sGqDu$oXeF>{)b5W<@Ec{ zv^UT4Of;a*wCli_tu!1 z=#&sTF<__|Mb#e6Z^ZSJ+|ivY!sZ#1QsQ1^vxA)}`^`$lh}Z0rp7J(!b#$|!bhDe3 z9W`R3h1e_1?waSzE{#v7DC%Ptor&wVKRIEl6mT^3J{2sLf3Sgl&}#nNd0{>7W9`Nk zyZ#zG-ht$OsgME_PS*qNc(#i$y)hnL$W2*JQinr>_&YaX`>XmYwDU{n&_B|&yNHyG z+qIZmBv`OIV{hnEgu`7#g*f#D>N8T(#gi^%Lu#JiT4wa)$MT-tIb^|*AS^vQ`}xzf z2W@x2%S;WZ-GGNPrW8J{VR0g^JKTUKpty$Piljn`a1_oc)wh@>O$SRw6qWRt?ecn=&;q^go$&#c|^(FyV|!2P!Q{LwYpREgYDhadXP3(qa9Fp%wA$`GUQUFmo;E}PAw{vW)I9h!IvEvwj@4w z09d5?*iC5Qfd~pgclW9eu!W0G2g2$`(*w72)9FE3+$cKW78fc#7~36P58UQTp$B2P zqjZ4U+-UmXYJ0YJIior58*%W>&8=e0lT=i$%!ZEcKt+64zb>YTK6v z(6Gj+Ks)4qa1ba%Wc|n~>CAuE~XDjYF)UInd^Y{+v@&eTZ*E)LO;|_(ZLOARD-oiW8VmiA8gZq2HW2|M*ngmyd zb=E9vr7zlh8*0kC5nga5QPT;lC0FX2^sZZ~)<&@TA`WI#J{S zmw3M#$Fv*QbwTWx3zf5_okq@p-pI!}%g1Q;5o_$v?dQo0^r>P@cSkL4CoP2zTf**J z^3GeTj_BJt~ww z5s%IFbK>`$$rhXunKFRcjeIrn>NnBHhp+0_)Wr{%u9L%MK}E1g^G^e&fR4+a8!_cw z7~t@egWC(es2<3k51CqNVIu<3S4#>hVId%RqYz*h&~8*n&$FFii@V1sex-Dycc^5& ztoN-{`1b(26$VV&%(|`M1aLBAw!(6Ot*|PJ{1qH6C~kdFD@LQ*IZ#G(8J@AiK(WHS z_i&r8uPJ1kz<6MbFFom$=uD$QS zotIO}bOke*tq3)gn0jEcn4EZ18;XC0wk@p_VKr=B}b1=f1tQ0NaY&Bi(@BacM6RLe-tV5i|Tg915>EBaxZ_;M@;+Q*0 z@el|lo7{Ak8!a7Zxq8zSGS7_rTVNU}hI(~-Uj-JyFM%Toa+^08MD)+% zE7L^nCFADP9J1Gd_HCXZOzb^Ep#3~onuBqL_8^P7{mMr;-+zXfKH=4ud2Z@K-0Xy5 zvSRw^FDl2tXt66X2SAzSn!~hW{!=1a5VIggPaFGh#lSYS;x%&DYG!DdMI4nL{%2WX zf$`uZq|BfOO(Ry2{iNd+g^6VJwCulP+zJHAO0$6_pO)&E#$y_T-qrT?&Y~q_Rx%N? ziu@ySCREU3z?jhVpwZ~Op(#8Qn*h$J*7+VguuLpyQ9*eLc~-%Fp?5a8O+op$PgrV@ z4sOJB+pNYL#xc%26CtZC|D^jBg^5IxY0-bhx%t*M@5z$c1eCmfsN|Qcp}Bwix;^He zYv!BSz?4LdN#rF+?|b9OvyNN=$ALZ7hU;2p|A!RL7Q+b)v1f`fHmZtd7O{%?Ct|m4 zSw6H`gel0lH7`ftpkT;P&(>Ic#Ns*m-t%u(nud%eUaAdhWw3vr7Ib4_Vj<9v{ldKk zM^Kzt(?9uN#qtyjbxw&FMp90*ZNlb&P_dN`;V&O{fv4x{ z70cz@hEREg##`(lS+UoH?0uK8a8~-zdTEBS(Ppbb;#wwpH?zoR75j$>v@sazK#dvf zcESrz=tWg7tF%S$ICEvhh(=HKcT+g8XdfQd29*!i%Cy{}SSa}(!3xZ9`J~C66^6Dc zGJ9OCaGA(O&ToiVuNgRi;KX(WZL|fj`OI;(0TBn$F(@Q8H0 zJ0U>fSd%0bE@2VPUd=Vkt7Xh+hc_MTT?ntVD-JfGRUQd^z8IDCXexXcU9D7<5C1m~RYB2%a;I7%rU-+jpawEw3Z!OfqkVTwHn=aWEngE;tp zz2nUXt)uMLN*(qSjO(j27|L{uJrLLXMCo|3_>vv$Y*1vdM@wX~&)m-8@E5HE2zsacS z{Rlsbc=$k?9ynvhj2Th}r9Z1Ee&hdrS(ToQ@;va1jBs4wXh#Sx_BNB#NP>|H-&QIYIj|05>3_}P6~9l`%6mQqoT0-~#y zP0_u@bCtmnEc5N=+Py&>Y~KgX_HRCD$3bWNR+g`9HO9UZudVg#*O(NJL2Fw5F#)c% ziI4Ut5vkdHUJ2V=e2@B6l2%Uy+g#9>*ToaTHlL^TR~;Jp{LFq_gt8tUR;vZwj28?V^fCKCP9HnDq0rcR_OzfH6}qM)r}b*4 z6TXXZWQ{~np7+)JI&L6y_w(mJkhY)CF?+A|Nj)$7&s*Y){`uDHn7z*v^$QnI)HCsi z$al!({D?CVh(GJ*l{j1fqV;ve5qsGq*TY2cdBmNMi7oss7AyRiwDEwy^GQjq4`YNa*A5H6K%yD7rp0Kw{qk(* z?(Wp7QxNKHejtKS|I)9M-PiYC%KBG+wd<}2QU=vuc~Adln5-MStN0|4bV=!=63g-S zl)~)yJpJ$W8mnh3$~1Vr{g%0SM44-pdEn3UIr@9vpXc>1(eq0bVb;m8o|u#&cV1GL z>tCQKb76bLehjp-`kiH-M_Q~`*upM6xI2m!XmPME!{$5mfgKZ}eD+uo^dz`Ff+#{|D0cqs)Ub%Dn#^_NQ!jgux>eQ)I$M*H;;p6(i z8Of1cNOoU#?})?w!BKW!+Q8b-({2cUZRly@I4z+6ua_A|hqA8rO)9H>F@&bkw-=26 zooK}mU>Zb!iX;8n;RZAJuwVb>8jZZq@$HOB;e)lStq(tm_27T){p)df{~B?8?;1zw z|4LXrZaph}@4rWC8m0LVD{O(EC~Ygzl{^W_Jr9G_ZlQps{>%09KdIgsfxLKs0p#Vy zH!A8S)vs{`5yqtN5~YpDkE0#ao5zo%9Wo?p&jviL&}I{{NF!_C5Hk z@#*jQ;X*!7e=7YvoyBN9Y8u_K0XbQ6Q8nu6ND53Y>g95|YwScL0C=OUtDejBY1bXS zIyO1&GdK38lI^V6OZplX5{#P#1=o}c^5mM)bp@U;`yELM48d+B}4p0 zHI43wKRih3)r60vz~rK;U_rp{d17^4=fQm$8ub%(cWYhObw8K*CJ@9%{{|T`&wp8i zl?{;R_b*`E{CA=HMk^T`XHEMMyvGeA@BSPYvoW72gKp_ej+-)$WBQ^B%fHb)t$kUJ z`mqk!JkYG!aAlcOqm+$W&IvwIdy9U*lR(E2JF!OeQE?*8Y1(Y^{*2W3>Edi+k|4i6 z4m--|9A*AiM(bE#K8`xyPFw2-v2}k@tZDs0n9OOKqVxllCsBw@slx;cU?_nLSIA)b zU6#2tZos=zlZFY4OLGJ@p|hUb?tTLEWSL6?B|{pgrZiI0oWL`=G=K=0i+6fRgM=oI z*HBb^SMX1kY2t9nx7yAMH&7=qPnK!oG)cu#k_NA`OcSR_3rd_JY39uAPWza97kkW` zec!5nE7)|}9jdKp4*}f>kUj9@vEtFR`62ju^R0VdW7OP63<3n8Mt}gUy1y5^Gh)mS zih`;UAOLox-3Q0}F+93;(5?HA_0|X`3MqY6C|i zLt3`gx2=v+8o<&fAC_1OVPJ)%6tH|*0f{Cyxh6-25;zD^MO7M`d@1G2ELC$MqFQLu zMK!5mF+hwMI7610NfU&v(Z~_PjR{Je86s3c%oY`_%SLS|iVr|Y3V@9u`wJNK+SQ$fy2Nb@{AtOYQBifkY2^Z!p3276yp#eRYB`UQ3 zy)7;vF(rv1M=;s^OC2mquBbw)3Yk!mKm@~LAef2TbGO(G2#x0%6iKK|ROAD`SyDYA zL1YDzjgj$LY=#wUKZ{+U7}e95u31t&IptgJ1Tn^VNkYUIETlN%2phKS@PwKrG9VEy z`Lb9egBLe7Siy9}<|t^wl7$gET#?1{a0L_}40+}ny+B!9sUZp$H#~u|0UJ=L;>?yI zSe#fSve@ARY9JazFyy{7yg^~eH2O+kA!?$oW#IuPRaD?qSVD{uTaXssXjwsp6x1-a zq=XKV&#04`=wkVMU5jMwVpW`O`XV5fSWS1^PbA!1vQTG64 zLkKl7ulLuAm`?s3V|MF{T9*6iQA$15?IQCi7RkOK}wSeMvSp$E>L0#q$W}{$-&GM5J<6t5NDuvs3Jy*OAav58V+!S z;DRv1iIpfy#1IjI8YxMfDM6E^Ai^S6bYP6g@}mKqEh;26L8`N4`+y23tk7nMHAaRA ziGUe{TY(|N1dI-dimV`#Z?(K)<9J635p}d$ue--sfh2@IICJQ|W4G#ns3<2y%K)bA z@U+DX7%WS+3R+;;9`DOop0g(gQr759-M=fXQihMT zmck4iGWk{uW571djtgGw(+?~u*y>=BzQAdg^34Tq{Il+XJC5pTmvt)=H-T=|&%?>t;3iYOje5)OK!-A1FxE(JT%rf^T z=|u;(;6!l)1&+ckvdp<5lg5n@RX?P0W5Z_x=E*YWhJ`C`aJ9@!iVhf86P9I}hE5HZ z3OY^L2pt^NLWhLTg*k9OC%ltonmKB|6JS=BY37t+rI`cOBFkKo78W$Xly-+{i_%JI zcc`{1+8wH`+&b;X zSkdlKZB<)4m3D_}EALjd6ms-Lc)PyRPfuo)(@;tIw&|4-CN&3|SwmwQ6CnQpc`ask>fXPf?8n zWI4KUYGW8*>OU%g1U&0??Z9fK4&$LbJ>JvPg2qhA7tUDVy(y}Pw1O*7zD_x7r?+7ChZIDb=8Ds84tSDu|>_wS?K z*V*e-N-3q3Qc5YMlu}A5rIb>#zE+D;N-1rH7#s13bjHnVrPSTs-CN#$F6!1ryZ5eU zM;g8}EPAR|w@Mj(DXq2EO5H8REn2No>s{0Csj~6K-Q7K}%2IdtXTzpiTB)s-jioip z{R1aUE48&^9@x?vRjsX*&KhNDrM6Z!me#0Rsby1Zl%+Mw(n@WuY%Hx&Z)k0&E6;0n zZ~cfPYq$_=$B_s1ySw}MePD+(D)MAAX(O_eNFmm<#yQnZa?dFbpuk}mvT&7F&zqy? z{pwk*Zcb5K>C>I+>L{g*+B6)ctyT*=Zm3pUwOZi~`z@oXi33C1ee=q+VCB^bW?ImV zyD~ADW#$x^iNOqUAg;{3GUfHRSh3Dlm8n|YDXDhCQ&KLMYpRy%{W*o37~F9_O$+*` zy2T2qNDpd*d#UHs#GsEz3;Lb9sgqc*jTp)O-^;t*YBj$nuwCT3VEH%8TorV@#R6aY zm}EbR$hBb`_zpf1Y-_!Ltn1K7_A`5tkq#FE-`%~1i=OxAf#l;Z-|^6^dlXyU`iS3S z5yT&gJP#9N??RlmzR`pJ>-GBY1-2d=iaNe;wH|Ew=idDrNNbej^Z38oVE8c+ z_CBu`;z|FmWQecHG@Xm%8n$BK9*!>813m`Ks!N7oL}jE>+;%R55jD zzO?I}iZHqBx|mR{_2n2UkmOqb0GU$iNcfZ^;Q(+O`DSAZBN@gtZ~O1 zVle$qw0VY|lQQhzC<52VQU-0L&U^d4)IxNr9p^&cNReUy0nIE$vJ}@e`xP9KlI8G# ztgOtjsfzP?;t1aZ5#s$f%5tp!leQ7O|3>UV^Ji$}jTeixxvuIsoohC;=}8MzR27dO z6NySFq9P+5M>{aZv8UCBEDR|lDY;M(n|)6VVxu^xOir6zh}!H^ryS21Ao zPET57jp<0PP2JQ^PgU=WJZ4Dh@?*A!?&fm1K>XXQ0X=g%ea+)XeW94#MON# zP2)D-^pzHR<+5mLp(K~;Z>Xg2DMv(x+*Hbn+}~xIMo;eVsiq-wB}kF``%E{{b^3hM zG&*FO(=?u3XqJ&d{bzDF(WXlTXqJ*S8lVN=X0C)c`8Ma|7Uvi#!w4yZjFd5@KtRG} zj1;1wfFy({qK#i5Wz3%;W#Df-;(y)i8gWIkMrWT(Tv~AD)>v|X1wi2GSY%ND4Y_-0 zrtZ>Bt<<ZZOjr*1z{V99DQi0)+vz~G6?^1IPS7)-x&eHngGZTH3$jH~iVpig4( zft%Mtr$37z0(eiV5=n*V66Gk4@c9m8I! zSK1=C{0bzHtl_r1FRPBEj6SN=|HxL>QSRuL;Oi-uj(oCdP|sFQ_aJpnrLVum?yq>O zYyt3>yWKNoZLvW+V!Yr=9u09GKkPVSs>O`DSB@5dbWqfojQ|CMqUZP%TLz!JgfVa3x5xQz`Kw`_C8- z9UgOcAt%>_6FFk0B-z{tCO<6g@Iwha*gR~K-9G~u9;$+A^W~SNTJEO8aY^z$-~@PP znVXU#&zD)|rrO9ngUm^zX*lh^LBHk+f*Ri1I$=$tYpwKVBTs8Xh-FIY>~{a%Dne&z z?!*~jtu<{Lx$>0RkTT}aEOO9;<_hLIzK=n&nQur64S7up)m{p{2T|$j+X^b%=>@X`HBEkv7x0Z{f7vU0Ijmxx8$I9~y#NayZ`W^^Z$tSev$EPlW^~_` zXTHh&W3-`uGIO;fekrAdH4V3qo96g-H!$03^R13DS2jSVBM}^1DcD^prIb>Nl|E^; z!tlSA_`R4}8OYzuFN{&CJ>g0_LZ%~~s-5-jx2j26osnw?U;S0B8F}?@rS&LV9@$4) z0&S=A`5%#InA~%I0%EhDtMKp7w;^lbpTF}Gr3ZDCg4BM{HrH5#1uXw|bJIZZt9iFt zUu&`c1OEeAtuYj7K>a}SX-DfzT1Q8qGfTC)KJjVEa>c1B%2Lt@KX`<&fg>F_Iw&Ht zF{4HUn#KGIh01;B>gV@#nt!xx|LdYE_%?l{HKUb?z1UHQdEg0^Z;m7#i4wsQDoX&2 zzy_)9I&@TySERYezIs#9ebR3id$g1x-$$1>ka!S23`E}=K@_^dHLG`UA*~&fjpp#w&t$| z=%S0BKOb<`qQ^((fk*G#}95bGlCtuAmgoq_Z0)VNPqURko0Q(2lSU>c2)XuN8~W-yd`% zH$rsC?j^vXnCS(oUFhz*?gcqnUPw%UZI)Ct6nWuhpc4o0K!K^?9W!1NZbh|vz+Vq5 zCuYDxxwJ56h7?|NW+37Qixnln@iZq7JmwM;68IG!qBO5KWiMi;NY5)vddgUtB6mZJpuI*o%P&ycM?{doUp>wgOwy86Dvc6RI!4p$`szr@SRO@qb`m8iU#tL8!B8hg^+F6Ux;c3k zQYsgmxLg8|NdcNC+#S(X&^5`)T?M)8T4>5$3vgbEGdMtzB!`=@BSf`t0jqv@u1u1lkSioiG+nl+sA^W!s+5dtZu1)^c$-msYpBvF+^RR`;xqWm^{84!62zVHR$6^;e?I zl-mAFt+gUJ_PAlk+M=u*HK@3yT=N$BR?9b8buY$W$26OSYWEvwPRj5}C8Q+ROrW`U zV>fkE3rRLoP7dYYQIZOZQ}!~pv$Sl7vVCd)ZTH`I|M{?A21HC8u8|t&qWyc{-tT*# ze&2oJ_e5Rq#W)tD<%Yb@c2hSi&V{639D7@Fw_3i{alGAz?pTdfrKY*q)ug8RCpnb2 zWDT4B+oRkq_yKEBg;~$~)?{iLpUpQ91i5+N5^EmhJxi2ehYwh-RyQBEephM5)rz|n z*EFv<|JLH)O;TS!6(9X8)-O5&%fH0$$JdeKZzy0;U7H`!1O$|w45yHw4QdKr7 zsm$@%L5rS&c!PcwXZ$D1)dn>hX|RtSM8P)8w}F4V20qreK5UkGPU4e5Gh4CyPlgWY z{=OAK=tfzQyrZlEUI?}BiuOBNH^AN9O`m-UbgRi+zk4czP%EX9j<-s!IKg{C5jyL9 z66oHa^t~9647xAfb{ThHAITcm)skO>i8*8t{T)%tpqC4`Mkg|TB7Pug4`?A#CA&=q z(J$198L}UsMyAt;dPf6D8I=CLfB$|2RvxYHpN9@;f#0m>&>L@>yoUpq;m2@92mMPRX#6EDknH_`Rtq>g~C9aD2}OVcByIh zc2{gFDZ_pzwwh^y{f~m}Nw%w`q;=BojzfDoZeq|QMVb}_pY#aFxM;-rhM}h%1Gtfwol@*gJ&?q*AM#H5P^vRwgVM@4HZv%F~ z)kEW=_6=Y_LWc(7xuE4!`P}{;S3??rnn)LUr&y1eePW{H`iZ5%RLQh?M7^aRwG*MR zgPB|_rUFsS|Ad?{*CV0q;t#jlc*Q;|VPx0DC+|lrkQBFsN8n>GB&&wJPW0{;>UnT) zscju5s0C4jg5uYy{8V_vSr)|_9>rQ3d|Y=lvsj#X+;n7{gm?mZx%_+zB=lldd%hG_ z^dhwKEr?ZoD-miRFwqq0U)+!i-XP=lim-^L!!ZUeE>aMr997UH%0P+cF5^+__o4Jl z^*SR34Xu#YxA@C)?lszNMJ1m~Ys6bHb%mT6)r_(yV$KHHx?|jkDw~In zAGv6bY?(C*Bq>{62pXav6C)I0`FSHlgBK#9LJ~#Bi&q*`j~&9%**4WfY6&cC{(c@p zsHIU;$BW^uYi5cdK0Oi zoJc*SR=9(r@&NQ)`cbtV+G;-YP^E;Kp4{z&mz3|ZG~Utb262INy!;x!`3odA*Ktx z$1sB2vz8In!V-=n^_%`;Op>0um`9UrdTG)TJd9xgbvHMu@Bxr4{yLuf8Pyr3E=@Z> z7(?d;oD?~bCAv}%Xmt4-J@j|N^uWOO8Diw;08%9M{Zo;}Y@V~J99NGBF1i(>uOLpFvKeY7Z$Z zsWC*pbpjb2(IRR&`gK~SvI%~b46~Lu+N4jY3r4v&_Jd7B-%OtYn3vr~=;U~Zh^aW_ zU*V`jZq+Zny#hZq)WA9!4_1ll58~v<$0oBn37$&aY;JAIp?uV3SW*eu3w41=j3l0X za^Ls*8R~zTT;>YETniRMjT*)Fz~8a zhE^OlN?25Hj%wsH`42OCit2IqZrlCuX0BB#gp6C#NwRvgjRuB_;SG-pvNKc3vNeYq zs-GCZ5~q*7Y--P?#5UrLD7Iv}gRA&Q0eiq5?gMzykjX4qO{625rY;n{3B;XPU-iz= z6fa<5k-jYFb;#Yl4(6PF%XMG|8d=1vS~Qh&YLVR-J``lM7<3p#gEJAcPO^%?)^VKY zUXRZPD8`^zWm$4GaFoSt&pwMf+}f0b&PIBqj%ry_)NuJCCX{+t=I8*DtXx=cAk7tS zkg2brY=yv|;t#b7f#wWRI#nTH1_wi5s_t4bBqoq83#vj=CY=3t$pWzyYPh%x_zY zchUDJrv-o_Ec5==b)=GL2Ek3~6Hp$lCJz*D$efOx0{{t_oYsoKDU2vek5Dl|BaprL zLKZ_!cl8w;6%%_u;3*-RO>+t%Ot5*@Y-2 zC?T~4m^NZU8UB3`Pd4 zYM`xwM)w}9Q*se}kRh4HhL1;NVAR0(c9SiU_bV4bH^P~u0)^0x4$fLtEwCv&AZSzq zTVWbBE9X-|qkNo~nBkO!-O!{tc~3d@=-)SC+*rfrCgpx+1PNM#;GN|mlZVk?t0p8c zs;g#-sER@Vr^^;`OuD@J{CyBUsTCq3EyM_IGC6I!|6e~=ddzk)_C8q72L99RrFLVz z-dr9xOPBqqRVIMJC%j1l?(85$!@kq1Mbl$KNX!i_FzRSpl>^ik0gQLX^W0q6UHL8Mcp;^Z2V-TXf)so_pX0K+DLXP)K zLuC+mfS!*cXdhXwUSi}N!Pa0A=diKz@7uGri0Z)%>SM4qsQt>vPs>h+htpvIaUFUa zhoM;m1C=%i_IS->BCpRx=daX&m?BmxxTF4@hWc!XBS@n-e2QO87+p_wB@Qn=T7^Kj zfTv4>rJAX9;-IV`EdrIPbi-?>sq?*IPB*Q4Q;08)$gfl2DvQJjVxfd@n{o4*NI~X& z$bvMzd>hgfnsY~GKay~hi`fBwqEZiZ2q{&UjrEZGdg=h`vWa}9T6o>!9jPgYk6hs% zc^uS>5}Y>{{7?%x{@Ybkzz}4+1Sms+t_l%EP1QxHP)wmV%7Xr(`t?EVKke7b(`y)0 zxTHNOzx=Yoo1w(c<@8p(DM-T*%q5!uF%55&K7*Af|7*!>3KqxwGn++t48|kfP#?;f zjsVxL8C&TgznoN^-stN+0HH0`m z{V_Kpw1#c&(Mnfa@+y<2422tZ7Ww^eWjzgAE1ewAGa(W+i;Oen0JqL+v?8&GCJdHR z)uz{npe7ZP&8?BI*20Iw6zDe_sLI%r0i zx5#)K?qZ0BY<9SOc?01(Qs|Y!6baFq&6#lfze5aIbWCgSF|fd` z{6X?&Luv5Jt#|3tb6O?V-8s~dj2>acfXtty+#g$p3tK|7uNh6h2GU4pe%d1@GF4JF z!eRaJCU8r?WI(PgvpjAQf!tDkE9noI?vp7}lh56DK@JlP2`VuxIf9882f^BskyNU^ z={9pj!dp{Fb-zs7x-qaHJ~IoJb&!k33#LrR0MX$nxRCBY~kmQkVV#k$|-u`>R|ee2ia9pd>@pV zt_~9LmBxNnj&s$WR7cgI*PH|K?tK|Q*pd8hz@_g6Sh`T)NHbzZ^YMvK_GUN_UTr>pF~fj|Wr2SuTqE5GP2wN_Y}>cH@R8oUAN5?sFIw z24|IjIG|wQTxB&S5Z#yp5qC0UtkazJCS>S!@0tmTD|)VCWF3>{FOA|AUg+8pyexLV ztIOUp2|<52R?dkiVg2Q3>3qr8xMvO$p7gr!2qp?Uk)$B03eW(4Rh@u8QJ%M})N%M^ zGvw6N%39OC!{;qO4H^*Q5E(oFg@J5%k4MqaCpw2}j;-e+nNR{s!kk5JnPMiwZ@6#<6+4V3f^%52JX4< zVy`F6N%akloo+y?5@Pa)hmIUwvn(BJW%6fgFX`-VuFD|dUlinHoUHDR-q|?`^m=}Z5=;)1=Ng8H8 zJ7E`ED!kA1x0$5nD9%N)bzy&_4&#iXh`B%|S=^d~OkfM|80Mznj+%6fM|QTvqkVcg zpX^$n=3%5BWx?eFsMyl=L6zlu%?vz?LiX&V?Z}6V%^V{h;Gn7$12Q@SyXlNkQYII7 zxfIj=gu#h^Vc>4P-G)ZdJut`)j!8A#_#0Qiq^ND=GbOs+t`+t100q)S3)6RmkX+|2 zcz#ny0nQu}?mHn8w6^fLWR2m`4L_%10Q@ILC+BejD*}Gf1*HV@*FVecm42sXVLxGS zOW(YO!4CorP?${49i&_!gY`5jGmr&Ck+fW#FUlC_?R-?$@je!98@@)!0dR?6v13iO zWN)Vt@{^yV@fk-(IcytBli|R|)gBhN@?cJDGBG6&M?y!Q(U$AvFk5dvnG{EWib&EK zN;?D31hd~8V5Z027@09_V=^-crF1h28T#^yu!-(M<{)zHF2o6_a9(yUebUmG8B;+$ zoD|p^P%5`gp}je;C|4E^#Che5c#`B-<=K^&kMN*$QjC#G@>WjMKme?>O`UKeH|RRX zj(`?wCtCM1024LSmB0~pR9_9#X^S@FX!eBErtXO(Por~t>&g9_wJ)NRP1eC$Sp>)4 zRYV!j)&7ml$xeF3gau(hJLo_JY+Pw$NU^jiGVgDH-g&1fHpGocTH160>usY&H5sJh zkHUD?T?8-0pe-({sg&2&lLZSQb%l64m+$FqaL#_JnrsnNn{EC@#05|ZHjRW_zysTV?Bgr&X{Wh{{5@tMEE zL?+Z#&Lp*oIQI^l5SyqJJC=l-oY5BwTpWR7^i9)|1Abk;)}kIqK}(C6nPr1)#I(9^ z5o2?{5~zg1+oDC?VvQemC9eMDNDCSU2Mf^y(kB^@%^;Ar1;WAC8RDa-wTWPVyqO>@ zGDun32;IDca_ZWwmNqmsn;KLc3|}if((7!HwLs}PzkLoNHUc?_OI2?vUQOT|+d`3| zSf?+Zp#n}5%G{(H_`MwQo3!WKdjiuiH$YrZ3h_-iU;pz#WTYe*1Cs=h${+gFK>&PX*Pi5H43G#j^3 zGgtk94c_UCe<()Gp7C{CX9%Ph1M<3n9H7MYwoA1I=M!i=JmA&_{h==g-VAcI?4#vgCAx0vE&cz){)pWLDjLw)P{sNi{k~fPih? z20_x?>QjK8guXy-H0?-{ET!e()gwchH#YRzK-nymP-WJP&8V2?Yw+hj0>bX+%)NPE zZfXt_e;E@g7$MH4q+DYE>4x-Wly2e3{N2rN8lA7KSdgbcE7p>;>)AS?`D;z%f*{nm zJ8_T%8EZ78ET~iIVaE#2W3ugZ;4k2T8iNVSEF}W5rkn})+5_ZU@3}#n1@yD36*mNf zp1o}EJ*y6}Ky7VSjnxS(t5!!?dDN|8cb2x^L=PQSbJTYt!gX&#gJ?h34y#+@mj;cA zBJu$f$@eEAUbsQ|Nu%Olel%qQK-5f#Bsorc;eyBN$O^GRB|$C}DQB~&L{dunxhs=u zm_@XLUXh`{9~+B4^*L+X8M2z%SQDw!jJxqA3eNLUg!N!&HR zFFkaaV|XuGx>)$3*mX7Ap3VIHa(UB{mUd+Pi{H>#v~#FJ`@Eq%?TYOsnak}DNOXKr zfsLc5f-^nK{XD$+PJDmKhAx(vuVn}H*1t0A3Olc@O9F5y_DFgjwBK)J`#xrtE)U2< za1TW-OLxV9v=K}EA6VRQtRKgsSBq#|eTyzhy8LhB8{u>n{)ISr85BK3L>6IN*v|oj zo($Ekz4uXq3FRptKFSbm>xlysqQ8oZx@#V1ZB5p4UCUYk8zYFU*%B71O~_4xyBX`? zdyXhlXri5~=_NfMTjb$VzR&hEyr&z99gv2?f-d+7~DG5kGgmnWp4fiPu zjkzY|xD!^;l@wQxPn?mDAAU3IynB92Cru=Ze0D4dT@?jZWbg?+b`H$;CO;D-PIv78 z;-X@K^VCXAXK+E+oJU$|t}fATiG`$hl&mXf9&#nX4U%@`&#(SaFmi0=$;4K@Fe=8b zRz^mb#WM}Ny-YWXt#rAyWoi)m;&Yox;8$U8LJgNukpqpJ`ZcKyd+Fi3J%4gnb7n9Y zHPP_mLQtbvg%FQVtzXx#)2va`^PEPHAn6_izG^`Pn`6z?;Dj5a1t!y&Jd<46}T8-_g^i!AdE& zXUaPj0ieLRi=drNbm6McZVnX?kw@Hc5L`5*4qG(BiSlG77GbFk57Kb}mUWy~bzJS8 zcNLB`|NJIm?Ar;j0B=)F-fQrzDUpc_-5yyOD@|I)%q@_;$DtGX7iTC+i53gzx7FL#v^x$GZx$r_a`(~h>K_1-d=_$)WX zsE8YjqES+;;FtNAZDSIytcJ$IZ6&7y4TRid1~u);)xb(sOca(7u;Ag|8Dd?ce$8k` z1}V!z!4rmlWtsa*NYtX2(~xN7A+R>$noVW0WgM6E%pKka?z4cA|$cJzK5kX&=crpm0C1m5LN zWtucr7R2J>4D+v=2|K!k4e9{a?l;J_;i^@t>+I2U@*GGb<%#$k6JZYAIZ*?TKwyZ3 zJ*FFGw14%xaDScL?e%BUwo1GjU|*yT+cynJxZnB)T^Ui@jFxsif+!faxQw zDk>$!S&f6FJksbbmqAVcQZGC|x`y+8XT7-jiWIpIDIgDfm3|@TKhZx90iwf+8czGY zO4ma74Jt1jmMbtln(0FpCELDvqKR;}Wb&m29deOB6F`yZ^>s`wX;74Rmd@pufo2y2rm}^X&UV; zL;%i%p9^>r9d5_VdePw?@S1mO68_E#g%;YheQ_ng4AL(Q_LVSh{mdpK>z{b&{6~gT z<4B-fE?%Xo<&jH+0-!v;S@Nc)#_TSu{aJ@o{fd-x12>fy7k^;V(&N%A+eOf}(-FOT zO!l_OJEQTX-($ummsn(9Zlkkt@PUX{+o8IsM&i22_Iy-e%*gBKhaw8zebD11E12cq zl0y61Cc{?c$iI{zAZ*xYC{j!(YUx90?+LCAKk9y=CZataYR&$}7hNU{5cZ0s6^k?& zYcAwhWrD~vA{xIDN);iGhNG+{U{cives?xx_Wk9MQ9qGRAYMS{3H6j~vOx>wd8FX+ z%??$2-!ia69IC-YZ&EhPGf@7JLpwZ<0@_jdPbOR_FLnvoj0g`LEKCUJDprOd}oUPAvmsgfP z@25*)0^>6POe=wJW$&C=?_{nJAF0e|4F6|4?HWS~AH;~adkD*e#%Dnrg-bTQFsMmV z-(fJCA|y!C#ZL7A&NfjVix3ZWI zYi!+@=J*I!Fd^sr79`tI{Sp_~D>(pJV^JL{Xkye9*xMEd?ycQqV!iYj=wqy}o3+;4 z*s7ncGU6GtfDXwhXa|dHGGd<*Mn71;c}^tpP(FlW_PUDj!O4kv``DiI25XpW=reL| z6cOv}Wl3~BrfY4zuD`VPmPlLo_Qc`^K zhvari3W!>&REOf0GZnUg%)`MwjNKI;>>aphz(Z$|mEnauvqXQ8k15n(VRSifsWoOX zAag3LQ#8*-_6>}jdca-K+YO7Nf_3yHhp>1zddI03C+4ae$#x6shD+-bDvAqPe3Z~^ zslFLw;1Kd3FAK6)4s-AGJn$@EwO(yrylk#X)c7lwk%U%Sbjnb&LDjkN&0A2-7}%1w#|KVMvmlfoDB^LN z3s|slTGxPV8jr|AgIgld$0qeR^~SB$s4uKQPW^J^#e_=)_?)_l6S$Xfzrz8y#7am> zDv1T+^pw0Lw8KCTMuCY4Y0iI?dXt%0e_=e^c+Y zROYvmK(jEu`Ay%ogoIZ!;8GOAY>JJ3{K+Oyn0R#ApNi-%ERDP()ryS91cnipA#P|z zaipbaFk*AbpAG}`Ur?IOpd1K*h4#dsg*)4Vpv{N@$@nZ{c#m<+atM5d&mRa!r^BqW zAH@q~WP8y4!$-RSjO~`kCNaoumy>x%9_<@s-W~a4M4Av7lzyb9E34_wk4C*yu!;=? zQSThcMfLEqy60|ueS=*Z`Y&e!#xkq$0L*MoA+q5A%NLuk&`ToFG@ifhJ72S2>*tjsEcuRQR$3JIvy-LHPcny|ZMya+L z)8}uAOKvdMHY-x}T^(=reo^4MrIZk}!qSKiLZgxH=Ghdw--=RbNYK?$7`P~ z4~+K$3?%d{cqK;cDl~Un0O#y_iS$K158(`{NEnAqyYMhDcOq^)K1)Gq`+G>k1~>Ln zs+uucnV1D$;qBneI=a`9GdJU72Y%mpG?Wrs_37fXEZo;NrBg2_U*$*$ZSqwgnmzTP z4~VrFuTT8dj`R=iu`fa*YJvKSSI>hpnzfq58E?ZyY??SUOjUmerF>=ipk&r{t|C0E zHkD^8UdLr-1g0O*pmV8Tqg!DJ2ojT##JuitmXO_|FpN)N%@FM7`jTOUNr=BYL``V^ zB18BXeTzR5lUgaeh@yHuP%_?=ikii|9ew2Po=L-P^e{ERa_>xSUb6Sxh@DDZ>DsDC z=N}r3UzV}vh9Sf4?gXd5<0SmPa>R_aYjt?BUjIXzdD(TPw}@rLF5vskh9khiOuf~Z zCl;Dcf(RiG9;?*_Yqt-&QzXiP;!m**`^XJzP1!JCzBH6F-Rzr`0mjT2L@XtWxR$Bv$MOtzqi*rWl{dUx?&R4L!(IRbttD zI*A7jr!Z&vV0Xw^*Dmo_N320$k9eSNIzaQ18mrQA1peMo-xKhhG=rJqKQOi?%`z#Z zo>1ZTFu$1e!EPH4+B`hJ6Rwh!chyS$pHyhw5Z~n$iG)qlIVtzj9}K0~@g@%D^D>`R z>;zYjDd7dNDPsBuB{FEC#E>w4#8x&#grkvGlf;er%svz1wE$h!ckY&bNhBO5b`Y7I zM9-H($wV!E{QT$~W=CnYmRf5}Wdv;!8V1j4znPB2Yp{oA%D{>8xwM66!U->wX-tt& zaPloxQj37Gjm;jeFXV1+2qGLM@Ph`#IaVQXv<*P4Y%q-(6Ga#mF}T(}GbEVi;hXa) zLyjTBKrGHs{srb52@E8RoMT8Vh_ryh;=H~g`ttk}Lk%87c?co_AE$wsqBPBrFsf_a zi1tFDA<69m)AsEvcx5;D!q!8&P3XpP1MXlqUZiIEgg`ox_R`6WsE?7`)YT+v;D zuY~{hR-2Z5={SZYLg`QM&24DHDIOO|-^hxL36lQuatWnQVJ|=r0a9!;`r6TzRnH24{&v4)|5328mQ$ zoF6|lNR}r~q#*#kLsa^{@@*pk;Eg!W=P(a$jno=a9QuvZm(wr?yKXR&@#HFR%$FL; zjeK6I@&jN4#EE1=Xvw%LgYVs91fCMdJD!0y4}&d_N?63snI0tIJBbteLsnx08H?Ai z%)LBKqwu(XT1K|bOltGSi{wFZlx;KdCF5uS&oPvHek#mV*85wHZoh_V=X6cm^ehAk zXCCyEXHT7bg|ZJE{$9LeB}O*`MPrvUMWcJOB4fANw#%MSY4sLt(FG`T>v;rRm;dY} zH_;t@OSg8Zyoq?9xdmO^;ROoiwn3CoX{x(%e|}c1vx?iM8KD1|c3Wt=f8^`|MMO1- zJ+tLe+;dLKy*nhxb1L^d(QMFMt-7hUAQPwtUBQht?hHYwg8*;z6zQQ82^e{Sgnx0H zR);S2-c8KK&p1Wp;N|BovPeZ0BYFGYJX8TiAPcjJ9{xxQ-d~Xwej!`)*|ts-Y${Gy zdE*4NFL}WE@7f1k-=DdjEfni8y=SEDiqcbZQXYSq%7e{1Z7p~oH{Tvo9mA_vbBEv} zejgT$6u)k3!seu`ktz-YDxPnL`)0b4;3G(5Dpp@ZocSt&8u(aI#O9RD(?ALWAp-h* z%E2$zz-$eaavyli3RC7_?`Mxd&}44&t;kie^~sppbe6R$UIlchAt1RkmxDuoyivYz zCtUn!EWFCZkGapantv3K{{0{*~173fk2|y|6a()Y2dK# z+(v~+15!n28Vm_s%E4OeLr$`0(E4D7DL}-Ieto7Ftu9(D;k7fns?zc7+eoF=FH*q4 zlVWe+8MnfI^Mr-U*%If=4=Lk#gu-sJde0M}IJE|*mhvz=1rltQyf+zav#F91mhy== z*EA+v$}om~cLbc_$nih|?0?w0Xo8+%bTR_V4_j3JpI8$y?*dv$En#xKx}vBtNEh}s zgN5olPC-b7e0FW?$0@_CLnrj z6C9<^f9b5B(``~f3C58vr3nN66|nLqIwoM)s7FJBMa?A`6i0r-m#}M~ggoT?S@Y0J zLSE`QyF8r^N(GupC&N|{5T9-%>S;TI8BI8yvI}uG$yKaYOEaLfp)Zu`$FJHz1iJzG z4+P3fDeAS-1+h>&VWw5~dvmUgQX>{1&++vu5B1r3TL_U&8cVHfks-!iBW{klMO?AhL!{dyjA-?cm`!z3hfY@I{dS!eBJ8O{HMVrbT&Og#X+d zY{eLWo%GrCMh!L*`l8V3f8bG(L>$z+RT%)d<%NI2;N%`mC@yz0d)k z=+CzD_?CbIfgidbNag{GgyoW5N>k2&@>|WY>$SU7*`x$-IV?m7%i-{CoAYhlJeX)w z$(7~^51}-rWbh|It+r4^%e1OIT@QgR& z7ZB({i{|7FY-~Zqi=ZaMaSK8&p%VWOaW_IvEtj9!Q9}I=QK?dAM$1Ov^^wUS4(~3L zF|=R%8A-Cxm_lyPC{rPd64t!o8F$ZOz3KZ35a_HuQ04!pm}7H6fOP)V8B8O{tO1DI zy26Gbjylo;f;^WF<3L9rMNA>gX4E*0zHnWFAu?@R0vDW8`f=GWyojthMR7->f9a0? zUx_LjeJaXyaUi^JkF7;>vX_Ds9$vR8XR}FupY)9kJF!8xhXwYm4cOT?s>OhgGbHe{pQd8`ejX%WEI7P~ay~DRmi)`os^W za-Ol`4U1q_r4cEVRXH-(diWO0f4Z4d?Mddkjz)JUfwq0E$sqn&Pz|LnIRTZf-OXcD z2po7BEIx@1*fGxAOA=-3z3DPcB34@3Pl?^J&(2b*tXE6fwAM{+;HIZE#HvgatdwZr zf>AY3Is3u>w?_M`)P7QK7QaAB~WpTW+cMhL(4Kj%kfuD51U!a#WJ}&0*ubH_g4#$x(Wf<+1Z@m zh`HT3ZH#{f)FZ7Nq|II?jViU?nTYiZEStg9dRaveqQ{n#Q36o(_E5ym%g81s>$O8p z>#TfV!H|Paza}>Txx0Sw2Mmr#;~>M5H&S9zwv2!83^YR?5dC6>I3*EgH#JmguDaO| z{|)49nP(O7-TRaNrsOMT?D@C4HRtNSzyC3?-l%h6t1bjx9M{<*Q-t|=wLmA4#wZ~I z^j|v#0&rErTIU;k2CUr7sj}YVh2hi(yrnCXJQG%s97*jh>ZkOP z{__kc*LAMp8du$QYYY!3uB5To zH1q^?u^6^qxtdrz%%2m0>f5=$91)kqS<;7>MXHtHr0j*Wo% z(_t%!nn+G9B7ecE;emM{UjIA$B)Y4bu;uxE4z=_qh45I1Qr!v$aVK@P&np?8@KtUL zG~GmM3rGXMn{CVn*xTyj%CV${WK56oax!7@^XO^)AU)Y+WU&DbJ{G5QAaUg|lGgPU z_G2nf37puSbh{^wrAOg;+ZI&eip{wWADmUBQpQ`nFAieLnRtDK&j8SXZHa|hE#!b$ z8ZK@M%>%H}%k*(2uITR|!UzFvM2uA}Etd!k)L|Qm4aWxC$I^ zJALHd7*)k~kxHJ3HLW7S0Q^G(y-?q+%O3XVPUDI?(zc6+*xo<)!%gtzsaai-e)Qt z2P#t!PTM2?xXI@e*6E{j(D$9jVrq#UDdU$ixxKQ_++|Z`vvHvQ{O5DVYbCajIp^pb z%h}^)rnb+U+9I11NH+uBku*yA(`mKdK;s%UY|PENCg@Lt_!i#UMHa7}R+H}Ix@jS- zn-c+f&%b#4$Kag&)TNulaxn@3R=8?eJDT)nC-u4`W* zrIVr}PG;dSQku^jd&2FM@#OJRP$tXxtlWOE0HZ&!dt#VIjwmV@gMum#$x=o)a{lbp zp^>~VXKf&cy~TYs^@J3-h6fF|wY7(|>5U+upB&-Cxt;((p>HIE^`iY(t@W)AqUhq# zAmnzO>rA3K7{|?v=YMn@>l{%8ZXF}Fz}PxJ^ul)W5imUCG^akIE+hse`)?1KkYGP@ zq7g}@T?gN*fjwDm`}b6n@!~SG#09Xntrel3pjm^r-Z@!lp*V=Ph(sBQnZ5oV7&K5S9fCLd7L) z*Iy3B41PAmCES91GHHydNyDL@XV+*ckDt-Z%LDxiP6^f&lv;hMWDbm$Fq!eslurP1 zt*`itaR%vbk}dn%ykQ|+%=VcJzX-}#(2E>`3k_4#!wG+`=Knz))^TJ7T&@oqq$ACE zCFW38d+dr#9@5OE*X0*}t=bh*lI~OFeglzxpYk=ot_{lOGIF zLy z5={x#fHot*y^N)E@dX*&?(KTUVsO1USTDAvQ&LE zN$45C=6?+emc1@&(i750HPq)LEqnRC#+dGI>&p=9BYjjU*}U&coJ$$|BBC$7sz&43 zmNZ7v-_a2#(gjyQ^BTw+&uv%1qsI(WT; zmX;~xP3p$w5)Fpk7KkcrkZMwa)^lj8ATD2*v>^Z=(i)YaP8$os5S>s%b86R(=}jxO zbf6`o@6J(xjHcBm7;9-{VItz6z)eI)+HoJVkC3|f%`X%vCM%{~HM<-I#W0Mf))vsb zS_uC7Em+(dn>69OmKXRIpY3%Kw9R05OedbwfH&hKU-u1%r+=h)8w?JBC)I88Yy`-! z|9NZPCLMs9;{-liSj-1cBqKXJ7Uu<SPJr=xF3dsR-e8hZ=)*aj zE=9uJI9Y?Nu|T9OP>-ro|61%CyMmb^YwmmSb&10zQ~L)(YRL~d&~l^}VT)Q+EO;5= z0+fE}>M{00)FyJcSX`e7K?XZ3FD}%E_}dX9GBKd|_uJv8H?LYaZxUE8wk!2O(UwW# z&Fl)Nt}m9s648X$rr|ajXut?#n}5g`NMRC!85I}nUH0G*Ta^FhTeA2ANR!IJ6=E&Z z)gaDfWaSXK-{#UCNm9S$R)u!ut>x4y@p8prkLNJ+hj7Kx-UeS-v?LvbwC|cEE`L_%-FwGS^d0m!+0>_xk=I4wK4)GCu zO_jleAZz&X+DO=w0x5<~=+JtQ6`j-!mPyAdCO$17t|mDGoj$lJANwjlgOqRB`^G75 zB!LZsPIgjB(E3iKKo*n;4=uf?petN!RQDpe;Sl3_1^(_@OR9ozZe}g%h9PV?oG=I1 za@$Kf1k^G}=+z)dOLzrRZt1|symBKAj1j1{tDtcS_r&YFung zfqpOFMlMCBD@8apaiMdzB4{{ja#&mrsse5;i{u?+#-o$T%bZm)qe3M|2R#@`t*3D` zj{cOLA45kpy*atVnz!?F1l2*OnH1aDk|KZ3C>s|bk1CALdY+V|epHQfqiTq{H8hKk ztQr|C)M)=QzAjgyot*&8AY=I3Kzt8<{U&*P=5gaIhSv@}-iQO#7;Km(}f)Dy61eFXXPA>-=QAQWBxC&*@-h22>xSVKfB#rXuPP}&74U=zJ! zlu`&wWy)0%XHA>o0yfyP%tH@$l!(y(t1HAAm;SVFd4KtVCW!F_$8DDO^NqDI+f-0| z=JN~GVH!2@dWOq%0A!&|R~rAbtbBwZ>+>hme17+u+s7y}2ms@CRA|l#3i;UI+e{?4 z)>kq`89*02IuMK`uC4(^OvRK_Qw4v44$CSbpC(Ef`s^|IeoUmF*N61$qX=FH{n--0 zKuIqZOacJ`r-^e6s$ie4!4mN`5!f~pNZ)e;Zzj9vX-IU`rzDTIRcNo7CC?5uF0=V} z*rmL&E?;-N>BdMTb&FPd6%H7$H-SXwnO7zAK{R012yJ*}fZPwLJhQH7B5;GOfJFlF z|1f{jM^oY#HceCb(L>S$|oaLHH&Akua^2)B3QAqYHybg-=}5Xx=S zG`yG|#vEy9`IQ%?VqYadex#Yq(+NG?$nXdEw(%`zZp|$L+4;FjKg(LHM^T-IaWMYd zy`i!-`1Ige*(qY7oY^URSmGvREyW73ugjBFC?GL}Id0{v$jGzZ!yPG%KyT!ZRhESX z@?Y739T1RxPZz1kGgf=;)_b@M2#hfxOW-7NhDWU~Jp)Ua$nxQ~Y@%s5AlE%IdqKvbCeCugBAgJJIfQMERwd1h4 z6^^$Z@*BW`8~q?_T?FO|Ydh5q|7(lvbx`1$-iF5zK!`$Qx++PUpwYV2)p?VK-I=fQ zyTp}^Roe(VJgLGqUIRy6W-N>j93~(*ZA*8|5kp{0Kp?KMQx|<%HAf$OfJO;)6w-kl z_ALM)J4fru0JZN?8_W{(xhm-B9>hcXl3Z*}_E^NhZ-Q^DL(8QmpTUHWMj5~KQG3cC zUPIs#F{Ce_0EQo$)}veaBL5@IgJl^$ezZFd)DILNCt&*li=>QL2ZxB(40w2pH->93 zUN9jPNxWl|Pp$CT;6ZF-LUN>!<~-Ij+Lw6O?3y_@dNm_QB~69k-Iq{JePWD$u`k`z zInUn`A?+;0Pd2(RqRzocs3mQm5*r0PM5mQhcWZVNj4nB}|H4vGuZbzlnA-E_GcsAA zHx-?IO#Y@y0&l1p5_5YD%|dsLRE0lYdLUOgSIiYSQlDgel26sb;5@i+YUt+)jAnH= zw>BJo-pU1ms8Zr5%!|)C#AIY5*aTFPilD^!nrb-25AwWxArK|kY#yfoMkasc>qV6n zEeC?g;}HU-{3s9)e=6W!{*{YMDnT=GSRu6nQSuOT|W#JETL9(5k=ZTq_E#Q zz2RM1Lq0={1&{iSyZ&)=cb0vv=25s<<}(6^2XX&t z$zjJoi<%t-#{EDMQR^XTnnY>PtafVaP?2Yf|G$SAXWYUY0l*U#t3o-Tw@5;s`zHre z6o6iw9)KL7FkCy|p1yr{)MZ?-QHm&7`TA^i8;goeS(%w1Z`y)6^ zO%~5C(=~qzC-y3Gn+d6#a9R$qcJ4Lp%V#pc=^ZMARLj{&7urxTbKbq;vkl6Slh3L0 zIT7>u8D##~IzIon;{prQLy}Q3FbY*)$j`#1wI-Mqh)?Sq)Q3CZ#sXFtmTs4?-iTjQ zR#e*|Jsf>Hd9~rNBo&Y7Jrf?AKafBgu8K*r*&>1wiUv#f$%r#~WX*z)*%to!77Zog zs_vhGj0=7aB?-6$O{ykL0vkvqgE0wPmD+neoHSgO4;K)2GK|XGk#$oZ5Gi)kl2E^l zA(~#P6pBf38~rhg1S^Tn1pMEc)IOhgg={>V5Osi>FcGxig5bJB8IDTpbB%F!ze;28HQ^Ch^ zY|;Ht{XxRF3Q0AJGA<{oR}hy%$g5%#E3bhr)l|j@b$1NWUk4K=Gdc`Yw<`dOMfi0P zs*zWe5JgZLJjw-1SVe5!!O_r?0j(vD;(%?(1qFMa+Bd*R;$dsOs9{5SR+AAIfk2Sc zcwo!uU`)2KD4BAAc1QQ;vL@nu0+31+!Rq3~Lx^J+HIT;*KJ8%R68;d{O%mQezVW!E zjx&Sn&kC4uMKzaA*E1xs_iCs1o39j_I zU=<+6NM?zgJt!6o@BnWm22PqY&f27shI8_|-yte=# z@!6HSoQ&Qg`=#@VE0m*+=W>9g-L(>a%#FoIb2t8_M`BU8Q3Q(NiU9R3_F(jNpNB{1 zdx@+G9_D~y3BW$D4 z3apZ}ekV=&Av$o=_MD%73lc_(gRvj*OwOwb+pK=oaF;_J#xByT2-I$cO^4=d_8|5` z1JnL!BOQ*|Z|y#9 z_In|TuxM@OxXQmdGdZg5D$MXuZ3h8fuJTnGpeE2?mtpI#nK**12yU0j_dhG3nR1~i zWqPq{kg@M!d0VPRdZHi%U;5je`xw?3zJ!iIxLq*^;xp8Mj2H+4^|MDRP8k_hI0Icqg8hdE*+-uY&`sNNq8NEt-U%0we-)v{3Z(35^ z*{)nv`cbKZev64nChh?GuezvS>p7Uv*>*LJzE612&h4fFrlEB-bHn(bP0?98BOe)F z@rQ8G(CeS(uNywnjE$m1|8YsVIAYVo$95GbDc68@2n9yBP^$Q`osZ_t-=Dh~kf2{f zwrio7)Z_?!Nmc}*12HI7#a%z=a?oIFr9`8_P%N%rcx5>Rbc}JR(E-u`jkjj>X3E1p z{&7KESVY&UOT|AB1RjJDw2EcwQfWR01{pmPg^OEK#f2`WMS+huG^wdIeTo5F|7S~G zxrbs3p-KS`)qJSHcpQCq8InOLNrrSSzy+6TQwVAMcUyfoW>dw~tq`M_aPx*QS-yEs zOhyGDY|-t6(ff7<6CXzES_W0AKu-mD^w@$|IJ$!w(@2CNx1Y;jK=`$wN0AasBkAh3 z6`i!mos^bFxw}O43>#%lPWM|=JmOvMAQK6Za~V-V5yEgn z>&@N{n$vKUe8xcfs(Roi(6!0f19hF%&Yx0>SkYOD2)NPAyI>i<(Sp*++Z`GS=dj!{>2{>TZmP zs4Atnp@ybJH0w*ky1vS-BPbN)J>WXCn>iaTN9q-*GezKv#>QDmbNt(&v59HzlQM-L z1CPehp|Gp%W^8t8Ol!ydFF1y>j0OkaoO2$JrqvBf5mN>XVU#3zM8oSv@NK7b=?fDG&w zH}T>)3jB=@4I?p}N`U;XcPOg-k9a8Yiyu&H)yhFA3L1rI6>=N@cH0DFx-dg$Zyj(Q z{WKlkDB&({6tNMUQC|KQSQypAih3nr3Og0pNziND1+q>=qOr%)dMKf#tLZ!eueq4R z4KcVb`=u&`Ji!!zdRj(OcdZ~%IHC>0g24YN=GK0Fj2zKVdyL>VSM!uZ`^}_;SrFdn z8qs~>5Rc4UyjCc2xOEP17Er@Nuv8NpfvgmY-I3KOsB~~@Quq_59wSORD78B}x;1`> zeT;`mT-XD>W|mM@1AH7rte4!8GQ>>kKoDaGpHvJr)R`g{ioi<-hzeoQCy?Kimc-Ul zy62z*QEv6QaKE^`Gt>mN;!ZPH14UUN(ea_9^`Hnn zHwVO%raGl3&B89tRA`u$Ly{Z>94cme+E`G7k;5T+JcR7;gr+;gzWMpUQqr?xG{~g$ z*r1R0+ZY`^+Mjr2lp;iDyGi|TF1}jtXArbCSP*+q3;_9ea?#b=J8Ir*viv0&o-#tFHDc81ycrj1~`Ie z;*&0pYY&QkI<8JsDGw(SzD=B`1*x3kym^oZ2Q%;!{z1PHanXT(fYHsp--s>b2`)hb zFF;==z*0&jv%XFQPVIa8%bqjnlRj$D&FVWBOvRNd8X4vj1XaB*m~qNHR=zBFd^&M~ z@(EoK%!t}0vcWtn!_NnwBVeyQkyJGp%$B;pf)88Z3IIx}P;`dtLtZBMF+upcr~WaX z**!fZmAp+4xzqiryXRhbccMjJCx7*i1R}Y_iNPeh?+1tcha^28X2Z)Ge7}dtWi3h0 zO$XHXF9iku*2%e`FmYUFOK729fL>;Ku7)}W`fs$Q?Ghal2RAhkH(G-i9w7WLQz-7+ zY!W*1DqBbNeArk|Sf^)22uky4L9SU(h+ItjeVo)XoT=wDtmpA5&qEF~s?sxD?Sv~tcuJJnTuK{H;8Ap zQkKb2R-e((nu-`ruI?gwJK-L}Z9_K>92+;TeArQlS?Z$00 zVo_tgC{W?eH91@a5t}m1d%6FZ98)d3QTcTRYnHpEY4u?w>&(Ik+EocAoWkMu2a<~- z=_d5Sr|_SbFyWj#RK*|^lpJHSumrP8vj{p0YaW5>7O6 z`x{vrlY$L=osppYXqw{I9mVb9*;B@HmBYf76An4N)LkyBe0|12(6GRh9h?M7yozeZ z^bc7uE*GQq(i{W|ws9o>p3-BmtXO^ph};4bGx@k96du!4HiK*>T_u-{{=trXZ z&Bm*g(1o*M>p~9^I;uth+QTwz%@LG2m}}{O@Yjc@(gyE)E{7-ebJigf5|vAl-1#`i zvc9eto+{^G_=kM6<0&e>T118#z4tZ6-2#aJsw!~yzgXAh_AmFKq*?~$I3kwS)pG7} zhUV(4AP4*x!okv45!gI~ylABqS}LhhQ0f8VzGL$!$_L5ze35YV7I&IpTBykGCg-Bq zDMG1M5M=amCBdZtFlTMcM;%=S5(D+Y)Tfk%A=yY(bF8SS@;24?Ob3XaFEE|rp?Thh z8Ac>025aHW&&T3WFzh{a68$$N^lw`P@U(X61W6Z$<~#rlaMiWc8kkp@QGsf%-SQ|k zKDI!l>I5N$>Y;Q)=KRYIn<`Qsu;iaG1u=J!Hq+pq6w}nmOo9}d1EhTDC;}Cp6hU#5 z!%>l3#sL|>oupkD;UFT3j`qAh@)+?l7c2c*8tSlI{R?SbcyXV_a~Cd6cxj}!(8SO^ zvG=QAz!$cIW2(i~q8Rh@wy&MOZn{f=!J8PptiXCi9E_$O#3lc5vM7LBDNcP81F{c; z*gG^ZlnKb+*c`ST$SvNl11A`cAbd29@rM|=XMW?p#U4GUlV{?-1mA|ZhNKRAoW+)w zX$JGmx^#1`klZM#U~L0T0Z?ptm=UPni=u+rr^)DwT^f$qMsMRy)A1xN_2y6C=9|mK9H z=;@kJlGX({ znL2K7Cc%`Y&DeJ^xwCF{pC<4b_*V`CrHV<)Y61h-bAtE7ThS0tCNg>7O`r){31;gMN<^Z0MY2IN+Nm7_s>VgrdQ5|Gl{N z);m=R7}c$ARjW0!;DNj8n8Z=-&hO>baYE4#OpNy@$p5DZWZZ%drr zX(m#4TV~oRBP^B{tyaoOMU&WQ9Ce5I#}_|!DcAXzdzjm@wQpTllVZRhhCx9REPWrN zCe?FST#Vz5q$MTZ^~-4cFprPvh&4H3@fP@koEev3R6E`ub!|!rf+{ z^f%n>limPd|EDJ5ZY#dV-*79w#%J*Lfoc-&rs6gD8&1V*@CW$%x+dXnL9g^TT+l21 z246p@CgE=S(ZAvJqrbntikgJG0lkgC;eg)8BjD?=s7bin&)@hP?&oj(67EKRj=$l^ z&+$0EK8u=!yN$o&Z@BSyypFHmq9);P;`jI)PW&Fv=W=D;BMjn z_!}<#AMfMqOHh+=xBMRb4VT}8@8Ijds7bgR_(1-K10TpM;Op0F67Kdr1OA5lo&mpr zuP;=Sa5wLR{0--QkZ-`(hf$MoH~bIy8xH>i-T_~Kf|`W8-T&ZkxceVG1in56H3@g~ zm%!g}{u1~I;BFxN1pfB5$UY7Pa{{K41nO-25!hhc|6qu19|9U|`wtLe+jqbLw*4S< zw*3Z_wH7hJ{sJ=C_JPRR_7#w{?RyYs+wY*PwdhCbBLP8d`y3o?`#pfz_IcR0{T(`J zZ2LKI+;Fq)FBM?hxADWaj{pK}`)HeOe-B{WS1M~Q+MukpNQ3eKGHNZ#0E1eK3{bS~ zBb7%nwtd^0ZJ$OtgNJRu00G$c2`~VnZQrPrfkB#Wzo?9XX4@CQ1>1fAh)%2v%xwD> zl(iNO)iT?D1!k>9Wx4HtNkQqg$o>T7twr`>l(_V2k^Nfv)glSXOmoqK#cYL&pi-AX zDpt%`v~WR_;6*L6|CKeNT4W!WFlv$gTTW0?P>bwWZM*H%uDforS`~Ed`f{~>`*xCt zZ+DV_9jAcq?ESC1JJJ&&`d5*ICAxk(yX6R%g$rjg!HFv zGn9h5eP7I@n0@((!5EOBQ_yOIV%%osHn7W;+q?&zOdS5-_fFfE-h*Bl+Lt-WKwLc+ zItmG$(~72WQ0z^uzep4 z1H~N71CF_k&)D_MR0LT&^*;O%{Ln4NW{pRF{5bM=g-daKC3o5$5x?4E_+Od62-{)4 zKniVN)PY3rFt=S|aE&+5K+m2*s3ZTmGEbc$4aqf-~#-W4v|>*87YY5i00%9Ys8PYZ(C(J2yA z4J8{ndi($qMAK$rbUNGCKDYzHz%MF|#T-^X?+OU!r+o}aurIsfHqT{LWL075b{x$b z5B%ffz(0;-mWi@F^AjvnFbr2+6rpE+v5BLeH8+L!PzA+m4WtXafICnO90PYC7?PD) z?OK7;X!8kT_1-`4npgXN==1C&+5eLU9{Wi4-~Jgxt%~+OofdHqR7L6TXgMN^lj=p4 zLzz8QSWaMYx-#WPix(hz@KR!tqxnor)%pU+b=+riuX*pU5G;!2@-|^S3>6!jD zlx+C_aNB1s+doLoG}`xY+kF9K@iO%U!wWNTK`+&vG+4B-z}SGf*NIq%(ok&U7ySx{ z;qXpDD!-!g6F-eG8t1`ceojE8!B6pvqBqxVKIL@n*^{j z#8ACZTT@swQ*Xb+G!D&m6u$Sy?Dtb9N>E|!nXIl_)go4_!iBY z3s%PWN>^6SQoXHqcXyntC3#$=opQh_MFPtietKazCyzO-XrFQ_Yi>YG`_$fmmbPOr zmNRPX>sC%>wO`>Xw}JOad?()@Pu(M+mtm>xIJ{H88mriLG4S3V_kXS@=H&hHUVA+c zv=Xxdv%NlbX*8{`|24DN=id!(bbK->M4CM)jPZgd*8}Qt+5lmK6)a&?kiiX?E2A4S zPb|PBz%n(^xpl&tR<15CRJ1?4w&dCJ6?**zK@=+`I#Ai63JV^XQia6I8XdIMpx@{o zIU#Xk3a~y$=vZK)vT*_is2uQg$s@<~#ui3sA)2mc3fj+tpxs9Is1gwc8n7-S`0%lU zdN^Q-x*^AgOcm7o_x|+W)7@HYtus-~anwiY;*toG4PwO?&u|gZ#xbxF#^t@(;}}_6 zA6sj!t+uR2MjqbQG^#~;06yO6$NqE%Gl(rX;-KRh#C)G;@5a{yt>-B@=hH_b~WjT$S>F&Tews(HC?i1xWh$_9n_^vP%{S&6%$}UJqEFA zi)gL2whHaqwI#}0>wSD&eBFCL@J*MND-g_Ds%E=(X>kIA;O)}#^kUa8t0HPTynVBM z(hF=bYpctPmR~Poy1ZOnAF8^%MA;SwUAw$Qc_E>z3!jYftYo77xA+w$lWD=627VDt zJ+fDo2>Zr6gsDd&nA!MmY|*J(h2URU-oFq(-Il)CfR--eHppo2zyCf2CS7d1b}f0z zvYR7}Hh1k}lG|dC47;YoOFxsyJMExy16n%#@4*u9u&mpXJiHk87e3yW1VgikZ?A~+ zutqQtc*zcXqK`^ui}*{o@)P6lKuV|9t(@Q=G71$F?N^j0mY)}+!n1N)1{=R$0R>f` z3i?`)e5w-R4+5&;)z=E9HJB6O*CO~OiWLo&1mEJdHoh0d4}PLMd9q;JiQ8)0bDorq zNh+NqjHY1Mt|n5ulC&F3w2NQysl76q1GX_2keTMIY`RF#73E(dkA-Q1W}1CQz6529 zGAvUElir>B)W#oFrXD9HtrNH55!fl6m=QnmjS9P&$}{4&Awi!Xe-XC@J$@0~cDsFW zD9a$z_JsI}#ShDnh@UvXpqPHYg zD3o|XNgf=;K$~bhLNzG?U3HdBFuVXp={*diTh^*m~CT5#3fH#5#1X zy|#i=c{ch5#1DJkz3v#h``wpZs$YFyoqFN+5eBgWHQK&cYy)^>5%0bCUN5gZpVyo= zURfAp9Llc9D%tpb-zO8jyr#UoqH@kz9QouK$LrPgwP&Ol=O-u&Xe3FJ1kzVtU0S@l zs=T_Qs2GESf`Y6H()8+z^6Glpvr&}&M8yEXhqh)QDcR`p14xh%K5t0qT?pG5?XDnt z_g?E5_i&r<3ao}se{sUuK3 zuzE2HJn;Apbqbr_DO`4U1-=*gnYJ@K+P>Mi#Cf|&y;JDa(y?TA8boJ_1fAM9Z|s+! zrQP{y>2z>|rE{rN5WNhH(C5&VLZ|tEXqI=m?LS)bYMlSwhVO1?XKA!oYxs;@9jxl% z`X07){N&2fjJ(m=EBD57A~cq1n(mo2k+MMo52#4bg_6 zvi*hdXg7FoC=?w8BP!#5hAz386Tc_L1kmW zRKX&`2o=B_Fo#K!EnsI%xPtne9-_S2HPJ*KGpG*%6_um&T2B^d-aw5*;Vozs4u__N!s@hHUrnb4g04NFfNpK($4nas~O} zMP%F;sRJuj3`3EH^n(dVjyb#S-{U(SSB%Zv<3|ZvOmaUmqJeP}8S=oRu{t)R3F+C; zkrDKczJ5Woho3o?QqcMx$x0i|$V}Y^vgjbdyP!@IScxi#E2q-A@0d2Bqalw#83Lh>K+6<&28ducz7t)P6 zV;gj)jU8aAmxTO8gq(jLY=6-VI;~(ryas+Mv|WUnRJRKuv#Tfcwv+}&Wa~4(g5A=q zXZDsUK$9yp?cQOqy2i;54L@` zUGrj@dsCc7IcA(d?6!Z5i(~jngHC7IicZhd|Ge+loC(#S({YcwNgg1qwttLV(0ShT zJa3Wn64CIYnP8xRb40)y^Q;(_%ApQ&58E$yy+>zl1%2)x-npUX2#wL{kb6Dr=QmkO zC(Y=ql5_Ba_M9KFV`5WUr^`Aqt;3pSt?fT%oVj#a%zo*_bXQlg$0dUA50*0v#^Xz; zckCW{|K(tELQ~IyCDJ9jO!X4s2LfVjf}pmhH|0SwJt@OtKrYu+Y0^`M}iyIZB3VjXcQVpB}y~VHEU7O)@ca#{d#ekTG1Q}csOu5{r+zv#;uDrDR&S0cooWq?2ti0m z#821N96glU=(fKN9m0&Q^crKaDt^#JY zC1%wn4_H{WPZr8XJ;gZvWHJ&aR;5#oYtUfU>K;AiC~ciYfjTdd`+p?}cFS7nt*tDp zEh{c7?ZoK*v6h&{uH#)Y0f$4B530f&4;P&FEk206g|@w zkkRS5ji7c&vDNOTDX(CQ@zdpt|2yHNQ3S~`g|Hq!r1fZg8B}(gA-3%>?klt%lCZ|jhmf=++*(SkZU9ls___$uOS%sBJ*wqPoY zN1#*e`cuW2O00&EK0{~w&up%Wm+RP_ z9g6s}qB185lM-D}gjw@ujtp+Fkj4_*{xhU4U9&%$+1ADX^w<8hBt(nO@L=U|5cLVm zeenI09AKsD(FacCf6bcxaQjyBAW=H?Egi;k8~(I%1@X%Dffg=ne`boaYKe7NHmn7m zI@YdOo;6}m3gfw1ZcD#D+uuJfI`_@Za$D^(<7E3^E%5753g))I-|N+StADlb7L=Za z>Gb3JkLw=Y7%Gu}4LdDh+rfx!f1S0dYLREvr06t{V6F!zQd6QxIiYegMdaV&3GFrm znw8;i(;|1@Co*CxI&~>1sVOHn3NV(bxWp$cc*ec=-ug7B;m-jH+L|@0iPXXgozpY+ zd8RXvgmf7y+ke)=34OZGqth8Pkg$|IWWqkb_l`!GoQ6NTf==-aOs6>1eOH{wp93U1 zy;HLM+a_af*Mo!T!8=0~4LF)xW| z(K_S{ZK`|naU;G#7;%~%u&^W{V} zOy{A6;qy;XP607aT!*ba>k>0Igb9}0#GoNdr2G``EpOO8go(~if4Z{k9+CvgZS_tG zPWBKcI=9uv7%^o;mY*7^kuznawE`Dv^BnPnR<0s?;KEXb(URpM@q~*F8s`famk%c} zu|vHSLIGuREpU#2p-m%}n=JIcmrO=o(54k!9wuy!73w7hVW@>+hB9hUOT`P8)YwEG zJvq|L7#Qkhtq$rm@L97%y&RH*+8M57iJ@LzT`m$eKR^p;Ft4JTl!gEr0dpl%Cb z%MJQOjiFwOPN1R+7G#iGv9$vg>Sa-_yZ|EoWz{Y0IIj-(b+4>Kkwb-*e_<7f2&t?q>$kzMyV!yX$@bfPAnht-f zk4f2Q2C1dT6~Lu;+c)`##y%WMKv|{;-Fue+C!9YH&b;h0Gtdgm8M@`l~nW#m#ejrjRh ztu>Z`p7%YNz3&6QDnuw^#BD@WkT-mXAY=+%A6x;3uLzcRi=~h< z1QxZ0&A@XmK$at9S%zX5u*zX&x+_JYLs`W8zg zuJQOj%fiCPKf5r<8{vO?HvZ5|U5NDYeg5%|;`ozF;3J*1Ui5zSyjpM0;D@bOudUZw9@a@8_pRHvBnQ@QweQv` z+lvSMIwa2AcJsI+295jcKJGgX47U4MzmIDdycc`;-K+J+v>mJ^2$D-6E^GDf^9VoE z$9;Fw-y?b4$8SjvvWKLP`}p0x+4XOYxWk2?*(mq>`rW`lhwSr)d~eR2JZrm%KANCI z4&sY;%%$&2I-sJXDFV^$rd^`@p(rx|?FvBen4-lO!O@a9Kql{-WT^Nv&x1+=5x*#) z`2OMB@GE%(gB`w->yU+{k23wS!xv>E&Rzy>_UzRWhC1gTFS(S#(q1u)GS-)oOFLZ9 zbyw8Mob&7N12gzx*{7kb7S?e7nr9I7z-%$e<9o5J`J>_`Z&W)s>X{oDY*~H~htUqR z`Fq42QFIl3{2u%~5QsTavBrTM_`ly#xA@;@4iO(`8MOC5aL7KtSf=3eaLob$}Z_6KY3-}C;KlIKa`a<@snB649gUM>V+>WYu@*@{Cy4l zWH+V_%0LVLCo5}y@ZRp0{UvqCwrGN~aOO79)b<*n=I_FPKf~aEH4s~8+MxKU>=W_V zWEkV``}}+Sec04^G-V)v#6OPZ4CD@{jRlZaJ0@It7wI3F_|?Q(DEnHLdE-dR>^Od3(;<8Cfp$pILu8MKfS=<3Dw)bY{97`O-y}ot&)k+e z>7)lxf=HlshYJ*~J6xtvpdC?myr5QK7EqYGmi#2j9 zUDCXznBq@=Ui`1Dd9C96wV(TuSuE}Ta(TO7ekB**BYA)?nkmrZ7c2QChK&smm#NEG3KKo4ivlGR}y0^?9L!* z0;fuf4(sZ~0A^~A5o&ONp#pQ5M1j)51urm2VJA%D4jU1OA(^5DNeofsDJtWo%aaXE zvaoQ4umf7DX=vb5gcl^#s8PaAR-By@V}@|z3L3PC1NBmbS-FAA43;mK zf(WfUD@Z`oZA~4+|_vkpe~3?MiiJ^e_n`i5nw2cp=IM7S6z#0|owKCm;E6sAF%) z_^{OltA-z(sItUi;>Js-#0cg%8>~m)UAvyx0#x;cl@$?j@XXOs=@Uim%F;v#F?Po2 zAm-j+tJVru#9R<-!ov~_=z$NJENQrU*n{CbktNL&Rd=9#V4BFh3+4p8hw7N16hn2I zkh##iOopqlZ3nD-s7}@W6`d_SK~p=`b5z(XdeGmlUQwcUs(0?8l!J`wdg2Cuy(fyM z{qO4a!Vxcg?es)K0VCkVP$vi;wAA1(P*pt4sltPnsU`P|4o@(Y5d?9_jb-7J!<3ph zs6#aoL?5g*TA;`=O^kqtCbDcWRYN+glx3XhgBSm3T+Ve)`cT1BimB1(rZM6ht}FviRl4s^&IvdA=2v}|=QI3k*z ztzm>@jiM;ATw;`rGodh1c!`PP@<0njJXxX&AE+`U7^kZ&BvOd72kR<}1*&Y>;e{x; zgwX83GQTD9EcXJ3Y7E)yO_AYYDO5qZVL&wmgA>BL@d7H4hFwuo3Skz zV($ZU#`pnEJb|T)5N2A~Gj3^PMTsMxpz`H=!u^8{IT%>b0fsJWsG>YQDZ>@zGV#EU zAo-F8h91PAQ&2@s;U!5NB+%Prhb2%jaYRd*B~m7p+P60Ue>J^V%URD@CEg8(3x1>N1>ZOg+ zfeIN^Trqlytyqnr;%oyVq#Qw;FdY^@K&^l_VIf)oRRNPjo2m~kMlYE*z`=_b+EnGB zK1LgF$z-9};EvS|C{t4bn*0cwB^bSAk^qbgZ3@AlFUGsV2CFBDDJWBu3N$+n`%N`| z076e~yyXZ5^^*J{Du;?fqnAwfh8&>SpiKvua)$}(e@iA9S!mM=C{Q!Mv>cU^mCfg zp-pZ-Q7KOm$|!Z7hTFnchTM5 zN%tT3?C$PB?%Lhm-Gkg!xc|8Om(Sd~kh{CHaBtz@)pp(XtnFLd@f*xV`xNi+*NUCu zFf4}0a!?X{>P1Pt_|%(<;!)Y|Rc-gIwtH9Gz4obxwcX3w?rnK*JUUKTdYB?ijuBy1 z=AfykwM9w}SE#tG&XC!uCx!${kiNKx?JvR^6tHZ6yGxR0`}@?9E>KGD=v>(TcPvT> zs~NUG23zumYRdNaxPsWugv*98v|)UWT!I1PZ3@E_I_+#p5nBjp3;hdnNvQS`kV~~C zR`!b*Pa~IJrVY!w06DqfRIDuNz}Tnh4161BDdA96`&peM;Cpd@hi&(DwK z(ob%aFOo|nHrna9M=un}>~T!ef`;PSGB{!QAh{GWu`>w1M=pU#tnBZx+YYefV7=s0 z8-{(Mg7!7oE8ubhnibn0Nb7_fs+`b-g6&WCfg*JTy*gMV`(6{=Y+XSONXX)ZMQC)` z?w>2LQpIBXgXYfbiOF{VPm6oGf)Si0+}ZxP0vU!#=pv^CCfon&A~k1>+V(nP#)||f z+u!vVD7N#E%^G5O<#yX2MOtC9UbE;*F3Mtbg1tz; zof@(59gG%82fIYrcYfmEQAVdRHvaV7S@cpl*@2@Iz|ltc#p^p9z7^-(4b{!}#17{~04^PdBC@X3=fu&MbC*54%t|%K4}fd)hhY{4!mZ%*^3M zr>_ekEQR=)AI6v#^0NqwcCLF=tLr?=!FJ9z3++rq{J?Fs@SS#OrgneeXZ{@Y`rA~Z z{Bd^fay&cdw?SsT+7#W}?EJQhe%IyCG+lM>#Qe-JmX76Tep^*lRaI40RfM)0osx&yb(bi6)+Ne+b4W-=M(6oYqosCi=cnOCyBI(7 zhdB#%+4+UsHk8dFUUnc7EV)Cc9T(LMM#weJ7)A!D8Gt)I_f_&G?-otbO12NN|0wP| z_E~K(&g0w#&kg?Ns!1(2_?Hik@}uz|io3)HFP_`AK@63{iNL?54L`vLJ%<;+;wSjH zbQojWhM(e%C0hT_rjnPRY0yZdaW7wpvTXj3?m zlK}b)eohQXBb!Y%*r`|f`1fLsrHhG)iHV7cfltGWzFOD3Sujx0X~n|2;Z0PFKo~4& zuew|QQ;{x_V{fdZdD~PX@Imi!p536!eS>DP)4Ns0=n{bs!--D4YUfpM6EVc@0K@yYOmG(!4iQFTB1}2ezh5RX072u0^thLCy z**-Xab~f);Edt-m+ol$Q&qIt(YZjIT!CH%OV)(M42aRZ7w>J3T2j#4_2BOh^{>k$M zGq^?B?9|J@_`j2S2M8Nm#pMj7}@iQ8O4JZ?`qcZFY}9TeGiMP?PGuxNgl6 zX_x5xgw&*3{vHD$gy1&HZTP>pOH?S1?5|c2v`%o)=w}t#R|!9a8n(X&;T{ov@1Lde z^DBa)({X=4YAYzwZRfU6t4X8jlnc{Bl_cI+iSr}`Dpy}9h=rA)2DPtgZmq3BtV6XL z-Js8FvGqLr8i0v&LmD2Sh7g0M-dmivH^j3x#r83{!^d>$S$BGO1#)p}_!%6nTRZ}7 z?=4xwpdm_9qt7VkGKc|oWYidO8Py{EW4gM%KcGqV*>DNatDp1ZjCM9}K-*^Pk2BhC zj)1o{>jgc}^K$mG4V{<0@Ws#zJ@enMgTya%t`A`E`4?H%6p<#w5 zIb?wXNdE9clgSCKIwhNdZ~OoKEo(r+{7&cqV9@r(OJqOBmZp(Kr@#LmDSc*|UsrXY z-xl0O$Jkr+(Zbh3a9cW4K@Zr~hYpTHwDx*^QTcLmMAsBz?9)OZbvvzLDu!Oje)X1= z+3C-|)_p2x-&ig`JrDFguPnq)+BIG_e!=9X#n2 zPepC}m=$1wOdwVES$Ae-$$8EqiYwR zt6jVJRN0rYYgZIw8&};UjHP9@Eq=4Dy$^z4D+u}%@gqBbEmK+Dc&GVkgSjwcT*Pbu z`)1h5ptF*-WrG#x5X0ASYS|zdB(RpUP>Uo=MBU9AZE z>?6Cr_~Ne|N|!nm*3}~WJFIl-YqovwQ(u#_trkNasSkpIV&E8<1M^nq%JwR>R$;9l z$|{tsR;;_@*E)_P63vLLmCPCIYUxjw>5pYvb!pw@EY)tOShsDOVn2evt)M85M$mEb zr#PdH%^T3JP9uoiwq0rzSDyCp$!)v$yxH1z2fHUL3b37_+-5&V`B8OS?TTWz?dK9$0GDIDTLk zsAjz5iuSjT?=vCZw_k2ou!MSEqIzH35@Or|)bl=Rj#`^(-Y&|3aE~y0Ux-%{SN26O znm715w`H01_p*jTL!$H!ZAy=;&HM0kwc!tcthVpNQ0I2VJfneqXI$tzWIxtm(L^t!2GJ?ELp;{P(? z;k`oa&uxA$uHo-uT>tYj=--F&hif|SoY98#l_eiW9;tOaX4+erPu+arKq$l zc7;KWGUU*R004jh0K*gj04NX&hJ-@VU^p76nkpX@01kwvL~KYI%EKs0VHjl)F@_ie z2ml0t48Xw5OclF9QO5tl3i$Ci5W_7Q#ZaU=a+{sWbJFI>Jex2Sb3>qAJm;u76RDx| z(2IEGaSBS+o!_0h#ysb@+obq(pwC%CgEQwP2Q700k)ozsif{EAXGl3E0cMxtwmhcU z1X3jq({j1CzHmMn(w2aDPQXqeLW5lGVN=-Oei_5jr_FV!W1U=^iF51K=E^ahAk`0! zxiYsi5T`{T4VoQq_t(uxG9@wE8+;DsS|~SP0kMcFc`b$*&v2ZaNJV<`_2no1ve9H= zcl1DWv4{oU^=y($I0W^<-*C0Ngd6q|}1Vy~+pA=ybKrHCK0TaTf;0Ot_1!VjxsWH=i(e#kZw z&lQh5YKg@eS3gv5{(|2zQZ{Pk z8O5@Sm)nNa!)BFtc>Jsq++7AG(W^IlmF+QpU|>rlK_Ki|W9{KV-|T;z&KMgvyrJ|f+y6;baq)4eFd@tM&+*Jcx1=EvyOJtpy{otxrh-Vg_zb zFt+fZ>+jPAoN)&+C(AKr0~^D1#wDHf&)QGT-Y!nwj-io&?*%$2D2wLUs>Tx6`4p_T z>9mBEz8j9|;4qTOdRvPKbgKTT_VUrHe0-o0GThn-5$I{CP_#v|oNUph_L9pq5r|5v zcXCQoNldgq+2T>`X_?qjAo?xvH^SUdtBeAz{PEJ8mqTp(#?K|Z8umi+Mkl8&eij8p zv<&~^thetVWE=>M*v#rQCp&cBp7Q7bSwN=04`M9R@={H>C93|*$5{?$u7mAQ=rRBc zqMlOMTJ6^W;6`P&H^%snpK!iAO?rPO7V3?GhN~q#WPNilZMp4_0xNP6K5Le=Ul+YO z6C*0}j_}#g0cVcH@os4KFJjjgXxk^oznZ9_-^baA~d^A=Kbd!SEb7)7}ud`LqiDK_QS&RWAaqp~kCo8=%|=kya`an>VY zsvLg8LxdLwq-z7j55f+TOMj1#B4*ILkF}5tpu~K2hrzeOHf(lP938B8AhV$39gYL2 zmLSJm=6wa(`Zds3BH==XMG0xQdcU61&4$J?V8HY%07{5dPf3p~cck$heh!o*!w<<*e*+E|e4SmCD%ZooZ= zX;2hkPD4yiMIvSiHq8U95V%*Xax;u&Fs^UoEoddYblXmwR{6w?^Ct6$VySYCLntIP z<~mU;eN4TGq&CEpKh(GtnNDmr0egG5bhmL!l#T+R3F0_)y;eK2mBAb!x+WqdDmJLC zo{6&~6R}M@`9t)i2HW8{t9QeB7h86uOhP|^#dTl*sE}>jj{-c9GL~^&4c8NdRyfq> zCx9MYYZFJkkh&5Yzrk48hwn)CUg-(RV_OoJ#J`tAIf71XML(LzHoK}@fpV0W`Ql&|dUPyiF{nFO0_{ezco#|np-vGLVjS-QEw+iZh&u9V z(s2L1PMF6>hQgoea~6RT6nsI^FE85V^kG}+?8E{Q!>=H$b>?5BCs68n2D-xgHFZN( z$^w4()NX!0J4AHd{q!?8_DFTc?4*_6TbTL(5>X*s6>L^NUG>pf;;Z*afO3?Tyxw6E zU|S1Ra=7tt9Y~z|su7Gis(@`r@v&{0TT4*uIX7i-MsOqe4(AU)S0ws^GR$Dmh)kc} zi3egsx`d06?aNWqbk_D6%r~CjAa3yL_`rCOR6x|r9-NHQ1qHZr>MAW2vmk^-W(n$W zxO1?Jbrz{nnDg~8Bfwg|DbQ9*P_FYQ+M&k20ZOm>h^Z|ZM-Sd2egsIfX{{6>04j`9 zJo~A8P+SBR=z&5|<(oh+vJ_QHIrvO@fGy14EIIM7y+h7=9rs}1RM|_Y`me6`B)keo@%!g}8k+&Ly(O#@(c%%M;=My)LP1P09z^Jr0MOg)mFT!HA6~=~K zD*oxaY19)ce+~6mW_z^M5p9{dZ88SrPvX|npZ;!kOIau(4uJ3~ReABoPRW?qGm+%? z#S%m?>Xz|8^fgWgC_TqrpMuK6;uh28=^P$=BFm4C*FY(t69~Y$3Jvjwl2>5{kqHl4 zgfuYTDQAl+bTF7-ayU!wDLJQ0)iWKGjtny=kixOdx*cFI2aZ8_k&BxxLMV`9*KZ~y zrpKVNBt?6D)bY5;k(Elc@<{P%2}Qd7i}Rh;_G4sb4QQa()eBVe95hVB8{&`@f(YPM z?*;n;^A}?5DnkXW3Ww2*xX~fOdqf}5E@aCjHZtYj|AP(rfse9>S`MVWq+sY(#?17+ z@>|7n!@u}ve0zrynvRo|&3yiJS(Piuaww=NY$!dtTI)}Pm!g6MXerE0TFudU z3>u!S>m&*~af}69pAu)avnkOtaIW0LI8R6eKgPwYsjGox>qzZNq$g-81<*D@TVpob zCB+WxL0IC9m_ZDh5e_7#`P+s18Dg8lU8-Wq>x`i{d6cn61bw+xc&0FwD1iulue##B zHF)M+|9LJlTiZF$^1-42JuUuFUZe|-R&2t24%$mgRucdEDe31aP`tLL?TdF3A>dk!VoCH!6P|LqG?20y4S6r?dqDY^~s(6e+G!{L->&TU`?%Fb{raRPU(BZOd z)4Pj*q6~G2L$&#QZ9>0X?D;SK9feOn=6eNg%Oh~o8F0ZgaTee+P-i7Zk}rNY)v}?~ zdvy14K>M8{QPXFHbt7{{Or(0x{?S=C|D3p3A4_RrEJ9vv#~T?zvZZ{Avgtn z4ekkdgo*;Mm3B3w2TxlJa)(oXS13UNB#&rs?7plXKzqWA$6SX%v!E8dyquD-7!E)j z{O40cm_BrHbmcQE@!DvT3SN6NR!3}>t+t|cBStuHRuznhEkchea5*pgnn-x5Hd{SR z{S?bE0*4CitVG3(<=Xw2MS@GZNX`*Je)Jy&_6XYlTXiV2e zeFXT75U~OO6Vyu!Fv+gJ_#gYi$uDI*k6N($q^6yc31DgB?IHv=fG`g@lnGp5xN+=P z{Js!((kknkRTY5SZN@CXF z#Lq#Nz?rN5PH(&NRj^=@A08UXCEhvvHsQ&>V&aqA-yikeI1G!*lre;&}p^N_NNOrn_9u% zvbJaS<0uM`Lnso#GjHV6g^<(~K!tb9`5`A!r{P%&G}4_bzDmTebCXr%Ln06oMiLf> zUXOP}ZDAG)3S*}EhzJo=rt`nCtyFmY90)-6r#eG6#~rxuwXMw#7%U>AX->LrbqlLr z+i%SS%$^lGm8)+il%cMF7e2jtRd|H-$D8gxB9ViqIwKp67#bX?cq=oLDpPKn? z<5=h__M9Q{XxhsB<4}&3RcMk@JiE0nH8&`-^u}Va(L>u-2wX$Lb1!jUl;B)cs7+3i z*`H%THjDP1hjUp_NzYk{L8o;LCOp9l}Epo;VpR4+!g7?V1nocRio363I=#KfJj(?X;mG)2fAINV&?{;GX^ z#1ZM{mN|M}tmfjdhxhGN-4ysToxoXBHDJf|PdL6V2SsCp%M%DQ0J+G09ze{taorI^ zzv$FsD@D45%|ZrF_%duX=P@B}r&%Fj+8Zu=pgWjKB~bItT9UmaevLjecU>d*hxDpg zFn|AS+dzv&fiTfCokwe_vafSjq!t(~o`!!ZOoiO>d zhy1wn1W+~NLPd@El+2er_@#B6!~#R!vx>Q82sM&3{Fj*b^1HZ&7Is9%dQ;t8VE&WZ z5lD>V+njm~ltX?6i`KU@`cxQa&sZO~=~z-WfL-sL)K~A&g-5Ht1R;G99)B6f0G3uv zQnl&oHICZJu5uZB);3!J1J@f6W|Bk#&GN0$dw1cDZm|M*WC_>4cJP-9+&=e{o>Aqn zAv*sQ_%hCR8DP=cxrD&|41-}=wyrlUun#!#jCHIMFDG6#hqg9yV4YGL%501b@p!Md z7+ehHOJ>)*}To473zZk-U znz+<#GqP9b3Ks=N!R9}68Gq;v^`GI6pBE3E>HnE5D(!id2bJl;o)xKtt`e~@wDZ4^ zRHeq;w|V53eV$q#dBFKI{g6kpg)^3r|}ccWeEB|h5rTNL(o+6>ogRq6H0QJi?tC0Nz976Cqes!3Gj%H zmW}&&jf6JDYjBHdNcj9Gdg@~OanauZV3EE3^-pog4lMeOU{28@4EwH9{w3Skm?&1e zh%W}woTT*MzuX!8ox_TEW*khSDa;rBWcWd6Noo(L!Nc^xfm@(LiwzIJrAUPC0dA%M zO>PToc8rO zSQVHhAv&zOK&gbEi7SRxvkFEDL&o2mr#T zcnAvy?L0J_?isjZ*qMXZN5WE9xuljrZ$4Te${DeaRX#h|Cw9IgY&c*#}s#`VE&L}jODRo!u7IL1Yu!T1xvrzP)u|DI~Vk9nu1g6`I<%! zKnmL8%4e9q30kEv@9d`y2=GX$p*FFP)YG$S@@VJXI>=)E_XWYB9&?cMz9?HP?jNG6EbX;y1tvV zXEvU2M`HGJjq6%Qj4ju8Xn#5DV6|v;CkDV`t`n>t9u8yFejh}XPq`&%<0WQ(r})Nw z;WCxQ8Uf)T53fO;(>I`(QhX=#*5x-D_;7ZfX(NoouphDd7SM4QF?Rrg9YZ8*Lxow8 zm+S24Eo2lN-vd^{$M$^ZvkjDk)ouWS-N!<94~sn~F>Y{yDjaAsj9*aH9{Y3g0B3Mh zgiabMk3s_Mi$5Zlfqevu2McKkMvVM}?3w5^$pzYpu*?+O!7{VMr8zZz3j+l@nse&F z5SbURJtl1k7ao2_UD6@}B0&1wq?4%)m>|(;aEO?$eHLmFMq`>X>bclp@X=MzWNEP0 z^f~=F6QVg@q9Yfxc(eC;*U&P62}NOOfN9h?P_y|Kl}_P*JyA)?K7K}*ROlh~&YKR$ z?U97Mw8Y^E{@N)X2jEAmF1`u+Qzrk8e)7E4@xYS%w;yikB!}@S8_JC}I)3ChhFo}D z9nAJn7>f`&(2-;5KNGT81&**irD)H!+a=4j|G*F z;XAPTO{pN=7|-c6^bGV!dn1I(*RqCbprr-dv){KC+z#whb4s(8TCsi^Kt#Dw1<4#b za8}_BI;qnTmFEKOsx_MZBR9;U)FN3L1K0MMIG&IlpHfSm+E<6|3XfR!L4-^SN`NCu zRlCQisAjN%F`N;i#p7OqJ1hrcLWqQ{&-{EgkZUmrPb$(c^Qk5oY?Aat?byPylqG<9 z-v+cfdRi?*)}ZF!a2IoJ6Wzs1d8hAWl8QheJlVbz-_U{&pEkbL2 zg2=?$ADtPaO+`wCg9fwu9j!$Cs_n7uO!4>IJ-EJk`o_dECGAt%l&iUY%Q}aD#VEff z2sc|>^9+*r>k^N`m0II=+}(aN3mxm$NK7MJ0{Ojs1KrLy!nkzNASd`CT&DScM`Yb8 z5o_-zBWt=q+KcSgia7(C^-8%BTnq(tmXgT0d>Asn-hd-JLY}$9cybH9fkfpd3`zbC zk*q~#=On3-x4w?6!Xf`Xmt5y-;21OgtrI0{Z`rxQW6<~(i~bZ3%q3E*q5K0tZ@rQ% z>`-zthK7@})0pG*XC#kW7h)S_4?4fwzx@Y7TS3Ld0G;SO1t*CyU8Vucg=`9Qa&A9( zKeNlSLq>%)*~nO2*p=Yb{GzC|=y*`CXG^jRrvQZA9Xs#LgQLz7OAnNhNzKmr`!~>@ zp0T7L3-*Pk9&nVr~CM z4iQt9Zn5WUYi_#6kon`T8gMEKj+;Q`V@jy^?N!9&)&%3gPeJ8^(7SY80|{}4DtkeO z1UKt0Ak7#d`kW=QkSu_V0+-HkDLcF@eO*!F%_YyX_F#)TG8YVRGfjIa0wX&o$i=j# zbsxJ1G)_7=Tbg+;5d@d#Y&L!cIL+#PV@mu}{zif99YKxoDcCAiTBh|OO3Dn7vGu|~#%lwb-GoaEInnF3 z1Yg8hC8$GUV9O2tl1Q2<=sv^nc7p=7g|p7BEQ31Ny9=lq~6&z(De7S;L>lW__`$ z$nF6(zS~d;(*_i1g@ju|Q$;1lqBQ^oHSqK*t9J#$UvXVS9HCL5Z)NiyQ0b?tYRjS>=zAy`6Trge4xL0F zn(4)r7^&~6jFI2#Vqs{v*}2yj&_i)ETnUhB*tqv0J9thpF*z3a`Ew|SdEUySyWq(0 zVH+d=9GLV>(7~@r5s3v-4g+2SnD0R;@g)vGL0*#i(O86%LLS|e8J41r7?7hT@`Q?< zJZ~8W2;=`Wq%7Aa1Axe|HQ-Y%5VM~e4I+&|PbU+t47|Sv6a*{PRT1D6LhMqRL>LLK zl3lx8$BW8DnX7l?ep1v<|B>L=J+-8d-DEN1;%x?^b>NHRtL6%tC5Zn-7Iiz8B$Iv{ z*ISCbO9>hmF0pUgc(=n`Jo1e9uT5Vzuw6@Ijoc4bJCE zB1AiF!$x|~eLCa(7ZvS>pyW3TJS0Ej1f5tu?PwFijzIBCN$BVU>~K4o1gy?n^#K9D zFRFvAF8{5l5cLn?iFHOAh;fqV=G+iO?#AV$YBL6|U-x5=Tn%+Xq%qXR^^WvP3$D!{ z*QKhiy!3%nCLRw#fLw%|QyP+?@RDSxogPcR2?tGtmMb5LY@i+v7H32~g>3fWUWEm> zgj}EVgMAQdFPOR+M_UZBHZ&SeQX|MAW>Z^|s&L8e&%=XZ{ zlr36*ip?$c#e5f$+0&XJHpPi6iYPP2>WE)dD4M;SNwFhnJ=HycM1lfh#YeynA#tNw#CEnSG+KlM^#if7795BXb`Gn@4L^CSU%39FG#M}jPMju1@SLhgCoP8XG| zV<6rO!H6mE7G#Y-ZH7@_dQ`|}0k{~7?Lj@{9=Am|;Z=;@{%=&G`20yP#cskY5O9+X zv~>rxA%bjBD*8a0H9Q|;>P$2@Stw8C^qO*ESMjo=l|zDQB`{3yZV}DQSg+(M6CEEJ*r2(FeahOghIDL!uUG z1^ChXNjZ<2YjZ+pa$}J@77H)N4K*jrg^q5R<2ap9-E70FAvPm}F?o&lzp7b{iX!qS z>Lq_O8hmCW`V&iN!(^T!SdHS}ZLMuH7|A@!5jCp}=+i~({^wEgh06E_tm%T8G9 z-;6MmSTi7T3UAPCMEbDGlQ!HuIcL%iYii-2giEs^H|@^f-0~J7H|Mrn1xJx#;U5a) z8^Cet9q^v#mF4a6CCm)aMMQ#225L*0$rTBK%uWgjdqjOJ2hP`0jBAE(SeZB?u;5EW zW7sXa{ghE5zKV~<_V$_;{WcaSwyC_J3tEKU^%ApyMxNA^iYBpidPz|ji}gs8gFp2Gy4LHQf3E=jLFB|PF+T}WAaz^{ zrI8^mH}UU%0ty_udU>D>DurEIRW+R24@9yyxw~^ZUz+5CLEj3Rib95IT5*XhB7fsX z6){*=^n1}tg~anW>YQ=V5i0LPKSLH5Y(s5%|7Z+!(o?i0{aS;GOCfPuWf@nyeKM1DF zERI}St5ARr4rhta(FS;k`lC#71<xa$s43PIxRx2)jUA6&3jQ-*BbJ@b`L7VXPZfxb)Qb{6}xPjSD8@;zR2)azKjJ zTW5rK(Cl@4Cz9a?@lZnJFezCz0;nQ*Fr3(dHX0I}jjv>&vHd_Rz34?NE~ ztuUH+X+ALgrM{ck75k)8nypDH;AG%KdSN-CFRjvdn|TgKg_bCb(l71!*g;WB`Hx{a z!Gyais13b;cmn;Lh+Rsk(|7}xR&BLyi5o$o!v(u#xK327?PWWPIy^6m+(;dpQMGF2 zc^jkM=AA&+Lw_$Xei?2ZB%s3xZX_aN){@f>l@nt)x^cG?i z1w6)-DW7RL(f36TEPjh>0(q9%%+p~S6@DvI;ZeIxhmlcDoAl3+M176nkwItp6!f{R zQ`R3-(_4d|0TZhZ8rO3O|IUaTdt(-j%sd0|G2H}*tD>6(=1E3i&<{#KX++JMbEp28 zqAdXwD5b!sI{6%3R2WPiSOgmT=(6uE9VeijZ?Mq90xwW+%6)P!S{Pb*O+1__&@s(v zQZ6FVD{H_Yvz^I--V+2da?Lp)33H!vPN6@bx-0=S*hTM$Gi31$evGP-ZSmdj z&FUtZlbd3874Lbv*6kI5%hTfkQf`4EN zNb;W79FV2hf)d(D&JBC)^U}VPZ;D-U;g^rjX7RSz_8F=3xsb`5G?5&IdvohI<(;8t zgfXe?uRy=(v04F9H|pkQ zYrtFyIdN$sbhZv|UYq{FeX*g3kIE59gjeWFIIqX5=WYJ?9F}}hN-;4`6H!8ghd;lz zA9mAo^+b%D#p5>J_KkSPkQZgG(B97G*|p+0Ru^4Loigmo+k$`aRX8yy>&9~q09^g$ zOk;9bvv^;D(2YbmbuZ`dpV0%#-8m$Yux#9V9Om6ykjhc{YWOX8wX{(jC`y#0Sc^<( z_>f^j^%$A^U)bW#P2B7~*S97kLiCXL^ysZr^L(2xQLD+mC5!8~H)hsZCes?(rBV#ZaA3uYxRWp^=$8o zjey1nu6p)Dj8`%>VA}0(tX`#6m*oc24OSN|2wa>i%_AkmyL)*>6k>n8klg|_-@7Pd zs2;n|V0s`=Pw?nA62iE*cbOYJvkKKy!y;=4)MV&wK8_W|qQT*WA~wi0V6Q-m;H?-e zBw3a_aX;J9H#0pya$&W{$`e&5fMG>=m@80Gte&W!N+I|9An?8xsKq$D4JRPq=pOd7 z(W}q#M@kq_H4cM6zKaUMBx#_C7F7fg?S+?V*O_@4w)H9C|8=dQ+*Q<_QTM+e2!XXuA_M8*&S>aPvq8WR)0NXF5g@ptAXuz-gp2y(l^{?7 z^?iRGI3<`d!l*)Y3Uz;vsX^1*snlD+{7SQg1yUmE)YLsV3MvuDdQ~O?R1!KP1Dv?p z;yl+6E=-!S`%H=QId{UsV}Wa4`~q&tZ%zLJI}CglbDitzxAS~Qu3r1n=El6+LHWZvKYVi^CJ<5f>OrE!7&LoP~ zOd$M>(TZdZ6eAZf4ln^YP<|oop04{%6R4_k30Pz2GOY`9m5D%?t)-kwdc_0^kQ+iL z1fO(mr~Cr8PeZ}sVJ%^Ppu*s`ANlPUIK1e6PqtJ#?5(n&APQe}>plUzSBsbKU4b?f zK6e{O95%%7RUXT23uU*BCv_qKCx}e)LKJ=@PZFU%IWy}7XocVC-Z`8k>HK$Ay2b-a ztS;5_!o=rLM;Gq9IoM~T#>mw0l?owcWu1fTf8W&dw5=;Tykg)Moa)ypdr*vLkXIaK z&Pn4r^rC}D!+>k!2zLXZSjz6)PIP&Y=J;2MHsBeD+#=SL2dPjOqg|D2O9&Nn#Wb-y zGo9U`9k84u{#P*-h|INsgPO|I#OS)iLHra|F>ogu)atuhp0ixNW>nT$<;=T@BI;p% zxeT0{8JR@NSe}*!^je%6^WgcjDNgV1I*w;QrT-hmMzZ+IydsUvi|!-T_?yw@XgASZ zH3h+gJYyb$s&%CLi4wZNm^vSkysFrgj@mb?ckp>o)T|wNR6+j@4)lMpbvG&kUoq$zkL!#Y>7;upb80pElJVMvx4rKrlBM_o3VF_pU(!4R z^v@yQZ*<@><@p4&K#&_2@bl$#nV~jxqA1gG>NyoA;E=nQ-<6v}pA^D%_gezB5{2Ga z`|ZFMHoHmCO`jbnflfQ7hpG11Voyb6imWj>_yFjQnpeu)nluZ1JwL!pDFMzi(9 zk;a_|pl_t>B)OHdrdmRl5?cxSh$v7ir%7CUQ(HGTWNI=gNS-L#HN~MGxOlBWKReOY z1ck}6u*vxhvqA?J^L$-O;9t0aLNKL-^T1BF&l#f2`=)O54s4*uPks+X{(2Y*LwI*% zOk0b=7%^Rzg;XJyaq%j(GJ@}Wxhf5N6x!LgD5aJfDy4f@Fq~zR{tJZ=9U^%lEIWBh z9r%kX`U3zgtq0N`E%I~A9bzHe0#mS;!lfzT6%cAUlj>&%A-AQveaiEkgTSOn$<~dQ z?V92vU2QHt<{O;#8XUP5KihGlw06c!HskZAdy z#)O5~u{%aT_gR2&WtnB_<}Q7j3m~Pl{@VsjMIKRF$Dpr=>3INLQWwEYNeO*!N;)fm z_y3v6ZrKv%MnEt};3GW2`j<*4*)ahF1KwFHD6lwXzX)i3x~5f&s@D~aIs;3s=E#zc zIz6I>pXM8o0#3&nymAdqcO@kZHz3Es>4=^2&Ct_ZsF4RavUiz@Ff5&NmQ`)uK0}3g zc5%tlnb{U!%G0PrVY_45I&A>AZb-=I!6EB=6??52sqaL1{ zcP4h6+K_Y+a;g<}f5{psKcE*l{c={H()*d6R0Lx1hLQ<5oS_9PcBZZx&}`y2F=Gdlj(S+Ta}jyInFMbr0}r-(x)b zkmTRhU>4H9w1zOqyhG)mir3eSl1XdQSVNLvW;Fw-!2SeX1>{brNz2N#qxk+{_{!-B zk~fxyg+be-E+EPiwOmIROU0lhlvRd8t1-hZmN`)mUI_*K7E|{fV zg(*V*QS4-rp|RA5`C#CC$Wh+dekU(nlDsXXm znHespgC%jGb|o=EQxReHa`}rKJ+bX_eP()SVgR(1y3(k|v3n>!%l(GaBjf8ds5S(w zmSZGDttYKHQTQ8S!HuOUoT3nrXcI|^is_)ikNiZ8jZ}24UDeCBC6+QiTZ$T$ex^iH zQ!+K@`N(o5?NPc*TZY*;kIHRz)F1Ex@6@Hw=NmzU7z+Yj(p+bH-A%;w5|3Zb=0Mkl zsID|EC44A_&^c@*Iem8)FQyt<9=^Niu-&BQ2}_bcdV}RXuN{8;|p_DQSP&c0NUrS2lr29V+eM zvv<3?YAc~J?Ly=J!!bZOqJG7{Wm+fNNt?)q)doS29TxDhLjeMNKqO>`80tdK%&gez zfkRra8${N_e9fV*@{V`Lv(DkCCl&6bs=?;x&LAZ9gq`uE>D*(H;P&+qLbb6ocGlv5 z;4bTx1FpA+1V^QBQ@DSdNkU>VS(~}m^*AaO%GVJGy%#_Eds?hd>Vmp%gp|sN&Hh|B zd5vfu89fa_T=W+=sxe+hUKm6LFmwj$lR@*>NV|s6=4iwm)-clw2N55;8PXAsnn~@S zQC5mXDM3h7gc)DmmxQN6RUp3jlWDAMVVVQK{kH}teS<$kMJ-2;)=0bT3tpykA>w|< z#ud!*w2Zxt>d|7<8fg!6pg>LHxk(NIf>Be2t|O|K(ir)!%+QB{fXAFxT|=^OP;8L) z;_;q0dU1q{TZ%V)(h>{EG+CaKl6LR4Fgx8b4;N#S>U@Kd;3qcteJrYDtmCGjPRuNr@y_PErUX#T1DTj2OApi1F{%NEYoNPN-7-Z~?#L z8uS5)LdP%f582xGrmMZ z(nI!}(ni$Yt+Iw5s(z|`fuY*H991eY z@Oq^fzLn$K5}-6thM-XB9)vCGe4AiRY&q!xvb-8{)+5rlY|Oukm4#N%rELJu9=AA9 z9~I{J8>gk+zQ5t z_Ot%oTQH6zRyV|*;wijDk55fx!JmO<4ekb96Etxs4+Wv%Lt-lkuDS#EriSvaagvN( zm2=s_W7qrZ#nkG3E&S%6^~X(;RZ&*2=b2$~%EPe~aG}=k+z>?M8QTM}$1E>ZFuJ@1 zv=aP!q{`@l*V6pRQ;oCbmC#oDX)mtzhx_?bGI}|cSO0p9yi#)cs2}UUz2Zl^-Zh$m zQp}fFZl#vC16=eiN0YyZ;CjV9XjO%$k-Ca;Ot4UM1y@7_+}zM6%haW2^K!y3Ph~vN zfI2x;R3K#|?OHP4*)4&FpGtKbkXnEwLwMbiDYK~=F34M1n}CESWR~$`6ar<~<8Q~l zH0%$>bTbow&|nqR#wqwFhC%Mt(Lj`usu&BIn_GD`Yn(`EtGWvDuLPlk_=Ao_Nry35 zyWz;4Si5qZ0y_R#j(ipoIEojh9{nR)_hhV-n`Z;4Y)Z|w%|63>hEuD)Jj%VKwWx*8*asT(!j-Fp~St-2tK-|Ct_^NV3N-Cfa=kE^mqxaC-er1-C;L z96V})qUpXlvSGcz~!Lok}v>h?~U{lk$#bp^CmvN=Zyqio==f-pGf7fN!v~NG87K# zinEha`8b*BU^o)g9Dp>TVK6S|r$qc!j?=zHyqZ|r0xtj)qZ(iDi2E1n!^WT=2g;DF zH?`d%G4~W&8*C$LcwaIf(?BLIpbedc+rR@>P72!f=oeb4m)2<^LsaG|h*eStNHfzy zp2&=omRQl*;Vy6DgvxSQz1r3HyEu%>Cqn-swM)miM>4IYWo%HRYl{% zJ&aYM$&{811}1F`G2O%Tu;;gQl_(l>|5^mfv1-c7TBL#(<>Mj3ZqrckcbAhQL@JHX zw31&+eq)*0;z3w79+L{!dI;r;{P^1MYFQ`;1b@uLpi`)WE3+Pb;C=PfHOPT*} z=9HN@U@lP1U!akq&?sp2Q5sR?@duPXF*nF=1^Z~VGmHW1HSgnD)Esqhl#xS(7N4QKVbwEA>DgSNn>qSVPoi<;DT&m`lb8B>w>8V3W$PjdYk&2L_oHG;qYwlvmsi_ELmB*KN`>{4NMzuUph9;pqg`I@nd>T7(dpfbVO150caDP@+g_ zw8AK^4WI=ybF%!`v4Rv3xLa-6VvNXzp!PtSj0?r3v0;O6z>81(sDZe`L7JprdQ{TH z04>9|>2|Mb$(N`Gr_$B9z`|WG3cWg(P>D4uD99iT`u$|P+^RS}>XS&*A1m8jw4Ma`C}xgr*XnJ4?zxy;#AJ1q;97-~6CcVYop z_|^1){nRN>kp6T#DcD7+&Oq@#R#?`L?~~$ErCW-8XUFZeZ6hWuDb?(&gNLYil2<&8 z_?}c#9IdH{gLAA&da-<7OPe9j2McQlC zMFi4!eyfR8)MqViK}PQ3jB8;aQ@N(IJ%9fvOYn>AwGQNoODAyOT}wg|tKD#v=Wo?d ztW@G)@mI>{P;+D80aGju)2N=Uh-9)ZUhaKsT1WsxECA9ga^bk4@r^LsOtKm3d1gI< zb+SU0oYlR?WjWeRJ=Y8Layod_{`=^mlVx5Q)0q5=#I`?(i}gX&P)V?B7%KDnLo7OX zWZ*;ED;_}8ta3+wrzpvJC8yv-DjgtsF&d=MJ(Hz~6XC|rhm z3d@xRwN-;zPuA-%8NX9Dau~$xg~fWGZ!Qn#fY)WW0+(FH+9P*8EIZYT&_8G%kA*-qPe+q}!Ag<4 z+I=Z1=E)BAlrANKm?~97lJTFfKd{!vK|JUV!iyG=@Q3lQGPHtM^L*zFXD0hup{AO4 zHBob~(<_$S+q-v?am+WmdVU%N-(P+RIO>RBTpb0MHtfh}cjLR;*t!7$ z>s>7ke~MU7PcP4>5w48U5vi)sd?fbKUyyg+so=y^DW;MFBYjG2%lC_nR>eX`V{ZGw z7*29Fu2?*6r`6xYe=E|R;rNr>9YQ;iE3?X=J>dU>&Sd(hrIOw}EkQ=yxX_v>bvs1) zDo$>J11t1|YPD$KWNT00cumwQ;8$7&N|&{g2z9$N<#UTvEt1ZRV&B8p0!6YSFyCZe zL-sG-l#5Y(z;_Z8eF{PJQlx0#s2`|;Joi#56g!O&{383bj!sinFerP9=Pb{(1(;Z5 zc~XhlVA9KEnjcN6y<#qWid!O9u>P03bcEUPb%0VusTH_RUYeKqdMuPrppY`Oz{@nL zbrLO>*oZ6D<5F=|W#UQ{+EHuwqOEjLO2C3&iJ8_A5vUWZ|C6)rIR<<)HcBQ$k|Wd7 zxI)Isj9u=zpklQ279X&Bg~*^GwtkFBxGjX#0rdLl7NF5D5TylN!+~r96=36ZCoDJZ z_Bh>u@UrNb7`!)f{}!YG&?mFpAFH~j4F(=!E)Cdu==Zhv>3^M zey3RMgx!T7cy&QOF^_VsKW={?&(Fwykf?9z;opf-up9ua3c@LlUcD3{__74f!xIF8 zpa(aTkO9rf(w zg7z!D55p))+?0Hg6*mA5-TC}%6R7QGSDN2>9%ZM4uQVBQs@q~WBJ{aZjPwt~$p+R! z%5`k)UQJf1(l&S5wdpwnxJ5X5W4r}OvA3a94nwP0RRSqNhj){JBll3ns#v~B$^{$O z_B83~Y%t856987LenR$SGUA7lWWKpCUa9koewCA6&%yG{N`$c#&L7;%VY}TGOiBb{ zrAyvADk&Lld z#WKjfMhcL6O$-8L5HbTH!a3BI;G{h33bJRcCYgTgFsba=3B8lo@@YyhRStC3Ok)(4 zg4;n9po{d0p=m@B4IhnljX|Kf0HyXS+Q%sf=ltoV!GF|_>}UR6D@TDJhwqRkXHt$(un@GkL=Yr4e~9<&2aZGazi4(a!tbs|yJFm4?HElfZUx z>Z^(|b<(}%z_}nJGg^R$i6-*G_;Q>CcE4PURH(7entGj&x3f{azVN}VTwYHHJe_UlSWX3s zh$JJ+qb1DdmCzH7xp~;bOl-A`JHR@q!5uPUp1PKdry&(0BT#+r`?C)+<)9k#p7Sad ziz;Y!?~9!HxVjFoB)Wrdh?NSM-!*JT2SM*#RrF)iz>!*IZU%7x) zHYsHlKPEe<&jT7oodY)XSI$I&xOEJxkXEh&lyfyQpK54eA$*r-uxu0AmDfKa zWMi(E<@G@Gde>tssvsS#eC;gL$SZKuQxo!N5rT!L*$39DBX>VKPfJc(_4~UPGHFFO za?6(DLjj>l$Kz5|YQ5B6V@wx9R&b15m}cuBhP{Bu83}VjP|I5EuRTQl<4(_NR0o6D%9OLH*Tg6#`AC) z)^^N_?fYp1@@ECAp2N+I`ae{DqFTxoJrC5wNII?MF>UmetU;=>1*~4~V1>E|Q*Vq= zd_i}Cddvr$x@Mw`TKykZVP2XnbSdTj2KbsF;7uS2N705@5vU@ZLca542Jg@i=?-|YaK*&ANRFUDO zo9cnU;e~2Lf56*{8&>$i18hU&yP>Rci@mp)p~f3t5)Q&}5AE3KBa)b7`^`hOMuTV_ zXIrGp{+y++2@0YKR*I2w<673vkLhZ@KmE)p@(-;V^6M%>3Qs`Wk|scSJ*4Fyhlz~8 zJP+EhMM-CFPT`IJ$W#0uKr1GGQ>TU_edB3uw!VZZ#3p?djqq-F4o5FdgYCG ze7t8gr$!T&o<2e?R*par*_N4Xxpy#?E(;Rq>heM?blMh+xW`1EkHrs}J%mITKzOMi zy$<1%2Xw(e*mGF_s{jDQ%PYGs&jJ9&LAFi}_lRI{k-hFpc{UDLj@zx2NPxoJ^Zh0emNsI7`W;&tz?aIuur(8QZuFm{oF3PelHm}<@#HVK*$#_EQer_1 zpo86N=|QHZNk|o>R3}VFw6!USKu(BWH$G<$^&w+eNp=V(ZHrX}h(Ls0^DO`HEI!8q z(!45j@RW)ZC*0_-m^cEWkRQVx38$!4ZOc{eo0M3P7OA7}AcxA)vjbMY8b?c`qo-^G zTMzzw@F9WF8sLPdj5k^e!6xLuTWA~k(1@@x%EA{ejDO9u@h?6*{>88#|3h2Lxsfb} zN@~ZsLrlZZWejj}> zBr{v8ol0SffE(HY-LHHo?yVRoe6ddn{pvBH!=>8`o=~a+c8&teN@-R)%y6{T#T6IK z2ut-bpUay=@AFzhsJbqUUJ}qsRv>%=g(fvRN|mIvf3*!75%fA1;rjs%#}SVh;SHm9Rks*iDSzs=4Sb?n z)I96LV0VwRafC3gNIYMa6qUHGL52B=ciHn#$xm}Bd3nvYQQR5zL1JCoKK{z6+rEfW zUW4KX0VLg!TtQ2jO89FTI@hlDJAzfZOcVxhyQ*DtZD3p#}C^RYK$jlR(>~ ztM7;?2O9`kMvE0*Ad%G!-t((gBRiKMeTK+^{=+1*1wpB6g9NBfx0?jFCd2hym+W^) zP%+pEmdnE(p9KKOTeO24Wdb&wpA_dg4cuk6Cq4Nq5J!k3U;Vn|_=rt-Dxu;tyd1@_ zV)Vg`R%(JJ7aa*H2+|wfT>KuB4wowLd2R$X`RhEDCOJ{*H`?T5*-*#jN-Gz!f%)@h zw}=;s2&JkU0)})T{R2y4b(Z)d$OEIW_#RANL+^OJrjglU7RQyR?CvG zTAKle(yPV3_&fL>dwZMv9W>d+qb>l_%I8@{)Xysv9QnK_HiIhw9wV4OhzQb=R|z}* zb;)B%wF|j{<7ucL3Q~kcRujNRhAWLI2dp`Sd}5t`O-ZmA(ntd{8g<5h?K9xi1QAYp zreAAIWKb}{|HkNm=0m_KR^6iCaMZMI$%CxEd;#DF+Na(%F=Whx*uD3vuZ=%Ev(X8( zAPqVjoaskOdZKMZmDaKj3QM!t8=g>;KxSe|{y}(9>fMcZFm2zgh#5XoF z2^RHuL|t+ySyEgKB%s=%mBUdI%kp6@jcv!OxDjd>S3e@kP?v*>Wg#RWM5C~p(q4NF zm)-Pkxy!oDM>oonvrj<0%!M()hnXK=d#7gck!ZXnT0eB23@Y$<4T-Ct$7qoX(;bY& zb;l4_iF9F?B1d=dfblh6cg*iFG)btinD;domXiq(_Sp+a1|oqlIAS-`={o7$NsY?B+1AlXz2XQIoh zq%K)3qXUYuZg6guu2*xn^7#$C%!7i$s>=&26clD9Z(zko#{EaH!Df5_B$%ACa^X`H z%Q|nfiPo66JfWHu#okg75r?_#_NV)&;iN^NSCqZk4mDPV!&XAvO{v_2VnY!Fc8FQFk`hkKr^1!sMQ*ZfAYpNF__-se4e{uXV5hF+vx{c_qTL zu9&!kG<^+Jm2>l~mHwd$dFfQ|4fl(hQh^qujeygk8+@dLV+M~Fh!`M8X?(B@@ps=* zt3V3&)<0wj?R^NQZ1^6xtjA@Sv}p(?HrUWkbG?L))e#Ss2?yHR@Ka|ZfPPi&?9;IA zuI_>CP=wHN6)6I-0yzF#023=zJf+6hZTskOXzY2HNoS zKHR+KH*vVd8JH5sHl``Mk%M1`0CQO8wx~Ue7bqIGNCIjf@tjA9CY7=5;0)4)f8@;` z;A}TMv={-E!4pp)1fiBc*>}2;&5VG8HcwcC@8WlKn;xsC5tB~@`SxlKZl?8^#2+01 z*G^alw&B%`{TRi72~j5r;$6%X*P4bf@k**gx@icqcSrT*qM9R&E2W5xlGE7!GrQj;rbBh{2V!BXq}V z>5Y_)Y6MUC-gTjmPJGa@{yJlexRBD6Kc>w35u^PpAC?0w1w`xXR@hcfRJpM1X2oNz zZM@O3i-Y5XF8CP8KS8!I(#v$gvuF$fV~B;NV}^)z#m)~lq5Qs)tf{HjI(Vp&q*}vi ztYY@__niYj0ff&tmp&c+4>=CU^Y2`U1cj#g$@Y!+5CEbF@vpS6BICPfPRPKMzb7hs z%JKjN>965?8Ief6nA4|FG;*oL?ikA|ApVU!Ok|!1Px)5Nxz#$@?KvLDDZ?;vJ+vjd7u~Fh)l;0H_bo#cE3Q#Q6bvI zcyYs~ZulY4GWh`BXA?v=pg?TihKqa_8#PhRG z?Hwk!2w)ZR42LjsSr5d+^{^q{)#KwsgIuC&DZ_K$zQi|sU!DGd!y{d(f6t-$4uA|- zkB!{=N`&hR7Ow9@^=}Qijn`lN7617QI?F0F_JkjW zCt=*bxHJ??F?~D72g6Di^i%->PgXLW8(*BWSG*0aZI@!#T*Z;3UXLMJBllFgS$}hZDFSX>J4;?=2$o5FJn8 zmVuHH%*G~&*Zn$@1VWX4L_=Eg18pAEI490HNufm}!8z(B4tv}JE(#QgvbAX>I7h9- zRFBaGfhBqx4o09~l4&G$bO556&R>(@!pjEPe-57|^aCbph%zA?rf~pwL`*#H7hfvG zvlaDoX4h}IC%F$p?ql5C`yd@Q(zv?%#iVuefK!|0F)TE%dQisM!~@%ZTbK|Oms#4P zM$zhEO$`F2zDKI7Sshjc0*+O8Z}7(w(sfq=q;S3oF23OzB0Kv=Ox9|Kd%}bm>J}ap0z-p0h4+JFicZZGb0<>FAT}vH3uW2$sAP|%g<=@ra`X#uH+za=s zOH+S+YVCBQ{>2sEj5gS^+;qkCCJC}ftNAeo?JS89N11MHfu*6>9!*hR#08RUdZHmg z75xS6o~p^b=&?;I5-&1DF4{A@=eywuc*vXTc--jLc{=)pD||ua=sg~qe%#r+78Ln? z27*ubEuy$Q@+tu=;g2aN?}vJC_Cd&D0UR#6DX|C>!aEXC^nf|X5QzrOTrHOG2X8j4TKYvqe4U2Ugmrt10%PHazU?iRZGtKEc|eaM^>GN@m+YE#xwt4g)uJj z%QFOd($3JJt6BQqb~#|A2G=DEwKz5I=M+usk57`)`YL~or!1W9dgl{I@6yVTWF*^? zS;<@TvgsQ2Hw_#U-vJP{)7AA(H#M-F1?^rzK zsty~hdV5OX6wuVMTrIb6cEzmLY0eAUDyaArqin<*EgyU~da@Q8I>mb)eF)V5zh^Du z(JVHW7OK_0f9Y{bY69)^WW99-9-&#!#JXFpHA*l`FgF`Z~cR}Jy1ds!Dx4syTmf|2mZ(L0z+^1 zI7?h1*jT-bGq^$S!Ub3dydneH z+I{PBnsF4?GYygbKyWI)NZOfFaQD=T+Qj-TA7IJ6E#z`8JtFVf-UnGTH#1 z$j+O$xNN@d(Du^_?keOxCrlN=OT&K(Qbimrv z{NltNMZ^?=MT4*AKoM2B3b1sdFSCvth1j-qfV$XU7$SpOEmQ2m-b=ffT5l*QQJ zqmpQ1sC}G8Mje&KGcQ8>#3QE790`4Za>&*+H|wpHNf}@3neAx*bOu75J1Agvh<2aZ z#6sW=LGM_>sSaAx<(7(Krr6gKk0G(I+awutd!qXkJPbHSNxnKR90tmYX~m+F?t zY-gOAn^%G{>pB<^Op`~TUEKg=voq_z!sV9u!M4T#6In9$vCmR^J1fY5BJGYoB>h># z0*s{tdS$|UTQF8ur2~zHK}#_As5>ZTt-3-J?LkC|CupAxis+`d0jk2126qWJccJtJ z9@KC?6#{&|R);_!?~7KXmZ&z`&cqabK7!l-VlVG|CLW1LUlOwSCR=VPQ%X_>oCh`t zWd}6cj}Sj2_-XPp^b^Dn6PueG&Obo>EQ!D2xIuALY#|I%ek&=TUw$*Ju6+6N7jppq zVh&Kle>1G^x4_?Jxh$8)-Fya}%P~lE*nADOQ{A{5Kd$REM{&}VNqO_$xG~P)v^P}! z>258WON?uGWjPfmy%?U2#`KpLf^d7t-SVpqGgqAS{BAY;#%jY>kC8G~hLbTs^Q(5{ zjvU|&4Ny%DJn{=A3_^fn4b99y%nObGe>$Ie1;o~)rwS|oCjQsp&|`&_?>Bai$N}2C zO`G8Ey>kTk(bzME&W+z5m05lE@pYO2!UBUkHMd6!D|u+N8JR7{aMniWHBb@9dlhlo zy+IiJ5?!VRN_ThLxI~xk-qVD8yL57gi>>M{G@RuHv??&c?Qo@fqyR$I0K1M76C}3c zgW%>Khj20ACez*B_B5l>c&%x-*>j!)q@K@@i!ny4v%^i`yt}&s1+n2Q_W}eQ_Z#wt z>ybhQCTh+4akQYcZBYV4bZ!Xb_V+h~PV_>`VF+e1Jz^`HGxNf*e#`;*!XSeipWK)h z`rf$FiYvqXkk;op+xa$6JL)#e?m1Oh6GsH0|eH-4* zXM)Ym^t#Uko5|haZg5zTi!nwP7jJNI(F<#gu~pH64|HPD_>S2*PS7?M7d>RkKJRt{ z3S5iP6SGm4qxp{mef3b_8H`iI<@)MbU;$G^N3^lU+;|gp9Zol+eX>2pxebTII zTFvP6D1snj1WlaME~H$7RyXQ1t6Fy2K1xrg)8|^v=qCh|c_M=PMz=2L8M1vwkbcxI zec7@-UfR_At+ij9F;Cg4i|mZ6Lv}sxO31!~iP8yVX+cSsa z-n?1(q}dJ`ot~qM=KMUe+=+PQ8*~VAcR@*2h10BRTFodF>C8OvBHm7f`lLrtpOp6K z0Xh=*8MJ(X4N!il+bP>>6sKBW(wEw))|VQ6nW~h24&{fRAAWrJ>EVZmpB<*0at1#k z_|f4f=m!Mda;J%u{gcBF4nIhKZut4Yj}1RZmY{?)l7NIG7@^6GGRU|xMiH#Uh%f{p zRG}?sSpyeeppt7MdHR^#T`k(96L*@XOVAk#Euf& zxKrnI&eB2wZj+3|m9Miid&ZP|dJ(n~x%K8|iQ`oPzyc7D1otgV1+0-dodlAnM-SHy zFvr_O=bZUm#EoC1bLNg5HZrP^YnnXGa$<)dVgyZWXG58kq9rFeMb}P2Z1&b{+Yr!q zJ0)eGtANQ%h1QK5e`X~E#C#noE#0Vt=!!dA&A27nNr)67FTmhJq7)aUF6yE#pPOs6 zG6yK7)N6ouon}G2`k&l50089J({D<4NYOipVC9E9GR`>bK7B@#hl^7O`_y~wOK!U`b9H);c^j8+< zaQS_3`DMM%IJJH!4P-&b#oqG{VX(*qWYDStvBmE5N+UvIfRko*hnmrugNYE_=*(T4 zfzTmnf?&!7?4W`I0~v?f$f#}(_oUSfNqX~SCSyxgW{%A=ha6Xi&eKOE_w;EDs6MtY zMpmu$Wh*%hl1QS107)6Cga2(9r|VCBpLArd^kKJ8ZQD!j<>o_j9Kq954KVjf58V1P z#?}etv5&|&Ebue|*j0cYvBmE^Ii^EN_>}3n!Zrt-*pLJakxG0aFEGxGTip0AL>@L$ z2fw7*RzLOef#OcBNl8Scjw?2{uAY9buZR;XUyGooJ(XNzOMC5VPv0?cv!@?B1=RRR zeKdQTea;~Lj=a!05(%>;j|@Z|{4wrqpokG&;sXSqANVl&_`s(JG&ADH?^fB!Ame<* zu=1l16)WF|2UhwlZA07vEP?B|ZXs^;nc}15vjd+ne8BMe!p93A9r$$NljM^F9~}5_ z;UmRLpDlc}u=0Jf@PYZRhdf>QG$mL#w?LHA{OME^H``uJ%S9s@+QZXdj>!IQl9b4RWeZzx zTv7sq6bbChjY~?9NM)g9h~;HbH!dj&0o}rOXQXbhsUe`Suqqu;CsxbCYGF?^K*dDh zf+`|N;tL^8IEVlRNtVE&AW6(hVeO4eNt9d+ySi~H2@~`alkQOaMSk;Y7LQ^0?h>0$aSizD|6U_>nx^YP;1WP}h zvGhZgr5}`%mVPigeV~UcQEad&DJ&ND)B+|&(+j)ZIOPfvQ-E+W!Id65D6SxhB6fN~ z4p2fEgNkhjTjRzlW1t`vWeg?SkVV}%WeglT5m?R$EmYVV9b_i3FjSm?U{g+LS6CM# zG#_ktf`fgC!q!FobutnNza?xlOjrVIi{QM?sSEMQ4E6dH{p+ zJI4eRKmoXT=zQ^VTt=JQtf~d>7hdpWh%J{31R3>lAo$+)n~sjl1%fq5NFdlkQ#)w` zx;CASMvM&@8EdR;aJ92p>u;+XE}I=X9>dvy@tnGQXjT3RspU!=r%%R~|LNy%tFC8y z4;>0)!)3$cu^^*@iE*Ks-f}ggs;QiZf1t68{RA|L1vvpFcsJEIv6It?a1gX%UOl&P_T58fk z(~|+5>ehAJN%M&;`C2U1?*OqS3ZmYK~PGm2~23Hy6pxhd2mvP2yTRO*c73h zYllqtDVZ*ZP0CuCE=P)U?O+gy!4rBwVTbuLvkZoymBOZjvtBuy6gZcSOcBWespcwE zO&gg^)~cE|GMR%p0KhrNEdU(o@<37tPu1#KY+PJaDj*lTqoz`>NDrEWdO37hNG}w? z*pd&lgHyo<9F7BBIy^vJT09`u1Do}=SuriP=p62WfP}nIgmGeEkV;H~EaE~9B-oN zJgy!aO2yLR5)%ZpT^g9yYiYW z(&)IL+eSOZY&JNr(RIfa${i-P!{()@iJmS7<3}4BES#%a9LHT;RJOLLA`1=s5>qg! zm3JyIVWqo!yL&r#ZN!%k*kVpH+Kk-sN)xl1==8f|PcKKix4VD;HPuasZ1df*`^JBb zd%QupfP)*)wPsDZ%C^asJ=y&8^9^1y#2xzFcG5Cw0?~g*UPI`dJ~QjEpe6rrrXU?Jx47$EM@e;%O#P_V(D z6E_}Bs~P>yiJ@k6#z2WU**a6HRNRTE*y86aQK+~h!??+A=#-PnxK=YdGdeRmW3cQ~ z*vQMO!51oJhqkP{3#x5rb?4T+fO@e;06IH=Y?-zg(nq z_(}BUUN1)C%pdke5|zxQ&<`v}VH~3{GKK7<3hpB2@JP18Kj0}cWZ3!qP8f$}=p2~; z$P-cC`N#RgcpQ7h7Z1N^kXOc*zmRUI;upst!#IgwjMO-44GC~FcYd92{k{eouA-Ctf5hw0 zcl%ai92o|;&wgvz-L~y_lwrSN+jr9T{o1~fdXpSybg;Zd$|8Xsh&IV|x2L~-NVgB% z?ZfBV2?n=qd(P`uvoTVyl6L;ITnXQS*hI`sxwf$=QXtRA1pj8O|TNTEs z;q*l6QQY~ie>-6uS_Nyc&f(tMD5FM4PP~j_lvr7W?s<4N5=XCIqNtIGi45|0cXt~x z%Vm;LJJCoDV^B&TwNXD2`vtM(kCSAjlE2I=>H1S4YQ{98tkf*$q-IHJrq5YKmcMi5 z?+RmLg27-gSd78GP(tF|ORmpA5u?NwVVoG_6rt}!n&tk@@|TgTT=`l{^!vNRn2tOQ z27|$1Fc=J$1cSj~FqqI0uEL-*wMbz3h!iFva1xWO5_e*f2+S}T3`U=aB@@GBtO|^2 z8f`YfA`&bXGvR9QNno5K6N!B7Cl8Fny*6L_3G1BHqqLVkji%5F$wt`G^_V5P+AOLt z7;IImm8+|%>=D0?toHh$!iFB}k7-})C%@44>axdGNkkNzGF0|?EY@F4#$rqRA7j{f zQJ?y7#WFon>?XS(9D~}|&^?iQHyY#;?#v$bIM7dh>{_TlDubGQ@fd^Jcb;E~E$yc_ zgJMg2_oh(O<~bQrhxRAW&4?}Sagtt6#j7}zO0!W!b#OJ0F-t?e)^s)PQJ%+|rM(JX zSb5~*K{V4HD#~x@-ggg3{ygqM@ymWN({QIKE7(@OC*oe*G#^Ig{H?mRF9F= zK*Vl3RNe*ZrC%^k7I#zxK)rnTJteO2@-#kG=JAXD99%wP1OUsk4p9aFX7Xmb?gdpJ zFCUc%dLJ*(!%DooON&>H;*OD#QQYb49LN3EjL)c@4Eyi_!&Z|M5 z_y`Yo6z(L((KyBwSvhoJ{srdqdZg(di7o%17+6_ruec*F#=d=fQ)9rf?*8x(m_Z=7!wm z_a{h;i%QDUi#N4T@dGLvu3%pb$06?nqF_OYYcyJzH5 zkI1~*$35UE3{FO3aLzQbp;X!$iCL48nl*o>2pg)9y2zl@Z~?wF_|;--evPg9GfZsA zNOw*o#*vcabX2^Sak`D%1)KI;bRxz9ul8OPcW7MgJ&H4RPWRgT7bkF-=2WgG-J7_Y zCtdA3uf3WxY#3vp=0pxf%xNOe!l7LGgmI4IPEqHe-b!g$N9ih>sGGmgR?m(2&_1>h zYoF!g0P5{?pxdk$sqaAd_B(+3)K~9%V*G{J z?_NmiQ6IY)|6H)&y#i8?`hFstnwpHb+Pe|4YAmtFlbAE4S=v|4vfPkgVU62;V6(K> z!pdMK83lBM_0fH7%_gH&thu2ys%hEOIeny$^pRCezmeNZu=YfbM0@^Dq$*7Y}Mx1Oi+GLYa9~~VXZO=&fs7c2KzI&6q*X!=?E?zw{$-p?;64tKbPO5+7 zm3v$mwplu{MVrl!Vv7h0Paf4cVVnAEwRW}o2ak>{`{1T#(QpA&A5?(MzAyy}Tg@+w zL$I+2w?9gyFmB(ZfHQQ&td2a4Lm00;AX)xiABlsS<$rqZ3s=~_ej!c@*%#hi`h_$%j7>hs9Il5nHdZ(o=KjXw#kR8YTACUM=1pz${qu-Z!B!&6*$CHp3D^0I>o!D|f0I~}>#qaO2yB1;GG5qz z{!j{e;E(9VmdBQVEQuSI%HnnFZ<6NL?e$* zmAJ#dnz>;sSu$>IA>4XpQ|HLY%D!ebs}JPAIoH)@RV8MYSlLvah^4Dmp{m5JszkZg zr(P>HtMb=L4AxpdY$>(;1`1qOLs zUL{>#)$-kaD(`o=cptk~%RzNE5ywsiRcE7lqM89fZSZ&j0`G}-@7Ma8>+OJw;HhMbL=iu^@dix6S zXZeP7POY}4=2A*)NZPO1>dxyYkwxEnF{%(YluJM5#R!0~Zx96#HWrt5%#0tzrgRrl ziIL>TRlI;wO6iA`Qp&?jDgBNzrIdc*^B#<9;FU$M`9=Y>XY_uTb#&%(m;KjLNiSd3ihSud2=KKH0kSpaU~kGOqUJMQCFT~FUC`#!d^ForXDSANHyPPp%e+_u^1X(?l0dF7|N zGGACG%3^?SkUr+$Kz+ThxfgISij z^{$7TlTPZ*RMPl@3Wr?InRI?%wMNXU*$t(UG?GVg$HuKMo%DF=aSZAhUAdtR7_%{w zpOiteAtz5KAS;kVv?qzeupxKrj0tQeyEg{wCyN*a@`SCPB&sis=GSU1tuKvYtNxEN zEH!dMRu|HeP)aGyvQI@RrIgZ0g(-cN7&eSAAVDY&efmKBEYR2rq?9sczhzmgILk62 zK;ll{?1KPh*=H&mDK=Ey%wJ%fEPEJ$vg{*&VXShqNabc(&AN<^3C-(ZODCMDEdRtD z`VILav-~^a#Sg*qXHN<-=rmjkxd2COUGaKBtO5=pA|!{FFz6F-p8*IqltN*w65_c2 zzOwv`BklmrpI>d3D>1Xg&cHKBp(SCgLc`DyB4aQEQE6Q?%lHgMGEzmdoD^ow1lf?0 zl$Z()Yc5m!(>`Kd5ozVAti&8P;-0>Y#T|ai!bmvB0&GNI3bBL|Bz71=-moMhfrqHX zMr?FxY|#!1qHS;)0kp#MQSPJR!WP}YK5EyaM2t!?Q2Mkf(~MTC(G!J$%#lUg7p`#n zLL80Kj52MSx(*9a?X-(XbZvp9-g;L2xqiWSe zs4Cr2#vJWgYG_}rwS&Y~zkC`dAUzu75+W8s_=XWStSZh4!mLgPx8LSg&PFM>Ka{!c zEQJ6u*e~;i^|^vseNu>7{zXDaHsqH?dcv<5Pp|#<5=zt}OO!}6Fiz^3nYqeDUIFHP ztUl;{z~o3NuO!A{*ovP)KWQ6x^}aLmtn#b}#~YB(x29P>8+(Eb`^+#OEblA(GhDbWM5kNXRB@n4;W| zZz(~-J0Gdb_O*ei*IFdNcW)0u+!2ZB9g1;TU9!>v);0~%L-}f{?ToRQdE`S7?E`N_ z%tlvb2Rt6>p_KB^vSd@GO#=oz<@!JQ;HGI53^`rT~a zU2Ld7Noe>af^mm~F;BaX0)5}~9Q}MHUYjm05*YAkBnph3S8u$5X&1!5^c-7y%B3w{ z`R349Jbr6(5eFzPakmA!HVDzs&KM8(2g~$ z1DROrr96_Bnv6L58SronDy?mz&k4z3t0CG9_Bin_f9BGU&g1C09ToADGZRF z09t;ld)kfxPu^NI@LERKrW~oi+)t);o+Jx*9a7d|fdSN)l><^SC~}8SH+^lvwT?Df z!Aj~4tP4mi%1T;~oI4H&)XAmIr=9_CkNI$bGN&|Sp}|hUa-x3e5{=YFzMc^?vF2VS zt>bU13$t4j;eILMx1 zQ=z9FiWp#x=^TV=dP}}qeSwNY9k9uh_~OZ=2xPE>#g_P0Z6^jvhDe@xV#q=QbT2{~ z#HJf~(a1>vrzK)P(Detr<;LeNi7zj~+dEhmS7eU_>JE1pR&<~kcnrLU)teyLF(OHU`FpLhaI{KHj_SRb#Vjh;5Z&VzwJ;>b4g3`kwq_EJ zcAR2)Np&B=<-ZJ{UsezgpjFHP!q2nJrz~b!)q^}v4DO+R2yX{O3|l|D{AB?v{}#nv zAkA!OGLdX`J_<(92UmyNKlX*gHWX)WNX+ra>9dS)stuISkqo*>5IPf)>d>#-?`KgA z8o!4Rw|^J|WEMC`N|*Wcv;z{#M5ghk(*bo^qYVM6NJ~M9dGpa}QmlSMPMyLikgZNq z`OLc+6dIqv!Xd~4H$5-<5f4ZA{beVT;F4R1&a{n6RQMGzoy>6vUhPOHByAdISfq$U zyFhq^c;yz9a!C-uj7H^M0-u`HH?m~;*p_e zA)N9dWx+lhX-dkLq-PN!#VSoGd9{cDcvg!S_UdKNK@r~mg)p;%v`SKvftNFrk2V|W z^1=H#gFWE?2p~9=s>iiLQnD|JZhRqwOSLFGGvyy6u`U^yCb}WkfhuPzeu}J?yYiY+vl$7UU^H^iiLYZb`X!Up~Qu5j>Sx`QktJ zrU>+Ro>K$w-y?pi#tX%BZPOdzIp&X8Nkxi!G zGw+et4@JnhvTz1Ko|*h0B?Rd1coseA#PeVx@%fa(sVZxn#4Z^IQ_=6B@i}?AQA>&whkqJ>M9BM(T zg;ePu3c1p*f)3LsvHPe+TFqGg{dh*;j=|yTP6i6}q*d8XbPR=*Vbvo+)k?~xSZG*d zL#pn64NarIm2e^eAIT2fkTjN{yW-t5-5>WwAlRgJwE%x<@xq4;1LjMd(#V?*w$aD02$82|*aUEK%x;k!wV!Nn$04 zhi(MAKmd@utc)l&B>}bU=g3}51vb+t829Il>o&1x4egT%ou7S>&^LqX|`R1}Z=Xp@mNiif;T9jHf>qbn|DKWI?LxH{2MNuBY z;1d_H{;c1cAC7y9dj37ccJEQ4ffsOsYtSC$cZPBo(Q>emzcNqR`@>Nk2rRS z@NIv%X{#JGV8yXja_l>w$9pibUb|t+m@$eTk>u;qA$MVs8eQ{)c*eFCX*gpMsbv?CCJ)yp8GmOIdB-h)KpgeuCA1}VdY%3 z-Qo}!#)1xWgTMv3X(1+e&~z+jj+tyaPHc{!Sl~hi`}qI}y#7?p8_3z>tr?qpqY1ww zRuGkLZdWg^p4dvsz$>??D5u%L{#fgIJkeeB2WP7F7X9J{g^C;=(Fs`@Wigic>KJ4mI?++b#)S7ygWUxy4O6}V&` z5I7diDW9%qi8UOcl5{S(EVl?EWKhioAq<+(L#CZkU++icq*7YAPar@)&2n=x48PE% z(MySe2+IotHL3&enjX3vo<{D@oP{-9ME#3uCgp*jx~8t$qK<^(_L_p(5%%6Y-w33V z5S4+oUjsvX=t7DK!c>OK3+ZVhP{NdhsR%bWvFCC^_zjwzZwn^W2Ero{@YM z+6Djy>P7bDqvH#>_bueA;h$=SjC(#}##*4h3Ry&*E~B_CZsiMJ3TNaMKSuHxZO!0W zU0&4o6Du83*o?e`MqA@Fk5Ej_)nbsXmb>WOMN1K*^D4D!jaH6LNk)Qt5Fxq9bbUsU zkxf4sZTe8`dBP@TWIV~dzROqB^(&IC&f>0uurLQN+43bhXTg*)5+nbN_?^v9gW$;_ z0gvmdAH^wa3iIaGXIM=b->%soQFaKKjDFqqDIA`&OtB|$!ZoX?y=L}dG2PfNSZJQbPSs8>w5_R(xM6PY-=on` zHioKq#BB$>?(4o7!zqKi+S2ka)A{e#`6w*RU*Ob1N%y3!DwepFu*2Yla-9)-Oa3kO z>uF_l!1rgBhIAm{_P8PMjF@(lz=DdEZ<&Y|DW5?oi+zhK_ufNE$9=&o-I9Cg2KgFFRVt<5c*=hv_Gj4y55aem_W z+mo%ef5#92-GRsuCKv)xL!2D!ae>bf`>wRgoHVUpAR?fa z|6;(1&NY8pZH90^^{7xSzxxU{9ftCk3EKT%P9QXAwe|k}cQ8iF#(m~V9vbNUqf58Q zNfwlLd^*D5&mtUu!LGOqLOS&3sr0a5G6a>dv*hh5K~I5o`_w9Q0aV22(!M$Ju~Bd= z(BG6*@-Vx&=FqS|qR4zJjl+Q_&15E@jGi`+ldRf$8N0CUpek@A8Wh!YYi;XR2Gkr ze6*C3jE_PMql+ifN9Y6oit&yQ^3fZMjCj3#B{ z8z=_hR(AWXH`C{mbEu#)PcvSqNxum0@)(Eje~Tc2yB^tmRmRP&6$n;Lpv(S^Z?5Rp z{m)OJx$a!GcXgwfO8npJ?w8Sx4ARXA0_7t+Av-&iKEFf1FGPgX~JK! z3qBl3eecxEdn@Gq`X>)qA@etm9KC8ku&(WQ=<}Bd-o0468O>=|57=Mmnk#VoE*4I- zGJ-R|pkO(I^kS>^x};RhqSL5H`S>(8#y$>1t}d=#iJ8VhgO_SeLtpEEf~?0t7$OY> zbVCkM3h^z@yZh#EnI7dJR7dat4b`tgV0`LFh%y@}VGbShd4uLG>5{PWx;#G`&G&b0 zZ>jrGJ#}Tj0W-q49AC-pNlgq|8Y7=+Y@w%HM!N+#2Ie_9;oNF0f-^aKTnhrUEoCB;r*lasJ%?4H6K(#`BKEX_I6LHm(#CosuTtGI1S02&s6) zAr>{Bq!ygUTr5O%bxq~GyNY32v~I2ml8_E(^6xRkLw5Hcffe`l=-59jbq8JH)Ge*2_(bq z6I#}uU$iFJf_kQHF~Ti0DxLqKZ)cU2$%s3<-SefZ9R5txnSrat2=rI(yBA$r{`)TK?mv<>Y|PV`JXy%YXPKIB(Y5qIkB z_QSyM3X~jX^mm5v*Gq@`&}t*6#08eLtA-mFML*~_WJ~#Gy>`Ym6dt^~#Z^P!_Mjki z*F?DLkita?)jB`xZmfYJwZ@^a%CS6ZZ~R2y+j+dvM-(F>z;r|LC2C}SCqSO^<8BY_ zzgJliEL8fTb?F~Yfk`hqS(pGPn!W8+w%#-H-2N)b2@s&i+zBmniF7vH76mXlOARHi zrVt#n+LWD)K8qf3us;)A-r^a00+WHcXIXA6NG=avAwHYt+2>eX9G0(po&HsrIoJ`Wi^W&!1x42 ztBTre&0-h;!j!3(ewjRLFx_Yk(A)Y;TQZ4>3L?}w_ysOeD@^H9zj4VRo~U0b7Vqgc zb`Q(1Tr4?Eb1Sj8&%`V>^t_#G5ljgHPRQ>wyxU?X7NeDifRu?(aqx3r08{}k@1=-$ za273fmcyrTS$g`G$?&2KB}e)6b0MuifF>r-N}o^1Il`M2a?~cm_ZpjQblFZyvuKsk zNs+PvBs-03Zgee%zUv1!$f`8YiqSo?@$>fih$$R0Um@hAx-Km1?1yPYPSzPl2mL1p z8QsrqkSbhPeG^+6zW=j40N5DOEr~O(&u$RY6);l7Fo-_$ERd@1Dq`XD7#f>Q+9VW_ zS%;NgK=up%-Kq@P)?2wkTYtB5lhb93l9OA<*EmLP7jYgWGzBRDvkKALWKy`LtmDNV z`YjKC?&nGu@D>d8MFh^-lXY!wBoCtG<|>?Ov++fwuQ0(+y>6Vsb=vZQ%Lr&}&NE&h z9{^50Fo)iD8vTX)6Yc==CY1V}!S|kBsVl!t?`9d=x0hhoIDaIy2rRrmOvOD}x3g%M zAUJLJ5FdYs&PBB%V_PJ1ja?XT1B=mMk#`Owe9Id<{ey8@jTtY?-|WUXrTQ&N}KJSgH6C4!)8P+C021DNR&*D zHqi00)7Di?Hwrvdn!r{EflGX!&*@Luk!T#X(SW)6CK=NU5`Gs`{jao%HC#+yRipcrdGJ^KX$^^PLrz zeangu65{cK%V>P%>YJz+gyaRxBF?X~DsDQp1(ir9jAnEoJBZO=VKMMRQ&tN8e zjvw5E3#c@mlAyjWGLLy;@b*?GMA>$r_Z*+kFkFgevr#5#D^R8D22%T@N3A|DQdN#S zUgqjkH6N&JOGCJ0pt_fiz$<50;l`x9K9TfDs8WdpD$Y-6hXa6a^VTPf8S z)!WY4R?lMwYhuOf$@b{QMk$4Cf?5vXB`H`Xa}0fL)VD6Kd$#JprR0vbRm-fIDyFUT zxhz{J3w_WW7%AKsTj27V>es-DGN3$RI!9{w&O3St^Xj@yIQ_UdGS^%a!*qx%=ES_R ze*{=wWPPUqfgQ^&+u+vjNm@72B%1KR2ncK{-wNMw$YkjG^c@5lo@vI*o zB24PHDgs?S2XU#p2895`8brgug8+hf}?}o$gz5 z&7kR4hmgBQI9o|7%DY~jU3*B_ULS4jK?Pdy_j?pMjR1RPPK^nQns|$yS#0bziATk7 zy;gE=V6)diJ%HOO@92d;uL9R+uQ)HdD>m>QPN{^6{;%8Fo8vBn+Km`Jkfvv^mv&s_ z4@Z`FU#yKd{IgfXz*pjqapr{8Uf=axYtTPYH+M*hww~H+SRhMKf@-fZ!tKa}aKUIW zsTgdBL^w*vRDWnhf~yKZ?n2%FTN-CA2{QM|kk`V~EUN8|a4{zz>HniI!p#6f`~T=A z=b-K;-}Qi5?mXqs^w!ad**xz0Z*hlH&_B3WDAbpX2%r66cYIw@%6;Z> zcHzcJ27XZ)!6B);Gd;oZtFz$In+2|tbfks|)NfpEJ6wZ{0$Lk1^oIOetTub~L8Hxu zae-lJM#Wh|c2eO{Z78|D2(Hr%X$^tC&s{}9AnG|tj_|rFPvV^hHSfIDDz~m)LJX8a zZ9RTIW1q*425u@rbpf`SEn_KW>;n_zABs}rPzN}BO|%^YhWv(?}> zr|)ue#`*B}G_cB6$6`%0D{pzbR<)dNOyK$=16+!vEPL8$1g8?sTudS`fU8-rIXwHn zo24SysyB-GV!sP`c5fu|XHByGwkntsILS%7EuG8ABfv{U$JUgXN#*5Lz*FY8&Qyq6 zq@w9iAReJwDDVlN&*^+U%#mo^70u)D`Dq}gx=O-_vKyvyXpp>t5kNHi1;8^C(L6NOwZ!IQqS(2zma3U}QLHTlTX7>7}h69BXO6A(Zd{|iWHPiCK#S{bi-)rvh5BzZI=lIJHUJ=0F4za zqWSk+)qs7&%7VYct^wzn8(1K>d#K&L1>e)fI4WHfpK(qrF_m00s-3u|G1EtWEm=@` z)uA73f4a_`L)-_h(WexOw^T}K%Xg#oj8zzlDQsC~iCCN{>7&IK=gp&D7%L=n-F*C( zzes#-s<)d%Fj3St!OMea zVNk}bJ=C5z;p&Q?b}(YhP|r-j`vG1muc6^3Y3H#p(5O@Tkw@s&j5$l|AG()n5Dh}E?1Q;_7zi%5MyBM8IM#0U=x;-rPZ5}q~bZwHoE~3@X z+#fhi-QR8kW%fniFM3#hZ~^I_$DFDl#=D)N=*F~&70;#nR5`mL0m3e|dyluu?zuDe zfWZArjX((sknTb7tZ%3t>*4&d0mIMm(J~ANsFCb^HlqkYF{`@fut`e!v`n+V@K_s1 zeYR?;pv|x4@&Y?U#o6;E$9h%PNtqy^(v|emoKL2cm3!VWqRywqe*KSjM{tH)tQ-`^ zGw779un)O+jVfM+bx|?HC-)4!7sCxiGm*8-yS(#t@3L{xKdfAqf~|&WLHnt(HCj8X zw}xiEm4#P|=~Q+d$BZRYIQ6UWYs~`v)37}1_F2Ju#y{-JwkdU$eKh{Z!z znaR{Ibb$u>?uj>!ytvb}Iza6{cRvF@$nw`nDhZ#+PGpxWEWg2Pcp zuF~ShO4F%OG}cj9V-i5oV%SpPkR;^hsIeaLd{iHO$JGR&7DpI4q0{#rI^r^S5KcHX z21T+y%mgyZs}Rfau>0fsDa<-<0#J@nPIhoD83 zVQ$jdhN;e6h8bPFfw*v&sb<652%kfzg!H5RWh6p}OjrmQp_=CJk`HHsF*aMGB6T}h z`C|gDg5!?~yxl3%hL%jDBaIiE2pFiv3AK^K!SP6=DkA~!YvUu5MIs7f4!hX$RZk3* zWF}OSCxVx$LbnH#$WRlR$;^7RkclNUj>QVnuGTD~*+vm@&-x|au`!&3&(^Mt^y?+w zBlaZziG>X);+&0eoDPJo#EwB{ad;zxXB^b4+6?2G`;$!wM7HPFLNH+lAJDyf5cnb8 z5y7`s8P9@QSYc1VDh1}TLWH$4bV@DXpndYbodrv`-pFd3Q_M1Q`e5F78S<+T$!=L8 zIpedg~c6)8#vI+%N4o>vcN6gYDL~e#{bIOiWE3 z4SdTde?JMjKhl#9wFg{ajs#MAUj+cWNKHb_lF$9w_`)%)NS5Q& zy7fZMN=>{$dUb$*`XDE)#^WQN0geO`2(pN>yx)+{ENp3;%K#-yLW#K6pCW3e{*JqK z$r@G5>UWl}BQ;`x{WVfl5>OwGm%HT?Ly9vFx9;91LuTZX}qBHPB=iK!qvLnmS zi^14^(xEsOQ4=-2rCJ%uaa6(0XKcYxMmg@S)u zOLp~Xjx$w#Oh;7r<2zX1*Yfx{3w1e(z>Wk{(-+=Rq$Q5t3tb)Iz?hftvAK_vZEX%r z%k?SnkU|=i9`rOCMr%Wu0Bz2$dlKPS$eKHInSwm+0>E?FM^)UB2ADq}m!crJ?_AJw z|AU0m&Tuw0AOAn-hoN^k4|eZNj2dV(hclK-8WzZ~IWlS9ZH<+&M6lN)ZOHEg3u1egPmR%l=&B7NEH)Zh$Q_46tB>5fz)zlHZ#`DrRYpqmbKc zYmRPkFe+cpEphDh3qsKYW~pa8PntZpWMY5yBxX5ecjQ~?n1j5aYUbLBMh2%UcXR2z zkl3{foX0}m;cITgp~VKEk3fX4npuUh#Q2iiH3tk*q9g9r9?|XsH$SjY-(S~-FUUZ~ z6QREk>_dQw;IEMqI_1gw_gJQ5BM$R64SEu3P&xWk_^l?ioKiQlD)nSmi%!u-ZMUTX zsE%k(N%jyY#V{!_+!{n+`o2;5YI8Ufk8+rQDJ)FVj_umbH0rULO!Qjbb$g5qp zAW#3imE5oqI1UI|!e(|Q;z{eM!SFxGzF0+xWNa5B!kTr-e$rpW0VPDijVm~o($^Gl zSUlk)Q<^9f^T)o^lFeHc4#HTmYCtra9VUPh1f*Re!^EI(2s@1hYXy|C_Ac*LRAA}y z`*3{0TO1*|Ghjzr_#EM*{IVGl&YM0H-!t7Np zKNTmVTi`Prk~CC}AlJRs?|<)+V;fmyE5fDk692q6j>!6koA3t%{g%hEyZ79^ATNc4 z&ooF+9~;`vaC$$7!uE*C)Ek+V2-|25-|T2bKwiSu=DfvchL-^XQ0d~z!Ei~(Og?_r zo^6Ib4=)vQwd2>>Av?_#i&iD{ZA2}Sm`a!ak6f|$DeJlJumwugSbvNUs;>G{f*1QA zwG&T@>Gq&bGOt{F)f-d@lMISF0)kOgm5>h*VMa*--79a8Px$5`0ZEevU3}(rTl|^9d#Koj^ zO%}cHSkDOJ#Y6jttZZSAfl#VMzxEF_!IO~w2uZPT$I9Jbiy0eu$^ zJFa6e={VBW4<9gaq*ys`xkS*(wr)oMWxcg*3DwY;h`GCfMAtDxT=1a5ZHVIH5UYNt zDI^ITT_ZyFr9v$MntwiMuUmnObzDh$Zz@(_=+a!8Cs@I74`e~{r?;^6HiqankN z@hW_3qP+vlXT2)H4Gih8F&DDOH-9KgHtWgiWT-Wq+)7l=5$ctVid0yOwWqVkrPq3O zigFW}Ae#q5qRxOUFO{|$vl>y1rrbth@W?LIcOjQz6kRUtEM))Y=ftnR;6YJF>*>4G zFX0{HpY;jp(nZ{vLgW`uUqzblv0s5K9Zc70KG+S}9W7btMd~Y4K z!k-(%z6VFmsefabK93|;xx>|=jD<8gcHB+=K}(TgVUI^qS`ac65i@Wgn4z(GLhv!+x?jAM+LiJPgk`i3Aemiz^*;>W+t3klZ3G9y78;awvP7!2ths1C*7!YnwE zq4Fqhm)xiuWCmj$^B#sDIesOb95$i+WiY!)EX>A{Ox-Ri$nU2l+RMO0gPCkzd}ZLf zJ-MabfJ%N?n&dmaIJlfep|++3;=X{+s`J)4XiPT6s8dRw|3ir>eUSp za|Q?nXDQN@h{pk^$`VGm;VV2ELqtb(1sEe@njed1d>56Dlo=JL^a3IC9A`QYK!o-A zPpS{>(nCYj1$fUrdAAG&iXh4($Qu`|y%?#9qW5$HqsmVBx;vlCvg6&=ey0u0XWlV(7Z;6Sls<{+WsRCkV_EViW9Ylv4-?O_?1eM@2+W0f@hxTyz{>XaQM{_jD=v&+z$S+gOPHU0I zMnK$97>FDxtmhzf}@Z203u7vP}j~8D9YVf?&~Uz=Ae_R#v%xY;q*gacNTSf3$3cZ zV^TvTP*2q9mYmRNW}!9-f%*ul1HDNYO}P z)%1-HU`F=%7}wHuKocvIjC)F8l0P!;s6Rqv`e7(fygjO6O#Akw6R4K2b*x8yWm3Hi z6QN_iHoHh94#FK%OBLe}p*QK{8_!8^l>n2alB0h*B&yP84oTMNJF(AXbNXL^Y4Y4H z9acI`e;nlFnA5yB!rs>H;JgxkE4Wa|by!J99Jh2O(h&~OMP)1`P%IsA$$DtkE%t77 zcxpK|M4bcMi(Lg>y-^3*N_CIYXTLr{@nz#}=?j8& zXy#Dwo+1{f0&+l1(0=w!d`1vLSwc%Wu;B^FPL*KEo+t@F;n#7IN_;CF zNON5ROCu>y0WC+=vF=Dci{H{|pJ59CnjBr7s@~QTFMa(wwmPqGFM4E(E743^!LIWQ zHvsv%`;Y|1eC5WcwW@ei{j^Y;GyN!+;S1`k3Av(j4;aE5j5IJKv?b9eq<>K5(g#FH zAJo8+fU?M#WJZ0>hwxzNtV$#OQh^^eE3P#hlv=ai}>Lh-DeTEuCN z61q`JBb^w(`ic zh*Q94I6QM-)f;p!_#Te32!qFVtAszGa`egQigxjTxg<%DAmGG&^r(k%t_dWy6^oO z1iym%FDayy51112s)J|Y3?~hLSJZ=#rvkY~$%_PG9cCzuk?b8_Pj!m6Q`2&kitNAN zMLX_%FC<+0J8NJF*l%0%pxzny>MOj}%7e_c<;$00ziugNZF^(sPNYiK##jc!!UsOu z>&$#1X%ZY|Nxj@+ARr}*lH$)DvXHXKGI0uWE(Mc|IfJar6|I&iujJe|BNyD_gXkO6 zldE63^1Z#*3Z6W}PQB(DL4H+9Y;e~C6QYIT3hWmwP>s{csU-n_D`DkI;OzHU^+7g4 zHz>z$*AQI$Oz8}^d69knuRedjMlCY_jz2UBy*fUG+X`-IfBj|On#BKh)<)4*h(HCk zBtx23K=RR^@pTy{xd*g4c`K`W6eOGwnk)apP;hh>E6{YsmvRkfobI!^56v zVkcwWL7$7nX5+NCd603KrS9`L9q;!JL6S5dIOr~Oksz(Q`QJ?2Ocq$hv$-!J2JGuM z#{ue_RbwF%jbI-pv;s-9i^Ny7T9dG3c!GdHmlRG76^=O!Vnt98DM}U>(1;i2TA+)f zr6Fg$MBfn(jIp1YbB*IY>Vy_s>R~s5$!6ozg(QpB=Y%3|6cD+5akBIe66)Uy>y0V!powT*{GDfg9Po0EZU=iaMASB z>aSoJ;{Yw!e!J;qDtq9^CEj^V7f!&Ovy*(0>9?vL@t&+52$2#+`<<=NQZ&aAZ=;Rulk@t<11qoFAaiGd#1UUMI~!2|#x$FKxn9E{ z!c}X-1NJ&Y0PmT=Och^{Y{;Mzrn>S$0#{Xuk$ht~dM}{)A{8OD(2Rp=p{9NSJGRO4Y9XLS%A!-bP ze1(fxj{$lI60LXdS_TT?^*~?80WArtYPKy;veB|MUi7C>w4`wT_R>hbDub8nd)qWKOy9AEm91cnHMog)Ld0`GT` zJN-|SRiL+a1a}`~5&{WbJ1cN4J!k?34iU#5z!90`Y0U7o- zzXSC+hW~9g#)s>sMiMV_vr-^lr%$WjlLw7WqJ-9-y2YrLv+Bx0_}y9-y0+HX`?V(S zt9=7*AKu8QROqN&aqEA;+=jIjl~XvBt&8Hug8B@p_hfNnwl4OGmLZq>RVENzr-^Am zF{C)&EG;MgyChzCOV?isvlN3wuw=1)uJ%!(fPMfBeh0Uw11!zXr2xak9xF4#QWft+ z6gf2_k9BqpRn(^|rnF6?BEb`w8_8&cX%jWt-JOPDg>p}XNl<+A!rrvBP$mV*0*#S8-;@-%=i7N-mob}q|}5i1@h+>BP-u&_Qv>Sp;q zSrqKnS9UNVzVY_pOBj%Cmq`es?+u+NFu6g*)=I8~ae2**Q{QV(@6*@gE53dm_Ov2B zh(GyDik9{SIYi?%XQ!U|V^sh%>O=u@>_KF&d6#xpn}(eT9=Nj-1HY6YsbbtH z-p{IOiZh>}a*;0jxg?nVfTDUoxWYg)%GSq#=O0L6+LF$W$RUVTXKt>g;YYsGj_Kk7 zBvC|2O8*CHLP78V#}s0PX5ye4RX3B^%&(9@w_BX=VgM)tZi_MoIylsVtG?lksT2Z* z19Csm-QUJHDi4*ObjF%SqvV zBP2b`!CD6YEq%xQ8iy3_9j8Xk7rZGar{9U~{Y;3Y{*=qn8z^UcH$=50soUY^f~5{p zDons~ZAMO$yCM{)8d|?KvYo2&>G250Pi`~>kjXUka~Qx6xtk^9$(Du7@gu;}$DD#X zhslx!(k1Z6jd9xT(_^HY#w$9+Hsofj0V!VHnXyPm7x@KTPNB_9`3YB@*@3gDOeM`~h{OZ^4t)*?nnpl?$73MaTn!XK_Q`1%bdoMc z8qX~+%cmyP(+mFzlY{c$r2wv9s?|O<%IFz|`$xuN-KI-^hode^1vXa(3SI~JGN#8w zXuCoI`}k0?-A`c!ZPR$A9GuP>4NK)N+!g)SR3@6stJUQiiv)#sDy2TOdKX zgZZw12UH)0n*kA>hx@Z5%_bDP2hu<}a%f88g>}yoSxWz}xC0kJ2!*Y`iP+GQJV^Nf zGF;RjBT-LEubHxYkGg)7G9J$C5Cp5*2p7Fk=B={MJV0lXF7sKh(VFWv!8F#$xy%Xx z5;@?~gV{t#&eelDWxQVDzTl+yAxVeJll;+m3tB=_x!~_k9f(zTS=&VMqpfPFXXqp()Q+ zc*Z1m0?Sb&iofxn=xCj~d94T=ahGB~(*$miPTUX(Lx=wTN=u%S}i9yHXd8oH8k;EF~#Z&;Kg|xr;L%G0fsz{NH!45JV#- zf@cK&R69_LtORnxDc0IHqA(#fjQ}-A`t_l-07}DUcHW-oUm$gIupk{9NYnslPh*<_blM9Lz;g7g(*Tvf4FK_q{^!yPC#y&R|J52Ry)ZY1djW(NfTIK5Q~Clw z^87=;9Gq^I8^4ZXP}C)F@ie z#!dSGt9@BO98@fPkq!OnL6cg6rYeEGH2WvB-k|?J9hT(V;ML&*(ksAx6B;6qXwwpI_36{^U2lLccu5e* zhk*3lZldU^J#GE}w)lCT?4?72XOG$!v4|sLIBq1^meXiS4+c_M%a0#v9`8pI?}0N7 zgHsU@)dRNI`-4eB!=MBJ4nLjs)&%hdM1Kg7dH~$>_Vjv)ZsIw;BGt`n@Y1aloJj~; zZBG6?5h7||7ndSW-i`BeA3ec^+8!!2c;sR4v?ga`Iir6XJ@pk0;S)?hz!@W9aa^@_ zrErS}+h7>AU*$9TpBOkq{^JyQmu!O`;jU6qsrYwqNbmEZ{)0Jh=If9M3)zSM@l-%K z*|10xR$!R`1o`1@7AnxtS$t5&aiL81s8+ra9(OS)Q_J}W&x$mv9#MUX0V!Hhhk^`B zjr6xE%FLnxVBR0bnkzogdZKo+GvPE?#Timz6LV%sbqwGVePPg+gP{tc3*7*6RU6=v zQONrxthf9@^e4?vAN(-~H9^Cyoi2#XbHBlfs*E`icjzumC?n z%je$`>+lfppg_@E(ES2uZ3wblcUp0zSy9&AjfWKH1B*TC=^IeP*k|hT5-;`O&Ek2P z9{kQoW+&Q}2>X>?J)jqg^ycB@wkFwkDD@9Dv6`f*2wkr3B3QyIqXZPtALEeM= zn6B7+Z4@H1uKI(NVuLJ8y~`#28Z5Ogm-TD3)QzUqd+-lD!77*0ee|M}waB717AP%d zvPTw?xLGTY2a-i%W2v*6)WM~`Ac*MvLzNo84l#N?x~0gIarOU(>vgrVEm-2eZ2m;mbFyi!22kbSm4P5UpzF45 z&cvY)?~llo4(8oDz!?cQ2cso`sOAE<-P}d&3J3Zd60G#=T@Voj;c45t#*P z@05$duGUC)+QV*qcgASYL06LA)5*V->Ce{-HAf30Tv&I0E$g!2w!?RjYU4E9pW5Ui zbi7QSKg|W*v6)ef!-eJaHgz4B_nVpvYhwv$Cxra^W%rq_m3zLe3R_SqEH8m-Cw~Ni zcZCF>zeLCk(2UY$uE}g?PFhDVXUxXD=Y8V_%Md&$Lih)b^3~ux+Wjfs#|)y3`aSh^ zc0)()j3l|vWraOfUfLwGfhk1MIn@8kGp5$~ftvDa?m=p*lcq*WD!~d;4D~RC7nWl$ zxNsn97iRTj=D_B#n+R>b(n|*N6DCJb%f>uYhO(qnV_`P*AAB<~1WwHv1)>VKQ z-RE41#MWKIUcabr2XOISX+IMYz_0k8TN56ePJY`sK$)p=;!Cyanem!&-nUq_4C5k3 zSVD}eNz7s%VcNY)EMn#=ph$xWne_tajcu{E%nn*0-Gzsj8kf5fC#&p1&C#_f_gcN0bmGA>;_YYYQs>a{d`8U?1(3MU3G zzkg40*%>2g>S0r)@E3$71WvKxbUVg~B^!aG#NFP<#M?K!s7YFvcdGTX*D`ve{Tdx$ zNZrlX9CSDd2XcR zr15c&>5Je&HO9ukiN@meTI}UhGYcQf925#uUN~}ngQ^f)I-W?!DsdDtef(==}VZ$wNpNn5Wowd#`8!}RE;o;B~iTtf%MBP-EA;#M;}{VV8RF}a%;7zuOc z2Fg=GUIzi#$H5go<2c>_a-vVMkFDvAi>!mZQ9 zNOM5QWt&*r<(drrkcE?b>x9-&`-HGJz7m62lT?JhD@C2D^;3oInbP|Z1ZD{Oqr$ES zm%w*(!@2n!@u%Ql10yOnpIEL))EkA(-rDQUskAnLrLuyS)jAO}$cSd|>QE;gaci09 z_wgWxo-xb)H>*U|c3n6!xYHgy>rAsvSNXJ*WZ{uHQ~SyV)AwLybxhM&K@6luHIPWd zA$JvZY+TtJ4sa;(*>Q!nLJbG#JyI8bU$-eQBHM;!b;bni!Ye#mrm)9-%U3y~9m+NhVzSX!w8HCW6w zbx)X^HKer=+1mXP&8%*Gg$Nlnnu8wl&1f2Je$2kTceb)LO8wS*Pd!K%H_)o?&VM7Y4YX$SbCKhY8*K!L2*LA5G(fJC4dXT6` z;r|;eMfANt+~R9qVqU;si&9fk-qnudzUaRsC9{(-5&|c_YFM81L-t9qumkkKw;?xpv9|=^KI%WdZRyN^Z0NO? zZOZ;d0+OubhsRR5Zc&lH1)=Xy_Yg;+@FV$8-IA4Kc{5}(SHLMUd=j06j{12@gF}O3 zbEnSuiCRcR2eo`m4IDj$T&zJU+)R9VdL@9NAI!y}R}ue0J$Y*>;GK00W@&SkYXfsN z&v-QY#YV5b-a7@e~X-RU$P3*E2I4t_PE%ayu`B#QQ6PzQe40{ z6~CCjC9aoMmHc(Pr@ia?;j%KQ)xei|?hpP5S}NQ?^!DNc@UO&yY~bVhy^fGq7~>>u znfzKd_@6FxEx6DJ7%_J~W+Hw}s+UgN& znTKW)>KZpQg%;)5@99TE6$KR6&v{HWK7LN)4c1UGoq_H}t7}~pe%{1(`aWMlE~wc( zI8Yv+yBva!F5*D#T(1UPd^F?g5l)}QGJzpadg8t6I9OR<^IKXD&MghxJ0w#aSP0(K zAVbcdYp-?-Ue|ca)qpWt{CQj}if<25Bt`c{ma;ZE1H)-b@?X0&Iq z^3Me5M&6q;Sq~S2t6~|9 zCf8;Wk@Qz9i6LoyM~Q&HVZEIA?rX`)WO3W0XBwcBy#b%7_+qb`%3mf0;-#a2H4~pc zvZ49gp$~wm&5=?a45{b7+)x^$C7RC!WjIhBEl@X&17aUjvf>K8J8d=@qn=oo)o6o- zqY+WAGJu8tD)-HR3ZQAAy$Cg#dK8I!I^yLaU={(ycM!i5q_N+FOvvK4PUN7r2gMv7 zZD|J*u^P_NKJp6^3!cgwKg+|8tJFG)Y#u_0navJd8y*TWsaEW+J{19*zlq4F5;PIC zw~{tk=e&#RQ3%15SfHj7uh@E0<%b9ow$7cnc%nFGlkOOhnCDfkAG*BfBehdwn7rUs zcVAreDnQ9DQQPpVbU**~??w;e)zOvk+#9+|FNn79BFePl)3WAS7c3;VmFd{g@mNy> zX^E8Dno0bdQKL7YT@53{n#cuVHaoOuB0Qnegi-@su>{m4& zKp*_Dx;k4R_D+En=tUz+=b{24%;8!tZPNwGircL|C?4)s%pDZ21hkTWwoV;MGCGDk zX%oAb15OyI2LcV&UJGd_e-fgPyJF1w7!VxJl(y($Q_7g3S*Md?z>db+&p8hhlDtLY zZ6=Ou@^?-U`6*tfUk3SB1iB=#TV`y>+di`xE(<0Qh8gzeOaVq9xWyZ!BLe0uxns;f zzV#O4i#hT?hu9BWgQyK@GeAlM*zla!Kf_EiPaEc0Zqhtkr#j7c=pXDdIa{1G z!H1YJkyc}NC*CGlPFF7pA)J8)LcjBQfgKVw9$KP#GhfCP>}m=>UrQ6K#Ql6wPcJS; zIaSIo&I<*27AT39v#U_SpA92g%fS|idwywBB3(|eNUaz~(Sl8&Ccu7W9zficPE;5u zV1O$#>&#FV`C3cT=HK{n`O_q56M+XYn<-ny`%6*ayT= z2Qvo(+|(|k1RRN!&nPxlaertkbZQ`!4X`CZpQostMq@*^rQovp1h#N4QwEFs?YK!n zPEh^`#8r#*{@xT+$2ggz(@)v}%`NPMb0jKsDnP8Z4?{?yoQE=lJ5&ut7g8?N#jy{z z@D^@C4gz%X2)g$<{|0`md_-t?EityfPzwEb`W1NY1e#&ym7kJxExvZO7Te8f^Dq(3 z4Wx;a;g&fZC|(-~(5P+%Mt0U24kl#ZmK~D5e!BAJZL01djKiOaI)jy`5;21qfQ6Lr z&|r(I7@2Y7h#HDY0aOOf?GMdFg9Q&H8I0ZcMiRjK)9gqrl!U~p@9yB<`FrloQv%4$cIXo9A^J~-{hQ6+S-WP5ZnU$94y zKTJ~yKJU_dOSfNizl+7!mjQWW2t2dhc1Kl_w2TQ1-{}QSe9nAH>G6rq47uNcB z3U0m$I3shkY8}Xuf9A&Q>H)Epfku$*8UT0iUuW$W+;G@VT^vC^oBOb)ksQQ%JVK`o z$_G4~f8Ivf9Qg48U*GxWi}+-7+T#5DikN$2FKWG6tzSj#J27Ev#BfsXZ>1Fv$rZhC zs&Uh`e{2?&k8yJp_-4w!DIiaIRWQ+Jdf&3yvQK?;{@LYBK76v$?{5{{%-HMEyMLp6 zjjxv4Ck~1)!?*e@hOnl-EAUOQ^9^AfF8JKrH`(J}eIOM4nMD`Y$-@n4;itdK2D5#E z+PKECZS~8<%D_y=u=O?cVt4fR!N&pJe3YdJv%LBK zvEKDz7MO7kGvv3Poy>X(ESPAUjF|Ksbsxyr<7<-5xpu-Mm6SKGQd=RAN2XGY$fK)u zR!c#PU+AQjcw?Nz={l)esgl=mnpuOhW-k4kws;|@Fuy$Dte=q~8fmy?+s_hTyp&25 zp^9rtLStPV^?stVVhKGo!pzxKPOQSTrclquUmdyXq|(+n$nv8xLNP*9v~t5Om8py2 zKr?JV>f7tv>YIk&E9<|#Xu_VT=Sfd`DSt1MJa$R%aI;!6yTWgFZsH227Ef6xxjfz zlXFJ5q(mDM^;CQEhl6;*mHH9WM>8>T_X4}2W+}Ow_wag)W#q;;E$RIv!%TpFN~911 ztW(D10u#6=dZ?E!nv*NK8H+}+>Bq|EzUJ9shgJp~Xq;!8$jqDWhT0q8?com58Ia~$ z1my!r^9H2(7bww@!G!a=nH4B1ri@l2Oqi6!Z@(oc?~<1!KvNRq4^NPg@P>rqLAJy8 zXj5D+1)H^Ob!~R?`#Y5{jQ-oUuZt1(VTDuEd@Att#@p5LvY131tUHCcTMCON?Rn+L z7?Wcr>OmJnh74sa)%STAei;5IdsvTaY9b=ixN2jtfGeDM)7c~PveX)8Pcvpz=wU_~ zkhq9C(B^M@gd~~=Z~V{2eHNIzKe{W5``+YZ->`ly}rQ zG!xb&?vN#CMA>&IfVfW3;exM@bN|%g?}`iHq)DS3)zvJ*vinLv?VUEaWsr5a5jAbi z@X8r0x`*{w)VG~k%1cHfSL6xKjr0c}8UBb#MLS6_t1 zAz@WfN?)Y3D~$7%ODNDrF<4(;2Iq)fc7d$+7%pvO%(~6&mNXb7w9`cs&cpbK-4rEE zS$`59l<8jEuRo|Otdp**Ps`~ssJP1+<2)#uMCYh^iCjVUslRb>aIk1GSOQ@t4i}ez zAS*NFXA$dlD4jbN`bH=u)Q^FTtxXCNuQ|61dwaUk#aV;C03H)JwOB{R7On`Mw z=f1G8lcykDGaoBviP)*l~qag(MxqfH2ZH5CQ#AEXL4%c;8LFE)s)03<6f;9VWOzrXc{G zF`KR%&Dg9Qzqu2-z}p%oM!VObJb`x-T<8R4k`Lv$_qe-nAOdJ5K`+B@GnQTIw{Nrk zDg)WradfZoj&{~b-g~Rq*N*p1xzd9K+pu;<1v~<&L5XFHn3CW+4Q8?#ouIGG$)M7Og?GU@M~&(_|tD+Tf>XD(j29rCHh5=KEw zM4mLclFuc{N?R++utCXdR5fGrjaYQ&p`^b34R<2rw^;|jf(GHmQx+8xF8laRe<4*A zmis(zgl2ds!eV5+`+-T$E8thDto4RUsOwqPtyQxZQKtstkXv_8VzcfIc%9(W+w0?w zx-X)-<-JOWtl8Yt3X)jj6JMN|l22NMJwW%!qqw3PYB1{s(ev*usPz7;TWd@ACXUf8 zwDaw#o6|rJ?Ph^AHqNGMma~)73?A&zy)b8h^`x6EUgO;^F{~-r%3`yP@gbgAM^EJ% z7HAXQJ-SK9*umi_V{jFtXisOA%UyQ-zY_=9P}d`T-&@Nb_|-EV)ZL})hc$|hmpz=% zH8PdB@45i}tijudv16K{UjF0w538sL?@w9Z*Zxr-f{Gh?gVY|b&(|mATIk;e9(auI3W7xCN`ascmJ#Yxl`Pg{kg(7%{_H)GS061_KH9wJ5X)`sN zYVA~UW%D;H+`q8`71kO15bga3XnmE&R!87faTSgAUmETtHl~w@^$#XcEC>9&sr^P( zW*g$B4$F3kj9x**Bx5i3)S>Gj&r;hG1EjsY`zyD;Zzc0wo-eN*(uW@Itta(Ml*!{k z4$C7!b{Ik*-|QW2(IH{i6nCOkmS=r`VYcnHg_e5UEp|s~uJ}uPI6u9*op$OSY|sAO z{fzHOFMrk7@=RVq*Go;Q;@5Jd;A^qhs*!u^&7jrsSGG(^D@9|>e0tgaF^}bL{j%!GZVg&zAO96ntb`4YW z1ty(kQ}=BeutWUh937mvj|k5r0+6E~`TcG?@?{i>%(8fIez1vzM;{pyrW>t5OpVhk z-;*1yD}I(rK0sn`etr)by^ zOL4LMx~vCST!ZX~tleo1NtDx?9K0smw=tnQTJ3!N6GzNWWfBR5%qx{oK)6ullIhYg z6H;*m`n2?nbPUW)UgBY(;vQ5%9N0RP!v>5Bxr zOF}2Su5Y9@bP~F>;fMPfljFxjn}_lIFY~8G_K!b?-ecC?q!UN>zQa@rsW)JSW-`Zs zVVgioSL;OGKHl`_#Y_lCx>ITG8PmGr)TSi$1!--m&BInE!%vK$O2t0H_C^wOCOV&Z z0}L0Bpa=v;C_%wQK#s1!YH}3=qfdM~V-pg{^0|l%+&a3?v48(g>nLH6I~+e*pfJKX zZ=j~~D}hEy0*K|}SY+PnHvwfU5_%~>0aaa>d)1Dz-9x%&Cuy>Elv8ew;yRW{z<6V- zfD(a*lp74w@zB)0&}HCZ4cZ~q34|9qiia-?s-;kuCBEIJ&HR(--=WDLqKP^(aCMRpI2kVo*TE;AwW_p;T z4;4(LQQ4f;m=nAB*+3WHZu159$zts`dF&-MtOZKSsq?77@%H>2x|4BO*gxdQx=ICI z>g8ub$5V;YT;sst(iMeC3xTPup<5X2at_g8{Uvf+)?4aNd_6%3N{O;Z?1#^9nixnn`Fyy>*$c?knEuE8z|kr%olNzfnANk%-)Hi6yPFA=kk8fQA(w zI5_qU135Sl$Cz+4r!|(oyK~()R`H? z)yPmN-XdopYP(q+7Ps~0=$Tf*DaFj5Wp;7Hpkn?rdGZGaTujCH!Z@*?N+5i`(h_Ui^i)`scoz1?ZBYk2>ZlW2JUq}f$;0^gNm%ejR9uFh(wqXyXR8~2B`4mBfws{Ws9 zGivFC{-H+~@r3>*&Z$4uGk9Mt+~mNmUe|uT{UR$bXbkXqfnYrp~Gn z3w%$Es{#F#=T)%?d|!+&e;w8a)I9$*q0;y_Y5=bH_0tWd8koJ&U*o#V0{paNYWakD z?9Q%Z@v|sS>|b|UY#K_hcUmGfzi*2s;%7;mQbP$fehS2DDsK-P?P@UI?zF^f3I+IK zPpx1C_%FxQNPe`OUI6*|U?f#h3-HUFUcmm8j4y+JzEf1 z9zP$|F*Q6tpOi3@)d)huKl^Ls2cr`90JmQP-{a0tC!+%Cx~_fk{?EG8cZYehH7t9h z0=_j2KWVOR?Ea{Le+|t~K2KNfrwxeSuqO`AQB!%ofszh#Z($qXx7Hx@vRs%6%`VrG z6{z25@=4|N>0iT+*=~n7x5hVfZ=Z*gO4w1=zMmdEjH}`Q@KJwC%I!U#82D3tqQmUniMyzxyJfMQ`md|hZKSTfK*FBifktqWE`MgyB=bHnl1L}x`;6JkznIPM+Z#y>u)u^B$#Ak#Ue{a3WtaAA{gk4><> z-ZaDXd(v-?z2EeER^!Q`>%~?&B0v|Z>sF!UyCN@DBD&y1H)T$rt(TflUJ z==;<1qo;6YnoJsfh=1$4^R})g9(UkGrZ`x zOP};xF&8hNjlH(@TUW1Ky|?w-FtKU-H0EJ$)tW$bfop&?0%-eE_hh2xs2}T5Tt5Qg@>5NM#c)M*{35q(KE5sbY!t z)5qrD6uK#OZrimU_6Mq2&`8m+rIMj%!N`S{3ab=UETx6`E9DbuMT1FO5P_m(C9;vX ztzT6@J*kFxb?euzst6fJgsFl}tJqM>P`9L%py@=>52qQ+)R(Mf*&q+wM_L`X$Wdib zS1dEY%s_*mh6IW97wjoIP_=Dg6Noay6k>t@L{3H$3o`~^5jxLz;m(zBwI=1wB+i{m zkT<7nOkN-VYw9MvD14L)b|)X?!AlUo%EQIdVI^IYmGr~Rv|H6=Rh=|26Z_T>=UI=P zKD_w|XrP!~jx2RBH{1Quxm@XJwxh?xrZ%jCTB8902^2J}BM+r{N%5XIc52UIfM=b& zS4ulBqMQ8rYxqH9&e4|GRiWF@fQ$x%n$0I^Hj!b(ikZx7vSGxk=`>u_hj`Hy{Cx4t zH%-Yp^_G%UTT3&Yb@i51TQi+)bvc%I9pr*ubmVst|1-p|0s*u(;RRvGa?~i1Tt&Pn z5l1S7;R3ElxK(V?*cl=#7l_$CY~J8sNT~(tIXNAu7fZQ{W!Fo&9V+e@Gu!JB6I?ur zGwYEqGc)U4Jiku==2#{U@C1AOLW&`2Bb17K#&LtOI2z<$$NtDXB2eh)5Bz> z)3~L_l_jXPq|=g0Oe?f##wQu9Fq=28+;|A^n8@iXipl?b&|66xO6XRO_?s$h8vi$u zuR-EnnylrubZY#Nsu!&=x(J2vINZcEu?%UO$P|@>5)$IWKT)(-4y6F7^>qb=IJb`T zVAn-Xh^2TeY$(WQI9|yAb`WcOjx*`!!k$Eq3%Q5{Z5?(On)ox*N3v@#wQx)!ch>Ss zC(ZK+i%NH=%&pVYOTrS#hYHJhk8U95g5paGlj1=9-ttO)ko-z(jN-53gN7^(7PZNt zwI6~){G&AziyR`+lnA2rwT4KG2AW*@9=(^GZF3;fXLweGjST(hgRU?Ooj|duW!M0H zeQ!-?t>v|Ro*r!ggR;%`ZkAM+Dnt&X_$Mvd!Z1iJR#^zMi_TNt$hE8{+I5Od9~TU6 z9j46m%8X(3()pYp{}l(ETKjtN%Jw~?*iidwdnZD*hjfol7_Wp79H~a9bP&kgHvB@g zjzRi!hoWT@xd=3A875Ro8rz9r48S!_D&~^?q)D;)mrAyAa6@(fm0D~|)PT1qEAz18 zLL$%Qo*Ywuvy0`ic35)IiG*!gXWx2bygSWxbq3*B5Pf*exA7asv)v)wI>)m175X3E z3BUK@8eH^Yyfe`eXip+9U)eTf5j9Y~vxhC7K5p+OfWwb==M~Wy>z$|uNn7*vzyvw` zh6X#Ttsb77p71v@X_qPpy8cF{?onO4tqM8?)iBc^@Pop$pzeC3i0vn6ghqyYP26vI z5hXOS7bZAnSYtR@WQfbS#UvMZOfjBP^`=@(znIXOUcBsp0Nu)pG#A6j1Ulky30Ke( z))lHkaH*UCsSu)a;!wCTA|YiwlVqA4Bwz#=8rjkr+w4lJAfLgs1Hb{Z%NCZ9X6Q4d zC{jDnS@cBrzR6?)NF=iQRF+^Mnc0vsav`RS@Bu>SqadCL{PN`!6F||y6fLA%TW?HE zzlf~WmPOmx1ajT4%{Dm^v!qG`t{&OETwyWiCnld%Bc!-?@zmI1i<~%@6ErD}x^zs~ zJ$>FL2ljM~DX)7HS*Btz_$jhgd4M}3!ys;)UJf8>R&9pDBj`P1J_7{4US&AzikXiYYP#sNcM{Eek9a3RE#-?>?ogWun7>n-VTG=4` zH>3W}xqh3^!@9KAZ_hdPK{npY$oO%@X&2wvmq@}1D6;~(l+Xs;Aw@wapj$-G*gsvpMt~d-n^q$?(u0+SVrsw{J@dOBhGy zGoTE#fO5p6ACu;`ADKLjDzK-I6O2aqw+@Q&mP_52#3%MY*lc7`G+e?vKWiTt$`;o3 zZ*rVXXFMS&qnJDFFgX=4War<;BYDjF4a}Ihy+FEZws;4MQKf{43M;7QG0Ht=7MQw} zHh8@n#I;RB-a`7JHkq>_ZE&=nvEiGKzZx8|p2f#^JTeaSWMPeK@igPR*IPz*Lv3Cd zZ*evmhIRlL4PTB}n&TktW|g6-Ese+Yp>$ApO^7i9DX17eLH&}jhsJ$ ze13vEoJ!Db5!UqI1V_ijGtC&i>g|lZNWp?>7}+zmfZ%pFS?rVHCja<+sW=)q0V|>- z{+_pkFOYD{bE(%U!*;U5LK#cmDAVNPXqj3}$kP-S5ta$mk2!sdLn(#O)E254uhURL z3Fl2#PODDQj!J)J*7<)fH8dU)*}umKGWYt{&E3$oZLi$Vb&rniW>jey5!*Av)bOBVY))z3OCPScti$-Kw`X>Xk8FcTx64>r zMu%J;$!qX(jcGOM>PUI<3%sERMi8NkGQtY;7o+2L9JV&0&XHD9)Q%u&srFkIkqm|*Yqk< zC1Z_m^0%;u7-QFWXepe~hpq;?KHf-&*x>u=g6kjz&V(#A!yHMsT((n`WBr>??^PdB zWy2Z)w{i(dX-U7a5=_+El!P#W21gS?0kfE)SKn+z--v&g7Mux7co7RwMnx23ArdwM z6W~C_43>p9WSWv$e-KJ{CWa(ZE#9esrvppOuNHQx7bXk5~JcS=as(w#eMc?9hwn(slEN@;K#WR5yvqreQe7*=E`B^l4g>* zc`j{JsId|e;;6FgMx&^|W{+s#wS1x{s=No>YT+$1V5;`TvUlxCe0xpicy)4U;eI7F z8x0r5ue%);4NtuM?Fr_OyM=4GOViGZ`p4v56*x`+g_|=6^)~gBo)y1fm|Ef2Iq)$-*)|#jtek=0K2Rr$$GTagKDy`wn$mn2F~2iiei5ON2dHaiPs*auti9hKY+|ur7HCzRkz# zI7nc9y>+KlO=;KUX0LQjPuEwc80O~pvKA4Y{cdbsJr8Jq3oChxFZOx{d|y#?lkMfz zE{TTP&Ubfv$NjTCD#sYSlksM+C1wyHM-DsK)8mS(PAg zWpmtY%LPo_$+nTj=)?DK(?{Q^dCa!xg{uH5gi(f+KkeLg00OjTPzvUbl4BG7lWFvK z(!~Xm#U%YbR9UawM>(f?_m{%jg(rrj+iQ#-eM~8R7wL)Cu4ozQC>d$5RPD#@`eKcj z1@~R-xOU_k(W{cHmh#!Dv>pz0-)Qy6ZoSrh4kO2F(yO99*8>8r`9CXVT~X3iB@5Cw zR~QAw=}^o3fWH^GF555SI81wMxyug0w+_|usYm_zrVgSD(eJ!O@WQ3BD^;Z`@2SFiod3$j!O6-rf+X7BO*@_{ zx&Mz%(MiY)xJJ}o_zxTZEAbmBzjqLc|7Rmmh%XymJUqX9^&{#xIn+9+zoWZb^RVIN zAi#}}Jsnvjdp;zN`tpb{?p(wvbNhetxJ1ft#h>D{4^|x&XoeY6kf~@-ymf|=S=kZ9ThE~(C<+`) z0wMycKjaEb#t~5_44TNg_na5mQ~s0Wh0x{yiqd60*u&Wq(!u;C@les||H&$7B(2LY zO`p9;pYS>=VJYORlg|hzKT)pU9D^Cg)AWZ)V3K{K!}_7Y5tGR9*#DK$Sczm}QFbyG zyTs|3N)m5`8EVMWl;Fw!<2@$_t{*A^kYR#0#S8=S!zIMgjYcU#mIN=HyKryUz$5<( z3t<%*$lRZDFbA;aU?a#yCx)XA4MHE>dGP8ZobZItotAQ*wMT8 z5-1hfxQo-V=O=E?o$cFOc6OWq7S+CNl07+OBq%VDU{2+X_OdM%hV;o}7t0(DmTXeo z%<06~DRFbs#>Dk88*>h+IlUzYtJWV|nirr>HkTxsPo5}98Ym7D3x)&DhGHe7$%hi+ zMF#csL#fP4fS`DSZ7x8ylpx!Xu8G&h8sheI4E&M0fv2IRo-u;~SnqXJ0KfCB}In5cr#82v{ci?+Sm56 zlPKYF$a~+kdH9NGpJ4<1ePvPOBU=6o$=@pdkSS!x-W2EB4nze_GW-2@{V0r~kWxn< z)TIO{xNlJg+;3L-#Sm{%3jALQApsyAU5Y_NMZ9gpXm3%35aS6!A?6xX=Yl;4A4q@9 zHcM%TYKo_fmwE-RRr&cp~VDSC`sa9mz2m7(!eEFww@1VjV` z0+fvT^NEB63C4vWB9#_a=z|u3YUClPFUp-XQrK@n1kTJ9E=UdpBr*kr1ca2?zX6mm zX5Ivg-#f=ZIX6qY&Ct|#`Oi_!U2&Ym^Z`;NepauHY2wFObohhV&aLpbG`-}E zn$Ua>l>51JnO1yY+rIQklexB8(#J+uv~}l$EAHuWqu-h`E`o)h2Y6*y=lu>t3^3K7 zH}iN0kT2)GYt5E=B=Q2WEorS=CGgg>EAg|>wJ?)S{03Duk8!^54|J9e9}`jKM=@FK zf3KZGx)(Pqyc3;aV!svvIX+C2a~NqnBt9lq1o;=&4G|1La0W-ccs*o1xo69OMAPXj zq)b-Gdf4I!3@ol+PnXi_yu$hmc|^CIW1FuTIE&eEFDCXIjpW{S`)z3juxIUvKmt*= z6la3Mz)S+>2viU5?T7WGM~%M+0L9W4gACtfjcCHTE)PnNe1<{Ec?{B4?6?ZK7D9M z!4sNn&S?cgWk#Ih1T%B&gN-?Md=|G8YA5`ztfmX-A4Q>Xv&Uy=d16eFs0A6#@U)9w=-Vr79{1kBEl8o~z!qKwJ5YU&>h8QQyR zBXy=EmR!xF1tIIS$vijMR{AIFqPDbZU#Stfn+N z>-hmS{}Xa>c|<%+jGq0XC20^7d4gciYVtZ5oRB|Aj9-ZXlHy&t3*y;VLM9c1T&X3* zC7pT7#i2FNSw6&TJL4aJQuAe}3gv6&ntvdA;m(PZdrQw1op&Ju3N<36LL9bnRJH7~ zR)BFmdu`b&NMKvO*`nIVff?9o=KKtT2ozn>YV8ESU&(GFdO~6!NubK>^C1NVtf1{E z!`%HaCws?Q1jlSdX|9yxn;8|=mjd@zH>->ZYW!f*n88I`AftisZK=;V8=<9nb^Zo9 z($leed1K}lQ2Oy~MQ=_~=#w_(eS9MN7-q`HRX=ZUx>0n?<9u>sZ2(1rXV-9vtbB0>m18kDOnx#ir;7b+K11x^JS zbO5N6cw)8hpXu^D!maR$HS&4Op@fe_#`Kj+v7Eo3m&$GclQHzy_p}_hXw0~qnYZ81 zKl0-r*ki~7fjP^BD7wOK7P&6?R)P4kXrq~OlT9Eq$bs~!g$yrCARaor`ZV`B2IdkpIsx7>y8#}QM}Yr z-1E5dec{jz1$gGQUo8q(6CB4!QA-HYe;p-sh2xf+CUd-6j5H~^Fnp12!jH4BFD*wI zcO)wcCViKgQFQ;Y<$sz{Kn}VqLpwd;R25F3 zMw97QS)9oyuY<{Go~H*e*L7kHg)-Mg+ysz!<#DAZ$+>cX81@oG;U(Eecn0a1u36;@ zE95E{w@%=LiJtHZh50Xfb#J*(C90N}F*<7z~x@j(wMdt;sKWje{LB3m) z|BJ+`V>OHVL)x+`#&7h;ZWzOkcj?~66b#11nA1XeH=;Xz=Jz9}p_~}2!;p3SWDr<0 z5jA0u8&rCEq4<&L28XeO)2wce`2w;~oMEMpD=ERvyhUXk9jNm>*XJnb>x+?sdUU`~>z%sD&GC|p>FNf_5P#@ir1x;K2c4`0 zg!i%gs??+eTJL1x9{dn}GI@%ToacyWqahbuP;?c(4~9aeDq>I*H5Nkzr34UIq|(q| zgCWPtA!RClx9V&0x@kae$dt7sg61=m`zkK1q9rNk&YRI*Jk1KK>*b>RkE}XNz1NYe%5-b_GptdX#OI zo=;|D8BM*zX(QHdu@b@lH)RXGki;QbY}Kj(rM*2At6pSfY}L_3k^3yhPFi7wYg(FB zsQYlqt zXA)uh&eG-Om%~-nOw_mjdbX|^IX!_(=Y5`drFHvYEqOY>FMzCWc`>o;6%v24Y}|0V zr88qsf4nRM%pO6K}smV#JPejMpmTW>^g1b;q9|Qw0vdOH=Zy( za7~sanzS`@)^Q5GuyzD|R*u4mLe>Pw4=|eVAG&gVo!L8=7Z)$*f1d+4#$3k4M;Z}1 z;-%N_a}Ppf-xGFe(rckkb{JF5=ceC0IGF6yjtpGc<~}5 zBSN&OtNIf)eae6R;(OxFMnMYT=K4Cb_b)FlTyzyp3EYi2jERplGIGRAr|su%#~*gG zW|=+%R8BL1v6{x3vS(>&`J&5d#J6@VH+uOKJWl|W%Qo<;)aUTxM@B?|U`bQyPi*|0 z@A}2Zsr#FP)WFS^Yi93UUb?vKCYt(L8-a;Z_IzevAnE^q=<=Esb9)vSE?<=MJ`dfG zbdH4!2>~MF<*uF26|}J3=XjDx>OoKTaI6}VE8V%gbYaO2B=xsGVm3Pr-_@J8gj@ zPYPdop19~5xlO2kboZplmG>8)UYlDfiX)p(4>8QmHk9pvwU*!-9>Drf`OQVcum}K% zm0Kteb-K|2%!Z^x2UCk&aKPA`RIz3n7y`g?g$jj{8fk=qu~X*Ixf(nQgnN44_Ie$j z5Bw+lF z7J^i&)!q!b>p_{%4`OYdnYDa6?KkvzY$Zoze(YHi@1%V{KmU^oJU~s!0p?e-0}hw6 zM5)93O`sZxHV+@5{Zoq`-$NWg3keW+wA4!_O#-TPU5SPMGgVKvzMj#hnyo1AXU2Z6j!EF{F9@>gVK} zjl-lX(`j-oN%d&=(;+H|R{ke$H0@j@QW@7nC$s;AQrHepEP4&@6Dbbw-zkb2S{m_v z7DctDs=Aj1drd=#zqGyIv6Mg0?F&!^!T5xp`?T9@L&rfQ^lrrHewlmHI1W>>p#W z#6X?Q_pZhcKp*1X#DtyHei7GAlt2ih+^C>bZ?6CVOq{SUWx%5Vyq&@7pyGHyJA1w! z6Gx|wjFSukJ5?VGFmp`eIFbb{11y*hM!1+ZBRMdU>%B1P0UI&E2Oq={WI10BCc7{@ zL(l&`S1oo?iX)U*-ppy4qphOkA<yj$kZLoTD*mnxUzB z>2>PbU2cu_N+B_l+Wa*j-8E)RBL6q2Jb4@2(|x7X(aw7{kp zY?9=wN2gRUwwehm-C3}-U^)NwIdp&AIaYk+NC=3my!M}aP=&U?;+7^|0kyG%7;C1k z?EdoQ#ii~MY0sJwY_uiMW_t&yT(-d#P+Y)=j}SRhgzNq4KXLOTKB{V-lW%Vtra*VE z?lZq@VQJB_tN0Y?_NepNxCoIDAX>QXKlk_kV=p%yG^J*x_d&z!uyF&zrEY3iX)q+i*NX!_$b<4PON;q zn@=g3O`q>JpoTHhK&eX-LtbCFJcbj!z3 zJ)iAJf4WG%Ahh69Begy0?rrw};P0D7A~6qh6j#h&QhSYm)}%Ql+Im)VDu@9Gp#+dO zU^u(j$$fZU&xJ|IGWM^;K#vxG&Al)Ig1Lunf?%<#ZS?Tuq)3Rg?V?@Ht5jN*WpWk~ zj6nak9k)dX^K$XN+p1%}H$G{LgO-#P8ZTwzIn7gtY3nHnuFEo56ryAr5%*viBvP@O zw1onIf&Cy3FVDmf8nviOB(TW8+OwvC?)JuQP9hkeLy6=!D}(#VQ5`w`(@s6l!<&!- zCXIMReCb08K*#(Y=O{z~uEzG6#1@<^s-Pgl5lzGtq73ZLYbnt>a}qpqtno}2${4VO ztjG)jN2zG5eApR-;gNP3OxK|wsae@L4z# z#|7RkJL7wh>Cm_ksWO0K7k`C5DFac2)Dt`_;|toyNRb^Dq+O&pjb!2Uvxp?bJ%k*f z!hz(T7Nky6T4qEhW(?RreV8;b*O5D|q1ykwyd(5y&fT)r;k$QKYgl#I1QaNsqxOts z)0;3i?ALzkf{;N&lS`z%_R}O9F}N_242P6GwU<|ATLKWeJvqU#8&JLx% z2fa3#;`SvYI);A{QKr#pzF{#}R=uaNfgZcD0JPd4=o13sn|HqlJeLQ+c+;TQ6%8(pQBa$ukbDb)mqRNY~|>VGTb zA&Q|qe-2yks5hE0ePJ*M;)stQHI3t3w{bD@nzgzunZZdzq&SIZx7_C(C&Q=jT%ume z(j=fYXxGYGPRtMpp(J9ifVd;nLYrt9XOo5Nwp5|<6RAZ;gyOp4?X#%kiR$T6ddyd%bSx#&fJ3azh)%#e=QyN}qU(5TIDX*aZf8bR4$GD) zVs)-vM2Yaj)eW3GBksal(J;&;Qak(4S`E-k%01kN^qyTcO>VafqW81;aG+S5b#aEQ zsLhzkK!eHl&pJ&$3IOBYqEgU*Oc0|= zKhs7fNly7%bg75r{6(f}a9f)ke?iG{bKB4i(;t@3C+IoQ9V|}SslJ>nlA6&V@zMRa zJCD}pLwP&4473Sr^aQX>2$$vPMqB<^5|@khc~PmNpfq@y*s4$n0ly_P@Pi5mAKawR zPqwD_*yHLF`y{4cJ{*zst^wc0Y$7{=hV%o*2?s4t>lY+0P^2EohV15nde7d8EkXUG z?_HfB?hK3Pax7NL!TjX5PQ&ZnQyKv!iX3Yy z$sBY=lmXm|pl}cLwi3mO=#D@~$$}Y3Y3hOHDZQQijHDVr+zC#bnm(=F&DfL4>N~e; zhgt7>*LaOlC?xG+xOeD`x%*8NaTE<%;0yxs=9qY$SmFhNKA5%MKo54NXC6Le{4swa zEZFC84JfhqgcZg$h<(5?39=m*isC_DMJnRxswz$NL~B_jUm$-KXSlqL!KeLqkSDmy z6oO>dWg+bR>4Pqwb4;oYmN9NsAEd9}529d-QgQe#PH&N6tDj7n<cy4H*wwiwq&((ATRk@Wv}8yq~Oxo)a2dmS@oaNh8!;63>1H4T@ zz|9N?x+7nj;ILf92U6a2232muO3D2M^hv$Xk>;vGS7r>L^x53AAE|nQ#Gl+3>O7#w z^NEqYJFWzLn#;@&&HSOBNn9x-~YU*lnj0|F`A<+FDI z2sU2ccLU7!mZUAH{OU77yz`!cC!vG*OPYcQgFsjg%v1W9z7?D8p7qavIA+)2$>z)} zk*-k0;OmmLco$aOpLsf*i22~hT+Di z!w87=lM&}c{m5g^3JKP-o@Y7`{|B^XrI<9!UKYX z(~xfN{bSiGCLO461SF|T@JPT3IBax~W*FmfJWejE&xm+p6mWb+GeSU`QB|mnmTGW8 z4_$2KZ9=iqAN498Hm5!{Io=pLVloPt&;7bG_i{Su$wXDj5q`o3bnBBk6&$D2>QxR- zZqm&bB%*LiyuHa|0hyZS#W?q~nrho!pMWcL)l)=c9#V@v8GGef zP6BZNFJA|&L#mZ1n>3Soq%n~>d!_dIVh6bk4KWN2r9K#yxQ01WCV!s7q0 zcJ+UY4;|o^%%RI8N|7l{F!3-4ajF@Uy4UQbE;&oIS?>&^(YH4uzy;m;PcdCI9(ebS2vkH>v+&?I6Xmi1xLx`J1i52OnH6PSHO*P7NnGd5}0O8 z!U8aUrXPCn$7GR>ItTOdeV~|{*Qv^M9UMwzdUjy?p!xVh=MGHC9)t()ngzAl(~GfF z8=}Fqx~G!MbfrnD3{$NlaUGx$hSOVk6nb9`KK=oN7!aL%pLc!Mor}e5 zANY(u8awc(#>txp;F5fUFKBemj7cZEjJV3 z2UJ>RZvG2Gxv-|xn(Q_8M^zFVw^NJ3jsc7UpZXH0+&bzkL957S5(}GE5?Y+Y&kW$L zY?o$NHzDp6l*PAi2gPuU7r?<$zBNp0z>0~B{dfnDk@UjOlY@sLg3IDk7!9}}@6j{k4 z^g+qM^@G|*q@dXl-wNGoutz0I@MrP-p3ZESdoNDg>RDmB?P4TQc)fgb!dQ(GhXm(d z=*F0G&#M6Y2x;MrQI0gmxOQ_CKtn=_mpqVT#NOJJ0hpLQBeHQ-%IQ5$)-hz7f9twg z1@<;0zV1AG%0O$f#+&Gbten+xP%uc8=r;xTL4}nB&$w)1kL6mFNJ#z<%hDcL+}Z^s zO7O%=(R-N0;eU$o>R|pfA#qIdqw$o6^zKiJ@6pkecc^>wPOEqCa?BIf!@gP7_3sIp znwn6V@nTGaOos^7_@B81JVv^+`pZ72vjr6_^G7Ls-t4XXDb67r>$Lk+n86bgEzo9L zHG4jytVZbT7zSs7dKVu3E-$lginioPZ3~a)HjZRvK0YH@0ZO|-+$y}-&@r+1iYV^T z?@384#L>ItZP;GeTNR>g#Oz<7`4+Mc&DDW+Oz?&UsMQsZskXR!2H6)eQ!(h;TQ>h0 zhTQnas0~5EwAtM?H(4$CizNn48e^q&F1sNgWw7@ph6s_<<;Yk@V)8>PhJ1@1GA*pq zf^5n!)PvgEn}}JmsTRtR+^R1K-jv~~j@HK`w?i)rWL_ZOLg;78qL=BaS*G1=JRBb9 zjoRcv7d=1Hk>{Ob1$y|uoLoVh0gH;CG&U){g=v9{LvKxy59|gCL-pdsWMX`4zS3lt zYIr9Y#h6>?9@KZj9F(dOAm_L_3{{JiyB#A;8o!oW?U>XU^NXomC&7nAtPJtGL8>v} zVaeop1>B}7y+OUVlDFD3faoC_9Iy?fl@ydz?s-Lc4~Ni$v}l0~I~&Q>Lo8b4m4(?{ z^G!VVJO?ga?hcsV zy@%PI6I`rGhpK-l9g4FyzyY7a#{47y{g(1osf0tuFu*cMgkAP}dk%J-TmWHvD2M0p+Rp?wF~veRRU z)GyL_gdVlc=Kf^_qcjP!wL@@?zKm@#6D^fi}eX@OBA zfz1|^;LJ?6>Lj$2i?_{hweb16k;kA(=Ok)|r&;LIU}wdpHn zSH_WI7a~sVDr#MTj57bpIb<%+!7IX7l4Kk5%HDoQ@-z_p_un_kgf*KW(JF4t=_3Ia z7L;SZ5RGt`zl1hd<7Fl*jJpyar*u@P#6q?<)~^pu_uG>&N)4~6m2Bl?R~f^mCw*;c zwb0}Dtolq9pXjtOu18xJt@fX=t$F^-1u2&t$7ykJ=bJoMI2x02sc>B3=4{T&a$X5K zrb1*w_%|5)mh>A)`b+BDcoicTVARB~VV&~WU`UkZo;zsJ-SX%nx#%+ocT)#(&p=nd z68d}`#=(m-o7gz4>*RU|hQ3I7uyZ0#bU_{etdNlaOb`BMs8nXTD9cU|AZpAufqRG- zoPu)a+0%sKR(=2AgE{XhWy7%_;L%VD05VQC<%Du-p(>k$L!E=qt4SGdw>W4P?Jp&S zS@8%*6~Mqc9H~ep>>FkUehu215SeMU&EUBzJKFAW!?9*8mI}h>l@!WHM>E_e{lI|% zKMTC16|r+*|Gp8J#Zdjs-u1)M3GEzEDE(~va;kw~{>^>T{JRfHZJe%yk$?V$>=Qt` z2dNC#!Me@EAvq>hv^`^h(aT@&qDgHmy=G-$#;%7jh8-i^?J+OUf$kXV#H^@6Ohr`( zSnq@qC^Gsjcf%i4!H3$=nHj3Hyp)D2kYA=n5n2Wk>QXvfmLO(tYJ^*oOKs$EpDdiu zmkN~5g8XO?3B5=Yo{#6E|$@Ld{l{dBPgeLyC<{MR^}jTx;A zy4PfwA~yw6h(WIaP(-av8@pK9yJeP@_cZ%0(Y*tYp{*E$^p6KC?5Dn^DKqoT`}|*X zmVhM&3gyvzIiKFhTsS}1gZD_~1x`uaP8FkIVYd#;Cm59u(7MBkhsbjzMMZioSpQ#` zX&?_t@#L`J@Hq>f>@|A|-fE7bO8yBoUpgiK1(s$e%?q02_08aFLYwy&TFb z*rIG0 zxyAL>u|ck+DRK2bCUwkCsJjkntKE5Z#45lGnN|YTRiwmeWJoYXY*u582QX97WIqGL z(UTX&k-XRhcRJ(lO>RtzHlc)@S zoRLD;^h%tr;l{_v&Ao=_xGHr!;oPKfK8f^RAF1JU2Mvt=5$zsConHu8vbIZ|@$UYR zp-MzxE=Q?|Y6Z_(**!<^@|Mf30E<<&qgsI&SQJBXGYG=10yKYjXA}MNaeC`Dza*D~ zja(k#>oN`+xLiASum}a~d(Kxbmp+23OxFg(WIRx*+vh)Ax6h1Vavd%LGu+~neSmva9v-zJJ42@{bEwMz z$eo;#i6i*y@)Ei3c1{q~BwHea6};{YoK}4%uq-8`R@FHnepk z{$a?JaGJ!@H>%`|zKF3%M4%h)E$mE>#{i_;mwfd}VMQ`%iSguOH+X=#2pME6Y~zuw zAe+8A1u2wl1^(l`)%jjj!!`^eClQ@N6TM~vUEe(5V3~?eGl-KIHQmT!Gyc_Tu~)@e z>^OB?X2^*|K_q9dU9(cZRYecYpp~(j402s!Z7%6jrd2M-;B+SQu zm{CbVx+7{+JYKX$s6|C(2-jCzMQ`%G3(B04)hn`yIBfGEBR%D$5+O|%s>Ffs zP3Vs8hy2|B`5YeDDvSD^juas**-7mC2D2nCj-L!BWe#tTqt2}4T-|ch$>Av^J)*a} z{jjiLVvyS(I+dN|SfkK&gLrY>yEOi#erLGN|aL2J%X}U~3YLS_hQ@<3 zN`n}!)v$2G%8@^%tsJYbKyNFd?<)JII}L^OAj3++jnfjhbg>r;Db6gQ3@_uZO9ZTy zMXaC;$k8lawu0CRS7=i$>#%{b90iS~JYy4PDF(aZj?Z^#K7AA_#d@3%5)ktJ|Nr;< zfB*mWJ)Zylf4)E83K6CSWA-pF`!RT>YH7>sAfS1gh_?-NY2!%4C=xal%;+;t(lS8m z7@@|T-QC+3x_9>1QO#={A-f2;m*u-4_cuucss@sf48rxzittp7`4^1#m)jvmv&2zx zxh*}q?oe=?pQwhwq~!EW46Ck+c~8!==eT)iKsc@7)_bCQV1P9HbRre-U0e;Aju&1T?Oq1LN5yXvfSr6+M&@R{es$ zvwcRertSqfGd+xm^y+lU;A^r8oxV=_$r@dqIX3e%O+|;TIIwc)67D?zU9pHIRPwei z9vxkd`m$j(=I+k_Rrr^wwDQ0?K~jNeAw)P)I-l2<;O&;tLQ+aj-YM;a*o7}$JrdZ9 zyMQz{!02dbrx)Nx+L_m761B^k! za8ZZkZ&R24sO}%)Tt{;Ho<^Y6+>^GzJ-)<+e|bCeNFsM1V74Hvk_Rn~97ex~orimu zm?_5lQXMo^A8eUsO{}s9I!!YD z{}9EkU-ByI{(MR?09eUBg?rnhHWh6FqLiHJ3V5RCmb-VE8ylTh5UbnQEPP(+7AAhr zvc``nTBPBO^%@~<4 zK8MB!PnF&$1$!6Gh4X?}BW=Ez7OjWifPTZwwj z;Ch}(cu19yTbg?5DMYqi?wN|9Kcg9RphoLf>TCYsnfk$fP82y(<2-{dV=L+M3=SZIP`l7*0DlKp_J!_O8Si0yT~t)c7q zq{hE|m0j36|7{|~$A);B6SK>nE%hXpAJI?1FCju7uKvV!uRyF|&<+SA`S+xI3|L@` zZ>pe6eE*>HSZNd@So~oLHBmWQWG^goUXy{sF%UtLw(h+mUv>Tsd`VW{uNWyHn~z;i zF|Q5S_G9w@3h|~SvHKf9Hu$P2Ugw#o0V)L5-SB*h__{^nLDu==tZwxwE^`(pQI-K+c)9Tk7DQ@Fd0OfK_Ylf z%oPa+3rrx+5R`6QPSuupbX@2@*CF+T==vghBA|o3D%@ia@V}<^Im#aw^{5(3Z>cG| z*h z@Eb5b3atmr7b>*U%d#goJiWRw6MD>Qi`I+5Q?0%aKJU$wICToPHNbTAic`p7P~$=q z!_zP}u`OvHfv2pFcrU{fw(u%GOA%+kn>G`tj<~AuL_=>illCdijivyL~CJ1Sds|y-=5l!?(x&je8Ha~5_ z^zb%tN%T)(oEN9ReanmNS5{uoYjLW0(fOIO-OIuzc{Uibjj=+}Y)Q#@+#za}s>Mvh z@2NC()*F|fUcC+Lg6)kMx=om{8vGv@d_CDkOxi*{2+WejmU#u1R2jqTcoGaPbsNfOZLr=pFN|gl-2H2d3def0Nw756EvjUSVuNTB ztL%8?3jpgDhMW9(`|Eu{)WqAH-yV9T5C`pK?tmoPsA@A_(B`sKazgbHBXs2HKaiF` zULeWfyD>sZ+c5~&76`|ORgyju?`DOO*@9Djs*dTSbAmuldYp_5`CZEPGgbZKjJs1@ z)DKh_{G_Lu?QDoKociKfqOB;-*fYOiO+*rfF@c$uI3jE zX3Ajcxb`a42s>JMZAviK|3e-L@^iBdzIqVms3<_V5FZ*oB3T+6X3&mS5&7Tv&wS(s zVd@Ou5D!8KbHZZsXpxJ7*X2CRJ@KAXo{(IC(Mwz&f0*R42_9&oy<@l*Rlzw41%Zd{-;oWRo{{F(H^NwJKAB zXrVNHO}k#cE)M5O_x)^^MJ5ijPR8DF$e&dyYaI(WBI%GD>PP*o1#c2BuKL+Y^!%OZ zdCbna)a}_6$8WGudZ88jaz32yQ6MKG$U%o2kbd5b{VK>@<#Mye&@qo78OTNd}gN@}fY|HW0|L7B=sUr)RbP=^DCsC#l zGFRtoisDgFx8}KaMCJ4qipLDvgJ`I%3$QHl0_yU$DgmS8vO2<1BsX zRI~9z=CqFl0@2)1PQC%Gzpan$w+3~WF@n1@tZd5epX<4046Ql@ysaT1tf6}L$gJr9O$W~h?&$438MFifb`>Vr|Ei$ zsb54~dzUq!E^F6%w;93mWB&dOg1Iu-pK3>ABMpLS|MD5;m;$RXb(X(|#ga(^Onqg~ znZ$gw&D%CfUVTKVsSENd>H8wOnmLf^05%`FE&SF`^X*Cm9IsY)%?gFDMB$%K}I0s=jPpAH1F@Tn=nU!b8izu?xt=`;S|?+$p!J) z%7!U~y$?xgZ340!SF?;M3V4j&iXOdhb{h$e`l%8fN3-5$z*|FoZ->M7Q3YkY`d$w2IM==Db8*E+E7K=iNy zM1BY>#udb#-g(R-Z3u=GBZQEhf*lEg#kGUzLUA&y1+r*dr?S*$QbiOJR%s0}2|e4& zS&4zAHvRRd#wyk;Nu46$nqo<>NYFA?4Q3Y z@7su14iHNHt;CZs?9h^-+*k$}glr$Nl3s@Q$0^LTzuq?5!Q3dHD$&w%IOa@IFUWtC zQwK2lwYcWQ2T4myhTf`je-ZaMrz#g`=J7O@r8B6hQ&n~l=_d5Sjl!}}IDdA_D>FX4 zQ4|NDU9o9tPzvFb_`=;M1*>*2Bu*(=$C*TSyNiB}jWa_SJl$B_Y@msYJ2J60|y_rw+W!bN`jZxZDMd_c&`d)%cFBQ9| zkI-kFz?k>{f8(=b>qECU1g9&3UsGGWaK1?Fp<<{``~UdA-}m~S@BjTj8PELxayQih z%2I_q!3#~RM;5c%-QP4gO`n_4g@))tFJJK;i8hIJc&WvU;}#uqdL*rc@M@H|xo-wI**Y&&#FKlm@2f)lcF)b*sZ+B2M}Y8* z{~;7~3oR^P?8zVGnkJ#eU)?tUP@3AhGE&vV87r4Xf8QoLMRMH^_C7OOEeLh@XYYVh zq&xIy$&VdkZUv8K+3Li@DAq%ogrraM1hzfSbNvl^ZHYrxI|5lc+!s(mV`yDvz&LMlVUCFY73g zxD007pi z6KPB6N3~P)U$d5s4@UEyom3^PADP&2p?vDZ2SKPAG=TV0E=Ng&bB{29Sku|aw@w8( zZk5d&wtP3Y@r*E|xCr%%Y65dCDu_kWe%OiAx>9Q1Ls zvkeFU;-!9Aton`+v4@Bc;=<$e?LgtOSxI(OxNt~oa>UtjKV@pS>kJ=RlACJg|CYa| zwcOUOZ#e3Tuae|_+tN4la|~HnJ&TX^c(DczAr#437$05dx-D9X^pi0@Ue?&fOa7g6 zd;i3&C>ZtLHBQg^!0o~vPMvvhzD@pf$y>br$dL>FHT0JWx@F3ABbq+^S~ahR`Z$)t z(sk?Ll_=2*Ou5|m&>*|guSpjHZfyfp-OkT)%Z4ob!)as`(l;ekn);F7N$oLkT8@8p z3o*j%ODPSJqBB`cjp}{_ckv276y2b?l2?+J9$_*KX8vc9FwY-W6hU8TvB#)XR#c*? z@Gf_zMQ>XetX_1sgG}2k3K6`u5BwzFbnfp8lw+~Z^Y2Ht3<9x2io@Wf13)flUS7*I zy~nh#5j6h5N;8zmH#l4+`E3MY{Bta}mN&IZRm*PalQNOyD3jkzCK4x{w-t!kcs>>H zx`y;KVZ@DdAujn8#=ix4S4?N$p?fNg$P0XgS)FBqH?N>f)7OGQ_#`%$C|ZYEmQUPg zEQapKehXKs+_rtRywYt!(3K6&IG$-@)*_Sx>e@jEnF!7CotApb%FjV8H86d=(pqn) z@>a^OB$Yt7EGe)^?H^&ys{?M@)ao6h<`9xNgu7^dDdCL8>>%>PQWOj`qoJ-?8i7~= z4oTlz_GgB55gc?N5@L8WeEmEb+B~nu^`z-bQb#?NLBm8@iSmCc6$0VtP=?gH;@uZb zRkh_Vbdbt=3w;m2!b$$w6qWoKKiLlxFL@ERCB5@>ThC#p6oF;uD3m&PTt5%uz zb5v@}-+}Vu@(nrL-~?g^#^-x)rzy^@s}(T^ksx1nhwv-Q_fanC_}zP)h3Wib!Vy_m zYt*a<JlL|98ocRsAw?FMUZkTungIZ>N3^2^!I<5j5Jh^zs>>2&#lvgD`C?Q|1 z@_O9OvxxX_aUwTc+Jp&?z$6?nBZV5nHRbMYlQcoixzvy_1j7s3mpYf%7h4txw+U30 z40tzQI{mrq8N(d`I6a#j zF@eIo$rZqdyY%23+91gVgn(sOzI%*D$41vj%(C1V3kT&go-N4bK*ELgpRULO%bX=6 z^xIj|B>RDJia~sgPX$CVWUzp?xpLPYA*Pq|2Id%dn$Ej+rimGTE`_=k;6g@uYVq0S zZWsl~#7eD`OS)EN9t`l&*)bnssspbO9i$QLl1gz;gyh)aA}V0?W3iolw9=l9I6^>{ z*)ecPk3N{azM9U7_~LFNJ-sTh^>%7%+&|? zu>UA<1PK42>3M$Rt}2{=gtz~I!-P?ZI5s^#^j4XP8mI;sfz%d~W8_hkw-+NCQo#(n z7`L3$gXVfuG~%s9iTt2%q`?;q&hhI!7nRBd_h6?KK`+5JIS02rNc6%!MHc%&(aOa+U#%tX{{a zOESOWm;AJF!cCa1$0phd$bHkc!5mb}9JZ*OKp^A-fdrJAbZq(1U8c#f`diuY-ryUZ6;Pf`9^NVfsVtzXdFEYQ`Dyw@nC zCjc3)IWOJ7_dK_f6k{Kg;?+Kl*O4Dql^0TCc*+NJ;l!74+W#=ogX{n{rI?Ovde63g zHUrzQ*Mn7kZ@DSvlKn^jQjH;Q(JP|sQM4W@2D>HG3ihcStz3u)17E?W9$azBQGKLH z^?otdj<7rlTs(9^C^I2yio$Gt+G>y2QFbw+48*K(qNtt7@?cJ6**ptcOxeIfP|J0c z2&9p+!|uA41a&>IYHN^Hq9Ufs6lWe@xjSa4Kt3K07}2~w0I56IO`Jk&$C|nF­g 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%0DEP9AD)$sS{HF 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

    ))#j3Iv=6Hsgi`%!0k0zX>67Zz)qs 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 z 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𝔚-u(<(>TT97UXDOn4}=f>+9qb{ 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%0DQ?{ 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 z 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

    I_ zi|8?ezMIg~ZYI%-FOXylbucs>;1b&!aE+eElB*hR)ulDl=9Q0YzztZ9DTF#WsFBP# zQpM&yOU*jg1?5aG=n3v#^Feq{maOc4SZo4jwrQ-XL>I1=bVwdCo~Ue$I5X zjA60x5O`USSQo(5+Y;{ZQ#Jg1L|^H&44e68h?mHYseDGepk8KfBnywsJd2}A&#A=NqRim+KY%9gTm@3>GiC5`gp}EMb zgb0Z$WF?-^y8nhFbBEC^(rGqTmM3oVpK0aUbEZ2a&Vzz|qGF$c$DJgg_XxLYr5d>rB@%M)XhW>z% zuC+lj=Fe6dwTs2^rqMxfDDTH8w!sSYC{`R&$th?oQ`oVa~uKTyGa2FSo}q^o}3 z$X=;h3i+;2@bGozX7uGta}$^FD+YsJ!6A~u-UIoB1`2@ZkgS0;$f9bqUFq4lp`x7U zjIb8Q3?u8Zf^##dV&+_Qh{43sM|Xh`hYf�K34zt_8CIF9z=a`O$3Yl*P7p5adAc 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

    #3*2{@il$`A_VEYgsfMM=7WO*9{6#I%O=a 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⋧{Z|< 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

  • >K}ondB))15!4&_i}9Q-{Ffq#YKmK*_DD0)8>7cX%q2M-=O z?!(ddLhYh4__V|DDn7w%$x~7&P+V|!ZjpIuUraG=!~#0ObHtyxbh-4`t*>LTURW(K zpRSrAJDtB+hyj~&uM|3mN_=GoO@^nyw@r|8r$Cm!rI2tAIpdZ3DUGu&tKG34D+l)S z6#pDKf!!o;$Uu+fO~5pZXGN*Hbx9dFjhoO?_~^x|-hcL=EnU)JVM?jfD2>Ah$E8oI zZ;uZbDKCX@H+PR2grY8m846t$mi>ijGtCjYFbYxJ0cwI{JrNj62jbMlq4{M(DBoKh z+NGNe)n?~jp6nw6xOk~kxp8g5EnzGiz9*3|x=N^prHC&~q)j^aX76t#XGxWYG@@a^ zEh0o|F?_%a;xL_bOecy+guLu*{9{&nNJgiX{!IO@7*v_x|I-&2b}Pvb&9_Mt8pcDf znwK9_;328-G~tq2AnV&qn%Yl^G`s_e6GG>+nHT^dCq;==A2?ZWCczP-fV4}=JzxVx zo=U__59_T3Gu-*OqKLD}v4`@&AUtqy`#DMCjDas|TMfsv0$L%f%+^d_fcHRnm{PKA zX*$KeIvB#yuQe!YiSU6fWRj%{7MG}N@%ij8m94 ag$N02q4}iF2G@onCNzxqHRo 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 Result { /// Configure initial storage state for FRAME pallets. fn testnet_genesis() -> Value { use frame::traits::Get; - use runtime::interface::{Balance, MinimumBalance}; + use minimal_template_runtime::interface::{Balance, MinimumBalance}; let endowment = >::get().max(1) * 1000; let balances = AccountKeyring::iter() .map(|a| (a.to_account_id(), endowment)) diff --git a/templates/minimal/node/src/command.rs b/templates/minimal/node/src/command.rs index 432add922a7..c17f9bc5592 100644 --- a/templates/minimal/node/src/command.rs +++ b/templates/minimal/node/src/command.rs @@ -114,7 +114,9 @@ pub fn run() -> sc_cli::Result<()> { }, Some(Subcommand::ChainInfo(cmd)) => { let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run::(&config)) + runner.sync_run(|config| { + cmd.run::(&config) + }) }, None => { let runner = cli.create_runner(&cli.run)?; diff --git a/templates/minimal/node/src/rpc.rs b/templates/minimal/node/src/rpc.rs index 4b283bb2a66..451e7b21dd0 100644 --- a/templates/minimal/node/src/rpc.rs +++ b/templates/minimal/node/src/rpc.rs @@ -23,7 +23,7 @@ #![warn(missing_docs)] use jsonrpsee::RpcModule; -use runtime::interface::{AccountId, Nonce, OpaqueBlock}; +use minimal_template_runtime::interface::{AccountId, Nonce, OpaqueBlock}; use sc_transaction_pool_api::TransactionPool; use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; use std::sync::Arc; diff --git a/templates/minimal/node/src/service.rs b/templates/minimal/node/src/service.rs index 8217a4f5b3d..71b1ef65b6c 100644 --- a/templates/minimal/node/src/service.rs +++ b/templates/minimal/node/src/service.rs @@ -16,7 +16,7 @@ // limitations under the License. use futures::FutureExt; -use runtime::{self, interface::OpaqueBlock as Block, RuntimeApi}; +use minimal_template_runtime::{interface::OpaqueBlock as Block, RuntimeApi}; use sc_client_api::backend::Backend; use sc_executor::WasmExecutor; use sc_service::{error::Error as ServiceError, Configuration, TaskManager}; diff --git a/templates/minimal/pallets/template/Cargo.toml b/templates/minimal/pallets/template/Cargo.toml index f0abe3c6942..9d231fe7d7d 100644 --- a/templates/minimal/pallets/template/Cargo.toml +++ b/templates/minimal/pallets/template/Cargo.toml @@ -13,16 +13,16 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", features = [ +codec = { features = [ "derive", -], default-features = false } -scale-info = { version = "2.11.1", default-features = false, features = [ +], workspace = true } +scale-info = { features = [ "derive", -] } -frame = { package = "polkadot-sdk-frame", path = "../../../../substrate/frame", default-features = false, features = [ +], workspace = true } +frame = { features = [ "experimental", "runtime", -] } +], workspace = true } [features] diff --git a/templates/minimal/runtime/Cargo.toml b/templates/minimal/runtime/Cargo.toml index 42ea49ff404..5d3cf8492e5 100644 --- a/templates/minimal/runtime/Cargo.toml +++ b/templates/minimal/runtime/Cargo.toml @@ -10,31 +10,31 @@ edition.workspace = true publish = false [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false } -scale-info = { version = "2.6.0", default-features = false } +codec = { workspace = true } +scale-info = { workspace = true } # this is a frame-based runtime, thus importing `frame` with runtime feature enabled. -frame = { package = "polkadot-sdk-frame", path = "../../../substrate/frame", default-features = false, features = [ +frame = { features = [ "experimental", "runtime", -] } +], workspace = true } # pallets that we want to use -pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } -pallet-sudo = { path = "../../../substrate/frame/sudo", default-features = false } -pallet-timestamp = { path = "../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } +pallet-balances = { workspace = true } +pallet-sudo = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } # genesis builder that allows us to interact with runtime genesis config -sp-genesis-builder = { path = "../../../substrate/primitives/genesis-builder", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false, features = ["serde"] } +sp-genesis-builder = { workspace = true } +sp-runtime = { features = ["serde"], workspace = true } # local pallet templates -pallet-minimal-template = { path = "../pallets/template", default-features = false } +pallet-minimal-template = { workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [features] default = ["std"] diff --git a/templates/parachain/node/Cargo.toml b/templates/parachain/node/Cargo.toml index 1737c6a9df7..7cf1f1fddc7 100644 --- a/templates/parachain/node/Cargo.toml +++ b/templates/parachain/node/Cargo.toml @@ -14,69 +14,69 @@ build = "build.rs" # name = "parachain-template-node" [dependencies] -clap = { version = "4.5.3", features = ["derive"] } +clap = { features = ["derive"], workspace = true } log = { workspace = true, default-features = true } -codec = { package = "parity-scale-codec", version = "3.6.12" } +codec = { workspace = true, default-features = true } serde = { features = ["derive"], workspace = true, default-features = true } -jsonrpsee = { version = "0.22", features = ["server"] } -futures = "0.3.28" +jsonrpsee = { features = ["server"], workspace = true } +futures = { workspace = true } serde_json = { workspace = true, default-features = true } -docify = "0.2.8" +docify = { workspace = true } # Local -parachain-template-runtime = { path = "../runtime" } +parachain-template-runtime = { workspace = true } # Substrate -frame-benchmarking = { path = "../../../substrate/frame/benchmarking" } -frame-benchmarking-cli = { path = "../../../substrate/utils/frame/benchmarking-cli" } -pallet-transaction-payment-rpc = { path = "../../../substrate/frame/transaction-payment/rpc" } -sc-basic-authorship = { path = "../../../substrate/client/basic-authorship" } -sc-chain-spec = { path = "../../../substrate/client/chain-spec" } -sc-cli = { path = "../../../substrate/client/cli" } -sc-client-api = { path = "../../../substrate/client/api" } -sc-offchain = { path = "../../../substrate/client/offchain" } -sc-consensus = { path = "../../../substrate/client/consensus/common" } -sc-executor = { path = "../../../substrate/client/executor" } -sc-network = { path = "../../../substrate/client/network" } -sc-network-sync = { path = "../../../substrate/client/network/sync" } -sc-rpc = { path = "../../../substrate/client/rpc" } -sc-service = { path = "../../../substrate/client/service" } -sc-sysinfo = { path = "../../../substrate/client/sysinfo" } -sc-telemetry = { path = "../../../substrate/client/telemetry" } -sc-tracing = { path = "../../../substrate/client/tracing" } -sc-transaction-pool = { path = "../../../substrate/client/transaction-pool" } -sc-transaction-pool-api = { path = "../../../substrate/client/transaction-pool/api" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-block-builder = { path = "../../../substrate/primitives/block-builder" } -sp-blockchain = { path = "../../../substrate/primitives/blockchain" } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura" } -sp-core = { path = "../../../substrate/primitives/core" } -sp-keystore = { path = "../../../substrate/primitives/keystore" } -sp-io = { path = "../../../substrate/primitives/io" } -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-timestamp = { path = "../../../substrate/primitives/timestamp" } -substrate-frame-rpc-system = { path = "../../../substrate/utils/frame/rpc/system" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../substrate/utils/prometheus" } +frame-benchmarking = { workspace = true, default-features = true } +frame-benchmarking-cli = { workspace = true, default-features = true } +pallet-transaction-payment-rpc = { workspace = true, default-features = true } +sc-basic-authorship = { workspace = true, default-features = true } +sc-chain-spec = { workspace = true, default-features = true } +sc-cli = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +sc-offchain = { workspace = true, default-features = true } +sc-consensus = { workspace = true, default-features = true } +sc-executor = { workspace = true, default-features = true } +sc-network = { workspace = true, default-features = true } +sc-network-sync = { workspace = true, default-features = true } +sc-rpc = { workspace = true, default-features = true } +sc-service = { workspace = true, default-features = true } +sc-sysinfo = { workspace = true, default-features = true } +sc-telemetry = { workspace = true, default-features = true } +sc-tracing = { workspace = true, default-features = true } +sc-transaction-pool = { workspace = true, default-features = true } +sc-transaction-pool-api = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-block-builder = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-consensus-aura = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-keystore = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } +sp-timestamp = { workspace = true, default-features = true } +substrate-frame-rpc-system = { workspace = true, default-features = true } +prometheus-endpoint = { workspace = true, default-features = true } # Polkadot -polkadot-cli = { path = "../../../polkadot/cli", features = ["rococo-native"] } -polkadot-primitives = { path = "../../../polkadot/primitives" } -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } +polkadot-cli = { features = ["rococo-native"], workspace = true, default-features = true } +polkadot-primitives = { workspace = true, default-features = true } +xcm = { workspace = true } # Cumulus -cumulus-client-cli = { path = "../../../cumulus/client/cli" } -cumulus-client-collator = { path = "../../../cumulus/client/collator" } -cumulus-client-consensus-aura = { path = "../../../cumulus/client/consensus/aura" } -cumulus-client-consensus-common = { path = "../../../cumulus/client/consensus/common" } -cumulus-client-consensus-proposer = { path = "../../../cumulus/client/consensus/proposer" } -cumulus-client-service = { path = "../../../cumulus/client/service" } -cumulus-primitives-core = { path = "../../../cumulus/primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../../../cumulus/primitives/parachain-inherent" } -cumulus-relay-chain-interface = { path = "../../../cumulus/client/relay-chain-interface" } -color-print = "0.3.4" +cumulus-client-cli = { workspace = true, default-features = true } +cumulus-client-collator = { workspace = true, default-features = true } +cumulus-client-consensus-aura = { workspace = true, default-features = true } +cumulus-client-consensus-common = { workspace = true, default-features = true } +cumulus-client-consensus-proposer = { workspace = true, default-features = true } +cumulus-client-service = { workspace = true, default-features = true } +cumulus-primitives-core = { workspace = true, default-features = true } +cumulus-primitives-parachain-inherent = { workspace = true, default-features = true } +cumulus-relay-chain-interface = { workspace = true, default-features = true } +color-print = { workspace = true } [build-dependencies] -substrate-build-script-utils = { path = "../../../substrate/utils/build-script-utils" } +substrate-build-script-utils = { workspace = true, default-features = true } [features] default = [] diff --git a/templates/parachain/pallets/template/Cargo.toml b/templates/parachain/pallets/template/Cargo.toml index 6c549c2c4a9..250895843e4 100644 --- a/templates/parachain/pallets/template/Cargo.toml +++ b/templates/parachain/pallets/template/Cargo.toml @@ -13,22 +13,22 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", -] } -scale-info = { version = "2.11.1", default-features = false, features = [ +], workspace = true } +scale-info = { features = [ "derive", -] } +], workspace = true } # frame deps -frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } [dev-dependencies] -sp-core = { path = "../../../../substrate/primitives/core" } -sp-io = { path = "../../../../substrate/primitives/io" } -sp-runtime = { path = "../../../../substrate/primitives/runtime" } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/templates/parachain/runtime/Cargo.toml b/templates/parachain/runtime/Cargo.toml index 48d9f691289..de0ecad9b06 100644 --- a/templates/parachain/runtime/Cargo.toml +++ b/templates/parachain/runtime/Cargo.toml @@ -13,80 +13,80 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [build-dependencies] -substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder", optional = true } -docify = "0.2.8" +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } +docify = { workspace = true } [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", -] } -hex-literal = { version = "0.4.1", optional = true } +], workspace = true } +hex-literal = { optional = true, workspace = true, default-features = true } log = { workspace = true } -scale-info = { version = "2.11.1", default-features = false, features = [ +scale-info = { features = [ "derive", -] } -smallvec = "1.11.0" -docify = "0.2.8" +], workspace = true } +smallvec = { workspace = true, default-features = true } +docify = { workspace = true } # Local -pallet-parachain-template = { path = "../pallets/template", default-features = false } +pallet-parachain-template = { workspace = true } # Substrate / FRAME -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../substrate/frame/executive", default-features = false } -frame-metadata-hash-extension = { path = "../../../substrate/frame/metadata-hash-extension", default-features = false } -frame-support = { path = "../../../substrate/frame/support", default-features = false, features = ["experimental"] } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../substrate/frame/try-runtime", default-features = false, optional = true } +frame-benchmarking = { optional = true, workspace = true } +frame-executive = { workspace = true } +frame-metadata-hash-extension = { workspace = true } +frame-support = { features = ["experimental"], workspace = true } +frame-system = { workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } # FRAME Pallets -pallet-aura = { path = "../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../substrate/frame/authorship", default-features = false } -pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../substrate/frame/message-queue", default-features = false } -pallet-session = { path = "../../../substrate/frame/session", default-features = false } -pallet-sudo = { path = "../../../substrate/frame/sudo", default-features = false } -pallet-timestamp = { path = "../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } +pallet-aura = { workspace = true } +pallet-authorship = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true } +pallet-session = { workspace = true } +pallet-sudo = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } # Substrate Primitives -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura", default-features = false } -sp-core = { path = "../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-transaction-pool = { path = "../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../substrate/primitives/version", default-features = false } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { workspace = true } +sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } # Polkadot -pallet-xcm = { path = "../../../polkadot/xcm/pallet-xcm", default-features = false } -polkadot-parachain-primitives = { path = "../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../polkadot/runtime/common", default-features = false } -xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } -xcm-executor = { package = "staging-xcm-executor", path = "../../../polkadot/xcm/xcm-executor", default-features = false } +pallet-xcm = { workspace = true } +polkadot-parachain-primitives = { workspace = true } +polkadot-runtime-common = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../cumulus/pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../cumulus/pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../cumulus/pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../cumulus/pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../cumulus/pallets/xcmp-queue", default-features = false } -cumulus-primitives-aura = { path = "../../../cumulus/primitives/aura", default-features = false } -cumulus-primitives-core = { path = "../../../cumulus/primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../cumulus/primitives/utility", default-features = false } -cumulus-primitives-storage-weight-reclaim = { path = "../../../cumulus/primitives/storage-weight-reclaim", default-features = false } -pallet-collator-selection = { path = "../../../cumulus/pallets/collator-selection", default-features = false } -parachains-common = { path = "../../../cumulus/parachains/common", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../../cumulus/parachains/pallets/parachain-info", default-features = false } +cumulus-pallet-aura-ext = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-session-benchmarking = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-aura = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-utility = { workspace = true } +cumulus-primitives-storage-weight-reclaim = { workspace = true } +pallet-collator-selection = { workspace = true } +parachains-common = { workspace = true } +parachain-info = { workspace = true } [features] default = ["std"] diff --git a/templates/solochain/node/Cargo.toml b/templates/solochain/node/Cargo.toml index 4e8b8184090..068284c6c3e 100644 --- a/templates/solochain/node/Cargo.toml +++ b/templates/solochain/node/Cargo.toml @@ -15,54 +15,54 @@ build = "build.rs" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.5.3", features = ["derive"] } -futures = { version = "0.3.30", features = ["thread-pool"] } +clap = { features = ["derive"], workspace = true } +futures = { features = ["thread-pool"], workspace = true } serde_json = { workspace = true, default-features = true } -jsonrpsee = { version = "0.22", features = ["server"] } +jsonrpsee = { features = ["server"], workspace = true } # substrate client -sc-cli = { path = "../../../substrate/client/cli" } -sp-core = { path = "../../../substrate/primitives/core" } -sc-executor = { path = "../../../substrate/client/executor" } -sc-network = { path = "../../../substrate/client/network" } -sc-service = { path = "../../../substrate/client/service" } -sc-telemetry = { path = "../../../substrate/client/telemetry" } -sc-transaction-pool = { path = "../../../substrate/client/transaction-pool" } -sc-transaction-pool-api = { path = "../../../substrate/client/transaction-pool/api" } -sc-offchain = { path = "../../../substrate/client/offchain" } -sc-consensus-aura = { path = "../../../substrate/client/consensus/aura" } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura" } -sc-consensus = { path = "../../../substrate/client/consensus/common" } -sc-consensus-grandpa = { path = "../../../substrate/client/consensus/grandpa" } -sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa" } -sc-client-api = { path = "../../../substrate/client/api" } -sc-rpc-api = { path = "../../../substrate/client/rpc-api" } -sc-basic-authorship = { path = "../../../substrate/client/basic-authorship" } +sc-cli = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sc-executor = { workspace = true, default-features = true } +sc-network = { workspace = true, default-features = true } +sc-service = { workspace = true, default-features = true } +sc-telemetry = { workspace = true, default-features = true } +sc-transaction-pool = { workspace = true, default-features = true } +sc-transaction-pool-api = { workspace = true, default-features = true } +sc-offchain = { workspace = true, default-features = true } +sc-consensus-aura = { workspace = true, default-features = true } +sp-consensus-aura = { workspace = true, default-features = true } +sc-consensus = { workspace = true, default-features = true } +sc-consensus-grandpa = { workspace = true, default-features = true } +sp-consensus-grandpa = { workspace = true, default-features = true } +sc-client-api = { workspace = true, default-features = true } +sc-rpc-api = { workspace = true, default-features = true } +sc-basic-authorship = { workspace = true, default-features = true } # substrate primitives -sp-runtime = { path = "../../../substrate/primitives/runtime" } -sp-io = { path = "../../../substrate/primitives/io" } -sp-timestamp = { path = "../../../substrate/primitives/timestamp" } -sp-inherents = { path = "../../../substrate/primitives/inherents" } -sp-keyring = { path = "../../../substrate/primitives/keyring" } -sp-api = { path = "../../../substrate/primitives/api" } -sp-blockchain = { path = "../../../substrate/primitives/blockchain" } -sp-block-builder = { path = "../../../substrate/primitives/block-builder" } +sp-runtime = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +sp-timestamp = { workspace = true, default-features = true } +sp-inherents = { workspace = true, default-features = true } +sp-keyring = { workspace = true, default-features = true } +sp-api = { workspace = true, default-features = true } +sp-blockchain = { workspace = true, default-features = true } +sp-block-builder = { workspace = true, default-features = true } # frame and pallets -frame-system = { path = "../../../substrate/frame/system" } -pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc = { path = "../../../substrate/frame/transaction-payment/rpc" } -substrate-frame-rpc-system = { path = "../../../substrate/utils/frame/rpc/system" } +frame-system = { workspace = true, default-features = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc = { workspace = true, default-features = true } +substrate-frame-rpc-system = { workspace = true, default-features = true } # These dependencies are used for runtime benchmarking -frame-benchmarking-cli = { path = "../../../substrate/utils/frame/benchmarking-cli" } +frame-benchmarking-cli = { workspace = true, default-features = true } # Local Dependencies -solochain-template-runtime = { path = "../runtime" } +solochain-template-runtime = { workspace = true } [build-dependencies] -substrate-build-script-utils = { path = "../../../substrate/utils/build-script-utils" } +substrate-build-script-utils = { workspace = true, default-features = true } [features] default = [] diff --git a/templates/solochain/pallets/template/Cargo.toml b/templates/solochain/pallets/template/Cargo.toml index 5b8349b5d67..e658a30d368 100644 --- a/templates/solochain/pallets/template/Cargo.toml +++ b/templates/solochain/pallets/template/Cargo.toml @@ -13,22 +13,22 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", -] } -scale-info = { version = "2.11.1", default-features = false, features = [ +], workspace = true } +scale-info = { features = [ "derive", -] } +], workspace = true } # frame deps -frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } +frame-benchmarking = { optional = true, workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } [dev-dependencies] -sp-core = { path = "../../../../substrate/primitives/core" } -sp-io = { path = "../../../../substrate/primitives/io" } -sp-runtime = { path = "../../../../substrate/primitives/runtime" } +sp-core = { workspace = true, default-features = true } +sp-io = { workspace = true, default-features = true } +sp-runtime = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/templates/solochain/runtime/Cargo.toml b/templates/solochain/runtime/Cargo.toml index 0af3899a666..af1cd466ea0 100644 --- a/templates/solochain/runtime/Cargo.toml +++ b/templates/solochain/runtime/Cargo.toml @@ -13,67 +13,67 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.6.12", default-features = false, features = [ +codec = { features = [ "derive", -] } -scale-info = { version = "2.11.1", default-features = false, features = [ +], workspace = true } +scale-info = { features = [ "derive", "serde", -] } +], workspace = true } # frame -frame-support = { path = "../../../substrate/frame/support", default-features = false, features = ["experimental"] } -frame-system = { path = "../../../substrate/frame/system", default-features = false } -frame-try-runtime = { path = "../../../substrate/frame/try-runtime", default-features = false, optional = true } -frame-executive = { path = "../../../substrate/frame/executive", default-features = false } +frame-support = { features = ["experimental"], workspace = true } +frame-system = { workspace = true } +frame-try-runtime = { optional = true, workspace = true } +frame-executive = { workspace = true } # frame pallets -pallet-aura = { path = "../../../substrate/frame/aura", default-features = false } -pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } -pallet-grandpa = { path = "../../../substrate/frame/grandpa", default-features = false } -pallet-sudo = { path = "../../../substrate/frame/sudo", default-features = false } -pallet-timestamp = { path = "../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } +pallet-aura = { workspace = true } +pallet-balances = { workspace = true } +pallet-grandpa = { workspace = true } +pallet-sudo = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } # primitives -sp-api = { path = "../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura", default-features = false, features = [ +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-consensus-aura = { features = [ "serde", -] } -sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa", default-features = false, features = [ +], workspace = true } +sp-consensus-grandpa = { features = [ "serde", -] } -sp-core = { path = "../../../substrate/primitives/core", default-features = false, features = [ +], workspace = true } +sp-core = { features = [ "serde", -] } -sp-inherents = { path = "../../../substrate/primitives/inherents", default-features = false } -sp-offchain = { path = "../../../substrate/primitives/offchain", default-features = false } -sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false, features = [ +], workspace = true } +sp-inherents = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { features = [ "serde", -] } -sp-session = { path = "../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../substrate/primitives/version", default-features = false, features = [ +], workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-storage = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { features = [ "serde", -] } -sp-genesis-builder = { path = "../../../substrate/primitives/genesis-builder", default-features = false } +], workspace = true } +sp-genesis-builder = { workspace = true } # RPC related -frame-system-rpc-runtime-api = { path = "../../../substrate/frame/system/rpc/runtime-api", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } +frame-system-rpc-runtime-api = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } # Used for runtime benchmarking -frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-system-benchmarking = { path = "../../../substrate/frame/system/benchmarking", default-features = false, optional = true } +frame-benchmarking = { optional = true, workspace = true } +frame-system-benchmarking = { optional = true, workspace = true } # The pallet in this template. -pallet-template = { path = "../pallets/template", default-features = false } +pallet-template = { workspace = true } [build-dependencies] -substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder", optional = true } +substrate-wasm-builder = { optional = true, workspace = true, default-features = true } [features] default = ["std"] -- GitLab From 0b11c27e3eedbe53d646c6fd2ec45e9e898b00bd Mon Sep 17 00:00:00 2001 From: Muharem Date: Mon, 24 Jun 2024 13:34:40 +0200 Subject: [PATCH 044/130] pallet ranked collective: max member count per rank (#4807) Configuration for the maximum member count per rank, with the option for no limit. --- .../collectives-westend/src/ambassador/mod.rs | 1 + .../collectives-westend/src/fellowship/mod.rs | 1 + .../rococo/src/governance/fellowship.rs | 1 + prdoc/pr_4807.prdoc | 11 +++++ substrate/bin/node/runtime/src/lib.rs | 1 + .../core-fellowship/src/tests/integration.rs | 1 + substrate/frame/ranked-collective/src/lib.rs | 19 ++++++++ .../frame/ranked-collective/src/tests.rs | 43 ++++++++++++++++++- .../frame/salary/src/tests/integration.rs | 1 + 9 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 prdoc/pr_4807.prdoc diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs index ceef6de6b74..478fb65e018 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs @@ -117,6 +117,7 @@ impl pallet_ranked_collective::Config for Runtime type MinRankOfClass = sp_runtime::traits::Identity; type MemberSwappedHandler = (crate::AmbassadorCore, crate::AmbassadorSalary); type VoteWeight = pallet_ranked_collective::Linear; + type MaxMemberCount = (); #[cfg(feature = "runtime-benchmarks")] type BenchmarkSetup = (crate::AmbassadorCore, crate::AmbassadorSalary); } diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs index 6f13c3d9d5d..c7f8561b998 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs @@ -150,6 +150,7 @@ impl pallet_ranked_collective::Config for Runtime type MinRankOfClass = tracks::MinRankOfClass; type MemberSwappedHandler = (crate::FellowshipCore, crate::FellowshipSalary); type VoteWeight = pallet_ranked_collective::Geometric; + type MaxMemberCount = (); #[cfg(feature = "runtime-benchmarks")] type BenchmarkSetup = (crate::FellowshipCore, crate::FellowshipSalary); } diff --git a/polkadot/runtime/rococo/src/governance/fellowship.rs b/polkadot/runtime/rococo/src/governance/fellowship.rs index a589b768afd..27a58a0eebd 100644 --- a/polkadot/runtime/rococo/src/governance/fellowship.rs +++ b/polkadot/runtime/rococo/src/governance/fellowship.rs @@ -356,6 +356,7 @@ impl pallet_ranked_collective::Config for Runtime type MinRankOfClass = sp_runtime::traits::Identity; type MemberSwappedHandler = (); type VoteWeight = pallet_ranked_collective::Geometric; + type MaxMemberCount = (); #[cfg(feature = "runtime-benchmarks")] type BenchmarkSetup = (); } diff --git a/prdoc/pr_4807.prdoc b/prdoc/pr_4807.prdoc new file mode 100644 index 00000000000..b60bfb52451 --- /dev/null +++ b/prdoc/pr_4807.prdoc @@ -0,0 +1,11 @@ +title: "pallet ranked collective: max member count per rank" + +doc: + - audience: Runtime Dev + description: | + Configuration for the maximum member count per rank, with the option for no limit. + +crates: + - name: pallet-ranked-collective + bump: major + diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index d5db82cb1fb..ca041da2b50 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1038,6 +1038,7 @@ impl pallet_ranked_collective::Config for Runtime { type MinRankOfClass = traits::Identity; type VoteWeight = pallet_ranked_collective::Geometric; type MemberSwappedHandler = (CoreFellowship, Salary); + type MaxMemberCount = (); #[cfg(feature = "runtime-benchmarks")] type BenchmarkSetup = (CoreFellowship, Salary); } diff --git a/substrate/frame/core-fellowship/src/tests/integration.rs b/substrate/frame/core-fellowship/src/tests/integration.rs index f3137316658..e3451bc4340 100644 --- a/substrate/frame/core-fellowship/src/tests/integration.rs +++ b/substrate/frame/core-fellowship/src/tests/integration.rs @@ -157,6 +157,7 @@ impl pallet_ranked_collective::Config for Test { type MinRankOfClass = MinRankOfClass; type MemberSwappedHandler = CoreFellowship; type VoteWeight = Geometric; + type MaxMemberCount = (); #[cfg(feature = "runtime-benchmarks")] type BenchmarkSetup = CoreFellowship; } diff --git a/substrate/frame/ranked-collective/src/lib.rs b/substrate/frame/ranked-collective/src/lib.rs index ceaf03de211..53d5f0c6662 100644 --- a/substrate/frame/ranked-collective/src/lib.rs +++ b/substrate/frame/ranked-collective/src/lib.rs @@ -379,6 +379,7 @@ pub mod pallet { use super::*; use frame_support::{pallet_prelude::*, storage::KeyLenOf}; use frame_system::pallet_prelude::*; + use sp_runtime::traits::MaybeConvert; #[pallet::pallet] pub struct Pallet(PhantomData<(T, I)>); @@ -431,6 +432,14 @@ pub mod pallet { /// in the poll. type VoteWeight: Convert; + /// The maximum number of members for a given rank in the collective. + /// + /// The member at rank `x` contributes to the count at rank `x` and all ranks below it. + /// Therefore, the limit `m` at rank `x` sets the maximum total member count for rank `x` + /// and all ranks above. + /// The `None` indicates no member count limit for the given rank. + type MaxMemberCount: MaybeConvert; + /// Setup a member for benchmarking. #[cfg(feature = "runtime-benchmarks")] type BenchmarkSetup: BenchmarkSetup; @@ -511,6 +520,8 @@ pub mod pallet { NoPermission, /// The new member to exchange is the same as the old member SameMember, + /// The max member count for the rank has been reached. + TooManyMembers, } #[pallet::call] @@ -758,6 +769,9 @@ pub mod pallet { ensure!(!Members::::contains_key(&who), Error::::AlreadyMember); let index = MemberCount::::get(0); let count = index.checked_add(1).ok_or(Overflow)?; + if let Some(max) = T::MaxMemberCount::maybe_convert(0) { + ensure!(count <= max, Error::::TooManyMembers); + } Members::::insert(&who, MemberRecord { rank: 0 }); IdToIndex::::insert(0, &who, index); @@ -784,6 +798,11 @@ pub mod pallet { ensure!(max_rank >= rank, Error::::NoPermission); } let index = MemberCount::::get(rank); + let count = index.checked_add(1).ok_or(Overflow)?; + if let Some(max) = T::MaxMemberCount::maybe_convert(rank) { + ensure!(count <= max, Error::::TooManyMembers); + } + MemberCount::::insert(rank, index.checked_add(1).ok_or(Overflow)?); IdToIndex::::insert(rank, &who, index); IndexToId::::insert(rank, index, &who); diff --git a/substrate/frame/ranked-collective/src/tests.rs b/substrate/frame/ranked-collective/src/tests.rs index ad8b7d2a801..a7827bcc1aa 100644 --- a/substrate/frame/ranked-collective/src/tests.rs +++ b/substrate/frame/ranked-collective/src/tests.rs @@ -27,7 +27,7 @@ use frame_support::{ }; use sp_core::Get; use sp_runtime::{ - traits::{ReduceBy, ReplaceWithDefault}, + traits::{MaybeConvert, ReduceBy, ReplaceWithDefault}, BuildStorage, }; @@ -148,6 +148,17 @@ impl> Convert for MinRankOfClass { } } +pub struct MaxMemberCount; +impl MaybeConvert for MaxMemberCount { + fn maybe_convert(a: Rank) -> Option { + if a == 11 { + Some(2) + } else { + None + } + } +} + parameter_types! { pub static MinRankOfClassDelta: Rank = 0; } @@ -179,6 +190,7 @@ impl Config for Test { type MinRankOfClass = MinRankOfClass; type MemberSwappedHandler = (); type VoteWeight = Geometric; + type MaxMemberCount = MaxMemberCount; #[cfg(feature = "runtime-benchmarks")] type BenchmarkSetup = (); } @@ -645,3 +657,32 @@ fn exchange_member_same_noops() { ); }); } + +#[test] +fn max_member_count_works() { + ExtBuilder::default().build_and_execute(|| { + assert_ok!(Club::do_add_member_to_rank(1, 10, false)); + assert_ok!(Club::do_add_member_to_rank(2, 10, false)); + assert_ok!(Club::do_add_member_to_rank(3, 10, false)); + assert_eq!(member_count(10), 3); + assert_eq!(member_count(11), 0); + + assert_ok!(Club::promote_member(RuntimeOrigin::root(), 1)); + assert_ok!(Club::promote_member(RuntimeOrigin::root(), 2)); + assert_noop!(Club::promote_member(RuntimeOrigin::root(), 3), Error::::TooManyMembers); + assert_eq!(member_count(10), 3); + assert_eq!(member_count(11), 2); + + assert_ok!(Club::demote_member(RuntimeOrigin::root(), 1)); + assert_ok!(Club::promote_member(RuntimeOrigin::root(), 3)); + assert_eq!(member_count(10), 3); + assert_eq!(member_count(11), 2); + + assert_ok!(Club::promote_member(RuntimeOrigin::root(), 2)); + assert_ok!(Club::promote_member(RuntimeOrigin::root(), 3)); + assert_noop!(Club::promote_member(RuntimeOrigin::root(), 1), Error::::TooManyMembers); + assert_eq!(member_count(10), 3); + assert_eq!(member_count(11), 2); + assert_eq!(member_count(12), 2); + }); +} diff --git a/substrate/frame/salary/src/tests/integration.rs b/substrate/frame/salary/src/tests/integration.rs index 124ab38c565..69f218943ad 100644 --- a/substrate/frame/salary/src/tests/integration.rs +++ b/substrate/frame/salary/src/tests/integration.rs @@ -180,6 +180,7 @@ impl pallet_ranked_collective::Config for Test { type MinRankOfClass = MinRankOfClass; type MemberSwappedHandler = Salary; type VoteWeight = Geometric; + type MaxMemberCount = (); #[cfg(feature = "runtime-benchmarks")] type BenchmarkSetup = Salary; } -- GitLab From 10b68db9e66cbdc06e68bd189e1cf71644a56e47 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Mon, 24 Jun 2024 14:25:30 +0200 Subject: [PATCH 045/130] CI quick-checks: Pull Rust deps in advance (#4867) Pull the Rust dependencies in advance to see if there is an issue with timeouts. --------- Signed-off-by: Oliver Tale-Yazdi --- .github/workflows/checks-quick.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/checks-quick.yml b/.github/workflows/checks-quick.yml index e7d9ce1ef78..954ac764efa 100644 --- a/.github/workflows/checks-quick.yml +++ b/.github/workflows/checks-quick.yml @@ -55,8 +55,14 @@ jobs: image: ${{ needs.set-image.outputs.IMAGE }} steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: fetch deps + run: | + # Pull all dependencies eagerly: + time cargo metadata --format-version=1 --locked > /dev/null - name: run zepter - run: zepter run check + run: | + zepter --version + time zepter run check test-rust-features: runs-on: ubuntu-latest timeout-minutes: 10 -- GitLab From 5e62782d27a18d8c57da28617181c66cd57076b5 Mon Sep 17 00:00:00 2001 From: Muharem Date: Mon, 24 Jun 2024 14:31:55 +0200 Subject: [PATCH 046/130] treasury pallet: remove unused config parameters (#4831) Remove unused config parameters `ApproveOrigin` and `OnSlash` from the treasury pallet. Add `OnSlash` config parameter to the bounties and tips pallets. part of https://github.com/paritytech/polkadot-sdk/issues/3800 --- .../collectives-westend/src/fellowship/mod.rs | 10 +------- polkadot/runtime/common/src/impls.rs | 2 -- polkadot/runtime/rococo/src/lib.rs | 3 +-- polkadot/runtime/westend/src/lib.rs | 2 -- prdoc/pr_4831.prdoc | 25 +++++++++++++++++++ substrate/bin/node/runtime/src/lib.rs | 7 ++---- substrate/frame/bounties/src/benchmarking.rs | 4 +-- substrate/frame/bounties/src/lib.rs | 3 +++ substrate/frame/bounties/src/tests.rs | 6 ++--- substrate/frame/child-bounties/src/tests.rs | 3 +-- substrate/frame/tips/src/lib.rs | 3 +++ substrate/frame/tips/src/tests.rs | 6 ++--- substrate/frame/treasury/src/lib.rs | 6 ----- substrate/frame/treasury/src/tests.rs | 2 -- 14 files changed, 42 insertions(+), 40 deletions(-) create mode 100644 prdoc/pr_4831.prdoc diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs index c7f8561b998..5e956bcdfee 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs @@ -30,7 +30,7 @@ use frame_support::{ parameter_types, traits::{ tokens::UnityOrOuterConversion, EitherOf, EitherOfDiverse, FromContains, MapSuccess, - NeverEnsureOrigin, OriginTrait, TryWithMorphedArg, + OriginTrait, TryWithMorphedArg, }, PalletId, }; @@ -284,14 +284,6 @@ pub type FellowshipTreasuryPaymaster = PayOverXcm< pub type FellowshipTreasuryInstance = pallet_treasury::Instance1; impl pallet_treasury::Config for Runtime { - // The creation of proposals via the treasury pallet is deprecated and should not be utilized. - // Instead, public or fellowship referenda should be used to propose and command the treasury - // spend or spend_local dispatchables. The parameters below have been configured accordingly to - // discourage its use. - // TODO: replace with `NeverEnsure` once polkadot-sdk 1.5 is released. - type ApproveOrigin = NeverEnsureOrigin<()>; - type OnSlash = (); - type WeightInfo = weights::pallet_treasury::WeightInfo; type PalletId = FellowshipTreasuryPalletId; type Currency = Balances; diff --git a/polkadot/runtime/common/src/impls.rs b/polkadot/runtime/common/src/impls.rs index 72ece79f194..709cc69cdbe 100644 --- a/polkadot/runtime/common/src/impls.rs +++ b/polkadot/runtime/common/src/impls.rs @@ -328,10 +328,8 @@ mod tests { impl pallet_treasury::Config for Test { type Currency = pallet_balances::Pallet; - type ApproveOrigin = frame_system::EnsureRoot; type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; - type OnSlash = (); type SpendPeriod = (); type Burn = (); type BurnDestination = (); diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index abbdca013ae..cb40a43a997 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -498,10 +498,8 @@ parameter_types! { impl pallet_treasury::Config for Runtime { type PalletId = TreasuryPalletId; type Currency = Balances; - type ApproveOrigin = EitherOfDiverse, Treasurer>; type RejectOrigin = EitherOfDiverse, Treasurer>; type RuntimeEvent = RuntimeEvent; - type OnSlash = Treasury; type SpendPeriod = SpendPeriod; type Burn = Burn; type BurnDestination = Society; @@ -560,6 +558,7 @@ impl pallet_bounties::Config for Runtime { type RuntimeEvent = RuntimeEvent; type MaximumReasonLength = MaximumReasonLength; type WeightInfo = weights::pallet_bounties::WeightInfo; + type OnSlash = Treasury; } parameter_types! { diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 789e023730b..aefc4e2db37 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -683,10 +683,8 @@ parameter_types! { impl pallet_treasury::Config for Runtime { type PalletId = TreasuryPalletId; type Currency = Balances; - type ApproveOrigin = EitherOfDiverse, Treasurer>; type RejectOrigin = EitherOfDiverse, Treasurer>; type RuntimeEvent = RuntimeEvent; - type OnSlash = Treasury; type SpendPeriod = SpendPeriod; type Burn = Burn; type BurnDestination = (); diff --git a/prdoc/pr_4831.prdoc b/prdoc/pr_4831.prdoc new file mode 100644 index 00000000000..8629ead6e81 --- /dev/null +++ b/prdoc/pr_4831.prdoc @@ -0,0 +1,25 @@ +title: "treasury pallet: - remove unused config parameters" + +doc: + - audience: Runtime Dev + description: | + Remove unused config parameters `ApproveOrigin` and `OnSlash` from the treasury pallet. + Add `OnSlash` config parameter to the bounties and tips pallets. + +crates: + - name: pallet-treasury + bump: major + - name: pallet-bounties + bump: major + - name: pallet-tips + bump: major + - name: collectives-westend-runtime + bump: patch + - name: polkadot-runtime-common + bump: patch + - name: rococo-runtime + bump: patch + - name: westend-runtime + bump: patch + - name: kitchensink-runtime + bump: patch diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index ca041da2b50..9bde1bc5c85 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1229,16 +1229,11 @@ parameter_types! { impl pallet_treasury::Config for Runtime { type PalletId = TreasuryPalletId; type Currency = Balances; - type ApproveOrigin = EitherOfDiverse< - EnsureRoot, - pallet_collective::EnsureProportionAtLeast, - >; type RejectOrigin = EitherOfDiverse< EnsureRoot, pallet_collective::EnsureProportionMoreThan, >; type RuntimeEvent = RuntimeEvent; - type OnSlash = (); type SpendPeriod = SpendPeriod; type Burn = Burn; type BurnDestination = (); @@ -1292,6 +1287,7 @@ impl pallet_bounties::Config for Runtime { type MaximumReasonLength = MaximumReasonLength; type WeightInfo = pallet_bounties::weights::SubstrateWeight; type ChildBountyManager = ChildBounties; + type OnSlash = Treasury; } parameter_types! { @@ -1336,6 +1332,7 @@ impl pallet_tips::Config for Runtime { type TipReportDepositBase = TipReportDepositBase; type MaxTipAmount = ConstU128<{ 500 * DOLLARS }>; type WeightInfo = pallet_tips::weights::SubstrateWeight; + type OnSlash = Treasury; } parameter_types! { diff --git a/substrate/frame/bounties/src/benchmarking.rs b/substrate/frame/bounties/src/benchmarking.rs index 3558847c8fe..a009b132f05 100644 --- a/substrate/frame/bounties/src/benchmarking.rs +++ b/substrate/frame/bounties/src/benchmarking.rs @@ -177,7 +177,7 @@ benchmarks_instance_pallet! { Bounties::::propose_bounty(RawOrigin::Signed(caller).into(), value, reason)?; let bounty_id = BountyCount::::get() - 1; let approve_origin = - T::ApproveOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + T::RejectOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; }: close_bounty(approve_origin, bounty_id) close_bounty_active { @@ -186,7 +186,7 @@ benchmarks_instance_pallet! { Treasury::::on_initialize(BlockNumberFor::::zero()); let bounty_id = BountyCount::::get() - 1; let approve_origin = - T::ApproveOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + T::RejectOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; }: close_bounty(approve_origin, bounty_id) verify { assert_last_event::(Event::BountyCanceled { index: bounty_id }.into()) diff --git a/substrate/frame/bounties/src/lib.rs b/substrate/frame/bounties/src/lib.rs index c930868bf10..e27ecbda3a2 100644 --- a/substrate/frame/bounties/src/lib.rs +++ b/substrate/frame/bounties/src/lib.rs @@ -245,6 +245,9 @@ pub mod pallet { /// The child bounty manager. type ChildBountyManager: ChildBountyManager>; + + /// Handler for the unbalanced decrease when slashing for a rejected bounty. + type OnSlash: OnUnbalanced>; } #[pallet::error] diff --git a/substrate/frame/bounties/src/tests.rs b/substrate/frame/bounties/src/tests.rs index 205765e9286..9f3a52263ec 100644 --- a/substrate/frame/bounties/src/tests.rs +++ b/substrate/frame/bounties/src/tests.rs @@ -83,10 +83,8 @@ parameter_types! { impl pallet_treasury::Config for Test { type PalletId = TreasuryPalletId; type Currency = pallet_balances::Pallet; - type ApproveOrigin = frame_system::EnsureRoot; type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; - type OnSlash = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); // Just gets burned. @@ -107,10 +105,8 @@ impl pallet_treasury::Config for Test { impl pallet_treasury::Config for Test { type PalletId = TreasuryPalletId2; type Currency = pallet_balances::Pallet; - type ApproveOrigin = frame_system::EnsureRoot; type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; - type OnSlash = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); // Just gets burned. @@ -149,6 +145,7 @@ impl Config for Test { type MaximumReasonLength = ConstU32<16384>; type WeightInfo = (); type ChildBountyManager = (); + type OnSlash = (); } impl Config for Test { @@ -164,6 +161,7 @@ impl Config for Test { type MaximumReasonLength = ConstU32<16384>; type WeightInfo = (); type ChildBountyManager = (); + type OnSlash = (); } type TreasuryError = pallet_treasury::Error; diff --git a/substrate/frame/child-bounties/src/tests.rs b/substrate/frame/child-bounties/src/tests.rs index be6fd62bb4c..125844fa70e 100644 --- a/substrate/frame/child-bounties/src/tests.rs +++ b/substrate/frame/child-bounties/src/tests.rs @@ -83,10 +83,8 @@ parameter_types! { impl pallet_treasury::Config for Test { type PalletId = TreasuryPalletId; type Currency = pallet_balances::Pallet; - type ApproveOrigin = frame_system::EnsureRoot; type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; - type OnSlash = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); @@ -123,6 +121,7 @@ impl pallet_bounties::Config for Test { type MaximumReasonLength = ConstU32<300>; type WeightInfo = (); type ChildBountyManager = ChildBounties; + type OnSlash = (); } impl pallet_child_bounties::Config for Test { type RuntimeEvent = RuntimeEvent; diff --git a/substrate/frame/tips/src/lib.rs b/substrate/frame/tips/src/lib.rs index 8c360fb57d7..e16ee041fcd 100644 --- a/substrate/frame/tips/src/lib.rs +++ b/substrate/frame/tips/src/lib.rs @@ -169,6 +169,9 @@ pub mod pallet { /// update weights file when altering this method. type Tippers: SortedMembers + ContainsLengthBound; + /// Handler for the unbalanced decrease when slashing for a removed tip. + type OnSlash: OnUnbalanced>; + /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; } diff --git a/substrate/frame/tips/src/tests.rs b/substrate/frame/tips/src/tests.rs index ad987cc6cd6..7e4a9368ad0 100644 --- a/substrate/frame/tips/src/tests.rs +++ b/substrate/frame/tips/src/tests.rs @@ -104,10 +104,8 @@ parameter_types! { impl pallet_treasury::Config for Test { type PalletId = TreasuryPalletId; type Currency = pallet_balances::Pallet; - type ApproveOrigin = frame_system::EnsureRoot; type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; - type OnSlash = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); // Just gets burned. @@ -128,10 +126,8 @@ impl pallet_treasury::Config for Test { impl pallet_treasury::Config for Test { type PalletId = TreasuryPalletId2; type Currency = pallet_balances::Pallet; - type ApproveOrigin = frame_system::EnsureRoot; type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; - type OnSlash = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); // Just gets burned. @@ -162,6 +158,7 @@ impl Config for Test { type DataDepositPerByte = ConstU64<1>; type MaxTipAmount = ConstU64<10_000_000>; type RuntimeEvent = RuntimeEvent; + type OnSlash = (); type WeightInfo = (); } @@ -174,6 +171,7 @@ impl Config for Test { type DataDepositPerByte = ConstU64<1>; type MaxTipAmount = ConstU64<10_000_000>; type RuntimeEvent = RuntimeEvent; + type OnSlash = (); type WeightInfo = (); } diff --git a/substrate/frame/treasury/src/lib.rs b/substrate/frame/treasury/src/lib.rs index 4677a0e0335..b437e5ef137 100644 --- a/substrate/frame/treasury/src/lib.rs +++ b/substrate/frame/treasury/src/lib.rs @@ -205,9 +205,6 @@ pub mod pallet { /// The staking balance. type Currency: Currency + ReservableCurrency; - /// Origin from which approvals must come. - type ApproveOrigin: EnsureOrigin; - /// Origin from which rejections must come. type RejectOrigin: EnsureOrigin; @@ -215,9 +212,6 @@ pub mod pallet { type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Handler for the unbalanced decrease when slashing for a rejected proposal or bounty. - type OnSlash: OnUnbalanced>; - /// Period between successive spends. #[pallet::constant] type SpendPeriod: Get>; diff --git a/substrate/frame/treasury/src/tests.rs b/substrate/frame/treasury/src/tests.rs index 94f5e6b7094..97b73592819 100644 --- a/substrate/frame/treasury/src/tests.rs +++ b/substrate/frame/treasury/src/tests.rs @@ -164,10 +164,8 @@ impl> ConversionFromAssetBalance for MulBy { impl Config for Test { type PalletId = TreasuryPalletId; type Currency = pallet_balances::Pallet; - type ApproveOrigin = frame_system::EnsureRoot; type RejectOrigin = frame_system::EnsureRoot; type RuntimeEvent = RuntimeEvent; - type OnSlash = (); type SpendPeriod = ConstU64<2>; type Burn = Burn; type BurnDestination = (); // Just gets burned. -- GitLab From 63e264446f6cabff06be72912eae902662dcb699 Mon Sep 17 00:00:00 2001 From: dashangcun <907225865@qq.com> Date: Tue, 25 Jun 2024 00:00:20 +0900 Subject: [PATCH 047/130] chore: remove repeat words (#4869) Signed-off-by: dashangcun Co-authored-by: dashangcun --- polkadot/runtime/common/src/traits.rs | 2 +- polkadot/xcm/pallet-xcm/src/lib.rs | 2 +- polkadot/xcm/src/v2/mod.rs | 2 +- polkadot/xcm/src/v3/junction.rs | 2 +- substrate/client/network/src/event.rs | 2 +- substrate/frame/staking/src/tests.rs | 2 +- substrate/test-utils/runtime/src/lib.rs | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/polkadot/runtime/common/src/traits.rs b/polkadot/runtime/common/src/traits.rs index 2ed1fb8af9b..eadeac74fcd 100644 --- a/polkadot/runtime/common/src/traits.rs +++ b/polkadot/runtime/common/src/traits.rs @@ -56,7 +56,7 @@ pub trait Registrar { /// Remove any lock on the para registration. fn remove_lock(id: ParaId); - /// Register a Para ID under control of `who`. Registration may be be + /// Register a Para ID under control of `who`. Registration may be /// delayed by session rotation. fn register( who: Self::AccountId, diff --git a/polkadot/xcm/pallet-xcm/src/lib.rs b/polkadot/xcm/pallet-xcm/src/lib.rs index 8f67e6e7d94..e1c365f5a24 100644 --- a/polkadot/xcm/pallet-xcm/src/lib.rs +++ b/polkadot/xcm/pallet-xcm/src/lib.rs @@ -1376,7 +1376,7 @@ pub mod pallet { /// - `assets`: The assets to be withdrawn. This should include the assets used to pay the /// fee on the `dest` (and possibly reserve) chains. /// - `assets_transfer_type`: The XCM `TransferType` used to transfer the `assets`. - /// - `remote_fees_id`: One of the included `assets` to be be used to pay fees. + /// - `remote_fees_id`: One of the included `assets` to be used to pay fees. /// - `fees_transfer_type`: The XCM `TransferType` used to transfer the `fees` assets. /// - `custom_xcm_on_dest`: The XCM to be executed on `dest` chain as the last step of the /// transfer, which also determines what happens to the assets on the destination chain. diff --git a/polkadot/xcm/src/v2/mod.rs b/polkadot/xcm/src/v2/mod.rs index 38e55d0ea51..fe7f05dd887 100644 --- a/polkadot/xcm/src/v2/mod.rs +++ b/polkadot/xcm/src/v2/mod.rs @@ -237,7 +237,7 @@ pub enum BodyPart { #[codec(compact)] denom: u32, }, - /// More than than the given proportion of members of the body. + /// More than the given proportion of members of the body. MoreThanProportion { #[codec(compact)] nom: u32, diff --git a/polkadot/xcm/src/v3/junction.rs b/polkadot/xcm/src/v3/junction.rs index aea4e037251..24348bf2e67 100644 --- a/polkadot/xcm/src/v3/junction.rs +++ b/polkadot/xcm/src/v3/junction.rs @@ -241,7 +241,7 @@ pub enum BodyPart { #[codec(compact)] denom: u32, }, - /// More than than the given proportion of members of the body. + /// More than the given proportion of members of the body. MoreThanProportion { #[codec(compact)] nom: u32, diff --git a/substrate/client/network/src/event.rs b/substrate/client/network/src/event.rs index d0ccbd8622b..b518a2094d7 100644 --- a/substrate/client/network/src/event.rs +++ b/substrate/client/network/src/event.rs @@ -16,7 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -//! Network event types. These are are not the part of the protocol, but rather +//! Network event types. These are not the part of the protocol, but rather //! events that happen on the network like DHT get/put results received. use crate::types::ProtocolName; diff --git a/substrate/frame/staking/src/tests.rs b/substrate/frame/staking/src/tests.rs index 2229eb28329..825b03b8eca 100644 --- a/substrate/frame/staking/src/tests.rs +++ b/substrate/frame/staking/src/tests.rs @@ -780,7 +780,7 @@ fn nominators_also_get_slashed_pro_rata() { #[test] fn double_staking_should_fail() { // should test (in the same order): - // * an account already bonded as stash cannot be be stashed again. + // * an account already bonded as stash cannot be stashed again. // * an account already bonded as stash cannot nominate. // * an account already bonded as controller can nominate. ExtBuilder::default().try_state(false).build_and_execute(|| { diff --git a/substrate/test-utils/runtime/src/lib.rs b/substrate/test-utils/runtime/src/lib.rs index 0aab6d3f01c..a5769b56dd5 100644 --- a/substrate/test-utils/runtime/src/lib.rs +++ b/substrate/test-utils/runtime/src/lib.rs @@ -874,7 +874,7 @@ pub mod storage_key_generator { sp_crypto_hashing::twox_64(x).iter().chain(x.iter()).cloned().collect() } - /// Generate the hashed storage keys from the raw literals. These keys are expected to be be in + /// Generate the hashed storage keys from the raw literals. These keys are expected to be in /// storage with given substrate-test runtime. pub fn generate_expected_storage_hashed_keys(custom_heap_pages: bool) -> Vec { let mut literals: Vec<&[u8]> = vec![b":code", b":extrinsic_index"]; -- GitLab From a0fc3b5419cb6630b1189d8c8b05d4ef0e82e8a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 25 Jun 2024 09:52:10 +0200 Subject: [PATCH 048/130] rpc2: Finalized event doesn't indicate that the best block changes (#4872) We should not print a warning if the best block stays the same between two finality events. There is no requirement that this changes. For sure this doesn't need to be an error message. --- .../client/rpc-spec-v2/src/chain_head/chain_head_follow.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs b/substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs index a753896b24c..6dc3df76bdd 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs @@ -32,7 +32,7 @@ use futures::{ }; use futures_util::future::Either; use jsonrpsee::SubscriptionSink; -use log::{debug, error}; +use log::debug; use sc_client_api::{ Backend, BlockBackend, BlockImportNotification, BlockchainEvents, FinalityNotification, }; @@ -572,7 +572,7 @@ where // The information from `.info()` is updated from the DB as the last // step of the finalization and it should be up to date. // If the info is outdated, there is nothing the RPC can do for now. - error!( + debug!( target: LOG_TARGET, "[follow][id={:?}] Client does not contain different best block", self.sub_id, -- GitLab From 909bfc2d7c00a0fed7a5fd4e5292aa3fbe2299b6 Mon Sep 17 00:00:00 2001 From: Andrei Eres Date: Tue, 25 Jun 2024 11:08:39 +0200 Subject: [PATCH 049/130] [subsystem-bench] Trigger own assignments in approval-voting (#4772) --- polkadot/node/subsystem-bench/src/lib/approval/mod.rs | 9 ++++++++- .../node/subsystem-bench/src/lib/mock/runtime_api.rs | 11 ++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/polkadot/node/subsystem-bench/src/lib/approval/mod.rs b/polkadot/node/subsystem-bench/src/lib/approval/mod.rs index 5c0c65b11cd..b033be9986f 100644 --- a/polkadot/node/subsystem-bench/src/lib/approval/mod.rs +++ b/polkadot/node/subsystem-bench/src/lib/approval/mod.rs @@ -60,7 +60,7 @@ use polkadot_node_subsystem_util::metrics::Metrics; use polkadot_overseer::Handle as OverseerHandleReal; use polkadot_primitives::{ BlockNumber, CandidateEvent, CandidateIndex, CandidateReceipt, Hash, Header, Slot, - ValidatorIndex, + ValidatorIndex, ASSIGNMENT_KEY_TYPE_ID, }; use prometheus::Registry; use sc_keystore::LocalKeystore; @@ -68,6 +68,7 @@ use sc_service::SpawnTaskHandle; use serde::{Deserialize, Serialize}; use sp_consensus_babe::Epoch as BabeEpoch; use sp_core::H256; +use sp_keystore::Keystore; use std::{ cmp::max, collections::{HashMap, HashSet}, @@ -785,6 +786,12 @@ fn build_overseer( let db: polkadot_node_subsystem_util::database::kvdb_impl::DbAdapter = polkadot_node_subsystem_util::database::kvdb_impl::DbAdapter::new(db, &[]); let keystore = LocalKeystore::in_memory(); + keystore + .sr25519_generate_new( + ASSIGNMENT_KEY_TYPE_ID, + Some(state.test_authorities.key_seeds.get(NODE_UNDER_TEST as usize).unwrap().as_str()), + ) + .unwrap(); let system_clock = PastSystemClock::new(SystemClock {}, state.delta_tick_from_generated.clone()); diff --git a/polkadot/node/subsystem-bench/src/lib/mock/runtime_api.rs b/polkadot/node/subsystem-bench/src/lib/mock/runtime_api.rs index be9dbd55cb6..ee45ea05c92 100644 --- a/polkadot/node/subsystem-bench/src/lib/mock/runtime_api.rs +++ b/polkadot/node/subsystem-bench/src/lib/mock/runtime_api.rs @@ -28,7 +28,7 @@ use polkadot_node_subsystem_types::OverseerSignal; use polkadot_primitives::{ node_features, AsyncBackingParams, CandidateEvent, CandidateReceipt, CoreState, GroupIndex, GroupRotationInfo, IndexedVec, NodeFeatures, OccupiedCore, ScheduledCore, SessionIndex, - SessionInfo, ValidatorIndex, + SessionInfo, ValidationCode, ValidatorIndex, }; use sp_consensus_babe::Epoch as BabeEpoch; use sp_core::H256; @@ -288,6 +288,15 @@ impl MockRuntimeApi { }; tx.send(Ok((groups, group_rotation_info))).unwrap(); }, + RuntimeApiMessage::Request( + _parent, + RuntimeApiRequest::ValidationCodeByHash(_, tx), + ) => { + let validation_code = ValidationCode(Vec::new()); + if let Err(err) = tx.send(Ok(Some(validation_code))) { + gum::error!(target: LOG_TARGET, ?err, "validation code wasn't received"); + } + }, // Long term TODO: implement more as needed. message => { unimplemented!("Unexpected runtime-api message: {:?}", message) -- GitLab From a406dd5223a56072f6c05d490c2ee9ef0264ac47 Mon Sep 17 00:00:00 2001 From: yjh Date: Tue, 25 Jun 2024 19:34:06 +0800 Subject: [PATCH 050/130] chore: remove unused rustc-hex deps; enable rustc-hex for primitive-types in sp-core (#4860) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some primitives have impl Hex related traits enabled by `rustc-hex` feature. People wanna use H256/H160 maybe need these trait impls --------- Co-authored-by: command-bot <> Co-authored-by: Bastian Köcher --- Cargo.lock | 3 --- bridges/snowbridge/primitives/router/Cargo.toml | 1 - polkadot/runtime/parachains/Cargo.toml | 2 -- polkadot/runtime/westend/Cargo.toml | 2 -- 4 files changed, 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 22564aa9cae..8052bcceee6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13917,7 +13917,6 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "rstest", - "rustc-hex", "sc-keystore", "scale-info", "serde", @@ -19367,7 +19366,6 @@ dependencies = [ "hex-literal", "log", "parity-scale-codec", - "rustc-hex", "scale-info", "snowbridge-core", "sp-core", @@ -23350,7 +23348,6 @@ dependencies = [ "polkadot-primitives", "polkadot-runtime-common", "polkadot-runtime-parachains", - "rustc-hex", "scale-info", "serde", "serde_derive", diff --git a/bridges/snowbridge/primitives/router/Cargo.toml b/bridges/snowbridge/primitives/router/Cargo.toml index d744aa7f1d4..ee8d481cec1 100644 --- a/bridges/snowbridge/primitives/router/Cargo.toml +++ b/bridges/snowbridge/primitives/router/Cargo.toml @@ -30,7 +30,6 @@ snowbridge-core = { workspace = true } hex-literal = { workspace = true, default-features = true } [dev-dependencies] -rustc-hex = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/polkadot/runtime/parachains/Cargo.toml b/polkadot/runtime/parachains/Cargo.toml index 284b81e8697..82ba22a70f3 100644 --- a/polkadot/runtime/parachains/Cargo.toml +++ b/polkadot/runtime/parachains/Cargo.toml @@ -14,7 +14,6 @@ impl-trait-for-tuples = { workspace = true } bitvec = { features = ["alloc"], workspace = true } codec = { features = ["derive", "max-encoded-len"], workspace = true } log = { workspace = true } -rustc-hex = { workspace = true } scale-info = { features = ["derive"], workspace = true } serde = { features = ["alloc", "derive"], workspace = true } derive_more = { workspace = true, default-features = true } @@ -98,7 +97,6 @@ std = [ "polkadot-runtime-metrics/std", "rand/std", "rand_chacha/std", - "rustc-hex/std", "scale-info/std", "serde/std", "sp-api/std", diff --git a/polkadot/runtime/westend/Cargo.toml b/polkadot/runtime/westend/Cargo.toml index 09d78edeaab..f6e8dfc7816 100644 --- a/polkadot/runtime/westend/Cargo.toml +++ b/polkadot/runtime/westend/Cargo.toml @@ -15,7 +15,6 @@ bitvec = { features = ["alloc"], workspace = true } codec = { features = ["derive", "max-encoded-len"], workspace = true } scale-info = { features = ["derive"], workspace = true } log = { workspace = true } -rustc-hex = { workspace = true } serde = { workspace = true } serde_derive = { optional = true, workspace = true } smallvec = { workspace = true, default-features = true } @@ -201,7 +200,6 @@ std = [ "polkadot-primitives/std", "polkadot-runtime-common/std", "polkadot-runtime-parachains/std", - "rustc-hex/std", "scale-info/std", "serde/std", "serde_derive", -- GitLab From 3c213726cf165d8b1155d5151b9c548e879b5ff8 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Tue, 25 Jun 2024 14:58:51 +0200 Subject: [PATCH 051/130] chain-spec-builder: Add support for `codeSubstitutes` (#4685) While working on https://github.com/paritytech/polkadot-sdk/pull/4600 I found that it would be nice if `chain-spec-builder` supported `codeSubstitutes`. After this PR is merged you can do: ``` chain-spec-builder add-code-substitute chain_spec.json my_runtime.compact.compressed.wasm 1234 ``` In addition, the `chain-spec-builder` was silently removing `relay_chain` and `para_id` fields when used on parachain chain-specs. This is now fixed by providing a custom chain-spec extension that has these fields marked as optional. --- prdoc/pr_4685.prdoc | 16 +++++++++ .../bin/utils/chain-spec-builder/bin/main.rs | 36 +++++++++++++++---- .../bin/utils/chain-spec-builder/src/lib.rs | 20 +++++++++++ substrate/client/chain-spec/src/chain_spec.rs | 10 ++++++ substrate/client/chain-spec/src/lib.rs | 4 +-- 5 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 prdoc/pr_4685.prdoc diff --git a/prdoc/pr_4685.prdoc b/prdoc/pr_4685.prdoc new file mode 100644 index 00000000000..e212919ba2e --- /dev/null +++ b/prdoc/pr_4685.prdoc @@ -0,0 +1,16 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Chain-spec-builder supports `codeSubstitutes`. + +doc: + - audience: Node Operator + description: | + A new subcommand `add-code-substitute` is available for the `chain-spec-builder` binary. It allows users to provide a runtime that should be used from a given + block onwards. The `codeSubstitutes` field in the chain spec is used to force usage of a given runtime at a given block until the next runtime upgrade. It can be + used to progress chains that are stalled due to runtime bugs that prevent block-building. However, parachain usage is only possible in combination with an updated + validation function on the relay chain. + +crates: + - name: staging-chain-spec-builder + bump: minor diff --git a/substrate/bin/utils/chain-spec-builder/bin/main.rs b/substrate/bin/utils/chain-spec-builder/bin/main.rs index 18da3c30691..39fa054b480 100644 --- a/substrate/bin/utils/chain-spec-builder/bin/main.rs +++ b/substrate/bin/utils/chain-spec-builder/bin/main.rs @@ -17,16 +17,19 @@ // along with this program. If not, see . use chain_spec_builder::{ - generate_chain_spec_for_runtime, ChainSpecBuilder, ChainSpecBuilderCmd, ConvertToRawCmd, - DisplayPresetCmd, ListPresetsCmd, UpdateCodeCmd, VerifyCmd, + generate_chain_spec_for_runtime, AddCodeSubstituteCmd, ChainSpecBuilder, ChainSpecBuilderCmd, + ConvertToRawCmd, DisplayPresetCmd, ListPresetsCmd, UpdateCodeCmd, VerifyCmd, }; use clap::Parser; use sc_chain_spec::{ - update_code_in_json_chain_spec, GenericChainSpec, GenesisConfigBuilderRuntimeCaller, + set_code_substitute_in_json_chain_spec, update_code_in_json_chain_spec, GenericChainSpec, + GenesisConfigBuilderRuntimeCaller, }; use staging_chain_spec_builder as chain_spec_builder; use std::fs; +type ChainSpec = GenericChainSpec<(), ()>; + //avoid error message escaping fn main() { match inner_main() { @@ -50,7 +53,7 @@ fn inner_main() -> Result<(), String> { ref input_chain_spec, ref runtime_wasm_path, }) => { - let chain_spec = GenericChainSpec::<()>::from_json_file(input_chain_spec.clone())?; + let chain_spec = ChainSpec::from_json_file(input_chain_spec.clone())?; let mut chain_spec_json = serde_json::from_str::(&chain_spec.as_json(false)?) @@ -65,8 +68,29 @@ fn inner_main() -> Result<(), String> { .map_err(|e| format!("to pretty failed: {e}"))?; fs::write(chain_spec_path, chain_spec_json).map_err(|err| err.to_string())?; }, + ChainSpecBuilderCmd::AddCodeSubstitute(AddCodeSubstituteCmd { + ref input_chain_spec, + ref runtime_wasm_path, + block_height, + }) => { + let chain_spec = ChainSpec::from_json_file(input_chain_spec.clone())?; + + let mut chain_spec_json = + serde_json::from_str::(&chain_spec.as_json(false)?) + .map_err(|e| format!("Conversion to json failed: {e}"))?; + + set_code_substitute_in_json_chain_spec( + &mut chain_spec_json, + &fs::read(runtime_wasm_path.as_path()) + .map_err(|e| format!("Wasm blob file could not be read: {e}"))?[..], + block_height, + ); + let chain_spec_json = serde_json::to_string_pretty(&chain_spec_json) + .map_err(|e| format!("to pretty failed: {e}"))?; + fs::write(chain_spec_path, chain_spec_json).map_err(|err| err.to_string())?; + }, ChainSpecBuilderCmd::ConvertToRaw(ConvertToRawCmd { ref input_chain_spec }) => { - let chain_spec = GenericChainSpec::<()>::from_json_file(input_chain_spec.clone())?; + let chain_spec = ChainSpec::from_json_file(input_chain_spec.clone())?; let chain_spec_json = serde_json::from_str::(&chain_spec.as_json(true)?) @@ -77,7 +101,7 @@ fn inner_main() -> Result<(), String> { fs::write(chain_spec_path, chain_spec_json).map_err(|err| err.to_string())?; }, ChainSpecBuilderCmd::Verify(VerifyCmd { ref input_chain_spec }) => { - let chain_spec = GenericChainSpec::<()>::from_json_file(input_chain_spec.clone())?; + let chain_spec = ChainSpec::from_json_file(input_chain_spec.clone())?; let _ = serde_json::from_str::(&chain_spec.as_json(true)?) .map_err(|e| format!("Conversion to json failed: {e}"))?; }, diff --git a/substrate/bin/utils/chain-spec-builder/src/lib.rs b/substrate/bin/utils/chain-spec-builder/src/lib.rs index 4c00bb3551b..6c679f109a0 100644 --- a/substrate/bin/utils/chain-spec-builder/src/lib.rs +++ b/substrate/bin/utils/chain-spec-builder/src/lib.rs @@ -143,6 +143,7 @@ pub enum ChainSpecBuilderCmd { ConvertToRaw(ConvertToRawCmd), ListPresets(ListPresetsCmd), DisplayPreset(DisplayPresetCmd), + AddCodeSubstitute(AddCodeSubstituteCmd), } /// Create a new chain spec by interacting with the provided runtime wasm blob. @@ -222,6 +223,25 @@ pub struct UpdateCodeCmd { pub runtime_wasm_path: PathBuf, } +/// Add a code substitute in the chain spec. +/// +/// The `codeSubstitute` object of the chain spec will be updated with the block height as key and +/// runtime code as value. This operation supports both plain and raw formats. The `codeSubstitute` +/// field instructs the node to use the provided runtime code at the given block height. This is +/// useful when the chain can not progress on its own due to a bug that prevents block-building. +/// +/// Note: For parachains, the validation function on the relaychain needs to be adjusted too, +/// otherwise blocks built using the substituted parachain runtime will be rejected. +#[derive(Parser, Debug, Clone)] +pub struct AddCodeSubstituteCmd { + /// Chain spec to be updated. + pub input_chain_spec: PathBuf, + /// New runtime wasm blob that should replace the existing code. + pub runtime_wasm_path: PathBuf, + /// The block height at which the code should be substituted. + pub block_height: u64, +} + /// Converts the given chain spec into the raw format. #[derive(Parser, Debug, Clone)] pub struct ConvertToRawCmd { diff --git a/substrate/client/chain-spec/src/chain_spec.rs b/substrate/client/chain-spec/src/chain_spec.rs index 883cd19adfd..5f90f549e02 100644 --- a/substrate/client/chain-spec/src/chain_spec.rs +++ b/substrate/client/chain-spec/src/chain_spec.rs @@ -766,6 +766,16 @@ pub fn update_code_in_json_chain_spec(chain_spec: &mut json::Value, code: &[u8]) } } +/// This function sets a codeSubstitute in the chain spec. +pub fn set_code_substitute_in_json_chain_spec( + chain_spec: &mut json::Value, + code: &[u8], + block_height: u64, +) { + let substitutes = json::json!({"codeSubstitutes":{ &block_height.to_string(): sp_core::bytes::to_hex(code, false) }}); + crate::json_patch::merge(chain_spec, substitutes); +} + #[cfg(test)] mod tests { use super::*; diff --git a/substrate/client/chain-spec/src/lib.rs b/substrate/client/chain-spec/src/lib.rs index b59ad68610e..c43f9e89b8a 100644 --- a/substrate/client/chain-spec/src/lib.rs +++ b/substrate/client/chain-spec/src/lib.rs @@ -333,8 +333,8 @@ pub mod json_patch; pub use self::{ chain_spec::{ - update_code_in_json_chain_spec, ChainSpec as GenericChainSpec, ChainSpecBuilder, - NoExtension, + set_code_substitute_in_json_chain_spec, update_code_in_json_chain_spec, + ChainSpec as GenericChainSpec, ChainSpecBuilder, NoExtension, }, extension::{get_extension, get_extension_mut, Extension, Fork, Forks, GetExtension, Group}, genesis_block::{ -- GitLab From 414a8fc2eda3bb72e30cefdba628cf6c361cd6e1 Mon Sep 17 00:00:00 2001 From: Aaro Altonen <48052676+altonen@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:51:05 +0300 Subject: [PATCH 052/130] Upgrade libp2p to 0.52.4 (#1631) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Upgrade libp2p to 0.52.4, including a fix: * Set Kademlia to server mode (https://github.com/paritytech/substrate/pull/14703) ### TODO - [x] Fix 3 zombienet tests failing: - [x] `zombienet-substrate-0002-validators-warp-sync` - [ ] ~`zombienet-polkadot-functional-0005-parachains-disputes-past-session`~ The test is also flaky in other PRs and is not required for CI to succeed. - [x] `zombienet-polkadot-functional-0009-approval-voting-coalescing` - [x] Uncomment and update to the actual libp2p API tests in [`substrate/client/network/src/protocol/notifications/handler.rs`](https://github.com/paritytech/polkadot-sdk/blob/7331f1796f1a0b0e9fb0cd7bf441239ad9664595/substrate/client/network/src/protocol/notifications/handler.rs#L1009). - [x] When upgrading `multihash` crate as part of libp2p upgrade to version v0.19.1, uncomment the conversion code at https://github.com/paritytech/polkadot-sdk/blob/7547c4942a887029c11cbcfd5103f6d8315ab95c/substrate/client/network/types/src/multihash.rs#L159 - [x] Perform a burn-in. --------- Co-authored-by: Anton Co-authored-by: command-bot <> Co-authored-by: Dmitry Markin Co-authored-by: Bastian Köcher --- Cargo.lock | 766 ++++++++++-------- Cargo.toml | 10 +- prdoc/pr_1631.prdoc | 39 + .../client/authority-discovery/Cargo.toml | 7 +- .../client/authority-discovery/src/service.rs | 2 +- .../client/authority-discovery/src/worker.rs | 12 +- .../src/worker/addr_cache.rs | 16 +- substrate/client/network-gossip/Cargo.toml | 1 - substrate/client/network-gossip/src/bridge.rs | 3 +- substrate/client/network-gossip/src/lib.rs | 10 +- .../network-gossip/src/state_machine.rs | 2 +- substrate/client/network/src/behaviour.rs | 18 +- substrate/client/network/src/config.rs | 8 +- substrate/client/network/src/discovery.rs | 147 ++-- .../client/network/src/litep2p/service.rs | 16 +- substrate/client/network/src/peer_info.rs | 92 ++- substrate/client/network/src/protocol.rs | 19 +- .../src/protocol/notifications/behaviour.rs | 37 +- .../src/protocol/notifications/handler.rs | 85 +- .../src/protocol/notifications/tests.rs | 16 +- .../src/protocol/notifications/upgrade.rs | 1 + .../protocol/notifications/upgrade/collec.rs | 12 +- .../notifications/upgrade/notifications.rs | 228 +++--- .../client/network/src/request_responses.rs | 49 +- substrate/client/network/src/service.rs | 146 ++-- substrate/client/network/src/transport.rs | 4 +- substrate/client/network/src/types.rs | 8 +- substrate/client/network/statement/Cargo.toml | 1 - .../client/network/transactions/Cargo.toml | 1 - substrate/client/network/types/Cargo.toml | 5 +- .../client/network/types/src/multiaddr.rs | 13 + .../network/types/src/multiaddr/protocol.rs | 112 +++ .../client/network/types/src/multihash.rs | 30 +- substrate/client/offchain/Cargo.toml | 1 - substrate/client/telemetry/src/transport.rs | 2 +- 35 files changed, 1128 insertions(+), 791 deletions(-) create mode 100644 prdoc/pr_1631.prdoc diff --git a/Cargo.lock b/Cargo.lock index 8052bcceee6..6f1e91f7b02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1076,7 +1076,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 2.5.3", "futures-core", ] @@ -1086,11 +1086,11 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" dependencies = [ - "async-lock", + "async-lock 2.8.0", "async-task", "concurrent-queue", "fastrand 1.9.0", - "futures-lite", + "futures-lite 1.13.0", "slab", ] @@ -1100,10 +1100,10 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" dependencies = [ - "async-lock", + "async-lock 2.8.0", "autocfg", "blocking", - "futures-lite", + "futures-lite 1.13.0", ] [[package]] @@ -1114,10 +1114,10 @@ checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" dependencies = [ "async-channel", "async-executor", - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "blocking", - "futures-lite", + "futures-lite 1.13.0", "once_cell", ] @@ -1127,27 +1127,57 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ - "async-lock", + "async-lock 2.8.0", "autocfg", "cfg-if", "concurrent-queue", - "futures-lite", + "futures-lite 1.13.0", "log", "parking", - "polling", + "polling 2.8.0", "rustix 0.37.23", "slab", "socket2 0.4.9", "waker-fn", ] +[[package]] +name = "async-io" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.4.0", + "rustix 0.38.21", + "slab", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "async-lock" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "event-listener", + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.2.0", + "event-listener-strategy", + "pin-project-lite 0.2.12", ] [[package]] @@ -1156,10 +1186,10 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4051e67316bc7eff608fe723df5d32ed639946adcd69e07df41fd42a7b411f1f" dependencies = [ - "async-io", + "async-io 1.13.0", "autocfg", "blocking", - "futures-lite", + "futures-lite 1.13.0", ] [[package]] @@ -1168,13 +1198,13 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" dependencies = [ - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "autocfg", "blocking", "cfg-if", - "event-listener", - "futures-lite", + "event-listener 2.5.3", + "futures-lite 1.13.0", "rustix 0.37.23", "signal-hook", "windows-sys 0.48.0", @@ -1189,13 +1219,13 @@ dependencies = [ "async-attributes", "async-channel", "async-global-executor", - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite", + "futures-lite 1.13.0", "gloo-timers", "kv-log-macro", "log", @@ -1271,6 +1301,17 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" +[[package]] +name = "attohttpc" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" +dependencies = [ + "http", + "log", + "url", +] + [[package]] name = "atty" version = "0.2.14" @@ -1603,11 +1644,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" dependencies = [ "async-channel", - "async-lock", + "async-lock 2.8.0", "async-task", "atomic-waker", "fastrand 1.9.0", - "futures-lite", + "futures-lite 1.13.0", "log", ] @@ -5334,6 +5375,27 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite 0.2.12", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener 5.2.0", + "pin-project-lite 0.2.12", +] + [[package]] name = "exit-future" version = "0.2.0" @@ -5574,7 +5636,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" dependencies = [ "crc32fast", - "libz-sys", "miniz_oxide", ] @@ -5939,7 +6000,7 @@ dependencies = [ "frame-support-procedural-tools", "itertools 0.11.0", "macro_magic", - "proc-macro-warning", + "proc-macro-warning 1.0.0", "proc-macro2 1.0.82", "quote 1.0.35", "regex", @@ -6141,6 +6202,16 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-bounded" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b07bbbe7d7e78809544c6f718d875627addc73a7c3582447abc052cd3dc67e0" +dependencies = [ + "futures-timer", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.30" @@ -6190,6 +6261,16 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "futures-core", + "pin-project-lite 0.2.12", +] + [[package]] name = "futures-macro" version = "0.3.30" @@ -6203,13 +6284,12 @@ dependencies = [ [[package]] name = "futures-rustls" -version = "0.22.2" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" +checksum = "35bd3cf68c183738046838e300353e4716c674dc5e56890de4826801a6622a28" dependencies = [ "futures-io", - "rustls 0.20.8", - "webpki", + "rustls 0.21.7", ] [[package]] @@ -6744,7 +6824,7 @@ dependencies = [ "http", "hyper", "log", - "rustls 0.21.6", + "rustls 0.21.7", "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", @@ -6796,21 +6876,21 @@ dependencies = [ [[package]] name = "if-addrs" -version = "0.7.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" +checksum = "cabb0019d51a643781ff15c9c8a3e5dedc365c47211270f4e8f82812fedd8f0a" dependencies = [ "libc", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "if-watch" -version = "3.0.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9465340214b296cd17a0009acdb890d6160010b8adf8f78a00d0d7ab270f79f" +checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e" dependencies = [ - "async-io", + "async-io 2.3.3", "core-foundation", "fnv", "futures", @@ -6820,7 +6900,26 @@ dependencies = [ "rtnetlink", "system-configuration", "tokio", - "windows 0.34.0", + "windows 0.51.1", +] + +[[package]] +name = "igd-next" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064d90fec10d541084e7b39ead8875a5a80d9114a2b18791565253bae25f49e4" +dependencies = [ + "async-trait", + "attohttpc", + "bytes", + "futures", + "http", + "hyper", + "log", + "rand 0.8.5", + "tokio", + "url", + "xmltree", ] [[package]] @@ -7037,13 +7136,13 @@ dependencies = [ "curl", "curl-sys", "encoding_rs", - "event-listener", - "futures-lite", + "event-listener 2.5.3", + "futures-lite 1.13.0", "http", "log", "mime", "once_cell", - "polling", + "polling 2.8.0", "slab", "sluice", "tracing", @@ -7458,11 +7557,12 @@ dependencies = [ [[package]] name = "libp2p" -version = "0.51.4" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f35eae38201a993ece6bdc823292d6abd1bffed1c4d0f4a3517d2bd8e1d917fe" +checksum = "e94495eb319a85b70a68b85e2389a95bb3555c71c49025b78c691a854a7e6464" dependencies = [ "bytes", + "either", "futures", "futures-timer", "getrandom 0.2.10", @@ -7482,18 +7582,21 @@ dependencies = [ "libp2p-request-response", "libp2p-swarm", "libp2p-tcp", + "libp2p-upnp", "libp2p-wasm-ext", "libp2p-websocket", "libp2p-yamux", - "multiaddr", + "multiaddr 0.18.1", "pin-project", + "rw-stream-sink", + "thiserror", ] [[package]] name = "libp2p-allow-block-list" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510daa05efbc25184458db837f6f9a5143888f1caa742426d92e1833ddd38a50" +checksum = "55b46558c5c0bf99d3e2a1a38fd54ff5476ca66dd1737b12466a1824dd219311" dependencies = [ "libp2p-core", "libp2p-identity", @@ -7503,9 +7606,9 @@ dependencies = [ [[package]] name = "libp2p-connection-limits" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4caa33f1d26ed664c4fe2cca81a08c8e07d4c1c04f2f4ac7655c2dd85467fda0" +checksum = "2f5107ad45cb20b2f6c3628c7b6014b996fcb13a88053f4569c872c6e30abf58" dependencies = [ "libp2p-core", "libp2p-identity", @@ -7515,9 +7618,9 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.39.2" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c1df63c0b582aa434fb09b2d86897fa2b419ffeccf934b36f87fcedc8e835c2" +checksum = "dd44289ab25e4c9230d9246c475a22241e301b23e8f4061d3bdef304a1a99713" dependencies = [ "either", "fnv", @@ -7526,8 +7629,8 @@ dependencies = [ "instant", "libp2p-identity", "log", - "multiaddr", - "multihash 0.17.0", + "multiaddr 0.18.1", + "multihash 0.19.1", "multistream-select", "once_cell", "parking_lot 0.12.1", @@ -7543,33 +7646,36 @@ dependencies = [ [[package]] name = "libp2p-dns" -version = "0.39.0" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146ff7034daae62077c415c2376b8057368042df6ab95f5432ad5e88568b1554" +checksum = "e6a18db73084b4da2871438f6239fef35190b05023de7656e877c18a00541a3b" dependencies = [ + "async-trait", "futures", "libp2p-core", + "libp2p-identity", "log", "parking_lot 0.12.1", "smallvec", - "trust-dns-resolver 0.22.0", + "trust-dns-resolver", ] [[package]] name = "libp2p-identify" -version = "0.42.2" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5455f472243e63b9c497ff320ded0314254a9eb751799a39c283c6f20b793f3c" +checksum = "45a96638a0a176bec0a4bcaebc1afa8cf909b114477209d7456ade52c61cd9cd" dependencies = [ "asynchronous-codec", "either", "futures", + "futures-bounded", "futures-timer", "libp2p-core", "libp2p-identity", "libp2p-swarm", "log", - "lru 0.10.1", + "lru 0.12.3", "quick-protobuf", "quick-protobuf-codec", "smallvec", @@ -7579,27 +7685,27 @@ dependencies = [ [[package]] name = "libp2p-identity" -version = "0.1.3" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276bb57e7af15d8f100d3c11cbdd32c6752b7eef4ba7a18ecf464972c07abcce" +checksum = "999ec70441b2fb35355076726a6bc466c932e9bdc66f6a11c6c0aa17c7ab9be0" dependencies = [ - "bs58 0.4.0", + "bs58 0.5.0", "ed25519-dalek 2.1.1", - "log", - "multiaddr", - "multihash 0.17.0", + "hkdf", + "multihash 0.19.1", "quick-protobuf", "rand 0.8.5", "sha2 0.10.8", "thiserror", + "tracing", "zeroize", ] [[package]] name = "libp2p-kad" -version = "0.43.3" +version = "0.44.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39d5ef876a2b2323d63c258e63c2f8e36f205fe5a11f0b3095d59635650790ff" +checksum = "16ea178dabba6dde6ffc260a8e0452ccdc8f79becf544946692fff9d412fc29d" dependencies = [ "arrayvec 0.7.4", "asynchronous-codec", @@ -7614,6 +7720,7 @@ dependencies = [ "libp2p-swarm", "log", "quick-protobuf", + "quick-protobuf-codec", "rand 0.8.5", "sha2 0.10.8", "smallvec", @@ -7625,9 +7732,9 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.43.1" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19983e1f949f979a928f2c603de1cf180cc0dc23e4ac93a62651ccb18341460b" +checksum = "42a2567c305232f5ef54185e9604579a894fd0674819402bb0ac0246da82f52a" dependencies = [ "data-encoding", "futures", @@ -7638,7 +7745,7 @@ dependencies = [ "log", "rand 0.8.5", "smallvec", - "socket2 0.4.9", + "socket2 0.5.6", "tokio", "trust-dns-proto 0.22.0", "void", @@ -7646,30 +7753,35 @@ dependencies = [ [[package]] name = "libp2p-metrics" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a42ec91e227d7d0dafa4ce88b333cdf5f277253873ab087555c92798db2ddd46" +checksum = "239ba7d28f8d0b5d77760dc6619c05c7e88e74ec8fbbe97f856f20a56745e620" dependencies = [ + "instant", "libp2p-core", "libp2p-identify", + "libp2p-identity", "libp2p-kad", "libp2p-ping", "libp2p-swarm", + "once_cell", "prometheus-client", ] [[package]] name = "libp2p-noise" -version = "0.42.2" +version = "0.43.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3673da89d29936bc6435bafc638e2f184180d554ce844db65915113f86ec5e" +checksum = "d2eeec39ad3ad0677551907dd304b2f13f17208ccebe333bef194076cd2e8921" dependencies = [ "bytes", - "curve25519-dalek 3.2.0", + "curve25519-dalek 4.1.3", "futures", "libp2p-core", "libp2p-identity", "log", + "multiaddr 0.18.1", + "multihash 0.19.1", "once_cell", "quick-protobuf", "rand 0.8.5", @@ -7677,21 +7789,22 @@ dependencies = [ "snow", "static_assertions", "thiserror", - "x25519-dalek 1.1.1", + "x25519-dalek", "zeroize", ] [[package]] name = "libp2p-ping" -version = "0.42.0" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e57759c19c28a73ef1eb3585ca410cefb72c1a709fcf6de1612a378e4219202" +checksum = "e702d75cd0827dfa15f8fd92d15b9932abe38d10d21f47c50438c71dd1b5dae3" dependencies = [ "either", "futures", "futures-timer", "instant", "libp2p-core", + "libp2p-identity", "libp2p-swarm", "log", "rand 0.8.5", @@ -7700,9 +7813,9 @@ dependencies = [ [[package]] name = "libp2p-quic" -version = "0.7.0-alpha.3" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6b26abd81cd2398382a1edfe739b539775be8a90fa6914f39b2ab49571ec735" +checksum = "130d451d83f21b81eb7b35b360bc7972aeafb15177784adc56528db082e6b927" dependencies = [ "bytes", "futures", @@ -7713,18 +7826,20 @@ dependencies = [ "libp2p-tls", "log", "parking_lot 0.12.1", - "quinn-proto", + "quinn 0.10.2", "rand 0.8.5", - "rustls 0.20.8", + "ring 0.16.20", + "rustls 0.21.7", + "socket2 0.5.6", "thiserror", "tokio", ] [[package]] name = "libp2p-request-response" -version = "0.24.1" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffdb374267d42dc5ed5bc53f6e601d4a64ac5964779c6e40bb9e4f14c1e30d5" +checksum = "d8e3b4d67870478db72bac87bfc260ee6641d0734e0e3e275798f089c3fecfd4" dependencies = [ "async-trait", "futures", @@ -7732,15 +7847,17 @@ dependencies = [ "libp2p-core", "libp2p-identity", "libp2p-swarm", + "log", "rand 0.8.5", "smallvec", + "void", ] [[package]] name = "libp2p-swarm" -version = "0.42.2" +version = "0.43.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903b3d592d7694e56204d211f29d31bc004be99386644ba8731fc3e3ef27b296" +checksum = "580189e0074af847df90e75ef54f3f30059aedda37ea5a1659e8b9fca05c0141" dependencies = [ "either", "fnv", @@ -7751,6 +7868,8 @@ dependencies = [ "libp2p-identity", "libp2p-swarm-derive", "log", + "multistream-select", + "once_cell", "rand 0.8.5", "smallvec", "tokio", @@ -7759,36 +7878,39 @@ dependencies = [ [[package]] name = "libp2p-swarm-derive" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fba456131824ab6acd4c7bf61e9c0f0a3014b5fc9868ccb8e10d344594cdc4f" +checksum = "c4d5ec2a3df00c7836d7696c136274c9c59705bac69133253696a6c932cd1d74" dependencies = [ "heck 0.4.1", + "proc-macro-warning 0.4.2", + "proc-macro2 1.0.82", "quote 1.0.35", - "syn 1.0.109", + "syn 2.0.61", ] [[package]] name = "libp2p-tcp" -version = "0.39.0" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d33698596d7722d85d3ab0c86c2c322254fce1241e91208e3679b4eb3026cf" +checksum = "b558dd40d1bcd1aaaed9de898e9ec6a436019ecc2420dd0016e712fbb61c5508" dependencies = [ "futures", "futures-timer", "if-watch", "libc", "libp2p-core", + "libp2p-identity", "log", - "socket2 0.4.9", + "socket2 0.5.6", "tokio", ] [[package]] name = "libp2p-tls" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff08d13d0dc66e5e9ba6279c1de417b84fa0d0adc3b03e5732928c180ec02781" +checksum = "8218d1d5482b122ccae396bbf38abdcb283ecc96fa54760e1dfd251f0546ac61" dependencies = [ "futures", "futures-rustls", @@ -7796,51 +7918,68 @@ dependencies = [ "libp2p-identity", "rcgen", "ring 0.16.20", - "rustls 0.20.8", + "rustls 0.21.7", + "rustls-webpki 0.101.4", "thiserror", - "webpki", - "x509-parser 0.14.0", + "x509-parser", "yasna", ] +[[package]] +name = "libp2p-upnp" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82775a47b34f10f787ad3e2a22e2c1541e6ebef4fe9f28f3ac553921554c94c1" +dependencies = [ + "futures", + "futures-timer", + "igd-next", + "libp2p-core", + "libp2p-swarm", + "log", + "tokio", + "void", +] + [[package]] name = "libp2p-wasm-ext" -version = "0.39.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77dff9d32353a5887adb86c8afc1de1a94d9e8c3bc6df8b2201d7cdf5c848f43" +checksum = "1e5d8e3a9e07da0ef5b55a9f26c009c8fb3c725d492d8bb4b431715786eea79c" dependencies = [ "futures", "js-sys", "libp2p-core", - "parity-send-wrapper", + "send_wrapper", "wasm-bindgen", "wasm-bindgen-futures", ] [[package]] name = "libp2p-websocket" -version = "0.41.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111273f7b3d3510524c752e8b7a5314b7f7a1fee7e68161c01a7d72cbb06db9f" +checksum = "3facf0691bab65f571bc97c6c65ffa836248ca631d631b7691ac91deb7fceb5f" dependencies = [ "either", "futures", "futures-rustls", "libp2p-core", + "libp2p-identity", "log", "parking_lot 0.12.1", "quicksink", "rw-stream-sink", "soketto", "url", - "webpki-roots 0.22.6", + "webpki-roots", ] [[package]] name = "libp2p-yamux" -version = "0.43.1" +version = "0.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd21d950662700a385d4c6d68e2f5f54d778e97068cdd718522222ef513bda" +checksum = "8eedcb62824c4300efb9cfd4e2a6edaf3ca097b9e68b36dabe45a44469fd6a85" dependencies = [ "futures", "libp2p-core", @@ -8022,7 +8161,7 @@ dependencies = [ "indexmap 2.2.3", "libc", "mockall 0.12.1", - "multiaddr", + "multiaddr 0.17.1", "multihash 0.17.0", "network-interface", "nohash-hasher", @@ -8030,11 +8169,11 @@ dependencies = [ "pin-project", "prost 0.11.9", "prost-build 0.11.9", - "quinn", + "quinn 0.9.4", "rand 0.8.5", "rcgen", "ring 0.16.20", - "rustls 0.20.8", + "rustls 0.20.9", "serde", "sha2 0.10.8", "simple-dns", @@ -8049,13 +8188,13 @@ dependencies = [ "tokio-tungstenite", "tokio-util", "tracing", - "trust-dns-resolver 0.23.2", + "trust-dns-resolver", "uint", "unsigned-varint", "url", "webpki", - "x25519-dalek 2.0.0", - "x509-parser 0.15.1", + "x25519-dalek", + "x509-parser", "yasna", "zeroize", ] @@ -8091,18 +8230,18 @@ dependencies = [ [[package]] name = "lru" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" -dependencies = [ - "hashbrown 0.13.2", -] +checksum = "eedb2bdbad7e0634f83989bf596f497b070130daaa398ab22d84c39e266deec5" [[package]] name = "lru" -version = "0.11.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eedb2bdbad7e0634f83989bf596f497b070130daaa398ab22d84c39e266deec5" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown 0.14.3", +] [[package]] name = "lru-cache" @@ -8601,6 +8740,25 @@ dependencies = [ "url", ] +[[package]] +name = "multiaddr" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b852bc02a2da5feed68cd14fa50d0774b92790a5bdbfa932a813926c8472070" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "libp2p-identity", + "multibase", + "multihash 0.19.1", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", +] + [[package]] name = "multibase" version = "0.9.1" @@ -8623,7 +8781,7 @@ dependencies = [ "blake3", "core2", "digest 0.10.7", - "multihash-derive 0.8.0", + "multihash-derive", "sha2 0.10.8", "sha3", "unsigned-varint", @@ -8640,7 +8798,7 @@ dependencies = [ "blake3", "core2", "digest 0.10.7", - "multihash-derive 0.8.0", + "multihash-derive", "sha2 0.10.8", "sha3", "unsigned-varint", @@ -8656,26 +8814,6 @@ dependencies = [ "unsigned-varint", ] -[[package]] -name = "multihash-codetable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d815ecb3c8238d00647f8630ede7060a642c9f704761cd6082cb4028af6935" -dependencies = [ - "blake2b_simd", - "blake2s_simd", - "blake3", - "core2", - "digest 0.10.7", - "multihash-derive 0.9.0", - "ripemd", - "serde", - "sha1", - "sha2 0.10.8", - "sha3", - "strobe-rs", -] - [[package]] name = "multihash-derive" version = "0.8.0" @@ -8690,31 +8828,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "multihash-derive" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "890e72cb7396cb99ed98c1246a97b243cc16394470d94e0bc8b0c2c11d84290e" -dependencies = [ - "core2", - "multihash 0.19.1", - "multihash-derive-impl", -] - -[[package]] -name = "multihash-derive-impl" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38685e08adb338659871ecfc6ee47ba9b22dcc8abcf6975d379cc49145c3040" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2 1.0.82", - "quote 1.0.35", - "syn 1.0.109", - "synstructure", -] - [[package]] name = "multimap" version = "0.8.3" @@ -8723,9 +8836,9 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "multistream-select" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a" +checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" dependencies = [ "bytes", "futures", @@ -12058,12 +12171,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "parity-send-wrapper" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" - [[package]] name = "parity-util-mem" version = "0.12.0" @@ -14969,6 +15076,20 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "polling" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite 0.2.12", + "rustix 0.38.21", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "poly1305" version = "0.8.0" @@ -15191,6 +15312,17 @@ version = "0.5.20+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" +[[package]] +name = "proc-macro-warning" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1eaa7fa0aa1929ffdf7eeb6eac234dde6268914a14ad44d23521ab6a9b258e" +dependencies = [ + "proc-macro2 1.0.82", + "quote 1.0.35", + "syn 2.0.61", +] + [[package]] name = "proc-macro-warning" version = "1.0.0" @@ -15262,9 +15394,9 @@ dependencies = [ [[package]] name = "prometheus-client" -version = "0.19.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6fa99d535dd930d1249e6c79cb3c2915f9172a540fe2b02a4c8f9ca954721e" +checksum = "3c99afa9a01501019ac3a14d71d9f94050346f55ca471ce90c799a15c58f61e2" dependencies = [ "dtoa", "itoa", @@ -15494,9 +15626,9 @@ dependencies = [ [[package]] name = "quick-protobuf-codec" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1693116345026436eb2f10b677806169c1a1260c1c60eaaffe3fb5a29ae23d8b" +checksum = "f8ededb1cd78531627244d51dd0c7139fbe736c7d57af0092a76f0ffb2f56e98" dependencies = [ "asynchronous-codec", "bytes", @@ -15546,27 +15678,45 @@ checksum = "2e8b432585672228923edbbf64b8b12c14e1112f62e88737655b4a083dbcd78e" dependencies = [ "bytes", "pin-project-lite 0.2.12", - "quinn-proto", - "quinn-udp", + "quinn-proto 0.9.6", + "quinn-udp 0.3.2", "rustc-hash", - "rustls 0.20.8", + "rustls 0.20.9", "thiserror", "tokio", "tracing", "webpki", ] +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "futures-io", + "pin-project-lite 0.2.12", + "quinn-proto 0.10.6", + "quinn-udp 0.4.1", + "rustc-hash", + "rustls 0.21.7", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "quinn-proto" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c956be1b23f4261676aed05a0046e204e8a6836e50203902683a718af0797989" +checksum = "94b0b33c13a79f669c85defaf4c275dc86a0c0372807d0ca3d78e0bb87274863" dependencies = [ "bytes", "rand 0.8.5", "ring 0.16.20", "rustc-hash", - "rustls 0.20.8", + "rustls 0.20.9", "slab", "thiserror", "tinyvec", @@ -15574,6 +15724,23 @@ dependencies = [ "webpki", ] +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring 0.16.20", + "rustc-hash", + "rustls 0.21.7", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + [[package]] name = "quinn-udp" version = "0.3.2" @@ -15581,12 +15748,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4" dependencies = [ "libc", - "quinn-proto", + "quinn-proto 0.9.6", "socket2 0.4.9", "tracing", "windows-sys 0.42.0", ] +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2 0.5.6", + "tracing", + "windows-sys 0.48.0", +] + [[package]] name = "quote" version = "0.6.13" @@ -16034,7 +16214,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite 0.2.12", - "rustls 0.21.6", + "rustls 0.21.7", "rustls-pemfile 1.0.3", "serde", "serde_json", @@ -16046,7 +16226,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.25.2", + "webpki-roots", "winreg", ] @@ -16115,15 +16295,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - [[package]] name = "rle-decode-fast" version = "1.0.3" @@ -16564,11 +16735,10 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" dependencies = [ - "log", "ring 0.16.20", "sct", "webpki", @@ -16576,9 +16746,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.6" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ "log", "ring 0.16.20", @@ -16702,9 +16872,9 @@ dependencies = [ [[package]] name = "rw-stream-sink" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" +checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1" dependencies = [ "futures", "pin-project", @@ -16765,8 +16935,7 @@ dependencies = [ "libp2p", "linked_hash_set", "log", - "multihash 0.17.0", - "multihash-codetable", + "multihash 0.19.1", "parity-scale-codec", "prost 0.12.4", "prost-build 0.12.4", @@ -17472,7 +17641,7 @@ dependencies = [ "futures-timer", "log", "mixnet", - "multiaddr", + "multiaddr 0.18.1", "parity-scale-codec", "parking_lot 0.12.1", "sc-client-api", @@ -17578,7 +17747,6 @@ dependencies = [ "async-trait", "futures", "futures-timer", - "libp2p", "log", "parity-scale-codec", "quickcheck", @@ -17621,7 +17789,6 @@ dependencies = [ "array-bytes", "async-channel", "futures", - "libp2p", "log", "parity-scale-codec", "sc-network", @@ -17712,7 +17879,6 @@ version = "0.33.0" dependencies = [ "array-bytes", "futures", - "libp2p", "log", "parity-scale-codec", "sc-network", @@ -17733,8 +17899,9 @@ dependencies = [ "ed25519-dalek 2.1.1", "libp2p-identity", "litep2p", - "multiaddr", - "multihash 0.17.0", + "log", + "multiaddr 0.18.1", + "multihash 0.19.1", "quickcheck", "rand 0.8.5", "thiserror", @@ -17754,7 +17921,6 @@ dependencies = [ "hyper", "hyper-rustls", "lazy_static", - "libp2p", "log", "num_cpus", "once_cell", @@ -18571,6 +18737,12 @@ dependencies = [ "pest", ] +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + [[package]] name = "separator" version = "0.4.1" @@ -18982,12 +19154,12 @@ dependencies = [ "async-channel", "async-executor", "async-fs", - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "async-net", "async-process", "blocking", - "futures-lite", + "futures-lite 1.13.0", ] [[package]] @@ -19006,7 +19178,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0bb30cf57b7b5f6109ce17c3164445e2d6f270af2cb48f6e4d31c2967c9a9f5" dependencies = [ "arrayvec 0.7.4", - "async-lock", + "async-lock 2.8.0", "atomic-take", "base64 0.21.2", "bip39", @@ -19017,9 +19189,9 @@ dependencies = [ "derive_more", "ed25519-zebra", "either", - "event-listener", + "event-listener 2.5.3", "fnv", - "futures-lite", + "futures-lite 1.13.0", "futures-util", "hashbrown 0.14.3", "hex", @@ -19049,7 +19221,7 @@ dependencies = [ "soketto", "twox-hash", "wasmi 0.31.2", - "x25519-dalek 2.0.0", + "x25519-dalek", "zeroize", ] @@ -19060,15 +19232,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "256b5bad1d6b49045e95fe87492ce73d5af81545d8b4d8318a872d2007024c33" dependencies = [ "async-channel", - "async-lock", + "async-lock 2.8.0", "base64 0.21.2", "blake2-rfc", "derive_more", "either", - "event-listener", + "event-listener 2.5.3", "fnv", "futures-channel", - "futures-lite", + "futures-lite 1.13.0", "futures-util", "hashbrown 0.14.3", "hex", @@ -19460,7 +19632,6 @@ checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" dependencies = [ "base64 0.13.1", "bytes", - "flate2", "futures", "http", "httparse", @@ -20389,7 +20560,7 @@ dependencies = [ "sp-runtime", "sp-runtime-interface 24.0.0", "thiserror", - "x25519-dalek 2.0.0", + "x25519-dalek", ] [[package]] @@ -20877,19 +21048,6 @@ dependencies = [ "serde", ] -[[package]] -name = "strobe-rs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabb238a1cccccfa4c4fb703670c0d157e1256c1ba695abf1b93bd2bb14bab2d" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "keccak", - "subtle 2.5.0", - "zeroize", -] - [[package]] name = "strsim" version = "0.8.0" @@ -21955,7 +22113,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.6", + "rustls 0.21.7", "tokio", ] @@ -22003,7 +22161,7 @@ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", - "rustls 0.21.6", + "rustls 0.21.7", "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", @@ -22360,26 +22518,6 @@ dependencies = [ "url", ] -[[package]] -name = "trust-dns-resolver" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" -dependencies = [ - "cfg-if", - "futures-util", - "ipconfig", - "lazy_static", - "lru-cache", - "parking_lot 0.12.1", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "tracing", - "trust-dns-proto 0.22.0", -] - [[package]] name = "trust-dns-resolver" version = "0.23.2" @@ -22442,7 +22580,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls 0.21.6", + "rustls 0.21.7", "sha1", "thiserror", "url", @@ -23239,15 +23377,6 @@ dependencies = [ "untrusted 0.9.0", ] -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] - [[package]] name = "webpki-roots" version = "0.25.2" @@ -23474,23 +23603,20 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.34.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows_aarch64_msvc 0.34.0", - "windows_i686_gnu 0.34.0", - "windows_i686_msvc 0.34.0", - "windows_x86_64_gnu 0.34.0", - "windows_x86_64_msvc 0.34.0", + "windows-targets 0.48.5", ] [[package]] name = "windows" -version = "0.48.0" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" dependencies = [ + "windows-core 0.51.1", "windows-targets 0.48.5", ] @@ -23500,10 +23626,19 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core", + "windows-core 0.52.0", "windows-targets 0.52.0", ] +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -23618,12 +23753,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" -[[package]] -name = "windows_aarch64_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -23642,12 +23771,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" -[[package]] -name = "windows_i686_gnu" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -23666,12 +23789,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" -[[package]] -name = "windows_i686_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -23690,12 +23807,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" -[[package]] -name = "windows_x86_64_gnu" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -23732,12 +23843,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" -[[package]] -name = "windows_x86_64_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -23784,17 +23889,6 @@ dependencies = [ "tap", ] -[[package]] -name = "x25519-dalek" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" -dependencies = [ - "curve25519-dalek 3.2.0", - "rand_core 0.5.1", - "zeroize", -] - [[package]] name = "x25519-dalek" version = "2.0.0" @@ -23807,24 +23901,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "x509-parser" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" -dependencies = [ - "asn1-rs", - "base64 0.13.1", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "rusticata-macros", - "thiserror", - "time", -] - [[package]] name = "x509-parser" version = "0.15.1" @@ -24045,16 +24121,32 @@ dependencies = [ "xcm-simulator", ] +[[package]] +name = "xml-rs" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" + +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] + [[package]] name = "yamux" -version = "0.10.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5" +checksum = "9ed0164ae619f2dc144909a9f082187ebb5893693d8c0196e8085283ccd4b776" dependencies = [ "futures", "log", "nohash-hasher", "parking_lot 0.12.1", + "pin-project", "rand 0.8.5", "static_assertions", ] diff --git a/Cargo.toml b/Cargo.toml index 60459500a89..7eea70c31aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -805,8 +805,8 @@ landlock = { version = "0.3.0" } lazy_static = { version = "1.4.0" } libc = { version = "0.2.153" } libfuzzer-sys = { version = "0.4" } -libp2p = { version = "0.51.4" } -libp2p-identity = { version = "0.1.3" } +libp2p = { version = "0.52.4" } +libp2p-identity = { version = "0.2.3" } libsecp256k1 = { version = "0.7.0", default-features = false } linked-hash-map = { version = "0.5.4" } linked_hash_set = { version = "0.1.4" } @@ -831,10 +831,10 @@ mmr-gadget = { path = "substrate/client/merkle-mountain-range", default-features mmr-lib = { version = "0.5.2", package = "ckb-merkle-mountain-range" } mmr-rpc = { path = "substrate/client/merkle-mountain-range/rpc", default-features = false } mockall = { version = "0.11.3" } -multiaddr = { version = "0.17.1" } -multihash = { version = "0.17.0", default-features = false } +multiaddr = { version = "0.18.1" } +multihash = { version = "0.19.1", default-features = false } multihash-codetable = { version = "0.1.1" } -multistream-select = { version = "0.12.1" } +multistream-select = { version = "0.13.0" } names = { version = "0.14.0", default-features = false } nix = { version = "0.28.0" } node-cli = { path = "substrate/bin/node/cli", package = "staging-node-cli" } diff --git a/prdoc/pr_1631.prdoc b/prdoc/pr_1631.prdoc new file mode 100644 index 00000000000..f73d0096855 --- /dev/null +++ b/prdoc/pr_1631.prdoc @@ -0,0 +1,39 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Upgrade libp2p to 0.52.4 + +doc: + - audience: [Node Dev, Node Operator] + description: | + Upgrade libp2p from 0.51.4 to 0.52.4 + +crates: + - name: sc-authority-discovery + bump: minor + - name: sc-cli + bump: minor + - name: sc-mixnet + bump: minor + - name: sc-network + bump: minor + - name: sc-network-gossip + bump: minor + - name: sc-network-common + bump: minor + - name: sc-network-light + bump: minor + - name: sc-network-statement + bump: minor + - name: sc-network-sync + bump: minor + - name: sc-network-test + bump: minor + - name: sc-network-transactions + bump: minor + - name: sc-network-types + bump: minor + - name: sc-offchain + bump: major + - name: sc-telemetry + bump: major diff --git a/substrate/client/authority-discovery/Cargo.toml b/substrate/client/authority-discovery/Cargo.toml index 4dfbe7f24ac..309c9c542a0 100644 --- a/substrate/client/authority-discovery/Cargo.toml +++ b/substrate/client/authority-discovery/Cargo.toml @@ -25,7 +25,7 @@ futures = { workspace = true } futures-timer = { workspace = true } ip_network = { workspace = true } libp2p = { features = ["ed25519", "kad"], workspace = true } -multihash = { features = ["sha2", "std"], workspace = true } +multihash = { workspace = true } linked_hash_set = { workspace = true } log = { workspace = true, default-features = true } prost = { workspace = true } @@ -42,11 +42,6 @@ sp-core = { workspace = true, default-features = true } sp-keystore = { workspace = true, default-features = true } sp-runtime = { workspace = true, default-features = true } async-trait = { workspace = true } -multihash-codetable = { features = [ - "digest", - "serde", - "sha2", -], workspace = true } [dev-dependencies] quickcheck = { workspace = true } diff --git a/substrate/client/authority-discovery/src/service.rs b/substrate/client/authority-discovery/src/service.rs index 60c7a2b9903..852d3ab80c9 100644 --- a/substrate/client/authority-discovery/src/service.rs +++ b/substrate/client/authority-discovery/src/service.rs @@ -55,7 +55,7 @@ impl Service { /// [`crate::Worker`] failed. /// /// Note: [`Multiaddr`]s returned always include a [`PeerId`] via a - /// [`libp2p::core::multiaddr::Protocol::P2p`] component. Equality of + /// [`sc_network_types::multiaddr::Protocol::P2p`] component. Equality of /// [`PeerId`]s across [`Multiaddr`]s returned by a single call is not /// enforced today, given that there are still authorities out there /// publishing the addresses of their sentry nodes on the DHT. In the future diff --git a/substrate/client/authority-discovery/src/worker.rs b/substrate/client/authority-discovery/src/worker.rs index f20cf6aa212..b81b10b3ae0 100644 --- a/substrate/client/authority-discovery/src/worker.rs +++ b/substrate/client/authority-discovery/src/worker.rs @@ -45,10 +45,7 @@ use sc_network::{ event::DhtEvent, multiaddr, KademliaKey, Multiaddr, NetworkDHTProvider, NetworkSigner, NetworkStateInfo, }; -use sc_network_types::{ - multihash::{Code, Multihash}, - PeerId, -}; +use sc_network_types::{multihash::Code, PeerId}; use schema::PeerSignature; use sp_api::{ApiError, ProvideRuntimeApi}; use sp_authority_discovery::{ @@ -247,14 +244,14 @@ where }; let public_addresses = { - let local_peer_id: Multihash = network.local_peer_id().into(); + let local_peer_id = network.local_peer_id(); config .public_addresses .into_iter() .map(|mut address| { if let Some(multiaddr::Protocol::P2p(peer_id)) = address.iter().last() { - if peer_id != local_peer_id { + if peer_id != *local_peer_id.as_ref() { error!( target: LOG_TARGET, "Discarding invalid local peer ID in public address {address}.", @@ -401,10 +398,9 @@ where ); // The address must include the local peer id. - let local_peer_id: Multihash = local_peer_id.into(); addresses .into_iter() - .map(move |a| a.with(multiaddr::Protocol::P2p(local_peer_id))) + .map(move |a| a.with(multiaddr::Protocol::P2p(*local_peer_id.as_ref()))) } /// Publish own public addresses. diff --git a/substrate/client/authority-discovery/src/worker/addr_cache.rs b/substrate/client/authority-discovery/src/worker/addr_cache.rs index 77cdfbd4f15..13bb990bf8b 100644 --- a/substrate/client/authority-discovery/src/worker/addr_cache.rs +++ b/substrate/client/authority-discovery/src/worker/addr_cache.rs @@ -177,7 +177,7 @@ mod tests { use super::*; use quickcheck::{Arbitrary, Gen, QuickCheck, TestResult}; - use sc_network_types::multihash::Multihash; + use sc_network_types::multihash::{Code, Multihash}; use sp_authority_discovery::{AuthorityId, AuthorityPair}; use sp_core::crypto::Pair; @@ -198,10 +198,9 @@ mod tests { impl Arbitrary for TestMultiaddr { fn arbitrary(g: &mut Gen) -> Self { let seed = (0..32).map(|_| u8::arbitrary(g)).collect::>(); - let peer_id = PeerId::from_multihash( - Multihash::wrap(multihash::Code::Sha2_256.into(), &seed).unwrap(), - ) - .unwrap(); + let peer_id = + PeerId::from_multihash(Multihash::wrap(Code::Sha2_256.into(), &seed).unwrap()) + .unwrap(); let multiaddr = "/ip6/2001:db8:0:0:0:0:0:2/tcp/30333" .parse::() .unwrap() @@ -217,10 +216,9 @@ mod tests { impl Arbitrary for TestMultiaddrsSamePeerCombo { fn arbitrary(g: &mut Gen) -> Self { let seed = (0..32).map(|_| u8::arbitrary(g)).collect::>(); - let peer_id = PeerId::from_multihash( - Multihash::wrap(multihash::Code::Sha2_256.into(), &seed).unwrap(), - ) - .unwrap(); + let peer_id = + PeerId::from_multihash(Multihash::wrap(Code::Sha2_256.into(), &seed).unwrap()) + .unwrap(); let multiaddr1 = "/ip6/2001:db8:0:0:0:0:0:2/tcp/30333" .parse::() .unwrap() diff --git a/substrate/client/network-gossip/Cargo.toml b/substrate/client/network-gossip/Cargo.toml index 6a2b3e3ef78..f1441e4a1cf 100644 --- a/substrate/client/network-gossip/Cargo.toml +++ b/substrate/client/network-gossip/Cargo.toml @@ -20,7 +20,6 @@ targets = ["x86_64-unknown-linux-gnu"] ahash = { workspace = true } futures = { workspace = true } futures-timer = { workspace = true } -libp2p = { workspace = true } log = { workspace = true, default-features = true } schnellru = { workspace = true } tracing = { workspace = true, default-features = true } diff --git a/substrate/client/network-gossip/src/bridge.rs b/substrate/client/network-gossip/src/bridge.rs index cd344d9196d..414da9b2a58 100644 --- a/substrate/client/network-gossip/src/bridge.rs +++ b/substrate/client/network-gossip/src/bridge.rs @@ -348,7 +348,7 @@ impl futures::future::FusedFuture for GossipEngine { #[cfg(test)] mod tests { use super::*; - use crate::{multiaddr::Multiaddr, ValidationResult, ValidatorContext}; + use crate::{ValidationResult, ValidatorContext}; use codec::{DecodeAll, Encode}; use futures::{ channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}, @@ -363,6 +363,7 @@ mod tests { }; use sc_network_common::role::ObservedRole; use sc_network_sync::SyncEventStream; + use sc_network_types::multiaddr::Multiaddr; use sp_runtime::{ testing::H256, traits::{Block as BlockT, NumberFor}, diff --git a/substrate/client/network-gossip/src/lib.rs b/substrate/client/network-gossip/src/lib.rs index e04ea2a91e7..20d9922200c 100644 --- a/substrate/client/network-gossip/src/lib.rs +++ b/substrate/client/network-gossip/src/lib.rs @@ -67,9 +67,12 @@ pub use self::{ validator::{DiscardAll, MessageIntent, ValidationResult, Validator, ValidatorContext}, }; -use sc_network::{multiaddr, types::ProtocolName, NetworkBlock, NetworkEventStream, NetworkPeers}; +use sc_network::{types::ProtocolName, NetworkBlock, NetworkEventStream, NetworkPeers}; use sc_network_sync::SyncEventStream; -use sc_network_types::PeerId; +use sc_network_types::{ + multiaddr::{Multiaddr, Protocol}, + PeerId, +}; use sp_runtime::traits::{Block as BlockT, NumberFor}; use std::iter; @@ -80,8 +83,7 @@ mod validator; /// Abstraction over a network. pub trait Network: NetworkPeers + NetworkEventStream { fn add_set_reserved(&self, who: PeerId, protocol: ProtocolName) { - let addr = - iter::once(multiaddr::Protocol::P2p(who.into())).collect::(); + let addr = Multiaddr::empty().with(Protocol::P2p(*who.as_ref())); let result = self.add_peers_to_reserved_set(protocol, iter::once(addr).collect()); if let Err(err) = result { log::error!(target: "gossip", "add_set_reserved failed: {}", err); diff --git a/substrate/client/network-gossip/src/state_machine.rs b/substrate/client/network-gossip/src/state_machine.rs index 016afa95ece..ac3f7a1b8c7 100644 --- a/substrate/client/network-gossip/src/state_machine.rs +++ b/substrate/client/network-gossip/src/state_machine.rs @@ -542,12 +542,12 @@ impl Metrics { #[cfg(test)] mod tests { use super::*; - use crate::multiaddr::Multiaddr; use futures::prelude::*; use sc_network::{ config::MultiaddrWithPeerId, event::Event, service::traits::NotificationEvent, MessageSink, NetworkBlock, NetworkEventStream, NetworkPeers, ReputationChange, }; + use sc_network_types::multiaddr::Multiaddr; use sp_runtime::{ testing::{Block as RawBlock, ExtrinsicWrapper, H256}, traits::NumberFor, diff --git a/substrate/client/network/src/behaviour.rs b/substrate/client/network/src/behaviour.rs index 68deac0f47b..68816a10980 100644 --- a/substrate/client/network/src/behaviour.rs +++ b/substrate/client/network/src/behaviour.rs @@ -31,8 +31,8 @@ use crate::{ use futures::channel::oneshot; use libp2p::{ - core::Multiaddr, identify::Info as IdentifyInfo, identity::PublicKey, kad::RecordKey, - swarm::NetworkBehaviour, PeerId, + connection_limits::ConnectionLimits, core::Multiaddr, identify::Info as IdentifyInfo, + identity::PublicKey, kad::RecordKey, swarm::NetworkBehaviour, PeerId, StreamProtocol, }; use parking_lot::Mutex; @@ -47,8 +47,10 @@ pub use crate::request_responses::{InboundFailure, OutboundFailure, ResponseFail /// General behaviour of the network. Combines all protocols together. #[derive(NetworkBehaviour)] -#[behaviour(out_event = "BehaviourOut")] +#[behaviour(to_swarm = "BehaviourOut")] pub struct Behaviour { + /// Connection limits. + connection_limits: libp2p::connection_limits::Behaviour, /// All the substrate-specific protocols. substrate: Protocol, /// Periodically pings and identifies the nodes we are connected to, and store information in a @@ -180,6 +182,7 @@ impl Behaviour { request_response_protocols: Vec, peer_store_handle: Arc, external_addresses: Arc>>, + connection_limits: ConnectionLimits, ) -> Result { Ok(Self { substrate, @@ -193,6 +196,7 @@ impl Behaviour { request_response_protocols.into_iter(), peer_store_handle, )?, + connection_limits: libp2p::connection_limits::Behaviour::new(connection_limits), }) } @@ -267,7 +271,7 @@ impl Behaviour { pub fn add_self_reported_address_to_dht( &mut self, peer_id: &PeerId, - supported_protocols: &[impl AsRef<[u8]>], + supported_protocols: &[StreamProtocol], addr: Multiaddr, ) { self.discovery.add_self_reported_address(peer_id, supported_protocols, addr); @@ -376,3 +380,9 @@ impl From for BehaviourOut { } } } + +impl From for BehaviourOut { + fn from(e: void::Void) -> Self { + void::unreachable(e) + } +} diff --git a/substrate/client/network/src/config.rs b/substrate/client/network/src/config.rs index 100a1e9dfb3..e939558b20b 100644 --- a/substrate/client/network/src/config.rs +++ b/substrate/client/network/src/config.rs @@ -114,13 +114,13 @@ pub fn parse_str_addr(addr_str: &str) -> Result<(PeerId, Multiaddr), ParseErr> { /// Splits a Multiaddress into a Multiaddress and PeerId. pub fn parse_addr(mut addr: Multiaddr) -> Result<(PeerId, Multiaddr), ParseErr> { - let who = match addr.pop() { - Some(multiaddr::Protocol::P2p(key)) => - PeerId::from_multihash(key).map_err(|_| ParseErr::InvalidPeerId)?, + let multihash = match addr.pop() { + Some(multiaddr::Protocol::P2p(multihash)) => multihash, _ => return Err(ParseErr::PeerIdMissing), }; + let peer_id = PeerId::from_multihash(multihash).map_err(|_| ParseErr::InvalidPeerId)?; - Ok((who, addr)) + Ok((peer_id, addr)) } /// Address of a node, including its identity. diff --git a/substrate/client/network/src/discovery.rs b/substrate/client/network/src/discovery.rs index 2c788ec713f..3145b891a8d 100644 --- a/substrate/client/network/src/discovery.rs +++ b/substrate/client/network/src/discovery.rs @@ -55,20 +55,20 @@ use ip_network::IpNetwork; use libp2p::{ core::{Endpoint, Multiaddr}, kad::{ - handler::KademliaHandler, + self, record::store::{MemoryStore, RecordStore}, - GetClosestPeersError, GetRecordOk, Kademlia, KademliaBucketInserts, KademliaConfig, - KademliaEvent, QueryId, QueryResult, Quorum, Record, RecordKey, + Behaviour as Kademlia, BucketInserts, Config as KademliaConfig, Event as KademliaEvent, + GetClosestPeersError, GetRecordOk, QueryId, QueryResult, Quorum, Record, RecordKey, }, mdns::{self, tokio::Behaviour as TokioMdns}, multiaddr::Protocol, swarm::{ behaviour::{ toggle::{Toggle, ToggleConnectionHandler}, - DialFailure, FromSwarm, NewExternalAddr, + DialFailure, ExternalAddrConfirmed, FromSwarm, }, - ConnectionDenied, ConnectionId, DialError, NetworkBehaviour, PollParameters, THandler, - THandlerInEvent, THandlerOutEvent, ToSwarm, + ConnectionDenied, ConnectionId, DialError, NetworkBehaviour, PollParameters, + StreamProtocol, THandler, THandlerInEvent, THandlerOutEvent, ToSwarm, }, PeerId, }; @@ -105,8 +105,8 @@ pub struct DiscoveryConfig { discovery_only_if_under_num: u64, enable_mdns: bool, kademlia_disjoint_query_paths: bool, - kademlia_protocol: Vec, - kademlia_legacy_protocol: Vec, + kademlia_protocol: Option, + kademlia_legacy_protocol: Option, kademlia_replication_factor: NonZeroUsize, } @@ -122,8 +122,8 @@ impl DiscoveryConfig { discovery_only_if_under_num: std::u64::MAX, enable_mdns: false, kademlia_disjoint_query_paths: false, - kademlia_protocol: Vec::new(), - kademlia_legacy_protocol: Vec::new(), + kademlia_protocol: None, + kademlia_legacy_protocol: None, kademlia_replication_factor: NonZeroUsize::new(DEFAULT_KADEMLIA_REPLICATION_FACTOR) .expect("value is a constant; constant is non-zero; qed."), } @@ -179,8 +179,8 @@ impl DiscoveryConfig { fork_id: Option<&str>, protocol_id: &ProtocolId, ) -> &mut Self { - self.kademlia_protocol = kademlia_protocol_name(genesis_hash, fork_id); - self.kademlia_legacy_protocol = legacy_kademlia_protocol_name(protocol_id); + self.kademlia_protocol = Some(kademlia_protocol_name(genesis_hash, fork_id)); + self.kademlia_legacy_protocol = Some(legacy_kademlia_protocol_name(protocol_id)); self } @@ -213,26 +213,31 @@ impl DiscoveryConfig { kademlia_replication_factor, } = self; - let kademlia = if !kademlia_protocol.is_empty() { + let kademlia = if let Some(ref kademlia_protocol) = kademlia_protocol { let mut config = KademliaConfig::default(); config.set_replication_factor(kademlia_replication_factor); // Populate kad with both the legacy and the new protocol names. // Remove the legacy protocol: // https://github.com/paritytech/polkadot-sdk/issues/504 - let kademlia_protocols = [kademlia_protocol.clone(), kademlia_legacy_protocol]; + let kademlia_protocols = if let Some(legacy_protocol) = kademlia_legacy_protocol { + vec![kademlia_protocol.clone(), legacy_protocol] + } else { + vec![kademlia_protocol.clone()] + }; config.set_protocol_names(kademlia_protocols.into_iter().map(Into::into).collect()); - config.set_record_filtering(libp2p::kad::KademliaStoreInserts::FilterBoth); + config.set_record_filtering(libp2p::kad::StoreInserts::FilterBoth); // By default Kademlia attempts to insert all peers into its routing table once a // dialing attempt succeeds. In order to control which peer is added, disable the // auto-insertion and instead add peers manually. - config.set_kbucket_inserts(KademliaBucketInserts::Manual); + config.set_kbucket_inserts(BucketInserts::Manual); config.disjoint_query_paths(kademlia_disjoint_query_paths); let store = MemoryStore::new(local_peer_id); let mut kad = Kademlia::with_config(local_peer_id, store, config); + kad.set_mode(Some(kad::Mode::Server)); for (peer_id, addr) in &permanent_addresses { kad.add_address(peer_id, addr.clone()); @@ -323,7 +328,7 @@ pub struct DiscoveryBehaviour { /// /// Remove when all nodes are upgraded to genesis hash and fork ID-based Kademlia: /// . - kademlia_protocol: Vec, + kademlia_protocol: Option, } impl DiscoveryBehaviour { @@ -369,7 +374,7 @@ impl DiscoveryBehaviour { pub fn add_self_reported_address( &mut self, peer_id: &PeerId, - supported_protocols: &[impl AsRef<[u8]>], + supported_protocols: &[StreamProtocol], addr: Multiaddr, ) { if let Some(kademlia) = self.kademlia.as_mut() { @@ -386,10 +391,12 @@ impl DiscoveryBehaviour { // Extract the chain-based Kademlia protocol from `kademlia.protocol_name()` // when all nodes are upgraded to genesis hash and fork ID-based Kademlia: // https://github.com/paritytech/polkadot-sdk/issues/504. - if !supported_protocols - .iter() - .any(|p| p.as_ref() == self.kademlia_protocol.as_slice()) - { + if !supported_protocols.iter().any(|p| { + p == self + .kademlia_protocol + .as_ref() + .expect("kademlia protocol was checked above to be enabled; qed") + }) { trace!( target: "sub-libp2p", "Ignoring self-reported address {} from {} as remote node is not part of the \ @@ -503,7 +510,7 @@ impl DiscoveryBehaviour { #[derive(Debug)] pub enum DiscoveryOut { /// A connection to a peer has been established but the peer has not been - /// added to the routing table because [`KademliaBucketInserts::Manual`] is + /// added to the routing table because [`BucketInserts::Manual`] is /// configured. If the peer is to be included in the routing table, it must /// be explicitly added via /// [`DiscoveryBehaviour::add_self_reported_address`]. @@ -552,8 +559,9 @@ pub enum DiscoveryOut { } impl NetworkBehaviour for DiscoveryBehaviour { - type ConnectionHandler = ToggleConnectionHandler>; - type OutEvent = DiscoveryOut; + type ConnectionHandler = + ToggleConnectionHandler< as NetworkBehaviour>::ConnectionHandler>; + type ToSwarm = DiscoveryOut; fn handle_established_inbound_connection( &mut self, @@ -689,11 +697,11 @@ impl NetworkBehaviour for DiscoveryBehaviour { FromSwarm::ListenerError(e) => { self.kademlia.on_swarm_event(FromSwarm::ListenerError(e)); }, - FromSwarm::ExpiredExternalAddr(e) => { + FromSwarm::ExternalAddrExpired(e) => { // We intentionally don't remove the element from `known_external_addresses` in // order to not print the log line again. - self.kademlia.on_swarm_event(FromSwarm::ExpiredExternalAddr(e)); + self.kademlia.on_swarm_event(FromSwarm::ExternalAddrExpired(e)); }, FromSwarm::NewListener(e) => { self.kademlia.on_swarm_event(FromSwarm::NewListener(e)); @@ -701,8 +709,18 @@ impl NetworkBehaviour for DiscoveryBehaviour { FromSwarm::ExpiredListenAddr(e) => { self.kademlia.on_swarm_event(FromSwarm::ExpiredListenAddr(e)); }, - FromSwarm::NewExternalAddr(e @ NewExternalAddr { addr }) => { - let new_addr = addr.clone().with(Protocol::P2p(self.local_peer_id.into())); + FromSwarm::NewExternalAddrCandidate(e) => { + self.kademlia.on_swarm_event(FromSwarm::NewExternalAddrCandidate(e)); + }, + FromSwarm::AddressChange(e) => { + self.kademlia.on_swarm_event(FromSwarm::AddressChange(e)); + }, + FromSwarm::NewListenAddr(e) => { + self.kademlia.on_swarm_event(FromSwarm::NewListenAddr(e)); + self.mdns.on_swarm_event(FromSwarm::NewListenAddr(e)); + }, + FromSwarm::ExternalAddrConfirmed(e @ ExternalAddrConfirmed { addr }) => { + let new_addr = addr.clone().with(Protocol::P2p(self.local_peer_id)); if Self::can_add_to_dht(addr) { // NOTE: we might re-discover the same address multiple times @@ -716,14 +734,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { } } - self.kademlia.on_swarm_event(FromSwarm::NewExternalAddr(e)); - }, - FromSwarm::AddressChange(e) => { - self.kademlia.on_swarm_event(FromSwarm::AddressChange(e)); - }, - FromSwarm::NewListenAddr(e) => { - self.kademlia.on_swarm_event(FromSwarm::NewListenAddr(e)); - self.mdns.on_swarm_event(FromSwarm::NewListenAddr(e)); + self.kademlia.on_swarm_event(FromSwarm::ExternalAddrConfirmed(e)); }, } } @@ -741,7 +752,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { &mut self, cx: &mut Context, params: &mut impl PollParameters, - ) -> Poll>> { + ) -> Poll>> { // Immediately process the content of `discovered`. if let Some(ev) = self.pending_events.pop_front() { return Poll::Ready(ToSwarm::GenerateEvent(ev)) @@ -963,10 +974,17 @@ impl NetworkBehaviour for DiscoveryBehaviour { ToSwarm::Dial { opts } => return Poll::Ready(ToSwarm::Dial { opts }), ToSwarm::NotifyHandler { peer_id, handler, event } => return Poll::Ready(ToSwarm::NotifyHandler { peer_id, handler, event }), - ToSwarm::ReportObservedAddr { address, score } => - return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }), ToSwarm::CloseConnection { peer_id, connection } => return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }), + ToSwarm::NewExternalAddrCandidate(observed) => + return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)), + ToSwarm::ExternalAddrConfirmed(addr) => + return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)), + ToSwarm::ExternalAddrExpired(addr) => + return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)), + ToSwarm::ListenOn { opts } => return Poll::Ready(ToSwarm::ListenOn { opts }), + ToSwarm::RemoveListener { id } => + return Poll::Ready(ToSwarm::RemoveListener { id }), } } @@ -979,8 +997,9 @@ impl NetworkBehaviour for DiscoveryBehaviour { continue } - self.pending_events - .extend(list.map(|(peer_id, _)| DiscoveryOut::Discovered(peer_id))); + self.pending_events.extend( + list.into_iter().map(|(peer_id, _)| DiscoveryOut::Discovered(peer_id)), + ); if let Some(ev) = self.pending_events.pop_front() { return Poll::Ready(ToSwarm::GenerateEvent(ev)) } @@ -990,13 +1009,19 @@ impl NetworkBehaviour for DiscoveryBehaviour { ToSwarm::Dial { .. } => { unreachable!("mDNS never dials!"); }, - ToSwarm::NotifyHandler { event, .. } => match event {}, /* `event` is an */ - // enum with no - // variant - ToSwarm::ReportObservedAddr { address, score } => - return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }), + // `event` is an enum with no variant + ToSwarm::NotifyHandler { event, .. } => match event {}, ToSwarm::CloseConnection { peer_id, connection } => return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }), + ToSwarm::NewExternalAddrCandidate(observed) => + return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)), + ToSwarm::ExternalAddrConfirmed(addr) => + return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)), + ToSwarm::ExternalAddrExpired(addr) => + return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)), + ToSwarm::ListenOn { opts } => return Poll::Ready(ToSwarm::ListenOn { opts }), + ToSwarm::RemoveListener { id } => + return Poll::Ready(ToSwarm::RemoveListener { id }), } } @@ -1005,21 +1030,24 @@ impl NetworkBehaviour for DiscoveryBehaviour { } /// Legacy (fallback) Kademlia protocol name based on `protocol_id`. -fn legacy_kademlia_protocol_name(id: &ProtocolId) -> Vec { - let mut v = vec![b'/']; - v.extend_from_slice(id.as_ref().as_bytes()); - v.extend_from_slice(b"/kad"); - v +fn legacy_kademlia_protocol_name(id: &ProtocolId) -> StreamProtocol { + let name = format!("/{}/kad", id.as_ref()); + StreamProtocol::try_from_owned(name).expect("protocol name is valid. qed") } /// Kademlia protocol name based on `genesis_hash` and `fork_id`. -fn kademlia_protocol_name>(genesis_hash: Hash, fork_id: Option<&str>) -> Vec { +fn kademlia_protocol_name>( + genesis_hash: Hash, + fork_id: Option<&str>, +) -> StreamProtocol { let genesis_hash_hex = bytes2hex("", genesis_hash.as_ref()); - if let Some(fork_id) = fork_id { - format!("/{}/{}/kad", genesis_hash_hex, fork_id).as_bytes().into() + let name = if let Some(fork_id) = fork_id { + format!("/{genesis_hash_hex}/{fork_id}/kad") } else { - format!("/{}/kad", genesis_hash_hex).as_bytes().into() - } + format!("/{genesis_hash_hex}/kad") + }; + + StreamProtocol::try_from_owned(name).expect("protocol name is valid. qed") } #[cfg(test)] @@ -1036,7 +1064,7 @@ mod tests { }, identity::Keypair, noise, - swarm::{Executor, Swarm, SwarmBuilder, SwarmEvent}, + swarm::{Executor, Swarm, SwarmEvent}, yamux, Multiaddr, }; use sp_core::hash::H256; @@ -1082,7 +1110,8 @@ mod tests { }; let runtime = tokio::runtime::Runtime::new().unwrap(); - let mut swarm = SwarmBuilder::with_executor( + #[allow(deprecated)] + let mut swarm = libp2p::swarm::SwarmBuilder::with_executor( transport, behaviour, keypair.public().to_peer_id(), diff --git a/substrate/client/network/src/litep2p/service.rs b/substrate/client/network/src/litep2p/service.rs index 8f36b0828bd..20bf6cd12d2 100644 --- a/substrate/client/network/src/litep2p/service.rs +++ b/substrate/client/network/src/litep2p/service.rs @@ -264,8 +264,20 @@ impl NetworkStatusProvider for Litep2pNetworkService { async fn network_state(&self) -> Result { Ok(NetworkState { peer_id: self.local_peer_id.to_base58(), - listened_addresses: self.listen_addresses.read().iter().cloned().collect(), - external_addresses: self.external_addresses.read().iter().cloned().collect(), + listened_addresses: self + .listen_addresses + .read() + .iter() + .cloned() + .map(|a| Multiaddr::from(a).into()) + .collect(), + external_addresses: self + .external_addresses + .read() + .iter() + .cloned() + .map(|a| Multiaddr::from(a).into()) + .collect(), connected_peers: HashMap::new(), not_connected_peers: HashMap::new(), // TODO: Check what info we can include here. diff --git a/substrate/client/network/src/peer_info.rs b/substrate/client/network/src/peer_info.rs index 2735bd873db..21eeea6bcc0 100644 --- a/substrate/client/network/src/peer_info.rs +++ b/substrate/client/network/src/peer_info.rs @@ -31,14 +31,15 @@ use libp2p::{ Info as IdentifyInfo, }, identity::PublicKey, - ping::{Behaviour as Ping, Config as PingConfig, Event as PingEvent, Success as PingSuccess}, + ping::{Behaviour as Ping, Config as PingConfig, Event as PingEvent}, swarm::{ behaviour::{ - AddressChange, ConnectionClosed, ConnectionEstablished, DialFailure, FromSwarm, - ListenFailure, + AddressChange, ConnectionClosed, ConnectionEstablished, DialFailure, + ExternalAddrConfirmed, FromSwarm, ListenFailure, }, - ConnectionDenied, ConnectionHandler, ConnectionId, IntoConnectionHandlerSelect, - NetworkBehaviour, PollParameters, THandler, THandlerInEvent, THandlerOutEvent, ToSwarm, + ConnectionDenied, ConnectionHandler, ConnectionHandlerSelect, ConnectionId, + NetworkBehaviour, NewExternalAddrCandidate, PollParameters, THandler, THandlerInEvent, + THandlerOutEvent, ToSwarm, }, Multiaddr, PeerId, }; @@ -47,7 +48,7 @@ use parking_lot::Mutex; use smallvec::SmallVec; use std::{ - collections::{hash_map::Entry, HashSet}, + collections::{hash_map::Entry, HashSet, VecDeque}, pin::Pin, sync::Arc, task::{Context, Poll}, @@ -71,6 +72,8 @@ pub struct PeerInfoBehaviour { garbage_collect: Pin + Send>>, /// Record keeping of external addresses. Data is queried by the `NetworkService`. external_addresses: ExternalAddresses, + /// Pending events to emit to [`Swarm`](libp2p::swarm::Swarm). + pending_actions: VecDeque>>, } /// Information about a node we're connected to. @@ -134,6 +137,7 @@ impl PeerInfoBehaviour { nodes_info: FnvHashMap::default(), garbage_collect: Box::pin(interval(GARBAGE_COLLECT_INTERVAL)), external_addresses: ExternalAddresses { addresses: external_addresses }, + pending_actions: Default::default(), } } @@ -148,13 +152,18 @@ impl PeerInfoBehaviour { /// Inserts a ping time in the cache. Has no effect if we don't have any entry for that node, /// which shouldn't happen. - fn handle_ping_report(&mut self, peer_id: &PeerId, ping_time: Duration) { - trace!(target: "sub-libp2p", "Ping time with {:?}: {:?}", peer_id, ping_time); + fn handle_ping_report( + &mut self, + peer_id: &PeerId, + ping_time: Duration, + connection: ConnectionId, + ) { + trace!(target: "sub-libp2p", "Ping time with {:?} via {:?}: {:?}", peer_id, connection, ping_time); if let Some(entry) = self.nodes_info.get_mut(peer_id) { entry.latest_ping = Some(ping_time); } else { error!(target: "sub-libp2p", - "Received ping from node we're not connected to {:?}", peer_id); + "Received ping from node we're not connected to {:?} via {:?}", peer_id, connection); } } @@ -208,11 +217,11 @@ pub enum PeerInfoEvent { } impl NetworkBehaviour for PeerInfoBehaviour { - type ConnectionHandler = IntoConnectionHandlerSelect< + type ConnectionHandler = ConnectionHandlerSelect< ::ConnectionHandler, ::ConnectionHandler, >; - type OutEvent = PeerInfoEvent; + type ToSwarm = PeerInfoEvent; fn handle_pending_inbound_connection( &mut self, @@ -378,9 +387,9 @@ impl NetworkBehaviour for PeerInfoBehaviour { self.ping.on_swarm_event(FromSwarm::ListenerError(e)); self.identify.on_swarm_event(FromSwarm::ListenerError(e)); }, - FromSwarm::ExpiredExternalAddr(e) => { - self.ping.on_swarm_event(FromSwarm::ExpiredExternalAddr(e)); - self.identify.on_swarm_event(FromSwarm::ExpiredExternalAddr(e)); + FromSwarm::ExternalAddrExpired(e) => { + self.ping.on_swarm_event(FromSwarm::ExternalAddrExpired(e)); + self.identify.on_swarm_event(FromSwarm::ExternalAddrExpired(e)); }, FromSwarm::NewListener(e) => { self.ping.on_swarm_event(FromSwarm::NewListener(e)); @@ -391,10 +400,23 @@ impl NetworkBehaviour for PeerInfoBehaviour { self.identify.on_swarm_event(FromSwarm::ExpiredListenAddr(e)); self.external_addresses.remove(e.addr); }, - FromSwarm::NewExternalAddr(e) => { - self.ping.on_swarm_event(FromSwarm::NewExternalAddr(e)); - self.identify.on_swarm_event(FromSwarm::NewExternalAddr(e)); - self.external_addresses.add(e.addr.clone()); + FromSwarm::NewExternalAddrCandidate(e @ NewExternalAddrCandidate { addr }) => { + self.ping.on_swarm_event(FromSwarm::NewExternalAddrCandidate(e)); + self.identify.on_swarm_event(FromSwarm::NewExternalAddrCandidate(e)); + + // Manually confirm all external address candidates. + // TODO: consider adding [AutoNAT protocol](https://docs.rs/libp2p/0.52.3/libp2p/autonat/index.html) + // (must go through the polkadot protocol spec) or implemeting heuristics for + // approving external address candidates. This can be done, for example, by + // approving only addresses reported by multiple peers. + // See also https://github.com/libp2p/rust-libp2p/pull/4721 introduced + // in libp2p v0.53 for heuristics approach. + self.pending_actions.push_back(ToSwarm::ExternalAddrConfirmed(addr.clone())); + }, + FromSwarm::ExternalAddrConfirmed(e @ ExternalAddrConfirmed { addr }) => { + self.ping.on_swarm_event(FromSwarm::ExternalAddrConfirmed(e)); + self.identify.on_swarm_event(FromSwarm::ExternalAddrConfirmed(e)); + self.external_addresses.add(addr.clone()); }, FromSwarm::AddressChange(e @ AddressChange { peer_id, old, new, .. }) => { self.ping.on_swarm_event(FromSwarm::AddressChange(e)); @@ -437,13 +459,17 @@ impl NetworkBehaviour for PeerInfoBehaviour { &mut self, cx: &mut Context, params: &mut impl PollParameters, - ) -> Poll>> { + ) -> Poll>> { + if let Some(event) = self.pending_actions.pop_front() { + return Poll::Ready(event) + } + loop { match self.ping.poll(cx, params) { Poll::Pending => break, Poll::Ready(ToSwarm::GenerateEvent(ev)) => { - if let PingEvent { peer, result: Ok(PingSuccess::Ping { rtt }) } = ev { - self.handle_ping_report(&peer, rtt) + if let PingEvent { peer, result: Ok(rtt), connection } = ev { + self.handle_ping_report(&peer, rtt, connection) } }, Poll::Ready(ToSwarm::Dial { opts }) => return Poll::Ready(ToSwarm::Dial { opts }), @@ -453,10 +479,18 @@ impl NetworkBehaviour for PeerInfoBehaviour { handler, event: Either::Left(event), }), - Poll::Ready(ToSwarm::ReportObservedAddr { address, score }) => - return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }), Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }) => return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }), + Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)) => + return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)), + Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)) => + return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)), + Poll::Ready(ToSwarm::ExternalAddrExpired(addr)) => + return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)), + Poll::Ready(ToSwarm::ListenOn { opts }) => + return Poll::Ready(ToSwarm::ListenOn { opts }), + Poll::Ready(ToSwarm::RemoveListener { id }) => + return Poll::Ready(ToSwarm::RemoveListener { id }), } } @@ -482,10 +516,18 @@ impl NetworkBehaviour for PeerInfoBehaviour { handler, event: Either::Right(event), }), - Poll::Ready(ToSwarm::ReportObservedAddr { address, score }) => - return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }), Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }) => return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }), + Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)) => + return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)), + Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)) => + return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)), + Poll::Ready(ToSwarm::ExternalAddrExpired(addr)) => + return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)), + Poll::Ready(ToSwarm::ListenOn { opts }) => + return Poll::Ready(ToSwarm::ListenOn { opts }), + Poll::Ready(ToSwarm::RemoveListener { id }) => + return Poll::Ready(ToSwarm::RemoveListener { id }), } } diff --git a/substrate/client/network/src/protocol.rs b/substrate/client/network/src/protocol.rs index 2e57ff1b6a8..977c4c4de66 100644 --- a/substrate/client/network/src/protocol.rs +++ b/substrate/client/network/src/protocol.rs @@ -163,9 +163,6 @@ impl Protocol { pub fn disconnect_peer(&mut self, peer_id: &PeerId, protocol_name: ProtocolName) { if let Some(position) = self.notification_protocols.iter().position(|p| *p == protocol_name) { - // Note: no need to remove a peer from `self.peers` if we are dealing with sync - // protocol, because it will be done when handling - // `NotificationsOut::CustomProtocolClosed`. self.behaviour.disconnect_peer(peer_id, SetId::from(position)); } else { warn!(target: "sub-libp2p", "disconnect_peer() with invalid protocol name") @@ -229,7 +226,7 @@ pub enum CustomMessageOutcome { impl NetworkBehaviour for Protocol { type ConnectionHandler = ::ConnectionHandler; - type OutEvent = CustomMessageOutcome; + type ToSwarm = CustomMessageOutcome; fn handle_established_inbound_connection( &mut self, @@ -290,17 +287,25 @@ impl NetworkBehaviour for Protocol { &mut self, cx: &mut std::task::Context, params: &mut impl PollParameters, - ) -> Poll>> { + ) -> Poll>> { let event = match self.behaviour.poll(cx, params) { Poll::Pending => return Poll::Pending, Poll::Ready(ToSwarm::GenerateEvent(ev)) => ev, Poll::Ready(ToSwarm::Dial { opts }) => return Poll::Ready(ToSwarm::Dial { opts }), Poll::Ready(ToSwarm::NotifyHandler { peer_id, handler, event }) => return Poll::Ready(ToSwarm::NotifyHandler { peer_id, handler, event }), - Poll::Ready(ToSwarm::ReportObservedAddr { address, score }) => - return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }), Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }) => return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }), + Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)) => + return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)), + Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)) => + return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)), + Poll::Ready(ToSwarm::ExternalAddrExpired(addr)) => + return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)), + Poll::Ready(ToSwarm::ListenOn { opts }) => + return Poll::Ready(ToSwarm::ListenOn { opts }), + Poll::Ready(ToSwarm::RemoveListener { id }) => + return Poll::Ready(ToSwarm::RemoveListener { id }), }; let outcome = match event { diff --git a/substrate/client/network/src/protocol/notifications/behaviour.rs b/substrate/client/network/src/protocol/notifications/behaviour.rs index 03ba437a667..cb4f089995e 100644 --- a/substrate/client/network/src/protocol/notifications/behaviour.rs +++ b/substrate/client/network/src/protocol/notifications/behaviour.rs @@ -1198,7 +1198,7 @@ impl Notifications { impl NetworkBehaviour for Notifications { type ConnectionHandler = NotifsHandler; - type OutEvent = NotificationsOut; + type ToSwarm = NotificationsOut; fn handle_pending_inbound_connection( &mut self, @@ -1678,10 +1678,11 @@ impl NetworkBehaviour for Notifications { FromSwarm::ListenerClosed(_) => {}, FromSwarm::ListenFailure(_) => {}, FromSwarm::ListenerError(_) => {}, - FromSwarm::ExpiredExternalAddr(_) => {}, + FromSwarm::ExternalAddrExpired(_) => {}, FromSwarm::NewListener(_) => {}, FromSwarm::ExpiredListenAddr(_) => {}, - FromSwarm::NewExternalAddr(_) => {}, + FromSwarm::NewExternalAddrCandidate(_) => {}, + FromSwarm::ExternalAddrConfirmed(_) => {}, FromSwarm::AddressChange(_) => {}, FromSwarm::NewListenAddr(_) => {}, } @@ -2239,7 +2240,7 @@ impl NetworkBehaviour for Notifications { &mut self, cx: &mut Context, _params: &mut impl PollParameters, - ) -> Poll>> { + ) -> Poll>> { if let Some(event) = self.events.pop_front() { return Poll::Ready(event) } @@ -2382,7 +2383,6 @@ mod tests { protocol::notifications::handler::tests::*, protocol_controller::{IncomingIndex, ProtoSetConfig, ProtocolController}, }; - use libp2p::swarm::AddressRecord; use sc_utils::mpsc::tracing_unbounded; use std::{collections::HashSet, iter}; @@ -2402,31 +2402,14 @@ mod tests { } #[derive(Clone)] - struct MockPollParams { - peer_id: PeerId, - addr: Multiaddr, - } + struct MockPollParams {} impl PollParameters for MockPollParams { type SupportedProtocolsIter = std::vec::IntoIter>; - type ListenedAddressesIter = std::vec::IntoIter; - type ExternalAddressesIter = std::vec::IntoIter; fn supported_protocols(&self) -> Self::SupportedProtocolsIter { vec![].into_iter() } - - fn listened_addresses(&self) -> Self::ListenedAddressesIter { - vec![self.addr.clone()].into_iter() - } - - fn external_addresses(&self) -> Self::ExternalAddressesIter { - vec![].into_iter() - } - - fn local_peer_id(&self) -> &PeerId { - &self.peer_id - } } fn development_notifs( @@ -3331,7 +3314,7 @@ mod tests { notif.on_swarm_event(FromSwarm::DialFailure(libp2p::swarm::behaviour::DialFailure { peer_id: Some(peer), - error: &libp2p::swarm::DialError::Banned, + error: &libp2p::swarm::DialError::Aborted, connection_id: ConnectionId::new_unchecked(1337), })); @@ -3877,7 +3860,7 @@ mod tests { let now = Instant::now(); notif.on_swarm_event(FromSwarm::DialFailure(libp2p::swarm::behaviour::DialFailure { peer_id: Some(peer), - error: &libp2p::swarm::DialError::Banned, + error: &libp2p::swarm::DialError::Aborted, connection_id: ConnectionId::new_unchecked(0), })); @@ -4003,7 +3986,7 @@ mod tests { assert!(notif.peers.get(&(peer, set_id)).is_some()); if tokio::time::timeout(Duration::from_secs(5), async { - let mut params = MockPollParams { peer_id: PeerId::random(), addr: Multiaddr::empty() }; + let mut params = MockPollParams {}; loop { futures::future::poll_fn(|cx| { @@ -4115,7 +4098,7 @@ mod tests { // verify that the code continues to keep the peer disabled by resetting the timer // after the first one expired. if tokio::time::timeout(Duration::from_secs(5), async { - let mut params = MockPollParams { peer_id: PeerId::random(), addr: Multiaddr::empty() }; + let mut params = MockPollParams {}; loop { futures::future::poll_fn(|cx| { diff --git a/substrate/client/network/src/protocol/notifications/handler.rs b/substrate/client/network/src/protocol/notifications/handler.rs index cb09583b73a..967ef614c55 100644 --- a/substrate/client/network/src/protocol/notifications/handler.rs +++ b/substrate/client/network/src/protocol/notifications/handler.rs @@ -75,8 +75,8 @@ use futures::{ use libp2p::{ core::ConnectedPoint, swarm::{ - handler::ConnectionEvent, ConnectionHandler, ConnectionHandlerEvent, KeepAlive, - NegotiatedSubstream, SubstreamProtocol, + handler::ConnectionEvent, ConnectionHandler, ConnectionHandlerEvent, KeepAlive, Stream, + SubstreamProtocol, }, PeerId, }; @@ -199,7 +199,7 @@ enum State { /// emitted. OpenDesiredByRemote { /// Substream opened by the remote and that hasn't been accepted/rejected yet. - in_substream: NotificationsInSubstream, + in_substream: NotificationsInSubstream, /// See [`State::Closed::pending_opening`]. pending_opening: bool, @@ -212,7 +212,7 @@ enum State { /// be emitted when transitioning to respectively [`State::Open`] or [`State::Closed`]. Opening { /// Substream opened by the remote. If `Some`, has been accepted. - in_substream: Option>, + in_substream: Option>, /// Is the connection inbound. inbound: bool, }, @@ -236,14 +236,14 @@ enum State { /// Always `Some` on transition to [`State::Open`]. Switched to `None` only if the remote /// closed the substream. If `None`, a [`NotifsHandlerOut::CloseDesired`] event has been /// emitted. - out_substream: Option>, + out_substream: Option>, /// Substream opened by the remote. /// /// Contrary to the `out_substream` field, operations continue as normal even if the /// substream has been closed by the remote. A `None` is treated the same way as if there /// was an idle substream. - in_substream: Option>, + in_substream: Option>, }, } @@ -481,8 +481,8 @@ pub enum NotifsHandlerError { } impl ConnectionHandler for NotifsHandler { - type InEvent = NotifsHandlerIn; - type OutEvent = NotifsHandlerOut; + type FromBehaviour = NotifsHandlerIn; + type ToBehaviour = NotifsHandlerOut; type Error = NotifsHandlerError; type InboundProtocol = UpgradeCollec; type OutboundProtocol = NotificationsOut; @@ -517,7 +517,7 @@ impl ConnectionHandler for NotifsHandler { match protocol_info.state { State::Closed { pending_opening } => { - self.events_queue.push_back(ConnectionHandlerEvent::Custom( + self.events_queue.push_back(ConnectionHandlerEvent::NotifyBehaviour( NotifsHandlerOut::OpenDesiredByRemote { protocol_index, handshake: in_substream_open.handshake, @@ -586,7 +586,7 @@ impl ConnectionHandler for NotifsHandler { in_substream: in_substream.take(), }; - self.events_queue.push_back(ConnectionHandlerEvent::Custom( + self.events_queue.push_back(ConnectionHandlerEvent::NotifyBehaviour( NotifsHandlerOut::OpenResultOk { protocol_index, negotiated_fallback: new_open.negotiated_fallback, @@ -600,6 +600,8 @@ impl ConnectionHandler for NotifsHandler { } }, ConnectionEvent::AddressChange(_address_change) => {}, + ConnectionEvent::LocalProtocolsChange(_) => {}, + ConnectionEvent::RemoteProtocolsChange(_) => {}, ConnectionEvent::DialUpgradeError(dial_upgrade_error) => match self.protocols [dial_upgrade_error.info] .state @@ -614,7 +616,7 @@ impl ConnectionHandler for NotifsHandler { self.protocols[dial_upgrade_error.info].state = State::Closed { pending_opening: false }; - self.events_queue.push_back(ConnectionHandlerEvent::Custom( + self.events_queue.push_back(ConnectionHandlerEvent::NotifyBehaviour( NotifsHandlerOut::OpenResultErr { protocol_index: dial_upgrade_error.info }, )); }, @@ -701,7 +703,7 @@ impl ConnectionHandler for NotifsHandler { self.protocols[protocol_index].state = State::Closed { pending_opening: true }; - self.events_queue.push_back(ConnectionHandlerEvent::Custom( + self.events_queue.push_back(ConnectionHandlerEvent::NotifyBehaviour( NotifsHandlerOut::OpenResultErr { protocol_index }, )); }, @@ -711,7 +713,7 @@ impl ConnectionHandler for NotifsHandler { State::Closed { .. } => {}, } - self.events_queue.push_back(ConnectionHandlerEvent::Custom( + self.events_queue.push_back(ConnectionHandlerEvent::NotifyBehaviour( NotifsHandlerOut::CloseResult { protocol_index }, )); }, @@ -726,9 +728,11 @@ impl ConnectionHandler for NotifsHandler { // A grace period of `INITIAL_KEEPALIVE_TIME` must be given to leave time for the remote // to express desire to open substreams. + #[allow(deprecated)] KeepAlive::Until(self.when_connection_open + INITIAL_KEEPALIVE_TIME) } + #[allow(deprecated)] fn poll( &mut self, cx: &mut Context, @@ -736,7 +740,7 @@ impl ConnectionHandler for NotifsHandler { ConnectionHandlerEvent< Self::OutboundProtocol, Self::OutboundOpenInfo, - Self::OutEvent, + Self::ToBehaviour, Self::Error, >, > { @@ -755,6 +759,7 @@ impl ConnectionHandler for NotifsHandler { // Only proceed with `out_substream.poll_ready_unpin` if there is an element // available in `notifications_sink_rx`. This avoids waking up the task when // a substream is ready to send if there isn't actually something to send. + #[allow(deprecated)] match Pin::new(&mut *notifications_sink_rx).as_mut().poll_peek(cx) { Poll::Ready(Some(&NotificationsSinkMessage::ForceClose)) => return Poll::Ready(ConnectionHandlerEvent::Close( @@ -808,7 +813,7 @@ impl ConnectionHandler for NotifsHandler { Poll::Ready(Err(_)) => { *out_substream = None; let event = NotifsHandlerOut::CloseDesired { protocol_index }; - return Poll::Ready(ConnectionHandlerEvent::Custom(event)) + return Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour(event)) }, }; }, @@ -830,11 +835,14 @@ impl ConnectionHandler for NotifsHandler { State::Opening { in_substream: None, .. } => {}, State::Open { in_substream: in_substream @ Some(_), .. } => - match Stream::poll_next(Pin::new(in_substream.as_mut().unwrap()), cx) { + match futures::prelude::stream::Stream::poll_next( + Pin::new(in_substream.as_mut().unwrap()), + cx, + ) { Poll::Pending => {}, Poll::Ready(Some(Ok(message))) => { let event = NotifsHandlerOut::Notification { protocol_index, message }; - return Poll::Ready(ConnectionHandlerEvent::Custom(event)) + return Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour(event)) }, Poll::Ready(None) | Poll::Ready(Some(Err(_))) => *in_substream = None, }, @@ -846,7 +854,7 @@ impl ConnectionHandler for NotifsHandler { Poll::Ready(Err(_)) => { self.protocols[protocol_index].state = State::Closed { pending_opening: *pending_opening }; - return Poll::Ready(ConnectionHandlerEvent::Custom( + return Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour( NotifsHandlerOut::CloseDesired { protocol_index }, )) }, @@ -880,8 +888,8 @@ pub mod tests { use asynchronous_codec::Framed; use libp2p::{ core::muxing::SubstreamBox, - swarm::{handler, ConnectionHandlerUpgrErr}, - Multiaddr, + swarm::handler::{self, StreamUpgradeError}, + Multiaddr, Stream, }; use multistream_select::{dialer_select_proto, listener_select_proto, Negotiated, Version}; use std::{ @@ -972,6 +980,7 @@ pub mod tests { .await } } + struct MockSubstream { pub rx: mpsc::Receiver>, pub tx: mpsc::Sender>, @@ -991,18 +1000,35 @@ pub mod tests { } /// Create new negotiated substream pair. - pub async fn negotiated() -> (Negotiated, Negotiated) { + pub async fn negotiated() -> (Stream, Stream) { let (socket1, socket2) = Self::new(); let socket1 = SubstreamBox::new(socket1); let socket2 = SubstreamBox::new(socket2); - let protos = vec![b"/echo/1.0.0", b"/echo/2.5.0"]; + let protos = vec!["/echo/1.0.0", "/echo/2.5.0"]; let (res1, res2) = tokio::join!( dialer_select_proto(socket1, protos.clone(), Version::V1), listener_select_proto(socket2, protos), ); - (res1.unwrap().1, res2.unwrap().1) + (Self::stream_new(res1.unwrap().1), Self::stream_new(res2.unwrap().1)) + } + + /// Unsafe substitute for `Stream::new` private constructor. + fn stream_new(stream: Negotiated) -> Stream { + // Static asserts to make sure this doesn't break. + const _: () = { + assert!( + core::mem::size_of::() == + core::mem::size_of::>() + ); + assert!( + core::mem::align_of::() == + core::mem::align_of::>() + ); + }; + + unsafe { core::mem::transmute(stream) } } } @@ -1504,7 +1530,7 @@ pub mod tests { // inject dial failure to an already closed substream and verify outbound state is reset handler.on_connection_event(handler::ConnectionEvent::DialUpgradeError( - handler::DialUpgradeError { info: 0, error: ConnectionHandlerUpgrErr::Timeout }, + handler::DialUpgradeError { info: 0, error: StreamUpgradeError::Timeout }, )); assert!(std::matches!( handler.protocols[0].state, @@ -1574,7 +1600,7 @@ pub mod tests { // inject dial failure to an already closed substream and verify outbound state is reset handler.on_connection_event(handler::ConnectionEvent::DialUpgradeError( - handler::DialUpgradeError { info: 0, error: ConnectionHandlerUpgrErr::Timeout }, + handler::DialUpgradeError { info: 0, error: StreamUpgradeError::Timeout }, )); assert!(std::matches!( handler.protocols[0].state, @@ -1610,6 +1636,7 @@ pub mod tests { notifications_sink.send_sync_notification(vec![1, 3, 3, 9]); notifications_sink.send_sync_notification(vec![1, 3, 4, 0]); + #[allow(deprecated)] futures::future::poll_fn(|cx| { assert!(std::matches!( handler.poll(cx), @@ -1648,15 +1675,15 @@ pub mod tests { futures::future::poll_fn(|cx| { assert!(std::matches!( handler.poll(cx), - Poll::Ready(ConnectionHandlerEvent::Custom( + Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour( NotifsHandlerOut::OpenDesiredByRemote { protocol_index: 0, .. }, )) )); assert!(std::matches!( handler.poll(cx), - Poll::Ready(ConnectionHandlerEvent::Custom(NotifsHandlerOut::CloseDesired { - protocol_index: 0 - },)) + Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour( + NotifsHandlerOut::CloseDesired { protocol_index: 0 }, + )) )); Poll::Ready(()) }) diff --git a/substrate/client/network/src/protocol/notifications/tests.rs b/substrate/client/network/src/protocol/notifications/tests.rs index a72b5b4a674..90c9cc5b7cd 100644 --- a/substrate/client/network/src/protocol/notifications/tests.rs +++ b/substrate/client/network/src/protocol/notifications/tests.rs @@ -33,9 +33,8 @@ use libp2p::{ core::{transport::MemoryTransport, upgrade, Endpoint}, identity, noise, swarm::{ - behaviour::FromSwarm, ConnectionDenied, ConnectionId, Executor, NetworkBehaviour, - PollParameters, Swarm, SwarmBuilder, SwarmEvent, THandler, THandlerInEvent, - THandlerOutEvent, ToSwarm, + self, behaviour::FromSwarm, ConnectionDenied, ConnectionId, Executor, NetworkBehaviour, + PollParameters, Swarm, SwarmEvent, THandler, THandlerInEvent, THandlerOutEvent, ToSwarm, }, yamux, Multiaddr, PeerId, Transport, }; @@ -141,13 +140,12 @@ fn build_nodes() -> (Swarm, Swarm) { } }); - let mut swarm = SwarmBuilder::with_executor( + let mut swarm = Swarm::new( transport, behaviour, keypairs[index].public().to_peer_id(), - TokioExecutor(runtime), - ) - .build(); + swarm::Config::with_executor(TokioExecutor(runtime)), + ); swarm.listen_on(addrs[index].clone()).unwrap(); out.push(swarm); } @@ -183,7 +181,7 @@ impl std::ops::DerefMut for CustomProtoWithAddr { impl NetworkBehaviour for CustomProtoWithAddr { type ConnectionHandler = ::ConnectionHandler; - type OutEvent = ::OutEvent; + type ToSwarm = ::ToSwarm; fn handle_pending_inbound_connection( &mut self, @@ -261,7 +259,7 @@ impl NetworkBehaviour for CustomProtoWithAddr { &mut self, cx: &mut Context, params: &mut impl PollParameters, - ) -> Poll>> { + ) -> Poll>> { let _ = self.peer_store_future.poll_unpin(cx); let _ = self.protocol_controller_future.poll_unpin(cx); self.inner.poll(cx, params) diff --git a/substrate/client/network/src/protocol/notifications/upgrade.rs b/substrate/client/network/src/protocol/notifications/upgrade.rs index 8fd837f949d..72e0c2d1039 100644 --- a/substrate/client/network/src/protocol/notifications/upgrade.rs +++ b/substrate/client/network/src/protocol/notifications/upgrade.rs @@ -20,6 +20,7 @@ pub(crate) use self::notifications::{ NotificationsInOpen, NotificationsInSubstreamHandshake, NotificationsOutOpen, }; + pub use self::{ collec::UpgradeCollec, notifications::{ diff --git a/substrate/client/network/src/protocol/notifications/upgrade/collec.rs b/substrate/client/network/src/protocol/notifications/upgrade/collec.rs index 33c090ae50e..ab0f87215cc 100644 --- a/substrate/client/network/src/protocol/notifications/upgrade/collec.rs +++ b/substrate/client/network/src/protocol/notifications/upgrade/collec.rs @@ -17,7 +17,7 @@ // along with this program. If not, see . use futures::prelude::*; -use libp2p::core::upgrade::{InboundUpgrade, ProtocolName, UpgradeInfo}; +use libp2p::core::upgrade::{InboundUpgrade, UpgradeInfo}; use std::{ pin::Pin, task::{Context, Poll}, @@ -75,9 +75,9 @@ where #[derive(Debug, Clone, PartialEq)] pub struct ProtoNameWithUsize(T, usize); -impl ProtocolName for ProtoNameWithUsize { - fn protocol_name(&self) -> &[u8] { - self.0.protocol_name() +impl> AsRef for ProtoNameWithUsize { + fn as_ref(&self) -> &str { + self.0.as_ref() } } @@ -103,13 +103,13 @@ impl>, O, E> Future for FutWithUsize { mod tests { use super::*; use crate::types::ProtocolName as ProtoName; - use libp2p::core::upgrade::{ProtocolName, UpgradeInfo}; + use libp2p::core::upgrade::UpgradeInfo; // TODO: move to mocks mockall::mock! { pub ProtocolUpgrade {} - impl UpgradeInfo for ProtocolUpgrade { + impl> UpgradeInfo for ProtocolUpgrade { type Info = T; type InfoIter = vec::IntoIter; fn protocol_info(&self) -> vec::IntoIter; diff --git a/substrate/client/network/src/protocol/notifications/upgrade/notifications.rs b/substrate/client/network/src/protocol/notifications/upgrade/notifications.rs index c760b7a963f..a8a9e453a7b 100644 --- a/substrate/client/network/src/protocol/notifications/upgrade/notifications.rs +++ b/substrate/client/network/src/protocol/notifications/upgrade/notifications.rs @@ -513,45 +513,99 @@ pub enum NotificationsOutError { #[cfg(test)] mod tests { + use crate::ProtocolName; + use super::{ - NotificationsIn, NotificationsInOpen, NotificationsOut, NotificationsOutError, - NotificationsOutOpen, + NotificationsHandshakeError, NotificationsIn, NotificationsInOpen, + NotificationsInSubstream, NotificationsOut, NotificationsOutError, NotificationsOutOpen, + NotificationsOutSubstream, }; - use futures::{channel::oneshot, future, prelude::*}; - use libp2p::core::upgrade; + use futures::{channel::oneshot, future, prelude::*, SinkExt, StreamExt}; + use libp2p::core::{upgrade, InboundUpgrade, OutboundUpgrade, UpgradeInfo}; use std::{pin::Pin, task::Poll}; use tokio::net::{TcpListener, TcpStream}; use tokio_util::compat::TokioAsyncReadCompatExt; + /// Opens a substream to the given address, negotiates the protocol, and returns the substream + /// along with the handshake message. + async fn dial( + addr: std::net::SocketAddr, + handshake: impl Into>, + ) -> Result< + ( + Vec, + NotificationsOutSubstream< + multistream_select::Negotiated>, + >, + ), + NotificationsHandshakeError, + > { + let socket = TcpStream::connect(addr).await.unwrap(); + let notifs_out = NotificationsOut::new("/test/proto/1", Vec::new(), handshake, 1024 * 1024); + let (_, substream) = multistream_select::dialer_select_proto( + socket.compat(), + notifs_out.protocol_info(), + upgrade::Version::V1, + ) + .await + .unwrap(); + let NotificationsOutOpen { handshake, substream, .. } = + >::upgrade_outbound( + notifs_out, + substream, + "/test/proto/1".into(), + ) + .await?; + Ok((handshake, substream)) + } + + /// Listens on a localhost, negotiates the protocol, and returns the substream along with the + /// handshake message. + /// + /// Also sends the listener address through the given channel. + async fn listen_on_localhost( + listener_addr_tx: oneshot::Sender, + ) -> Result< + ( + Vec, + NotificationsInSubstream< + multistream_select::Negotiated>, + >, + ), + NotificationsHandshakeError, + > { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + listener_addr_tx.send(listener.local_addr().unwrap()).unwrap(); + + let (socket, _) = listener.accept().await.unwrap(); + let notifs_in = NotificationsIn::new("/test/proto/1", Vec::new(), 1024 * 1024); + let (_, substream) = + multistream_select::listener_select_proto(socket.compat(), notifs_in.protocol_info()) + .await + .unwrap(); + let NotificationsInOpen { handshake, substream, .. } = + >::upgrade_inbound( + notifs_in, + substream, + "/test/proto/1".into(), + ) + .await?; + Ok((handshake, substream)) + } + #[tokio::test] async fn basic_works() { - const PROTO_NAME: &str = "/test/proto/1"; let (listener_addr_tx, listener_addr_rx) = oneshot::channel(); let client = tokio::spawn(async move { - let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap(); - let NotificationsOutOpen { handshake, mut substream, .. } = upgrade::apply_outbound( - socket.compat(), - NotificationsOut::new(PROTO_NAME, Vec::new(), &b"initial message"[..], 1024 * 1024), - upgrade::Version::V1, - ) - .await - .unwrap(); + let (handshake, mut substream) = + dial(listener_addr_rx.await.unwrap(), &b"initial message"[..]).await.unwrap(); assert_eq!(handshake, b"hello world"); substream.send(b"test message".to_vec()).await.unwrap(); }); - let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); - listener_addr_tx.send(listener.local_addr().unwrap()).unwrap(); - - let (socket, _) = listener.accept().await.unwrap(); - let NotificationsInOpen { handshake, mut substream, .. } = upgrade::apply_inbound( - socket.compat(), - NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024), - ) - .await - .unwrap(); + let (handshake, mut substream) = listen_on_localhost(listener_addr_tx).await.unwrap(); assert_eq!(handshake, b"initial message"); substream.send_handshake(&b"hello world"[..]); @@ -566,33 +620,17 @@ mod tests { async fn empty_handshake() { // Check that everything still works when the handshake messages are empty. - const PROTO_NAME: &str = "/test/proto/1"; let (listener_addr_tx, listener_addr_rx) = oneshot::channel(); let client = tokio::spawn(async move { - let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap(); - let NotificationsOutOpen { handshake, mut substream, .. } = upgrade::apply_outbound( - socket.compat(), - NotificationsOut::new(PROTO_NAME, Vec::new(), vec![], 1024 * 1024), - upgrade::Version::V1, - ) - .await - .unwrap(); + let (handshake, mut substream) = + dial(listener_addr_rx.await.unwrap(), vec![]).await.unwrap(); assert!(handshake.is_empty()); substream.send(Default::default()).await.unwrap(); }); - let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); - listener_addr_tx.send(listener.local_addr().unwrap()).unwrap(); - - let (socket, _) = listener.accept().await.unwrap(); - let NotificationsInOpen { handshake, mut substream, .. } = upgrade::apply_inbound( - socket.compat(), - NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024), - ) - .await - .unwrap(); + let (handshake, mut substream) = listen_on_localhost(listener_addr_tx).await.unwrap(); assert!(handshake.is_empty()); substream.send_handshake(vec![]); @@ -605,17 +643,10 @@ mod tests { #[tokio::test] async fn refused() { - const PROTO_NAME: &str = "/test/proto/1"; let (listener_addr_tx, listener_addr_rx) = oneshot::channel(); let client = tokio::spawn(async move { - let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap(); - let outcome = upgrade::apply_outbound( - socket.compat(), - NotificationsOut::new(PROTO_NAME, Vec::new(), &b"hello"[..], 1024 * 1024), - upgrade::Version::V1, - ) - .await; + let outcome = dial(listener_addr_rx.await.unwrap(), &b"hello"[..]).await; // Despite the protocol negotiation being successfully conducted on the listener // side, we have to receive an error here because the listener didn't send the @@ -623,17 +654,7 @@ mod tests { assert!(outcome.is_err()); }); - let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); - listener_addr_tx.send(listener.local_addr().unwrap()).unwrap(); - - let (socket, _) = listener.accept().await.unwrap(); - let NotificationsInOpen { handshake, substream, .. } = upgrade::apply_inbound( - socket.compat(), - NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024), - ) - .await - .unwrap(); - + let (handshake, substream) = listen_on_localhost(listener_addr_tx).await.unwrap(); assert_eq!(handshake, b"hello"); // We successfully upgrade to the protocol, but then close the substream. @@ -644,66 +665,29 @@ mod tests { #[tokio::test] async fn large_initial_message_refused() { - const PROTO_NAME: &str = "/test/proto/1"; let (listener_addr_tx, listener_addr_rx) = oneshot::channel(); let client = tokio::spawn(async move { - let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap(); - let ret = upgrade::apply_outbound( - socket.compat(), - // We check that an initial message that is too large gets refused. - NotificationsOut::new( - PROTO_NAME, - Vec::new(), - (0..32768).map(|_| 0).collect::>(), - 1024 * 1024, - ), - upgrade::Version::V1, - ) - .await; + let ret = + dial(listener_addr_rx.await.unwrap(), (0..32768).map(|_| 0).collect::>()) + .await; assert!(ret.is_err()); }); - let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); - listener_addr_tx.send(listener.local_addr().unwrap()).unwrap(); - - let (socket, _) = listener.accept().await.unwrap(); - let ret = upgrade::apply_inbound( - socket.compat(), - NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024), - ) - .await; - assert!(ret.is_err()); - + let _ret = listen_on_localhost(listener_addr_tx).await; client.await.unwrap(); } #[tokio::test] async fn large_handshake_refused() { - const PROTO_NAME: &str = "/test/proto/1"; let (listener_addr_tx, listener_addr_rx) = oneshot::channel(); let client = tokio::spawn(async move { - let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap(); - let ret = upgrade::apply_outbound( - socket.compat(), - NotificationsOut::new(PROTO_NAME, Vec::new(), &b"initial message"[..], 1024 * 1024), - upgrade::Version::V1, - ) - .await; + let ret = dial(listener_addr_rx.await.unwrap(), &b"initial message"[..]).await; assert!(ret.is_err()); }); - let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); - listener_addr_tx.send(listener.local_addr().unwrap()).unwrap(); - - let (socket, _) = listener.accept().await.unwrap(); - let NotificationsInOpen { handshake, mut substream, .. } = upgrade::apply_inbound( - socket.compat(), - NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024), - ) - .await - .unwrap(); + let (handshake, mut substream) = listen_on_localhost(listener_addr_tx).await.unwrap(); assert_eq!(handshake, b"initial message"); // We check that a handshake that is too large gets refused. @@ -720,10 +704,10 @@ mod tests { let client = tokio::spawn(async move { let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap(); - let NotificationsOutOpen { handshake, .. } = upgrade::apply_outbound( - socket.compat(), + let NotificationsOutOpen { handshake, .. } = OutboundUpgrade::upgrade_outbound( NotificationsOut::new(PROTO_NAME, Vec::new(), &b"initial message"[..], 1024 * 1024), - upgrade::Version::V1, + socket.compat(), + ProtocolName::Static(PROTO_NAME), ) .await .unwrap(); @@ -735,9 +719,10 @@ mod tests { listener_addr_tx.send(listener.local_addr().unwrap()).unwrap(); let (socket, _) = listener.accept().await.unwrap(); - let NotificationsInOpen { handshake, mut substream, .. } = upgrade::apply_inbound( - socket.compat(), + let NotificationsInOpen { handshake, mut substream, .. } = InboundUpgrade::upgrade_inbound( NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024), + socket.compat(), + ProtocolName::Static(PROTO_NAME), ) .await .unwrap(); @@ -758,13 +743,19 @@ mod tests { let client = tokio::spawn(async move { let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap(); - let NotificationsOutOpen { handshake, mut substream, .. } = upgrade::apply_outbound( - socket.compat(), - NotificationsOut::new(PROTO_NAME, Vec::new(), &b"initial message"[..], 1024 * 1024), - upgrade::Version::V1, - ) - .await - .unwrap(); + let NotificationsOutOpen { handshake, mut substream, .. } = + OutboundUpgrade::upgrade_outbound( + NotificationsOut::new( + PROTO_NAME, + Vec::new(), + &b"initial message"[..], + 1024 * 1024, + ), + socket.compat(), + ProtocolName::Static(PROTO_NAME), + ) + .await + .unwrap(); assert_eq!(handshake, b"hello world"); @@ -786,9 +777,10 @@ mod tests { listener_addr_tx.send(listener.local_addr().unwrap()).unwrap(); let (socket, _) = listener.accept().await.unwrap(); - let NotificationsInOpen { handshake, mut substream, .. } = upgrade::apply_inbound( - socket.compat(), + let NotificationsInOpen { handshake, mut substream, .. } = InboundUpgrade::upgrade_inbound( NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024), + socket.compat(), + ProtocolName::Static(PROTO_NAME), ) .await .unwrap(); diff --git a/substrate/client/network/src/request_responses.rs b/substrate/client/network/src/request_responses.rs index fbf050a6571..3671d76ea63 100644 --- a/substrate/client/network/src/request_responses.rs +++ b/substrate/client/network/src/request_responses.rs @@ -318,7 +318,6 @@ impl RequestResponsesBehaviour { let mut protocols = HashMap::new(); for protocol in list { let mut cfg = Config::default(); - cfg.set_connection_keep_alive(Duration::from_secs(10)); cfg.set_request_timeout(protocol.request_timeout); let protocol_support = if protocol.inbound_queue.is_some() { @@ -327,13 +326,13 @@ impl RequestResponsesBehaviour { ProtocolSupport::Outbound }; - let rq_rp = Behaviour::new( + let rq_rp = Behaviour::with_codec( GenericCodec { max_request_size: protocol.max_request_size, max_response_size: protocol.max_response_size, }, - iter::once(protocol.name.as_bytes().to_vec()) - .chain(protocol.fallback_names.iter().map(|name| name.as_bytes().to_vec())) + iter::once(protocol.name.clone()) + .chain(protocol.fallback_names) .zip(iter::repeat(protocol_support)), cfg, ); @@ -427,7 +426,7 @@ impl RequestResponsesBehaviour { impl NetworkBehaviour for RequestResponsesBehaviour { type ConnectionHandler = MultiHandler as NetworkBehaviour>::ConnectionHandler>; - type OutEvent = Event; + type ToSwarm = Event; fn handle_pending_inbound_connection( &mut self, @@ -543,9 +542,9 @@ impl NetworkBehaviour for RequestResponsesBehaviour { for (p, _) in self.protocols.values_mut() { NetworkBehaviour::on_swarm_event(p, FromSwarm::ListenerError(e)); }, - FromSwarm::ExpiredExternalAddr(e) => + FromSwarm::ExternalAddrExpired(e) => for (p, _) in self.protocols.values_mut() { - NetworkBehaviour::on_swarm_event(p, FromSwarm::ExpiredExternalAddr(e)); + NetworkBehaviour::on_swarm_event(p, FromSwarm::ExternalAddrExpired(e)); }, FromSwarm::NewListener(e) => for (p, _) in self.protocols.values_mut() { @@ -555,9 +554,13 @@ impl NetworkBehaviour for RequestResponsesBehaviour { for (p, _) in self.protocols.values_mut() { NetworkBehaviour::on_swarm_event(p, FromSwarm::ExpiredListenAddr(e)); }, - FromSwarm::NewExternalAddr(e) => + FromSwarm::NewExternalAddrCandidate(e) => for (p, _) in self.protocols.values_mut() { - NetworkBehaviour::on_swarm_event(p, FromSwarm::NewExternalAddr(e)); + NetworkBehaviour::on_swarm_event(p, FromSwarm::NewExternalAddrCandidate(e)); + }, + FromSwarm::ExternalAddrConfirmed(e) => + for (p, _) in self.protocols.values_mut() { + NetworkBehaviour::on_swarm_event(p, FromSwarm::ExternalAddrConfirmed(e)); }, FromSwarm::AddressChange(e) => for (p, _) in self.protocols.values_mut() { @@ -592,7 +595,7 @@ impl NetworkBehaviour for RequestResponsesBehaviour { &mut self, cx: &mut Context, params: &mut impl PollParameters, - ) -> Poll>> { + ) -> Poll>> { 'poll_all: loop { // Poll to see if any response is ready to be sent back. while let Poll::Ready(Some(outcome)) = self.pending_responses.poll_next_unpin(cx) { @@ -663,10 +666,18 @@ impl NetworkBehaviour for RequestResponsesBehaviour { handler, event: ((*protocol).to_string(), event), }), - ToSwarm::ReportObservedAddr { address, score } => - return Poll::Ready(ToSwarm::ReportObservedAddr { address, score }), ToSwarm::CloseConnection { peer_id, connection } => return Poll::Ready(ToSwarm::CloseConnection { peer_id, connection }), + ToSwarm::NewExternalAddrCandidate(observed) => + return Poll::Ready(ToSwarm::NewExternalAddrCandidate(observed)), + ToSwarm::ExternalAddrConfirmed(addr) => + return Poll::Ready(ToSwarm::ExternalAddrConfirmed(addr)), + ToSwarm::ExternalAddrExpired(addr) => + return Poll::Ready(ToSwarm::ExternalAddrExpired(addr)), + ToSwarm::ListenOn { opts } => + return Poll::Ready(ToSwarm::ListenOn { opts }), + ToSwarm::RemoveListener { id } => + return Poll::Ready(ToSwarm::RemoveListener { id }), }; match ev { @@ -950,7 +961,7 @@ pub struct GenericCodec { #[async_trait::async_trait] impl Codec for GenericCodec { - type Protocol = Vec; + type Protocol = ProtocolName; type Request = Vec; type Response = Result, ()>; @@ -1078,7 +1089,7 @@ mod tests { }, identity::Keypair, noise, - swarm::{Executor, Swarm, SwarmBuilder, SwarmEvent}, + swarm::{Config as SwarmConfig, Executor, Swarm, SwarmEvent}, Multiaddr, }; use std::{iter, time::Duration}; @@ -1104,16 +1115,18 @@ mod tests { let behaviour = RequestResponsesBehaviour::new(list, Arc::new(MockPeerStore {})).unwrap(); let runtime = tokio::runtime::Runtime::new().unwrap(); - let mut swarm = SwarmBuilder::with_executor( + + let mut swarm = Swarm::new( transport, behaviour, keypair.public().to_peer_id(), - TokioExecutor(runtime), - ) - .build(); + SwarmConfig::with_executor(TokioExecutor(runtime)), + ); + let listen_addr: Multiaddr = format!("/memory/{}", rand::random::()).parse().unwrap(); swarm.listen_on(listen_addr.clone()).unwrap(); + (swarm, listen_addr) } diff --git a/substrate/client/network/src/service.rs b/substrate/client/network/src/service.rs index 2cf4564e312..3a685787c48 100644 --- a/substrate/client/network/src/service.rs +++ b/substrate/client/network/src/service.rs @@ -61,18 +61,18 @@ use crate::{ use codec::DecodeAll; use either::Either; use futures::{channel::oneshot, prelude::*}; -use libp2p::identity::ed25519; #[allow(deprecated)] +use libp2p::swarm::THandlerErr; use libp2p::{ - connection_limits::Exceeded, + connection_limits::{ConnectionLimits, Exceeded}, core::{upgrade, ConnectedPoint, Endpoint}, identify::Info as IdentifyInfo, + identity::ed25519, kad::record::Key as KademliaKey, multiaddr::{self, Multiaddr}, - ping::Failure as PingFailure, swarm::{ - AddressScore, ConnectionError, ConnectionId, ConnectionLimits, DialError, Executor, - ListenError, NetworkBehaviour, Swarm, SwarmBuilder, SwarmEvent, THandlerErr, + Config as SwarmConfig, ConnectionError, ConnectionId, DialError, Executor, ListenError, + NetworkBehaviour, Swarm, SwarmEvent, }, PeerId, }; @@ -274,10 +274,6 @@ where let local_identity: ed25519::Keypair = local_identity.into(); let local_public: ed25519::PublicKey = local_public.into(); let local_peer_id: PeerId = local_peer_id.into(); - let listen_addresses: Vec = - network_config.listen_addresses.iter().cloned().map(Into::into).collect(); - let public_addresses: Vec = - network_config.public_addresses.iter().cloned().map(Into::into).collect(); network_config.boot_nodes = network_config .boot_nodes @@ -559,6 +555,11 @@ where request_response_protocols, Arc::clone(&peer_store_handle), external_addresses.clone(), + ConnectionLimits::default() + .with_max_established_per_peer(Some(crate::MAX_CONNECTIONS_PER_PEER as u32)) + .with_max_established_incoming(Some( + crate::MAX_CONNECTIONS_ESTABLISHED_INCOMING, + )), ); match result { @@ -568,37 +569,27 @@ where } }; - let builder = { + let swarm = { struct SpawnImpl(F); impl + Send>>)> Executor for SpawnImpl { fn exec(&self, f: Pin + Send>>) { (self.0)(f) } } - SwarmBuilder::with_executor( - transport, - behaviour, - local_peer_id, - SpawnImpl(params.executor), - ) + + let config = SwarmConfig::with_executor(SpawnImpl(params.executor)) + .with_substream_upgrade_protocol_override(upgrade::Version::V1) + .with_notify_handler_buffer_size(NonZeroUsize::new(32).expect("32 != 0; qed")) + // NOTE: 24 is somewhat arbitrary and should be tuned in the future if + // necessary. See + .with_per_connection_event_buffer_size(24) + .with_max_negotiating_inbound_streams(2048) + .with_idle_connection_timeout(Duration::from_secs(10)); + + Swarm::new(transport, behaviour, local_peer_id, config) }; - #[allow(deprecated)] - let builder = builder - .connection_limits( - ConnectionLimits::default() - .with_max_established_per_peer(Some(crate::MAX_CONNECTIONS_PER_PEER as u32)) - .with_max_established_incoming(Some( - crate::MAX_CONNECTIONS_ESTABLISHED_INCOMING, - )), - ) - .substream_upgrade_protocol_override(upgrade::Version::V1) - .notify_handler_buffer_size(NonZeroUsize::new(32).expect("32 != 0; qed")) - // NOTE: 24 is somewhat arbitrary and should be tuned in the future if necessary. - // See - .per_connection_event_buffer_size(24) - .max_negotiating_inbound_streams(2048); - - (builder.build(), Arc::new(Libp2pBandwidthSink { sink: bandwidth })) + + (swarm, Arc::new(Libp2pBandwidthSink { sink: bandwidth })) }; // Initialize the metrics. @@ -614,19 +605,15 @@ where }; // Listen on multiaddresses. - for addr in &listen_addresses { - if let Err(err) = Swarm::>::listen_on(&mut swarm, addr.clone()) { + for addr in &network_config.listen_addresses { + if let Err(err) = Swarm::>::listen_on(&mut swarm, addr.clone().into()) { warn!(target: "sub-libp2p", "Can't listen on {} because: {:?}", addr, err) } } // Add external addresses. - for addr in &public_addresses { - Swarm::>::add_external_address( - &mut swarm, - addr.clone(), - AddressScore::Infinite, - ); + for addr in &network_config.public_addresses { + Swarm::>::add_external_address(&mut swarm, addr.clone().into()); } let listen_addresses_set = Arc::new(Mutex::new(HashSet::new())); @@ -807,7 +794,7 @@ where let peer_id = Swarm::>::local_peer_id(swarm).to_base58(); let listened_addresses = swarm.listeners().cloned().collect(); - let external_addresses = swarm.external_addresses().map(|r| &r.addr).cloned().collect(); + let external_addresses = swarm.external_addresses().cloned().collect(); NetworkState { peer_id, @@ -867,8 +854,7 @@ impl NetworkService { .into_iter() .map(|mut addr| { let peer = match addr.pop() { - Some(multiaddr::Protocol::P2p(key)) => PeerId::from_multihash(key) - .map_err(|_| "Invalid PeerId format".to_string())?, + Some(multiaddr::Protocol::P2p(peer_id)) => peer_id, _ => return Err("Missing PeerId from address".to_string()), }; @@ -1492,6 +1478,7 @@ where } /// Process the next event coming from `Swarm`. + #[allow(deprecated)] fn handle_swarm_event(&mut self, event: SwarmEvent>>) { match event { SwarmEvent::Behaviour(BehaviourOut::InboundRequest { protocol, result, .. }) => { @@ -1586,9 +1573,11 @@ where listen_addrs.truncate(30); } for addr in listen_addrs { - self.network_service - .behaviour_mut() - .add_self_reported_address_to_dht(&peer_id, &protocols, addr); + self.network_service.behaviour_mut().add_self_reported_address_to_dht( + &peer_id, + &protocols, + addr.clone(), + ); } self.peer_store_handle.add_known_peer(peer_id.into()); }, @@ -1705,8 +1694,14 @@ where } } }, - SwarmEvent::ConnectionClosed { peer_id, cause, endpoint, num_established } => { - debug!(target: "sub-libp2p", "Libp2p => Disconnected({:?}, {:?})", peer_id, cause); + SwarmEvent::ConnectionClosed { + connection_id, + peer_id, + cause, + endpoint, + num_established, + } => { + debug!(target: "sub-libp2p", "Libp2p => Disconnected({peer_id:?} via {connection_id:?}, {cause:?})"); if let Some(metrics) = self.metrics.as_ref() { let direction = match endpoint { ConnectedPoint::Dialer { .. } => "out", @@ -1715,11 +1710,13 @@ where let reason = match cause { Some(ConnectionError::IO(_)) => "transport-error", Some(ConnectionError::Handler(Either::Left(Either::Left( - Either::Right(Either::Left(PingFailure::Timeout)), - )))) => "ping-timeout", - Some(ConnectionError::Handler(Either::Left(Either::Left( - Either::Left(NotifsHandlerError::SyncNotificationsClogged), + Either::Left(Either::Right( + NotifsHandlerError::SyncNotificationsClogged, + )), )))) => "sync-notifications-clogged", + Some(ConnectionError::Handler(Either::Left(Either::Left( + Either::Right(Either::Left(_)), + )))) => "ping-timeout", Some(ConnectionError::Handler(_)) => "protocol-error", Some(ConnectionError::KeepAliveTimeout) => "keep-alive-timeout", None => "actively-closed", @@ -1746,12 +1743,11 @@ where } self.listen_addresses.lock().remove(&address); }, - SwarmEvent::OutgoingConnectionError { peer_id, error } => { + SwarmEvent::OutgoingConnectionError { connection_id, peer_id, error } => { if let Some(peer_id) = peer_id { trace!( target: "sub-libp2p", - "Libp2p => Failed to reach {:?}: {}", - peer_id, error, + "Libp2p => Failed to reach {peer_id:?} via {connection_id:?}: {error}", ); let not_reported = !self.reported_invalid_boot_nodes.contains(&peer_id); @@ -1789,12 +1785,9 @@ where } else { None }, - DialError::ConnectionLimit(_) => Some("limit-reached"), - DialError::InvalidPeerId(_) | - DialError::WrongPeerId { .. } | - DialError::LocalPeerId { .. } => Some("invalid-peer-id"), + DialError::LocalPeerId { .. } => Some("local-peer-id"), + DialError::WrongPeerId { .. } => Some("invalid-peer-id"), DialError::Transport(_) => Some("transport-error"), - DialError::Banned | DialError::NoAddresses | DialError::DialPeerConditionFalse(_) | DialError::Aborted => None, // ignore them @@ -1804,21 +1797,24 @@ where } } }, - SwarmEvent::Dialing(peer_id) => { - trace!(target: "sub-libp2p", "Libp2p => Dialing({:?})", peer_id) + SwarmEvent::Dialing { connection_id, peer_id } => { + trace!(target: "sub-libp2p", "Libp2p => Dialing({peer_id:?}) via {connection_id:?}") }, - SwarmEvent::IncomingConnection { local_addr, send_back_addr } => { - trace!(target: "sub-libp2p", "Libp2p => IncomingConnection({},{}))", - local_addr, send_back_addr); + SwarmEvent::IncomingConnection { connection_id, local_addr, send_back_addr } => { + trace!(target: "sub-libp2p", "Libp2p => IncomingConnection({local_addr},{send_back_addr} via {connection_id:?}))"); if let Some(metrics) = self.metrics.as_ref() { metrics.incoming_connections_total.inc(); } }, - SwarmEvent::IncomingConnectionError { local_addr, send_back_addr, error } => { + SwarmEvent::IncomingConnectionError { + connection_id, + local_addr, + send_back_addr, + error, + } => { debug!( target: "sub-libp2p", - "Libp2p => IncomingConnectionError({},{}): {}", - local_addr, send_back_addr, error, + "Libp2p => IncomingConnectionError({local_addr},{send_back_addr} via {connection_id:?}): {error}" ); if let Some(metrics) = self.metrics.as_ref() { #[allow(deprecated)] @@ -1829,7 +1825,6 @@ where } else { None }, - ListenError::ConnectionLimit(_) => Some("limit-reached"), ListenError::WrongPeerId { .. } | ListenError::LocalPeerId { .. } => Some("invalid-peer-id"), ListenError::Transport(_) => Some("transport-error"), @@ -1844,17 +1839,6 @@ where } } }, - #[allow(deprecated)] - SwarmEvent::BannedPeer { peer_id, endpoint } => { - debug!( - target: "sub-libp2p", - "Libp2p => BannedPeer({}). Connected via {:?}.", - peer_id, endpoint, - ); - if let Some(metrics) = self.metrics.as_ref() { - metrics.incoming_connections_errors_total.with_label_values(&["banned"]).inc(); - } - }, SwarmEvent::ListenerClosed { reason, addresses, .. } => { if let Some(metrics) = self.metrics.as_ref() { metrics.listeners_local_addresses.sub(addresses.len() as u64); diff --git a/substrate/client/network/src/transport.rs b/substrate/client/network/src/transport.rs index 4136b34fc0e..ed7e7c574e1 100644 --- a/substrate/client/network/src/transport.rs +++ b/substrate/client/network/src/transport.rs @@ -57,7 +57,7 @@ pub fn build_transport( // Main transport: DNS(TCP) let tcp_config = tcp::Config::new().nodelay(true); let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); - let dns_init = dns::TokioDnsConfig::system(tcp_trans); + let dns_init = dns::tokio::Transport::system(tcp_trans); Either::Left(if let Ok(dns) = dns_init { // WS + WSS transport @@ -66,7 +66,7 @@ pub fn build_transport( // unresolved addresses (BUT WSS transport itself needs an instance of DNS transport to // resolve and dial addresses). let tcp_trans = tcp::tokio::Transport::new(tcp_config); - let dns_for_wss = dns::TokioDnsConfig::system(tcp_trans) + let dns_for_wss = dns::tokio::Transport::system(tcp_trans) .expect("same system_conf & resolver to work"); Either::Left(websocket::WsConfig::new(dns_for_wss).or_transport(dns)) } else { diff --git a/substrate/client/network/src/types.rs b/substrate/client/network/src/types.rs index 25517599469..0652bbcddde 100644 --- a/substrate/client/network/src/types.rs +++ b/substrate/client/network/src/types.rs @@ -18,8 +18,6 @@ //! `sc-network` type definitions -use libp2p::core::upgrade; - use std::{ borrow::Borrow, fmt, @@ -94,9 +92,9 @@ impl fmt::Display for ProtocolName { } } -impl upgrade::ProtocolName for ProtocolName { - fn protocol_name(&self) -> &[u8] { - (self as &str).as_bytes() +impl AsRef for ProtocolName { + fn as_ref(&self) -> &str { + self as &str } } diff --git a/substrate/client/network/statement/Cargo.toml b/substrate/client/network/statement/Cargo.toml index 55ff3d54bba..4cced49fee7 100644 --- a/substrate/client/network/statement/Cargo.toml +++ b/substrate/client/network/statement/Cargo.toml @@ -20,7 +20,6 @@ array-bytes = { workspace = true, default-features = true } async-channel = { workspace = true } codec = { features = ["derive"], workspace = true, default-features = true } futures = { workspace = true } -libp2p = { workspace = true } log = { workspace = true, default-features = true } prometheus-endpoint = { workspace = true, default-features = true } sc-network-common = { workspace = true, default-features = true } diff --git a/substrate/client/network/transactions/Cargo.toml b/substrate/client/network/transactions/Cargo.toml index a561aa2da47..eb907b606d5 100644 --- a/substrate/client/network/transactions/Cargo.toml +++ b/substrate/client/network/transactions/Cargo.toml @@ -19,7 +19,6 @@ targets = ["x86_64-unknown-linux-gnu"] array-bytes = { workspace = true, default-features = true } codec = { features = ["derive"], workspace = true, default-features = true } futures = { workspace = true } -libp2p = { workspace = true } log = { workspace = true, default-features = true } prometheus-endpoint = { workspace = true, default-features = true } sc-network = { workspace = true, default-features = true } diff --git a/substrate/client/network/types/Cargo.toml b/substrate/client/network/types/Cargo.toml index b54617eafd0..811ccddbef9 100644 --- a/substrate/client/network/types/Cargo.toml +++ b/substrate/client/network/types/Cargo.toml @@ -12,10 +12,11 @@ documentation = "https://docs.rs/sc-network-types" [dependencies] bs58 = { workspace = true, default-features = true } ed25519-dalek = { workspace = true, default-features = true } -libp2p-identity = { features = ["ed25519", "peerid"], workspace = true } +libp2p-identity = { features = ["ed25519", "peerid", "rand"], workspace = true } litep2p = { workspace = true } +log = { workspace = true, default-features = true } multiaddr = { workspace = true } -multihash = { features = ["identity", "multihash-impl", "sha2", "std"], workspace = true } +multihash = { workspace = true } rand = { workspace = true, default-features = true } thiserror = { workspace = true } zeroize = { workspace = true } diff --git a/substrate/client/network/types/src/multiaddr.rs b/substrate/client/network/types/src/multiaddr.rs index de317e2aa1c..925e24fe70d 100644 --- a/substrate/client/network/types/src/multiaddr.rs +++ b/substrate/client/network/types/src/multiaddr.rs @@ -20,6 +20,7 @@ use litep2p::types::multiaddr::{ Error as LiteP2pError, Iter as LiteP2pIter, Multiaddr as LiteP2pMultiaddr, Protocol as LiteP2pProtocol, }; +use multiaddr::Multiaddr as LibP2pMultiaddr; use std::{ fmt::{self, Debug, Display}, net::{IpAddr, Ipv4Addr, Ipv6Addr}, @@ -103,6 +104,18 @@ impl From for LiteP2pMultiaddr { } } +impl From for Multiaddr { + fn from(multiaddr: LibP2pMultiaddr) -> Self { + multiaddr.into_iter().map(Into::into).collect() + } +} + +impl From for LibP2pMultiaddr { + fn from(multiaddr: Multiaddr) -> Self { + multiaddr.into_iter().map(Into::into).collect() + } +} + impl From for Multiaddr { fn from(v: IpAddr) -> Multiaddr { match v { diff --git a/substrate/client/network/types/src/multiaddr/protocol.rs b/substrate/client/network/types/src/multiaddr/protocol.rs index 2a3b59e6a68..aca3a311368 100644 --- a/substrate/client/network/types/src/multiaddr/protocol.rs +++ b/substrate/client/network/types/src/multiaddr/protocol.rs @@ -17,12 +17,18 @@ // along with this program. If not, see . use crate::multihash::Multihash; +use libp2p_identity::PeerId; use litep2p::types::multiaddr::Protocol as LiteP2pProtocol; +use multiaddr::Protocol as LibP2pProtocol; use std::{ borrow::Cow, + fmt::{self, Debug, Display}, net::{IpAddr, Ipv4Addr, Ipv6Addr}, }; +// Log target for this file. +const LOG_TARGET: &str = "sub-libp2p"; + /// [`Protocol`] describes all possible multiaddress protocols. #[derive(PartialEq, Eq, Clone, Debug)] pub enum Protocol<'a> { @@ -60,6 +66,13 @@ pub enum Protocol<'a> { Wss(Cow<'a, str>), } +impl<'a> Display for Protocol<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let protocol = LiteP2pProtocol::from(self.clone()); + Display::fmt(&protocol, f) + } +} + impl<'a> From for Protocol<'a> { #[inline] fn from(addr: IpAddr) -> Self { @@ -160,3 +173,102 @@ impl<'a> From> for LiteP2pProtocol<'a> { } } } + +impl<'a> From> for Protocol<'a> { + fn from(protocol: LibP2pProtocol<'a>) -> Self { + match protocol { + LibP2pProtocol::Dccp(port) => Protocol::Dccp(port), + LibP2pProtocol::Dns(str) => Protocol::Dns(str), + LibP2pProtocol::Dns4(str) => Protocol::Dns4(str), + LibP2pProtocol::Dns6(str) => Protocol::Dns6(str), + LibP2pProtocol::Dnsaddr(str) => Protocol::Dnsaddr(str), + LibP2pProtocol::Http => Protocol::Http, + LibP2pProtocol::Https => Protocol::Https, + LibP2pProtocol::Ip4(ipv4_addr) => Protocol::Ip4(ipv4_addr), + LibP2pProtocol::Ip6(ipv6_addr) => Protocol::Ip6(ipv6_addr), + LibP2pProtocol::P2pWebRtcDirect => Protocol::P2pWebRtcDirect, + LibP2pProtocol::P2pWebRtcStar => Protocol::P2pWebRtcStar, + LibP2pProtocol::Certhash(multihash) => Protocol::Certhash(multihash.into()), + LibP2pProtocol::P2pWebSocketStar => Protocol::P2pWebSocketStar, + LibP2pProtocol::Memory(port) => Protocol::Memory(port), + LibP2pProtocol::Onion(str, port) => Protocol::Onion(str, port), + LibP2pProtocol::Onion3(addr) => Protocol::Onion3(Cow::Owned(*addr.hash()), addr.port()), + LibP2pProtocol::P2p(peer_id) => Protocol::P2p((*peer_id.as_ref()).into()), + LibP2pProtocol::P2pCircuit => Protocol::P2pCircuit, + LibP2pProtocol::Quic => Protocol::Quic, + LibP2pProtocol::QuicV1 => Protocol::QuicV1, + LibP2pProtocol::Sctp(port) => Protocol::Sctp(port), + LibP2pProtocol::Tcp(port) => Protocol::Tcp(port), + LibP2pProtocol::Tls => Protocol::Tls, + LibP2pProtocol::Noise => Protocol::Noise, + LibP2pProtocol::Udp(port) => Protocol::Udp(port), + LibP2pProtocol::Udt => Protocol::Udt, + LibP2pProtocol::Unix(str) => Protocol::Unix(str), + LibP2pProtocol::Utp => Protocol::Utp, + LibP2pProtocol::Ws(str) => Protocol::Ws(str), + LibP2pProtocol::Wss(str) => Protocol::Wss(str), + protocol => { + log::error!( + target: LOG_TARGET, + "Got unsupported multiaddr protocol '{}'", + protocol.tag(), + ); + // Strictly speaking, this conversion is incorrect. But making protocol conversion + // fallible would significantly complicate the client code. As DCCP transport is not + // used by substrate, this conversion should be safe. + // Also, as of `multiaddr-18.1`, all enum variants are actually covered. + Protocol::Dccp(0) + }, + } + } +} + +impl<'a> From> for LibP2pProtocol<'a> { + fn from(protocol: Protocol<'a>) -> Self { + match protocol { + Protocol::Dccp(port) => LibP2pProtocol::Dccp(port), + Protocol::Dns(str) => LibP2pProtocol::Dns(str), + Protocol::Dns4(str) => LibP2pProtocol::Dns4(str), + Protocol::Dns6(str) => LibP2pProtocol::Dns6(str), + Protocol::Dnsaddr(str) => LibP2pProtocol::Dnsaddr(str), + Protocol::Http => LibP2pProtocol::Http, + Protocol::Https => LibP2pProtocol::Https, + Protocol::Ip4(ipv4_addr) => LibP2pProtocol::Ip4(ipv4_addr), + Protocol::Ip6(ipv6_addr) => LibP2pProtocol::Ip6(ipv6_addr), + Protocol::P2pWebRtcDirect => LibP2pProtocol::P2pWebRtcDirect, + Protocol::P2pWebRtcStar => LibP2pProtocol::P2pWebRtcStar, + // Protocol #280 is called `WebRTC` in multiaddr-17.0 and `WebRTCDirect` in + // multiaddr-18.1. + Protocol::WebRTC => LibP2pProtocol::WebRTCDirect, + Protocol::Certhash(multihash) => LibP2pProtocol::Certhash(multihash.into()), + Protocol::P2pWebSocketStar => LibP2pProtocol::P2pWebSocketStar, + Protocol::Memory(port) => LibP2pProtocol::Memory(port), + Protocol::Onion(str, port) => LibP2pProtocol::Onion(str, port), + Protocol::Onion3(str, port) => LibP2pProtocol::Onion3((str.into_owned(), port).into()), + Protocol::P2p(multihash) => + LibP2pProtocol::P2p(PeerId::from_multihash(multihash.into()).unwrap_or_else(|_| { + // This is better than making conversion fallible and complicating the + // client code. + log::error!( + target: LOG_TARGET, + "Received multiaddr with p2p multihash which is not a valid \ + peer_id. Replacing with random peer_id." + ); + PeerId::random() + })), + Protocol::P2pCircuit => LibP2pProtocol::P2pCircuit, + Protocol::Quic => LibP2pProtocol::Quic, + Protocol::QuicV1 => LibP2pProtocol::QuicV1, + Protocol::Sctp(port) => LibP2pProtocol::Sctp(port), + Protocol::Tcp(port) => LibP2pProtocol::Tcp(port), + Protocol::Tls => LibP2pProtocol::Tls, + Protocol::Noise => LibP2pProtocol::Noise, + Protocol::Udp(port) => LibP2pProtocol::Udp(port), + Protocol::Udt => LibP2pProtocol::Udt, + Protocol::Unix(str) => LibP2pProtocol::Unix(str), + Protocol::Utp => LibP2pProtocol::Utp, + Protocol::Ws(str) => LibP2pProtocol::Ws(str), + Protocol::Wss(str) => LibP2pProtocol::Wss(str), + } + } +} diff --git a/substrate/client/network/types/src/multihash.rs b/substrate/client/network/types/src/multihash.rs index 91f5b6353a7..321211c598d 100644 --- a/substrate/client/network/types/src/multihash.rs +++ b/substrate/client/network/types/src/multihash.rs @@ -156,22 +156,20 @@ impl From for LiteP2pMultihash { } } -// TODO: uncomment this after upgrading `multihash` crate to v0.19.1. -// -// impl From> for Multihash { -// fn from(generic: multihash::MultihashGeneric<64>) -> Self { -// LiteP2pMultihash::wrap(generic.code(), generic.digest()) -// .expect("both have size 64; qed") -// .into() -// } -// } -// -// impl From for multihash::Multihash<64> { -// fn from(multihash: Multihash) -> Self { -// multihash::Multihash::<64>::wrap(multihash.code(), multihash.digest()) -// .expect("both have size 64; qed") -// } -// } +impl From> for Multihash { + fn from(generic: multihash::Multihash<64>) -> Self { + LiteP2pMultihash::wrap(generic.code(), generic.digest()) + .expect("both have size 64; qed") + .into() + } +} + +impl From for multihash::Multihash<64> { + fn from(multihash: Multihash) -> Self { + multihash::Multihash::<64>::wrap(multihash.code(), multihash.digest()) + .expect("both have size 64; qed") + } +} #[cfg(test)] mod tests { diff --git a/substrate/client/offchain/Cargo.toml b/substrate/client/offchain/Cargo.toml index be816239306..5046808f013 100644 --- a/substrate/client/offchain/Cargo.toml +++ b/substrate/client/offchain/Cargo.toml @@ -24,7 +24,6 @@ futures = { workspace = true } futures-timer = { workspace = true } hyper = { features = ["http2", "stream"], workspace = true, default-features = true } hyper-rustls = { features = ["http2"], workspace = true } -libp2p = { workspace = true } num_cpus = { workspace = true } once_cell = { workspace = true } parking_lot = { workspace = true, default-features = true } diff --git a/substrate/client/telemetry/src/transport.rs b/substrate/client/telemetry/src/transport.rs index a82626caac2..ca6ceecbed6 100644 --- a/substrate/client/telemetry/src/transport.rs +++ b/substrate/client/telemetry/src/transport.rs @@ -31,7 +31,7 @@ const CONNECT_TIMEOUT: Duration = Duration::from_secs(20); pub(crate) fn initialize_transport() -> Result { let transport = { let tcp_transport = libp2p::tcp::tokio::Transport::new(libp2p::tcp::Config::new()); - let inner = libp2p::dns::TokioDnsConfig::system(tcp_transport)?; + let inner = libp2p::dns::tokio::Transport::system(tcp_transport)?; libp2p::websocket::framed::WsConfig::new(inner).and_then(|connec, _| { let connec = connec .with(|item| { -- GitLab From 2f3a1bf8736844272a7eb165780d9f283b19d5c0 Mon Sep 17 00:00:00 2001 From: gupnik Date: Tue, 25 Jun 2024 20:01:40 +0530 Subject: [PATCH 053/130] Use real rust type for pallet alias in `runtime` macro (#4769) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/paritytech/polkadot-sdk/issues/4723. Also, closes https://github.com/paritytech/polkadot-sdk/issues/4622 As stated in the linked issue, this PR adds the ability to use a real rust type for pallet alias in the new `runtime` macro: ```rust #[runtime::pallet_index(0)] pub type System = frame_system::Pallet; ``` Please note that the current syntax still continues to be supported. CC: @shawntabrizi @kianenigma --------- Co-authored-by: command-bot <> Co-authored-by: Bastian Köcher --- prdoc/pr_4769.prdoc | 20 +++ substrate/bin/node/runtime/src/lib.rs | 160 +++++++++--------- substrate/frame/support/procedural/Cargo.toml | 2 +- substrate/frame/support/procedural/src/lib.rs | 65 +------ .../procedural/src/runtime/expand/mod.rs | 10 +- .../procedural/src/runtime/parse/mod.rs | 23 ++- .../procedural/src/runtime/parse/pallet.rs | 117 +++++++++++-- .../src/runtime/parse/pallet_decl.rs | 129 +++++++++++++- substrate/frame/support/src/lib.rs | 23 +++ substrate/frame/support/src/tests/mod.rs | 26 ++- substrate/frame/support/src/tests/runtime.rs | 130 ++++++++++++++ templates/minimal/runtime/src/lib.rs | 12 +- 12 files changed, 538 insertions(+), 179 deletions(-) create mode 100644 prdoc/pr_4769.prdoc create mode 100644 substrate/frame/support/src/tests/runtime.rs diff --git a/prdoc/pr_4769.prdoc b/prdoc/pr_4769.prdoc new file mode 100644 index 00000000000..e9691ba6f89 --- /dev/null +++ b/prdoc/pr_4769.prdoc @@ -0,0 +1,20 @@ +title: Use real rust type for pallet alias in `runtime` macro + +doc: + - audience: Runtime Dev + description: | + This PR adds the ability to use a real rust type for pallet alias in the new `runtime` macro: + ```rust + #[runtime::pallet_index(0)] + pub type System = frame_system::Pallet; + ``` + + Please note that the current syntax still continues to be supported. + +crates: + - name: frame-support-procedural + bump: patch + - name: frame-support + bump: patch + - name: minimal-template-runtime + bump: patch diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 9bde1bc5c85..c2601952cf1 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -2241,248 +2241,248 @@ mod runtime { pub struct Runtime; #[runtime::pallet_index(0)] - pub type System = frame_system; + pub type System = frame_system::Pallet; #[runtime::pallet_index(1)] - pub type Utility = pallet_utility; + pub type Utility = pallet_utility::Pallet; #[runtime::pallet_index(2)] - pub type Babe = pallet_babe; + pub type Babe = pallet_babe::Pallet; #[runtime::pallet_index(3)] - pub type Timestamp = pallet_timestamp; + pub type Timestamp = pallet_timestamp::Pallet; // Authorship must be before session in order to note author in the correct session and era // for im-online and staking. #[runtime::pallet_index(4)] - pub type Authorship = pallet_authorship; + pub type Authorship = pallet_authorship::Pallet; #[runtime::pallet_index(5)] - pub type Indices = pallet_indices; + pub type Indices = pallet_indices::Pallet; #[runtime::pallet_index(6)] - pub type Balances = pallet_balances; + pub type Balances = pallet_balances::Pallet; #[runtime::pallet_index(7)] - pub type TransactionPayment = pallet_transaction_payment; + pub type TransactionPayment = pallet_transaction_payment::Pallet; #[runtime::pallet_index(8)] - pub type AssetTxPayment = pallet_asset_tx_payment; + pub type AssetTxPayment = pallet_asset_tx_payment::Pallet; #[runtime::pallet_index(9)] - pub type AssetConversionTxPayment = pallet_asset_conversion_tx_payment; + pub type AssetConversionTxPayment = pallet_asset_conversion_tx_payment::Pallet; #[runtime::pallet_index(10)] - pub type ElectionProviderMultiPhase = pallet_election_provider_multi_phase; + pub type ElectionProviderMultiPhase = pallet_election_provider_multi_phase::Pallet; #[runtime::pallet_index(11)] - pub type Staking = pallet_staking; + pub type Staking = pallet_staking::Pallet; #[runtime::pallet_index(12)] - pub type Session = pallet_session; + pub type Session = pallet_session::Pallet; #[runtime::pallet_index(13)] - pub type Democracy = pallet_democracy; + pub type Democracy = pallet_democracy::Pallet; #[runtime::pallet_index(14)] - pub type Council = pallet_collective; + pub type Council = pallet_collective::Pallet; #[runtime::pallet_index(15)] - pub type TechnicalCommittee = pallet_collective; + pub type TechnicalCommittee = pallet_collective::Pallet; #[runtime::pallet_index(16)] - pub type Elections = pallet_elections_phragmen; + pub type Elections = pallet_elections_phragmen::Pallet; #[runtime::pallet_index(17)] - pub type TechnicalMembership = pallet_membership; + pub type TechnicalMembership = pallet_membership::Pallet; #[runtime::pallet_index(18)] - pub type Grandpa = pallet_grandpa; + pub type Grandpa = pallet_grandpa::Pallet; #[runtime::pallet_index(19)] - pub type Treasury = pallet_treasury; + pub type Treasury = pallet_treasury::Pallet; #[runtime::pallet_index(20)] - pub type AssetRate = pallet_asset_rate; + pub type AssetRate = pallet_asset_rate::Pallet; #[runtime::pallet_index(21)] - pub type Contracts = pallet_contracts; + pub type Contracts = pallet_contracts::Pallet; #[runtime::pallet_index(22)] - pub type Sudo = pallet_sudo; + pub type Sudo = pallet_sudo::Pallet; #[runtime::pallet_index(23)] - pub type ImOnline = pallet_im_online; + pub type ImOnline = pallet_im_online::Pallet; #[runtime::pallet_index(24)] - pub type AuthorityDiscovery = pallet_authority_discovery; + pub type AuthorityDiscovery = pallet_authority_discovery::Pallet; #[runtime::pallet_index(25)] - pub type Offences = pallet_offences; + pub type Offences = pallet_offences::Pallet; #[runtime::pallet_index(26)] - pub type Historical = pallet_session_historical; + pub type Historical = pallet_session_historical::Pallet; #[runtime::pallet_index(27)] - pub type RandomnessCollectiveFlip = pallet_insecure_randomness_collective_flip; + pub type RandomnessCollectiveFlip = pallet_insecure_randomness_collective_flip::Pallet; #[runtime::pallet_index(28)] - pub type Identity = pallet_identity; + pub type Identity = pallet_identity::Pallet; #[runtime::pallet_index(29)] - pub type Society = pallet_society; + pub type Society = pallet_society::Pallet; #[runtime::pallet_index(30)] - pub type Recovery = pallet_recovery; + pub type Recovery = pallet_recovery::Pallet; #[runtime::pallet_index(31)] - pub type Vesting = pallet_vesting; + pub type Vesting = pallet_vesting::Pallet; #[runtime::pallet_index(32)] - pub type Scheduler = pallet_scheduler; + pub type Scheduler = pallet_scheduler::Pallet; #[runtime::pallet_index(33)] - pub type Glutton = pallet_glutton; + pub type Glutton = pallet_glutton::Pallet; #[runtime::pallet_index(34)] - pub type Preimage = pallet_preimage; + pub type Preimage = pallet_preimage::Pallet; #[runtime::pallet_index(35)] - pub type Proxy = pallet_proxy; + pub type Proxy = pallet_proxy::Pallet; #[runtime::pallet_index(36)] - pub type Multisig = pallet_multisig; + pub type Multisig = pallet_multisig::Pallet; #[runtime::pallet_index(37)] - pub type Bounties = pallet_bounties; + pub type Bounties = pallet_bounties::Pallet; #[runtime::pallet_index(38)] - pub type Tips = pallet_tips; + pub type Tips = pallet_tips::Pallet; #[runtime::pallet_index(39)] - pub type Assets = pallet_assets; + pub type Assets = pallet_assets::Pallet; #[runtime::pallet_index(40)] - pub type PoolAssets = pallet_assets; + pub type PoolAssets = pallet_assets::Pallet; #[runtime::pallet_index(41)] - pub type Beefy = pallet_beefy; + pub type Beefy = pallet_beefy::Pallet; // MMR leaf construction must be after session in order to have a leaf's next_auth_set // refer to block. See issue polkadot-fellows/runtimes#160 for details. #[runtime::pallet_index(42)] - pub type Mmr = pallet_mmr; + pub type Mmr = pallet_mmr::Pallet; #[runtime::pallet_index(43)] - pub type MmrLeaf = pallet_beefy_mmr; + pub type MmrLeaf = pallet_beefy_mmr::Pallet; #[runtime::pallet_index(44)] - pub type Lottery = pallet_lottery; + pub type Lottery = pallet_lottery::Pallet; #[runtime::pallet_index(45)] - pub type Nis = pallet_nis; + pub type Nis = pallet_nis::Pallet; #[runtime::pallet_index(46)] - pub type Uniques = pallet_uniques; + pub type Uniques = pallet_uniques::Pallet; #[runtime::pallet_index(47)] - pub type Nfts = pallet_nfts; + pub type Nfts = pallet_nfts::Pallet; #[runtime::pallet_index(48)] - pub type NftFractionalization = pallet_nft_fractionalization; + pub type NftFractionalization = pallet_nft_fractionalization::Pallet; #[runtime::pallet_index(49)] - pub type Salary = pallet_salary; + pub type Salary = pallet_salary::Pallet; #[runtime::pallet_index(50)] - pub type CoreFellowship = pallet_core_fellowship; + pub type CoreFellowship = pallet_core_fellowship::Pallet; #[runtime::pallet_index(51)] - pub type TransactionStorage = pallet_transaction_storage; + pub type TransactionStorage = pallet_transaction_storage::Pallet; #[runtime::pallet_index(52)] - pub type VoterList = pallet_bags_list; + pub type VoterList = pallet_bags_list::Pallet; #[runtime::pallet_index(53)] - pub type StateTrieMigration = pallet_state_trie_migration; + pub type StateTrieMigration = pallet_state_trie_migration::Pallet; #[runtime::pallet_index(54)] - pub type ChildBounties = pallet_child_bounties; + pub type ChildBounties = pallet_child_bounties::Pallet; #[runtime::pallet_index(55)] - pub type Referenda = pallet_referenda; + pub type Referenda = pallet_referenda::Pallet; #[runtime::pallet_index(56)] - pub type Remark = pallet_remark; + pub type Remark = pallet_remark::Pallet; #[runtime::pallet_index(57)] - pub type RootTesting = pallet_root_testing; + pub type RootTesting = pallet_root_testing::Pallet; #[runtime::pallet_index(58)] - pub type ConvictionVoting = pallet_conviction_voting; + pub type ConvictionVoting = pallet_conviction_voting::Pallet; #[runtime::pallet_index(59)] - pub type Whitelist = pallet_whitelist; + pub type Whitelist = pallet_whitelist::Pallet; #[runtime::pallet_index(60)] - pub type AllianceMotion = pallet_collective; + pub type AllianceMotion = pallet_collective::Pallet; #[runtime::pallet_index(61)] - pub type Alliance = pallet_alliance; + pub type Alliance = pallet_alliance::Pallet; #[runtime::pallet_index(62)] - pub type NominationPools = pallet_nomination_pools; + pub type NominationPools = pallet_nomination_pools::Pallet; #[runtime::pallet_index(63)] - pub type RankedPolls = pallet_referenda; + pub type RankedPolls = pallet_referenda::Pallet; #[runtime::pallet_index(64)] - pub type RankedCollective = pallet_ranked_collective; + pub type RankedCollective = pallet_ranked_collective::Pallet; #[runtime::pallet_index(65)] - pub type AssetConversion = pallet_asset_conversion; + pub type AssetConversion = pallet_asset_conversion::Pallet; #[runtime::pallet_index(66)] - pub type FastUnstake = pallet_fast_unstake; + pub type FastUnstake = pallet_fast_unstake::Pallet; #[runtime::pallet_index(67)] - pub type MessageQueue = pallet_message_queue; + pub type MessageQueue = pallet_message_queue::Pallet; #[runtime::pallet_index(68)] - pub type Pov = frame_benchmarking_pallet_pov; + pub type Pov = frame_benchmarking_pallet_pov::Pallet; #[runtime::pallet_index(69)] - pub type TxPause = pallet_tx_pause; + pub type TxPause = pallet_tx_pause::Pallet; #[runtime::pallet_index(70)] - pub type SafeMode = pallet_safe_mode; + pub type SafeMode = pallet_safe_mode::Pallet; #[runtime::pallet_index(71)] - pub type Statement = pallet_statement; + pub type Statement = pallet_statement::Pallet; #[runtime::pallet_index(72)] - pub type MultiBlockMigrations = pallet_migrations; + pub type MultiBlockMigrations = pallet_migrations::Pallet; #[runtime::pallet_index(73)] - pub type Broker = pallet_broker; + pub type Broker = pallet_broker::Pallet; #[runtime::pallet_index(74)] - pub type TasksExample = pallet_example_tasks; + pub type TasksExample = pallet_example_tasks::Pallet; #[runtime::pallet_index(75)] - pub type Mixnet = pallet_mixnet; + pub type Mixnet = pallet_mixnet::Pallet; #[runtime::pallet_index(76)] - pub type Parameters = pallet_parameters; + pub type Parameters = pallet_parameters::Pallet; #[runtime::pallet_index(77)] - pub type SkipFeelessPayment = pallet_skip_feeless_payment; + pub type SkipFeelessPayment = pallet_skip_feeless_payment::Pallet; #[runtime::pallet_index(78)] - pub type PalletExampleMbms = pallet_example_mbm; + pub type PalletExampleMbms = pallet_example_mbm::Pallet; #[runtime::pallet_index(79)] - pub type AssetConversionMigration = pallet_asset_conversion_ops; + pub type AssetConversionMigration = pallet_asset_conversion_ops::Pallet; } /// The address format for describing accounts. diff --git a/substrate/frame/support/procedural/Cargo.toml b/substrate/frame/support/procedural/Cargo.toml index ad91cfae4ea..fbb4da0177a 100644 --- a/substrate/frame/support/procedural/Cargo.toml +++ b/substrate/frame/support/procedural/Cargo.toml @@ -24,7 +24,7 @@ cfg-expr = { workspace = true } itertools = { workspace = true } proc-macro2 = { workspace = true } quote = { workspace = true } -syn = { features = ["full", "visit-mut"], workspace = true } +syn = { features = ["full", "parsing", "visit-mut"], workspace = true } frame-support-procedural-tools = { workspace = true, default-features = true } macro_magic = { features = ["proc_support"], workspace = true } proc-macro-warning = { workspace = true } diff --git a/substrate/frame/support/procedural/src/lib.rs b/substrate/frame/support/procedural/src/lib.rs index e812ac071b2..51e5657a2e8 100644 --- a/substrate/frame/support/procedural/src/lib.rs +++ b/substrate/frame/support/procedural/src/lib.rs @@ -81,6 +81,9 @@ fn counter_prefix(prefix: &str) -> String { /// Construct a runtime, with the given name and the given pallets. /// +/// NOTE: A new version of this macro is available at `frame_support::runtime`. This macro will +/// soon be deprecated. Please use the new macro instead. +/// /// The parameters here are specific types for `Block`, `NodeBlock`, and `UncheckedExtrinsic` /// and the pallets that are used by the runtime. /// `Block` is the block type that is used in the runtime and `NodeBlock` is the block type @@ -1188,67 +1191,11 @@ pub fn import_section(attr: TokenStream, tokens: TokenStream) -> TokenStream { .into() } -/// Construct a runtime, with the given name and the given pallets. -/// -/// # Example: /// -/// ```ignore -/// #[frame_support::runtime] -/// mod runtime { -/// // The main runtime -/// #[runtime::runtime] -/// // Runtime Types to be generated -/// #[runtime::derive( -/// RuntimeCall, -/// RuntimeEvent, -/// RuntimeError, -/// RuntimeOrigin, -/// RuntimeFreezeReason, -/// RuntimeHoldReason, -/// RuntimeSlashReason, -/// RuntimeLockId, -/// RuntimeTask, -/// )] -/// pub struct Runtime; -/// -/// #[runtime::pallet_index(0)] -/// pub type System = frame_system; -/// -/// #[runtime::pallet_index(1)] -/// pub type Test = path::to::test; -/// -/// // Pallet with instance. -/// #[runtime::pallet_index(2)] -/// pub type Test2_Instance1 = test2; -/// -/// // Pallet with calls disabled. -/// #[runtime::pallet_index(3)] -/// #[runtime::disable_call] -/// pub type Test3 = test3; -/// -/// // Pallet with unsigned extrinsics disabled. -/// #[runtime::pallet_index(4)] -/// #[runtime::disable_unsigned] -/// pub type Test4 = test4; -/// } -/// ``` -/// -/// # Legacy Ordering -/// -/// An optional attribute can be defined as #[frame_support::runtime(legacy_ordering)] to -/// ensure that the order of hooks is same as the order of pallets (and not based on the -/// pallet_index). This is to support legacy runtimes and should be avoided for new ones. -/// -/// # Note -/// -/// The population of the genesis storage depends on the order of pallets. So, if one of your -/// pallets depends on another pallet, the pallet that is depended upon needs to come before -/// the pallet depending on it. -/// -/// # Type definitions +/// --- /// -/// * The macro generates a type alias for each pallet to their `Pallet`. E.g. `type System = -/// frame_system::Pallet` +/// **Rust-Analyzer users**: See the documentation of the Rust item in +/// `frame_support::runtime`. #[proc_macro_attribute] pub fn runtime(attr: TokenStream, item: TokenStream) -> TokenStream { runtime::runtime(attr, item) diff --git a/substrate/frame/support/procedural/src/runtime/expand/mod.rs b/substrate/frame/support/procedural/src/runtime/expand/mod.rs index 43f11896808..3cdfb06cb6e 100644 --- a/substrate/frame/support/procedural/src/runtime/expand/mod.rs +++ b/substrate/frame/support/procedural/src/runtime/expand/mod.rs @@ -99,14 +99,20 @@ fn construct_runtime_implicit_to_explicit( for pallet in definition.pallet_decls.iter() { let pallet_path = &pallet.path; let pallet_name = &pallet.name; - let pallet_instance = pallet.instance.as_ref().map(|instance| quote::quote!(<#instance>)); + let runtime_param = &pallet.runtime_param; + let pallet_segment_and_instance = match (&pallet.pallet_segment, &pallet.instance) { + (Some(segment), Some(instance)) => quote::quote!(::#segment<#runtime_param, #instance>), + (Some(segment), None) => quote::quote!(::#segment<#runtime_param>), + (None, Some(instance)) => quote::quote!(<#instance>), + (None, None) => quote::quote!(), + }; expansion = quote::quote!( #frame_support::__private::tt_call! { macro = [{ #pallet_path::tt_default_parts_v2 }] your_tt_return = [{ #frame_support::__private::tt_return }] ~~> #frame_support::match_and_insert! { target = [{ #expansion }] - pattern = [{ #pallet_name = #pallet_path #pallet_instance }] + pattern = [{ #pallet_name = #pallet_path #pallet_segment_and_instance }] } } ); diff --git a/substrate/frame/support/procedural/src/runtime/parse/mod.rs b/substrate/frame/support/procedural/src/runtime/parse/mod.rs index dd83cd0da90..49647993aac 100644 --- a/substrate/frame/support/procedural/src/runtime/parse/mod.rs +++ b/substrate/frame/support/procedural/src/runtime/parse/mod.rs @@ -189,7 +189,7 @@ impl Def { match *pallet_item.ty.clone() { syn::Type::Path(ref path) => { let pallet_decl = - PalletDeclaration::try_from(item.span(), &pallet_item, path)?; + PalletDeclaration::try_from(item.span(), &pallet_item, &path.path)?; if let Some(used_pallet) = names.insert(pallet_decl.name.clone(), pallet_decl.name.span()) @@ -267,3 +267,24 @@ impl Def { Ok(def) } } + +#[test] +fn runtime_parsing_works() { + let def = Def::try_from(syn::parse_quote! { + #[runtime::runtime] + mod runtime { + #[runtime::derive(RuntimeCall, RuntimeEvent)] + #[runtime::runtime] + pub struct Runtime; + + #[runtime::pallet_index(0)] + pub type System = frame_system::Pallet; + + #[runtime::pallet_index(1)] + pub type Pallet1 = pallet1; + } + }) + .expect("Failed to parse runtime definition"); + + assert_eq!(def.runtime_struct.ident, "Runtime"); +} diff --git a/substrate/frame/support/procedural/src/runtime/parse/pallet.rs b/substrate/frame/support/procedural/src/runtime/parse/pallet.rs index 09f5290541d..ebfd0c9ccce 100644 --- a/substrate/frame/support/procedural/src/runtime/parse/pallet.rs +++ b/substrate/frame/support/procedural/src/runtime/parse/pallet.rs @@ -15,10 +15,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::construct_runtime::parse::{Pallet, PalletPart, PalletPartKeyword, PalletPath}; +use crate::{ + construct_runtime::parse::{Pallet, PalletPart, PalletPartKeyword, PalletPath}, + runtime::parse::PalletDeclaration, +}; use frame_support_procedural_tools::get_doc_literals; use quote::ToTokens; -use syn::{punctuated::Punctuated, spanned::Spanned, token, Error, Ident, PathArguments}; +use syn::{punctuated::Punctuated, token, Error}; impl Pallet { pub fn try_from( @@ -55,20 +58,10 @@ impl Pallet { "Invalid pallet declaration, expected a path or a trait object", ))?; - let mut instance = None; - if let Some(segment) = path.inner.segments.iter_mut().find(|seg| !seg.arguments.is_empty()) - { - if let PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { - args, .. - }) = segment.arguments.clone() - { - if let Some(syn::GenericArgument::Type(syn::Type::Path(arg_path))) = args.first() { - instance = - Some(Ident::new(&arg_path.to_token_stream().to_string(), arg_path.span())); - segment.arguments = PathArguments::None; - } - } - } + let PalletDeclaration { path: inner, instance, .. } = + PalletDeclaration::try_from(attr_span, item, &path.inner)?; + + path = PalletPath { inner }; pallet_parts = pallet_parts .into_iter() @@ -101,3 +94,95 @@ impl Pallet { }) } } + +#[test] +fn pallet_parsing_works() { + use syn::{parse_quote, ItemType}; + + let item: ItemType = parse_quote! { + pub type System = frame_system + Call; + }; + let ItemType { ty, .. } = item.clone(); + let syn::Type::TraitObject(syn::TypeTraitObject { bounds, .. }) = *ty else { + panic!("Expected a trait object"); + }; + + let index = 0; + let pallet = + Pallet::try_from(proc_macro2::Span::call_site(), &item, index, false, false, &bounds) + .unwrap(); + + assert_eq!(pallet.name.to_string(), "System"); + assert_eq!(pallet.index, index); + assert_eq!(pallet.path.to_token_stream().to_string(), "frame_system"); + assert_eq!(pallet.instance, None); +} + +#[test] +fn pallet_parsing_works_with_instance() { + use syn::{parse_quote, ItemType}; + + let item: ItemType = parse_quote! { + pub type System = frame_system + Call; + }; + let ItemType { ty, .. } = item.clone(); + let syn::Type::TraitObject(syn::TypeTraitObject { bounds, .. }) = *ty else { + panic!("Expected a trait object"); + }; + + let index = 0; + let pallet = + Pallet::try_from(proc_macro2::Span::call_site(), &item, index, false, false, &bounds) + .unwrap(); + + assert_eq!(pallet.name.to_string(), "System"); + assert_eq!(pallet.index, index); + assert_eq!(pallet.path.to_token_stream().to_string(), "frame_system"); + assert_eq!(pallet.instance, Some(parse_quote! { Instance1 })); +} + +#[test] +fn pallet_parsing_works_with_pallet() { + use syn::{parse_quote, ItemType}; + + let item: ItemType = parse_quote! { + pub type System = frame_system::Pallet + Call; + }; + let ItemType { ty, .. } = item.clone(); + let syn::Type::TraitObject(syn::TypeTraitObject { bounds, .. }) = *ty else { + panic!("Expected a trait object"); + }; + + let index = 0; + let pallet = + Pallet::try_from(proc_macro2::Span::call_site(), &item, index, false, false, &bounds) + .unwrap(); + + assert_eq!(pallet.name.to_string(), "System"); + assert_eq!(pallet.index, index); + assert_eq!(pallet.path.to_token_stream().to_string(), "frame_system"); + assert_eq!(pallet.instance, None); +} + +#[test] +fn pallet_parsing_works_with_instance_and_pallet() { + use syn::{parse_quote, ItemType}; + + let item: ItemType = parse_quote! { + pub type System = frame_system::Pallet + Call; + }; + let ItemType { ty, .. } = item.clone(); + let syn::Type::TraitObject(syn::TypeTraitObject { bounds, .. }) = *ty else { + panic!("Expected a trait object"); + }; + + let index = 0; + let pallet = + Pallet::try_from(proc_macro2::Span::call_site(), &item, index, false, false, &bounds) + .unwrap(); + + assert_eq!(pallet.name.to_string(), "System"); + assert_eq!(pallet.index, index); + assert_eq!(pallet.path.to_token_stream().to_string(), "frame_system"); + assert_eq!(pallet.instance, Some(parse_quote! { Instance1 })); +} diff --git a/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs b/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs index e167d37d5f1..fbac75336f2 100644 --- a/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs +++ b/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs @@ -15,8 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use quote::ToTokens; -use syn::{spanned::Spanned, Attribute, Ident, PathArguments}; +use syn::{Attribute, Ident, PathArguments}; /// The declaration of a pallet. #[derive(Debug, Clone)] @@ -27,6 +26,11 @@ pub struct PalletDeclaration { pub attrs: Vec, /// The path of the pallet, e.g. `frame_system` in `pub type System = frame_system`. pub path: syn::Path, + /// The segment of the pallet, e.g. `Pallet` in `pub type System = frame_system::Pallet`. + pub pallet_segment: Option, + /// The runtime parameter of the pallet, e.g. `Runtime` in + /// `pub type System = frame_system::Pallet`. + pub runtime_param: Option, /// The instance of the pallet, e.g. `Instance1` in `pub type Council = /// pallet_collective`. pub instance: Option, @@ -36,26 +40,135 @@ impl PalletDeclaration { pub fn try_from( _attr_span: proc_macro2::Span, item: &syn::ItemType, - path: &syn::TypePath, + path: &syn::Path, ) -> syn::Result { let name = item.ident.clone(); - let mut path = path.path.clone(); + let mut path = path.clone(); + let mut pallet_segment = None; + let mut runtime_param = None; let mut instance = None; if let Some(segment) = path.segments.iter_mut().find(|seg| !seg.arguments.is_empty()) { if let PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { args, .. }) = segment.arguments.clone() { - if let Some(syn::GenericArgument::Type(syn::Type::Path(arg_path))) = args.first() { - instance = - Some(Ident::new(&arg_path.to_token_stream().to_string(), arg_path.span())); + if segment.ident == "Pallet" { + let mut segment = segment.clone(); segment.arguments = PathArguments::None; + pallet_segment = Some(segment.clone()); + } + let mut args_iter = args.iter(); + if let Some(syn::GenericArgument::Type(syn::Type::Path(arg_path))) = + args_iter.next() + { + let ident = arg_path.path.require_ident()?.clone(); + if segment.ident == "Pallet" { + runtime_param = Some(ident); + if let Some(syn::GenericArgument::Type(syn::Type::Path(arg_path))) = + args_iter.next() + { + instance = Some(arg_path.path.require_ident()?.clone()); + } + } else { + instance = Some(ident); + segment.arguments = PathArguments::None; + } } } } - Ok(Self { name, path, instance, attrs: item.attrs.clone() }) + if pallet_segment.is_some() { + path = syn::Path { + leading_colon: None, + segments: path + .segments + .iter() + .filter(|seg| seg.arguments.is_empty()) + .cloned() + .collect(), + }; + } + + Ok(Self { name, path, pallet_segment, runtime_param, instance, attrs: item.attrs.clone() }) } } + +#[test] +fn declaration_works() { + use syn::parse_quote; + + let decl: PalletDeclaration = PalletDeclaration::try_from( + proc_macro2::Span::call_site(), + &parse_quote! { pub type System = frame_system; }, + &parse_quote! { frame_system }, + ) + .expect("Failed to parse pallet declaration"); + + assert_eq!(decl.name, "System"); + assert_eq!(decl.path, parse_quote! { frame_system }); + assert_eq!(decl.pallet_segment, None); + assert_eq!(decl.runtime_param, None); + assert_eq!(decl.instance, None); +} + +#[test] +fn declaration_works_with_instance() { + use syn::parse_quote; + + let decl: PalletDeclaration = PalletDeclaration::try_from( + proc_macro2::Span::call_site(), + &parse_quote! { pub type System = frame_system; }, + &parse_quote! { frame_system }, + ) + .expect("Failed to parse pallet declaration"); + + assert_eq!(decl.name, "System"); + assert_eq!(decl.path, parse_quote! { frame_system }); + assert_eq!(decl.pallet_segment, None); + assert_eq!(decl.runtime_param, None); + assert_eq!(decl.instance, Some(parse_quote! { Instance1 })); +} + +#[test] +fn declaration_works_with_pallet() { + use syn::parse_quote; + + let decl: PalletDeclaration = PalletDeclaration::try_from( + proc_macro2::Span::call_site(), + &parse_quote! { pub type System = frame_system::Pallet; }, + &parse_quote! { frame_system::Pallet }, + ) + .expect("Failed to parse pallet declaration"); + + assert_eq!(decl.name, "System"); + assert_eq!(decl.path, parse_quote! { frame_system }); + + let segment: syn::PathSegment = + syn::PathSegment { ident: parse_quote! { Pallet }, arguments: PathArguments::None }; + assert_eq!(decl.pallet_segment, Some(segment)); + assert_eq!(decl.runtime_param, Some(parse_quote! { Runtime })); + assert_eq!(decl.instance, None); +} + +#[test] +fn declaration_works_with_pallet_and_instance() { + use syn::parse_quote; + + let decl: PalletDeclaration = PalletDeclaration::try_from( + proc_macro2::Span::call_site(), + &parse_quote! { pub type System = frame_system::Pallet; }, + &parse_quote! { frame_system::Pallet }, + ) + .expect("Failed to parse pallet declaration"); + + assert_eq!(decl.name, "System"); + assert_eq!(decl.path, parse_quote! { frame_system }); + + let segment: syn::PathSegment = + syn::PathSegment { ident: parse_quote! { Pallet }, arguments: PathArguments::None }; + assert_eq!(decl.pallet_segment, Some(segment)); + assert_eq!(decl.runtime_param, Some(parse_quote! { Runtime })); + assert_eq!(decl.instance, Some(parse_quote! { Instance1 })); +} diff --git a/substrate/frame/support/src/lib.rs b/substrate/frame/support/src/lib.rs index 8ae1f56b4d6..138091689a5 100644 --- a/substrate/frame/support/src/lib.rs +++ b/substrate/frame/support/src/lib.rs @@ -508,6 +508,29 @@ pub use frame_support_procedural::{ construct_runtime, match_and_insert, transactional, PalletError, RuntimeDebugNoBound, }; +/// Construct a runtime, with the given name and the given pallets. +/// +/// # Example: +#[doc = docify::embed!("src/tests/runtime.rs", runtime_macro)] +/// +/// # Supported Attributes: +/// +/// ## Legacy Ordering +/// +/// An optional attribute can be defined as #[frame_support::runtime(legacy_ordering)] to +/// ensure that the order of hooks is same as the order of pallets (and not based on the +/// pallet_index). This is to support legacy runtimes and should be avoided for new ones. +/// +/// # Note +/// +/// The population of the genesis storage depends on the order of pallets. So, if one of your +/// pallets depends on another pallet, the pallet that is depended upon needs to come before +/// the pallet depending on it. +/// +/// # Type definitions +/// +/// * The macro generates a type alias for each pallet to their `Pallet`. E.g. `type System = +/// frame_system::Pallet` pub use frame_support_procedural::runtime; #[doc(hidden)] diff --git a/substrate/frame/support/src/tests/mod.rs b/substrate/frame/support/src/tests/mod.rs index 88afa243f09..34652231e3b 100644 --- a/substrate/frame/support/src/tests/mod.rs +++ b/substrate/frame/support/src/tests/mod.rs @@ -27,6 +27,7 @@ use sp_runtime::{generic, traits::BlakeTwo256, BuildStorage}; pub use self::frame_system::{pallet_prelude::*, Config, Pallet}; mod inject_runtime_type; +mod runtime; mod storage_alias; mod tasks; @@ -220,12 +221,25 @@ type Header = generic::Header; type UncheckedExtrinsic = generic::UncheckedExtrinsic; type Block = generic::Block; -crate::construct_runtime!( - pub enum Runtime - { - System: self::frame_system, - } -); +#[crate::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason, + RuntimeLockId, + RuntimeTask + )] + pub struct Runtime; + + #[runtime::pallet_index(0)] + pub type System = self::frame_system; +} #[crate::derive_impl(self::frame_system::config_preludes::TestDefaultConfig as self::frame_system::DefaultConfig)] impl Config for Runtime { diff --git a/substrate/frame/support/src/tests/runtime.rs b/substrate/frame/support/src/tests/runtime.rs new file mode 100644 index 00000000000..a9d9281f50d --- /dev/null +++ b/substrate/frame/support/src/tests/runtime.rs @@ -0,0 +1,130 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::{frame_system, Block}; +use crate::derive_impl; + +#[crate::pallet(dev_mode)] +mod pallet_basic { + use super::frame_system; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config {} +} + +impl pallet_basic::Config for Runtime {} + +#[crate::pallet(dev_mode)] +mod pallet_with_disabled_call { + use super::frame_system; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config {} +} + +impl pallet_with_disabled_call::Config for Runtime {} + +#[crate::pallet(dev_mode)] +mod pallet_with_disabled_unsigned { + use super::frame_system; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config {} +} + +impl pallet_with_disabled_unsigned::Config for Runtime {} + +#[crate::pallet] +mod pallet_with_instance { + use super::frame_system; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config {} +} + +#[allow(unused)] +type Instance1 = pallet_with_instance::Pallet; + +impl pallet_with_instance::Config for Runtime {} + +#[allow(unused)] +type Instance2 = pallet_with_instance::Pallet; + +impl pallet_with_instance::Config for Runtime {} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for Runtime { + type Block = Block; +} + +#[docify::export(runtime_macro)] +#[crate::runtime] +mod runtime { + // The main runtime + #[runtime::runtime] + // Runtime Types to be generated + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason, + RuntimeLockId, + RuntimeTask + )] + pub struct Runtime; + + // Use the concrete pallet type + #[runtime::pallet_index(0)] + pub type System = frame_system::Pallet; + + // Use path to the pallet + #[runtime::pallet_index(1)] + pub type Basic = pallet_basic; + + // Use the concrete pallet type with instance + #[runtime::pallet_index(2)] + pub type PalletWithInstance1 = pallet_with_instance::Pallet; + + // Use path to the pallet with instance + #[runtime::pallet_index(3)] + pub type PalletWithInstance2 = pallet_with_instance; + + // Ensure that the runtime does not export the calls from the pallet + #[runtime::pallet_index(4)] + #[runtime::disable_call] + pub type PalletWithDisabledCall = pallet_with_disabled_call::Pallet; + + // Ensure that the runtime does not export the unsigned calls from the pallet + #[runtime::pallet_index(5)] + #[runtime::disable_unsigned] + pub type PalletWithDisabledUnsigned = pallet_with_disabled_unsigned::Pallet; +} diff --git a/templates/minimal/runtime/src/lib.rs b/templates/minimal/runtime/src/lib.rs index d2debbf5689..8c7867f4cc8 100644 --- a/templates/minimal/runtime/src/lib.rs +++ b/templates/minimal/runtime/src/lib.rs @@ -99,27 +99,27 @@ mod runtime { /// Mandatory system pallet that should always be included in a FRAME runtime. #[runtime::pallet_index(0)] - pub type System = frame_system; + pub type System = frame_system::Pallet; /// Provides a way for consensus systems to set and check the onchain time. #[runtime::pallet_index(1)] - pub type Timestamp = pallet_timestamp; + pub type Timestamp = pallet_timestamp::Pallet; /// Provides the ability to keep track of balances. #[runtime::pallet_index(2)] - pub type Balances = pallet_balances; + pub type Balances = pallet_balances::Pallet; /// Provides a way to execute privileged functions. #[runtime::pallet_index(3)] - pub type Sudo = pallet_sudo; + pub type Sudo = pallet_sudo::Pallet; /// Provides the ability to charge for extrinsic execution. #[runtime::pallet_index(4)] - pub type TransactionPayment = pallet_transaction_payment; + pub type TransactionPayment = pallet_transaction_payment::Pallet; /// A minimal pallet template. #[runtime::pallet_index(5)] - pub type Template = pallet_minimal_template; + pub type Template = pallet_minimal_template::Pallet; } parameter_types! { -- GitLab From 0ed3f04dcc431baf0467dca23e9587c29c6035a6 Mon Sep 17 00:00:00 2001 From: Nazar Mokrynskyi Date: Wed, 26 Jun 2024 10:12:42 +0300 Subject: [PATCH 054/130] Block import and verification refactoring (#4844) A few refactorings to block import and block verification that should not be controversial. Block verification before block import is stateless by design as described in https://substrate.stackexchange.com/a/1322/25 and the fact that it wasn't yet I consider to be a bug. Some code that requires it had to use `Mutex`, but I do not expect it to have a measurable performance impact. Similarly with block import checking whether block preconditions should not be an exclusive operation, there is nothing fundamentally wrong with checking a few competing blocks whose parent blocks exist at the same time (and even import them concurrently later, though IIRC this is not yet implemented either). They were originally a part of https://github.com/paritytech/polkadot-sdk/pull/4842 and upstreaming will help us to reduce the size of the patch we need to apply on top of upstream code at Subspace every time we upgrade. There are no new features introduced here, just refactoring to get rid of unnecessary requirements. --- Cargo.lock | 1 + cumulus/client/consensus/aura/Cargo.toml | 1 + .../aura/src/equivocation_import_queue.rs | 9 +- .../consensus/common/src/import_queue.rs | 2 +- cumulus/client/consensus/common/src/lib.rs | 4 +- .../consensus/relay-chain/src/import_queue.rs | 2 +- cumulus/polkadot-parachain/src/service.rs | 91 ++++------ prdoc/pr_4844.prdoc | 34 ++++ .../client/consensus/aura/src/import_queue.rs | 2 +- substrate/client/consensus/babe/src/lib.rs | 4 +- substrate/client/consensus/babe/src/tests.rs | 10 +- .../client/consensus/beefy/src/import.rs | 2 +- .../consensus/common/src/block_import.rs | 15 +- .../consensus/common/src/import_queue.rs | 160 ++++++++++++------ .../common/src/import_queue/basic_queue.rs | 41 +++-- .../client/consensus/grandpa/src/import.rs | 4 +- .../manual-seal/src/consensus/babe.rs | 2 +- .../client/consensus/manual-seal/src/lib.rs | 2 +- substrate/client/consensus/pow/src/lib.rs | 7 +- substrate/client/network/test/src/lib.rs | 11 +- substrate/client/network/test/src/service.rs | 2 +- substrate/client/service/src/client/client.rs | 6 +- 22 files changed, 244 insertions(+), 168 deletions(-) create mode 100644 prdoc/pr_4844.prdoc diff --git a/Cargo.lock b/Cargo.lock index 6f1e91f7b02..5935e7ba730 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3719,6 +3719,7 @@ dependencies = [ "cumulus-relay-chain-interface", "futures", "parity-scale-codec", + "parking_lot 0.12.1", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-overseer", diff --git a/cumulus/client/consensus/aura/Cargo.toml b/cumulus/client/consensus/aura/Cargo.toml index c473b2113dd..5ab3e6f2512 100644 --- a/cumulus/client/consensus/aura/Cargo.toml +++ b/cumulus/client/consensus/aura/Cargo.toml @@ -13,6 +13,7 @@ workspace = true async-trait = { workspace = true } codec = { features = ["derive"], workspace = true, default-features = true } futures = { workspace = true } +parking_lot = { workspace = true } tracing = { workspace = true, default-features = true } schnellru = { workspace = true } diff --git a/cumulus/client/consensus/aura/src/equivocation_import_queue.rs b/cumulus/client/consensus/aura/src/equivocation_import_queue.rs index be554bdcfc7..68f2d37c874 100644 --- a/cumulus/client/consensus/aura/src/equivocation_import_queue.rs +++ b/cumulus/client/consensus/aura/src/equivocation_import_queue.rs @@ -21,6 +21,7 @@ /// should be thrown out and which ones should be kept. use codec::Codec; use cumulus_client_consensus_common::ParachainBlockImportMarker; +use parking_lot::Mutex; use schnellru::{ByLength, LruMap}; use sc_consensus::{ @@ -70,7 +71,7 @@ impl NaiveEquivocationDefender { struct Verifier { client: Arc, create_inherent_data_providers: CIDP, - defender: NaiveEquivocationDefender, + defender: Mutex, telemetry: Option, _phantom: std::marker::PhantomData (Block, P)>, } @@ -88,7 +89,7 @@ where CIDP: CreateInherentDataProviders, { async fn verify( - &mut self, + &self, mut block_params: BlockImportParams, ) -> Result, String> { // Skip checks that include execution, if being told so, or when importing only state. @@ -137,7 +138,7 @@ where block_params.post_hash = Some(post_hash); // Check for and reject egregious amounts of equivocations. - if self.defender.insert_and_check(slot) { + if self.defender.lock().insert_and_check(slot) { return Err(format!( "Rejecting block {:?} due to excessive equivocations at slot", post_hash, @@ -243,7 +244,7 @@ where let verifier = Verifier:: { client, create_inherent_data_providers, - defender: NaiveEquivocationDefender::default(), + defender: Mutex::new(NaiveEquivocationDefender::default()), telemetry, _phantom: std::marker::PhantomData, }; diff --git a/cumulus/client/consensus/common/src/import_queue.rs b/cumulus/client/consensus/common/src/import_queue.rs index 8024b7695a2..488693604fe 100644 --- a/cumulus/client/consensus/common/src/import_queue.rs +++ b/cumulus/client/consensus/common/src/import_queue.rs @@ -50,7 +50,7 @@ pub struct VerifyNothing; #[async_trait::async_trait] impl Verifier for VerifyNothing { async fn verify( - &mut self, + &self, params: BlockImportParams, ) -> Result, String> { Ok(params) diff --git a/cumulus/client/consensus/common/src/lib.rs b/cumulus/client/consensus/common/src/lib.rs index cebe34e7ea5..2b0d8290182 100644 --- a/cumulus/client/consensus/common/src/lib.rs +++ b/cumulus/client/consensus/common/src/lib.rs @@ -172,13 +172,13 @@ impl Clone for ParachainBlockImport { impl BlockImport for ParachainBlockImport where Block: BlockT, - BI: BlockImport + Send, + BI: BlockImport + Send + Sync, BE: Backend, { type Error = BI::Error; async fn check_block( - &mut self, + &self, block: sc_consensus::BlockCheckParams, ) -> Result { self.inner.check_block(block).await diff --git a/cumulus/client/consensus/relay-chain/src/import_queue.rs b/cumulus/client/consensus/relay-chain/src/import_queue.rs index 1b521e79d48..1d6f039da4c 100644 --- a/cumulus/client/consensus/relay-chain/src/import_queue.rs +++ b/cumulus/client/consensus/relay-chain/src/import_queue.rs @@ -52,7 +52,7 @@ where CIDP: CreateInherentDataProviders, { async fn verify( - &mut self, + &self, mut block_params: BlockImportParams, ) -> Result, String> { block_params.fork_choice = Some(sc_consensus::ForkChoiceStrategy::Custom( diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index 9cd3a003722..a22ae77a775 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -498,43 +498,26 @@ pub async fn start_shell_node>( .await } -enum BuildOnAccess { - Uninitialized(Option R + Send + Sync>>), - Initialized(R), -} - -impl BuildOnAccess { - fn get_mut(&mut self) -> &mut R { - loop { - match self { - Self::Uninitialized(f) => { - *self = Self::Initialized((f.take().unwrap())()); - }, - Self::Initialized(ref mut r) => return r, - } - } - } -} - struct Verifier { client: Arc, - aura_verifier: BuildOnAccess>>, + aura_verifier: Box>, relay_chain_verifier: Box>, _phantom: PhantomData, } #[async_trait::async_trait] -impl VerifierT for Verifier +impl VerifierT for Verifier where - Client: sp_api::ProvideRuntimeApi + Send + Sync, + Client: ProvideRuntimeApi + Send + Sync, Client::Api: AuraRuntimeApi, + AuraId: AuraIdT + Sync, { async fn verify( - &mut self, + &self, block_import: BlockImportParams, ) -> Result, String> { if self.client.runtime_api().has_aura_api(*block_import.header.parent_hash()) { - self.aura_verifier.get_mut().verify(block_import).await + self.aura_verifier.verify(block_import).await } else { self.relay_chain_verifier.verify(block_import).await } @@ -543,7 +526,7 @@ where /// Build the import queue for parachain runtimes that started with relay chain consensus and /// switched to aura. -pub fn build_relay_to_aura_import_queue( +pub fn build_relay_to_aura_import_queue( client: Arc>, block_import: ParachainBlockImport, config: &Configuration, @@ -553,38 +536,35 @@ pub fn build_relay_to_aura_import_queue( where RuntimeApi: ConstructNodeRuntimeApi>, RuntimeApi::RuntimeApi: AuraRuntimeApi, + AuraId: AuraIdT + Sync, { let verifier_client = client.clone(); - let aura_verifier = move || { - Box::new(cumulus_client_consensus_aura::build_verifier::< - ::Pair, - _, - _, - _, - >(cumulus_client_consensus_aura::BuildVerifierParams { - client: verifier_client.clone(), - create_inherent_data_providers: move |parent_hash, _| { - let cidp_client = verifier_client.clone(); - async move { - let slot_duration = cumulus_client_consensus_aura::slot_duration_at( - &*cidp_client, - parent_hash, - )?; - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - Ok((slot, timestamp)) - } - }, - telemetry: telemetry_handle, - })) as Box<_> - }; + let aura_verifier = cumulus_client_consensus_aura::build_verifier::< + ::Pair, + _, + _, + _, + >(cumulus_client_consensus_aura::BuildVerifierParams { + client: verifier_client.clone(), + create_inherent_data_providers: move |parent_hash, _| { + let cidp_client = verifier_client.clone(); + async move { + let slot_duration = + cumulus_client_consensus_aura::slot_duration_at(&*cidp_client, parent_hash)?; + let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); + + let slot = + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); + + Ok((slot, timestamp)) + } + }, + telemetry: telemetry_handle, + }); let relay_chain_verifier = Box::new(RelayChainVerifier::new(client.clone(), |_, _| async { Ok(()) })) as Box<_>; @@ -592,7 +572,7 @@ where let verifier = Verifier { client, relay_chain_verifier, - aura_verifier: BuildOnAccess::Uninitialized(Some(Box::new(aura_verifier))), + aura_verifier: Box::new(aura_verifier), _phantom: PhantomData, }; @@ -632,7 +612,7 @@ pub async fn start_generic_aura_lookahead_node> /// /// Uses the lookahead collator to support async backing. #[sc_tracing::logging::prefix_logs_with("Parachain")] -pub async fn start_asset_hub_lookahead_node( +pub async fn start_asset_hub_lookahead_node( parachain_config: Configuration, polkadot_config: Configuration, collator_options: CollatorOptions, @@ -644,6 +624,7 @@ where RuntimeApi::RuntimeApi: AuraRuntimeApi + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi + substrate_frame_rpc_system::AccountNonceApi, + AuraId: AuraIdT + Sync, Net: NetworkBackend, { start_node_impl::( diff --git a/prdoc/pr_4844.prdoc b/prdoc/pr_4844.prdoc new file mode 100644 index 00000000000..999e63c84ed --- /dev/null +++ b/prdoc/pr_4844.prdoc @@ -0,0 +1,34 @@ +title: Make `Verifier::verify` and `BlockImport::check_block` use `&self` instead of `&mut self` + +doc: + - audience: Node Dev + description: | + `Verifier::verify` and `BlockImport::check_block` were refactored to use `&self` instead of `&mut self` + because there is no fundamental requirement for those operations to be exclusive in nature. + +crates: +- name: sc-consensus + bump: major + validate: false +- name: sc-consensus-aura + bump: major +- name: sc-consensus-babe + bump: major +- name: sc-consensus-beefy + bump: major +- name: sc-consensus-grandpa + bump: major +- name: sc-consensus-manual-seal + bump: major +- name: sc-consensus-pow + bump: major +- name: sc-service + bump: major +- name: cumulus-client-consensus-common + bump: major +- name: cumulus-client-consensus-aura + bump: major +- name: cumulus-client-consensus-relay-chain + bump: major +- name: polkadot-parachain-bin + validate: false diff --git a/substrate/client/consensus/aura/src/import_queue.rs b/substrate/client/consensus/aura/src/import_queue.rs index a8777ef8788..79f4faa5ebf 100644 --- a/substrate/client/consensus/aura/src/import_queue.rs +++ b/substrate/client/consensus/aura/src/import_queue.rs @@ -174,7 +174,7 @@ where CIDP::InherentDataProviders: InherentDataProviderExt + Send + Sync, { async fn verify( - &mut self, + &self, mut block: BlockImportParams, ) -> Result, String> { // Skip checks that include execution, if being told so or when importing only state. diff --git a/substrate/client/consensus/babe/src/lib.rs b/substrate/client/consensus/babe/src/lib.rs index 0c85de24004..0c1eb887586 100644 --- a/substrate/client/consensus/babe/src/lib.rs +++ b/substrate/client/consensus/babe/src/lib.rs @@ -1128,7 +1128,7 @@ where CIDP::InherentDataProviders: InherentDataProviderExt + Send + Sync, { async fn verify( - &mut self, + &self, mut block: BlockImportParams, ) -> Result, String> { trace!( @@ -1681,7 +1681,7 @@ where } async fn check_block( - &mut self, + &self, block: BlockCheckParams, ) -> Result { self.inner.check_block(block).await.map_err(Into::into) diff --git a/substrate/client/consensus/babe/src/tests.rs b/substrate/client/consensus/babe/src/tests.rs index 716067ae400..6f805188b9a 100644 --- a/substrate/client/consensus/babe/src/tests.rs +++ b/substrate/client/consensus/babe/src/tests.rs @@ -143,11 +143,11 @@ thread_local! { pub struct PanickingBlockImport(B); #[async_trait::async_trait] -impl> BlockImport for PanickingBlockImport +impl BlockImport for PanickingBlockImport where - B: Send, + BI: BlockImport + Send + Sync, { - type Error = B::Error; + type Error = BI::Error; async fn import_block( &mut self, @@ -157,7 +157,7 @@ where } async fn check_block( - &mut self, + &self, block: BlockCheckParams, ) -> Result { Ok(self.0.check_block(block).await.expect("checking block failed")) @@ -198,7 +198,7 @@ impl Verifier for TestVerifier { /// new set of validators to import. If not, err with an Error-Message /// presented to the User in the logs. async fn verify( - &mut self, + &self, mut block: BlockImportParams, ) -> Result, String> { // apply post-sealing mutations (i.e. stripping seal, if desired). diff --git a/substrate/client/consensus/beefy/src/import.rs b/substrate/client/consensus/beefy/src/import.rs index c01fb3db484..84802685293 100644 --- a/substrate/client/consensus/beefy/src/import.rs +++ b/substrate/client/consensus/beefy/src/import.rs @@ -192,7 +192,7 @@ where } async fn check_block( - &mut self, + &self, block: BlockCheckParams, ) -> Result { self.inner.check_block(block).await diff --git a/substrate/client/consensus/common/src/block_import.rs b/substrate/client/consensus/common/src/block_import.rs index d91851aea62..c5adbb5a5fc 100644 --- a/substrate/client/consensus/common/src/block_import.rs +++ b/substrate/client/consensus/common/src/block_import.rs @@ -307,10 +307,7 @@ pub trait BlockImport { type Error: std::error::Error + Send + 'static; /// Check block preconditions. - async fn check_block( - &mut self, - block: BlockCheckParams, - ) -> Result; + async fn check_block(&self, block: BlockCheckParams) -> Result; /// Import a block. async fn import_block( @@ -324,10 +321,7 @@ impl BlockImport for crate::import_queue::BoxBlockImport { type Error = sp_consensus::error::Error; /// Check block preconditions. - async fn check_block( - &mut self, - block: BlockCheckParams, - ) -> Result { + async fn check_block(&self, block: BlockCheckParams) -> Result { (**self).check_block(block).await } @@ -348,10 +342,7 @@ where { type Error = E; - async fn check_block( - &mut self, - block: BlockCheckParams, - ) -> Result { + async fn check_block(&self, block: BlockCheckParams) -> Result { (&**self).check_block(block).await } diff --git a/substrate/client/consensus/common/src/import_queue.rs b/substrate/client/consensus/common/src/import_queue.rs index 1ddda04126a..35fc8ad4a40 100644 --- a/substrate/client/consensus/common/src/import_queue.rs +++ b/substrate/client/consensus/common/src/import_queue.rs @@ -28,6 +28,10 @@ //! queues to be instantiated simply. use log::{debug, trace}; +use std::{ + fmt, + time::{Duration, Instant}, +}; use sp_consensus::{error::Error as ConsensusError, BlockOrigin}; use sp_runtime::{ @@ -93,11 +97,10 @@ pub struct IncomingBlock { /// Verify a justification of a block #[async_trait::async_trait] -pub trait Verifier: Send { +pub trait Verifier: Send + Sync { /// Verify the given block data and return the `BlockImportParams` to /// continue the block import process. - async fn verify(&mut self, block: BlockImportParams) - -> Result, String>; + async fn verify(&self, block: BlockImportParams) -> Result, String>; } /// Blocks import queue API. @@ -166,16 +169,16 @@ pub trait Link: Send { /// Block import successful result. #[derive(Debug, PartialEq)] -pub enum BlockImportStatus { +pub enum BlockImportStatus { /// Imported known block. - ImportedKnown(N, Option), + ImportedKnown(BlockNumber, Option), /// Imported unknown block. - ImportedUnknown(N, ImportedAux, Option), + ImportedUnknown(BlockNumber, ImportedAux, Option), } -impl BlockImportStatus { +impl BlockImportStatus { /// Returns the imported block number. - pub fn number(&self) -> &N { + pub fn number(&self) -> &BlockNumber { match self { BlockImportStatus::ImportedKnown(n, _) | BlockImportStatus::ImportedUnknown(n, _, _) => n, @@ -224,44 +227,30 @@ pub async fn import_single_block>( block: IncomingBlock, verifier: &mut V, ) -> BlockImportResult { - import_single_block_metered(import_handle, block_origin, block, verifier, None).await + match verify_single_block_metered(import_handle, block_origin, block, verifier, None).await? { + SingleBlockVerificationOutcome::Imported(import_status) => Ok(import_status), + SingleBlockVerificationOutcome::Verified(import_parameters) => + import_single_block_metered(import_handle, import_parameters, None).await, + } } -/// Single block import function with metering. -pub(crate) async fn import_single_block_metered>( - import_handle: &mut impl BlockImport, - block_origin: BlockOrigin, - block: IncomingBlock, - verifier: &mut V, - metrics: Option, -) -> BlockImportResult { - let peer = block.origin; - - let (header, justifications) = match (block.header, block.justifications) { - (Some(header), justifications) => (header, justifications), - (None, _) => { - if let Some(ref peer) = peer { - debug!(target: LOG_TARGET, "Header {} was not provided by {} ", block.hash, peer); - } else { - debug!(target: LOG_TARGET, "Header {} was not provided ", block.hash); - } - return Err(BlockImportError::IncompleteHeader(peer)) - }, - }; - - trace!(target: LOG_TARGET, "Header {} has {:?} logs", block.hash, header.digest().logs().len()); - - let number = *header.number(); - let hash = block.hash; - let parent_hash = *header.parent_hash(); - - let import_handler = |import| match import { +fn import_handler( + number: NumberFor, + hash: Block::Hash, + parent_hash: Block::Hash, + block_origin: Option, + import: Result, +) -> Result>, BlockImportError> +where + Block: BlockT, +{ + match import { Ok(ImportResult::AlreadyInChain) => { trace!(target: LOG_TARGET, "Block already in chain {}: {:?}", number, hash); - Ok(BlockImportStatus::ImportedKnown(number, peer)) + Ok(BlockImportStatus::ImportedKnown(number, block_origin)) }, Ok(ImportResult::Imported(aux)) => - Ok(BlockImportStatus::ImportedUnknown(number, aux, peer)), + Ok(BlockImportStatus::ImportedUnknown(number, aux, block_origin)), Ok(ImportResult::MissingState) => { debug!( target: LOG_TARGET, @@ -278,15 +267,60 @@ pub(crate) async fn import_single_block_metered>( }, Ok(ImportResult::KnownBad) => { debug!(target: LOG_TARGET, "Peer gave us a bad block {}: {:?}", number, hash); - Err(BlockImportError::BadBlock(peer)) + Err(BlockImportError::BadBlock(block_origin)) }, Err(e) => { debug!(target: LOG_TARGET, "Error importing block {}: {:?}: {}", number, hash, e); Err(BlockImportError::Other(e)) }, + } +} + +pub(crate) enum SingleBlockVerificationOutcome { + /// Block is already imported. + Imported(BlockImportStatus>), + /// Block is verified, but needs to be imported. + Verified(SingleBlockImportParameters), +} + +pub(crate) struct SingleBlockImportParameters { + import_block: BlockImportParams, + hash: Block::Hash, + block_origin: Option, + verification_time: Duration, +} + +/// Single block import function with metering. +pub(crate) async fn verify_single_block_metered>( + import_handle: &impl BlockImport, + block_origin: BlockOrigin, + block: IncomingBlock, + verifier: &mut V, + metrics: Option<&Metrics>, +) -> Result, BlockImportError> { + let peer = block.origin; + let justifications = block.justifications; + + let Some(header) = block.header else { + if let Some(ref peer) = peer { + debug!(target: LOG_TARGET, "Header {} was not provided by {peer} ", block.hash); + } else { + debug!(target: LOG_TARGET, "Header {} was not provided ", block.hash); + } + return Err(BlockImportError::IncompleteHeader(peer)) }; - match import_handler( + trace!(target: LOG_TARGET, "Header {} has {:?} logs", block.hash, header.digest().logs().len()); + + let number = *header.number(); + let hash = block.hash; + let parent_hash = *header.parent_hash(); + + match import_handler::( + number, + hash, + parent_hash, + peer, import_handle .check_block(BlockCheckParams { hash, @@ -299,10 +333,13 @@ pub(crate) async fn import_single_block_metered>( .await, )? { BlockImportStatus::ImportedUnknown { .. } => (), - r => return Ok(r), // Any other successful result means that the block is already imported. + r => { + // Any other successful result means that the block is already imported. + return Ok(SingleBlockVerificationOutcome::Imported(r)) + }, } - let started = std::time::Instant::now(); + let started = Instant::now(); let mut import_block = BlockImportParams::new(block_origin, header); import_block.body = block.body; @@ -333,19 +370,42 @@ pub(crate) async fn import_single_block_metered>( } else { trace!(target: LOG_TARGET, "Verifying {}({}) failed: {}", number, hash, msg); } - if let Some(metrics) = metrics.as_ref() { + if let Some(metrics) = metrics { metrics.report_verification(false, started.elapsed()); } BlockImportError::VerificationFailed(peer, msg) })?; - if let Some(metrics) = metrics.as_ref() { - metrics.report_verification(true, started.elapsed()); + let verification_time = started.elapsed(); + if let Some(metrics) = metrics { + metrics.report_verification(true, verification_time); } + Ok(SingleBlockVerificationOutcome::Verified(SingleBlockImportParameters { + import_block, + hash, + block_origin: peer, + verification_time, + })) +} + +pub(crate) async fn import_single_block_metered( + import_handle: &mut impl BlockImport, + import_parameters: SingleBlockImportParameters, + metrics: Option<&Metrics>, +) -> BlockImportResult { + let started = Instant::now(); + + let SingleBlockImportParameters { import_block, hash, block_origin, verification_time } = + import_parameters; + + let number = *import_block.header.number(); + let parent_hash = *import_block.header.parent_hash(); + let imported = import_handle.import_block(import_block).await; - if let Some(metrics) = metrics.as_ref() { - metrics.report_verification_and_import(started.elapsed()); + if let Some(metrics) = metrics { + metrics.report_verification_and_import(started.elapsed() + verification_time); } - import_handler(imported) + + import_handler::(number, hash, parent_hash, block_origin, imported) } diff --git a/substrate/client/consensus/common/src/import_queue/basic_queue.rs b/substrate/client/consensus/common/src/import_queue/basic_queue.rs index e5eac3896cc..05f2b252796 100644 --- a/substrate/client/consensus/common/src/import_queue/basic_queue.rs +++ b/substrate/client/consensus/common/src/import_queue/basic_queue.rs @@ -32,9 +32,9 @@ use std::pin::Pin; use crate::{ import_queue::{ buffered_link::{self, BufferedLinkReceiver, BufferedLinkSender}, - import_single_block_metered, BlockImportError, BlockImportStatus, BoxBlockImport, - BoxJustificationImport, ImportQueue, ImportQueueService, IncomingBlock, Link, - RuntimeOrigin, Verifier, LOG_TARGET, + import_single_block_metered, verify_single_block_metered, BlockImportError, + BlockImportStatus, BoxBlockImport, BoxJustificationImport, ImportQueue, ImportQueueService, + IncomingBlock, Link, RuntimeOrigin, SingleBlockVerificationOutcome, Verifier, LOG_TARGET, }, metrics::Metrics, }; @@ -60,13 +60,16 @@ impl BasicQueue { /// Instantiate a new basic queue, with given verifier. /// /// This creates a background task, and calls `on_start` on the justification importer. - pub fn new>( + pub fn new( verifier: V, block_import: BoxBlockImport, justification_import: Option>, spawner: &impl sp_core::traits::SpawnEssentialNamed, prometheus_registry: Option<&Registry>, - ) -> Self { + ) -> Self + where + V: Verifier + 'static, + { let (result_sender, result_port) = buffered_link::buffered_link(100_000); let metrics = prometheus_registry.and_then(|r| { @@ -252,7 +255,7 @@ struct BlockImportWorker { } impl BlockImportWorker { - fn new>( + fn new( result_sender: BufferedLinkSender, verifier: V, block_import: BoxBlockImport, @@ -262,7 +265,10 @@ impl BlockImportWorker { impl Future + Send, TracingUnboundedSender>, TracingUnboundedSender>, - ) { + ) + where + V: Verifier + 'static, + { use worker_messages::*; let (justification_sender, mut justification_port) = @@ -419,15 +425,22 @@ async fn import_many_blocks>( let import_result = if has_error { Err(BlockImportError::Cancelled) } else { - // The actual import. - import_single_block_metered( + let verification_fut = verify_single_block_metered( import_handle, blocks_origin, block, verifier, - metrics.clone(), - ) - .await + metrics.as_ref(), + ); + match verification_fut.await { + Ok(SingleBlockVerificationOutcome::Imported(import_status)) => Ok(import_status), + Ok(SingleBlockVerificationOutcome::Verified(import_parameters)) => { + // The actual import. + import_single_block_metered(import_handle, import_parameters, metrics.as_ref()) + .await + }, + Err(e) => Err(e), + } }; if let Some(metrics) = metrics.as_ref() { @@ -494,7 +507,7 @@ mod tests { #[async_trait::async_trait] impl Verifier for () { async fn verify( - &mut self, + &self, block: BlockImportParams, ) -> Result, String> { Ok(BlockImportParams::new(block.origin, block.header)) @@ -506,7 +519,7 @@ mod tests { type Error = sp_consensus::Error; async fn check_block( - &mut self, + &self, _block: BlockCheckParams, ) -> Result { Ok(ImportResult::imported(false)) diff --git a/substrate/client/consensus/grandpa/src/import.rs b/substrate/client/consensus/grandpa/src/import.rs index b594c0f678c..8b7b02f180e 100644 --- a/substrate/client/consensus/grandpa/src/import.rs +++ b/substrate/client/consensus/grandpa/src/import.rs @@ -518,7 +518,7 @@ where Client: ClientForGrandpa, Client::Api: GrandpaApi, for<'a> &'a Client: BlockImport, - SC: Send, + SC: Send + Sync, { type Error = ConsensusError; @@ -697,7 +697,7 @@ where } async fn check_block( - &mut self, + &self, block: BlockCheckParams, ) -> Result { self.inner.check_block(block).await diff --git a/substrate/client/consensus/manual-seal/src/consensus/babe.rs b/substrate/client/consensus/manual-seal/src/consensus/babe.rs index bc56ce02271..a68e46f0134 100644 --- a/substrate/client/consensus/manual-seal/src/consensus/babe.rs +++ b/substrate/client/consensus/manual-seal/src/consensus/babe.rs @@ -96,7 +96,7 @@ where C: HeaderBackend + HeaderMetadata, { async fn verify( - &mut self, + &self, mut import_params: BlockImportParams, ) -> Result, String> { import_params.finalized = false; diff --git a/substrate/client/consensus/manual-seal/src/lib.rs b/substrate/client/consensus/manual-seal/src/lib.rs index 8fc7e7ecab2..39f8f8609d8 100644 --- a/substrate/client/consensus/manual-seal/src/lib.rs +++ b/substrate/client/consensus/manual-seal/src/lib.rs @@ -65,7 +65,7 @@ struct ManualSealVerifier; #[async_trait::async_trait] impl Verifier for ManualSealVerifier { async fn verify( - &mut self, + &self, mut block: BlockImportParams, ) -> Result, String> { block.finalized = false; diff --git a/substrate/client/consensus/pow/src/lib.rs b/substrate/client/consensus/pow/src/lib.rs index ee5c1dfc6f1..50e9533abb3 100644 --- a/substrate/client/consensus/pow/src/lib.rs +++ b/substrate/client/consensus/pow/src/lib.rs @@ -312,10 +312,7 @@ where { type Error = ConsensusError; - async fn check_block( - &mut self, - block: BlockCheckParams, - ) -> Result { + async fn check_block(&self, block: BlockCheckParams) -> Result { self.inner.check_block(block).await.map_err(Into::into) } @@ -442,7 +439,7 @@ where Algorithm::Difficulty: 'static + Send, { async fn verify( - &mut self, + &self, mut block: BlockImportParams, ) -> Result, String> { let hash = block.header.hash(); diff --git a/substrate/client/network/test/src/lib.rs b/substrate/client/network/test/src/lib.rs index 8a8f9608051..221c8515d6d 100644 --- a/substrate/client/network/test/src/lib.rs +++ b/substrate/client/network/test/src/lib.rs @@ -114,7 +114,7 @@ impl PassThroughVerifier { #[async_trait::async_trait] impl Verifier for PassThroughVerifier { async fn verify( - &mut self, + &self, mut block: BlockImportParams, ) -> Result, String> { if block.fork_choice.is_none() { @@ -210,7 +210,7 @@ impl BlockImport for PeersClient { type Error = ConsensusError; async fn check_block( - &mut self, + &self, block: BlockCheckParams, ) -> Result { self.client.check_block(block).await @@ -600,7 +600,7 @@ where type Error = ConsensusError; async fn check_block( - &mut self, + &self, block: BlockCheckParams, ) -> Result { self.inner.check_block(block).await @@ -622,10 +622,7 @@ struct VerifierAdapter { #[async_trait::async_trait] impl Verifier for VerifierAdapter { - async fn verify( - &mut self, - block: BlockImportParams, - ) -> Result, String> { + async fn verify(&self, block: BlockImportParams) -> Result, String> { let hash = block.header.hash(); self.verifier.lock().await.verify(block).await.map_err(|e| { self.failed_verifications.lock().insert(hash, e.clone()); diff --git a/substrate/client/network/test/src/service.rs b/substrate/client/network/test/src/service.rs index 150c1db7560..c4a2b261081 100644 --- a/substrate/client/network/test/src/service.rs +++ b/substrate/client/network/test/src/service.rs @@ -134,7 +134,7 @@ impl TestNetworkBuilder { #[async_trait::async_trait] impl sc_consensus::Verifier for PassThroughVerifier { async fn verify( - &mut self, + &self, mut block: sc_consensus::BlockImportParams, ) -> Result, String> { block.finalized = self.0; diff --git a/substrate/client/service/src/client/client.rs b/substrate/client/service/src/client/client.rs index 2fbcc3ba4f7..a2c9212f7b9 100644 --- a/substrate/client/service/src/client/client.rs +++ b/substrate/client/service/src/client/client.rs @@ -1780,7 +1780,7 @@ where /// Check block preconditions. async fn check_block( - &mut self, + &self, block: BlockCheckParams, ) -> Result { let BlockCheckParams { @@ -1862,10 +1862,10 @@ where } async fn check_block( - &mut self, + &self, block: BlockCheckParams, ) -> Result { - (&*self).check_block(block).await + (&self).check_block(block).await } } -- GitLab From 20aecadbc7ed2e9fe3b8a7d345f1be301fc00ba0 Mon Sep 17 00:00:00 2001 From: Muharem Date: Wed, 26 Jun 2024 10:13:50 +0200 Subject: [PATCH 055/130] [FRAME] Remove storage migration type (#3828) Introduce migration type to remove data associated with a specific storage of a pallet. Based on existing `RemovePallet` migration type. Required for https://github.com/paritytech/polkadot-sdk/pull/3820 --------- Co-authored-by: Liam Aharon Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --- prdoc/pr_3828.prdoc | 13 +++ substrate/frame/support/src/migrations.rs | 114 +++++++++++++++++++++- 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 prdoc/pr_3828.prdoc diff --git a/prdoc/pr_3828.prdoc b/prdoc/pr_3828.prdoc new file mode 100644 index 00000000000..426625d5f23 --- /dev/null +++ b/prdoc/pr_3828.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[FRAME] Remove storage migration type" + +doc: + - audience: Runtime Dev + description: | + Introduce migration type to remove data associated with a specific storage of a pallet. + +crates: + - name: frame-support + bump: minor diff --git a/substrate/frame/support/src/migrations.rs b/substrate/frame/support/src/migrations.rs index 968639e02d3..fa018d74365 100644 --- a/substrate/frame/support/src/migrations.rs +++ b/substrate/frame/support/src/migrations.rs @@ -17,7 +17,7 @@ use crate::{ defensive, - storage::transactional::with_transaction_opaque_err, + storage::{storage_prefix, transactional::with_transaction_opaque_err}, traits::{ Defensive, GetStorageVersion, NoStorageVersionSet, PalletInfoAccess, SafeMode, StorageVersion, @@ -369,6 +369,118 @@ impl, DbWeight: Get> frame_support::traits } } +/// `RemoveStorage` is a utility struct used to remove a storage item from a specific pallet. +/// +/// This struct is generic over three parameters: +/// - `P` is a type that implements the [`Get`] trait for a static string, representing the pallet's +/// name. +/// - `S` is a type that implements the [`Get`] trait for a static string, representing the storage +/// name. +/// - `DbWeight` is a type that implements the [`Get`] trait for [`RuntimeDbWeight`], providing the +/// weight for database operations. +/// +/// On runtime upgrade, the `on_runtime_upgrade` function will clear the storage from the specified +/// storage, logging the number of keys removed. If the `try-runtime` feature is enabled, the +/// `pre_upgrade` and `post_upgrade` functions can be used to verify the storage removal before and +/// after the upgrade. +/// +/// # Examples: +/// ```ignore +/// construct_runtime! { +/// pub enum Runtime +/// { +/// System: frame_system = 0, +/// +/// SomePallet: pallet_something = 1, +/// +/// YourOtherPallets... +/// } +/// }; +/// +/// parameter_types! { +/// pub const SomePallet: &'static str = "SomePallet"; +/// pub const StorageAccounts: &'static str = "Accounts"; +/// pub const StorageAccountCount: &'static str = "AccountCount"; +/// } +/// +/// pub type Migrations = ( +/// RemoveStorage, +/// RemoveStorage, +/// AnyOtherMigrations... +/// ); +/// +/// pub type Executive = frame_executive::Executive< +/// Runtime, +/// Block, +/// frame_system::ChainContext, +/// Runtime, +/// Migrations +/// >; +/// ``` +/// +/// WARNING: `RemoveStorage` has no guard rails preventing it from bricking the chain if the +/// operation of removing storage for the given pallet would exceed the block weight limit. +/// +/// If your storage has too many keys to be removed in a single block, it is advised to wait for +/// a multi-block scheduler currently under development which will allow for removal of storage +/// items (and performing other heavy migrations) over multiple blocks +/// (see ). +pub struct RemoveStorage, S: Get<&'static str>, DbWeight: Get>( + PhantomData<(P, S, DbWeight)>, +); +impl, S: Get<&'static str>, DbWeight: Get> + frame_support::traits::OnRuntimeUpgrade for RemoveStorage +{ + fn on_runtime_upgrade() -> frame_support::weights::Weight { + let hashed_prefix = storage_prefix(P::get().as_bytes(), S::get().as_bytes()); + let keys_removed = match clear_prefix(&hashed_prefix, None) { + KillStorageResult::AllRemoved(value) => value, + KillStorageResult::SomeRemaining(value) => { + log::error!( + "`clear_prefix` failed to remove all keys for storage `{}` from pallet `{}`. THIS SHOULD NEVER HAPPEN! 🚨", + S::get(), P::get() + ); + value + }, + } as u64; + + log::info!("Removed `{}` `{}` `{}` keys 🧹", keys_removed, P::get(), S::get()); + + DbWeight::get().reads_writes(keys_removed + 1, keys_removed) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + use crate::storage::unhashed::contains_prefixed_key; + + let hashed_prefix = storage_prefix(P::get().as_bytes(), S::get().as_bytes()); + match contains_prefixed_key(&hashed_prefix) { + true => log::info!("Found `{}` `{}` keys pre-removal 👀", P::get(), S::get()), + false => log::warn!( + "Migration RemoveStorage<{}, {}> can be removed (no keys found pre-removal).", + P::get(), + S::get() + ), + }; + Ok(Default::default()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(_state: sp_std::vec::Vec) -> Result<(), sp_runtime::TryRuntimeError> { + use crate::storage::unhashed::contains_prefixed_key; + + let hashed_prefix = storage_prefix(P::get().as_bytes(), S::get().as_bytes()); + match contains_prefixed_key(&hashed_prefix) { + true => { + log::error!("`{}` `{}` has keys remaining post-removal ❗", P::get(), S::get()); + return Err("Keys remaining post-removal, this should never happen 🚨".into()) + }, + false => log::info!("No `{}` `{}` keys found post-removal 🎉", P::get(), S::get()), + }; + Ok(()) + } +} + /// A migration that can proceed in multiple steps. pub trait SteppedMigration { /// The cursor type that stores the progress (aka. state) of this migration. -- GitLab From 7a2592e8458f8b3c5d9683eb02380a0f5959b5b3 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 26 Jun 2024 12:25:24 +0200 Subject: [PATCH 056/130] rpc: upgrade jsonrpsee v0.23 (#4730) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is PR updates jsonrpsee v0.23 which mainly changes: - Add `Extensions` which we now is using to get the connection id (used by the rpc spec v2 impl) - Update hyper to v1.0, http v1.0, soketto and related crates (hyper::service::make_service_fn is removed) - The subscription API for the client is modified to know why a subscription was closed. Full changelog here: https://github.com/paritytech/jsonrpsee/releases/tag/v0.23.0 --------- Co-authored-by: Bastian Köcher --- Cargo.lock | 400 +++++++++++++----- Cargo.toml | 7 +- bridges/relays/client-substrate/Cargo.toml | 1 + .../src/client/subscription.rs | 3 +- .../src/light_client_worker.rs | 4 +- prdoc/pr_4730.prdoc | 25 ++ substrate/client/rpc-servers/Cargo.toml | 12 +- substrate/client/rpc-servers/src/lib.rs | 82 ++-- .../rpc-servers/src/middleware/node_health.rs | 42 +- substrate/client/rpc-servers/src/utils.rs | 14 +- .../client/rpc-spec-v2/src/chain_head/api.rs | 14 +- .../rpc-spec-v2/src/chain_head/chain_head.rs | 86 ++-- .../src/chain_head/subscription/inner.rs | 15 +- .../rpc-spec-v2/src/common/connections.rs | 45 +- .../client/rpc-spec-v2/src/transaction/api.rs | 4 +- .../src/transaction/transaction_broadcast.rs | 24 +- substrate/client/rpc/src/utils.rs | 31 +- .../frame/remote-externalities/src/lib.rs | 7 +- 18 files changed, 548 insertions(+), 268 deletions(-) create mode 100644 prdoc/pr_4730.prdoc diff --git a/Cargo.lock b/Cargo.lock index 5935e7ba730..537adb68792 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1307,7 +1307,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" dependencies = [ - "http", + "http 0.2.9", "log", "url", ] @@ -1414,6 +1414,12 @@ version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -1536,9 +1542,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -2491,6 +2497,12 @@ dependencies = [ "libc", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cexpr" version = "0.6.0" @@ -3207,9 +3219,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -3217,9 +3229,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core2" @@ -6548,7 +6560,26 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.9", + "indexmap 2.2.3", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", "indexmap 2.2.3", "slab", "tokio", @@ -6756,6 +6787,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.5" @@ -6763,15 +6805,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", - "http", + "http 0.2.9", "pin-project-lite 0.2.12", ] [[package]] -name = "http-range-header" -version = "0.3.1" +name = "http-body" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite 0.2.12", +] [[package]] name = "httparse" @@ -6801,9 +6860,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.26", + "http 0.2.9", + "http-body 0.4.5", "httparse", "httpdate", "itoa", @@ -6815,6 +6874,27 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.5", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", + "pin-project-lite 0.2.12", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.1" @@ -6822,8 +6902,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.9", + "hyper 0.14.27", "log", "rustls 0.21.7", "rustls-native-certs 0.6.3", @@ -6831,6 +6911,44 @@ dependencies = [ "tokio-rustls 0.24.1", ] +[[package]] +name = "hyper-rustls" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.3.1", + "hyper-util", + "log", + "rustls 0.23.10", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.3.1", + "pin-project-lite 0.2.12", + "socket2 0.5.6", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.57" @@ -6914,8 +7032,8 @@ dependencies = [ "attohttpc", "bytes", "futures", - "http", - "hyper", + "http 0.2.9", + "hyper 0.14.27", "log", "rand 0.8.5", "tokio", @@ -7139,7 +7257,7 @@ dependencies = [ "encoding_rs", "event-listener 2.5.3", "futures-lite 1.13.0", - "http", + "http 0.2.9", "log", "mime", "once_cell", @@ -7176,6 +7294,26 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "jobserver" version = "0.1.26" @@ -7213,9 +7351,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.22.5" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdb12a2381ea5b2e68c3469ec604a007b367778cdb14d09612c8069ebd616ad" +checksum = "62b089779ad7f80768693755a031cc14a7766aba707cbe886674e3f79e9b7e47" dependencies = [ "jsonrpsee-core", "jsonrpsee-http-client", @@ -7229,20 +7367,22 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.22.5" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4978087a58c3ab02efc5b07c5e5e2803024536106fd5506f558db172c889b3aa" +checksum = "08163edd8bcc466c33d79e10f695cdc98c00d1e6ddfb95cec41b6b0279dd5432" dependencies = [ + "base64 0.22.1", "futures-util", - "http", + "http 1.1.0", "jsonrpsee-core", "pin-project", - "rustls-native-certs 0.7.0", + "rustls 0.23.10", "rustls-pki-types", - "soketto", + "rustls-platform-verifier", + "soketto 0.8.0", "thiserror", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls 0.26.0", "tokio-util", "tracing", "url", @@ -7250,16 +7390,19 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.22.5" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b257e1ec385e07b0255dde0b933f948b5c8b8c28d42afda9587c3a967b896d" +checksum = "79712302e737d23ca0daa178e752c9334846b08321d439fd89af9a384f8c830b" dependencies = [ "anyhow", "async-trait", "beef", + "bytes", "futures-timer", "futures-util", - "hyper", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", "jsonrpsee-types", "parking_lot 0.12.1", "pin-project", @@ -7275,15 +7418,20 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.22.5" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ccf93fc4a0bfe05d851d37d7c32b7f370fe94336b52a2f0efc5f1981895c2e5" +checksum = "2d90064e04fb9d7282b1c71044ea94d0bbc6eff5621c66f1a0bce9e9de7cf3ac" dependencies = [ "async-trait", - "hyper", - "hyper-rustls", + "base64 0.22.1", + "http-body 1.0.0", + "hyper 1.3.1", + "hyper-rustls 0.27.2", + "hyper-util", "jsonrpsee-core", "jsonrpsee-types", + "rustls 0.23.10", + "rustls-platform-verifier", "serde", "serde_json", "thiserror", @@ -7295,11 +7443,11 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" -version = "0.22.5" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d0bb047e79a143b32ea03974a6bf59b62c2a4c5f5d42a381c907a8bbb3f75c0" +checksum = "7895f186d5921065d96e16bd795e5ca89ac8356ec423fafc6e3d7cf8ec11aee4" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro-crate 3.1.0", "proc-macro2 1.0.82", "quote 1.0.35", @@ -7308,20 +7456,24 @@ dependencies = [ [[package]] name = "jsonrpsee-server" -version = "0.22.5" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12d8b6a9674422a8572e0b0abb12feeb3f2aeda86528c80d0350c2bd0923ab41" +checksum = "654afab2e92e5d88ebd8a39d6074483f3f2bfdf91c5ac57fe285e7127cdd4f51" dependencies = [ + "anyhow", "futures-util", - "http", - "hyper", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.3.1", + "hyper-util", "jsonrpsee-core", "jsonrpsee-types", "pin-project", "route-recognizer", "serde", "serde_json", - "soketto", + "soketto 0.8.0", "thiserror", "tokio", "tokio-stream", @@ -7332,12 +7484,12 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.22.5" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "150d6168405890a7a3231a3c74843f58b8959471f6df76078db2619ddee1d07d" +checksum = "d9c465fbe385238e861fdc4d1c85e04ada6c1fd246161d26385c1b311724d2af" dependencies = [ - "anyhow", "beef", + "http 1.1.0", "serde", "serde_json", "thiserror", @@ -7345,11 +7497,11 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.22.5" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58b9db2dfd5bb1194b0ce921504df9ceae210a345bc2f6c5a61432089bbab070" +checksum = "1c28759775f5cb2f1ea9667672d3fe2b0e701d1f4b7b67954e60afe7fd058b5e" dependencies = [ - "http", + "http 1.1.0", "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-types", @@ -7971,9 +8123,9 @@ dependencies = [ "parking_lot 0.12.1", "quicksink", "rw-stream-sink", - "soketto", + "soketto 0.7.1", "url", - "webpki-roots", + "webpki-roots 0.25.2", ] [[package]] @@ -8999,7 +9151,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.6.0", "cfg-if", "cfg_aliases", "libc", @@ -9407,7 +9559,7 @@ version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -13541,7 +13693,7 @@ dependencies = [ "bs58 0.5.0", "futures", "futures-timer", - "hyper", + "hyper 0.14.27", "log", "parity-scale-codec", "polkadot-primitives", @@ -15359,7 +15511,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "731e0d9356b0c25f16f33b5be79b1c57b562f141ebfcdb0ad8ac2c13a24293b4" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.6.0", "chrono", "flate2", "hex", @@ -15374,7 +15526,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3554923a69f4ce04c4a754260c338f505ce22642d3830e049a399fc2059a29" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.6.0", "chrono", "hex", ] @@ -15436,7 +15588,7 @@ checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.4.0", + "bitflags 2.6.0", "lazy_static", "num-traits", "rand 0.8.5", @@ -16139,6 +16291,7 @@ dependencies = [ "sc-rpc-api", "sc-transaction-pool-api", "scale-info", + "serde_json", "sp-consensus-grandpa", "sp-core", "sp-rpc", @@ -16203,11 +16356,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", + "h2 0.3.26", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.27", + "hyper-rustls 0.24.1", "ipnet", "js-sys", "log", @@ -16227,7 +16380,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 0.25.2", "winreg", ] @@ -16727,7 +16880,7 @@ version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys 0.4.10", @@ -16759,14 +16912,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.2" +version = "0.23.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" dependencies = [ "log", + "once_cell", "ring 0.17.7", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.102.4", "subtle 2.5.0", "zeroize", ] @@ -16817,9 +16971,36 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.2.0" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + +[[package]] +name = "rustls-platform-verifier" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5f0d26fa1ce3c790f9590868f0109289a044acb954525f933e2aa3b871c157d" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.10", + "rustls-native-certs 0.7.0", + "rustls-platform-verifier-android", + "rustls-webpki 0.102.4", + "security-framework", + "security-framework-sys", + "webpki-roots 0.26.3", + "winapi", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" +checksum = "84e217e7fdc8466b5b35d30f8c0a30febd29173df4a3a0c2115d306b9c4117ad" [[package]] name = "rustls-webpki" @@ -16833,9 +17014,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "ring 0.17.7", "rustls-pki-types", @@ -17919,8 +18100,8 @@ dependencies = [ "fnv", "futures", "futures-timer", - "hyper", - "hyper-rustls", + "hyper 0.14.27", + "hyper-rustls 0.24.1", "lazy_static", "log", "num_cpus", @@ -18027,8 +18208,9 @@ dependencies = [ "forwarded-header-value", "futures", "governor", - "http", - "hyper", + "http 1.1.0", + "http-body-util", + "hyper 1.3.1", "ip_network", "jsonrpsee", "log", @@ -18631,22 +18813,23 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", + "num-bigint", "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -19074,7 +19257,7 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cae9a3fcdadafb6d97f4c0e007e4247b114ee0f119f650c3cbf3a8b3a1479694" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.6.0", ] [[package]] @@ -19219,7 +19402,7 @@ dependencies = [ "siphasher", "slab", "smallvec", - "soketto", + "soketto 0.7.1", "twox-hash", "wasmi 0.31.2", "x25519-dalek", @@ -19634,13 +19817,28 @@ dependencies = [ "base64 0.13.1", "bytes", "futures", - "http", "httparse", "log", "rand 0.8.5", "sha-1 0.9.8", ] +[[package]] +name = "soketto" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37468c595637c10857701c990f93a40ce0e357cedb0953d1c26c8d8027f9bb53" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures", + "http 1.1.0", + "httparse", + "log", + "rand 0.8.5", + "sha1", +] + [[package]] name = "solochain-template-node" version = "0.0.0" @@ -20869,7 +21067,7 @@ dependencies = [ "scale-info", "serde", "serde_json", - "soketto", + "soketto 0.7.1", "staging-node-inspect", "substrate-cli-test-utils", "tempfile", @@ -21241,7 +21439,7 @@ dependencies = [ name = "substrate-prometheus-endpoint" version = "0.17.0" dependencies = [ - "hyper", + "hyper 0.14.27", "log", "prometheus", "thiserror", @@ -22120,11 +22318,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.22.2", + "rustls 0.23.10", "rustls-pki-types", "tokio", ] @@ -22247,6 +22445,7 @@ dependencies = [ "futures-util", "pin-project", "pin-project-lite 0.2.12", + "tokio", "tower-layer", "tower-service", "tracing", @@ -22254,17 +22453,15 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.4.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ae70283aba8d2a8b411c695c437fe25b8b5e44e23e780662002fc72fb47a82" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.6.0", "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-range-header", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", "pin-project-lite 0.2.12", "tower-layer", "tower-service", @@ -22577,7 +22774,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 0.2.9", "httparse", "log", "rand 0.8.5", @@ -23384,6 +23581,15 @@ version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +[[package]] +name = "webpki-roots" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "westend-emulated-chain" version = "0.0.0" diff --git a/Cargo.toml b/Cargo.toml index 7eea70c31aa..9ddfedd5155 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -780,6 +780,7 @@ hkdf = { version = "0.12.0" } hmac = { version = "0.12.1" } honggfuzz = { version = "0.5.55" } http = { version = "0.2.8" } +http-body-util = { version = "0.1.2" } hyper = { version = "0.14.27", default-features = false } hyper-rustls = { version = "0.24.0" } impl-serde = { version = "0.4.0", default-features = false } @@ -793,8 +794,8 @@ is_executable = { version = "1.0.1" } isahc = { version = "1.2" } itertools = { version = "0.11" } jsonpath_lib = { version = "0.3" } -jsonrpsee = { version = "0.22.5" } -jsonrpsee-core = { version = "0.22" } +jsonrpsee = { version = "0.23.2" } +jsonrpsee-core = { version = "0.23.2" } k256 = { version = "0.13.3", default-features = false } kitchensink-runtime = { path = "substrate/bin/node/runtime" } kvdb = { version = "0.13.0" } @@ -1298,7 +1299,7 @@ tokio-util = { version = "0.7.8" } toml = { version = "0.8.8" } toml_edit = { version = "0.19" } tower = { version = "0.4.13" } -tower-http = { version = "0.4.0" } +tower-http = { version = "0.5.2" } tracing = { version = "0.1.37", default-features = false } tracing-core = { version = "0.1.32", default-features = false } tracing-futures = { version = "0.2.4" } diff --git a/bridges/relays/client-substrate/Cargo.toml b/bridges/relays/client-substrate/Cargo.toml index 6db4f3e9ef6..66501d03691 100644 --- a/bridges/relays/client-substrate/Cargo.toml +++ b/bridges/relays/client-substrate/Cargo.toml @@ -19,6 +19,7 @@ jsonrpsee = { features = ["macros", "ws-client"], workspace = true } log = { workspace = true } num-traits = { workspace = true, default-features = true } rand = { workspace = true, default-features = true } +serde_json = { workspace = true } scale-info = { features = ["derive"], workspace = true, default-features = true } tokio = { features = ["rt-multi-thread"], workspace = true, default-features = true } thiserror = { workspace = true } diff --git a/bridges/relays/client-substrate/src/client/subscription.rs b/bridges/relays/client-substrate/src/client/subscription.rs index 43a46573f98..9f08097cb58 100644 --- a/bridges/relays/client-substrate/src/client/subscription.rs +++ b/bridges/relays/client-substrate/src/client/subscription.rs @@ -21,7 +21,6 @@ use async_std::{ stream::StreamExt, }; use futures::{FutureExt, Stream}; -use jsonrpsee::core::ClientError; use sp_runtime::DeserializeOwned; use std::{ fmt::Debug, @@ -143,7 +142,7 @@ impl Subscription { /// Create new forwarded subscription. pub fn new_forwarded( desc: StreamDescription, - subscription: impl Stream> + Unpin + Send + 'static, + subscription: impl Stream> + Unpin + Send + 'static, ) -> Self { Self { desc: desc.clone(), diff --git a/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs b/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs index 9a49b60281b..2347dbb85f7 100644 --- a/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs +++ b/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs @@ -20,7 +20,7 @@ use futures::{channel::mpsc::Sender, prelude::*, stream::FuturesUnordered}; use jsonrpsee::core::client::{ - Client as JsonRpseeClient, ClientBuilder, ClientT, Error, ReceivedMessage, TransportReceiverT, + Client as JsonRpseeClient, ClientBuilder, ClientT, ReceivedMessage, TransportReceiverT, TransportSenderT, }; use smoldot_light::{ChainId, Client as SmoldotClient, JsonRpcResponses}; @@ -124,7 +124,7 @@ pub struct LightClientRpcWorker { } fn handle_notification( - maybe_header: Option>, + maybe_header: Option>, senders: &mut Vec>, ) -> Result<(), ()> { match maybe_header { diff --git a/prdoc/pr_4730.prdoc b/prdoc/pr_4730.prdoc new file mode 100644 index 00000000000..9af14534bcb --- /dev/null +++ b/prdoc/pr_4730.prdoc @@ -0,0 +1,25 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: rpc upgrade jsonrpsee to v0.23.1 + +doc: + - audience: Node Dev + description: | + Upgrade the rpc library jsonrpsee to v0.23.1 to utilize: + + - Add Extensions which we now is using to get the connection id (used by the rpc spec v2) + - Update hyper to v1.0, http v1.0, soketto and related crates (hyper::service::make_service_fn is removed) + - The subscription API for the client is modified to know why a subscription was closed. + +crates: + - name: sc-rpc-spec-v2 + bump: patch + - name: sc-rpc + bump: patch + - name: sc-rpc-server + bump: patch + - name: cumulus-relay-chain-rpc-interface + bump: patch + - name: frame-remote-externalities + bump: patch diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index d5b76b70c94..7986408d2b2 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -19,8 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] forwarded-header-value = { workspace = true } futures = { workspace = true } governor = { workspace = true } -http = { workspace = true } -hyper = { workspace = true, default-features = true } +http-body-util = { workspace = true } ip_network = { workspace = true } jsonrpsee = { features = ["server"], workspace = true } log = { workspace = true, default-features = true } @@ -28,5 +27,10 @@ prometheus-endpoint = { workspace = true, default-features = true } serde = { workspace = true } serde_json = { workspace = true, default-features = true } tokio = { features = ["parking_lot"], workspace = true, default-features = true } -tower = { features = ["util"], workspace = true } -tower-http = { features = ["cors"], workspace = true } +tower = { workspace = true, features = ["util"] } +tower-http = { workspace = true, features = ["cors"] } + +# Dependencies outside of the polkadot-sdk workspace +# which requires hyper v1 and http v1 +http = "1.1" +hyper = "1.3" diff --git a/substrate/client/rpc-servers/src/lib.rs b/substrate/client/rpc-servers/src/lib.rs index 647a7ca7e43..619498b3333 100644 --- a/substrate/client/rpc-servers/src/lib.rs +++ b/substrate/client/rpc-servers/src/lib.rs @@ -23,16 +23,13 @@ pub mod middleware; pub mod utils; -use std::{ - convert::Infallible, error::Error as StdError, net::SocketAddr, num::NonZeroU32, time::Duration, -}; +use std::{error::Error as StdError, net::SocketAddr, num::NonZeroU32, sync::Arc, time::Duration}; -use hyper::{ - server::conn::AddrStream, - service::{make_service_fn, service_fn}, -}; use jsonrpsee::{ - server::{stop_channel, ws, PingConfig, StopHandle, TowerServiceBuilder}, + core::BoxError, + server::{ + serve_with_graceful_shutdown, stop_channel, ws, PingConfig, StopHandle, TowerServiceBuilder, + }, Methods, RpcModule, }; use middleware::NodeHealthProxyLayer; @@ -97,6 +94,7 @@ struct PerConnection { metrics: Option, tokio_handle: tokio::runtime::Handle, service_builder: TowerServiceBuilder, + rate_limit_whitelisted_ips: Arc>, } /// Start RPC server listening on given address. @@ -124,8 +122,8 @@ where rate_limit_trust_proxy_headers, } = config; - let std_listener = TcpListener::bind(addrs.as_slice()).await?.into_std()?; - let local_addr = std_listener.local_addr().ok(); + let listener = TcpListener::bind(addrs.as_slice()).await?; + let local_addr = listener.local_addr().ok(); let host_filter = host_filtering(cors.is_some(), local_addr); let http_middleware = tower::ServiceBuilder::new() @@ -161,20 +159,38 @@ where methods: build_rpc_api(rpc_api).into(), service_builder: builder.to_service_builder(), metrics, - tokio_handle, - stop_handle: stop_handle.clone(), + tokio_handle: tokio_handle.clone(), + stop_handle, + rate_limit_whitelisted_ips: Arc::new(rate_limit_whitelisted_ips), }; - let make_service = make_service_fn(move |addr: &AddrStream| { - let cfg = cfg.clone(); - let rate_limit_whitelisted_ips = rate_limit_whitelisted_ips.clone(); - let ip = addr.remote_addr().ip(); - - async move { - let cfg = cfg.clone(); - let rate_limit_whitelisted_ips = rate_limit_whitelisted_ips.clone(); + tokio_handle.spawn(async move { + loop { + let (sock, remote_addr) = tokio::select! { + res = listener.accept() => { + match res { + Ok(s) => s, + Err(e) => { + log::debug!(target: "rpc", "Failed to accept ipv4 connection: {:?}", e); + continue; + } + } + } + _ = cfg.stop_handle.clone().shutdown() => break, + }; + + let ip = remote_addr.ip(); + let cfg2 = cfg.clone(); + let svc = tower::service_fn(move |req: http::Request| { + let PerConnection { + methods, + service_builder, + metrics, + tokio_handle, + stop_handle, + rate_limit_whitelisted_ips, + } = cfg2.clone(); - Ok::<_, Infallible>(service_fn(move |req| { let proxy_ip = if rate_limit_trust_proxy_headers { get_proxy_ip(&req) } else { None }; @@ -191,9 +207,6 @@ where rate_limit }; - let PerConnection { service_builder, metrics, tokio_handle, stop_handle, methods } = - cfg.clone(); - let is_websocket = ws::is_upgrade_request(&req); let transport_label = if is_websocket { "ws" } else { "http" }; @@ -213,7 +226,6 @@ where let rpc_middleware = RpcServiceBuilder::new().option_layer(middleware_layer.clone()); - let mut svc = service_builder.set_rpc_middleware(rpc_middleware).build(methods, stop_handle); @@ -230,17 +242,19 @@ where }); } - svc.call(req).await + // https://github.com/rust-lang/rust/issues/102211 the error type can't be inferred + // to be `Box` so we need to convert it to + // a concrete type as workaround. + svc.call(req).await.map_err(|e| BoxError::from(e)) } - })) - } - }); - - let server = hyper::Server::from_tcp(std_listener)?.serve(make_service); + }); - tokio::spawn(async move { - let graceful = server.with_graceful_shutdown(async move { stop_handle.shutdown().await }); - let _ = graceful.await; + cfg.tokio_handle.spawn(serve_with_graceful_shutdown( + sock, + svc, + cfg.stop_handle.clone().shutdown(), + )); + } }); log::info!( diff --git a/substrate/client/rpc-servers/src/middleware/node_health.rs b/substrate/client/rpc-servers/src/middleware/node_health.rs index d68ec14cb8f..69c9e0829ac 100644 --- a/substrate/client/rpc-servers/src/middleware/node_health.rs +++ b/substrate/client/rpc-servers/src/middleware/node_health.rs @@ -27,8 +27,10 @@ use std::{ use futures::future::FutureExt; use http::{HeaderValue, Method, StatusCode, Uri}; -use hyper::Body; -use jsonrpsee::types::{Response as RpcResponse, ResponseSuccess as RpcResponseSuccess}; +use jsonrpsee::{ + server::{HttpBody, HttpRequest, HttpResponse}, + types::{Response as RpcResponse, ResponseSuccess as RpcResponseSuccess}, +}; use tower::Service; const RPC_SYSTEM_HEALTH_CALL: &str = r#"{"jsonrpc":"2.0","method":"system_health","id":0}"#; @@ -57,9 +59,9 @@ impl NodeHealthProxy { } } -impl tower::Service> for NodeHealthProxy +impl tower::Service> for NodeHealthProxy where - S: Service, Response = http::Response>, + S: Service, S::Response: 'static, S::Error: Into> + 'static, S::Future: Send + 'static, @@ -73,7 +75,8 @@ where self.0.poll_ready(cx).map_err(Into::into) } - fn call(&mut self, mut req: http::Request) -> Self::Future { + fn call(&mut self, req: http::Request) -> Self::Future { + let mut req = req.map(|body| HttpBody::new(body)); let maybe_intercept = InterceptRequest::from_http(&req); // Modify the request and proxy it to `system_health` @@ -88,7 +91,7 @@ where req.headers_mut().insert(http::header::ACCEPT, HEADER_VALUE_JSON); // Adjust the body to reflect the method call. - req = req.map(|_| Body::from(RPC_SYSTEM_HEALTH_CALL)); + req = req.map(|_| HttpBody::from(RPC_SYSTEM_HEALTH_CALL)); } // Call the inner service and get a future that resolves to the response. @@ -99,7 +102,7 @@ where Ok(match maybe_intercept { InterceptRequest::Deny => - http_response(StatusCode::METHOD_NOT_ALLOWED, Body::empty()), + http_response(StatusCode::METHOD_NOT_ALLOWED, HttpBody::empty()), InterceptRequest::No => res, InterceptRequest::Health => { let health = parse_rpc_response(res.into_body()).await?; @@ -108,7 +111,7 @@ where InterceptRequest::Readiness => { let health = parse_rpc_response(res.into_body()).await?; if (!health.is_syncing && health.peers > 0) || !health.should_have_peers { - http_ok_response(Body::empty()) + http_ok_response(HttpBody::empty()) } else { http_internal_error() } @@ -133,27 +136,28 @@ struct Health { pub should_have_peers: bool, } -fn http_ok_response>(body: S) -> hyper::Response { +fn http_ok_response>(body: S) -> HttpResponse { http_response(StatusCode::OK, body) } -fn http_response>( - status_code: StatusCode, - body: S, -) -> hyper::Response { - hyper::Response::builder() +fn http_response>(status_code: StatusCode, body: S) -> HttpResponse { + HttpResponse::builder() .status(status_code) .header(http::header::CONTENT_TYPE, HEADER_VALUE_JSON) .body(body.into()) .expect("Header is valid; qed") } -fn http_internal_error() -> hyper::Response { - http_response(hyper::StatusCode::INTERNAL_SERVER_ERROR, Body::empty()) +fn http_internal_error() -> HttpResponse { + http_response(hyper::StatusCode::INTERNAL_SERVER_ERROR, HttpBody::empty()) } -async fn parse_rpc_response(body: Body) -> Result> { - let bytes = hyper::body::to_bytes(body).await?; +async fn parse_rpc_response( + body: HttpBody, +) -> Result> { + use http_body_util::BodyExt; + + let bytes = body.collect().await?.to_bytes(); let raw_rp = serde_json::from_slice::>(&bytes)?; let rp = RpcResponseSuccess::::try_from(raw_rp)?; @@ -178,7 +182,7 @@ enum InterceptRequest { } impl InterceptRequest { - fn from_http(req: &http::Request) -> InterceptRequest { + fn from_http(req: &HttpRequest) -> InterceptRequest { match req.uri().path() { "/health" => if req.method() == http::Method::GET { diff --git a/substrate/client/rpc-servers/src/utils.rs b/substrate/client/rpc-servers/src/utils.rs index d99b8e637d9..d9d943c7c1f 100644 --- a/substrate/client/rpc-servers/src/utils.rs +++ b/substrate/client/rpc-servers/src/utils.rs @@ -25,10 +25,7 @@ use std::{ }; use forwarded_header_value::ForwardedHeaderValue; -use hyper::{ - header::{HeaderName, HeaderValue}, - Request, -}; +use http::header::{HeaderName, HeaderValue}; use jsonrpsee::{server::middleware::http::HostFilterLayer, RpcModule}; use tower_http::cors::{AllowOrigin, CorsLayer}; @@ -57,7 +54,7 @@ pub(crate) fn build_rpc_api(mut rpc_api: RpcModule) available_methods.sort(); rpc_api - .register_method("rpc_methods", move |_, _| { + .register_method("rpc_methods", move |_, _, _| { serde_json::json!({ "methods": available_methods, }) @@ -96,7 +93,7 @@ pub(crate) fn format_cors(maybe_cors: Option<&Vec>) -> String { /// 1. `Forwarded` header. /// 2. `X-Forwarded-For` header. /// 3. `X-Real-Ip`. -pub(crate) fn get_proxy_ip(req: &Request) -> Option { +pub(crate) fn get_proxy_ip(req: &http::Request) -> Option { if let Some(ip) = req .headers() .get(&FORWARDED) @@ -133,9 +130,10 @@ pub(crate) fn get_proxy_ip(req: &Request) -> Option { mod tests { use super::*; use hyper::header::HeaderValue; + use jsonrpsee::server::{HttpBody, HttpRequest}; - fn request() -> hyper::Request { - hyper::Request::builder().body(hyper::Body::empty()).unwrap() + fn request() -> http::Request { + HttpRequest::builder().body(HttpBody::empty()).unwrap() } #[test] diff --git a/substrate/client/rpc-spec-v2/src/chain_head/api.rs b/substrate/client/rpc-spec-v2/src/chain_head/api.rs index 23cb0bbf545..128d803521f 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/api.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/api.rs @@ -54,7 +54,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_body", raw_method)] + #[method(name = "chainHead_v1_body", with_extensions)] async fn chain_head_unstable_body( &self, follow_subscription: String, @@ -73,7 +73,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_header", raw_method)] + #[method(name = "chainHead_v1_header", with_extensions)] async fn chain_head_unstable_header( &self, follow_subscription: String, @@ -85,7 +85,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_storage", raw_method)] + #[method(name = "chainHead_v1_storage", with_extensions)] async fn chain_head_unstable_storage( &self, follow_subscription: String, @@ -99,7 +99,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_call", raw_method)] + #[method(name = "chainHead_v1_call", with_extensions)] async fn chain_head_unstable_call( &self, follow_subscription: String, @@ -118,7 +118,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_unpin", raw_method)] + #[method(name = "chainHead_v1_unpin", with_extensions)] async fn chain_head_unstable_unpin( &self, follow_subscription: String, @@ -131,7 +131,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_continue", raw_method)] + #[method(name = "chainHead_v1_continue", with_extensions)] async fn chain_head_unstable_continue( &self, follow_subscription: String, @@ -145,7 +145,7 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_v1_stopOperation", raw_method)] + #[method(name = "chainHead_v1_stopOperation", with_extensions)] async fn chain_head_unstable_stop_operation( &self, follow_subscription: String, diff --git a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs index 6779180a414..a056b4d437c 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs @@ -36,7 +36,7 @@ use crate::{ use codec::Encode; use futures::{channel::oneshot, future::FutureExt}; use jsonrpsee::{ - core::async_trait, server::ResponsePayload, types::SubscriptionId, ConnectionDetails, + core::async_trait, server::ResponsePayload, types::SubscriptionId, ConnectionId, Extensions, MethodResponseFuture, PendingSubscriptionSink, SubscriptionSink, }; use log::debug; @@ -251,14 +251,16 @@ where async fn chain_head_unstable_body( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, hash: Block::Hash, ) -> ResponsePayload<'static, MethodResponse> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee; qed"); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or // stale. return ResponsePayload::success(MethodResponse::LimitReached); @@ -335,14 +337,16 @@ where async fn chain_head_unstable_header( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, hash: Block::Hash, ) -> Result, ChainHeadRpcError> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee; qed"); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(None); } @@ -371,16 +375,18 @@ where async fn chain_head_unstable_storage( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, hash: Block::Hash, items: Vec>, child_trie: Option, ) -> ResponsePayload<'static, MethodResponse> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee; qed"); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or // stale. return ResponsePayload::success(MethodResponse::LimitReached); @@ -452,7 +458,7 @@ where async fn chain_head_unstable_call( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, hash: Block::Hash, function: String, @@ -463,10 +469,12 @@ where Err(err) => return ResponsePayload::error(err), }; - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee; qed"); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { // The spec says to return `LimitReached` if the follow subscription is invalid or // stale. return ResponsePayload::success(MethodResponse::LimitReached); @@ -530,14 +538,16 @@ where async fn chain_head_unstable_unpin( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, hash_or_hashes: ListOrValue, ) -> Result<(), ChainHeadRpcError> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee; qed"); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()); } @@ -566,14 +576,16 @@ where async fn chain_head_unstable_continue( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee; qed"); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()) } @@ -592,14 +604,16 @@ where async fn chain_head_unstable_stop_operation( &self, - connection_details: ConnectionDetails, + ext: &Extensions, follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { - if !self - .subscriptions - .contains_subscription(connection_details.id(), &follow_subscription) - { + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee; qed"); + + if !self.subscriptions.contains_subscription(conn_id, &follow_subscription) { return Ok(()) } diff --git a/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs b/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs index a6edc344bc6..d4d616f54dc 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs @@ -846,6 +846,7 @@ impl> SubscriptionsInner { #[cfg(test)] mod tests { use super::*; + use jsonrpsee::ConnectionId; use sc_block_builder::BlockBuilderBuilder; use sc_service::client::new_in_mem; use sp_consensus::BlockOrigin; @@ -1420,17 +1421,20 @@ mod tests { rpc_connections.clone(), ); - let reserved_sub_first = subscription_management.reserve_subscription(1).unwrap(); - let mut reserved_sub_second = subscription_management.reserve_subscription(1).unwrap(); + let reserved_sub_first = + subscription_management.reserve_subscription(ConnectionId(1)).unwrap(); + let mut reserved_sub_second = + subscription_management.reserve_subscription(ConnectionId(1)).unwrap(); // Subscriptions reserved but not yet populated. assert_eq!(subs.read().subs.len(), 0); // Cannot reserve anymore. - assert!(subscription_management.reserve_subscription(1).is_none()); + assert!(subscription_management.reserve_subscription(ConnectionId(1)).is_none()); // Drop the first subscription. drop(reserved_sub_first); // Space is freed-up for the rpc connections. - let mut reserved_sub_first = subscription_management.reserve_subscription(1).unwrap(); + let mut reserved_sub_first = + subscription_management.reserve_subscription(ConnectionId(1)).unwrap(); // Insert subscriptions. let _sub_data_first = @@ -1445,7 +1449,8 @@ mod tests { // Check that the subscription is removed. assert_eq!(subs.read().subs.len(), 1); // Space is freed-up for the rpc connections. - let reserved_sub_first = subscription_management.reserve_subscription(1).unwrap(); + let reserved_sub_first = + subscription_management.reserve_subscription(ConnectionId(1)).unwrap(); // Drop all subscriptions. drop(reserved_sub_first); diff --git a/substrate/client/rpc-spec-v2/src/common/connections.rs b/substrate/client/rpc-spec-v2/src/common/connections.rs index c16a80bf49d..f0c31d612eb 100644 --- a/substrate/client/rpc-spec-v2/src/common/connections.rs +++ b/substrate/client/rpc-spec-v2/src/common/connections.rs @@ -195,68 +195,71 @@ mod tests { #[test] fn reserve_space() { let rpc_connections = RpcConnections::new(2); - let reserved = rpc_connections.reserve_space(1); + let conn_id = ConnectionId(1); + let reserved = rpc_connections.reserve_space(conn_id); + assert!(reserved.is_some()); - assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert_eq!(1, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); assert_eq!(rpc_connections.data.lock().len(), 1); let reserved = reserved.unwrap(); let registered = reserved.register("identifier1".to_string()).unwrap(); - assert!(rpc_connections.contains_identifier(1, "identifier1")); - assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert!(rpc_connections.contains_identifier(conn_id, "identifier1")); + assert_eq!(1, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); drop(registered); // Data is dropped. - assert!(rpc_connections.data.lock().get(&1).is_none()); + assert!(rpc_connections.data.lock().get(&conn_id).is_none()); assert!(rpc_connections.data.lock().is_empty()); // Checks can still happen. - assert!(!rpc_connections.contains_identifier(1, "identifier1")); + assert!(!rpc_connections.contains_identifier(conn_id, "identifier1")); } #[test] fn reserve_space_capacity_reached() { let rpc_connections = RpcConnections::new(2); + let conn_id = ConnectionId(1); // Reserve identifier for connection 1. - let reserved = rpc_connections.reserve_space(1); + let reserved = rpc_connections.reserve_space(conn_id); assert!(reserved.is_some()); - assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert_eq!(1, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); // Add identifier for connection 1. let reserved = reserved.unwrap(); let registered = reserved.register("identifier1".to_string()).unwrap(); - assert!(rpc_connections.contains_identifier(1, "identifier1")); - assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert!(rpc_connections.contains_identifier(conn_id, "identifier1")); + assert_eq!(1, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); // Reserve identifier for connection 1 again. - let reserved = rpc_connections.reserve_space(1); + let reserved = rpc_connections.reserve_space(conn_id); assert!(reserved.is_some()); - assert_eq!(2, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert_eq!(2, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); // Add identifier for connection 1 again. let reserved = reserved.unwrap(); let registered_second = reserved.register("identifier2".to_string()).unwrap(); - assert!(rpc_connections.contains_identifier(1, "identifier2")); - assert_eq!(2, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert!(rpc_connections.contains_identifier(conn_id, "identifier2")); + assert_eq!(2, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); // Cannot reserve more identifiers. - let reserved = rpc_connections.reserve_space(1); + let reserved = rpc_connections.reserve_space(conn_id); assert!(reserved.is_none()); // Drop the first identifier. drop(registered); - assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); - assert!(rpc_connections.contains_identifier(1, "identifier2")); - assert!(!rpc_connections.contains_identifier(1, "identifier1")); + assert_eq!(1, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); + assert!(rpc_connections.contains_identifier(conn_id, "identifier2")); + assert!(!rpc_connections.contains_identifier(conn_id, "identifier1")); // Can reserve again after clearing the space. - let reserved = rpc_connections.reserve_space(1); + let reserved = rpc_connections.reserve_space(conn_id); assert!(reserved.is_some()); - assert_eq!(2, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert_eq!(2, rpc_connections.data.lock().get(&conn_id).unwrap().num_identifiers); // Ensure data is cleared. drop(reserved); drop(registered_second); - assert!(rpc_connections.data.lock().get(&1).is_none()); + assert!(rpc_connections.data.lock().get(&conn_id).is_none()); } } diff --git a/substrate/client/rpc-spec-v2/src/transaction/api.rs b/substrate/client/rpc-spec-v2/src/transaction/api.rs index ed358922d53..6af6f167844 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/api.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/api.rs @@ -48,7 +48,7 @@ pub trait TransactionBroadcastApi { /// /// This method is unstable and subject to change in the future. - #[method(name = "transaction_v1_broadcast", raw_method)] + #[method(name = "transaction_v1_broadcast", with_extensions)] async fn broadcast(&self, bytes: Bytes) -> RpcResult>; /// Broadcast an extrinsic to the chain. @@ -56,6 +56,6 @@ pub trait TransactionBroadcastApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "transaction_v1_stop", raw_method)] + #[method(name = "transaction_v1_stop", with_extensions)] async fn stop_broadcast(&self, operation_id: String) -> Result<(), ErrorBroadcast>; } diff --git a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs index 68c19010e31..2fd4ce24545 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs @@ -27,7 +27,7 @@ use futures::{FutureExt, Stream, StreamExt}; use futures_util::stream::AbortHandle; use jsonrpsee::{ core::{async_trait, RpcResult}, - ConnectionDetails, + ConnectionId, Extensions, }; use parking_lot::RwLock; use rand::{distributions::Alphanumeric, Rng}; @@ -121,19 +121,18 @@ where ::Hash: Unpin, Client: HeaderBackend + BlockchainEvents + Send + Sync + 'static, { - async fn broadcast( - &self, - connection_details: ConnectionDetails, - bytes: Bytes, - ) -> RpcResult> { + async fn broadcast(&self, ext: &Extensions, bytes: Bytes) -> RpcResult> { let pool = self.pool.clone(); + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee; qed"); // The unique ID of this operation. let id = self.generate_unique_id(); // Ensure that the connection has not reached the maximum number of active operations. - let Some(reserved_connection) = self.rpc_connections.reserve_space(connection_details.id()) - else { + let Some(reserved_connection) = self.rpc_connections.reserve_space(conn_id) else { return Ok(None) }; let Some(reserved_identifier) = reserved_connection.register(id.clone()) else { @@ -245,11 +244,16 @@ where async fn stop_broadcast( &self, - connection_details: ConnectionDetails, + ext: &Extensions, operation_id: String, ) -> Result<(), ErrorBroadcast> { + let conn_id = ext + .get::() + .copied() + .expect("ConnectionId is always set by jsonrpsee; qed"); + // The operation ID must correlate to the same connection ID. - if !self.rpc_connections.contains_identifier(connection_details.id(), &operation_id) { + if !self.rpc_connections.contains_identifier(conn_id, &operation_id) { return Err(ErrorBroadcast::InvalidOperationID) } diff --git a/substrate/client/rpc/src/utils.rs b/substrate/client/rpc/src/utils.rs index 3b5372615e7..bc566ed37f2 100644 --- a/substrate/client/rpc/src/utils.rs +++ b/substrate/client/rpc/src/utils.rs @@ -130,7 +130,7 @@ async fn inner_pipe_from_stream( "Subscription buffer limit={} exceeded for subscription={} conn_id={}; dropping subscription", buf.max_cap, sink.method_name(), - sink.connection_id() + sink.connection_id().0 ); return } @@ -189,7 +189,7 @@ mod tests { async fn subscribe() -> Subscription { let mut module = RpcModule::new(()); module - .register_subscription("sub", "my_sub", "unsub", |_, pending, _| async move { + .register_subscription("sub", "my_sub", "unsub", |_, pending, _, _| async move { let stream = futures::stream::iter([0; 16]); pipe_from_stream(pending, stream).await; Ok(()) @@ -217,7 +217,7 @@ mod tests { let mut module = RpcModule::new(tx); module - .register_subscription("sub", "my_sub", "unsub", |_, pending, ctx| async move { + .register_subscription("sub", "my_sub", "unsub", |_, pending, ctx, _| async move { let stream = futures::stream::iter([0; 32]); pipe_from_stream(pending, stream).await; _ = ctx.unbounded_send(()); @@ -239,16 +239,21 @@ mod tests { let mut module = RpcModule::new(notify_tx); module - .register_subscription("sub", "my_sub", "unsub", |_, pending, notify_tx| async move { - // emulate empty stream for simplicity: otherwise we need some mechanism - // to sync buffer and channel send operations - let stream = futures::stream::empty::<()>(); - // this should exit immediately - pipe_from_stream(pending, stream).await; - // notify that the `pipe_from_stream` has returned - notify_tx.notify_one(); - Ok(()) - }) + .register_subscription( + "sub", + "my_sub", + "unsub", + |_, pending, notify_tx, _| async move { + // emulate empty stream for simplicity: otherwise we need some mechanism + // to sync buffer and channel send operations + let stream = futures::stream::empty::<()>(); + // this should exit immediately + pipe_from_stream(pending, stream).await; + // notify that the `pipe_from_stream` has returned + notify_tx.notify_one(); + Ok(()) + }, + ) .unwrap(); module.subscribe("sub", EmptyServerParams::new(), 1).await.unwrap(); diff --git a/substrate/utils/frame/remote-externalities/src/lib.rs b/substrate/utils/frame/remote-externalities/src/lib.rs index 44e5f467d89..40864085349 100644 --- a/substrate/utils/frame/remote-externalities/src/lib.rs +++ b/substrate/utils/frame/remote-externalities/src/lib.rs @@ -22,10 +22,7 @@ use codec::{Compact, Decode, Encode}; use indicatif::{ProgressBar, ProgressStyle}; -use jsonrpsee::{ - core::params::ArrayParams, - http_client::{HttpClient, HttpClientBuilder}, -}; +use jsonrpsee::{core::params::ArrayParams, http_client::HttpClient}; use log::*; use serde::de::DeserializeOwned; use sp_core::{ @@ -190,7 +187,7 @@ impl Transport { } else { uri.clone() }; - let http_client = HttpClientBuilder::default() + let http_client = HttpClient::builder() .max_request_size(u32::MAX) .max_response_size(u32::MAX) .request_timeout(std::time::Duration::from_secs(60 * 5)) -- GitLab From 7084463a49f2359dc2f378f5834c7252af02ed4d Mon Sep 17 00:00:00 2001 From: Lulu Date: Wed, 26 Jun 2024 13:20:47 +0100 Subject: [PATCH 057/130] Update parity publish (#4878) Co-authored-by: Oliver Tale-Yazdi --- .github/workflows/check-semver.yml | 14 +++++++------- .github/workflows/publish-check-crates.yml | 2 +- .github/workflows/publish-claim-crates.yml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/check-semver.yml b/.github/workflows/check-semver.yml index 04c63f4192b..12f2149cdf2 100644 --- a/.github/workflows/check-semver.yml +++ b/.github/workflows/check-semver.yml @@ -19,14 +19,14 @@ jobs: with: cache-on-failure: true + - name: install parity-publish + run: cargo install parity-publish@0.6.0 + - name: Rust compilation prerequisites run: | - rustup default nightly-2024-03-01 - rustup target add wasm32-unknown-unknown --toolchain nightly-2024-03-01 - rustup component add rust-src --toolchain nightly-2024-03-01 - - - name: install parity-publish - run: cargo install parity-publish@0.5.1 + rustup default $(parity-publish semver --minimum-nightly-rust-version) + rustup target add wasm32-unknown-unknown --toolchain $(parity-publish semver --minimum-nightly-rust-version) + rustup component add rust-src --toolchain $(parity-publish semver --minimum-nightly-rust-version) - name: extra git setup run: | @@ -39,7 +39,7 @@ jobs: export CARGO_TARGET_DIR=target export RUSTFLAGS='-A warnings -A missing_docs' export SKIP_WASM_BUILD=1 - if ! parity-publish --color always prdoc --since old --validate prdoc/pr_$PR.prdoc --toolchain nightly-2024-03-01 -v; then + if ! parity-publish --color always prdoc --since old --validate prdoc/pr_$PR.prdoc -v; then cat < Date: Wed, 26 Jun 2024 15:51:05 +0200 Subject: [PATCH 058/130] [xcm] runtime api for LocationToAccount conversions (#4857) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: https://github.com/paritytech/polkadot-sdk/issues/4298 This PR also merges `xcm-fee-payment-runtime-api` module to the `xcm-runtime-api`. ## TODO - [x] rename `convert` to `convert_location` and add new one `convert_account` (opposite direction) - [x] add to the all testnet runtimes - [x] check polkadot-js if supports that automatically or if needs to be added manually https://github.com/polkadot-js/api/pull/5917 - [ ] backport/patch for fellows and release (asap) ## Open questions - [x] should we merge `xcm-runtime-api` and `xcm-fee-payment-runtime-api` to the one module `xcm-runtime-api` ? ## Usage Input: - `location: VersionedLocation` Output: - account_id bytes ![image](https://github.com/paritytech/polkadot-sdk/assets/8159517/4607b15a-77d2-462b-806c-606107776c0d) --------- Co-authored-by: Bastian Köcher --- Cargo.lock | 64 +++++++------- Cargo.toml | 4 +- .../emulated/chains/relays/westend/Cargo.toml | 2 +- .../tests/assets/asset-hub-westend/Cargo.toml | 2 +- .../src/tests/xcm_fee_estimation.rs | 2 +- .../assets/asset-hub-rococo/Cargo.toml | 6 +- .../assets/asset-hub-rococo/src/lib.rs | 22 +++-- .../assets/asset-hub-westend/Cargo.toml | 6 +- .../assets/asset-hub-westend/src/lib.rs | 30 +++++-- .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 6 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 22 +++-- .../bridge-hubs/bridge-hub-westend/Cargo.toml | 6 +- .../bridge-hubs/bridge-hub-westend/src/lib.rs | 22 +++-- .../collectives-westend/Cargo.toml | 6 +- .../collectives-westend/src/lib.rs | 29 +++++-- .../contracts/contracts-rococo/Cargo.toml | 6 +- .../contracts/contracts-rococo/src/lib.rs | 27 ++++-- .../coretime/coretime-rococo/Cargo.toml | 6 +- .../coretime/coretime-rococo/src/lib.rs | 22 +++-- .../coretime/coretime-westend/Cargo.toml | 6 +- .../coretime/coretime-westend/src/lib.rs | 22 +++-- .../runtimes/people/people-rococo/Cargo.toml | 6 +- .../runtimes/people/people-rococo/src/lib.rs | 22 +++-- .../runtimes/people/people-westend/Cargo.toml | 6 +- .../runtimes/people/people-westend/src/lib.rs | 22 +++-- .../runtimes/testing/penpal/Cargo.toml | 6 +- .../runtimes/testing/penpal/src/lib.rs | 10 +-- cumulus/polkadot-parachain/Cargo.toml | 2 +- polkadot/node/service/Cargo.toml | 4 +- polkadot/node/service/src/fake_runtime_api.rs | 16 ++-- polkadot/runtime/rococo/Cargo.toml | 6 +- polkadot/runtime/rococo/src/lib.rs | 22 +++-- polkadot/runtime/westend/Cargo.toml | 6 +- polkadot/runtime/westend/src/lib.rs | 22 +++-- polkadot/xcm/pallet-xcm/Cargo.toml | 6 +- polkadot/xcm/pallet-xcm/src/lib.rs | 6 +- .../Cargo.toml | 24 ++---- .../xcm/xcm-runtime-apis/src/conversions.rs | 56 +++++++++++++ .../src/dry_run.rs | 0 .../src/fees.rs | 0 .../src/lib.rs | 12 ++- .../xcm/xcm-runtime-apis/tests/conversions.rs | 83 +++++++++++++++++++ .../tests/fee_estimation.rs | 4 +- .../tests/mock.rs | 23 +++-- prdoc/pr_4857.prdoc | 50 +++++++++++ umbrella/Cargo.toml | 14 ++-- umbrella/src/lib.rs | 8 +- 47 files changed, 546 insertions(+), 208 deletions(-) rename polkadot/xcm/{xcm-fee-payment-runtime-api => xcm-runtime-apis}/Cargo.toml (82%) create mode 100644 polkadot/xcm/xcm-runtime-apis/src/conversions.rs rename polkadot/xcm/{xcm-fee-payment-runtime-api => xcm-runtime-apis}/src/dry_run.rs (100%) rename polkadot/xcm/{xcm-fee-payment-runtime-api => xcm-runtime-apis}/src/fees.rs (100%) rename polkadot/xcm/{xcm-fee-payment-runtime-api => xcm-runtime-apis}/src/lib.rs (74%) create mode 100644 polkadot/xcm/xcm-runtime-apis/tests/conversions.rs rename polkadot/xcm/{xcm-fee-payment-runtime-api => xcm-runtime-apis}/tests/fee_estimation.rs (99%) rename polkadot/xcm/{xcm-fee-payment-runtime-api => xcm-runtime-apis}/tests/mock.rs (96%) create mode 100644 prdoc/pr_4857.prdoc diff --git a/Cargo.lock b/Cargo.lock index 537adb68792..171b443d815 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -871,7 +871,7 @@ dependencies = [ "staging-xcm-executor", "substrate-wasm-builder", "testnet-parachains-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -921,7 +921,7 @@ dependencies = [ "staging-xcm-executor", "westend-runtime", "westend-system-emulated-network", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -1004,7 +1004,7 @@ dependencies = [ "substrate-wasm-builder", "testnet-parachains-constants", "westend-runtime-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -2150,7 +2150,7 @@ dependencies = [ "static_assertions", "substrate-wasm-builder", "testnet-parachains-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -2310,7 +2310,7 @@ dependencies = [ "substrate-wasm-builder", "testnet-parachains-constants", "westend-runtime-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -2952,7 +2952,7 @@ dependencies = [ "substrate-wasm-builder", "testnet-parachains-constants", "westend-runtime-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -3208,7 +3208,7 @@ dependencies = [ "staging-xcm-executor", "substrate-wasm-builder", "testnet-parachains-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -3305,7 +3305,7 @@ dependencies = [ "staging-xcm-executor", "substrate-wasm-builder", "testnet-parachains-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -3370,7 +3370,7 @@ dependencies = [ "substrate-wasm-builder", "testnet-parachains-constants", "westend-runtime-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -11991,7 +11991,7 @@ dependencies = [ "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -12533,7 +12533,7 @@ dependencies = [ "staging-xcm-builder", "staging-xcm-executor", "substrate-wasm-builder", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -12634,7 +12634,7 @@ dependencies = [ "staging-xcm-executor", "substrate-wasm-builder", "testnet-parachains-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -12735,7 +12735,7 @@ dependencies = [ "substrate-wasm-builder", "testnet-parachains-constants", "westend-runtime-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -14583,8 +14583,8 @@ dependencies = [ "tracing-gum-proc-macro", "westend-runtime-constants", "xcm-emulator", - "xcm-fee-payment-runtime-api", "xcm-procedural", + "xcm-runtime-apis", "xcm-simulator", ] @@ -14827,7 +14827,7 @@ dependencies = [ "tracing-gum", "westend-runtime", "westend-runtime-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -16647,7 +16647,7 @@ dependencies = [ "substrate-wasm-builder", "tiny-keccak", "tokio", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -23607,7 +23607,7 @@ dependencies = [ "staging-xcm", "westend-runtime", "westend-runtime-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -23719,7 +23719,7 @@ dependencies = [ "tiny-keccak", "tokio", "westend-runtime-constants", - "xcm-fee-payment-runtime-api", + "xcm-runtime-apis", ] [[package]] @@ -24217,13 +24217,26 @@ dependencies = [ ] [[package]] -name = "xcm-fee-payment-runtime-api" +name = "xcm-procedural" +version = "7.0.0" +dependencies = [ + "Inflector", + "proc-macro2 1.0.82", + "quote 1.0.35", + "staging-xcm", + "syn 2.0.61", + "trybuild", +] + +[[package]] +name = "xcm-runtime-apis" version = "0.1.0" dependencies = [ "env_logger 0.11.3", "frame-executive", "frame-support", "frame-system", + "hex-literal", "log", "pallet-assets", "pallet-balances", @@ -24232,7 +24245,6 @@ dependencies = [ "scale-info", "sp-api", "sp-io", - "sp-runtime", "sp-std 14.0.0", "sp-weights", "staging-xcm", @@ -24240,18 +24252,6 @@ dependencies = [ "staging-xcm-executor", ] -[[package]] -name = "xcm-procedural" -version = "7.0.0" -dependencies = [ - "Inflector", - "proc-macro2 1.0.82", - "quote 1.0.35", - "staging-xcm", - "syn 2.0.61", - "trybuild", -] - [[package]] name = "xcm-simulator" version = "7.0.0" diff --git a/Cargo.toml b/Cargo.toml index 9ddfedd5155..aa8fad5da8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -226,7 +226,7 @@ members = [ "polkadot/xcm/xcm-builder", "polkadot/xcm/xcm-executor", "polkadot/xcm/xcm-executor/integration-tests", - "polkadot/xcm/xcm-fee-payment-runtime-api", + "polkadot/xcm/xcm-runtime-apis", "polkadot/xcm/xcm-simulator", "polkadot/xcm/xcm-simulator/example", "polkadot/xcm/xcm-simulator/fuzzer", @@ -1337,8 +1337,8 @@ xcm-builder = { path = "polkadot/xcm/xcm-builder", default-features = false, pac xcm-docs = { path = "polkadot/xcm/docs" } xcm-emulator = { path = "cumulus/xcm/xcm-emulator", default-features = false } xcm-executor = { path = "polkadot/xcm/xcm-executor", default-features = false, package = "staging-xcm-executor" } -xcm-fee-payment-runtime-api = { path = "polkadot/xcm/xcm-fee-payment-runtime-api", default-features = false } xcm-procedural = { path = "polkadot/xcm/procedural", default-features = false } +xcm-runtime-apis = { path = "polkadot/xcm/xcm-runtime-apis", default-features = false } xcm-simulator = { path = "polkadot/xcm/xcm-simulator", default-features = false } zeroize = { version = "1.7.0", default-features = false } zstd = { version = "0.12.4", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml index 010bfc57002..de285d9885a 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml @@ -26,7 +26,7 @@ polkadot-primitives = { workspace = true } westend-runtime-constants = { workspace = true } westend-runtime = { workspace = true } xcm = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus parachains-common = { workspace = true, default-features = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml index 185f9db196e..2f4cc5ea39c 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml @@ -34,7 +34,7 @@ polkadot-runtime-common = { workspace = true, default-features = true } xcm = { workspace = true } xcm-executor = { workspace = true } pallet-xcm = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } westend-runtime = { workspace = true } # Cumulus diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs index dc89ef1f7a4..c01aa782533 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs @@ -18,7 +18,7 @@ use crate::imports::*; use frame_system::RawOrigin; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::runtime_decl_for_dry_run_api::DryRunApiV1, fees::runtime_decl_for_xcm_payment_api::XcmPaymentApiV1, }; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml index 0af83744ae9..9ef0aa0072c 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml @@ -70,7 +70,7 @@ polkadot-runtime-common = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -139,7 +139,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", @@ -250,7 +250,7 @@ std = [ "testnet-parachains-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 423f9549edc..836939f1af4 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -100,7 +100,7 @@ use xcm::{ latest::prelude::{AssetId, BodyId}, VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm, }; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -1322,7 +1322,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::TokenLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -1335,11 +1335,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -1354,7 +1354,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { PolkadotXcm::dry_run_call::(origin, call) } @@ -1364,6 +1364,18 @@ impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationToAccountId, + >::convert_location(location) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index f0520a1726a..7e618d950b1 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -69,7 +69,7 @@ westend-runtime-constants = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -138,7 +138,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", @@ -249,7 +249,7 @@ std = [ "westend-runtime-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 6764242cc33..14cae3b5396 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -85,10 +85,10 @@ pub use sp_runtime::BuildStorage; use assets_common::{foreign_creators::ForeignCreators, matching::FromSiblingParachain}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm::prelude::{VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm}; - -// We exclude `Assets` since it's the name of a pallet -use xcm::latest::prelude::AssetId; +use xcm::{ + latest::prelude::AssetId, + prelude::{VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm}, +}; #[cfg(feature = "runtime-benchmarks")] use xcm::latest::prelude::{ @@ -96,7 +96,7 @@ use xcm::latest::prelude::{ NetworkId, NonFungible, Parent, ParentThen, Response, XCM_VERSION, }; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -1350,7 +1350,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::WestendLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -1363,11 +1363,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -1382,7 +1382,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { PolkadotXcm::dry_run_call::(origin, call) } @@ -1392,6 +1392,18 @@ impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationToAccountId, + >::convert_location(location) + } + } + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi for Runtime { diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index bfe705be8fc..1ac31efaf91 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -65,7 +65,7 @@ polkadot-runtime-common = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -219,7 +219,7 @@ std = [ "testnet-parachains-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] @@ -262,7 +262,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 12707d78550..9aa1eeb1a4b 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -98,7 +98,7 @@ pub use sp_runtime::BuildStorage; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use rococo_runtime_constants::system_parachain::{ASSET_HUB_ID, BRIDGE_HUB_ID}; use xcm::prelude::*; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -966,7 +966,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::TokenLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -979,11 +979,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -998,7 +998,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { PolkadotXcm::dry_run_call::(origin, call) } @@ -1008,6 +1008,18 @@ impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationToAccountId, + >::convert_location(location) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml index ab0c15ce300..c18d5036e06 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml @@ -61,7 +61,7 @@ polkadot-runtime-common = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -184,7 +184,7 @@ std = [ "westend-runtime-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] @@ -219,7 +219,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index 6b2d67e29c4..5d4e41bd706 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -75,7 +75,7 @@ pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; pub use sp_runtime::{MultiAddress, Perbill, Permill}; use xcm_config::{XcmOriginToTransactDispatchOrigin, XcmRouter}; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -716,7 +716,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::WestendLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -729,11 +729,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -748,7 +748,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { PolkadotXcm::dry_run_call::(origin, call) } @@ -758,6 +758,18 @@ impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationToAccountId, + >::convert_location(location) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml index 7cfd115cea4..87cf42ba87d 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml @@ -66,8 +66,8 @@ polkadot-runtime-common = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } westend-runtime-constants = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -131,7 +131,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext/try-runtime", @@ -238,7 +238,7 @@ std = [ "westend-runtime-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index 1d3b8c4581a..909d5dc6094 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -70,8 +70,8 @@ use frame_support::{ genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ - fungible::HoldConsideration, ConstBool, ConstU16, ConstU32, ConstU64, ConstU8, - EitherOfDiverse, InstanceFilter, LinearStoragePrice, TransformOrigin, + fungible::HoldConsideration, ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, + InstanceFilter, LinearStoragePrice, TransformOrigin, }, weights::{ConstantMultiplier, Weight, WeightToFee as _}, PalletId, @@ -104,7 +104,7 @@ use polkadot_runtime_common::{ impls::VersionedLocatableAsset, BlockHashCount, SlowAdjustingFeeUpdate, }; use xcm::prelude::*; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -163,6 +163,7 @@ parameter_types! { }) .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) .build_or_panic(); + pub const SS58Prefix: u8 = 42; } // Configure FRAME pallets to include in runtime. @@ -180,7 +181,7 @@ impl frame_system::Config for Runtime { type Version = Version; type AccountData = pallet_balances::AccountData; type SystemWeightInfo = weights::frame_system::WeightInfo; - type SS58Prefix = ConstU16<0>; + type SS58Prefix = SS58Prefix; type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; type MaxConsumers = frame_support::traits::ConstU32<16>; } @@ -940,7 +941,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::WndLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -953,11 +954,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -972,7 +973,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { PolkadotXcm::dry_run_call::(origin, call) } @@ -982,6 +983,18 @@ impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + LocationToAccountId, + >::convert_location(location) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index 1620924496f..4fb4bcde023 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -63,7 +63,7 @@ rococo-runtime-constants = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -141,7 +141,7 @@ std = [ "testnet-parachains-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] @@ -171,7 +171,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 59aae99d6a1..ab779b31c72 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -50,7 +50,7 @@ use frame_support::{ dispatch::DispatchClass, genesis_builder_helper::{build_state, get_preset}, parameter_types, - traits::{ConstBool, ConstU16, ConstU32, ConstU64, ConstU8}, + traits::{ConstBool, ConstU32, ConstU64, ConstU8}, weights::{ConstantMultiplier, Weight, WeightToFee as _}, PalletId, }; @@ -64,7 +64,7 @@ pub use parachains_common::{AuraId, Balance}; use testnet_parachains_constants::rococo::{consensus::*, currency::*, fee::WeightToFee, time::*}; use xcm::prelude::*; use xcm_config::CollatorSelectionUpdateOrigin; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -177,6 +177,7 @@ parameter_types! { }) .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) .build_or_panic(); + pub const SS58Prefix: u8 = 42; } // Configure FRAME pallets to include in runtime. @@ -193,7 +194,7 @@ impl frame_system::Config for Runtime { type Version = Version; type AccountData = pallet_balances::AccountData; type SystemWeightInfo = frame_system::weights::SubstrateWeight; - type SS58Prefix = ConstU16<42>; + type SS58Prefix = SS58Prefix; type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; type MaxConsumers = ConstU32<16>; } @@ -590,7 +591,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::RelayLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -603,11 +604,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -622,7 +623,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { PolkadotXcm::dry_run_call::(origin, call) } @@ -632,6 +633,18 @@ impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationToAccountId + >::convert_location(location) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml index 8f4ccac100e..ebc00533081 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml @@ -62,7 +62,7 @@ rococo-runtime-constants = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -139,7 +139,7 @@ std = [ "testnet-parachains-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] @@ -169,7 +169,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 522ee574176..34f7fa4d3ec 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -76,7 +76,7 @@ use xcm::prelude::*; use xcm_config::{ FellowshipLocation, GovernanceLocation, RocRelayLocation, XcmOriginToTransactDispatchOrigin, }; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -660,7 +660,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::RocRelayLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -673,11 +673,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -692,7 +692,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { PolkadotXcm::dry_run_call::(origin, call) } @@ -702,6 +702,18 @@ impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationToAccountId, + >::convert_location(location) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml index 690bcfa8eb0..10edf7fac85 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml @@ -61,7 +61,7 @@ westend-runtime-constants = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -138,7 +138,7 @@ std = [ "westend-runtime-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] @@ -167,7 +167,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs index 8830f1a42a2..4b2f494c890 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -76,7 +76,7 @@ use xcm::prelude::*; use xcm_config::{ FellowshipLocation, GovernanceLocation, TokenRelayLocation, XcmOriginToTransactDispatchOrigin, }; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -651,7 +651,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::TokenRelayLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -664,11 +664,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -683,7 +683,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { PolkadotXcm::dry_run_call::(origin, call) } @@ -693,6 +693,18 @@ impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationToAccountId, + >::convert_location(location) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml index 61dedd8bbb8..890de672e0b 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml @@ -59,7 +59,7 @@ rococo-runtime-constants = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -136,7 +136,7 @@ std = [ "testnet-parachains-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] @@ -165,7 +165,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs index bd189c31114..63dd863a861 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -70,7 +70,7 @@ use xcm_config::{ FellowshipLocation, GovernanceLocation, PriceForSiblingParachainDelivery, XcmConfig, XcmOriginToTransactDispatchOrigin, }; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -625,7 +625,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::RelayLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -638,11 +638,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -657,7 +657,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { PolkadotXcm::dry_run_call::(origin, call) } @@ -667,6 +667,18 @@ impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationToAccountId, + >::convert_location(location) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml index 2c5a51e8235..83068e489d2 100644 --- a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml @@ -59,7 +59,7 @@ westend-runtime-constants = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -136,7 +136,7 @@ std = [ "westend-runtime-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] @@ -165,7 +165,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ diff --git a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs index f071a5f0c9b..84655972b0c 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs @@ -70,7 +70,7 @@ use xcm_config::{ FellowshipLocation, GovernanceLocation, PriceForSiblingParachainDelivery, XcmConfig, XcmOriginToTransactDispatchOrigin, }; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -625,7 +625,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::RelayLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -638,11 +638,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -657,7 +657,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { PolkadotXcm::dry_run_call::(origin, call) } @@ -667,6 +667,18 @@ impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationToAccountId, + >::convert_location(location) + } + } + impl cumulus_primitives_core::CollectCollationInfo for Runtime { fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { ParachainSystem::collect_collation_info(header) diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml index 4e921ad884e..bdd0dfac606 100644 --- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml @@ -64,7 +64,7 @@ polkadot-runtime-common = { workspace = true } xcm = { workspace = true } xcm-builder = { workspace = true } xcm-executor = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # Cumulus cumulus-pallet-aura-ext = { workspace = true } @@ -135,7 +135,7 @@ std = [ "substrate-wasm-builder", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] @@ -166,7 +166,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ diff --git a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs index e77416e6cd5..8d03f833276 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs @@ -85,7 +85,7 @@ use xcm::{ latest::prelude::{AssetId as AssetLocationId, BodyId}, VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm, }; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -847,7 +847,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetLocationId(xcm_config::RelayLocation::get())]; PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -860,11 +860,11 @@ impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -879,7 +879,7 @@ impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { use xcm_builder::InspectMessageQueues; use xcm_executor::RecordXcm; diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index d12eaa5c0d4..89364ff7fab 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -95,7 +95,7 @@ substrate-state-trie-migration-rpc = { workspace = true, default-features = true # Polkadot # Use rococo-native as this is currently the default "local" relay chain -polkadot-cli = { features = ["rococo-native"], workspace = true, default-features = true } +polkadot-cli = { features = ["rococo-native", "westend-native"], workspace = true, default-features = true } polkadot-primitives = { workspace = true, default-features = true } polkadot-service = { workspace = true, default-features = true } xcm = { workspace = true, default-features = true } diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml index f043bd0b892..23cd51d8a04 100644 --- a/polkadot/node/service/Cargo.toml +++ b/polkadot/node/service/Cargo.toml @@ -143,7 +143,7 @@ polkadot-node-core-runtime-api = { optional = true, workspace = true, default-fe polkadot-statement-distribution = { optional = true, workspace = true, default-features = true } xcm = { workspace = true, default-features = true } -xcm-fee-payment-runtime-api = { workspace = true, default-features = true } +xcm-runtime-apis = { workspace = true, default-features = true } [dev-dependencies] polkadot-test-client = { workspace = true } @@ -217,7 +217,7 @@ runtime-benchmarks = [ "sc-service/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "westend-runtime?/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ "frame-support/try-runtime", diff --git a/polkadot/node/service/src/fake_runtime_api.rs b/polkadot/node/service/src/fake_runtime_api.rs index dd8a0a7e635..debf3690aea 100644 --- a/polkadot/node/service/src/fake_runtime_api.rs +++ b/polkadot/node/service/src/fake_runtime_api.rs @@ -398,30 +398,30 @@ sp_api::impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { - fn query_acceptable_payment_assets(_: xcm::Version) -> Result, xcm_fee_payment_runtime_api::fees::Error> { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { + fn query_acceptable_payment_assets(_: xcm::Version) -> Result, xcm_runtime_apis::fees::Error> { unimplemented!() } - fn query_weight_to_asset_fee(_: Weight, _: VersionedAssetId) -> Result { + fn query_weight_to_asset_fee(_: Weight, _: VersionedAssetId) -> Result { unimplemented!() } - fn query_xcm_weight(_: VersionedXcm<()>) -> Result { + fn query_xcm_weight(_: VersionedXcm<()>) -> Result { unimplemented!() } - fn query_delivery_fees(_: VersionedLocation, _: VersionedXcm<()>) -> Result { + fn query_delivery_fees(_: VersionedLocation, _: VersionedXcm<()>) -> Result { unimplemented!() } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { - fn dry_run_call(_: (), _: ()) -> Result, xcm_fee_payment_runtime_api::dry_run::Error> { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { + fn dry_run_call(_: (), _: ()) -> Result, xcm_runtime_apis::dry_run::Error> { unimplemented!() } - fn dry_run_xcm(_: VersionedLocation, _: VersionedXcm<()>) -> Result, xcm_fee_payment_runtime_api::dry_run::Error> { + fn dry_run_xcm(_: VersionedLocation, _: VersionedXcm<()>) -> Result, xcm_runtime_apis::dry_run::Error> { unimplemented!() } } diff --git a/polkadot/runtime/rococo/Cargo.toml b/polkadot/runtime/rococo/Cargo.toml index 7b199172e9a..c4fbd461a63 100644 --- a/polkadot/runtime/rococo/Cargo.toml +++ b/polkadot/runtime/rococo/Cargo.toml @@ -108,7 +108,7 @@ polkadot-parachain-primitives = { workspace = true } xcm = { workspace = true } xcm-executor = { workspace = true } xcm-builder = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } [dev-dependencies] tiny-keccak = { features = ["keccak"], workspace = true } @@ -217,7 +217,7 @@ std = [ "substrate-wasm-builder", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] runtime-benchmarks = [ @@ -270,7 +270,7 @@ runtime-benchmarks = [ "sp-staking/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ "frame-executive/try-runtime", diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index cb40a43a997..bbec754387e 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -131,7 +131,7 @@ use governance::{ pallet_custom_origins, AuctionAdmin, Fellows, GeneralAdmin, LeaseAdmin, Treasurer, TreasurySpender, }; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -1760,7 +1760,7 @@ sp_api::impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::TokenLocation::get())]; XcmPallet::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -1773,11 +1773,11 @@ sp_api::impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -1792,7 +1792,7 @@ sp_api::impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { XcmPallet::dry_run_call::(origin, call) } @@ -1802,6 +1802,18 @@ sp_api::impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationConverter, + >::convert_location(location) + } + } + impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { OpaqueMetadata::new(Runtime::metadata().into()) diff --git a/polkadot/runtime/westend/Cargo.toml b/polkadot/runtime/westend/Cargo.toml index f6e8dfc7816..5a7805c0516 100644 --- a/polkadot/runtime/westend/Cargo.toml +++ b/polkadot/runtime/westend/Cargo.toml @@ -114,7 +114,7 @@ polkadot-runtime-parachains = { workspace = true } xcm = { workspace = true } xcm-executor = { workspace = true } xcm-builder = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } [dev-dependencies] hex-literal = { workspace = true, default-features = true } @@ -228,7 +228,7 @@ std = [ "westend-runtime-constants/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] runtime-benchmarks = [ @@ -286,7 +286,7 @@ runtime-benchmarks = [ "sp-staking/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ "frame-election-provider-support/try-runtime", diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index aefc4e2db37..59789ed16cb 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -105,7 +105,7 @@ use sp_version::RuntimeVersion; use xcm::{latest::prelude::*, VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm}; use xcm_builder::PayOverXcm; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -2221,7 +2221,7 @@ sp_api::impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::fees::XcmPaymentApi for Runtime { + impl xcm_runtime_apis::fees::XcmPaymentApi for Runtime { fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { let acceptable_assets = vec![AssetId(xcm_config::TokenLocation::get())]; XcmPallet::query_acceptable_payment_assets(xcm_version, acceptable_assets) @@ -2234,11 +2234,11 @@ sp_api::impl_runtime_apis! { Ok(WeightToFee::weight_to_fee(&weight)) }, Ok(asset_id) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - unhandled asset_id: {asset_id:?}!"); Err(XcmPaymentApiError::AssetNotFound) }, Err(_) => { - log::trace!(target: "xcm::xcm_fee_payment_runtime_api", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); + log::trace!(target: "xcm::xcm_runtime_apis", "query_weight_to_asset_fee - failed to convert asset: {asset:?}!"); Err(XcmPaymentApiError::VersionedConversionFailed) } } @@ -2253,7 +2253,7 @@ sp_api::impl_runtime_apis! { } } - impl xcm_fee_payment_runtime_api::dry_run::DryRunApi for Runtime { + impl xcm_runtime_apis::dry_run::DryRunApi for Runtime { fn dry_run_call(origin: OriginCaller, call: RuntimeCall) -> Result, XcmDryRunApiError> { XcmPallet::dry_run_call::(origin, call) } @@ -2263,6 +2263,18 @@ sp_api::impl_runtime_apis! { } } + impl xcm_runtime_apis::conversions::LocationToAccountApi for Runtime { + fn convert_location(location: VersionedLocation) -> Result< + AccountId, + xcm_runtime_apis::conversions::Error + > { + xcm_runtime_apis::conversions::LocationToAccountHelper::< + AccountId, + xcm_config::LocationConverter, + >::convert_location(location) + } + } + impl pallet_nomination_pools_runtime_api::NominationPoolsApi< Block, AccountId, diff --git a/polkadot/xcm/pallet-xcm/Cargo.toml b/polkadot/xcm/pallet-xcm/Cargo.toml index 814900a0f00..0cce7a34493 100644 --- a/polkadot/xcm/pallet-xcm/Cargo.toml +++ b/polkadot/xcm/pallet-xcm/Cargo.toml @@ -26,7 +26,7 @@ sp-std = { workspace = true } xcm = { workspace = true } xcm-executor = { workspace = true } xcm-builder = { workspace = true } -xcm-fee-payment-runtime-api = { workspace = true } +xcm-runtime-apis = { workspace = true } # marked optional, used in benchmarking frame-benchmarking = { optional = true, workspace = true } @@ -55,7 +55,7 @@ std = [ "sp-std/std", "xcm-builder/std", "xcm-executor/std", - "xcm-fee-payment-runtime-api/std", + "xcm-runtime-apis/std", "xcm/std", ] runtime-benchmarks = [ @@ -69,7 +69,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", - "xcm-fee-payment-runtime-api/runtime-benchmarks", + "xcm-runtime-apis/runtime-benchmarks", ] try-runtime = [ "frame-support/try-runtime", diff --git a/polkadot/xcm/pallet-xcm/src/lib.rs b/polkadot/xcm/pallet-xcm/src/lib.rs index e1c365f5a24..668f07c52ce 100644 --- a/polkadot/xcm/pallet-xcm/src/lib.rs +++ b/polkadot/xcm/pallet-xcm/src/lib.rs @@ -64,7 +64,7 @@ use xcm_executor::{ }, AssetsInHolding, }; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ dry_run::{CallDryRunEffects, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::Error as XcmPaymentApiError, }; @@ -2442,7 +2442,7 @@ impl Pallet { /// /// Returns not only the call result and events, but also the local XCM, if any, /// and any XCMs forwarded to other locations. - /// Meant to be used in the `xcm_fee_payment_runtime_api::dry_run::DryRunApi` runtime API. + /// Meant to be used in the `xcm_runtime_apis::dry_run::DryRunApi` runtime API. pub fn dry_run_call( origin: OriginCaller, call: RuntimeCall, @@ -2474,7 +2474,7 @@ impl Pallet { /// Dry-runs `xcm` with the given `origin_location`. /// /// Returns execution result, events, and any forwarded XCMs to other locations. - /// Meant to be used in the `xcm_fee_payment_runtime_api::dry_run::DryRunApi` runtime API. + /// Meant to be used in the `xcm_runtime_apis::dry_run::DryRunApi` runtime API. pub fn dry_run_xcm( origin_location: VersionedLocation, xcm: VersionedXcm, diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/Cargo.toml b/polkadot/xcm/xcm-runtime-apis/Cargo.toml similarity index 82% rename from polkadot/xcm/xcm-fee-payment-runtime-api/Cargo.toml rename to polkadot/xcm/xcm-runtime-apis/Cargo.toml index ce1c3cfbaa7..7d3f1a20b63 100644 --- a/polkadot/xcm/xcm-fee-payment-runtime-api/Cargo.toml +++ b/polkadot/xcm/xcm-runtime-apis/Cargo.toml @@ -1,36 +1,32 @@ [package] -name = "xcm-fee-payment-runtime-api" +name = "xcm-runtime-apis" version = "0.1.0" authors.workspace = true edition.workspace = true license = "Apache-2.0" repository.workspace = true -description = "XCM fee payment runtime API" +description = "XCM runtime APIs" [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { features = [ - "derive", -], workspace = true } +codec = { features = ["derive"], workspace = true } +scale-info = { features = ["derive", "serde"], workspace = true } +frame-support = { workspace = true } sp-api = { workspace = true } -scale-info = { features = [ - "derive", - "serde", -], workspace = true } sp-std = { workspace = true } -sp-runtime = { workspace = true } sp-weights = { workspace = true } xcm = { workspace = true } -frame-support = { workspace = true } +xcm-executor = { workspace = true } [dev-dependencies] frame-system = { workspace = true } -pallet-xcm = { workspace = true } -xcm-builder = { workspace = true } sp-io = { workspace = true } +xcm-builder = { workspace = true } +hex-literal = { workspace = true } +pallet-xcm = { workspace = true } pallet-balances = { workspace = true } pallet-assets = { workspace = true } xcm-executor = { workspace = true } @@ -52,7 +48,6 @@ std = [ "scale-info/std", "sp-api/std", "sp-io/std", - "sp-runtime/std", "sp-std/std", "sp-weights/std", "xcm-builder/std", @@ -65,7 +60,6 @@ runtime-benchmarks = [ "pallet-assets/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", ] diff --git a/polkadot/xcm/xcm-runtime-apis/src/conversions.rs b/polkadot/xcm/xcm-runtime-apis/src/conversions.rs new file mode 100644 index 00000000000..d422664557e --- /dev/null +++ b/polkadot/xcm/xcm-runtime-apis/src/conversions.rs @@ -0,0 +1,56 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Contains runtime APIs for useful conversions, such as between XCM `Location` and `AccountId`. + +use codec::{Decode, Encode}; +use scale_info::TypeInfo; +use xcm::VersionedLocation; +use xcm_executor::traits::ConvertLocation; + +sp_api::decl_runtime_apis! { + /// API for useful conversions between XCM `Location` and `AccountId`. + pub trait LocationToAccountApi where AccountId: Decode { + /// Converts `Location` to `AccountId`. + fn convert_location(location: VersionedLocation) -> Result; + } +} + +#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] +pub enum Error { + /// Requested `Location` is not supported by the local conversion. + #[codec(index = 0)] + Unsupported, + + /// Converting a versioned data structure from one version to another failed. + #[codec(index = 1)] + VersionedConversionFailed, +} + +/// A helper implementation that can be used for `LocationToAccountApi` implementations. +/// It is useful when you already have a `ConvertLocation` implementation and a default +/// `Ss58Prefix`. +pub struct LocationToAccountHelper( + sp_std::marker::PhantomData<(AccountId, Conversion)>, +); +impl> + LocationToAccountHelper +{ + pub fn convert_location(location: VersionedLocation) -> Result { + let location = location.try_into().map_err(|_| Error::VersionedConversionFailed)?; + Conversion::convert_location(&location).ok_or(Error::Unsupported) + } +} diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/src/dry_run.rs b/polkadot/xcm/xcm-runtime-apis/src/dry_run.rs similarity index 100% rename from polkadot/xcm/xcm-fee-payment-runtime-api/src/dry_run.rs rename to polkadot/xcm/xcm-runtime-apis/src/dry_run.rs diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/src/fees.rs b/polkadot/xcm/xcm-runtime-apis/src/fees.rs similarity index 100% rename from polkadot/xcm/xcm-fee-payment-runtime-api/src/fees.rs rename to polkadot/xcm/xcm-runtime-apis/src/fees.rs diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs b/polkadot/xcm/xcm-runtime-apis/src/lib.rs similarity index 74% rename from polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs rename to polkadot/xcm/xcm-runtime-apis/src/lib.rs index 616ee4c2ecc..7b3b86214b3 100644 --- a/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs +++ b/polkadot/xcm/xcm-runtime-apis/src/lib.rs @@ -14,19 +14,17 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! Runtime APIs for estimating xcm fee payment. -//! This crate offers two APIs, one for estimating fees, -//! which can be used for any type of message, and another one -//! for returning the specific messages used for transfers, a common -//! feature. -//! Users of these APIs should call the transfers API and pass the result to the -//! fees API. +//! Various runtime APIs to support XCM processing and manipulation. #![cfg_attr(not(feature = "std"), no_std)] +/// Exposes runtime APIs for various XCM-related conversions. +pub mod conversions; + /// Dry-run API. /// Given an extrinsic or an XCM program, it returns the outcome of its execution. pub mod dry_run; + /// Fee estimation API. /// Given an XCM program, it will return the fees needed to execute it properly or send it. pub mod fees; diff --git a/polkadot/xcm/xcm-runtime-apis/tests/conversions.rs b/polkadot/xcm/xcm-runtime-apis/tests/conversions.rs new file mode 100644 index 00000000000..7f0f0923b09 --- /dev/null +++ b/polkadot/xcm/xcm-runtime-apis/tests/conversions.rs @@ -0,0 +1,83 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +mod mock; + +use frame_support::{ + assert_err, assert_ok, + sp_runtime::{ + testing::H256, + traits::{IdentifyAccount, Verify}, + AccountId32, MultiSignature, + }, +}; +use mock::*; +use sp_api::ProvideRuntimeApi; +use xcm::prelude::*; +use xcm_runtime_apis::conversions::{ + Error as LocationToAccountApiError, LocationToAccountApi, LocationToAccountHelper, +}; + +#[test] +fn convert_location_to_account_works() { + sp_io::TestExternalities::default().execute_with(|| { + let client = TestClient {}; + let runtime_api = client.runtime_api(); + + // Test unknown conversion for `Here` location + assert_err!( + runtime_api + .convert_location(H256::zero(), VersionedLocation::from(Location::here())) + .unwrap(), + LocationToAccountApiError::Unsupported + ); + + // Test known conversion for sibling parachain location + assert_ok!( + runtime_api + .convert_location(H256::zero(), VersionedLocation::from((Parent, Parachain(1000)))) + .unwrap(), + 1000_u64 + ); + }) +} + +#[test] +fn location_to_account_helper_with_multi_signature_works() { + type Signature = MultiSignature; + type AccountIdForConversions = <::Signer as IdentifyAccount>::AccountId; + // We alias only `Location::parent()` + pub type LocationToAccountIdForConversions = + (xcm_builder::ParentIsPreset,); + + // Test unknown conversion for `Here` location + assert_err!( + LocationToAccountHelper::< + AccountIdForConversions, + LocationToAccountIdForConversions, + >::convert_location(Location::here().into_versioned()), + LocationToAccountApiError::Unsupported + ); + + // Test known conversion for `Parent` location + assert_ok!( + LocationToAccountHelper::< + AccountIdForConversions, + LocationToAccountIdForConversions, + >::convert_location(Location::parent().into_versioned()), + AccountId32::from(hex_literal::hex!("506172656e740000000000000000000000000000000000000000000000000000")) + ); +} diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/tests/fee_estimation.rs b/polkadot/xcm/xcm-runtime-apis/tests/fee_estimation.rs similarity index 99% rename from polkadot/xcm/xcm-fee-payment-runtime-api/tests/fee_estimation.rs rename to polkadot/xcm/xcm-runtime-apis/tests/fee_estimation.rs index 33611c8a471..59ee1797380 100644 --- a/polkadot/xcm/xcm-fee-payment-runtime-api/tests/fee_estimation.rs +++ b/polkadot/xcm/xcm-runtime-apis/tests/fee_estimation.rs @@ -16,11 +16,11 @@ //! Tests for using both the XCM fee payment API and the dry-run API. +use frame_support::sp_runtime::testing::H256; use frame_system::RawOrigin; use sp_api::ProvideRuntimeApi; -use sp_runtime::testing::H256; use xcm::prelude::*; -use xcm_fee_payment_runtime_api::{dry_run::DryRunApi, fees::XcmPaymentApi}; +use xcm_runtime_apis::{dry_run::DryRunApi, fees::XcmPaymentApi}; mod mock; use mock::{ diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/tests/mock.rs b/polkadot/xcm/xcm-runtime-apis/tests/mock.rs similarity index 96% rename from polkadot/xcm/xcm-fee-payment-runtime-api/tests/mock.rs rename to polkadot/xcm/xcm-runtime-apis/tests/mock.rs index aa6c1422b60..3b73070da45 100644 --- a/polkadot/xcm/xcm-fee-payment-runtime-api/tests/mock.rs +++ b/polkadot/xcm/xcm-runtime-apis/tests/mock.rs @@ -19,7 +19,11 @@ use codec::Encode; use frame_support::{ - construct_runtime, derive_impl, parameter_types, + construct_runtime, derive_impl, parameter_types, sp_runtime, + sp_runtime::{ + traits::{Dispatchable, Get, IdentityLookup, MaybeEquivalence, TryConvert}, + BuildStorage, SaturatedConversion, + }, traits::{ AsEnsureOriginWithArg, ConstU128, ConstU32, Contains, ContainsPair, Everything, Nothing, OriginTrait, @@ -28,10 +32,6 @@ use frame_support::{ }; use frame_system::{EnsureRoot, RawOrigin as SystemRawOrigin}; use pallet_xcm::TestWeightInfo; -use sp_runtime::{ - traits::{Dispatchable, Get, IdentityLookup, MaybeEquivalence, TryConvert}, - BuildStorage, SaturatedConversion, -}; use sp_std::{cell::RefCell, marker::PhantomData}; use xcm::{prelude::*, Version as XcmVersion}; use xcm_builder::{ @@ -44,7 +44,8 @@ use xcm_executor::{ XcmExecutor, }; -use xcm_fee_payment_runtime_api::{ +use xcm_runtime_apis::{ + conversions::{Error as LocationToAccountApiError, LocationToAccountApi}, dry_run::{CallDryRunEffects, DryRunApi, Error as XcmDryRunApiError, XcmDryRunEffects}, fees::{Error as XcmPaymentApiError, XcmPaymentApi}, }; @@ -352,6 +353,7 @@ impl pallet_xcm::Config for TestRuntime { type WeightInfo = TestWeightInfo; } +#[allow(dead_code)] pub fn new_test_ext_with_balances(balances: Vec<(AccountId, Balance)>) -> sp_io::TestExternalities { let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); @@ -364,6 +366,7 @@ pub fn new_test_ext_with_balances(balances: Vec<(AccountId, Balance)>) -> sp_io: ext } +#[allow(dead_code)] pub fn new_test_ext_with_balances_and_assets( balances: Vec<(AccountId, Balance)>, assets: Vec<(AssetIdForAssetsPallet, AccountId, Balance)>, @@ -410,6 +413,14 @@ impl sp_api::ProvideRuntimeApi for TestClient { } sp_api::mock_impl_runtime_apis! { + impl LocationToAccountApi for RuntimeApi { + fn convert_location(location: VersionedLocation) -> Result { + let location = location.try_into().map_err(|_| LocationToAccountApiError::VersionedConversionFailed)?; + LocationToAccountId::convert_location(&location) + .ok_or(LocationToAccountApiError::Unsupported) + } + } + impl XcmPaymentApi for RuntimeApi { fn query_acceptable_payment_assets(xcm_version: XcmVersion) -> Result, XcmPaymentApiError> { Ok(vec![ diff --git a/prdoc/pr_4857.prdoc b/prdoc/pr_4857.prdoc new file mode 100644 index 00000000000..d515e425762 --- /dev/null +++ b/prdoc/pr_4857.prdoc @@ -0,0 +1,50 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[xcm] runtime api for LocationToAccount conversions" + +doc: + - audience: Runtime Dev + description: | + Introduces a new runtime API to help with conversions of XCM `Location` to the runtime's `AccountId`, + showing an Ss58 formatted address for easier verification. + + Besides that, the `xcm-fee-payment-runtime-api` module was merged into the new `xcm-runtime-apis`. + If you are using the `xcm-fee-payment-runtime-api` dependency, you just need to change it to `xcm-runtime-apis` + and update the imports from `use xcm_fee_payment_runtime_api::*` to `use xcm_runtime_apis::*`. + +crates: + - name: xcm-runtime-apis + bump: none + - name: polkadot-sdk + bump: patch + - name: pallet-xcm + bump: patch + - name: polkadot-service + bump: patch + - name: rococo-runtime + bump: patch + - name: westend-runtime + bump: patch + - name: asset-hub-rococo-runtime + bump: patch + - name: asset-hub-westend-runtime + bump: patch + - name: bridge-hub-rococo-runtime + bump: patch + - name: bridge-hub-westend-runtime + bump: patch + - name: collectives-westend-runtime + bump: patch + - name: people-rococo-runtime + bump: patch + - name: people-westend-runtime + bump: patch + - name: penpal-runtime + bump: patch + - name: contracts-rococo-runtime + bump: patch + - name: coretime-rococo-runtime + bump: patch + - name: coretime-westend-runtime + bump: none diff --git a/umbrella/Cargo.toml b/umbrella/Cargo.toml index 93af28a7ddd..94ba09421d4 100644 --- a/umbrella/Cargo.toml +++ b/umbrella/Cargo.toml @@ -240,7 +240,7 @@ std = [ "substrate-bip39?/std", "testnet-parachains-constants?/std", "westend-runtime-constants?/std", - "xcm-fee-payment-runtime-api?/std", + "xcm-runtime-apis?/std", ] runtime-benchmarks = [ "assets-common?/runtime-benchmarks", @@ -365,7 +365,7 @@ runtime-benchmarks = [ "staging-node-inspect?/runtime-benchmarks", "staging-xcm-builder?/runtime-benchmarks", "staging-xcm-executor?/runtime-benchmarks", - "xcm-fee-payment-runtime-api?/runtime-benchmarks", + "xcm-runtime-apis?/runtime-benchmarks", ] try-runtime = [ "cumulus-pallet-aura-ext?/try-runtime", @@ -539,7 +539,7 @@ with-tracing = [ "sp-tracing?/with-tracing", "sp-tracing?/with-tracing", ] -runtime = ["assets-common", "binary-merkle-tree", "bp-asset-hub-rococo", "bp-asset-hub-westend", "bp-bridge-hub-cumulus", "bp-bridge-hub-kusama", "bp-bridge-hub-polkadot", "bp-bridge-hub-rococo", "bp-bridge-hub-westend", "bp-header-chain", "bp-kusama", "bp-messages", "bp-parachains", "bp-polkadot", "bp-polkadot-bulletin", "bp-polkadot-core", "bp-relayers", "bp-rococo", "bp-runtime", "bp-test-utils", "bp-westend", "bp-xcm-bridge-hub", "bp-xcm-bridge-hub-router", "bridge-hub-common", "bridge-runtime-common", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", "cumulus-pallet-parachain-system-proc-macro", "cumulus-pallet-session-benchmarking", "cumulus-pallet-solo-to-para", "cumulus-pallet-xcm", "cumulus-pallet-xcmp-queue", "cumulus-ping", "cumulus-primitives-aura", "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", "cumulus-primitives-proof-size-hostfunction", "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-timestamp", "cumulus-primitives-utility", "frame-benchmarking", "frame-benchmarking-pallet-pov", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-executive", "frame-metadata-hash-extension", "frame-support", "frame-support-procedural", "frame-support-procedural-tools-derive", "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", "pallet-alliance", "pallet-asset-conversion", "pallet-asset-conversion-ops", "pallet-asset-conversion-tx-payment", "pallet-asset-rate", "pallet-asset-tx-payment", "pallet-assets", "pallet-assets-freezer", "pallet-atomic-swap", "pallet-aura", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", "pallet-bags-list", "pallet-balances", "pallet-beefy", "pallet-beefy-mmr", "pallet-bounties", "pallet-bridge-grandpa", "pallet-bridge-messages", "pallet-bridge-parachains", "pallet-bridge-relayers", "pallet-broker", "pallet-child-bounties", "pallet-collator-selection", "pallet-collective", "pallet-collective-content", "pallet-contracts", "pallet-contracts-proc-macro", "pallet-contracts-uapi", "pallet-conviction-voting", "pallet-core-fellowship", "pallet-delegated-staking", "pallet-democracy", "pallet-dev-mode", "pallet-election-provider-multi-phase", "pallet-election-provider-support-benchmarking", "pallet-elections-phragmen", "pallet-fast-unstake", "pallet-glutton", "pallet-grandpa", "pallet-identity", "pallet-im-online", "pallet-indices", "pallet-insecure-randomness-collective-flip", "pallet-lottery", "pallet-membership", "pallet-message-queue", "pallet-migrations", "pallet-mixnet", "pallet-mmr", "pallet-multisig", "pallet-nft-fractionalization", "pallet-nfts", "pallet-nfts-runtime-api", "pallet-nis", "pallet-node-authorization", "pallet-nomination-pools", "pallet-nomination-pools-benchmarking", "pallet-nomination-pools-runtime-api", "pallet-offences", "pallet-offences-benchmarking", "pallet-paged-list", "pallet-parameters", "pallet-preimage", "pallet-proxy", "pallet-ranked-collective", "pallet-recovery", "pallet-referenda", "pallet-remark", "pallet-root-offences", "pallet-root-testing", "pallet-safe-mode", "pallet-salary", "pallet-scheduler", "pallet-scored-pool", "pallet-session", "pallet-session-benchmarking", "pallet-skip-feeless-payment", "pallet-society", "pallet-staking", "pallet-staking-reward-curve", "pallet-staking-reward-fn", "pallet-staking-runtime-api", "pallet-state-trie-migration", "pallet-statement", "pallet-sudo", "pallet-timestamp", "pallet-tips", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", "pallet-transaction-storage", "pallet-treasury", "pallet-tx-pause", "pallet-uniques", "pallet-utility", "pallet-vesting", "pallet-whitelist", "pallet-xcm", "pallet-xcm-benchmarks", "pallet-xcm-bridge-hub", "pallet-xcm-bridge-hub-router", "parachains-common", "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-primitives", "polkadot-runtime-common", "polkadot-runtime-metrics", "polkadot-runtime-parachains", "polkadot-sdk-frame", "rococo-runtime-constants", "sc-chain-spec-derive", "sc-tracing-proc-macro", "slot-range-helper", "snowbridge-beacon-primitives", "snowbridge-core", "snowbridge-ethereum", "snowbridge-outbound-queue-merkle-tree", "snowbridge-outbound-queue-runtime-api", "snowbridge-pallet-ethereum-client", "snowbridge-pallet-ethereum-client-fixtures", "snowbridge-pallet-inbound-queue", "snowbridge-pallet-inbound-queue-fixtures", "snowbridge-pallet-outbound-queue", "snowbridge-pallet-system", "snowbridge-router-primitives", "snowbridge-runtime-common", "snowbridge-system-runtime-api", "sp-api", "sp-api-proc-macro", "sp-application-crypto", "sp-arithmetic", "sp-authority-discovery", "sp-block-builder", "sp-consensus-aura", "sp-consensus-babe", "sp-consensus-beefy", "sp-consensus-grandpa", "sp-consensus-pow", "sp-consensus-slots", "sp-core", "sp-crypto-ec-utils", "sp-crypto-hashing", "sp-crypto-hashing-proc-macro", "sp-debug-derive", "sp-externalities", "sp-genesis-builder", "sp-inherents", "sp-io", "sp-keyring", "sp-keystore", "sp-metadata-ir", "sp-mixnet", "sp-mmr-primitives", "sp-npos-elections", "sp-offchain", "sp-runtime", "sp-runtime-interface", "sp-runtime-interface-proc-macro", "sp-session", "sp-staking", "sp-state-machine", "sp-statement-store", "sp-std", "sp-storage", "sp-timestamp", "sp-tracing", "sp-transaction-pool", "sp-transaction-storage-proof", "sp-trie", "sp-version", "sp-version-proc-macro", "sp-wasm-interface", "sp-weights", "staging-parachain-info", "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", "substrate-bip39", "testnet-parachains-constants", "tracing-gum-proc-macro", "westend-runtime-constants", "xcm-fee-payment-runtime-api", "xcm-procedural"] +runtime = ["assets-common", "binary-merkle-tree", "bp-asset-hub-rococo", "bp-asset-hub-westend", "bp-bridge-hub-cumulus", "bp-bridge-hub-kusama", "bp-bridge-hub-polkadot", "bp-bridge-hub-rococo", "bp-bridge-hub-westend", "bp-header-chain", "bp-kusama", "bp-messages", "bp-parachains", "bp-polkadot", "bp-polkadot-bulletin", "bp-polkadot-core", "bp-relayers", "bp-rococo", "bp-runtime", "bp-test-utils", "bp-westend", "bp-xcm-bridge-hub", "bp-xcm-bridge-hub-router", "bridge-hub-common", "bridge-runtime-common", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", "cumulus-pallet-parachain-system-proc-macro", "cumulus-pallet-session-benchmarking", "cumulus-pallet-solo-to-para", "cumulus-pallet-xcm", "cumulus-pallet-xcmp-queue", "cumulus-ping", "cumulus-primitives-aura", "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", "cumulus-primitives-proof-size-hostfunction", "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-timestamp", "cumulus-primitives-utility", "frame-benchmarking", "frame-benchmarking-pallet-pov", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-executive", "frame-metadata-hash-extension", "frame-support", "frame-support-procedural", "frame-support-procedural-tools-derive", "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", "pallet-alliance", "pallet-asset-conversion", "pallet-asset-conversion-ops", "pallet-asset-conversion-tx-payment", "pallet-asset-rate", "pallet-asset-tx-payment", "pallet-assets", "pallet-assets-freezer", "pallet-atomic-swap", "pallet-aura", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", "pallet-bags-list", "pallet-balances", "pallet-beefy", "pallet-beefy-mmr", "pallet-bounties", "pallet-bridge-grandpa", "pallet-bridge-messages", "pallet-bridge-parachains", "pallet-bridge-relayers", "pallet-broker", "pallet-child-bounties", "pallet-collator-selection", "pallet-collective", "pallet-collective-content", "pallet-contracts", "pallet-contracts-proc-macro", "pallet-contracts-uapi", "pallet-conviction-voting", "pallet-core-fellowship", "pallet-delegated-staking", "pallet-democracy", "pallet-dev-mode", "pallet-election-provider-multi-phase", "pallet-election-provider-support-benchmarking", "pallet-elections-phragmen", "pallet-fast-unstake", "pallet-glutton", "pallet-grandpa", "pallet-identity", "pallet-im-online", "pallet-indices", "pallet-insecure-randomness-collective-flip", "pallet-lottery", "pallet-membership", "pallet-message-queue", "pallet-migrations", "pallet-mixnet", "pallet-mmr", "pallet-multisig", "pallet-nft-fractionalization", "pallet-nfts", "pallet-nfts-runtime-api", "pallet-nis", "pallet-node-authorization", "pallet-nomination-pools", "pallet-nomination-pools-benchmarking", "pallet-nomination-pools-runtime-api", "pallet-offences", "pallet-offences-benchmarking", "pallet-paged-list", "pallet-parameters", "pallet-preimage", "pallet-proxy", "pallet-ranked-collective", "pallet-recovery", "pallet-referenda", "pallet-remark", "pallet-root-offences", "pallet-root-testing", "pallet-safe-mode", "pallet-salary", "pallet-scheduler", "pallet-scored-pool", "pallet-session", "pallet-session-benchmarking", "pallet-skip-feeless-payment", "pallet-society", "pallet-staking", "pallet-staking-reward-curve", "pallet-staking-reward-fn", "pallet-staking-runtime-api", "pallet-state-trie-migration", "pallet-statement", "pallet-sudo", "pallet-timestamp", "pallet-tips", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", "pallet-transaction-storage", "pallet-treasury", "pallet-tx-pause", "pallet-uniques", "pallet-utility", "pallet-vesting", "pallet-whitelist", "pallet-xcm", "pallet-xcm-benchmarks", "pallet-xcm-bridge-hub", "pallet-xcm-bridge-hub-router", "parachains-common", "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-primitives", "polkadot-runtime-common", "polkadot-runtime-metrics", "polkadot-runtime-parachains", "polkadot-sdk-frame", "rococo-runtime-constants", "sc-chain-spec-derive", "sc-tracing-proc-macro", "slot-range-helper", "snowbridge-beacon-primitives", "snowbridge-core", "snowbridge-ethereum", "snowbridge-outbound-queue-merkle-tree", "snowbridge-outbound-queue-runtime-api", "snowbridge-pallet-ethereum-client", "snowbridge-pallet-ethereum-client-fixtures", "snowbridge-pallet-inbound-queue", "snowbridge-pallet-inbound-queue-fixtures", "snowbridge-pallet-outbound-queue", "snowbridge-pallet-system", "snowbridge-router-primitives", "snowbridge-runtime-common", "snowbridge-system-runtime-api", "sp-api", "sp-api-proc-macro", "sp-application-crypto", "sp-arithmetic", "sp-authority-discovery", "sp-block-builder", "sp-consensus-aura", "sp-consensus-babe", "sp-consensus-beefy", "sp-consensus-grandpa", "sp-consensus-pow", "sp-consensus-slots", "sp-core", "sp-crypto-ec-utils", "sp-crypto-hashing", "sp-crypto-hashing-proc-macro", "sp-debug-derive", "sp-externalities", "sp-genesis-builder", "sp-inherents", "sp-io", "sp-keyring", "sp-keystore", "sp-metadata-ir", "sp-mixnet", "sp-mmr-primitives", "sp-npos-elections", "sp-offchain", "sp-runtime", "sp-runtime-interface", "sp-runtime-interface-proc-macro", "sp-session", "sp-staking", "sp-state-machine", "sp-statement-store", "sp-std", "sp-storage", "sp-timestamp", "sp-tracing", "sp-transaction-pool", "sp-transaction-storage-proof", "sp-trie", "sp-version", "sp-version-proc-macro", "sp-wasm-interface", "sp-weights", "staging-parachain-info", "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", "substrate-bip39", "testnet-parachains-constants", "tracing-gum-proc-macro", "westend-runtime-constants", "xcm-procedural", "xcm-runtime-apis"] node = ["asset-test-utils", "bridge-hub-test-utils", "cumulus-client-cli", "cumulus-client-collator", "cumulus-client-consensus-aura", "cumulus-client-consensus-common", "cumulus-client-consensus-proposer", "cumulus-client-consensus-relay-chain", "cumulus-client-network", "cumulus-client-parachain-inherent", "cumulus-client-pov-recovery", "cumulus-client-service", "cumulus-relay-chain-inprocess-interface", "cumulus-relay-chain-interface", "cumulus-relay-chain-minimal-node", "cumulus-relay-chain-rpc-interface", "cumulus-test-relay-sproof-builder", "emulated-integration-tests-common", "fork-tree", "frame-benchmarking-cli", "frame-remote-externalities", "frame-support-procedural-tools", "generate-bags", "mmr-gadget", "mmr-rpc", "pallet-contracts-mock-network", "pallet-transaction-payment-rpc", "parachains-runtimes-test-utils", "polkadot-approval-distribution", "polkadot-availability-bitfield-distribution", "polkadot-availability-distribution", "polkadot-availability-recovery", "polkadot-cli", "polkadot-collator-protocol", "polkadot-dispute-distribution", "polkadot-erasure-coding", "polkadot-gossip-support", "polkadot-network-bridge", "polkadot-node-collation-generation", "polkadot-node-core-approval-voting", "polkadot-node-core-av-store", "polkadot-node-core-backing", "polkadot-node-core-bitfield-signing", "polkadot-node-core-candidate-validation", "polkadot-node-core-chain-api", "polkadot-node-core-chain-selection", "polkadot-node-core-dispute-coordinator", "polkadot-node-core-parachains-inherent", "polkadot-node-core-prospective-parachains", "polkadot-node-core-provisioner", "polkadot-node-core-pvf", "polkadot-node-core-pvf-checker", "polkadot-node-core-pvf-common", "polkadot-node-core-pvf-execute-worker", "polkadot-node-core-pvf-prepare-worker", "polkadot-node-core-runtime-api", "polkadot-node-jaeger", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-types", "polkadot-node-subsystem-util", "polkadot-overseer", "polkadot-rpc", "polkadot-service", "polkadot-statement-distribution", "polkadot-statement-table", "sc-allocator", "sc-authority-discovery", "sc-basic-authorship", "sc-block-builder", "sc-chain-spec", "sc-cli", "sc-client-api", "sc-client-db", "sc-consensus", "sc-consensus-aura", "sc-consensus-babe", "sc-consensus-babe-rpc", "sc-consensus-beefy", "sc-consensus-beefy-rpc", "sc-consensus-epochs", "sc-consensus-grandpa", "sc-consensus-grandpa-rpc", "sc-consensus-manual-seal", "sc-consensus-pow", "sc-consensus-slots", "sc-executor", "sc-executor-common", "sc-executor-polkavm", "sc-executor-wasmtime", "sc-informant", "sc-keystore", "sc-mixnet", "sc-network", "sc-network-common", "sc-network-gossip", "sc-network-light", "sc-network-statement", "sc-network-sync", "sc-network-transactions", "sc-network-types", "sc-offchain", "sc-proposer-metrics", "sc-rpc", "sc-rpc-api", "sc-rpc-server", "sc-rpc-spec-v2", "sc-service", "sc-state-db", "sc-statement-store", "sc-storage-monitor", "sc-sync-state-rpc", "sc-sysinfo", "sc-telemetry", "sc-tracing", "sc-transaction-pool", "sc-transaction-pool-api", "sc-utils", "snowbridge-runtime-test-common", "sp-blockchain", "sp-consensus", "sp-core-hashing", "sp-core-hashing-proc-macro", "sp-database", "sp-maybe-compressed-blob", "sp-panic-handler", "sp-rpc", "staging-chain-spec-builder", "staging-node-inspect", "staging-tracking-allocator", "std", "subkey", "substrate-build-script-utils", "substrate-frame-rpc-support", "substrate-frame-rpc-system", "substrate-prometheus-endpoint", "substrate-rpc-client", "substrate-state-trie-migration-rpc", "substrate-wasm-builder", "tracing-gum", "xcm-emulator", "xcm-simulator"] tuples-96 = [ "frame-support-procedural?/tuples-96", @@ -1732,13 +1732,13 @@ path = "../polkadot/runtime/westend/constants" default-features = false optional = true -[dependencies.xcm-fee-payment-runtime-api] -path = "../polkadot/xcm/xcm-fee-payment-runtime-api" +[dependencies.xcm-procedural] +path = "../polkadot/xcm/procedural" default-features = false optional = true -[dependencies.xcm-procedural] -path = "../polkadot/xcm/procedural" +[dependencies.xcm-runtime-apis] +path = "../polkadot/xcm/xcm-runtime-apis" default-features = false optional = true diff --git a/umbrella/src/lib.rs b/umbrella/src/lib.rs index 87fcd4214db..58a5691961d 100644 --- a/umbrella/src/lib.rs +++ b/umbrella/src/lib.rs @@ -1560,14 +1560,14 @@ pub use westend_runtime_constants; #[cfg(feature = "xcm-emulator")] pub use xcm_emulator; -/// XCM fee payment runtime API. -#[cfg(feature = "xcm-fee-payment-runtime-api")] -pub use xcm_fee_payment_runtime_api; - /// Procedural macros for XCM. #[cfg(feature = "xcm-procedural")] pub use xcm_procedural; +/// XCM runtime APIs. +#[cfg(feature = "xcm-runtime-apis")] +pub use xcm_runtime_apis; + /// Test kit to simulate cross-chain message passing and XCM execution. #[cfg(feature = "xcm-simulator")] pub use xcm_simulator; -- GitLab From b4ae5b01da280f754ccc00b94314a30b658182a1 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Wed, 26 Jun 2024 16:45:37 +0200 Subject: [PATCH 059/130] Fellowship-core: add fast promote (#4877) Add a `promote_fast` extrinsic to the `core-fellowship` pallet to allow promotions that ignore the promotion cooldown. It comes with a new `FastPromoteOrigin`. Supersedes https://github.com/paritytech/polkadot-sdk/pull/4778 --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: command-bot <> --- .../collectives-westend/src/ambassador/mod.rs | 1 + .../collectives-westend/src/fellowship/mod.rs | 1 + .../pallet_core_fellowship_ambassador_core.rs | 14 ++ .../pallet_core_fellowship_fellowship_core.rs | 14 ++ prdoc/pr_4877.prdoc | 13 ++ substrate/bin/node/runtime/src/lib.rs | 1 + .../frame/core-fellowship/src/benchmarking.rs | 16 ++ substrate/frame/core-fellowship/src/lib.rs | 42 +++++ .../core-fellowship/src/tests/integration.rs | 1 + .../frame/core-fellowship/src/tests/unit.rs | 96 +++++++++- .../frame/core-fellowship/src/weights.rs | 165 ++++++++++++------ 11 files changed, 309 insertions(+), 55 deletions(-) create mode 100644 prdoc/pr_4877.prdoc diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs index 478fb65e018..a052a9d3800 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs @@ -220,6 +220,7 @@ impl pallet_core_fellowship::Config for Runtime { >; type ApproveOrigin = PromoteOrigin; type PromoteOrigin = PromoteOrigin; + type FastPromoteOrigin = Self::PromoteOrigin; type EvidenceSize = ConstU32<65536>; type MaxRank = ConstU32<9>; } diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs index 5e956bcdfee..942e0c294dd 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs @@ -208,6 +208,7 @@ impl pallet_core_fellowship::Config for Runtime { >, EnsureCanPromoteTo, >; + type FastPromoteOrigin = Self::PromoteOrigin; type EvidenceSize = ConstU32<65536>; type MaxRank = ConstU32<9>; } diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_ambassador_core.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_ambassador_core.rs index dbe681f51bb..6bedfcc7e01 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_ambassador_core.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_ambassador_core.rs @@ -171,6 +171,20 @@ impl pallet_core_fellowship::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(6)) } + fn promote_fast(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `16844` + // Estimated: `19894 + r * (2489 ±0)` + // Minimum execution time: 45_065_000 picoseconds. + Weight::from_parts(34_090_392, 19894) + // Standard Error: 18_620 + .saturating_add(Weight::from_parts(13_578_046, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 2489).saturating_mul(r.into())) + } /// Storage: `AmbassadorCollective::Members` (r:1 w:0) /// Proof: `AmbassadorCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) /// Storage: `AmbassadorCore::Member` (r:1 w:1) diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_fellowship_core.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_fellowship_core.rs index 7e6264c0c10..05014e273f0 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_fellowship_core.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_core_fellowship_fellowship_core.rs @@ -170,6 +170,20 @@ impl pallet_core_fellowship::WeightInfo for WeightInfo< .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(6)) } + fn promote_fast(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `16844` + // Estimated: `19894 + r * (2489 ±0)` + // Minimum execution time: 45_065_000 picoseconds. + Weight::from_parts(34_090_392, 19894) + // Standard Error: 18_620 + .saturating_add(Weight::from_parts(13_578_046, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 2489).saturating_mul(r.into())) + } /// Storage: `FellowshipCollective::Members` (r:1 w:0) /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) /// Storage: `FellowshipCore::Member` (r:1 w:1) diff --git a/prdoc/pr_4877.prdoc b/prdoc/pr_4877.prdoc new file mode 100644 index 00000000000..ede536aee45 --- /dev/null +++ b/prdoc/pr_4877.prdoc @@ -0,0 +1,13 @@ +title: "Core-Fellowship: new promote_fast call" + +doc: + - audience: Runtime User + description: | + Adds the ability to quickly promote someone within a collective by bypassing the promotion + cooldown. This can help in special situations and comes with a new origin: `FastPromoteOrigin`. + +crates: + - name: pallet-core-fellowship + bump: major + - name: collectives-westend-runtime + bump: major diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index c2601952cf1..a3dc7decd10 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1867,6 +1867,7 @@ impl pallet_core_fellowship::Config for Runtime { type InductOrigin = pallet_core_fellowship::EnsureInducted; type ApproveOrigin = EnsureRootWithSuccess>; type PromoteOrigin = EnsureRootWithSuccess>; + type FastPromoteOrigin = Self::PromoteOrigin; type EvidenceSize = ConstU32<16_384>; type MaxRank = ConstU32<9>; } diff --git a/substrate/frame/core-fellowship/src/benchmarking.rs b/substrate/frame/core-fellowship/src/benchmarking.rs index 2dabab3983d..34461e062b3 100644 --- a/substrate/frame/core-fellowship/src/benchmarking.rs +++ b/substrate/frame/core-fellowship/src/benchmarking.rs @@ -210,6 +210,22 @@ mod benchmarks { Ok(()) } + /// Benchmark the `promote_fast` extrinsic to promote someone up to `r`. + #[benchmark] + fn promote_fast(r: Linear<1, { T::MaxRank::get() as u32 }>) -> Result<(), BenchmarkError> { + let r = r.try_into().expect("r is too large"); + let member = make_member::(0)?; + + ensure_evidence::(&member)?; + + #[extrinsic_call] + _(RawOrigin::Root, member.clone(), r); + + assert_eq!(T::Members::rank_of(&member), Some(r)); + assert!(!MemberEvidence::::contains_key(&member)); + Ok(()) + } + #[benchmark] fn offboard() -> Result<(), BenchmarkError> { let member = make_member::(0)?; diff --git a/substrate/frame/core-fellowship/src/lib.rs b/substrate/frame/core-fellowship/src/lib.rs index 6f0bb77714d..5ed2562d6d0 100644 --- a/substrate/frame/core-fellowship/src/lib.rs +++ b/substrate/frame/core-fellowship/src/lib.rs @@ -209,6 +209,10 @@ pub mod pallet { /// rank to which it can promote. type PromoteOrigin: EnsureOrigin>; + /// The origin that has permission to "fast" promote a member by ignoring promotion periods + /// and skipping ranks. The `Success` value is the maximum rank to which it can promote. + type FastPromoteOrigin: EnsureOrigin>; + /// The maximum size in bytes submitted evidence is allowed to be. #[pallet::constant] type EvidenceSize: Get; @@ -498,6 +502,44 @@ pub mod pallet { Ok(()) } + /// Fast promotions can skip ranks and ignore the `min_promotion_period`. + /// + /// This is useful for out-of-band promotions, hence it has its own `FastPromoteOrigin` to + /// be (possibly) more restrictive than `PromoteOrigin`. Note that the member must already + /// be inducted. + #[pallet::weight(T::WeightInfo::promote_fast(*to_rank as u32))] + #[pallet::call_index(10)] + pub fn promote_fast( + origin: OriginFor, + who: T::AccountId, + to_rank: RankOf, + ) -> DispatchResult { + match T::FastPromoteOrigin::try_origin(origin) { + Ok(allow_rank) => ensure!(allow_rank >= to_rank, Error::::NoPermission), + Err(origin) => ensure_root(origin)?, + } + ensure!(to_rank as u32 <= T::MaxRank::get(), Error::::InvalidRank); + let curr_rank = T::Members::rank_of(&who).ok_or(Error::::Unranked)?; + ensure!(to_rank > curr_rank, Error::::UnexpectedRank); + + let mut member = Member::::get(&who).ok_or(Error::::NotTracked)?; + let now = frame_system::Pallet::::block_number(); + member.last_promotion = now; + member.last_proof = now; + + for rank in (curr_rank + 1)..=to_rank { + T::Members::promote(&who)?; + + // NOTE: We could factor this out, but it would destroy our invariants: + Member::::insert(&who, &member); + + Self::dispose_evidence(who.clone(), rank.saturating_sub(1), Some(rank)); + Self::deposit_event(Event::::Promoted { who: who.clone(), to_rank: rank }); + } + + Ok(()) + } + /// Stop tracking a prior member who is now not a ranked member of the collective. /// /// - `origin`: A `Signed` origin of an account. diff --git a/substrate/frame/core-fellowship/src/tests/integration.rs b/substrate/frame/core-fellowship/src/tests/integration.rs index e3451bc4340..bcf70c7beb1 100644 --- a/substrate/frame/core-fellowship/src/tests/integration.rs +++ b/substrate/frame/core-fellowship/src/tests/integration.rs @@ -78,6 +78,7 @@ impl Config for Test { type InductOrigin = EnsureInducted; type ApproveOrigin = TryMapSuccess, u64>, TryMorphInto>; type PromoteOrigin = TryMapSuccess, u64>, TryMorphInto>; + type FastPromoteOrigin = Self::PromoteOrigin; type EvidenceSize = EvidenceSize; type MaxRank = ConstU32<9>; } diff --git a/substrate/frame/core-fellowship/src/tests/unit.rs b/substrate/frame/core-fellowship/src/tests/unit.rs index 5d6d59c5c89..11d1ea9fe5b 100644 --- a/substrate/frame/core-fellowship/src/tests/unit.rs +++ b/substrate/frame/core-fellowship/src/tests/unit.rs @@ -21,7 +21,7 @@ use std::collections::BTreeMap; use core::cell::RefCell; use frame_support::{ - assert_noop, assert_ok, derive_impl, ord_parameter_types, + assert_noop, assert_ok, derive_impl, hypothetically, ord_parameter_types, pallet_prelude::Weight, parameter_types, traits::{tokens::GetSalary, ConstU32, IsInVec, TryMapSuccess}, @@ -115,6 +115,7 @@ impl Config for Test { type InductOrigin = EnsureInducted; type ApproveOrigin = TryMapSuccess, u64>, TryMorphInto>; type PromoteOrigin = TryMapSuccess, u64>, TryMorphInto>; + type FastPromoteOrigin = Self::PromoteOrigin; type EvidenceSize = ConstU32<1024>; type MaxRank = ConstU32<9>; } @@ -256,6 +257,99 @@ fn promote_works() { }); } +#[test] +fn promote_fast_works() { + let alice = 1; + + new_test_ext().execute_with(|| { + assert_noop!( + CoreFellowship::promote_fast(signed(alice), alice, 1), + Error::::Unranked + ); + set_rank(alice, 0); + assert_noop!( + CoreFellowship::promote_fast(signed(alice), alice, 1), + Error::::NotTracked + ); + assert_ok!(CoreFellowship::import(signed(alice))); + + // Cannot fast promote to the same rank: + assert_noop!( + CoreFellowship::promote_fast(signed(alice), alice, 0), + Error::::UnexpectedRank + ); + assert_ok!(CoreFellowship::promote_fast(signed(alice), alice, 1)); + assert_eq!(TestClub::rank_of(&alice), Some(1)); + + // Cannot promote normally because of the period: + assert_noop!(CoreFellowship::promote(signed(2), alice, 2), Error::::TooSoon); + // But can fast promote: + assert_ok!(CoreFellowship::promote_fast(signed(2), alice, 2)); + assert_eq!(TestClub::rank_of(&alice), Some(2)); + + // Cannot promote to lower rank: + assert_noop!( + CoreFellowship::promote_fast(signed(alice), alice, 0), + Error::::UnexpectedRank + ); + assert_noop!( + CoreFellowship::promote_fast(signed(alice), alice, 1), + Error::::UnexpectedRank + ); + // Permission is checked: + assert_noop!( + CoreFellowship::promote_fast(signed(alice), alice, 2), + Error::::NoPermission + ); + + // Can fast promote up to the maximum: + assert_ok!(CoreFellowship::promote_fast(signed(9), alice, 9)); + // But not past the maximum: + assert_noop!( + CoreFellowship::promote_fast(RuntimeOrigin::root(), alice, 10), + Error::::InvalidRank + ); + }); +} + +/// Compare the storage root hashes of a normal promote and a fast promote. +#[test] +fn promote_fast_identical_to_promote() { + let alice = 1; + + new_test_ext().execute_with(|| { + set_rank(alice, 0); + assert_eq!(TestClub::rank_of(&alice), Some(0)); + assert_ok!(CoreFellowship::import(signed(alice))); + run_to(3); + assert_eq!(TestClub::rank_of(&alice), Some(0)); + assert_ok!(CoreFellowship::submit_evidence( + signed(alice), + Wish::Promotion, + bounded_vec![0; 1024] + )); + + let root_promote = hypothetically!({ + assert_ok!(CoreFellowship::promote(signed(alice), alice, 1)); + // Don't clean the events since they should emit the same events: + sp_io::storage::root(sp_runtime::StateVersion::V1) + }); + + // This is using thread locals instead of storage... + TestClub::demote(&alice).unwrap(); + + let root_promote_fast = hypothetically!({ + assert_ok!(CoreFellowship::promote_fast(signed(alice), alice, 1)); + + sp_io::storage::root(sp_runtime::StateVersion::V1) + }); + + assert_eq!(root_promote, root_promote_fast); + // Ensure that we don't compare trivial stuff like `()` from a type error above. + assert_eq!(root_promote.len(), 32); + }); +} + #[test] fn sync_works() { new_test_ext().execute_with(|| { diff --git a/substrate/frame/core-fellowship/src/weights.rs b/substrate/frame/core-fellowship/src/weights.rs index c1042d0ddfa..5e64600b662 100644 --- a/substrate/frame/core-fellowship/src/weights.rs +++ b/substrate/frame/core-fellowship/src/weights.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for `pallet_core_fellowship` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-04-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-x5tnzzy-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -56,6 +56,7 @@ pub trait WeightInfo { fn set_active() -> Weight; fn induct() -> Weight; fn promote() -> Weight; + fn promote_fast(r: u32, ) -> Weight; fn offboard() -> Weight; fn import() -> Weight; fn approve() -> Weight; @@ -71,18 +72,19 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_633_000 picoseconds. - Weight::from_parts(8_018_000, 0) + // Minimum execution time: 5_772_000 picoseconds. + Weight::from_parts(6_000_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: CoreFellowship Params (r:0 w:1) - /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Params` (r:1 w:1) + /// Proof: `CoreFellowship::Params` (`max_values`: Some(1), `max_size`: Some(368), added: 863, mode: `MaxEncodedLen`) fn set_partial_params() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 9_454_000 picoseconds. - Weight::from_parts(9_804_000, 0) + // Measured: `399` + // Estimated: `1853` + // Minimum execution time: 10_050_000 picoseconds. + Weight::from_parts(10_244_000, 1853) + .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `CoreFellowship::Member` (r:1 w:1) @@ -103,8 +105,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `17278` // Estimated: `19894` - // Minimum execution time: 57_597_000 picoseconds. - Weight::from_parts(58_825_000, 19894) + // Minimum execution time: 54_433_000 picoseconds. + Weight::from_parts(55_650_000, 19894) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -126,8 +128,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `17388` // Estimated: `19894` - // Minimum execution time: 61_387_000 picoseconds. - Weight::from_parts(63_408_000, 19894) + // Minimum execution time: 57_634_000 picoseconds. + Weight::from_parts(58_816_000, 19894) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -139,8 +141,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `388` // Estimated: `3514` - // Minimum execution time: 15_941_000 picoseconds. - Weight::from_parts(16_547_000, 3514) + // Minimum execution time: 14_527_000 picoseconds. + Weight::from_parts(14_948_000, 3514) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -158,8 +160,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `146` // Estimated: `3514` - // Minimum execution time: 24_963_000 picoseconds. - Weight::from_parts(25_873_000, 3514) + // Minimum execution time: 22_137_000 picoseconds. + Weight::from_parts(22_925_000, 3514) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -181,11 +183,38 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `16931` // Estimated: `19894` - // Minimum execution time: 55_062_000 picoseconds. - Weight::from_parts(58_422_000, 19894) + // Minimum execution time: 51_837_000 picoseconds. + Weight::from_parts(52_810_000, 19894) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:9 w:9) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:9) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:0 w:9) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// The range of component `r` is `[1, 9]`. + fn promote_fast(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `16844` + // Estimated: `19894 + r * (2489 ±0)` + // Minimum execution time: 45_065_000 picoseconds. + Weight::from_parts(34_090_392, 19894) + // Standard Error: 18_620 + .saturating_add(Weight::from_parts(13_578_046, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 2489).saturating_mul(r.into())) + } /// Storage: `RankedCollective::Members` (r:1 w:0) /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) /// Storage: `CoreFellowship::Member` (r:1 w:1) @@ -196,8 +225,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `293` // Estimated: `3514` - // Minimum execution time: 15_901_000 picoseconds. - Weight::from_parts(16_746_000, 3514) + // Minimum execution time: 14_321_000 picoseconds. + Weight::from_parts(14_747_000, 3514) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -209,8 +238,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `313` // Estimated: `3514` - // Minimum execution time: 14_768_000 picoseconds. - Weight::from_parts(15_421_000, 3514) + // Minimum execution time: 13_525_000 picoseconds. + Weight::from_parts(13_843_000, 3514) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -224,8 +253,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `16843` // Estimated: `19894` - // Minimum execution time: 36_925_000 picoseconds. - Weight::from_parts(38_330_000, 19894) + // Minimum execution time: 34_719_000 picoseconds. + Weight::from_parts(35_162_000, 19894) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -237,8 +266,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `79` // Estimated: `19894` - // Minimum execution time: 25_210_000 picoseconds. - Weight::from_parts(26_247_000, 19894) + // Minimum execution time: 23_477_000 picoseconds. + Weight::from_parts(23_897_000, 19894) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -252,18 +281,19 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_633_000 picoseconds. - Weight::from_parts(8_018_000, 0) + // Minimum execution time: 5_772_000 picoseconds. + Weight::from_parts(6_000_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: CoreFellowship Params (r:0 w:1) - /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Params` (r:1 w:1) + /// Proof: `CoreFellowship::Params` (`max_values`: Some(1), `max_size`: Some(368), added: 863, mode: `MaxEncodedLen`) fn set_partial_params() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 9_454_000 picoseconds. - Weight::from_parts(9_804_000, 0) + // Measured: `399` + // Estimated: `1853` + // Minimum execution time: 10_050_000 picoseconds. + Weight::from_parts(10_244_000, 1853) + .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `CoreFellowship::Member` (r:1 w:1) @@ -284,8 +314,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `17278` // Estimated: `19894` - // Minimum execution time: 57_597_000 picoseconds. - Weight::from_parts(58_825_000, 19894) + // Minimum execution time: 54_433_000 picoseconds. + Weight::from_parts(55_650_000, 19894) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -307,8 +337,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `17388` // Estimated: `19894` - // Minimum execution time: 61_387_000 picoseconds. - Weight::from_parts(63_408_000, 19894) + // Minimum execution time: 57_634_000 picoseconds. + Weight::from_parts(58_816_000, 19894) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -320,8 +350,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `388` // Estimated: `3514` - // Minimum execution time: 15_941_000 picoseconds. - Weight::from_parts(16_547_000, 3514) + // Minimum execution time: 14_527_000 picoseconds. + Weight::from_parts(14_948_000, 3514) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -339,8 +369,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `146` // Estimated: `3514` - // Minimum execution time: 24_963_000 picoseconds. - Weight::from_parts(25_873_000, 3514) + // Minimum execution time: 22_137_000 picoseconds. + Weight::from_parts(22_925_000, 3514) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -362,11 +392,38 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `16931` // Estimated: `19894` - // Minimum execution time: 55_062_000 picoseconds. - Weight::from_parts(58_422_000, 19894) + // Minimum execution time: 51_837_000 picoseconds. + Weight::from_parts(52_810_000, 19894) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:9 w:9) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:9) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:0 w:9) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// The range of component `r` is `[1, 9]`. + fn promote_fast(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `16844` + // Estimated: `19894 + r * (2489 ±0)` + // Minimum execution time: 45_065_000 picoseconds. + Weight::from_parts(34_090_392, 19894) + // Standard Error: 18_620 + .saturating_add(Weight::from_parts(13_578_046, 0).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 2489).saturating_mul(r.into())) + } /// Storage: `RankedCollective::Members` (r:1 w:0) /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) /// Storage: `CoreFellowship::Member` (r:1 w:1) @@ -377,8 +434,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `293` // Estimated: `3514` - // Minimum execution time: 15_901_000 picoseconds. - Weight::from_parts(16_746_000, 3514) + // Minimum execution time: 14_321_000 picoseconds. + Weight::from_parts(14_747_000, 3514) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -390,8 +447,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `313` // Estimated: `3514` - // Minimum execution time: 14_768_000 picoseconds. - Weight::from_parts(15_421_000, 3514) + // Minimum execution time: 13_525_000 picoseconds. + Weight::from_parts(13_843_000, 3514) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -405,8 +462,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `16843` // Estimated: `19894` - // Minimum execution time: 36_925_000 picoseconds. - Weight::from_parts(38_330_000, 19894) + // Minimum execution time: 34_719_000 picoseconds. + Weight::from_parts(35_162_000, 19894) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -418,8 +475,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `79` // Estimated: `19894` - // Minimum execution time: 25_210_000 picoseconds. - Weight::from_parts(26_247_000, 19894) + // Minimum execution time: 23_477_000 picoseconds. + Weight::from_parts(23_897_000, 19894) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } -- GitLab From 4a7155e5c51fce7b0f9426fbd2638e957cdd755f Mon Sep 17 00:00:00 2001 From: Dmitry Markin Date: Wed, 26 Jun 2024 19:05:27 +0300 Subject: [PATCH 060/130] network: Upgrade `litep2p` to v0.6.2 (#4799) This PR upgrades `litep2p` to the latest version and includes the two fixes: 1. Enables incoming DHT record validation with `litep2p` network backend. 2. Sets `TCP_NODELAY` flag on TCP & WS sockets in `litep2p` backend, as it is currently done in `libp2p` backend. --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: Oliver Tale-Yazdi --- Cargo.lock | 827 +++++++++--------- Cargo.toml | 2 +- prdoc/pr_4799.prdoc | 24 + .../client/authority-discovery/src/worker.rs | 2 +- .../client/network/src/litep2p/discovery.rs | 50 +- substrate/client/network/src/litep2p/mod.rs | 17 +- .../client/network/src/litep2p/service.rs | 31 +- substrate/client/network/types/src/ed25519.rs | 26 +- 8 files changed, 539 insertions(+), 440 deletions(-) create mode 100644 prdoc/pr_4799.prdoc diff --git a/Cargo.lock b/Cargo.lock index 171b443d815..978f2b98dcf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -83,7 +83,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.10", + "getrandom", "once_cell", "version_check", ] @@ -95,7 +95,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.10", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -130,7 +130,7 @@ dependencies = [ "hex-literal", "itoa", "proptest", - "rand 0.8.5", + "rand", "ruint", "serde", "tiny-keccak", @@ -632,7 +632,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -642,7 +642,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", "rayon", ] @@ -655,7 +655,7 @@ dependencies = [ "ark-serialize 0.4.2", "ark-std 0.4.0", "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", "sha3", ] @@ -692,8 +692,24 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", + "asn1-rs-derive 0.4.0", + "asn1-rs-impl 0.1.0", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d" +dependencies = [ + "asn1-rs-derive 0.5.0", + "asn1-rs-impl 0.2.0", "displaydoc", "nom", "num-traits", @@ -711,7 +727,19 @@ dependencies = [ "proc-macro2 1.0.82", "quote 1.0.35", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" +dependencies = [ + "proc-macro2 1.0.82", + "quote 1.0.35", + "syn 2.0.61", + "synstructure 0.13.1", ] [[package]] @@ -725,6 +753,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2 1.0.82", + "quote 1.0.35", + "syn 2.0.61", +] + [[package]] name = "assert_cmd" version = "2.0.12" @@ -1267,9 +1306,9 @@ checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" [[package]] name = "async-trait" -version = "0.1.79" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2 1.0.82", "quote 1.0.35", @@ -1347,9 +1386,9 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ - "getrandom 0.2.10", + "getrandom", "instant", - "rand 0.8.5", + "rand", ] [[package]] @@ -1381,8 +1420,8 @@ dependencies = [ "dleq_vrf", "fflonk", "merlin", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand_chacha", + "rand_core", "ring 0.1.0", "sha2 0.10.8", "sp-ark-bls12-381", @@ -1951,7 +1990,7 @@ dependencies = [ "bp-parachains", "bp-polkadot-core", "bp-runtime", - "ed25519-dalek 2.1.1", + "ed25519-dalek", "finality-grandpa", "parity-scale-codec", "sp-application-crypto", @@ -2644,7 +2683,7 @@ dependencies = [ "multibase", "multihash 0.17.0", "serde", - "unsigned-varint", + "unsigned-varint 0.7.2", ] [[package]] @@ -2657,7 +2696,7 @@ dependencies = [ "multibase", "multihash 0.18.1", "serde", - "unsigned-varint", + "unsigned-varint 0.7.2", ] [[package]] @@ -2821,7 +2860,7 @@ checksum = "a90d114103adbc625300f346d4d09dfb4ab1c4a8df6868435dd903392ecf4354" dependencies = [ "libc", "once_cell", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] @@ -3040,7 +3079,7 @@ dependencies = [ "fflonk", "getrandom_or_panic", "merlin", - "rand_chacha 0.3.1", + "rand_chacha", ] [[package]] @@ -3116,7 +3155,7 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d7d6ab3c3a2282db210df5f02c4dab6e0a7057af0fb7ebd4070f30fe05c0ddb" dependencies = [ - "getrandom 0.2.10", + "getrandom", "once_cell", "proc-macro-hack", "tiny-keccak", @@ -3626,7 +3665,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array 0.14.7", - "rand_core 0.6.4", + "rand_core", "subtle 2.5.0", "zeroize", ] @@ -3638,7 +3677,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array 0.14.7", - "rand_core 0.6.4", + "rand_core", "typenum", ] @@ -3700,7 +3739,7 @@ dependencies = [ "cumulus-test-runtime", "futures", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", @@ -3731,7 +3770,7 @@ dependencies = [ "cumulus-relay-chain-interface", "futures", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-overseer", @@ -3815,7 +3854,7 @@ dependencies = [ "cumulus-primitives-core", "cumulus-relay-chain-interface", "futures", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-consensus", "sp-api", "sp-block-builder", @@ -3840,7 +3879,7 @@ dependencies = [ "futures", "futures-timer", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-parachain-primitives", @@ -3906,7 +3945,7 @@ dependencies = [ "polkadot-overseer", "polkadot-primitives", "portpicker", - "rand 0.8.5", + "rand", "rstest", "sc-cli", "sc-client-api", @@ -4023,7 +4062,7 @@ dependencies = [ "polkadot-parachain-primitives", "polkadot-runtime-common", "polkadot-runtime-parachains", - "rand 0.8.5", + "rand", "sc-client-api", "scale-info", "sp-consensus-slots", @@ -4303,7 +4342,7 @@ dependencies = [ "cumulus-relay-chain-interface", "cumulus-relay-chain-rpc-interface", "futures", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-availability-recovery", "polkadot-collator-protocol", "polkadot-core-primitives", @@ -4348,7 +4387,7 @@ dependencies = [ "parity-scale-codec", "pin-project", "polkadot-overseer", - "rand 0.8.5", + "rand", "sc-client-api", "sc-rpc-api", "sc-service", @@ -4504,7 +4543,7 @@ dependencies = [ "polkadot-service", "polkadot-test-service", "portpicker", - "rand 0.8.5", + "rand", "rococo-parachain-runtime", "sc-basic-authorship", "sc-block-builder", @@ -4557,7 +4596,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "socket2 0.5.6", + "socket2 0.5.7", "windows-sys 0.52.0", ] @@ -4577,19 +4616,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle 2.5.0", - "zeroize", -] - [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -4625,7 +4651,7 @@ checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" dependencies = [ "byteorder", "digest 0.9.0", - "rand_core 0.6.4", + "rand_core", "subtle-ng", "zeroize", ] @@ -4738,7 +4764,21 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" dependencies = [ - "asn1-rs", + "asn1-rs 0.5.2", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs 0.6.1", "displaydoc", "nom", "num-bigint", @@ -5033,19 +5073,10 @@ dependencies = [ "elliptic-curve", "rfc6979", "serdect", - "signature 2.1.0", + "signature", "spki", ] -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - [[package]] name = "ed25519" version = "2.2.2" @@ -5053,21 +5084,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" dependencies = [ "pkcs8", - "signature 2.1.0", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.0", - "ed25519 1.5.3", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", + "signature", ] [[package]] @@ -5076,9 +5093,9 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519 2.2.2", - "rand_core 0.6.4", + "curve25519-dalek", + "ed25519", + "rand_core", "serde", "sha2 0.10.8", "subtle 2.5.0", @@ -5091,11 +5108,11 @@ version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519 2.2.2", + "curve25519-dalek", + "ed25519", "hashbrown 0.14.3", "hex", - "rand_core 0.6.4", + "rand_core", "sha2 0.10.8", "zeroize", ] @@ -5119,7 +5136,7 @@ dependencies = [ "generic-array 0.14.7", "group", "pkcs8", - "rand_core 0.6.4", + "rand_core", "sec1", "serdect", "subtle 2.5.0", @@ -5535,7 +5552,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle 2.5.0", ] @@ -5592,8 +5609,8 @@ dependencies = [ "log", "num-traits", "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", + "parking_lot 0.12.3", + "rand", "scale-info", ] @@ -5608,7 +5625,7 @@ dependencies = [ "futures", "log", "num-traits", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "relay-utils", ] @@ -5631,7 +5648,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand", "rustc-hex", "static_assertions", ] @@ -5770,7 +5787,7 @@ dependencies = [ "linked-hash-map", "log", "parity-scale-codec", - "rand 0.8.5", + "rand", "rand_pcg", "sc-block-builder", "sc-chain-spec", @@ -5838,7 +5855,7 @@ dependencies = [ "frame-support", "frame-system", "parity-scale-codec", - "rand 0.8.5", + "rand", "scale-info", "sp-arithmetic", "sp-core", @@ -5858,7 +5875,7 @@ dependencies = [ "frame-support", "honggfuzz", "parity-scale-codec", - "rand 0.8.5", + "rand", "scale-info", "sp-arithmetic", "sp-npos-elections", @@ -6393,17 +6410,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.10" @@ -6412,7 +6418,7 @@ checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] @@ -6421,8 +6427,8 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" dependencies = [ - "rand 0.8.5", - "rand_core 0.6.4", + "rand", + "rand_core", ] [[package]] @@ -6532,9 +6538,9 @@ dependencies = [ "futures-timer", "no-std-compat", "nonzero_ext", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "quanta", - "rand 0.8.5", + "rand", "smallvec", ] @@ -6545,7 +6551,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core 0.6.4", + "rand_core", "subtle 2.5.0", ] @@ -6942,7 +6948,7 @@ dependencies = [ "http-body 1.0.0", "hyper 1.3.1", "pin-project-lite 0.2.12", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tower", "tower-service", @@ -7035,7 +7041,7 @@ dependencies = [ "http 0.2.9", "hyper 0.14.27", "log", - "rand 0.8.5", + "rand", "tokio", "url", "xmltree", @@ -7211,7 +7217,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.6", + "socket2 0.5.7", "widestring", "windows-sys 0.48.0", "winreg", @@ -7404,9 +7410,9 @@ dependencies = [ "http-body 1.0.0", "http-body-util", "jsonrpsee-types", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", - "rand 0.8.5", + "rand", "rustc-hash", "serde", "serde_json", @@ -7590,7 +7596,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf7a85fe66f9ff9cd74e169fdd2c94c6e1e74c412c99a73b4df3200b5d3760b2" dependencies = [ "kvdb", - "parking_lot 0.12.1", + "parking_lot 0.12.3", ] [[package]] @@ -7601,7 +7607,7 @@ checksum = "b644c70b92285f66bfc2032922a79000ea30af7bc2ab31902992a5dcb9b434f6" dependencies = [ "kvdb", "num_cpus", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "regex", "rocksdb", "smallvec", @@ -7718,7 +7724,7 @@ dependencies = [ "either", "futures", "futures-timer", - "getrandom 0.2.10", + "getrandom", "instant", "libp2p-allow-block-list", "libp2p-connection-limits", @@ -7786,14 +7792,14 @@ dependencies = [ "multihash 0.19.1", "multistream-select", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", "quick-protobuf", - "rand 0.8.5", + "rand", "rw-stream-sink", "smallvec", "thiserror", - "unsigned-varint", + "unsigned-varint 0.7.2", "void", ] @@ -7808,7 +7814,7 @@ dependencies = [ "libp2p-core", "libp2p-identity", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "smallvec", "trust-dns-resolver", ] @@ -7843,11 +7849,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "999ec70441b2fb35355076726a6bc466c932e9bdc66f6a11c6c0aa17c7ab9be0" dependencies = [ "bs58 0.5.0", - "ed25519-dalek 2.1.1", + "ed25519-dalek", "hkdf", "multihash 0.19.1", "quick-protobuf", - "rand 0.8.5", + "rand", "sha2 0.10.8", "thiserror", "tracing", @@ -7874,12 +7880,12 @@ dependencies = [ "log", "quick-protobuf", "quick-protobuf-codec", - "rand 0.8.5", + "rand", "sha2 0.10.8", "smallvec", "thiserror", "uint", - "unsigned-varint", + "unsigned-varint 0.7.2", "void", ] @@ -7896,9 +7902,9 @@ dependencies = [ "libp2p-identity", "libp2p-swarm", "log", - "rand 0.8.5", + "rand", "smallvec", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "trust-dns-proto 0.22.0", "void", @@ -7928,7 +7934,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2eeec39ad3ad0677551907dd304b2f13f17208ccebe333bef194076cd2e8921" dependencies = [ "bytes", - "curve25519-dalek 4.1.3", + "curve25519-dalek", "futures", "libp2p-core", "libp2p-identity", @@ -7937,7 +7943,7 @@ dependencies = [ "multihash 0.19.1", "once_cell", "quick-protobuf", - "rand 0.8.5", + "rand", "sha2 0.10.8", "snow", "static_assertions", @@ -7960,7 +7966,7 @@ dependencies = [ "libp2p-identity", "libp2p-swarm", "log", - "rand 0.8.5", + "rand", "void", ] @@ -7978,12 +7984,12 @@ dependencies = [ "libp2p-identity", "libp2p-tls", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "quinn 0.10.2", - "rand 0.8.5", + "rand", "ring 0.16.20", "rustls 0.21.7", - "socket2 0.5.6", + "socket2 0.5.7", "thiserror", "tokio", ] @@ -8001,7 +8007,7 @@ dependencies = [ "libp2p-identity", "libp2p-swarm", "log", - "rand 0.8.5", + "rand", "smallvec", "void", ] @@ -8023,7 +8029,7 @@ dependencies = [ "log", "multistream-select", "once_cell", - "rand 0.8.5", + "rand", "smallvec", "tokio", "void", @@ -8055,7 +8061,7 @@ dependencies = [ "libp2p-core", "libp2p-identity", "log", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", ] @@ -8074,7 +8080,7 @@ dependencies = [ "rustls 0.21.7", "rustls-webpki 0.101.4", "thiserror", - "x509-parser", + "x509-parser 0.15.1", "yasna", ] @@ -8120,7 +8126,7 @@ dependencies = [ "libp2p-core", "libp2p-identity", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "quicksink", "rw-stream-sink", "soketto 0.7.1", @@ -8169,7 +8175,7 @@ dependencies = [ "libsecp256k1-core", "libsecp256k1-gen-ecmult", "libsecp256k1-gen-genmult", - "rand 0.8.5", + "rand", "serde", "sha2 0.9.9", "typenum", @@ -8299,15 +8305,15 @@ dependencies = [ [[package]] name = "litep2p" -version = "0.5.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f02542ae3a94b4c4ffa37dc56388c923e286afa3bf65452e3984b50b2a2f316" +checksum = "0f46c51c205264b834ceed95c8b195026e700494bc3991aaba3b4ea9e20626d9" dependencies = [ "async-trait", "bs58 0.4.0", "bytes", "cid 0.10.1", - "ed25519-dalek 1.0.1", + "ed25519-dalek", "futures", "futures-timer", "hex-literal", @@ -8318,12 +8324,12 @@ dependencies = [ "multihash 0.17.0", "network-interface", "nohash-hasher", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", - "prost 0.11.9", + "prost 0.12.6", "prost-build 0.11.9", "quinn 0.9.4", - "rand 0.8.5", + "rand", "rcgen", "ring 0.16.20", "rustls 0.20.9", @@ -8332,7 +8338,7 @@ dependencies = [ "simple-dns", "smallvec", "snow", - "socket2 0.5.6", + "socket2 0.5.7", "static_assertions", "str0m", "thiserror", @@ -8343,11 +8349,11 @@ dependencies = [ "tracing", "trust-dns-resolver", "uint", - "unsigned-varint", + "unsigned-varint 0.8.0", "url", "webpki", "x25519-dalek", - "x509-parser", + "x509-parser 0.16.0", "yasna", "zeroize", ] @@ -8619,7 +8625,7 @@ checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ "byteorder", "keccak", - "rand_core 0.6.4", + "rand_core", "zeroize", ] @@ -8636,7 +8642,7 @@ dependencies = [ "hex", "log", "num-traits", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "relay-utils", "sp-arithmetic", ] @@ -8648,7 +8654,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69672161530e8aeca1d1400fbf3f1a1747ff60ea604265a4e906c2442df20532" dependencies = [ "futures", - "rand 0.8.5", + "rand", "thrift", ] @@ -8747,7 +8753,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.48.0", ] @@ -8762,14 +8768,14 @@ dependencies = [ "bitflags 1.3.2", "blake2 0.10.6", "c2-chacha", - "curve25519-dalek 4.1.3", + "curve25519-dalek", "either", "hashlink", "lioness", "log", - "parking_lot 0.12.1", - "rand 0.8.5", - "rand_chacha 0.3.1", + "parking_lot 0.12.3", + "rand", + "rand_chacha", "rand_distr", "subtle 2.5.0", "thiserror", @@ -8783,7 +8789,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-offchain", @@ -8889,7 +8895,7 @@ dependencies = [ "percent-encoding", "serde", "static_assertions", - "unsigned-varint", + "unsigned-varint 0.7.2", "url", ] @@ -8908,7 +8914,7 @@ dependencies = [ "percent-encoding", "serde", "static_assertions", - "unsigned-varint", + "unsigned-varint 0.7.2", "url", ] @@ -8937,7 +8943,7 @@ dependencies = [ "multihash-derive", "sha2 0.10.8", "sha3", - "unsigned-varint", + "unsigned-varint 0.7.2", ] [[package]] @@ -8954,7 +8960,7 @@ dependencies = [ "multihash-derive", "sha2 0.10.8", "sha3", - "unsigned-varint", + "unsigned-varint 0.7.2", ] [[package]] @@ -8964,7 +8970,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" dependencies = [ "core2", - "unsigned-varint", + "unsigned-varint 0.7.2", ] [[package]] @@ -8978,7 +8984,7 @@ dependencies = [ "proc-macro2 1.0.82", "quote 1.0.35", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -8998,7 +9004,7 @@ dependencies = [ "log", "pin-project", "smallvec", - "unsigned-varint", + "unsigned-varint 0.7.2", ] [[package]] @@ -9035,7 +9041,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bddcd3bf5144b6392de80e04c347cd7fab2508f6df16a85fc496ecd5cec39bc" dependencies = [ "clap 3.2.25", - "rand 0.8.5", + "rand", ] [[package]] @@ -9187,7 +9193,7 @@ dependencies = [ "node-primitives", "node-testing", "parity-db", - "rand 0.8.5", + "rand", "sc-basic-authorship", "sc-client-api", "sc-transaction-pool", @@ -9526,7 +9532,16 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" dependencies = [ - "asn1-rs", + "asn1-rs 0.5.2", +] + +[[package]] +name = "oid-registry" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d" +dependencies = [ + "asn1-rs 0.6.1", ] [[package]] @@ -9948,7 +9963,7 @@ dependencies = [ "frame-election-provider-support", "honggfuzz", "pallet-bags-list", - "rand 0.8.5", + "rand", ] [[package]] @@ -10073,7 +10088,7 @@ dependencies = [ "pallet-beefy-mmr", "pallet-mmr", "parity-scale-codec", - "rand 0.8.5", + "rand", "scale-info", "serde", "sp-consensus-beefy", @@ -10223,7 +10238,7 @@ dependencies = [ "pallet-session", "pallet-timestamp", "parity-scale-codec", - "rand 0.8.5", + "rand", "scale-info", "sp-consensus-aura", "sp-core", @@ -10292,7 +10307,7 @@ dependencies = [ "parity-scale-codec", "paste", "pretty_assertions", - "rand 0.8.5", + "rand", "rand_pcg", "scale-info", "serde", @@ -10509,7 +10524,7 @@ dependencies = [ "pallet-staking", "pallet-timestamp", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "scale-info", "sp-core", "sp-io", @@ -10532,8 +10547,8 @@ dependencies = [ "pallet-balances", "pallet-election-provider-support-benchmarking", "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", + "parking_lot 0.12.3", + "rand", "scale-info", "sp-arithmetic", "sp-core", @@ -10907,7 +10922,7 @@ dependencies = [ "frame-system", "log", "parity-scale-codec", - "rand 0.8.5", + "rand", "rand_distr", "scale-info", "serde", @@ -11141,7 +11156,7 @@ dependencies = [ "honggfuzz", "log", "pallet-nomination-pools", - "rand 0.8.5", + "rand", "sp-io", "sp-runtime", "sp-tracing 16.0.0", @@ -11581,7 +11596,7 @@ dependencies = [ "pallet-staking-reward-curve", "pallet-timestamp", "parity-scale-codec", - "rand 0.8.5", + "rand", "scale-info", "sp-core", "sp-io", @@ -11613,7 +11628,7 @@ dependencies = [ "log", "pallet-balances", "parity-scale-codec", - "rand_chacha 0.3.1", + "rand_chacha", "scale-info", "sp-arithmetic", "sp-core", @@ -11639,7 +11654,7 @@ dependencies = [ "pallet-staking-reward-curve", "pallet-timestamp", "parity-scale-codec", - "rand_chacha 0.3.1", + "rand_chacha", "scale-info", "serde", "sp-application-crypto", @@ -11692,7 +11707,7 @@ dependencies = [ "log", "pallet-balances", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "scale-info", "serde", "sp-core", @@ -12265,8 +12280,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" dependencies = [ "bitcoin_hashes 0.13.0", - "rand 0.8.5", - "rand_core 0.6.4", + "rand", + "rand_core", "serde", "unicode-normalization", ] @@ -12291,8 +12306,8 @@ dependencies = [ "log", "lz4", "memmap2 0.5.10", - "parking_lot 0.12.1", - "rand 0.8.5", + "parking_lot 0.12.3", + "rand", "siphasher", "snap", ] @@ -12336,7 +12351,7 @@ dependencies = [ "impl-trait-for-tuples", "lru 0.8.1", "parity-util-mem-derive", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "primitive-types", "smallvec", "winapi", @@ -12350,7 +12365,7 @@ checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" dependencies = [ "proc-macro2 1.0.82", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -12378,9 +12393,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core 0.9.8", @@ -12426,7 +12441,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ "base64ct", - "rand_core 0.6.4", + "rand_core", "subtle 2.5.0", ] @@ -12927,9 +12942,9 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "polkadot-primitives-test-helpers", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand", + "rand_chacha", + "rand_core", "schnorrkel 0.11.4", "sp-authority-discovery", "sp-core", @@ -12953,8 +12968,8 @@ dependencies = [ "polkadot-node-subsystem-test-helpers", "polkadot-node-subsystem-util", "polkadot-primitives", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "sp-application-crypto", "sp-authority-discovery", "sp-core", @@ -12982,7 +12997,7 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "polkadot-subsystem-bench", - "rand 0.8.5", + "rand", "rstest", "sc-network", "schnellru", @@ -13014,7 +13029,7 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "polkadot-subsystem-bench", - "rand 0.8.5", + "rand", "rstest", "sc-network", "schnellru", @@ -13165,15 +13180,15 @@ dependencies = [ "futures", "futures-timer", "lazy_static", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-node-subsystem-util", "polkadot-primitives", "quickcheck", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "sc-network", "sc-network-common", "sp-application-crypto", @@ -13199,7 +13214,7 @@ dependencies = [ "futures", "futures-timer", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-subsystem", @@ -13255,7 +13270,7 @@ dependencies = [ "log", "merlin", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-node-jaeger", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -13265,9 +13280,9 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "polkadot-subsystem-bench", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand", + "rand_chacha", + "rand_core", "sc-keystore", "schnellru", "schnorrkel 0.11.4", @@ -13296,7 +13311,7 @@ dependencies = [ "kvdb-memorydb", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-erasure-coding", "polkadot-node-jaeger", "polkadot-node-primitives", @@ -13412,7 +13427,7 @@ dependencies = [ "kvdb", "kvdb-memorydb", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", @@ -13543,7 +13558,7 @@ dependencies = [ "polkadot-parachain-primitives", "polkadot-primitives", "procfs", - "rand 0.8.5", + "rand", "rococo-runtime", "rusty-fork", "sc-sysinfo", @@ -13675,7 +13690,7 @@ dependencies = [ "log", "mick-jaeger", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-node-primitives", "polkadot-primitives", "sc-network", @@ -13726,8 +13741,8 @@ dependencies = [ "polkadot-node-jaeger", "polkadot-node-primitives", "polkadot-primitives", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "sc-authority-discovery", "sc-network", "sc-network-types", @@ -13775,7 +13790,7 @@ version = "1.0.0" dependencies = [ "async-trait", "futures", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -13838,7 +13853,7 @@ dependencies = [ "log", "parity-db", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", "polkadot-erasure-coding", "polkadot-node-jaeger", @@ -13852,7 +13867,7 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "prioritized-metered-channel", - "rand 0.8.5", + "rand", "sc-client-api", "schnellru", "sp-application-crypto", @@ -13873,7 +13888,7 @@ dependencies = [ "futures", "futures-timer", "orchestra", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-primitives", @@ -14033,7 +14048,7 @@ name = "polkadot-primitives-test-helpers" version = "1.0.0" dependencies = [ "polkadot-primitives", - "rand 0.8.5", + "rand", "sp-application-crypto", "sp-core", "sp-keyring", @@ -14174,8 +14189,8 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "polkadot-runtime-metrics", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rstest", "sc-keystore", "scale-info", @@ -14729,7 +14744,7 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api", "parity-db", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "polkadot-approval-distribution", "polkadot-availability-bitfield-distribution", "polkadot-availability-distribution", @@ -14851,7 +14866,7 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "polkadot-subsystem-bench", - "rand_chacha 0.3.1", + "rand_chacha", "sc-keystore", "sc-network", "sp-application-crypto", @@ -14919,9 +14934,9 @@ dependencies = [ "prometheus", "pyroscope", "pyroscope_pprofrs", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand", + "rand_chacha", + "rand_core", "rand_distr", "sc-keystore", "sc-network", @@ -15000,7 +15015,7 @@ dependencies = [ "polkadot-node-subsystem-types", "polkadot-node-subsystem-util", "polkadot-primitives", - "rand 0.8.5", + "rand", "sp-core", "sp-keystore", "substrate-build-script-utils", @@ -15088,7 +15103,7 @@ dependencies = [ "polkadot-runtime-parachains", "polkadot-service", "polkadot-test-runtime", - "rand 0.8.5", + "rand", "sc-authority-discovery", "sc-chain-spec", "sc-cli", @@ -15278,7 +15293,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be97d76faf1bfab666e1375477b23fde79eccf0276e9b63b92a39d676a889ba9" dependencies = [ - "rand 0.8.5", + "rand", ] [[package]] @@ -15300,7 +15315,7 @@ dependencies = [ "log", "nix 0.26.2", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "smallvec", "symbolic-demangle", "tempfile", @@ -15541,7 +15556,7 @@ dependencies = [ "fnv", "lazy_static", "memchr", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "thiserror", ] @@ -15553,7 +15568,7 @@ checksum = "3c99afa9a01501019ac3a14d71d9f94050346f55ca471ce90c799a15c58f61e2" dependencies = [ "dtoa", "itoa", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "prometheus-client-derive-encode", ] @@ -15591,8 +15606,8 @@ dependencies = [ "bitflags 2.6.0", "lazy_static", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rand_xorshift", "regex-syntax 0.8.2", "rusty-fork", @@ -15612,12 +15627,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", - "prost-derive 0.12.4", + "prost-derive 0.12.6", ] [[package]] @@ -15656,7 +15671,7 @@ dependencies = [ "once_cell", "petgraph", "prettyplease 0.2.12", - "prost 0.12.4", + "prost 0.12.6", "prost-types 0.12.4", "regex", "syn 2.0.61", @@ -15678,9 +15693,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", "itertools 0.11.0", @@ -15704,7 +15719,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" dependencies = [ - "prost 0.12.4", + "prost 0.12.6", ] [[package]] @@ -15757,7 +15772,7 @@ dependencies = [ "mach2", "once_cell", "raw-cpuid", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "web-sys", "winapi", ] @@ -15787,7 +15802,7 @@ dependencies = [ "bytes", "quick-protobuf", "thiserror", - "unsigned-varint", + "unsigned-varint 0.7.2", ] [[package]] @@ -15798,7 +15813,7 @@ checksum = "5253a3a0d56548d5b0be25414171dc780cc6870727746d05bd2bde352eee96c5" dependencies = [ "ahash 0.8.11", "hashbrown 0.13.2", - "parking_lot 0.12.1", + "parking_lot 0.12.3", ] [[package]] @@ -15809,7 +15824,7 @@ checksum = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6" dependencies = [ "env_logger 0.8.4", "log", - "rand 0.8.5", + "rand", ] [[package]] @@ -15866,7 +15881,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94b0b33c13a79f669c85defaf4c275dc86a0c0372807d0ca3d78e0bb87274863" dependencies = [ "bytes", - "rand 0.8.5", + "rand", "ring 0.16.20", "rustc-hash", "rustls 0.20.9", @@ -15884,7 +15899,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" dependencies = [ "bytes", - "rand 0.8.5", + "rand", "ring 0.16.20", "rustc-hash", "rustls 0.21.7", @@ -15915,7 +15930,7 @@ checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" dependencies = [ "bytes", "libc", - "socket2 0.5.6", + "socket2 0.5.7", "tracing", "windows-sys 0.48.0", ] @@ -15944,19 +15959,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -15964,18 +15966,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", ] [[package]] @@ -15985,16 +15977,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -16003,7 +15986,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom", ] [[package]] @@ -16013,16 +15996,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" dependencies = [ "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "rand", ] [[package]] @@ -16031,7 +16005,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" dependencies = [ - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -16040,7 +16014,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -16143,7 +16117,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.10", + "getrandom", "redox_syscall 0.2.16", "thiserror", ] @@ -16285,7 +16259,7 @@ dependencies = [ "pallet-utility", "parity-scale-codec", "quick_cache", - "rand 0.8.5", + "rand", "relay-utils", "sc-chain-spec", "sc-rpc-api", @@ -16320,7 +16294,7 @@ dependencies = [ "jsonpath_lib", "log", "num-traits", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "serde_json", "sp-runtime", "substrate-prometheus-endpoint", @@ -16442,7 +16416,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", - "getrandom 0.2.10", + "getrandom", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -16778,7 +16752,7 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.5", + "rand", "rlp", "ruint-macro", "serde", @@ -17119,10 +17093,10 @@ dependencies = [ "log", "multihash 0.19.1", "parity-scale-codec", - "prost 0.12.4", + "prost 0.12.6", "prost-build 0.12.4", "quickcheck", - "rand 0.8.5", + "rand", "sc-client-api", "sc-network", "sc-network-types", @@ -17146,7 +17120,7 @@ dependencies = [ "futures-timer", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-proposer-metrics", @@ -17237,7 +17211,7 @@ dependencies = [ "names", "parity-bip39", "parity-scale-codec", - "rand 0.8.5", + "rand", "regex", "rpassword", "sc-client-api", @@ -17272,7 +17246,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-executor", "sc-transaction-pool-api", "sc-utils", @@ -17308,9 +17282,9 @@ dependencies = [ "log", "parity-db", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "quickcheck", - "rand 0.8.5", + "rand", "sc-client-api", "sc-state-db", "schnellru", @@ -17334,7 +17308,7 @@ dependencies = [ "futures", "log", "mockall 0.11.4", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-client-api", "sc-network-types", "sc-utils", @@ -17358,7 +17332,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -17400,7 +17374,7 @@ dependencies = [ "num-rational", "num-traits", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -17469,7 +17443,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -17510,7 +17484,7 @@ dependencies = [ "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-consensus-beefy", "sc-rpc", "serde", @@ -17551,8 +17525,8 @@ dependencies = [ "futures-timer", "log", "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", + "parking_lot 0.12.3", + "rand", "sc-block-builder", "sc-chain-spec", "sc-client-api", @@ -17657,7 +17631,7 @@ dependencies = [ "futures-timer", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-client-api", "sc-consensus", "sp-api", @@ -17705,7 +17679,7 @@ dependencies = [ "env_logger 0.11.3", "num_cpus", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "paste", "regex", "sc-executor-common", @@ -17767,7 +17741,7 @@ dependencies = [ "libc", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "paste", "rustix 0.36.15", "sc-allocator", @@ -17802,7 +17776,7 @@ name = "sc-keystore" version = "25.0.0" dependencies = [ "array-bytes", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "serde_json", "sp-application-crypto", "sp-core", @@ -17825,7 +17799,7 @@ dependencies = [ "mixnet", "multiaddr 0.18.1", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-client-api", "sc-network", "sc-network-types", @@ -17863,12 +17837,12 @@ dependencies = [ "multistream-select", "once_cell", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "partial_sort", "pin-project", - "prost 0.12.4", + "prost 0.12.6", "prost-build 0.12.4", - "rand 0.8.5", + "rand", "sc-block-builder", "sc-client-api", "sc-network-common", @@ -17897,7 +17871,7 @@ dependencies = [ "tokio-stream", "tokio-test", "tokio-util", - "unsigned-varint", + "unsigned-varint 0.7.2", "void", "wasm-timer", "zeroize", @@ -17953,7 +17927,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "prost 0.12.4", + "prost 0.12.6", "prost-build 0.12.4", "sc-client-api", "sc-network", @@ -17997,7 +17971,7 @@ dependencies = [ "log", "mockall 0.11.4", "parity-scale-codec", - "prost 0.12.4", + "prost 0.12.6", "prost-build 0.12.4", "quickcheck", "sc-block-builder", @@ -18033,8 +18007,8 @@ dependencies = [ "futures-timer", "libp2p", "log", - "parking_lot 0.12.1", - "rand 0.8.5", + "parking_lot 0.12.3", + "rand", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -18078,14 +18052,14 @@ name = "sc-network-types" version = "0.10.0" dependencies = [ "bs58 0.5.0", - "ed25519-dalek 2.1.1", + "ed25519-dalek", "libp2p-identity", "litep2p", "log", "multiaddr 0.18.1", "multihash 0.19.1", "quickcheck", - "rand 0.8.5", + "rand", "thiserror", "zeroize", ] @@ -18107,8 +18081,8 @@ dependencies = [ "num_cpus", "once_cell", "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", + "parking_lot 0.12.3", + "rand", "sc-block-builder", "sc-client-api", "sc-client-db", @@ -18150,7 +18124,7 @@ dependencies = [ "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pretty_assertions", "sc-block-builder", "sc-chain-spec", @@ -18234,9 +18208,9 @@ dependencies = [ "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pretty_assertions", - "rand 0.8.5", + "rand", "sc-block-builder", "sc-chain-spec", "sc-client-api", @@ -18289,9 +18263,9 @@ dependencies = [ "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", - "rand 0.8.5", + "rand", "sc-chain-spec", "sc-client-api", "sc-client-db", @@ -18352,7 +18326,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-client-db", @@ -18384,7 +18358,7 @@ version = "0.30.0" dependencies = [ "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sp-core", ] @@ -18395,7 +18369,7 @@ dependencies = [ "env_logger 0.11.3", "log", "parity-db", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-client-api", "sc-keystore", "sp-api", @@ -18446,7 +18420,7 @@ dependencies = [ "futures", "libc", "log", - "rand 0.8.5", + "rand", "rand_pcg", "regex", "sc-telemetry", @@ -18467,9 +18441,9 @@ dependencies = [ "futures", "libp2p", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", - "rand 0.8.5", + "rand", "sc-network", "sc-utils", "serde", @@ -18490,7 +18464,7 @@ dependencies = [ "libc", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "regex", "rustc-hash", "sc-client-api", @@ -18531,7 +18505,7 @@ dependencies = [ "linked-hash-map", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-transaction-pool-api", @@ -18577,7 +18551,7 @@ dependencies = [ "futures-timer", "lazy_static", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "prometheus", "sp-arithmetic", "tokio-test", @@ -18692,7 +18666,7 @@ dependencies = [ "arrayvec 0.7.4", "curve25519-dalek-ng", "merlin", - "rand_core 0.6.4", + "rand_core", "sha2 0.9.9", "subtle-ng", "zeroize", @@ -18707,10 +18681,10 @@ dependencies = [ "aead", "arrayref", "arrayvec 0.7.4", - "curve25519-dalek 4.1.3", + "curve25519-dalek", "getrandom_or_panic", "merlin", - "rand_core 0.6.4", + "rand_core", "serde_bytes", "sha2 0.10.8", "subtle 2.5.0", @@ -18755,7 +18729,7 @@ dependencies = [ "crc", "fxhash", "log", - "rand 0.8.5", + "rand", "slab", "thiserror", ] @@ -19057,7 +19031,7 @@ dependencies = [ "futures", "lazy_static", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "serial_test_derive", ] @@ -19222,12 +19196,6 @@ dependencies = [ "libc", ] -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - [[package]] name = "signature" version = "2.1.0" @@ -19235,7 +19203,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -19391,8 +19359,8 @@ dependencies = [ "pbkdf2", "pin-project", "poly1305", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "ruzstd", "schnorrkel 0.10.2", "serde", @@ -19432,10 +19400,10 @@ dependencies = [ "log", "lru 0.11.0", "no-std-net", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "serde", "serde_json", "siphasher", @@ -19460,8 +19428,8 @@ dependencies = [ "aes-gcm", "blake2 0.10.6", "chacha20poly1305", - "curve25519-dalek 4.1.3", - "rand_core 0.6.4", + "curve25519-dalek", + "rand_core", "ring 0.17.7", "rustc_version 0.4.0", "sha2 0.10.8", @@ -19533,7 +19501,7 @@ dependencies = [ "hex-literal", "parity-bytes", "parity-scale-codec", - "rand 0.8.5", + "rand", "rlp", "scale-info", "serde", @@ -19554,7 +19522,7 @@ dependencies = [ "hex", "lazy_static", "parity-scale-codec", - "rand 0.8.5", + "rand", "scale-info", "snowbridge-amcl", "zeroize", @@ -19598,7 +19566,7 @@ dependencies = [ "log", "pallet-timestamp", "parity-scale-codec", - "rand 0.8.5", + "rand", "scale-info", "serde", "serde_json", @@ -19800,9 +19768,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -19819,7 +19787,7 @@ dependencies = [ "futures", "httparse", "log", - "rand 0.8.5", + "rand", "sha-1 0.9.8", ] @@ -19835,7 +19803,7 @@ dependencies = [ "http 1.1.0", "httparse", "log", - "rand 0.8.5", + "rand", "sha1", ] @@ -20012,7 +19980,7 @@ dependencies = [ "num-traits", "parity-scale-codec", "primitive-types", - "rand 0.8.5", + "rand", "scale-info", "serde", "sp-crypto-hashing", @@ -20076,7 +20044,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "schnellru", "sp-api", "sp-consensus", @@ -20229,10 +20197,10 @@ dependencies = [ "merlin", "parity-bip39", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "paste", "primitive-types", - "rand 0.8.5", + "rand", "regex", "scale-info", "schnorrkel 0.11.4", @@ -20346,7 +20314,7 @@ name = "sp-database" version = "10.0.0" dependencies = [ "kvdb", - "parking_lot 0.12.1", + "parking_lot 0.12.3", ] [[package]] @@ -20418,7 +20386,7 @@ version = "30.0.0" dependencies = [ "bytes", "docify", - "ed25519-dalek 2.1.1", + "ed25519-dalek", "libsecp256k1", "log", "parity-scale-codec", @@ -20452,9 +20420,9 @@ name = "sp-keystore" version = "0.34.0" dependencies = [ "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", - "rand_chacha 0.3.1", + "parking_lot 0.12.3", + "rand", + "rand_chacha", "sp-core", "sp-externalities 0.25.0", ] @@ -20508,7 +20476,7 @@ name = "sp-npos-elections" version = "26.0.0" dependencies = [ "parity-scale-codec", - "rand 0.8.5", + "rand", "scale-info", "serde", "sp-arithmetic", @@ -20523,7 +20491,7 @@ version = "2.0.0-alpha.5" dependencies = [ "clap 4.5.3", "honggfuzz", - "rand 0.8.5", + "rand", "sp-npos-elections", "sp-runtime", ] @@ -20568,7 +20536,7 @@ dependencies = [ "num-traits", "parity-scale-codec", "paste", - "rand 0.8.5", + "rand", "scale-info", "serde", "serde_json", @@ -20725,9 +20693,9 @@ dependencies = [ "hash-db", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pretty_assertions", - "rand 0.8.5", + "rand", "smallvec", "sp-core", "sp-externalities 0.25.0", @@ -20744,11 +20712,11 @@ name = "sp-statement-store" version = "10.0.0" dependencies = [ "aes-gcm", - "curve25519-dalek 4.1.3", - "ed25519-dalek 2.1.1", + "curve25519-dalek", + "ed25519-dalek", "hkdf", "parity-scale-codec", - "rand 0.8.5", + "rand", "scale-info", "sha2 0.10.8", "sp-api", @@ -20873,8 +20841,8 @@ dependencies = [ "memory-db", "nohash-hasher", "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", + "parking_lot 0.12.3", + "rand", "scale-info", "schnellru", "sp-core", @@ -21061,7 +21029,7 @@ dependencies = [ "parity-scale-codec", "platforms", "polkadot-sdk", - "rand 0.8.5", + "rand", "regex", "sc-service-test", "scale-info", @@ -21621,7 +21589,7 @@ version = "2.0.0" dependencies = [ "futures", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-transaction-pool", "sc-transaction-pool-api", "sp-blockchain", @@ -21833,6 +21801,17 @@ dependencies = [ "unicode-xid 0.2.4", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2 1.0.82", + "quote 1.0.35", + "syn 2.0.61", +] + [[package]] name = "sysinfo" version = "0.30.5" @@ -22276,10 +22255,10 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project-lite 0.2.12", "signal-hook-registry", - "socket2 0.5.6", + "socket2 0.5.7", "tokio-macros", "windows-sys 0.48.0", ] @@ -22302,7 +22281,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" dependencies = [ "pin-project", - "rand 0.8.5", + "rand", "tokio", ] @@ -22608,7 +22587,7 @@ dependencies = [ "matchers 0.1.0", "nu-ansi-term", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "regex", "sharded-slab", "smallvec", @@ -22681,7 +22660,7 @@ dependencies = [ "idna 0.2.3", "ipnet", "lazy_static", - "rand 0.8.5", + "rand", "smallvec", "socket2 0.4.9", "thiserror", @@ -22707,7 +22686,7 @@ dependencies = [ "idna 0.4.0", "ipnet", "once_cell", - "rand 0.8.5", + "rand", "smallvec", "thiserror", "tinyvec", @@ -22727,8 +22706,8 @@ dependencies = [ "ipconfig", "lru-cache", "once_cell", - "parking_lot 0.12.1", - "rand 0.8.5", + "parking_lot 0.12.3", + "rand", "resolv-conf", "smallvec", "thiserror", @@ -22777,7 +22756,7 @@ dependencies = [ "http 0.2.9", "httparse", "log", - "rand 0.8.5", + "rand", "rustls 0.21.7", "sha1", "thiserror", @@ -22799,7 +22778,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.7", - "rand 0.8.5", + "rand", "static_assertions", ] @@ -22904,6 +22883,15 @@ dependencies = [ "bytes", "futures-io", "futures-util", +] + +[[package]] +name = "unsigned-varint" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" +dependencies = [ + "bytes", "tokio-util", ] @@ -23029,9 +23017,9 @@ dependencies = [ "arrayref", "constcat", "digest 0.10.7", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand", + "rand_chacha", + "rand_core", "sha2 0.10.8", "sha3", "thiserror", @@ -23072,12 +23060,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -23514,7 +23496,7 @@ dependencies = [ "memfd", "memoffset 0.8.0", "paste", - "rand 0.8.5", + "rand", "rustix 0.36.15", "wasmtime-asm-macros", "wasmtime-environ", @@ -24102,8 +24084,8 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" dependencies = [ - "curve25519-dalek 4.1.3", - "rand_core 0.6.4", + "curve25519-dalek", + "rand_core", "serde", "zeroize", ] @@ -24114,12 +24096,29 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da" dependencies = [ - "asn1-rs", + "asn1-rs 0.5.2", "data-encoding", - "der-parser", + "der-parser 8.2.0", "lazy_static", "nom", - "oid-registry", + "oid-registry 0.6.1", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs 0.6.1", + "data-encoding", + "der-parser 9.0.0", + "lazy_static", + "nom", + "oid-registry 0.7.0", "rusticata-macros", "thiserror", "time", @@ -24352,9 +24351,9 @@ dependencies = [ "futures", "log", "nohash-hasher", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", - "rand 0.8.5", + "rand", "static_assertions", ] @@ -24395,9 +24394,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] diff --git a/Cargo.toml b/Cargo.toml index aa8fad5da8b..44f4eac5c8c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -813,7 +813,7 @@ linked-hash-map = { version = "0.5.4" } linked_hash_set = { version = "0.1.4" } linregress = { version = "0.5.1" } lite-json = { version = "0.2.0", default-features = false } -litep2p = { version = "0.5.0" } +litep2p = { version = "0.6.2" } log = { version = "0.4.21", default-features = false } macro_magic = { version = "0.5.0" } maplit = { version = "1.0.2" } diff --git a/prdoc/pr_4799.prdoc b/prdoc/pr_4799.prdoc new file mode 100644 index 00000000000..c4e68e316c2 --- /dev/null +++ b/prdoc/pr_4799.prdoc @@ -0,0 +1,24 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "network: Upgrade `litep2p` to v0.6.0" + +doc: + - audience: Node Operator + description: | + This PR brings the latest `litep2p` v0.6.0 to polkadot-sdk with stability improvements, + security fixes, and performance optimizations. + + Specifically: + - Incoming DHT records are now validated also with experimental litep2p network backend. + - Performance of TCP & WebSocket connections improved by setting `TCP_NODELAY` flag. + - Stability of secondary connection establishment improved. + - Multiple possible panics in litep2p library eliminated. + +crates: + - name: sc-authority-discovery + bump: patch + - name: sc-network + bump: patch + - name: sc-network-types + bump: patch diff --git a/substrate/client/authority-discovery/src/worker.rs b/substrate/client/authority-discovery/src/worker.rs index b81b10b3ae0..1f1cce16078 100644 --- a/substrate/client/authority-discovery/src/worker.rs +++ b/substrate/client/authority-discovery/src/worker.rs @@ -394,7 +394,7 @@ where debug!( target: LOG_TARGET, - "Authority DHT record peer_id='{local_peer_id}' addresses='{addresses:?}'", + "Publishing authority DHT record peer_id='{local_peer_id}' addresses='{addresses:?}'", ); // The address must include the local peer id. diff --git a/substrate/client/network/src/litep2p/discovery.rs b/substrate/client/network/src/litep2p/discovery.rs index ff5f492df24..ef0de981929 100644 --- a/substrate/client/network/src/litep2p/discovery.rs +++ b/substrate/client/network/src/litep2p/discovery.rs @@ -33,8 +33,9 @@ use litep2p::{ libp2p::{ identify::{Config as IdentifyConfig, IdentifyEvent}, kademlia::{ - Config as KademliaConfig, ConfigBuilder as KademliaConfigBuilder, KademliaEvent, - KademliaHandle, QueryId, Quorum, Record, RecordKey, RecordsType, + Config as KademliaConfig, ConfigBuilder as KademliaConfigBuilder, + IncomingRecordValidationMode, KademliaEvent, KademliaHandle, QueryId, Quorum, + Record, RecordKey, RecordsType, }, ping::{Config as PingConfig, PingEvent}, }, @@ -52,7 +53,7 @@ use std::{ pin::Pin, sync::Arc, task::{Context, Poll}, - time::Duration, + time::{Duration, Instant}, }; /// Logging target for the file. @@ -138,6 +139,12 @@ pub enum DiscoveryEvent { /// Query ID. query_id: QueryId, }, + + /// Incoming record to store. + IncomingRecord { + /// Record. + record: Record, + }, } /// Discovery. @@ -249,6 +256,7 @@ impl Discovery { KademliaConfigBuilder::new() .with_known_peers(known_peers) .with_protocol_names(protocol_names) + .with_incoming_records_validation_mode(IncomingRecordValidationMode::Manual) .build() }; @@ -295,7 +303,7 @@ impl Discovery { ) { if self.local_protocols.is_disjoint(&supported_protocols) { log::trace!( - target: "sub-libp2p", + target: LOG_TARGET, "Ignoring self-reported address of peer {peer} as remote node is not part of the \ Kademlia DHT supported by the local node.", ); @@ -340,6 +348,30 @@ impl Discovery { .await } + /// Store record in the local DHT store. + pub async fn store_record( + &mut self, + key: KademliaKey, + value: Vec, + publisher: Option, + expires: Option, + ) { + log::debug!( + target: LOG_TARGET, + "Storing DHT record with key {key:?}, originally published by {publisher:?}, \ + expires {expires:?}.", + ); + + self.kademlia_handle + .store_record(Record { + key: RecordKey::new(&key.to_vec()), + value, + publisher: publisher.map(Into::into), + expires, + }) + .await; + } + /// Check if the observed address is a known address. fn is_known_address(known: &Multiaddr, observed: &Multiaddr) -> bool { let mut known = known.iter(); @@ -481,6 +513,16 @@ impl Stream for Discovery { false => return Poll::Ready(Some(DiscoveryEvent::QueryFailed { query_id })), } }, + Poll::Ready(Some(KademliaEvent::IncomingRecord { record })) => { + log::trace!( + target: LOG_TARGET, + "incoming `PUT_RECORD` request with key {:?} from publisher {:?}", + record.key, + record.publisher, + ); + + return Poll::Ready(Some(DiscoveryEvent::IncomingRecord { record })) + }, } match Pin::new(&mut this.identify_event_stream).poll_next(cx) { diff --git a/substrate/client/network/src/litep2p/mod.rs b/substrate/client/network/src/litep2p/mod.rs index ae287052b2d..329eb68997b 100644 --- a/substrate/client/network/src/litep2p/mod.rs +++ b/substrate/client/network/src/litep2p/mod.rs @@ -58,7 +58,7 @@ use litep2p::{ protocol::{ libp2p::{ bitswap::Config as BitswapConfig, - kademlia::{QueryId, RecordsType}, + kademlia::{QueryId, Record, RecordsType}, }, request_response::ConfigBuilder as RequestResponseConfigBuilder, }, @@ -369,11 +369,13 @@ impl Litep2pNetworkBackend { .with_websocket(WebSocketTransportConfig { listen_addresses: websocket.into_iter().flatten().map(Into::into).collect(), yamux_config: yamux_config.clone(), + nodelay: true, ..Default::default() }) .with_tcp(TcpTransportConfig { listen_addresses: tcp.into_iter().flatten().map(Into::into).collect(), yamux_config, + nodelay: true, ..Default::default() }) } @@ -698,6 +700,9 @@ impl NetworkBackend for Litep2pNetworkBac let query_id = self.discovery.put_value(key.clone(), value).await; self.pending_put_values.insert(query_id, (key, Instant::now())); } + NetworkServiceCommand::StoreRecord { key, value, publisher, expires } => { + self.discovery.store_record(key, value, publisher.map(Into::into), expires).await; + } NetworkServiceCommand::EventStream { tx } => { self.event_streams.push(tx); } @@ -915,6 +920,16 @@ impl NetworkBackend for Litep2pNetworkBac "ping time with {peer:?}: {rtt:?}", ); } + Some(DiscoveryEvent::IncomingRecord { record: Record { key, value, publisher, expires }} ) => { + self.event_streams.send(Event::Dht( + DhtEvent::PutRecordRequest( + libp2p::kad::RecordKey::new(&key), + value, + publisher.map(Into::into), + expires, + ) + )); + } }, event = self.litep2p.next_event() => match event { Some(Litep2pEvent::ConnectionEstablished { peer, endpoint }) => { diff --git a/substrate/client/network/src/litep2p/service.rs b/substrate/client/network/src/litep2p/service.rs index 20bf6cd12d2..7d972bbeee5 100644 --- a/substrate/client/network/src/litep2p/service.rs +++ b/substrate/client/network/src/litep2p/service.rs @@ -76,6 +76,21 @@ pub enum NetworkServiceCommand { value: Vec, }, + /// Store record in the local DHT store. + StoreRecord { + /// Record key. + key: KademliaKey, + + /// Record value. + value: Vec, + + /// Original publisher of the record. + publisher: Option, + + /// Record expiration time as measured by a local, monothonic clock. + expires: Option, + }, + /// Query network status. Status { /// `oneshot::Sender` for sending the status. @@ -240,13 +255,17 @@ impl NetworkDHTProvider for Litep2pNetworkService { fn store_record( &self, - _key: KademliaKey, - _value: Vec, - _publisher: Option, - _expires: Option, + key: KademliaKey, + value: Vec, + publisher: Option, + expires: Option, ) { - // Will be added once litep2p is released with: https://github.com/paritytech/litep2p/pull/135 - log::warn!(target: LOG_TARGET, "Store record is not implemented for litep2p"); + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::StoreRecord { + key, + value, + publisher, + expires, + }); } } diff --git a/substrate/client/network/types/src/ed25519.rs b/substrate/client/network/types/src/ed25519.rs index e85f405b130..acaa01759e5 100644 --- a/substrate/client/network/types/src/ed25519.rs +++ b/substrate/client/network/types/src/ed25519.rs @@ -82,14 +82,14 @@ impl fmt::Debug for Keypair { impl From for Keypair { fn from(kp: litep2p_ed25519::Keypair) -> Self { - Self::try_from_bytes(&mut kp.encode()) + Self::try_from_bytes(&mut kp.to_bytes()) .expect("ed25519_dalek in substrate & litep2p to use the same format") } } impl From for litep2p_ed25519::Keypair { fn from(kp: Keypair) -> Self { - Self::decode(&mut kp.to_bytes()) + Self::try_from_bytes(&mut kp.to_bytes()) .expect("ed25519_dalek in substrate & litep2p to use the same format") } } @@ -191,14 +191,14 @@ impl PublicKey { impl From for PublicKey { fn from(k: litep2p_ed25519::PublicKey) -> Self { - Self::try_from_bytes(&k.encode()) + Self::try_from_bytes(&k.to_bytes()) .expect("ed25519_dalek in substrate & litep2p to use the same format") } } impl From for litep2p_ed25519::PublicKey { fn from(k: PublicKey) -> Self { - Self::decode(&k.to_bytes()) + Self::try_from_bytes(&k.to_bytes()) .expect("ed25519_dalek in substrate & litep2p to use the same format") } } @@ -272,7 +272,7 @@ impl From for SecretKey { impl From for litep2p_ed25519::SecretKey { fn from(sk: SecretKey) -> Self { - Self::from_bytes(&mut sk.to_bytes()) + Self::try_from_bytes(&mut sk.to_bytes()) .expect("litep2p `SecretKey` to accept 32 bytes as Ed25519 key") } } @@ -357,10 +357,10 @@ mod tests { let kp1: libp2p_ed25519::Keypair = kp.clone().into(); let kp2: litep2p_ed25519::Keypair = kp.clone().into(); let kp3 = libp2p_ed25519::Keypair::try_from_bytes(&mut kp_bytes.clone()).unwrap(); - let kp4 = litep2p_ed25519::Keypair::decode(&mut kp_bytes.clone()).unwrap(); + let kp4 = litep2p_ed25519::Keypair::try_from_bytes(&mut kp_bytes.clone()).unwrap(); assert_eq!(kp_bytes, kp1.to_bytes()); - assert_eq!(kp_bytes, kp2.encode()); + assert_eq!(kp_bytes, kp2.to_bytes()); let msg = "hello world".as_bytes(); let sig = kp.sign(msg); @@ -389,9 +389,9 @@ mod tests { fn litep2p_kp_to_substrate_kp() { let kp = litep2p_ed25519::Keypair::generate(); let kp1: Keypair = kp.clone().into(); - let kp2 = Keypair::try_from_bytes(&mut kp.encode()).unwrap(); + let kp2 = Keypair::try_from_bytes(&mut kp.to_bytes()).unwrap(); - assert_eq!(kp.encode(), kp1.to_bytes()); + assert_eq!(kp.to_bytes(), kp1.to_bytes()); let msg = "hello world".as_bytes(); let sig = kp.sign(msg); @@ -439,10 +439,10 @@ mod tests { let pk1: libp2p_ed25519::PublicKey = pk.clone().into(); let pk2: litep2p_ed25519::PublicKey = pk.clone().into(); let pk3 = libp2p_ed25519::PublicKey::try_from_bytes(&pk_bytes).unwrap(); - let pk4 = litep2p_ed25519::PublicKey::decode(&pk_bytes).unwrap(); + let pk4 = litep2p_ed25519::PublicKey::try_from_bytes(&pk_bytes).unwrap(); assert_eq!(pk_bytes, pk1.to_bytes()); - assert_eq!(pk_bytes, pk2.encode()); + assert_eq!(pk_bytes, pk2.to_bytes()); let msg = "hello world".as_bytes(); let sig = kp.sign(msg); @@ -458,7 +458,7 @@ mod tests { fn litep2p_pk_to_substrate_pk() { let kp = litep2p_ed25519::Keypair::generate(); let pk = kp.public(); - let pk_bytes = pk.clone().encode(); + let pk_bytes = pk.clone().to_bytes(); let pk1: PublicKey = pk.clone().into(); let pk2 = PublicKey::try_from_bytes(&pk_bytes).unwrap(); @@ -497,7 +497,7 @@ mod tests { let sk1: libp2p_ed25519::SecretKey = sk.clone().into(); let sk2: litep2p_ed25519::SecretKey = sk.clone().into(); let sk3 = libp2p_ed25519::SecretKey::try_from_bytes(&mut sk_bytes.clone()).unwrap(); - let sk4 = litep2p_ed25519::SecretKey::from_bytes(&mut sk_bytes.clone()).unwrap(); + let sk4 = litep2p_ed25519::SecretKey::try_from_bytes(&mut sk_bytes.clone()).unwrap(); let kp: Keypair = sk.into(); let kp1: libp2p_ed25519::Keypair = sk1.into(); -- GitLab From f1db2c6ed1f980a7edaf09445151b73f39ef8588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Vilhelm=20=C3=81sgeirsson?= Date: Wed, 26 Jun 2024 16:14:40 +0000 Subject: [PATCH 061/130] Coretime: Add request revenue info (#3940) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enables the `request_revenue` and `notify_revenue` parts of [RFC 5 - Coretime Interface](https://polkadot-fellows.github.io/RFCs/approved/0005-coretime-interface.html) TODO: - [x] Finish first pass at implementation - [x] ~~Need to explicitly burn uncollected and dropped revenue~~ Accumulate it instead - [x] Confirm working on zombienet - [x] Tests - [ ] Enable XCM `request_revenue` sending on Coretime chain on Kusama and Polkadot Fixes: #2209 --------- Co-authored-by: Dmitry Sinyavin Co-authored-by: command-bot <> Co-authored-by: s0me0ne-unkn0wn <48632512+s0me0ne-unkn0wn@users.noreply.github.com> Co-authored-by: Dónal Murray Co-authored-by: Bastian Köcher --- Cargo.lock | 34 +- .../coretime/coretime-rococo/Cargo.toml | 4 +- .../coretime/coretime-rococo/src/coretime.rs | 95 +++-- .../coretime/coretime-rococo/src/lib.rs | 1 + .../src/weights/pallet_broker.rs | 280 +++++++++------ .../coretime/coretime-westend/Cargo.toml | 4 +- .../coretime/coretime-westend/src/coretime.rs | 99 ++++-- .../coretime/coretime-westend/src/lib.rs | 1 + .../src/weights/pallet_broker.rs | 255 ++++++++------ cumulus/polkadot-parachain/Cargo.toml | 6 +- .../parachains/src/assigner_coretime/tests.rs | 3 + .../parachains/src/assigner_on_demand/mod.rs | 332 ++++++------------ .../src/assigner_on_demand/tests.rs | 165 ++++++++- .../src/assigner_on_demand/types.rs | 241 +++++++++++++ .../parachains/src/coretime/benchmarking.rs | 26 +- .../runtime/parachains/src/coretime/mod.rs | 180 ++++++++-- polkadot/runtime/parachains/src/mock.rs | 23 +- polkadot/runtime/rococo/constants/src/lib.rs | 11 + polkadot/runtime/rococo/src/lib.rs | 31 +- .../runtime_parachains_assigner_on_demand.rs | 48 +-- .../weights/runtime_parachains_coretime.rs | 71 +++- polkadot/runtime/westend/constants/Cargo.toml | 3 + polkadot/runtime/westend/constants/src/lib.rs | 11 + polkadot/runtime/westend/src/lib.rs | 31 +- .../runtime_parachains_assigner_on_demand.rs | 48 +-- .../weights/runtime_parachains_coretime.rs | 38 +- prdoc/pr_3940.prdoc | 31 ++ .../cli/tests/res/default_genesis_config.json | 1 + substrate/bin/node/runtime/src/lib.rs | 13 - substrate/frame/broker/src/benchmarking.rs | 142 +++++--- .../frame/broker/src/coretime_interface.rs | 31 +- .../frame/broker/src/dispatchable_impls.rs | 7 +- substrate/frame/broker/src/lib.rs | 33 +- substrate/frame/broker/src/migration.rs | 38 ++ substrate/frame/broker/src/mock.rs | 26 +- substrate/frame/broker/src/tests.rs | 22 +- substrate/frame/broker/src/tick_impls.rs | 23 +- substrate/frame/broker/src/types.rs | 15 + substrate/frame/broker/src/weights.rs | 324 +++++++++-------- 39 files changed, 1831 insertions(+), 916 deletions(-) create mode 100644 polkadot/runtime/parachains/src/assigner_on_demand/types.rs create mode 100644 prdoc/pr_3940.prdoc diff --git a/Cargo.lock b/Cargo.lock index 978f2b98dcf..5a1e5d4a744 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4788,12 +4788,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] +checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" [[package]] name = "derivative" @@ -9410,12 +9407,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-derive" version = "0.4.2" @@ -15296,12 +15287,6 @@ dependencies = [ "rand", ] -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "pprof" version = "0.12.1" @@ -22179,16 +22164,14 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "0bb39ee79a6d8de55f48f2293a830e040392f1c5f16e336bdd1788cd0aadce07" dependencies = [ "deranged", "itoa", "libc", - "num-conv", "num_threads", - "powerfmt", "serde", "time-core", "time-macros", @@ -22196,17 +22179,16 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "733d258752e9303d392b94b75230d07b0b9c489350c69b851fc6c065fde3e8f9" dependencies = [ - "num-conv", "time-core", ] diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml index ebc00533081..ce6bdcdf4f2 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml @@ -199,4 +199,6 @@ try-runtime = [ "sp-runtime/try-runtime", ] -fast-runtime = [] +fast-runtime = [ + "rococo-runtime-constants/fast-runtime", +] diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs index ec3a4f31202..fa0c2644421 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs @@ -21,22 +21,65 @@ use cumulus_primitives_core::relay_chain; use frame_support::{ parameter_types, traits::{ - fungible::{Balanced, Credit}, - OnUnbalanced, + fungible::{Balanced, Credit, Inspect}, + tokens::{Fortitude, Preservation}, + DefensiveResult, OnUnbalanced, }, }; +use frame_system::Pallet as System; use pallet_broker::{CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600, RCBlockNumberOf}; -use parachains_common::{AccountId, Balance, BlockNumber}; +use parachains_common::{AccountId, Balance}; +use rococo_runtime_constants::system_parachain::coretime; +use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; +use xcm_executor::traits::TransactAsset; -pub struct CreditToCollatorPot; -impl OnUnbalanced> for CreditToCollatorPot { - fn on_nonzero_unbalanced(credit: Credit) { - let staking_pot = CollatorSelection::account_id(); - let _ = >::resolve(&staking_pot, credit); +pub struct BurnCoretimeRevenue; +impl OnUnbalanced> for BurnCoretimeRevenue { + fn on_nonzero_unbalanced(amount: Credit) { + let acc = RevenueAccumulationAccount::get(); + if !System::::account_exists(&acc) { + System::::inc_providers(&acc); + } + Balances::resolve(&acc, amount).defensive_ok(); } } +type AssetTransactor = ::AssetTransactor; + +fn burn_at_relay(stash: &AccountId, value: Balance) -> Result<(), XcmError> { + let dest = Location::parent(); + let stash_location = + Junction::AccountId32 { network: None, id: stash.clone().into() }.into_location(); + let asset = Asset { id: AssetId(Location::parent()), fun: Fungible(value) }; + let dummy_xcm_context = XcmContext { origin: None, message_id: [0; 32], topic: None }; + + let withdrawn = AssetTransactor::withdraw_asset(&asset, &stash_location, None)?; + + AssetTransactor::can_check_out(&dest, &asset, &dummy_xcm_context)?; + + let parent_assets = Into::::into(withdrawn) + .reanchored(&dest, &Here.into()) + .defensive_map_err(|_| XcmError::ReanchorFailed)?; + + PolkadotXcm::send_xcm( + Here, + Location::parent(), + Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + ReceiveTeleportedAsset(parent_assets.clone()), + BurnAsset(parent_assets), + ]), + )?; + + AssetTransactor::check_out(&dest, &asset, &dummy_xcm_context); + + Ok(()) +} + /// A type containing the encoding of the coretime pallet in the Relay chain runtime. Used to /// construct any remote calls. The codec index must correspond to the index of `Coretime` in the /// `construct_runtime` of the Relay chain. @@ -66,11 +109,7 @@ enum CoretimeProviderCalls { parameter_types! { pub const BrokerPalletId: PalletId = PalletId(*b"py/broke"); -} - -parameter_types! { - pub storage CoreCount: Option = None; - pub storage CoretimeRevenue: Option<(BlockNumber, Balance)> = None; + pub RevenueAccumulationAccount: AccountId = BrokerPalletId::get().into_sub_account_truncating(b"burnstash"); } /// Type that implements the `CoretimeInterface` for the allocation of Coretime. Meant to operate @@ -205,26 +244,30 @@ impl CoretimeInterface for CoretimeAllocator { } } - fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { - let revenue = CoretimeRevenue::get(); - CoretimeRevenue::set(&None); - revenue - } + fn on_new_timeslice(_t: pallet_broker::Timeslice) { + let stash = RevenueAccumulationAccount::get(); + let value = + Balances::reducible_balance(&stash, Preservation::Expendable, Fortitude::Polite); - #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_revenue_info(when: RCBlockNumberOf, revenue: Self::Balance) { - CoretimeRevenue::set(&Some((when, revenue))); + if value > 0 { + log::debug!(target: "runtime::coretime", "Going to burn {value} stashed tokens at RC"); + match burn_at_relay(&stash, value) { + Ok(()) => { + log::debug!(target: "runtime::coretime", "Succesfully burnt {value} tokens"); + }, + Err(err) => { + log::error!(target: "runtime::coretime", "burn_at_relay failed: {err:?}"); + }, + } + } } } impl pallet_broker::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type OnRevenue = CreditToCollatorPot; - #[cfg(feature = "fast-runtime")] - type TimeslicePeriod = ConstU32<10>; - #[cfg(not(feature = "fast-runtime"))] - type TimeslicePeriod = ConstU32<80>; + type OnRevenue = BurnCoretimeRevenue; + type TimeslicePeriod = ConstU32<{ coretime::TIMESLICE_PERIOD }>; type MaxLeasedCores = ConstU32<50>; type MaxReservedCores = ConstU32<10>; type Coretime = CoretimeAllocator; diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 34f7fa4d3ec..7bd3c675468 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -117,6 +117,7 @@ pub type Migrations = ( cumulus_pallet_xcmp_queue::migration::v5::MigrateV4ToV5, pallet_broker::migration::MigrateV0ToV1, pallet_broker::migration::MigrateV1ToV2, + pallet_broker::migration::MigrateV2ToV3, // permanent pallet_xcm::migration::MigrateToLatestXcmVersion, ); diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs index 5c9175a18d9..83e80e2e91e 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_broker` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-03-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-06-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-x5tnzzy-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_918_000 picoseconds. - Weight::from_parts(2_092_000, 0) + // Minimum execution time: 2_024_000 picoseconds. + Weight::from_parts(2_121_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `10888` // Estimated: `13506` - // Minimum execution time: 21_943_000 picoseconds. - Weight::from_parts(22_570_000, 0) + // Minimum execution time: 21_654_000 picoseconds. + Weight::from_parts(22_591_000, 0) .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +77,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `12090` // Estimated: `13506` - // Minimum execution time: 20_923_000 picoseconds. - Weight::from_parts(21_354_000, 0) + // Minimum execution time: 20_769_000 picoseconds. + Weight::from_parts(21_328_000, 0) .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -93,24 +93,34 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `466` // Estimated: `1951` - // Minimum execution time: 10_687_000 picoseconds. - Weight::from_parts(11_409_000, 0) + // Minimum execution time: 10_404_000 picoseconds. + Weight::from_parts(10_941_000, 0) .saturating_add(Weight::from_parts(0, 1951)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(401), added: 896, mode: `MaxEncodedLen`) + /// Storage: `Broker::Reservations` (r:1 w:0) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::LastRelayChainBlockNumber` (r:1 w:0) /// Proof: `ParachainSystem::LastRelayChainBlockNumber` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `Broker::InstaPoolIo` (r:3 w:3) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) - /// Storage: `Broker::Reservations` (r:1 w:0) - /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) - /// Storage: `Broker::Leases` (r:1 w:1) - /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(401), added: 896, mode: `MaxEncodedLen`) /// Storage: `Broker::SaleInfo` (r:0 w:1) /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) /// Storage: `Broker::Status` (r:0 w:1) @@ -120,33 +130,34 @@ impl pallet_broker::WeightInfo for WeightInfo { /// The range of component `n` is `[0, 1000]`. fn start_sales(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `12567` - // Estimated: `14052` - // Minimum execution time: 111_288_000 picoseconds. - Weight::from_parts(117_804_282, 0) - .saturating_add(Weight::from_parts(0, 14052)) - // Standard Error: 391 - .saturating_add(Weight::from_parts(1_243, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(66)) + // Measured: `12599` + // Estimated: `15065 + n * (1 ±0)` + // Minimum execution time: 44_085_000 picoseconds. + Weight::from_parts(127_668_002, 0) + .saturating_add(Weight::from_parts(0, 15065)) + // Standard Error: 2_231 + .saturating_add(Weight::from_parts(20_604, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(13)) + .saturating_add(T::DbWeight::get().writes(59)) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::SaleInfo` (r:1 w:1) /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:0) + /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Broker::Regions` (r:0 w:1) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) fn purchase() -> Weight { // Proof Size summary in bytes: - // Measured: `316` + // Measured: `332` // Estimated: `3593` - // Minimum execution time: 33_006_000 picoseconds. - Weight::from_parts(34_256_000, 0) + // Minimum execution time: 45_100_000 picoseconds. + Weight::from_parts(46_263_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes(3)) } /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) @@ -156,53 +167,53 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) /// Storage: `Broker::PotentialRenewals` (r:1 w:2) /// Proof: `Broker::PotentialRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:0) + /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Broker::Workplan` (r:0 w:1) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) fn renew() -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `553` // Estimated: `4698` - // Minimum execution time: 61_473_000 picoseconds. - Weight::from_parts(66_476_000, 0) + // Minimum execution time: 65_944_000 picoseconds. + Weight::from_parts(68_666_000, 0) .saturating_add(Weight::from_parts(0, 4698)) .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: `Broker::Regions` (r:1 w:1) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `357` - // Estimated: `3550` - // Minimum execution time: 13_771_000 picoseconds. - Weight::from_parts(14_374_000, 0) - .saturating_add(Weight::from_parts(0, 3550)) + // Measured: `358` + // Estimated: `3551` + // Minimum execution time: 13_794_000 picoseconds. + Weight::from_parts(14_450_000, 0) + .saturating_add(Weight::from_parts(0, 3551)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Regions` (r:1 w:2) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) fn partition() -> Weight { // Proof Size summary in bytes: - // Measured: `357` - // Estimated: `3550` - // Minimum execution time: 15_162_000 picoseconds. - Weight::from_parts(15_742_000, 0) - .saturating_add(Weight::from_parts(0, 3550)) + // Measured: `358` + // Estimated: `3551` + // Minimum execution time: 15_316_000 picoseconds. + Weight::from_parts(15_787_000, 0) + .saturating_add(Weight::from_parts(0, 3551)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: `Broker::Regions` (r:1 w:3) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) fn interlace() -> Weight { // Proof Size summary in bytes: - // Measured: `357` - // Estimated: `3550` - // Minimum execution time: 16_196_000 picoseconds. - Weight::from_parts(16_796_000, 0) - .saturating_add(Weight::from_parts(0, 3550)) + // Measured: `358` + // Estimated: `3551` + // Minimum execution time: 16_375_000 picoseconds. + Weight::from_parts(17_113_000, 0) + .saturating_add(Weight::from_parts(0, 3551)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -211,15 +222,15 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Regions` (r:1 w:1) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) /// Storage: `Broker::Workplan` (r:1 w:1) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) fn assign() -> Weight { // Proof Size summary in bytes: - // Measured: `936` + // Measured: `937` // Estimated: `4681` - // Minimum execution time: 25_653_000 picoseconds. - Weight::from_parts(27_006_000, 0) + // Minimum execution time: 25_952_000 picoseconds. + Weight::from_parts(27_198_000, 0) .saturating_add(Weight::from_parts(0, 4681)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -227,7 +238,7 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Regions` (r:1 w:1) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) /// Storage: `Broker::Workplan` (r:1 w:1) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) /// Storage: `Broker::InstaPoolIo` (r:2 w:2) @@ -236,10 +247,10 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `Broker::InstaPoolContribution` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn pool() -> Weight { // Proof Size summary in bytes: - // Measured: `1002` + // Measured: `1003` // Estimated: `5996` - // Minimum execution time: 31_114_000 picoseconds. - Weight::from_parts(32_235_000, 0) + // Minimum execution time: 31_790_000 picoseconds. + Weight::from_parts(32_920_000, 0) .saturating_add(Weight::from_parts(0, 5996)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) @@ -255,11 +266,11 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `652` // Estimated: `6196 + m * (2520 ±0)` - // Minimum execution time: 57_280_000 picoseconds. - Weight::from_parts(58_127_480, 0) + // Minimum execution time: 56_286_000 picoseconds. + Weight::from_parts(56_946_240, 0) .saturating_add(Weight::from_parts(0, 6196)) - // Standard Error: 41_670 - .saturating_add(Weight::from_parts(1_203_066, 0).saturating_mul(m.into())) + // Standard Error: 44_472 + .saturating_add(Weight::from_parts(1_684_838, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes(5)) @@ -279,25 +290,25 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn purchase_credit() -> Weight { // Proof Size summary in bytes: - // Measured: `215` - // Estimated: `3680` - // Minimum execution time: 59_968_000 picoseconds. - Weight::from_parts(62_315_000, 0) - .saturating_add(Weight::from_parts(0, 3680)) + // Measured: `322` + // Estimated: `3787` + // Minimum execution time: 64_967_000 picoseconds. + Weight::from_parts(66_504_000, 0) + .saturating_add(Weight::from_parts(0, 3787)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Regions` (r:1 w:1) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) fn drop_region() -> Weight { // Proof Size summary in bytes: - // Measured: `465` - // Estimated: `3550` - // Minimum execution time: 50_887_000 picoseconds. - Weight::from_parts(57_366_000, 0) - .saturating_add(Weight::from_parts(0, 3550)) + // Measured: `466` + // Estimated: `3551` + // Minimum execution time: 37_552_000 picoseconds. + Weight::from_parts(46_263_000, 0) + .saturating_add(Weight::from_parts(0, 3551)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -311,8 +322,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `463` // Estimated: `3533` - // Minimum execution time: 84_472_000 picoseconds. - Weight::from_parts(96_536_000, 0) + // Minimum execution time: 79_625_000 picoseconds. + Weight::from_parts(86_227_000, 0) .saturating_add(Weight::from_parts(0, 3533)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -329,8 +340,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `857` // Estimated: `3593` - // Minimum execution time: 96_371_000 picoseconds. - Weight::from_parts(104_659_000, 0) + // Minimum execution time: 88_005_000 picoseconds. + Weight::from_parts(92_984_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -343,8 +354,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `957` // Estimated: `4698` - // Minimum execution time: 51_741_000 picoseconds. - Weight::from_parts(54_461_000, 0) + // Minimum execution time: 38_877_000 picoseconds. + Weight::from_parts(40_408_000, 0) .saturating_add(Weight::from_parts(0, 4698)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -360,13 +371,15 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1000]`. - fn request_core_count(_n: u32, ) -> Weight { + fn request_core_count(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 19_901_000 picoseconds. - Weight::from_parts(21_028_116, 0) + // Minimum execution time: 20_581_000 picoseconds. + Weight::from_parts(21_610_297, 0) .saturating_add(Weight::from_parts(0, 3539)) + // Standard Error: 119 + .saturating_add(Weight::from_parts(144, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -377,29 +390,29 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `266` // Estimated: `1487` - // Minimum execution time: 5_987_000 picoseconds. - Weight::from_parts(6_412_478, 0) + // Minimum execution time: 6_079_000 picoseconds. + Weight::from_parts(6_540_110, 0) .saturating_add(Weight::from_parts(0, 1487)) - // Standard Error: 16 - .saturating_add(Weight::from_parts(47, 0).saturating_mul(n.into())) + // Standard Error: 14 + .saturating_add(Weight::from_parts(10, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) - /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `Broker::RevenueInbox` (r:1 w:1) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) /// Storage: `Broker::InstaPoolHistory` (r:1 w:1) /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:2 w:1) + /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn process_revenue() -> Weight { // Proof Size summary in bytes: - // Measured: `447` + // Measured: `442` // Estimated: `6196` - // Minimum execution time: 38_623_000 picoseconds. - Weight::from_parts(39_773_000, 0) + // Minimum execution time: 42_947_000 picoseconds. + Weight::from_parts(43_767_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `Broker::InstaPoolIo` (r:3 w:3) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) @@ -412,13 +425,15 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `Broker::Workplan` (r:0 w:60) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. - fn rotate_sale(_n: u32, ) -> Weight { + fn rotate_sale(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `12514` // Estimated: `13506` - // Minimum execution time: 97_074_000 picoseconds. - Weight::from_parts(101_247_740, 0) + // Minimum execution time: 93_426_000 picoseconds. + Weight::from_parts(96_185_447, 0) .saturating_add(Weight::from_parts(0, 13506)) + // Standard Error: 116 + .saturating_add(Weight::from_parts(4, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(65)) } @@ -430,8 +445,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3493` - // Minimum execution time: 6_317_000 picoseconds. - Weight::from_parts(6_521_000, 0) + // Minimum execution time: 5_842_000 picoseconds. + Weight::from_parts(6_077_000, 0) .saturating_add(Weight::from_parts(0, 3493)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -454,8 +469,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1321` // Estimated: `4786` - // Minimum execution time: 32_575_000 picoseconds. - Weight::from_parts(33_299_000, 0) + // Minimum execution time: 33_278_000 picoseconds. + Weight::from_parts(34_076_000, 0) .saturating_add(Weight::from_parts(0, 4786)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) @@ -474,8 +489,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 15_256_000 picoseconds. - Weight::from_parts(15_927_000, 0) + // Minimum execution time: 15_779_000 picoseconds. + Weight::from_parts(16_213_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -486,8 +501,19 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_783_000 picoseconds. - Weight::from_parts(1_904_000, 0) + // Minimum execution time: 1_774_000 picoseconds. + Weight::from_parts(1_873_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::RevenueInbox` (r:0 w:1) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) + fn notify_revenue() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_858_000 picoseconds. + Weight::from_parts(1_991_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -497,19 +523,19 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) /// Storage: `Broker::CoreCountInbox` (r:1 w:0) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) - /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `Broker::RevenueInbox` (r:1 w:0) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn do_tick_base() -> Weight { // Proof Size summary in bytes: - // Measured: `398` - // Estimated: `3863` - // Minimum execution time: 12_307_000 picoseconds. - Weight::from_parts(12_967_000, 0) - .saturating_add(Weight::from_parts(0, 3863)) + // Measured: `408` + // Estimated: `1893` + // Minimum execution time: 10_874_000 picoseconds. + Weight::from_parts(11_265_000, 0) + .saturating_add(Weight::from_parts(0, 1893)) .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Leases` (r:1 w:1) /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(401), added: 896, mode: `MaxEncodedLen`) @@ -517,10 +543,32 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `470` // Estimated: `1886` - // Minimum execution time: 6_597_000 picoseconds. - Weight::from_parts(6_969_000, 0) + // Minimum execution time: 6_525_000 picoseconds. + Weight::from_parts(6_769_000, 0) .saturating_add(Weight::from_parts(0, 1886)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn on_new_timeslice() -> Weight { + // Proof Size summary in bytes: + // Measured: `322` + // Estimated: `3787` + // Minimum execution time: 45_561_000 picoseconds. + Weight::from_parts(47_306_000, 0) + .saturating_add(Weight::from_parts(0, 3787)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(3)) + } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml index 10edf7fac85..735e9542197 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml @@ -196,4 +196,6 @@ try-runtime = [ "sp-runtime/try-runtime", ] -fast-runtime = [] +fast-runtime = [ + "westend-runtime-constants/fast-runtime", +] diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs index a5e219b9897..4f06e3e3669 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs @@ -21,22 +21,67 @@ use cumulus_primitives_core::relay_chain; use frame_support::{ parameter_types, traits::{ - fungible::{Balanced, Credit}, - OnUnbalanced, + fungible::{Balanced, Credit, Inspect}, + tokens::{Fortitude, Preservation}, + DefensiveResult, OnUnbalanced, }, }; -use pallet_broker::{CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600, RCBlockNumberOf}; -use parachains_common::{AccountId, Balance, BlockNumber}; +use frame_system::Pallet as System; +use pallet_broker::{ + CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600, RCBlockNumberOf, Timeslice, +}; +use parachains_common::{AccountId, Balance}; +use sp_runtime::traits::AccountIdConversion; +use westend_runtime_constants::system_parachain::coretime; use xcm::latest::prelude::*; +use xcm_executor::traits::TransactAsset; -pub struct CreditToCollatorPot; -impl OnUnbalanced> for CreditToCollatorPot { - fn on_nonzero_unbalanced(credit: Credit) { - let staking_pot = CollatorSelection::account_id(); - let _ = >::resolve(&staking_pot, credit); +pub struct BurnCoretimeRevenue; +impl OnUnbalanced> for BurnCoretimeRevenue { + fn on_nonzero_unbalanced(amount: Credit) { + let acc = RevenueAccumulationAccount::get(); + if !System::::account_exists(&acc) { + System::::inc_providers(&acc); + } + Balances::resolve(&acc, amount).defensive_ok(); } } +type AssetTransactor = ::AssetTransactor; + +fn burn_at_relay(stash: &AccountId, value: Balance) -> Result<(), XcmError> { + let dest = Location::parent(); + let stash_location = + Junction::AccountId32 { network: None, id: stash.clone().into() }.into_location(); + let asset = Asset { id: AssetId(Location::parent()), fun: Fungible(value) }; + let dummy_xcm_context = XcmContext { origin: None, message_id: [0; 32], topic: None }; + + let withdrawn = AssetTransactor::withdraw_asset(&asset, &stash_location, None)?; + + AssetTransactor::can_check_out(&dest, &asset, &dummy_xcm_context)?; + + let parent_assets = Into::::into(withdrawn) + .reanchored(&dest, &Here.into()) + .defensive_map_err(|_| XcmError::ReanchorFailed)?; + + PolkadotXcm::send_xcm( + Here, + Location::parent(), + Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + ReceiveTeleportedAsset(parent_assets.clone()), + BurnAsset(parent_assets), + ]), + )?; + + AssetTransactor::check_out(&dest, &asset, &dummy_xcm_context); + + Ok(()) +} + /// A type containing the encoding of the coretime pallet in the Relay chain runtime. Used to /// construct any remote calls. The codec index must correspond to the index of `Coretime` in the /// `construct_runtime` of the Relay chain. @@ -66,11 +111,7 @@ enum CoretimeProviderCalls { parameter_types! { pub const BrokerPalletId: PalletId = PalletId(*b"py/broke"); -} - -parameter_types! { - pub storage CoreCount: Option = None; - pub storage CoretimeRevenue: Option<(BlockNumber, Balance)> = None; + pub RevenueAccumulationAccount: AccountId = BrokerPalletId::get().into_sub_account_truncating(b"burnstash"); } /// Type that implements the `CoretimeInterface` for the allocation of Coretime. Meant to operate @@ -217,26 +258,30 @@ impl CoretimeInterface for CoretimeAllocator { } } - fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { - let revenue = CoretimeRevenue::get(); - CoretimeRevenue::set(&None); - revenue - } + fn on_new_timeslice(_timeslice: Timeslice) { + let stash = RevenueAccumulationAccount::get(); + let value = + Balances::reducible_balance(&stash, Preservation::Expendable, Fortitude::Polite); - #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_revenue_info(when: RCBlockNumberOf, revenue: Self::Balance) { - CoretimeRevenue::set(&Some((when, revenue))); + if value > 0 { + log::debug!(target: "runtime::coretime", "Going to burn {value} stashed tokens at RC"); + match burn_at_relay(&stash, value) { + Ok(()) => { + log::debug!(target: "runtime::coretime", "Succesfully burnt {value} tokens"); + }, + Err(err) => { + log::error!(target: "runtime::coretime", "burn_at_relay failed: {err:?}"); + }, + } + } } } impl pallet_broker::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type OnRevenue = CreditToCollatorPot; - #[cfg(feature = "fast-runtime")] - type TimeslicePeriod = ConstU32<10>; - #[cfg(not(feature = "fast-runtime"))] - type TimeslicePeriod = ConstU32<80>; + type OnRevenue = BurnCoretimeRevenue; + type TimeslicePeriod = ConstU32<{ coretime::TIMESLICE_PERIOD }>; // We don't actually need any leases at launch but set to 10 in case we want to sudo some in. type MaxLeasedCores = ConstU32<10>; type MaxReservedCores = ConstU32<10>; diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs index 4b2f494c890..bc71ee705e9 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -116,6 +116,7 @@ pub type Migrations = ( cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4, pallet_broker::migration::MigrateV0ToV1, pallet_broker::migration::MigrateV1ToV2, + pallet_broker::migration::MigrateV2ToV3, // permanent pallet_xcm::migration::MigrateToLatestXcmVersion, ); diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs index 7e1c832a909..d130b306f7a 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_broker` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-03-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-06-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-x5tnzzy-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,8 +54,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_897_000 picoseconds. - Weight::from_parts(2_053_000, 0) + // Minimum execution time: 1_899_000 picoseconds. + Weight::from_parts(2_051_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +65,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `10888` // Estimated: `13506` - // Minimum execution time: 22_550_000 picoseconds. - Weight::from_parts(22_871_000, 0) + // Minimum execution time: 21_965_000 picoseconds. + Weight::from_parts(22_774_000, 0) .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +77,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `12090` // Estimated: `13506` - // Minimum execution time: 21_170_000 picoseconds. - Weight::from_parts(21_645_000, 0) + // Minimum execution time: 20_748_000 picoseconds. + Weight::from_parts(21_464_000, 0) .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -93,24 +93,34 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `146` // Estimated: `1631` - // Minimum execution time: 10_494_000 picoseconds. - Weight::from_parts(10_942_000, 0) + // Minimum execution time: 10_269_000 picoseconds. + Weight::from_parts(10_508_000, 0) .saturating_add(Weight::from_parts(0, 1631)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(81), added: 576, mode: `MaxEncodedLen`) + /// Storage: `Broker::Reservations` (r:1 w:0) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::LastRelayChainBlockNumber` (r:1 w:0) /// Proof: `ParachainSystem::LastRelayChainBlockNumber` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `Broker::InstaPoolIo` (r:3 w:3) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) - /// Storage: `Broker::Reservations` (r:1 w:0) - /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) - /// Storage: `Broker::Leases` (r:1 w:1) - /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(81), added: 576, mode: `MaxEncodedLen`) /// Storage: `Broker::SaleInfo` (r:0 w:1) /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) /// Storage: `Broker::Status` (r:0 w:1) @@ -118,15 +128,18 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `Broker::Workplan` (r:0 w:20) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. - fn start_sales(_n: u32, ) -> Weight { + fn start_sales(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `12247` - // Estimated: `13732` - // Minimum execution time: 61_014_000 picoseconds. - Weight::from_parts(63_267_651, 0) - .saturating_add(Weight::from_parts(0, 13732)) - .saturating_add(T::DbWeight::get().reads(8)) + // Measured: `12279` + // Estimated: `14805 + n * (1 ±0)` + // Minimum execution time: 41_900_000 picoseconds. + Weight::from_parts(80_392_728, 0) + .saturating_add(Weight::from_parts(0, 14805)) + // Standard Error: 870 + .saturating_add(Weight::from_parts(4_361, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(13)) .saturating_add(T::DbWeight::get().writes(26)) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) @@ -135,13 +148,13 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `System::Account` (r:1 w:0) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Broker::Regions` (r:0 w:1) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) fn purchase() -> Weight { // Proof Size summary in bytes: - // Measured: `316` + // Measured: `332` // Estimated: `3593` - // Minimum execution time: 30_931_000 picoseconds. - Weight::from_parts(31_941_000, 0) + // Minimum execution time: 40_911_000 picoseconds. + Weight::from_parts(43_102_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -160,47 +173,47 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) fn renew() -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `450` // Estimated: `4698` - // Minimum execution time: 57_466_000 picoseconds. - Weight::from_parts(65_042_000, 0) + // Minimum execution time: 70_257_000 picoseconds. + Weight::from_parts(73_889_000, 0) .saturating_add(Weight::from_parts(0, 4698)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `Broker::Regions` (r:1 w:1) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) fn transfer() -> Weight { // Proof Size summary in bytes: - // Measured: `357` - // Estimated: `3550` - // Minimum execution time: 12_799_000 picoseconds. - Weight::from_parts(13_401_000, 0) - .saturating_add(Weight::from_parts(0, 3550)) + // Measured: `358` + // Estimated: `3551` + // Minimum execution time: 13_302_000 picoseconds. + Weight::from_parts(13_852_000, 0) + .saturating_add(Weight::from_parts(0, 3551)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Regions` (r:1 w:2) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) fn partition() -> Weight { // Proof Size summary in bytes: - // Measured: `357` - // Estimated: `3550` - // Minimum execution time: 14_107_000 picoseconds. - Weight::from_parts(14_630_000, 0) - .saturating_add(Weight::from_parts(0, 3550)) + // Measured: `358` + // Estimated: `3551` + // Minimum execution time: 14_927_000 picoseconds. + Weight::from_parts(15_553_000, 0) + .saturating_add(Weight::from_parts(0, 3551)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: `Broker::Regions` (r:1 w:3) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) fn interlace() -> Weight { // Proof Size summary in bytes: - // Measured: `357` - // Estimated: `3550` - // Minimum execution time: 15_254_000 picoseconds. - Weight::from_parts(16_062_000, 0) - .saturating_add(Weight::from_parts(0, 3550)) + // Measured: `358` + // Estimated: `3551` + // Minimum execution time: 16_237_000 picoseconds. + Weight::from_parts(16_995_000, 0) + .saturating_add(Weight::from_parts(0, 3551)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -209,15 +222,15 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Regions` (r:1 w:1) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) /// Storage: `Broker::Workplan` (r:1 w:1) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) fn assign() -> Weight { // Proof Size summary in bytes: - // Measured: `735` + // Measured: `736` // Estimated: `4681` - // Minimum execution time: 23_557_000 picoseconds. - Weight::from_parts(24_382_000, 0) + // Minimum execution time: 24_621_000 picoseconds. + Weight::from_parts(25_165_000, 0) .saturating_add(Weight::from_parts(0, 4681)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -225,7 +238,7 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Regions` (r:1 w:1) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) /// Storage: `Broker::Workplan` (r:1 w:1) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) /// Storage: `Broker::InstaPoolIo` (r:2 w:2) @@ -234,10 +247,10 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `Broker::InstaPoolContribution` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn pool() -> Weight { // Proof Size summary in bytes: - // Measured: `801` + // Measured: `802` // Estimated: `5996` - // Minimum execution time: 29_371_000 picoseconds. - Weight::from_parts(30_200_000, 0) + // Minimum execution time: 29_832_000 picoseconds. + Weight::from_parts(30_894_000, 0) .saturating_add(Weight::from_parts(0, 5996)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) @@ -253,11 +266,11 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `652` // Estimated: `6196 + m * (2520 ±0)` - // Minimum execution time: 54_331_000 picoseconds. - Weight::from_parts(55_322_165, 0) + // Minimum execution time: 55_390_000 picoseconds. + Weight::from_parts(56_124_789, 0) .saturating_add(Weight::from_parts(0, 6196)) - // Standard Error: 35_225 - .saturating_add(Weight::from_parts(1_099_614, 0).saturating_mul(m.into())) + // Standard Error: 41_724 + .saturating_add(Weight::from_parts(1_551_266, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes(5)) @@ -277,25 +290,25 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn purchase_credit() -> Weight { // Proof Size summary in bytes: - // Measured: `215` - // Estimated: `3680` - // Minimum execution time: 53_789_000 picoseconds. - Weight::from_parts(55_439_000, 0) - .saturating_add(Weight::from_parts(0, 3680)) + // Measured: `320` + // Estimated: `3785` + // Minimum execution time: 59_759_000 picoseconds. + Weight::from_parts(61_310_000, 0) + .saturating_add(Weight::from_parts(0, 3785)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Regions` (r:1 w:1) - /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) fn drop_region() -> Weight { // Proof Size summary in bytes: - // Measured: `465` - // Estimated: `3550` - // Minimum execution time: 43_941_000 picoseconds. - Weight::from_parts(49_776_000, 0) - .saturating_add(Weight::from_parts(0, 3550)) + // Measured: `466` + // Estimated: `3551` + // Minimum execution time: 37_007_000 picoseconds. + Weight::from_parts(51_927_000, 0) + .saturating_add(Weight::from_parts(0, 3551)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -309,8 +322,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `463` // Estimated: `3533` - // Minimum execution time: 64_917_000 picoseconds. - Weight::from_parts(70_403_000, 0) + // Minimum execution time: 86_563_000 picoseconds. + Weight::from_parts(91_274_000, 0) .saturating_add(Weight::from_parts(0, 3533)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -327,8 +340,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `857` // Estimated: `3593` - // Minimum execution time: 72_633_000 picoseconds. - Weight::from_parts(79_305_000, 0) + // Minimum execution time: 93_655_000 picoseconds. + Weight::from_parts(98_160_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -341,8 +354,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `556` // Estimated: `4698` - // Minimum execution time: 36_643_000 picoseconds. - Weight::from_parts(48_218_000, 0) + // Minimum execution time: 33_985_000 picoseconds. + Weight::from_parts(43_618_000, 0) .saturating_add(Weight::from_parts(0, 4698)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -358,13 +371,15 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1000]`. - fn request_core_count(_n: u32, ) -> Weight { + fn request_core_count(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 17_617_000 picoseconds. - Weight::from_parts(18_904_788, 0) + // Minimum execution time: 18_778_000 picoseconds. + Weight::from_parts(19_543_425, 0) .saturating_add(Weight::from_parts(0, 3539)) + // Standard Error: 41 + .saturating_add(Weight::from_parts(33, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -375,26 +390,26 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `266` // Estimated: `1487` - // Minimum execution time: 5_575_000 picoseconds. - Weight::from_parts(5_887_598, 0) + // Minimum execution time: 5_505_000 picoseconds. + Weight::from_parts(5_982_015, 0) .saturating_add(Weight::from_parts(0, 1487)) - // Standard Error: 16 - .saturating_add(Weight::from_parts(41, 0).saturating_mul(n.into())) + // Standard Error: 13 + .saturating_add(Weight::from_parts(44, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) - /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `Broker::RevenueInbox` (r:1 w:1) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) /// Storage: `Broker::InstaPoolHistory` (r:1 w:1) /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn process_revenue() -> Weight { // Proof Size summary in bytes: - // Measured: `447` + // Measured: `442` // Estimated: `6196` - // Minimum execution time: 36_415_000 picoseconds. - Weight::from_parts(37_588_000, 0) + // Minimum execution time: 38_128_000 picoseconds. + Weight::from_parts(40_979_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) @@ -414,11 +429,11 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `12194` // Estimated: `13506` - // Minimum execution time: 48_362_000 picoseconds. - Weight::from_parts(49_616_106, 0) + // Minimum execution time: 49_041_000 picoseconds. + Weight::from_parts(50_522_788, 0) .saturating_add(Weight::from_parts(0, 13506)) - // Standard Error: 61 - .saturating_add(Weight::from_parts(59, 0).saturating_mul(n.into())) + // Standard Error: 72 + .saturating_add(Weight::from_parts(78, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(25)) } @@ -430,8 +445,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3493` - // Minimum execution time: 6_148_000 picoseconds. - Weight::from_parts(6_374_000, 0) + // Minimum execution time: 5_903_000 picoseconds. + Weight::from_parts(6_202_000, 0) .saturating_add(Weight::from_parts(0, 3493)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -454,8 +469,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1321` // Estimated: `4786` - // Minimum execution time: 30_267_000 picoseconds. - Weight::from_parts(30_825_000, 0) + // Minimum execution time: 31_412_000 picoseconds. + Weight::from_parts(31_964_000, 0) .saturating_add(Weight::from_parts(0, 4786)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) @@ -474,8 +489,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 13_491_000 picoseconds. - Weight::from_parts(13_949_000, 0) + // Minimum execution time: 14_098_000 picoseconds. + Weight::from_parts(14_554_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -486,8 +501,19 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_711_000 picoseconds. - Weight::from_parts(1_913_000, 0) + // Minimum execution time: 1_723_000 picoseconds. + Weight::from_parts(1_822_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::RevenueInbox` (r:0 w:1) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) + fn notify_revenue() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_865_000 picoseconds. + Weight::from_parts(1_983_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -497,19 +523,19 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) /// Storage: `Broker::CoreCountInbox` (r:1 w:0) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) - /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `Broker::RevenueInbox` (r:1 w:0) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn do_tick_base() -> Weight { // Proof Size summary in bytes: - // Measured: `398` - // Estimated: `3863` - // Minimum execution time: 12_035_000 picoseconds. - Weight::from_parts(12_383_000, 0) - .saturating_add(Weight::from_parts(0, 3863)) + // Measured: `408` + // Estimated: `1893` + // Minimum execution time: 10_387_000 picoseconds. + Weight::from_parts(10_819_000, 0) + .saturating_add(Weight::from_parts(0, 1893)) .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Leases` (r:1 w:1) /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(81), added: 576, mode: `MaxEncodedLen`) @@ -517,10 +543,21 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `150` // Estimated: `1566` - // Minimum execution time: 6_142_000 picoseconds. - Weight::from_parts(6_538_000, 0) + // Minimum execution time: 5_996_000 picoseconds. + Weight::from_parts(6_278_000, 0) .saturating_add(Weight::from_parts(0, 1566)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn on_new_timeslice() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 2_187_000 picoseconds. + Weight::from_parts(2_372_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + } } diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 89364ff7fab..ae5abdcfab6 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -171,4 +171,8 @@ try-runtime = [ "shell-runtime/try-runtime", "sp-runtime/try-runtime", ] -fast-runtime = ["bridge-hub-rococo-runtime/fast-runtime"] +fast-runtime = [ + "bridge-hub-rococo-runtime/fast-runtime", + "coretime-rococo-runtime/fast-runtime", + "coretime-westend-runtime/fast-runtime", +] diff --git a/polkadot/runtime/parachains/src/assigner_coretime/tests.rs b/polkadot/runtime/parachains/src/assigner_coretime/tests.rs index 81a0988ea67..bab09eda52c 100644 --- a/polkadot/runtime/parachains/src/assigner_coretime/tests.rs +++ b/polkadot/runtime/parachains/src/assigner_coretime/tests.rs @@ -74,6 +74,9 @@ fn run_to_block( Paras::initializer_initialize(b + 1); Scheduler::initializer_initialize(b + 1); + // Update the spot traffic and revenue on every block. + OnDemandAssigner::on_initialize(b + 1); + // In the real runtime this is expected to be called by the `InclusionInherent` pallet. Scheduler::free_cores_and_fill_claim_queue(BTreeMap::new(), b + 1); } diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs index 043a36d99c4..03f05842bca 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs @@ -31,38 +31,40 @@ //! occupying multiple cores in on-demand, we will likely add a separate order type, where the //! intent can be made explicit. +use sp_runtime::traits::Zero; mod benchmarking; pub mod migration; mod mock_helpers; +mod types; extern crate alloc; #[cfg(test)] mod tests; -use core::mem::take; - use crate::{configuration, paras, scheduler::common::Assignment}; - +use alloc::collections::BinaryHeap; +use core::mem::take; use frame_support::{ pallet_prelude::*, traits::{ + defensive_prelude::*, Currency, ExistenceRequirement::{self, AllowDeath, KeepAlive}, WithdrawReasons, }, + PalletId, }; -use frame_system::pallet_prelude::*; -use polkadot_primitives::{CoreIndex, Id as ParaId, ON_DEMAND_MAX_QUEUE_MAX_SIZE}; +use frame_system::{pallet_prelude::*, Pallet as System}; +use polkadot_primitives::{CoreIndex, Id as ParaId}; use sp_runtime::{ - traits::{One, SaturatedConversion}, + traits::{AccountIdConversion, One, SaturatedConversion}, FixedPointNumber, FixedPointOperand, FixedU128, Perbill, Saturating, }; - -use alloc::collections::BinaryHeap; -use sp_std::{ - cmp::{Ord, Ordering, PartialOrd}, - prelude::*, +use sp_std::prelude::*; +use types::{ + BalanceOf, CoreAffinityCount, EnqueuedOrder, QueuePushDirection, QueueStatusType, + SpotTrafficCalculationErr, }; const LOG_TARGET: &str = "runtime::parachains::assigner-on-demand"; @@ -87,217 +89,6 @@ impl WeightInfo for TestWeightInfo { } } -/// Meta data for full queue. -/// -/// This includes elements with affinity and free entries. -/// -/// The actual queue is implemented via multiple priority queues. One for each core, for entries -/// which currently have a core affinity and one free queue, with entries without any affinity yet. -/// -/// The design aims to have most queue accessess be O(1) or O(log(N)). Absolute worst case is O(N). -/// Importantly this includes all accessess that happen in a single block. Even with 50 cores, the -/// total complexity of all operations in the block should maintain above complexities. In -/// particular O(N) stays O(N), it should never be O(N*cores). -/// -/// More concrete rundown on complexity: -/// -/// - insert: O(1) for placing an order, O(log(N)) for push backs. -/// - pop_assignment_for_core: O(log(N)), O(N) worst case: Can only happen for one core, next core -/// is already less work. -/// - report_processed & push back: If affinity dropped to 0, then O(N) in the worst case. Again -/// this divides per core. -/// -/// Reads still exist, also improved slightly, but worst case we fetch all entries. -#[derive(Encode, Decode, TypeInfo)] -struct QueueStatusType { - /// Last calculated traffic value. - traffic: FixedU128, - /// The next index to use. - next_index: QueueIndex, - /// Smallest index still in use. - /// - /// In case of a completely empty queue (free + affinity queues), `next_index - smallest_index - /// == 0`. - smallest_index: QueueIndex, - /// Indices that have been freed already. - /// - /// But have a hole to `smallest_index`, so we can not yet bump `smallest_index`. This binary - /// heap is roughly bounded in the number of on demand cores: - /// - /// For a single core, elements will always be processed in order. With each core added, a - /// level of out of order execution is added. - freed_indices: BinaryHeap, -} - -impl Default for QueueStatusType { - fn default() -> QueueStatusType { - QueueStatusType { - traffic: FixedU128::default(), - next_index: QueueIndex(0), - smallest_index: QueueIndex(0), - freed_indices: BinaryHeap::new(), - } - } -} - -impl QueueStatusType { - /// How many orders are queued in total? - /// - /// This includes entries which have core affinity. - fn size(&self) -> u32 { - self.next_index - .0 - .overflowing_sub(self.smallest_index.0) - .0 - .saturating_sub(self.freed_indices.len() as u32) - } - - /// Get current next index - /// - /// to use for an element newly pushed to the back of the queue. - fn push_back(&mut self) -> QueueIndex { - let QueueIndex(next_index) = self.next_index; - self.next_index = QueueIndex(next_index.overflowing_add(1).0); - QueueIndex(next_index) - } - - /// Push something to the front of the queue - fn push_front(&mut self) -> QueueIndex { - self.smallest_index = QueueIndex(self.smallest_index.0.overflowing_sub(1).0); - self.smallest_index - } - - /// The given index is no longer part of the queue. - /// - /// This updates `smallest_index` if need be. - fn consume_index(&mut self, removed_index: QueueIndex) { - if removed_index != self.smallest_index { - self.freed_indices.push(removed_index.reverse()); - return; - } - let mut index = self.smallest_index.0.overflowing_add(1).0; - // Even more to advance? - while self.freed_indices.peek() == Some(&ReverseQueueIndex(index)) { - index = index.overflowing_add(1).0; - self.freed_indices.pop(); - } - self.smallest_index = QueueIndex(index); - } -} - -/// Keeps track of how many assignments a scheduler currently has at a specific `CoreIndex` for a -/// specific `ParaId`. -#[derive(Encode, Decode, Default, Clone, Copy, TypeInfo)] -#[cfg_attr(test, derive(PartialEq, RuntimeDebug))] -struct CoreAffinityCount { - core_index: CoreIndex, - count: u32, -} - -/// An indicator as to which end of the `OnDemandQueue` an assignment will be placed. -#[cfg_attr(test, derive(RuntimeDebug))] -enum QueuePushDirection { - Back, - Front, -} - -/// Shorthand for the Balance type the runtime is using. -type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; - -/// Errors that can happen during spot traffic calculation. -#[derive(PartialEq, RuntimeDebug)] -enum SpotTrafficCalculationErr { - /// The order queue capacity is at 0. - QueueCapacityIsZero, - /// The queue size is larger than the queue capacity. - QueueSizeLargerThanCapacity, - /// Arithmetic error during division, either division by 0 or over/underflow. - Division, -} - -/// Type used for priority indices. -// NOTE: The `Ord` implementation for this type is unsound in the general case. -// Do not use it for anything but it's intended purpose. -#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone, Eq, Copy)] -struct QueueIndex(u32); - -/// QueueIndex with reverse ordering. -/// -/// Same as `Reverse(QueueIndex)`, but with all the needed traits implemented. -#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone, Eq, Copy)] -struct ReverseQueueIndex(u32); - -impl QueueIndex { - fn reverse(self) -> ReverseQueueIndex { - ReverseQueueIndex(self.0) - } -} - -impl Ord for QueueIndex { - fn cmp(&self, other: &Self) -> Ordering { - let diff = self.0.overflowing_sub(other.0).0; - if diff == 0 { - Ordering::Equal - } else if diff <= ON_DEMAND_MAX_QUEUE_MAX_SIZE { - Ordering::Greater - } else { - Ordering::Less - } - } -} - -impl PartialOrd for QueueIndex { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for ReverseQueueIndex { - fn cmp(&self, other: &Self) -> Ordering { - QueueIndex(other.0).cmp(&QueueIndex(self.0)) - } -} -impl PartialOrd for ReverseQueueIndex { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(&other)) - } -} - -/// Internal representation of an order after it has been enqueued already. -/// -/// This data structure is provided for a min BinaryHeap (Ord compares in reverse order with regards -/// to its elements) -#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone, Eq)] -struct EnqueuedOrder { - para_id: ParaId, - idx: QueueIndex, -} - -impl EnqueuedOrder { - fn new(idx: QueueIndex, para_id: ParaId) -> Self { - Self { idx, para_id } - } -} - -impl PartialOrd for EnqueuedOrder { - fn partial_cmp(&self, other: &Self) -> Option { - match other.idx.partial_cmp(&self.idx) { - Some(Ordering::Equal) => other.para_id.partial_cmp(&self.para_id), - o => o, - } - } -} - -impl Ord for EnqueuedOrder { - fn cmp(&self, other: &Self) -> Ordering { - match other.idx.cmp(&self.idx) { - Ordering::Equal => other.para_id.cmp(&self.para_id), - o => o, - } - } -} - #[frame_support::pallet] pub mod pallet { @@ -324,6 +115,15 @@ pub mod pallet { /// The default value for the spot traffic multiplier. #[pallet::constant] type TrafficDefaultValue: Get; + + /// The maximum number of blocks some historical revenue + /// information stored for. + #[pallet::constant] + type MaxHistoricalRevenue: Get; + + /// Identifier for the internal revenue balance. + #[pallet::constant] + type PalletId: Get; } /// Creates an empty queue status for an empty queue with initial traffic value. @@ -365,6 +165,11 @@ pub mod pallet { EntriesOnEmpty, >; + /// Keeps track of accumulated revenue from on demand order sales. + #[pallet::storage] + pub type Revenue = + StorageValue<_, BoundedVec, T::MaxHistoricalRevenue>, ValueQuery>; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { @@ -386,6 +191,19 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(_now: BlockNumberFor) -> Weight { + // Update revenue information storage. + Revenue::::mutate(|revenue| { + if let Some(overdue) = + revenue.force_insert_keep_left(0, 0u32.into()).defensive_unwrap_or(None) + { + // We have some overdue revenue not claimed by the Coretime Chain, let's + // accumulate it at the oldest stored block + if let Some(last) = revenue.last_mut() { + *last = last.saturating_add(overdue); + } + } + }); + let config = configuration::ActiveConfig::::get(); // We need to update the spot traffic on block initialize in order to account for idle // blocks. @@ -393,8 +211,9 @@ pub mod pallet { Self::update_spot_traffic(&config, queue_status); }); - // 2 reads in config and queuestatus, at maximum 1 write to queuestatus. - T::DbWeight::get().reads_writes(2, 1) + // Reads: `Revenue`, `ActiveConfig`, `QueueStatus` + // Writes: `Revenue`, `QueueStatus` + T::DbWeight::get().reads_writes(3, 2) } } @@ -527,7 +346,8 @@ where } /// Helper function for `place_order_*` calls. Used to differentiate between placing orders - /// with a keep alive check or to allow the account to be reaped. + /// with a keep alive check or to allow the account to be reaped. The amount charged is + /// stored to the pallet account to be later paid out as revenue. /// /// Parameters: /// - `sender`: The sender of the call, funds will be withdrawn from this account. @@ -562,18 +382,40 @@ where // Is the current price higher than `max_amount` ensure!(spot_price.le(&max_amount), Error::::SpotPriceHigherThanMaxAmount); - // Charge the sending account the spot price - let _ = T::Currency::withdraw( + ensure!( + queue_status.size() < config.scheduler_params.on_demand_queue_max_size, + Error::::QueueFull + ); + + // Charge the sending account the spot price. The amount will be teleported to the + // broker chain once it requests revenue information. + let amt = T::Currency::withdraw( &sender, spot_price, WithdrawReasons::FEE, existence_requirement, )?; - ensure!( - queue_status.size() < config.scheduler_params.on_demand_queue_max_size, - Error::::QueueFull - ); + // Consume the negative imbalance and deposit it into the pallet account. Make sure the + // account preserves even without the existential deposit. + let pot = Self::account_id(); + if !System::::account_exists(&pot) { + System::::inc_providers(&pot); + } + T::Currency::resolve_creating(&pot, amt); + + // Add the amount to the current block's (index 0) revenue information. + Revenue::::mutate(|bounded_revenue| { + if let Some(current_block) = bounded_revenue.get_mut(0) { + *current_block = current_block.saturating_add(spot_price); + } else { + // Revenue has already been claimed in the same block, including the block + // itself. It shouldn't normally happen as revenue claims in the future are + // not allowed. + bounded_revenue.try_push(spot_price).defensive_ok(); + } + }); + Pallet::::add_on_demand_order(queue_status, para_id, QueuePushDirection::Back); Pallet::::deposit_event(Event::::OnDemandOrderPlaced { para_id, @@ -790,6 +632,29 @@ where }) } + /// Collect the revenue from the `when` blockheight + pub fn claim_revenue_until(when: BlockNumberFor) -> BalanceOf { + let now = >::block_number(); + let mut amount: BalanceOf = BalanceOf::::zero(); + Revenue::::mutate(|revenue| { + while !revenue.is_empty() { + let index = (revenue.len() - 1) as u32; + if when > now.saturating_sub(index.into()) { + amount = amount.saturating_add(revenue.pop().defensive_unwrap_or(0u32.into())); + } else { + break + } + } + }); + + amount + } + + /// Account of the pallet pot, where the funds from instantaneous coretime sale are accumulated. + pub fn account_id() -> T::AccountId { + T::PalletId::get().into_account_truncating() + } + /// Getter for the affinity tracker. #[cfg(test)] fn get_affinity_map(para_id: ParaId) -> Option { @@ -831,4 +696,9 @@ where fn get_traffic_default_value() -> FixedU128 { ::TrafficDefaultValue::get() } + + #[cfg(test)] + fn get_revenue() -> Vec> { + Revenue::::get().to_vec() + } } diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs b/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs index 5747413e714..3d01ba655d3 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs @@ -17,7 +17,12 @@ use super::*; use crate::{ - assigner_on_demand::{mock_helpers::GenesisConfigBuilder, Error}, + assigner_on_demand::{ + self, + mock_helpers::GenesisConfigBuilder, + types::{QueueIndex, ReverseQueueIndex}, + Error, + }, initializer::SessionChangeNotification, mock::{ new_test_ext, Balances, OnDemandAssigner, Paras, ParasShared, RuntimeOrigin, Scheduler, @@ -27,8 +32,13 @@ use crate::{ }; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; use pallet_balances::Error as BalancesError; -use polkadot_primitives::{BlockNumber, SessionIndex, ValidationCode}; -use sp_std::collections::btree_map::BTreeMap; +use polkadot_primitives::{ + BlockNumber, SessionIndex, ValidationCode, ON_DEMAND_MAX_QUEUE_MAX_SIZE, +}; +use sp_std::{ + cmp::{Ord, Ordering}, + collections::btree_map::BTreeMap, +}; fn schedule_blank_para(id: ParaId, parakind: ParaKind) { let validation_code: ValidationCode = vec![1, 2, 3].into(); @@ -73,7 +83,7 @@ fn run_to_block( Paras::initializer_initialize(b + 1); Scheduler::initializer_initialize(b + 1); - // We need to update the spot traffic on every block. + // Update the spot traffic and revenue on every block. OnDemandAssigner::on_initialize(b + 1); // In the real runtime this is expected to be called by the `InclusionInherent` pallet. @@ -81,16 +91,26 @@ fn run_to_block( } } -fn place_order(para_id: ParaId) { +fn place_order_run_to_blocknumber(para_id: ParaId, blocknumber: Option) { let alice = 100u64; let amt = 10_000_000u128; Balances::make_free_balance_be(&alice, amt); - run_to_block(101, |n| if n == 101 { Some(Default::default()) } else { None }); + if let Some(bn) = blocknumber { + run_to_block(bn, |n| if n == bn { Some(Default::default()) } else { None }); + } OnDemandAssigner::place_order_allow_death(RuntimeOrigin::signed(alice), amt, para_id).unwrap() } +fn place_order_run_to_101(para_id: ParaId) { + place_order_run_to_blocknumber(para_id, Some(101)); +} + +fn place_order(para_id: ParaId) { + place_order_run_to_blocknumber(para_id, None); +} + #[test] fn spot_traffic_capacity_zero_returns_none() { match OnDemandAssigner::calculate_spot_traffic( @@ -377,8 +397,8 @@ fn push_back_assignment_works() { run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); // Add enough assignments to the order queue. - place_order(para_a); - place_order(para_b); + place_order_run_to_101(para_a); + place_order_run_to_101(para_b); // Pop order a assert_eq!( @@ -424,9 +444,9 @@ fn affinity_prohibits_parallel_scheduling() { assert!(OnDemandAssigner::get_affinity_map(para_b).is_none()); // Add 2 assignments for para_a for every para_b. - place_order(para_a); - place_order(para_a); - place_order(para_b); + place_order_run_to_101(para_a); + place_order_run_to_101(para_a); + place_order_run_to_101(para_b); // Approximate having 1 core. for _ in 0..3 { @@ -448,9 +468,9 @@ fn affinity_prohibits_parallel_scheduling() { OnDemandAssigner::report_processed(para_b, 0.into()); // Add 2 assignments for para_a for every para_b. - place_order(para_a); - place_order(para_a); - place_order(para_b); + place_order_run_to_101(para_a); + place_order_run_to_101(para_a); + place_order_run_to_101(para_b); // Approximate having 3 cores. CoreIndex 2 should be unable to obtain an assignment for _ in 0..3 { @@ -490,7 +510,7 @@ fn affinity_changes_work() { // Add enough assignments to the order queue. for _ in 0..10 { - place_order(para_a); + place_order_run_to_101(para_a); } // There should be no affinity before the scheduler pops. @@ -554,7 +574,7 @@ fn new_affinity_for_a_core_must_come_from_free_entries() { // Place orders for all chains. parachains.iter().for_each(|chain| { - place_order(*chain); + place_order_run_to_101(*chain); }); // There are 4 entries in free_entries. @@ -679,8 +699,8 @@ fn queue_status_size_fn_works() { // Place orders for all chains. parachains.iter().for_each(|chain| { // 2 per chain for a total of 6 - place_order(*chain); - place_order(*chain); + place_order_run_to_101(*chain); + place_order_run_to_101(*chain); }); // 6 orders in free entries @@ -707,3 +727,112 @@ fn queue_status_size_fn_works() { assert_eq!(OnDemandAssigner::get_queue_status().size(), 4) }); } + +#[test] +fn revenue_information_fetching_works() { + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + let para_a = ParaId::from(111); + schedule_blank_para(para_a, ParaKind::Parathread); + // Mock assigner sets max revenue history to 10. + run_to_block(10, |n| if n == 10 { Some(Default::default()) } else { None }); + let revenue = OnDemandAssigner::claim_revenue_until(10); + + // No revenue should be recorded. + assert_eq!(revenue, 0); + + // Place one order + place_order_run_to_blocknumber(para_a, Some(11)); + let revenue = OnDemandAssigner::get_revenue(); + let claim = OnDemandAssigner::claim_revenue_until(11); + + // Revenue until the current block is still zero as "until" is non-inclusive + assert_eq!(claim, 0); + + run_to_block(12, |n| if n == 12 { Some(Default::default()) } else { None }); + let claim = OnDemandAssigner::claim_revenue_until(12); + + // Revenue for a single order should be recorded and shouldn't have been pruned by the + // previous call + assert_eq!(claim, revenue[0]); + + // Place many orders + place_order(para_a); + place_order(para_a); + + run_to_block(13, |n| if n == 13 { Some(Default::default()) } else { None }); + + place_order(para_a); + + run_to_block(15, |n| if n == 14 { Some(Default::default()) } else { None }); + + let revenue = OnDemandAssigner::claim_revenue_until(15); + + // All 3 orders should be accounted for. + assert_eq!(revenue, 30_000); + + // Place one order + place_order_run_to_blocknumber(para_a, Some(16)); + + let revenue = OnDemandAssigner::claim_revenue_until(15); + + // Order is not in range of the revenue_until call + assert_eq!(revenue, 0); + + run_to_block(21, |n| if n == 20 { Some(Default::default()) } else { None }); + let revenue = OnDemandAssigner::claim_revenue_until(21); + assert_eq!(revenue, 10_000); + + // Make sure overdue revenue is accumulated + for i in 21..=35 { + run_to_block(i, |n| if n % 10 == 0 { Some(Default::default()) } else { None }); + place_order(para_a); + } + run_to_block(36, |_| None); + let revenue = OnDemandAssigner::claim_revenue_until(36); + assert_eq!(revenue, 150_000); + }); +} + +#[test] +fn pot_account_is_immortal() { + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + let para_a = ParaId::from(111); + let pot = OnDemandAssigner::account_id(); + assert!(!System::account_exists(&pot)); + schedule_blank_para(para_a, ParaKind::Parathread); + // Mock assigner sets max revenue history to 10. + + run_to_block(10, |n| if n == 10 { Some(Default::default()) } else { None }); + place_order_run_to_blocknumber(para_a, Some(12)); + let purchase_revenue = Balances::free_balance(&pot); + assert!(purchase_revenue > 0); + + run_to_block(15, |_| None); + let _imb = ::Currency::withdraw( + &pot, + purchase_revenue, + WithdrawReasons::FEE, + ExistenceRequirement::AllowDeath, + ); + assert_eq!(Balances::free_balance(&pot), 0); + assert!(System::account_exists(&pot)); + assert_eq!(System::providers(&pot), 1); + + // One more cycle to make sure providers are not increased on every transition from zero + run_to_block(20, |n| if n == 20 { Some(Default::default()) } else { None }); + place_order_run_to_blocknumber(para_a, Some(22)); + let purchase_revenue = Balances::free_balance(&pot); + assert!(purchase_revenue > 0); + + run_to_block(25, |_| None); + let _imb = ::Currency::withdraw( + &pot, + purchase_revenue, + WithdrawReasons::FEE, + ExistenceRequirement::AllowDeath, + ); + assert_eq!(Balances::free_balance(&pot), 0); + assert!(System::account_exists(&pot)); + assert_eq!(System::providers(&pot), 1); + }); +} diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/types.rs b/polkadot/runtime/parachains/src/assigner_on_demand/types.rs new file mode 100644 index 00000000000..51d586a77a1 --- /dev/null +++ b/polkadot/runtime/parachains/src/assigner_on_demand/types.rs @@ -0,0 +1,241 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! On demand module types. + +use super::{alloc, pallet::Config}; +use alloc::collections::BinaryHeap; +use frame_support::{ + pallet_prelude::{Decode, Encode, RuntimeDebug, TypeInfo}, + traits::Currency, +}; +use polkadot_primitives::{CoreIndex, Id as ParaId, ON_DEMAND_MAX_QUEUE_MAX_SIZE}; +use sp_runtime::FixedU128; +use sp_std::{ + cmp::{Ord, Ordering, PartialOrd}, + prelude::*, +}; + +/// Shorthand for the Balance type the runtime is using. +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + +/// Meta data for full queue. +/// +/// This includes elements with affinity and free entries. +/// +/// The actual queue is implemented via multiple priority queues. One for each core, for entries +/// which currently have a core affinity and one free queue, with entries without any affinity yet. +/// +/// The design aims to have most queue accessess be O(1) or O(log(N)). Absolute worst case is O(N). +/// Importantly this includes all accessess that happen in a single block. Even with 50 cores, the +/// total complexity of all operations in the block should maintain above complexities. In +/// particular O(N) stays O(N), it should never be O(N*cores). +/// +/// More concrete rundown on complexity: +/// +/// - insert: O(1) for placing an order, O(log(N)) for push backs. +/// - pop_assignment_for_core: O(log(N)), O(N) worst case: Can only happen for one core, next core +/// is already less work. +/// - report_processed & push back: If affinity dropped to 0, then O(N) in the worst case. Again +/// this divides per core. +/// +/// Reads still exist, also improved slightly, but worst case we fetch all entries. +#[derive(Encode, Decode, TypeInfo)] +pub struct QueueStatusType { + /// Last calculated traffic value. + pub traffic: FixedU128, + /// The next index to use. + pub next_index: QueueIndex, + /// Smallest index still in use. + /// + /// In case of a completely empty queue (free + affinity queues), `next_index - smallest_index + /// == 0`. + pub smallest_index: QueueIndex, + /// Indices that have been freed already. + /// + /// But have a hole to `smallest_index`, so we can not yet bump `smallest_index`. This binary + /// heap is roughly bounded in the number of on demand cores: + /// + /// For a single core, elements will always be processed in order. With each core added, a + /// level of out of order execution is added. + pub freed_indices: BinaryHeap, +} + +impl Default for QueueStatusType { + fn default() -> QueueStatusType { + QueueStatusType { + traffic: FixedU128::default(), + next_index: QueueIndex(0), + smallest_index: QueueIndex(0), + freed_indices: BinaryHeap::new(), + } + } +} + +impl QueueStatusType { + /// How many orders are queued in total? + /// + /// This includes entries which have core affinity. + pub fn size(&self) -> u32 { + self.next_index + .0 + .overflowing_sub(self.smallest_index.0) + .0 + .saturating_sub(self.freed_indices.len() as u32) + } + + /// Get current next index + /// + /// to use for an element newly pushed to the back of the queue. + pub fn push_back(&mut self) -> QueueIndex { + let QueueIndex(next_index) = self.next_index; + self.next_index = QueueIndex(next_index.overflowing_add(1).0); + QueueIndex(next_index) + } + + /// Push something to the front of the queue + pub fn push_front(&mut self) -> QueueIndex { + self.smallest_index = QueueIndex(self.smallest_index.0.overflowing_sub(1).0); + self.smallest_index + } + + /// The given index is no longer part of the queue. + /// + /// This updates `smallest_index` if need be. + pub fn consume_index(&mut self, removed_index: QueueIndex) { + if removed_index != self.smallest_index { + self.freed_indices.push(removed_index.reverse()); + return; + } + let mut index = self.smallest_index.0.overflowing_add(1).0; + // Even more to advance? + while self.freed_indices.peek() == Some(&ReverseQueueIndex(index)) { + index = index.overflowing_add(1).0; + self.freed_indices.pop(); + } + self.smallest_index = QueueIndex(index); + } +} + +/// Type used for priority indices. +// NOTE: The `Ord` implementation for this type is unsound in the general case. +// Do not use it for anything but it's intended purpose. +#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone, Eq, Copy)] +pub struct QueueIndex(pub u32); + +/// QueueIndex with reverse ordering. +/// +/// Same as `Reverse(QueueIndex)`, but with all the needed traits implemented. +#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone, Eq, Copy)] +pub struct ReverseQueueIndex(pub u32); + +impl QueueIndex { + fn reverse(self) -> ReverseQueueIndex { + ReverseQueueIndex(self.0) + } +} + +impl Ord for QueueIndex { + fn cmp(&self, other: &Self) -> Ordering { + let diff = self.0.overflowing_sub(other.0).0; + if diff == 0 { + Ordering::Equal + } else if diff <= ON_DEMAND_MAX_QUEUE_MAX_SIZE { + Ordering::Greater + } else { + Ordering::Less + } + } +} + +impl PartialOrd for QueueIndex { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for ReverseQueueIndex { + fn cmp(&self, other: &Self) -> Ordering { + QueueIndex(other.0).cmp(&QueueIndex(self.0)) + } +} +impl PartialOrd for ReverseQueueIndex { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(&other)) + } +} + +/// Internal representation of an order after it has been enqueued already. +/// +/// This data structure is provided for a min BinaryHeap (Ord compares in reverse order with regards +/// to its elements) +#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone, Eq)] +pub struct EnqueuedOrder { + pub para_id: ParaId, + pub idx: QueueIndex, +} + +impl EnqueuedOrder { + pub fn new(idx: QueueIndex, para_id: ParaId) -> Self { + Self { idx, para_id } + } +} + +impl PartialOrd for EnqueuedOrder { + fn partial_cmp(&self, other: &Self) -> Option { + match other.idx.partial_cmp(&self.idx) { + Some(Ordering::Equal) => other.para_id.partial_cmp(&self.para_id), + o => o, + } + } +} + +impl Ord for EnqueuedOrder { + fn cmp(&self, other: &Self) -> Ordering { + match other.idx.cmp(&self.idx) { + Ordering::Equal => other.para_id.cmp(&self.para_id), + o => o, + } + } +} + +/// Keeps track of how many assignments a scheduler currently has at a specific `CoreIndex` for a +/// specific `ParaId`. +#[derive(Encode, Decode, Default, Clone, Copy, TypeInfo)] +#[cfg_attr(test, derive(PartialEq, RuntimeDebug))] +pub struct CoreAffinityCount { + pub core_index: CoreIndex, + pub count: u32, +} + +/// An indicator as to which end of the `OnDemandQueue` an assignment will be placed. +#[cfg_attr(test, derive(RuntimeDebug))] +pub enum QueuePushDirection { + Back, + Front, +} + +/// Errors that can happen during spot traffic calculation. +#[derive(PartialEq, RuntimeDebug)] +pub enum SpotTrafficCalculationErr { + /// The order queue capacity is at 0. + QueueCapacityIsZero, + /// The queue size is larger than the queue capacity. + QueueSizeLargerThanCapacity, + /// Arithmetic error during division, either division by 0 or over/underflow. + Division, +} diff --git a/polkadot/runtime/parachains/src/coretime/benchmarking.rs b/polkadot/runtime/parachains/src/coretime/benchmarking.rs index d1ac71f580e..028250e188e 100644 --- a/polkadot/runtime/parachains/src/coretime/benchmarking.rs +++ b/polkadot/runtime/parachains/src/coretime/benchmarking.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! On demand assigner pallet benchmarking. +//! Coretime pallet benchmarking. #![cfg(feature = "runtime-benchmarks")] @@ -28,6 +28,30 @@ mod benchmarks { use super::*; use assigner_coretime::PartsOf57600; + #[benchmark] + fn request_revenue_at() { + let root_origin = ::RuntimeOrigin::root(); + let mhr = ::MaxHistoricalRevenue::get(); + frame_system::Pallet::::set_block_number((mhr + 2).into()); + let minimum_balance = ::Currency::minimum_balance(); + let rev: BoundedVec< + <::Currency as frame_support::traits::Currency< + T::AccountId, + >>::Balance, + T::MaxHistoricalRevenue, + > = BoundedVec::try_from((1..=mhr).map(|v| minimum_balance * v.into()).collect::>()) + .unwrap(); + assigner_on_demand::Revenue::::put(rev); + + ::Currency::make_free_balance_be( + &>::account_id(), + minimum_balance * (mhr * (mhr + 1)).into(), + ); + + #[extrinsic_call] + _(root_origin as ::RuntimeOrigin, mhr + 1) + } + #[benchmark] fn request_core_count() { // Setup diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs index dedffb733d3..fc8a3c7d9d2 100644 --- a/polkadot/runtime/parachains/src/coretime/mod.rs +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -18,20 +18,36 @@ //! //! -use sp_std::{prelude::*, result}; - -use frame_support::{pallet_prelude::*, traits::Currency}; +use frame_support::{ + pallet_prelude::*, + traits::{defensive_prelude::*, Currency}, +}; use frame_system::pallet_prelude::*; pub use pallet::*; use pallet_broker::{CoreAssignment, CoreIndex as BrokerCoreIndex}; -use polkadot_primitives::{CoreIndex, Id as ParaId}; +use polkadot_primitives::{Balance, BlockNumber, CoreIndex, Id as ParaId}; use sp_arithmetic::traits::SaturatedConversion; -use xcm::prelude::{ - send_xcm, Instruction, Junction, Location, OriginKind, SendXcm, WeightLimit, Xcm, +use sp_runtime::traits::TryConvert; +use sp_std::{prelude::*, result}; +use xcm::{ + prelude::{send_xcm, Instruction, Junction, Location, OriginKind, SendXcm, WeightLimit, Xcm}, + v4::{ + Asset, + AssetFilter::Wild, + AssetId, Assets, Error as XcmError, + Fungibility::Fungible, + Instruction::{DepositAsset, ReceiveTeleportedAsset}, + Junctions::Here, + Reanchorable, + WildAsset::AllCounted, + XcmContext, + }, }; +use xcm_executor::traits::TransactAsset; use crate::{ assigner_coretime::{self, PartsOf57600}, + assigner_on_demand, initializer::{OnNewSession, SessionChangeNotification}, origin::{ensure_parachain, Origin}, }; @@ -39,9 +55,11 @@ use crate::{ mod benchmarking; pub mod migration; +const LOG_TARGET: &str = "runtime::parachains::coretime"; + pub trait WeightInfo { fn request_core_count() -> Weight; - //fn request_revenue_info_at() -> Weight; + fn request_revenue_at() -> Weight; //fn credit_account() -> Weight; fn assign_core(s: u32) -> Weight; } @@ -53,19 +71,23 @@ impl WeightInfo for TestWeightInfo { fn request_core_count() -> Weight { Weight::MAX } - // TODO: Add real benchmarking functionality for each of these to - // benchmarking.rs, then uncomment here and in trait definition. - /*fn request_revenue_info_at() -> Weight { + fn request_revenue_at() -> Weight { Weight::MAX } - fn credit_account() -> Weight { - Weight::MAX - }*/ + // TODO: Add real benchmarking functionality for each of these to + // benchmarking.rs, then uncomment here and in trait definition. + //fn credit_account() -> Weight { + // Weight::MAX + //} fn assign_core(_s: u32) -> Weight { Weight::MAX } } +/// Shorthand for the Balance type the runtime is using. +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + /// Broker pallet index on the coretime chain. Used to /// /// construct remote calls. The codec index must correspond to the index of `Broker` in the @@ -85,6 +107,8 @@ enum CoretimeCalls { SetLease(pallet_broker::TaskId, pallet_broker::Timeslice), #[codec(index = 19)] NotifyCoreCount(u16), + #[codec(index = 20)] + NotifyRevenue((BlockNumber, Balance)), #[codec(index = 99)] SwapLeases(ParaId, ParaId), } @@ -92,6 +116,9 @@ enum CoretimeCalls { #[frame_support::pallet] pub mod pallet { use crate::configuration; + use sp_runtime::traits::TryConvert; + use xcm::v4::InteriorLocation; + use xcm_executor::traits::TransactAsset; use super::*; @@ -100,7 +127,9 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + assigner_coretime::Config { + pub trait Config: + frame_system::Config + assigner_coretime::Config + assigner_on_demand::Config + { type RuntimeOrigin: From<::RuntimeOrigin> + Into::RuntimeOrigin>>; type RuntimeEvent: From> + IsType<::RuntimeEvent>; @@ -109,9 +138,17 @@ pub mod pallet { /// The ParaId of the coretime chain. #[pallet::constant] type BrokerId: Get; + /// The coretime chain pot location. + #[pallet::constant] + type BrokerPotLocation: Get; /// Something that provides the weight of this pallet. type WeightInfo: WeightInfo; + /// The XCM sender. type SendXcm: SendXcm; + /// The asset transactor. + type AssetTransactor: TransactAsset; + /// AccountId to Location converter + type AccountToLocation: for<'a> TryConvert<&'a Self::AccountId, Location>; /// Maximum weight for any XCM transact call that should be executed on the coretime chain. /// @@ -132,6 +169,11 @@ pub mod pallet { pub enum Error { /// The paraid making the call is not the coretime brokerage system parachain. NotBroker, + /// Requested revenue information `when` parameter was in the future from the current + /// block height. + RequestedFutureRevenue, + /// Failed to transfer assets to the coretime chain + AssetTransferFailed, } #[pallet::hooks] @@ -154,17 +196,17 @@ pub mod pallet { configuration::Pallet::::set_coretime_cores_unchecked(u32::from(count)) } - //// TODO Impl me! - ////#[pallet::weight(::WeightInfo::request_revenue_info_at())] - //#[pallet::call_index(2)] - //pub fn request_revenue_info_at( - // origin: OriginFor, - // _when: BlockNumberFor, - //) -> DispatchResult { - // // Ignore requests not coming from the coretime chain or root. - // Self::ensure_root_or_para(origin, ::BrokerId::get().into())?; - // Ok(()) - //} + /// Request to claim the instantaneous coretime sales revenue starting from the block it was + /// last claimed until and up to the block specified. The claimed amount value is sent back + /// to the Coretime chain in a `notify_revenue` message. At the same time, the amount is + /// teleported to the Coretime chain. + #[pallet::weight(::WeightInfo::request_revenue_at())] + #[pallet::call_index(2)] + pub fn request_revenue_at(origin: OriginFor, when: BlockNumber) -> DispatchResult { + // Ignore requests not coming from the Coretime Chain or Root. + Self::ensure_root_or_para(origin, ::BrokerId::get().into())?; + Self::notify_revenue(when) + } //// TODO Impl me! ////#[pallet::weight(::WeightInfo::credit_account())] @@ -244,11 +286,43 @@ impl Pallet { Location::new(0, [Junction::Parachain(T::BrokerId::get())]), message, ) { - log::error!("Sending `NotifyCoreCount` to coretime chain failed: {:?}", err); + log::error!(target: LOG_TARGET, "Sending `NotifyCoreCount` to coretime chain failed: {:?}", err); } } } + /// Provide the amount of revenue accumulated from Instantaneous Coretime Sales from Relay-chain + /// block number last_until to until, not including until itself. last_until is defined as being + /// the until argument of the last notify_revenue message sent, or zero for the first call. If + /// revenue is None, this indicates that the information is no longer available. This explicitly + /// disregards the possibility of multiple parachains requesting and being notified of revenue + /// information. + /// + /// The Relay-chain must be configured to ensure that only a single revenue information + /// destination exists. + pub fn notify_revenue(until: BlockNumber) -> DispatchResult { + let now = >::block_number(); + let until_bnf: BlockNumberFor = until.into(); + + // When cannot be in the future. + ensure!(until_bnf <= now, Error::::RequestedFutureRevenue); + + let amount = >::claim_revenue_until(until_bnf); + log::debug!(target: LOG_TARGET, "Revenue info requested: {:?}", amount); + + let raw_revenue: Balance = amount.try_into().map_err(|_| { + log::error!(target: LOG_TARGET, "Converting on demand revenue for `NotifyRevenue` failed"); + Error::::AssetTransferFailed + })?; + + do_notify_revenue::(until, raw_revenue).map_err(|err| { + log::error!(target: LOG_TARGET, "notify_revenue failed: {err:?}"); + Error::::AssetTransferFailed + })?; + + Ok(()) + } + // Handle legacy swaps in coretime. Notifies coretime chain that a lease swap has occurred via // XCM message. This function is meant to be used in an implementation of `OnSwap` trait. pub fn on_legacy_lease_swap(one: ParaId, other: ParaId) { @@ -263,7 +337,7 @@ impl Pallet { Location::new(0, [Junction::Parachain(T::BrokerId::get())]), message, ) { - log::error!("Sending `SwapLeases` to coretime chain failed: {:?}", err); + log::error!(target: LOG_TARGET, "Sending `SwapLeases` to coretime chain failed: {:?}", err); } } } @@ -281,3 +355,55 @@ fn mk_coretime_call(call: crate::coretime::CoretimeCalls) -> Instruct call: BrokerRuntimePallets::Broker(call).encode().into(), } } + +fn do_notify_revenue(when: BlockNumber, raw_revenue: Balance) -> Result<(), XcmError> { + let dest = Junction::Parachain(T::BrokerId::get()).into_location(); + let mut message = Vec::new(); + let asset = Asset { id: AssetId(Location::here()), fun: Fungible(raw_revenue) }; + let dummy_xcm_context = XcmContext { origin: None, message_id: [0; 32], topic: None }; + + if raw_revenue > 0 { + let on_demand_pot = + T::AccountToLocation::try_convert(&>::account_id()) + .map_err(|err| { + log::error!( + target: LOG_TARGET, + "Failed to convert on-demand pot account to XCM location: {err:?}", + ); + XcmError::InvalidLocation + })?; + + let withdrawn = T::AssetTransactor::withdraw_asset(&asset, &on_demand_pot, None)?; + + T::AssetTransactor::can_check_out(&dest, &asset, &dummy_xcm_context)?; + + let assets_reanchored = Into::::into(withdrawn) + .reanchored(&dest, &Here.into()) + .defensive_map_err(|_| XcmError::ReanchorFailed)?; + + message.extend( + [ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + ReceiveTeleportedAsset(assets_reanchored), + DepositAsset { + assets: Wild(AllCounted(1)), + beneficiary: T::BrokerPotLocation::get().into_location(), + }, + ] + .into_iter(), + ); + } + + message.push(mk_coretime_call::(CoretimeCalls::NotifyRevenue((when, raw_revenue)))); + + send_xcm::(dest.clone(), Xcm(message))?; + + if raw_revenue > 0 { + T::AssetTransactor::check_out(&dest, &asset, &dummy_xcm_context); + } + + Ok(()) +} diff --git a/polkadot/runtime/parachains/src/mock.rs b/polkadot/runtime/parachains/src/mock.rs index 18722ff463c..9c23347ebb5 100644 --- a/polkadot/runtime/parachains/src/mock.rs +++ b/polkadot/runtime/parachains/src/mock.rs @@ -36,6 +36,7 @@ use frame_support::{ Currency, ProcessMessage, ProcessMessageError, ValidatorSet, ValidatorSetWithIdentification, }, weights::{Weight, WeightMeter}, + PalletId, }; use frame_support_test::TestRandomness; use frame_system::limits; @@ -57,7 +58,7 @@ use sp_std::{ use std::collections::HashMap; use xcm::{ prelude::XcmVersion, - v4::{Assets, Location, SendError, SendResult, SendXcm, Xcm, XcmHash}, + v4::{Assets, InteriorLocation, Location, SendError, SendResult, SendXcm, Xcm, XcmHash}, IntoVersion, VersionedXcm, WrapVersion, }; @@ -391,17 +392,23 @@ impl pallet_message_queue::Config for Test { type IdleMaxServiceWeight = (); } +impl assigner_parachains::Config for Test {} + parameter_types! { pub const OnDemandTrafficDefaultValue: FixedU128 = FixedU128::from_u32(1); + // Production chains should keep this numbar around twice the + // defined Timeslice for Coretime. + pub const MaxHistoricalRevenue: BlockNumber = 2 * 5; + pub const OnDemandPalletId: PalletId = PalletId(*b"py/ondmd"); } -impl assigner_parachains::Config for Test {} - impl assigner_on_demand::Config for Test { type RuntimeEvent = RuntimeEvent; type Currency = Balances; type TrafficDefaultValue = OnDemandTrafficDefaultValue; type WeightInfo = crate::assigner_on_demand::TestWeightInfo; + type MaxHistoricalRevenue = MaxHistoricalRevenue; + type PalletId = OnDemandPalletId; } impl assigner_coretime::Config for Test {} @@ -411,6 +418,13 @@ parameter_types! { pub MaxXcmTransactWeight: Weight = Weight::from_parts(10_000_000, 10_000); } +pub struct BrokerPot; +impl Get for BrokerPot { + fn get() -> InteriorLocation { + unimplemented!() + } +} + impl coretime::Config for Test { type RuntimeOrigin = RuntimeOrigin; type RuntimeEvent = RuntimeEvent; @@ -419,6 +433,9 @@ impl coretime::Config for Test { type WeightInfo = crate::coretime::TestWeightInfo; type SendXcm = DummyXcmSender; type MaxXcmTransactWeight = MaxXcmTransactWeight; + type BrokerPotLocation = BrokerPot; + type AssetTransactor = (); + type AccountToLocation = (); } pub struct DummyXcmSender; diff --git a/polkadot/runtime/rococo/constants/src/lib.rs b/polkadot/runtime/rococo/constants/src/lib.rs index 1dcafdcbc4d..47b50bf6c10 100644 --- a/polkadot/runtime/rococo/constants/src/lib.rs +++ b/polkadot/runtime/rococo/constants/src/lib.rs @@ -121,6 +121,17 @@ pub mod system_parachain { /// All system parachains of Rococo. pub type SystemParachains = IsChildSystemParachain; + + /// Coretime constants + pub mod coretime { + /// Coretime timeslice period in blocks + /// WARNING: This constant is used accross chains, so additional care should be taken + /// when changing it. + #[cfg(feature = "fast-runtime")] + pub const TIMESLICE_PERIOD: u32 = 20; + #[cfg(not(feature = "fast-runtime"))] + pub const TIMESLICE_PERIOD: u32 = 80; + } } /// Rococo Treasury pallet instance. diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index bbec754387e..c91a712cce0 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -60,7 +60,7 @@ use polkadot_runtime_parachains::{ scheduler as parachains_scheduler, session_info as parachains_session_info, shared as parachains_shared, }; -use rococo_runtime_constants::system_parachain::BROKER_ID; +use rococo_runtime_constants::system_parachain::{coretime::TIMESLICE_PERIOD, BROKER_ID}; use scale_info::TypeInfo; use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; use sp_consensus_beefy::{ @@ -92,12 +92,13 @@ use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId}; use pallet_identity::legacy::IdentityInfo; use pallet_session::historical as session_historical; use pallet_transaction_payment::{FeeDetails, FungibleAdapter, RuntimeDispatchInfo}; -use sp_core::{ConstU128, ConstU8, OpaqueMetadata, H256}; +use sp_core::{ConstU128, ConstU8, Get, OpaqueMetadata, H256}; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, traits::{ - BlakeTwo256, Block as BlockT, ConstU32, ConvertInto, Extrinsic as ExtrinsicT, - IdentityLookup, Keccak256, OpaqueKeys, SaturatedConversion, Verify, + AccountIdConversion, BlakeTwo256, Block as BlockT, ConstU32, ConvertInto, + Extrinsic as ExtrinsicT, IdentityLookup, Keccak256, OpaqueKeys, SaturatedConversion, + Verify, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill, Percent, Permill, RuntimeDebug, @@ -1057,21 +1058,39 @@ impl parachains_scheduler::Config for Runtime { parameter_types! { pub const BrokerId: u32 = BROKER_ID; + pub const BrokerPalletId: PalletId = PalletId(*b"py/broke"); pub MaxXcmTransactWeight: Weight = Weight::from_parts(200_000_000, 20_000); } +pub struct BrokerPot; +impl Get for BrokerPot { + fn get() -> InteriorLocation { + Junction::AccountId32 { network: None, id: BrokerPalletId::get().into_account_truncating() } + .into() + } +} + impl coretime::Config for Runtime { type RuntimeOrigin = RuntimeOrigin; type RuntimeEvent = RuntimeEvent; type Currency = Balances; type BrokerId = BrokerId; + type BrokerPotLocation = BrokerPot; type WeightInfo = weights::runtime_parachains_coretime::WeightInfo; type SendXcm = crate::xcm_config::XcmRouter; + type AssetTransactor = crate::xcm_config::LocalAssetTransactor; + type AccountToLocation = xcm_builder::AliasesIntoAccountId32< + xcm_config::ThisNetwork, + ::AccountId, + >; type MaxXcmTransactWeight = MaxXcmTransactWeight; } parameter_types! { pub const OnDemandTrafficDefaultValue: FixedU128 = FixedU128::from_u32(1); + // Keep 2 timeslices worth of revenue information. + pub const MaxHistoricalRevenue: BlockNumber = 2 * TIMESLICE_PERIOD; + pub const OnDemandPalletId: PalletId = PalletId(*b"py/ondmd"); } impl parachains_assigner_on_demand::Config for Runtime { @@ -1079,6 +1098,8 @@ impl parachains_assigner_on_demand::Config for Runtime { type Currency = Balances; type TrafficDefaultValue = OnDemandTrafficDefaultValue; type WeightInfo = weights::runtime_parachains_assigner_on_demand::WeightInfo; + type MaxHistoricalRevenue = MaxHistoricalRevenue; + type PalletId = OnDemandPalletId; } impl parachains_assigner_coretime::Config for Runtime {} @@ -1696,13 +1717,13 @@ mod benches { // the that path resolves correctly in the generated file. [polkadot_runtime_common::assigned_slots, AssignedSlots] [polkadot_runtime_common::auctions, Auctions] - [polkadot_runtime_common::coretime, Coretime] [polkadot_runtime_common::crowdloan, Crowdloan] [polkadot_runtime_common::claims, Claims] [polkadot_runtime_common::identity_migrator, IdentityMigrator] [polkadot_runtime_common::slots, Slots] [polkadot_runtime_common::paras_registrar, Registrar] [polkadot_runtime_parachains::configuration, Configuration] + [polkadot_runtime_parachains::coretime, Coretime] [polkadot_runtime_parachains::hrmp, Hrmp] [polkadot_runtime_parachains::disputes, ParasDisputes] [polkadot_runtime_parachains::inclusion, ParaInclusion] diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_assigner_on_demand.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_assigner_on_demand.rs index 9f275e7b8cd..abcc1893c29 100644 --- a/polkadot/runtime/rococo/src/weights/runtime_parachains_assigner_on_demand.rs +++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_assigner_on_demand.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `runtime_parachains::assigner_on_demand` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-03-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-1pho9goo-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -50,6 +50,10 @@ pub struct WeightInfo(PhantomData); impl polkadot_runtime_parachains::assigner_on_demand::WeightInfo for WeightInfo { /// Storage: `OnDemandAssignmentProvider::QueueStatus` (r:1 w:1) /// Proof: `OnDemandAssignmentProvider::QueueStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `OnDemandAssignmentProvider::Revenue` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::Revenue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `OnDemandAssignmentProvider::ParaIdAffinity` (r:1 w:0) /// Proof: `OnDemandAssignmentProvider::ParaIdAffinity` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `OnDemandAssignmentProvider::FreeEntries` (r:1 w:1) @@ -57,19 +61,23 @@ impl polkadot_runtime_parachains::assigner_on_demand::W /// The range of component `s` is `[1, 9999]`. fn place_order_keep_alive(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `218 + s * (8 ±0)` - // Estimated: `3681 + s * (8 ±0)` - // Minimum execution time: 21_053_000 picoseconds. - Weight::from_parts(17_291_897, 0) - .saturating_add(Weight::from_parts(0, 3681)) - // Standard Error: 104 - .saturating_add(Weight::from_parts(18_779, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `270 + s * (8 ±0)` + // Estimated: `3733 + s * (8 ±0)` + // Minimum execution time: 28_422_000 picoseconds. + Weight::from_parts(28_146_882, 0) + .saturating_add(Weight::from_parts(0, 3733)) + // Standard Error: 140 + .saturating_add(Weight::from_parts(21_283, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 8).saturating_mul(s.into())) } /// Storage: `OnDemandAssignmentProvider::QueueStatus` (r:1 w:1) /// Proof: `OnDemandAssignmentProvider::QueueStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `OnDemandAssignmentProvider::Revenue` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::Revenue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `OnDemandAssignmentProvider::ParaIdAffinity` (r:1 w:0) /// Proof: `OnDemandAssignmentProvider::ParaIdAffinity` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `OnDemandAssignmentProvider::FreeEntries` (r:1 w:1) @@ -77,15 +85,15 @@ impl polkadot_runtime_parachains::assigner_on_demand::W /// The range of component `s` is `[1, 9999]`. fn place_order_allow_death(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `218 + s * (8 ±0)` - // Estimated: `3681 + s * (8 ±0)` - // Minimum execution time: 20_843_000 picoseconds. - Weight::from_parts(16_881_986, 0) - .saturating_add(Weight::from_parts(0, 3681)) - // Standard Error: 104 - .saturating_add(Weight::from_parts(18_788, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `270 + s * (8 ±0)` + // Estimated: `3733 + s * (8 ±0)` + // Minimum execution time: 28_680_000 picoseconds. + Weight::from_parts(31_024_579, 0) + .saturating_add(Weight::from_parts(0, 3733)) + // Standard Error: 119 + .saturating_add(Weight::from_parts(20_989, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 8).saturating_mul(s.into())) } } diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_coretime.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_coretime.rs index 0ad32996c49..b2329c098ce 100644 --- a/polkadot/runtime/rococo/src/weights/runtime_parachains_coretime.rs +++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_coretime.rs @@ -14,12 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! Autogenerated weights for `runtime_parachains::coretime` +//! Autogenerated weights for `runtime_common::coretime` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-01, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-1pho9goo-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -45,28 +45,61 @@ use frame_support::{traits::Get, weights::Weight}; use core::marker::PhantomData; -use polkadot_runtime_parachains::configuration::{self, WeightInfo as ConfigWeightInfo}; - /// Weight functions for `runtime_common::coretime`. pub struct WeightInfo(PhantomData); -impl polkadot_runtime_parachains::coretime::WeightInfo for WeightInfo { +impl polkadot_runtime_parachains::coretime::WeightInfo for WeightInfo { + /// Storage: `OnDemandAssignmentProvider::Revenue` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::Revenue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn request_revenue_at() -> Weight { + // Proof Size summary in bytes: + // Measured: `2963` + // Estimated: `6428` + // Minimum execution time: 36_613_000 picoseconds. + Weight::from_parts(37_637_000, 0) + .saturating_add(Weight::from_parts(0, 6428)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Configuration::PendingConfigs` (r:1 w:1) + /// Proof: `Configuration::PendingConfigs` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Configuration::BypassConsistencyCheck` (r:1 w:0) + /// Proof: `Configuration::BypassConsistencyCheck` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn request_core_count() -> Weight { - ::WeightInfo::set_config_with_u32() + // Proof Size summary in bytes: + // Measured: `151` + // Estimated: `1636` + // Minimum execution time: 7_527_000 picoseconds. + Weight::from_parts(7_784_000, 0) + .saturating_add(Weight::from_parts(0, 1636)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `CoreTimeAssignmentProvider::CoreDescriptors` (r:1 w:1) - /// Proof: `CoreTimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CoreTimeAssignmentProvider::CoreSchedules` (r:0 w:1) - /// Proof: `CoreTimeAssignmentProvider::CoreSchedules` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreSchedules` (r:0 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreSchedules` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `s` is `[1, 100]`. fn assign_core(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `3541` - // Minimum execution time: 6_275_000 picoseconds. - Weight::from_parts(6_883_543, 0) - .saturating_add(Weight::from_parts(0, 3541)) - // Standard Error: 202 - .saturating_add(Weight::from_parts(15_028, 0).saturating_mul(s.into())) + // Measured: `180` + // Estimated: `3645` + // Minimum execution time: 9_220_000 picoseconds. + Weight::from_parts(9_905_773, 0) + .saturating_add(Weight::from_parts(0, 3645)) + // Standard Error: 257 + .saturating_add(Weight::from_parts(12_400, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/polkadot/runtime/westend/constants/Cargo.toml b/polkadot/runtime/westend/constants/Cargo.toml index b40846455bf..f9b99ea5284 100644 --- a/polkadot/runtime/westend/constants/Cargo.toml +++ b/polkadot/runtime/westend/constants/Cargo.toml @@ -34,3 +34,6 @@ std = [ "xcm-builder/std", "xcm/std", ] + +# Set timing constants (e.g. session period) to faster versions to speed up testing. +fast-runtime = [] diff --git a/polkadot/runtime/westend/constants/src/lib.rs b/polkadot/runtime/westend/constants/src/lib.rs index 58048272e79..8d66ac2868d 100644 --- a/polkadot/runtime/westend/constants/src/lib.rs +++ b/polkadot/runtime/westend/constants/src/lib.rs @@ -116,6 +116,17 @@ pub mod system_parachain { /// All system parachains of Westend. pub type SystemParachains = IsChildSystemParachain; + + /// Coretime constants + pub mod coretime { + /// Coretime timeslice period in blocks + /// WARNING: This constant is used accross chains, so additional care should be taken + /// when changing it. + #[cfg(feature = "fast-runtime")] + pub const TIMESLICE_PERIOD: u32 = 20; + #[cfg(not(feature = "fast-runtime"))] + pub const TIMESLICE_PERIOD: u32 = 80; + } } /// Westend Treasury pallet instance. diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 59789ed16cb..5b50a078539 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -88,8 +88,8 @@ use sp_runtime::{ curve::PiecewiseLinear, generic, impl_opaque_keys, traits::{ - BlakeTwo256, Block as BlockT, ConvertInto, Extrinsic as ExtrinsicT, IdentityLookup, - Keccak256, OpaqueKeys, SaturatedConversion, Verify, + AccountIdConversion, BlakeTwo256, Block as BlockT, ConvertInto, Extrinsic as ExtrinsicT, + IdentityLookup, Keccak256, OpaqueKeys, SaturatedConversion, Verify, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill, Percent, Permill, @@ -122,7 +122,12 @@ use sp_runtime::traits::Get; pub use sp_runtime::BuildStorage; /// Constant values used within the runtime. -use westend_runtime_constants::{currency::*, fee::*, system_parachain::BROKER_ID, time::*}; +use westend_runtime_constants::{ + currency::*, + fee::*, + system_parachain::{coretime::TIMESLICE_PERIOD, BROKER_ID}, + time::*, +}; mod bag_thresholds; mod weights; @@ -1185,21 +1190,39 @@ impl parachains_scheduler::Config for Runtime { parameter_types! { pub const BrokerId: u32 = BROKER_ID; + pub const BrokerPalletId: PalletId = PalletId(*b"py/broke"); pub MaxXcmTransactWeight: Weight = Weight::from_parts(200_000_000, 20_000); } +pub struct BrokerPot; +impl Get for BrokerPot { + fn get() -> InteriorLocation { + Junction::AccountId32 { network: None, id: BrokerPalletId::get().into_account_truncating() } + .into() + } +} + impl coretime::Config for Runtime { type RuntimeOrigin = RuntimeOrigin; type RuntimeEvent = RuntimeEvent; type Currency = Balances; type BrokerId = BrokerId; + type BrokerPotLocation = BrokerPot; type WeightInfo = weights::runtime_parachains_coretime::WeightInfo; type SendXcm = crate::xcm_config::XcmRouter; + type AssetTransactor = crate::xcm_config::LocalAssetTransactor; + type AccountToLocation = xcm_builder::AliasesIntoAccountId32< + xcm_config::ThisNetwork, + ::AccountId, + >; type MaxXcmTransactWeight = MaxXcmTransactWeight; } parameter_types! { pub const OnDemandTrafficDefaultValue: FixedU128 = FixedU128::from_u32(1); + // Keep 2 timeslices worth of revenue information. + pub const MaxHistoricalRevenue: BlockNumber = 2 * TIMESLICE_PERIOD; + pub const OnDemandPalletId: PalletId = PalletId(*b"py/ondmd"); } impl parachains_assigner_on_demand::Config for Runtime { @@ -1207,6 +1230,8 @@ impl parachains_assigner_on_demand::Config for Runtime { type Currency = Balances; type TrafficDefaultValue = OnDemandTrafficDefaultValue; type WeightInfo = weights::runtime_parachains_assigner_on_demand::WeightInfo; + type MaxHistoricalRevenue = MaxHistoricalRevenue; + type PalletId = OnDemandPalletId; } impl parachains_assigner_coretime::Config for Runtime {} diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs index 8b046f5d34a..1bd9fa31b81 100644 --- a/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `runtime_parachains::assigner_on_demand` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-03-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-1pho9goo-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -50,6 +50,10 @@ pub struct WeightInfo(PhantomData); impl polkadot_runtime_parachains::assigner_on_demand::WeightInfo for WeightInfo { /// Storage: `OnDemandAssignmentProvider::QueueStatus` (r:1 w:1) /// Proof: `OnDemandAssignmentProvider::QueueStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `OnDemandAssignmentProvider::Revenue` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::Revenue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `OnDemandAssignmentProvider::ParaIdAffinity` (r:1 w:0) /// Proof: `OnDemandAssignmentProvider::ParaIdAffinity` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `OnDemandAssignmentProvider::FreeEntries` (r:1 w:1) @@ -57,19 +61,23 @@ impl polkadot_runtime_parachains::assigner_on_demand::W /// The range of component `s` is `[1, 9999]`. fn place_order_keep_alive(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `218 + s * (8 ±0)` - // Estimated: `3681 + s * (8 ±0)` - // Minimum execution time: 21_396_000 picoseconds. - Weight::from_parts(20_585_695, 0) - .saturating_add(Weight::from_parts(0, 3681)) - // Standard Error: 127 - .saturating_add(Weight::from_parts(20_951, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `270 + s * (8 ±0)` + // Estimated: `3733 + s * (8 ±0)` + // Minimum execution time: 29_427_000 picoseconds. + Weight::from_parts(26_756_913, 0) + .saturating_add(Weight::from_parts(0, 3733)) + // Standard Error: 121 + .saturating_add(Weight::from_parts(20_849, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 8).saturating_mul(s.into())) } /// Storage: `OnDemandAssignmentProvider::QueueStatus` (r:1 w:1) /// Proof: `OnDemandAssignmentProvider::QueueStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `OnDemandAssignmentProvider::Revenue` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::Revenue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `OnDemandAssignmentProvider::ParaIdAffinity` (r:1 w:0) /// Proof: `OnDemandAssignmentProvider::ParaIdAffinity` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `OnDemandAssignmentProvider::FreeEntries` (r:1 w:1) @@ -77,15 +85,15 @@ impl polkadot_runtime_parachains::assigner_on_demand::W /// The range of component `s` is `[1, 9999]`. fn place_order_allow_death(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `218 + s * (8 ±0)` - // Estimated: `3681 + s * (8 ±0)` - // Minimum execution time: 21_412_000 picoseconds. - Weight::from_parts(19_731_554, 0) - .saturating_add(Weight::from_parts(0, 3681)) - // Standard Error: 128 - .saturating_add(Weight::from_parts(21_055, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `270 + s * (8 ±0)` + // Estimated: `3733 + s * (8 ±0)` + // Minimum execution time: 29_329_000 picoseconds. + Weight::from_parts(26_415_340, 0) + .saturating_add(Weight::from_parts(0, 3733)) + // Standard Error: 129 + .saturating_add(Weight::from_parts(20_909, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(Weight::from_parts(0, 8).saturating_mul(s.into())) } } diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs index 443651a6fda..9df382875f5 100644 --- a/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `runtime_parachains::coretime` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-02-15, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-06-01, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-1pho9goo-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -48,6 +48,28 @@ use core::marker::PhantomData; /// Weight functions for `runtime_parachains::coretime`. pub struct WeightInfo(PhantomData); impl polkadot_runtime_parachains::coretime::WeightInfo for WeightInfo { + /// Storage: `OnDemandAssignmentProvider::Revenue` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::Revenue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn request_revenue_at() -> Weight { + // Proof Size summary in bytes: + // Measured: `2930` + // Estimated: `6395` + // Minimum execution time: 34_947_000 picoseconds. + Weight::from_parts(35_550_000, 0) + .saturating_add(Weight::from_parts(0, 6395)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(3)) + } /// Storage: `Configuration::PendingConfigs` (r:1 w:1) /// Proof: `Configuration::PendingConfigs` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `Configuration::BypassConsistencyCheck` (r:1 w:0) @@ -58,8 +80,8 @@ impl polkadot_runtime_parachains::coretime::WeightInfo // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 7_486_000 picoseconds. - Weight::from_parts(7_889_000, 0) + // Minimum execution time: 7_519_000 picoseconds. + Weight::from_parts(7_803_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -73,11 +95,11 @@ impl polkadot_runtime_parachains::coretime::WeightInfo // Proof Size summary in bytes: // Measured: `147` // Estimated: `3612` - // Minimum execution time: 9_409_000 picoseconds. - Weight::from_parts(10_177_115, 0) + // Minimum execution time: 9_697_000 picoseconds. + Weight::from_parts(10_610_219, 0) .saturating_add(Weight::from_parts(0, 3612)) - // Standard Error: 259 - .saturating_add(Weight::from_parts(13_932, 0).saturating_mul(s.into())) + // Standard Error: 732 + .saturating_add(Weight::from_parts(10_364, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/prdoc/pr_3940.prdoc b/prdoc/pr_3940.prdoc new file mode 100644 index 00000000000..590afa77bb1 --- /dev/null +++ b/prdoc/pr_3940.prdoc @@ -0,0 +1,31 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "RFC-5: Add request revenue info" + +doc: + - audience: Runtime Dev + description: | + Partially implemented RFC-5 in terms of revenue requests and notifications + - audience: Runtime User + description: | + Instantaneous Coretime sold on the relay chain now generates revenue for its provider. + The revenue may be claimed by its provider on the Coretime chain. + +crates: + - name: polkadot-runtime-parachains + bump: minor + - name: rococo-runtime + bump: minor + - name: westend-runtime + bump: minor + - name: pallet-broker + bump: minor + - name: rococo-runtime-constants + bump: minor + - name: westend-runtime-constants + bump: minor + - name: coretime-rococo-runtime + bump: minor + - name: coretime-westend-runtime + bump: minor diff --git a/substrate/bin/node/cli/tests/res/default_genesis_config.json b/substrate/bin/node/cli/tests/res/default_genesis_config.json index d8713764ab2..bba2076f400 100644 --- a/substrate/bin/node/cli/tests/res/default_genesis_config.json +++ b/substrate/bin/node/cli/tests/res/default_genesis_config.json @@ -16,6 +16,7 @@ "balances": { "balances": [] }, + "broker": {}, "transactionPayment": { "multiplier": "1000000000000000000" }, diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index a3dc7decd10..839e157ae76 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -2097,10 +2097,6 @@ impl OnUnbalanced> for IntoAuthor { } } -parameter_types! { - pub storage CoretimeRevenue: Option<(BlockNumber, Balance)> = None; -} - pub struct CoretimeProvider; impl CoretimeInterface for CoretimeProvider { type AccountId = AccountId; @@ -2116,15 +2112,6 @@ impl CoretimeInterface for CoretimeProvider { _end_hint: Option, ) { } - fn check_notify_revenue_info() -> Option<(u32, Self::Balance)> { - let revenue = CoretimeRevenue::get(); - CoretimeRevenue::set(&None); - revenue - } - #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_revenue_info(when: u32, revenue: Self::Balance) { - CoretimeRevenue::set(&Some((when, revenue))); - } } impl pallet_broker::Config for Runtime { diff --git a/substrate/frame/broker/src/benchmarking.rs b/substrate/frame/broker/src/benchmarking.rs index 9cb5ad096c8..3c9ea4cdba4 100644 --- a/substrate/frame/broker/src/benchmarking.rs +++ b/substrate/frame/broker/src/benchmarking.rs @@ -99,7 +99,7 @@ fn setup_and_start_sale() -> Result { // Assume Leases to be filled for worst case setup_leases::(T::MaxLeasedCores::get(), 1, 10); - Broker::::do_start_sales(10u32.into(), MAX_CORE_COUNT.into()) + Broker::::do_start_sales(10_000_000u32.into(), MAX_CORE_COUNT.into()) .map_err(|_| BenchmarkError::Weightless)?; Ok(T::MaxReservedCores::get() @@ -201,7 +201,7 @@ mod benches { let latest_region_begin = Broker::::latest_timeslice_ready_to_commit(&config); - let initial_price = 10u32.into(); + let initial_price = 10_000_000u32.into(); let origin = T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; @@ -214,8 +214,8 @@ mod benches { Event::SaleInitialized { sale_start: 2u32.into(), leadin_length: 1u32.into(), - start_price: 1000u32.into(), - end_price: 10u32.into(), + start_price: 1_000_000_000u32.into(), + end_price: 10_000_000u32.into(), region_begin: latest_region_begin + config.region_length, region_end: latest_region_begin + config.region_length * 2, ideal_cores_sold: 0, @@ -240,13 +240,13 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(10u32.into()), + T::Currency::minimum_balance().saturating_add(10_000_000u32.into()), ); #[extrinsic_call] - _(RawOrigin::Signed(caller.clone()), 10u32.into()); + _(RawOrigin::Signed(caller.clone()), 10_000_000u32.into()); - assert_eq!(SaleInfo::::get().unwrap().sellout_price, Some(10u32.into())); + assert_eq!(SaleInfo::::get().unwrap().sellout_price, Some(10_000_000u32.into())); assert_last_event::( Event::Purchased { who: caller, @@ -255,7 +255,7 @@ mod benches { core, mask: CoreMask::complete(), }, - price: 10u32.into(), + price: 10_000_000u32.into(), duration: 3u32.into(), } .into(), @@ -274,10 +274,10 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(20u32.into()), + T::Currency::minimum_balance().saturating_add(20_000_000u32.into()), ); - let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + let region = Broker::::do_purchase(caller.clone(), 10_000_000u32.into()) .map_err(|_| BenchmarkError::Weightless)?; Broker::::do_assign(region, None, 1001, Final) @@ -303,10 +303,10 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(10u32.into()), + T::Currency::minimum_balance().saturating_add(10_000_000u32.into()), ); - let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + let region = Broker::::do_purchase(caller.clone(), 10_000_000u32.into()) .map_err(|_| BenchmarkError::Weightless)?; let recipient: T::AccountId = account("recipient", 0, SEED); @@ -336,10 +336,10 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(10u32.into()), + T::Currency::minimum_balance().saturating_add(10_000_000u32.into()), ); - let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + let region = Broker::::do_purchase(caller.clone(), 10_000_000u32.into()) .map_err(|_| BenchmarkError::Weightless)?; #[extrinsic_call] @@ -368,10 +368,10 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(10u32.into()), + T::Currency::minimum_balance().saturating_add(10_000_000u32.into()), ); - let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + let region = Broker::::do_purchase(caller.clone(), 10_000_000u32.into()) .map_err(|_| BenchmarkError::Weightless)?; #[extrinsic_call] @@ -404,10 +404,10 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(10u32.into()), + T::Currency::minimum_balance().saturating_add(10_000_000u32.into()), ); - let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + let region = Broker::::do_purchase(caller.clone(), 10_000_000u32.into()) .map_err(|_| BenchmarkError::Weightless)?; #[extrinsic_call] @@ -439,10 +439,10 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(10u32.into()), + T::Currency::minimum_balance().saturating_add(10_000_000u32.into()), ); - let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + let region = Broker::::do_purchase(caller.clone(), 10_000_000u32.into()) .map_err(|_| BenchmarkError::Weightless)?; let recipient: T::AccountId = account("recipient", 0, SEED); @@ -475,14 +475,14 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(10u32.into()), + T::Currency::minimum_balance().saturating_add(10_000_000u32.into()), ); T::Currency::set_balance( &Broker::::account_id(), - T::Currency::minimum_balance().saturating_add(200u32.into()), + T::Currency::minimum_balance().saturating_add(200_000_000u32.into()), ); - let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + let region = Broker::::do_purchase(caller.clone(), 10_000_000u32.into()) .map_err(|_| BenchmarkError::Weightless)?; let recipient: T::AccountId = account("recipient", 0, SEED); @@ -491,7 +491,7 @@ mod benches { Broker::::do_pool(region, None, recipient.clone(), Final) .map_err(|_| BenchmarkError::Weightless)?; - let revenue = 10u32.into(); + let revenue = 10_000_000u32.into(); InstaPoolHistory::::insert( region.begin, InstaPoolHistoryRecord { @@ -508,7 +508,7 @@ mod benches { assert_last_event::( Event::RevenueClaimPaid { who: recipient, - amount: 200u32.into(), + amount: 200_000_000u32.into(), next: if m < new_config_record::().region_length { Some(RegionId { begin: region.begin.saturating_add(m), @@ -534,11 +534,11 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(30u32.into()), + T::Currency::minimum_balance().saturating_add(30_000_000u32.into()), ); T::Currency::set_balance(&Broker::::account_id(), T::Currency::minimum_balance()); - let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + let region = Broker::::do_purchase(caller.clone(), 10_000_000u32.into()) .map_err(|_| BenchmarkError::Weightless)?; let recipient: T::AccountId = account("recipient", 0, SEED); @@ -549,10 +549,11 @@ mod benches { let beneficiary: RelayAccountIdOf = account("beneficiary", 0, SEED); #[extrinsic_call] - _(RawOrigin::Signed(caller.clone()), 20u32.into(), beneficiary.clone()); + _(RawOrigin::Signed(caller.clone()), 20_000_000u32.into(), beneficiary.clone()); assert_last_event::( - Event::CreditPurchased { who: caller, beneficiary, amount: 20u32.into() }.into(), + Event::CreditPurchased { who: caller, beneficiary, amount: 20_000_000u32.into() } + .into(), ); Ok(()) @@ -568,10 +569,10 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(10u32.into()), + T::Currency::minimum_balance().saturating_add(10_000_000u32.into()), ); - let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + let region = Broker::::do_purchase(caller.clone(), 10_000_000u32.into()) .map_err(|_| BenchmarkError::Weightless)?; advance_to::( @@ -602,10 +603,10 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(10u32.into()), + T::Currency::minimum_balance().saturating_add(10_000_000u32.into()), ); - let region = Broker::::do_purchase(caller.clone(), 10u32.into()) + let region = Broker::::do_purchase(caller.clone(), 10_000_000u32.into()) .map_err(|_| BenchmarkError::Weightless)?; let recipient: T::AccountId = account("recipient", 0, SEED); @@ -634,7 +635,7 @@ mod benches { fn drop_history() -> Result<(), BenchmarkError> { setup_and_start_sale::()?; let when = 5u32.into(); - let revenue = 10u32.into(); + let revenue = 10_000_000u32.into(); let region_len = Configuration::::get().unwrap().region_length; advance_to::( @@ -672,7 +673,7 @@ mod benches { let id = PotentialRenewalId { core, when }; let record = PotentialRenewalRecord { - price: 1u32.into(), + price: 1_000_000u32.into(), completion: CompletionStatus::Complete(new_schedule()), }; PotentialRenewals::::insert(id, record); @@ -732,23 +733,27 @@ mod benches { let caller: T::AccountId = whitelisted_caller(); T::Currency::set_balance( &caller.clone(), - T::Currency::minimum_balance().saturating_add(30u32.into()), + T::Currency::minimum_balance().saturating_add(30_000_000u32.into()), + ); + T::Currency::set_balance( + &Broker::::account_id(), + T::Currency::minimum_balance().saturating_add(90_000_000u32.into()), ); - T::Currency::set_balance(&Broker::::account_id(), T::Currency::minimum_balance()); let timeslice_period: u32 = T::TimeslicePeriod::get().try_into().ok().unwrap(); let multiplicator = 5; - ::ensure_notify_revenue_info( - (timeslice_period * multiplicator).into(), - 10u32.into(), - ); + + RevenueInbox::::put(OnDemandRevenueRecord { + until: (timeslice_period * multiplicator).into(), + amount: 10_000_000u32.into(), + }); let timeslice = multiplicator - 1; InstaPoolHistory::::insert( timeslice, InstaPoolHistoryRecord { - private_contributions: 1u32.into(), - system_contributions: 9u32.into(), + private_contributions: 4u32.into(), + system_contributions: 6u32.into(), maybe_payout: None, }, ); @@ -761,8 +766,8 @@ mod benches { assert_last_event::( Event::ClaimsReady { when: timeslice.into(), - system_payout: 9u32.into(), - private_payout: 1u32.into(), + system_payout: 6_000_000u32.into(), + private_payout: 4_000_000u32.into(), } .into(), ); @@ -776,7 +781,7 @@ mod benches { let config = new_config_record::(); let now = frame_system::Pallet::::block_number(); - let end_price = 10u32.into(); + let end_price = 10_000_000u32.into(); let commit_timeslice = Broker::::latest_timeslice_ready_to_commit(&config); let sale = SaleInfoRecordOf:: { sale_start: now, @@ -815,8 +820,8 @@ mod benches { Event::SaleInitialized { sale_start: 2u32.into(), leadin_length: 1u32.into(), - start_price: 1000u32.into(), - end_price: 10u32.into(), + start_price: 1_000_000_000u32.into(), + end_price: 10_000_000u32.into(), region_begin: sale.region_begin + config.region_length, region_end: sale.region_end + config.region_length, ideal_cores_sold: 0, @@ -889,6 +894,7 @@ mod benches { T::Coretime::request_revenue_info_at(rc_block); } } + #[benchmark] fn notify_core_count() -> Result<(), BenchmarkError> { let admin_origin = @@ -901,6 +907,21 @@ mod benches { Ok(()) } + #[benchmark] + fn notify_revenue() -> Result<(), BenchmarkError> { + let admin_origin = + T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + + #[extrinsic_call] + _( + admin_origin as T::RuntimeOrigin, + OnDemandRevenueRecord { until: 100u32.into(), amount: 100_000_000u32.into() }, + ); + + assert!(RevenueInbox::::take().is_some()); + Ok(()) + } + #[benchmark] fn do_tick_base() -> Result<(), BenchmarkError> { setup_and_start_sale::()?; @@ -939,6 +960,31 @@ mod benches { Ok(()) } + #[benchmark] + fn on_new_timeslice() -> Result<(), BenchmarkError> { + setup_and_start_sale::()?; + + advance_to::(2); + + let caller: T::AccountId = whitelisted_caller(); + T::Currency::set_balance( + &caller.clone(), + T::Currency::minimum_balance().saturating_add(u32::MAX.into()), + ); + + let _region = Broker::::do_purchase(caller.clone(), (u32::MAX / 2).into()) + .map_err(|_| BenchmarkError::Weightless)?; + + let timeslice = Broker::::current_timeslice(); + + #[block] + { + T::Coretime::on_new_timeslice(timeslice); + } + + Ok(()) + } + // Implements a test for each benchmark. Execute with: // `cargo test -p pallet-broker --features runtime-benchmarks`. impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test); diff --git a/substrate/frame/broker/src/coretime_interface.rs b/substrate/frame/broker/src/coretime_interface.rs index 58efa7fa92b..f92f8b22091 100644 --- a/substrate/frame/broker/src/coretime_interface.rs +++ b/substrate/frame/broker/src/coretime_interface.rs @@ -23,7 +23,9 @@ use scale_info::TypeInfo; use sp_arithmetic::traits::AtLeast32BitUnsigned; use sp_core::RuntimeDebug; use sp_runtime::traits::BlockNumberProvider; -use sp_std::vec::Vec; +use sp_std::{fmt::Debug, vec::Vec}; + +use crate::Timeslice; /// Index of a Polkadot Core. pub type CoreIndex = u16; @@ -62,7 +64,7 @@ pub trait CoretimeInterface { type AccountId: Parameter; /// A (Relay-chain-side) balance. - type Balance: AtLeast32BitUnsigned; + type Balance: AtLeast32BitUnsigned + Encode + Decode + MaxEncodedLen + TypeInfo + Debug; /// A provider for the relay chain block number. type RelayChainBlockNumberProvider: BlockNumberProvider; @@ -107,22 +109,10 @@ pub trait CoretimeInterface { end_hint: Option>, ); - /// Provide the amount of revenue accumulated from Instantaneous Coretime Sales from Relay-chain - /// block number `last_until` to `until`, not including `until` itself. `last_until` is defined - /// as being the `until` argument of the last `notify_revenue` message sent, or zero for the - /// first call. If `revenue` is `None`, this indicates that the information is no longer - /// available. - /// - /// This explicitly disregards the possibility of multiple parachains requesting and being - /// notified of revenue information. The Relay-chain must be configured to ensure that only a - /// single revenue information destination exists. - fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)>; - - /// Ensure that revenue information is updated to the provided value. - /// - /// This is only used for benchmarking. - #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_revenue_info(when: RCBlockNumberOf, revenue: Self::Balance); + /// A hook supposed to be called right after a new timeslice has begun. Likely to be used for + /// batching different matters happened during the timeslice that may benifit from batched + /// processing. + fn on_new_timeslice(_timeslice: Timeslice) {} } impl CoretimeInterface for () { @@ -140,9 +130,4 @@ impl CoretimeInterface for () { _end_hint: Option>, ) { } - fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { - None - } - #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_revenue_info(_when: RCBlockNumberOf, _revenue: Self::Balance) {} } diff --git a/substrate/frame/broker/src/dispatchable_impls.rs b/substrate/frame/broker/src/dispatchable_impls.rs index 79c1a1f7979..9e7a56e5281 100644 --- a/substrate/frame/broker/src/dispatchable_impls.rs +++ b/substrate/frame/broker/src/dispatchable_impls.rs @@ -16,6 +16,7 @@ // limitations under the License. use super::*; +use coretime_interface::CoretimeInterface; use frame_support::{ pallet_prelude::{DispatchResult, *}, traits::{fungible::Mutate, tokens::Preservation::Expendable, DefensiveResult}, @@ -458,6 +459,11 @@ impl Pallet { Ok(()) } + pub(crate) fn do_notify_revenue(revenue: OnDemandRevenueRecordOf) -> DispatchResult { + RevenueInbox::::put(revenue); + Ok(()) + } + pub(crate) fn do_swap_leases(id: TaskId, other: TaskId) -> DispatchResult { let mut id_leases_count = 0; let mut other_leases_count = 0; @@ -472,7 +478,6 @@ impl Pallet { } }) }); - Ok(()) } diff --git a/substrate/frame/broker/src/lib.rs b/substrate/frame/broker/src/lib.rs index 0774c02e1cf..4cb380bae91 100644 --- a/substrate/frame/broker/src/lib.rs +++ b/substrate/frame/broker/src/lib.rs @@ -57,7 +57,7 @@ pub mod pallet { pallet_prelude::{DispatchResult, DispatchResultWithPostInfo, *}, traits::{ fungible::{Balanced, Credit, Mutate}, - EnsureOrigin, OnUnbalanced, + BuildGenesisConfig, EnsureOrigin, OnUnbalanced, }, PalletId, }; @@ -65,7 +65,7 @@ pub mod pallet { use sp_runtime::traits::{Convert, ConvertBack}; use sp_std::vec::Vec; - const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); #[pallet::pallet] #[pallet::storage_version(STORAGE_VERSION)] @@ -174,6 +174,10 @@ pub mod pallet { #[pallet::storage] pub type CoreCountInbox = StorageValue<_, CoreIndex, OptionQuery>; + /// Received revenue info from the relay chain. + #[pallet::storage] + pub type RevenueInbox = StorageValue<_, OnDemandRevenueRecordOf, OptionQuery>; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { @@ -488,6 +492,20 @@ pub mod pallet { NoClaimTimeslices, } + #[derive(frame_support::DefaultNoBound)] + #[pallet::genesis_config] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } + + #[pallet::genesis_build] + impl BuildGenesisConfig for GenesisConfig { + fn build(&self) { + frame_system::Pallet::::inc_providers(&Pallet::::account_id()); + } + } + #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(_now: BlockNumberFor) -> Weight { @@ -804,6 +822,17 @@ pub mod pallet { Ok(()) } + #[pallet::call_index(20)] + #[pallet::weight(T::WeightInfo::notify_revenue())] + pub fn notify_revenue( + origin: OriginFor, + revenue: OnDemandRevenueRecordOf, + ) -> DispatchResult { + T::AdminOrigin::ensure_origin_or_root(origin)?; + Self::do_notify_revenue(revenue)?; + Ok(()) + } + #[pallet::call_index(99)] #[pallet::weight(T::WeightInfo::swap_leases())] pub fn swap_leases(origin: OriginFor, id: TaskId, other: TaskId) -> DispatchResult { diff --git a/substrate/frame/broker/src/migration.rs b/substrate/frame/broker/src/migration.rs index f354e447fe8..917f44a134c 100644 --- a/substrate/frame/broker/src/migration.rs +++ b/substrate/frame/broker/src/migration.rs @@ -128,6 +128,36 @@ mod v2 { } } +mod v3 { + use super::*; + use frame_system::Pallet as System; + + pub struct MigrateToV3Impl(PhantomData); + + impl UncheckedOnRuntimeUpgrade for MigrateToV3Impl { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + let acc = Pallet::::account_id(); + System::::inc_providers(&acc); + // calculate and return migration weights + T::DbWeight::get().writes(1) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + Ok(System::::providers(&Pallet::::account_id()).encode()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { + let old_providers = u32::decode(&mut &state[..]).expect("Known good"); + let new_providers = System::::providers(&Pallet::::account_id()) as u32; + + ensure!(new_providers == old_providers + 1, "Providers count should increase by one"); + Ok(()) + } + } +} + /// Migrate the pallet storage from `0` to `1`. pub type MigrateV0ToV1 = frame_support::migrations::VersionedMigration< 0, @@ -144,3 +174,11 @@ pub type MigrateV1ToV2 = frame_support::migrations::VersionedMigration< Pallet, ::DbWeight, >; + +pub type MigrateV2ToV3 = frame_support::migrations::VersionedMigration< + 2, + 3, + v3::MigrateToV3Impl, + Pallet, + ::DbWeight, +>; diff --git a/substrate/frame/broker/src/mock.rs b/substrate/frame/broker/src/mock.rs index 6fff6aa1008..f29651abff7 100644 --- a/substrate/frame/broker/src/mock.rs +++ b/substrate/frame/broker/src/mock.rs @@ -70,7 +70,6 @@ parameter_types! { pub static CoretimeWorkplan: BTreeMap<(u32, CoreIndex), Vec<(CoreAssignment, PartsOf57600)>> = Default::default(); pub static CoretimeUsage: BTreeMap> = Default::default(); pub static CoretimeInPool: CoreMaskBitCount = 0; - pub static NotifyRevenueInfo: Vec<(u32, u64)> = Default::default(); } pub struct TestCoretimeProvider; @@ -90,11 +89,10 @@ impl CoretimeInterface for TestCoretimeProvider { ); } - let when = when as u32; let mut total = 0; CoretimeSpending::mutate(|s| { s.retain(|(n, a)| { - if *n < when { + if *n < when as u32 { total += a; false } else { @@ -102,7 +100,8 @@ impl CoretimeInterface for TestCoretimeProvider { } }) }); - NotifyRevenueInfo::mutate(|s| s.insert(0, (when, total))); + mint_to_pot(total); + RevenueInbox::::put(OnDemandRevenueRecord { until: when, amount: total }); } fn credit_account(who: Self::AccountId, amount: Self::Balance) { CoretimeCredit::mutate(|c| c.entry(who).or_default().saturating_accrue(amount)); @@ -125,19 +124,13 @@ impl CoretimeInterface for TestCoretimeProvider { ); CoretimeTrace::mutate(|v| v.push(item)); } - fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { - NotifyRevenueInfo::mutate(|s| s.pop()).map(|v| (v.0 as _, v.1)) - } - #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_revenue_info(when: RCBlockNumberOf, revenue: Self::Balance) { - NotifyRevenueInfo::mutate(|s| s.push((when as u32, revenue))); - } } + impl TestCoretimeProvider { - pub fn spend_instantaneous(who: u64, price: u64) -> Result<(), ()> { - let mut c = CoretimeCredit::get(); + pub fn spend_instantaneous(_who: u64, price: u64) -> Result<(), ()> { + let c = CoretimeCredit::get(); ensure!(CoretimeInPool::get() > 0, ()); - c.insert(who, c.get(&who).ok_or(())?.checked_sub(price).ok_or(())?); + // c.insert(who, c.get(&who).ok_or(())?.checked_sub(price).ok_or(())?); CoretimeCredit::set(c); CoretimeSpending::mutate(|v| { v.push((RCBlockNumberProviderOf::::current_block_number() as u32, price)) @@ -223,6 +216,11 @@ pub fn pot() -> u64 { balance(Broker::account_id()) } +pub fn mint_to_pot(amount: u64) { + let imb = ::Currency::issue(amount); + let _ = ::Currency::resolve(&Broker::account_id(), imb); +} + pub fn revenue() -> u64 { balance(0) } diff --git a/substrate/frame/broker/src/tests.rs b/substrate/frame/broker/src/tests.rs index e953afd6dc3..2a8ea24b447 100644 --- a/substrate/frame/broker/src/tests.rs +++ b/substrate/frame/broker/src/tests.rs @@ -451,6 +451,8 @@ fn renewals_affect_price() { #[test] fn instapool_payouts_work() { + // Commented out code is from the reference test implementation and should be uncommented as + // soon as we have the credit system implemented TestExt::new().endow(1, 1000).execute_with(|| { let item = ScheduleItem { assignment: Pool, mask: CoreMask::complete() }; assert_ok!(Broker::do_reserve(Schedule::truncate_from(vec![item]))); @@ -458,11 +460,13 @@ fn instapool_payouts_work() { advance_to(2); let region = Broker::do_purchase(1, u64::max_value()).unwrap(); assert_ok!(Broker::do_pool(region, None, 2, Final)); - assert_ok!(Broker::do_purchase_credit(1, 20, 1)); + // assert_ok!(Broker::do_purchase_credit(1, 20, 1)); advance_to(8); assert_ok!(TestCoretimeProvider::spend_instantaneous(1, 10)); advance_to(11); - assert_eq!(pot(), 14); + // Should get revenue amount 10 from RC, from which 6 is system payout (goes to account0 + // instantly) and the rest is private (kept in the pot until claimed) + assert_eq!(pot(), 4); assert_eq!(revenue(), 106); // Cannot claim for 0 timeslices. @@ -470,13 +474,15 @@ fn instapool_payouts_work() { // Revenue can be claimed. assert_ok!(Broker::do_claim_revenue(region, 100)); - assert_eq!(pot(), 10); + assert_eq!(pot(), 0); assert_eq!(balance(2), 4); }); } #[test] fn instapool_partial_core_payouts_work() { + // Commented out code is from the reference test implementation and should be uncommented as + // soon as we have the credit system implemented TestExt::new().endow(1, 1000).execute_with(|| { let item = ScheduleItem { assignment: Pool, mask: CoreMask::complete() }; assert_ok!(Broker::do_reserve(Schedule::truncate_from(vec![item]))); @@ -487,7 +493,7 @@ fn instapool_partial_core_payouts_work() { Broker::do_interlace(region, None, CoreMask::from_chunk(0, 20)).unwrap(); assert_ok!(Broker::do_pool(region1, None, 2, Final)); assert_ok!(Broker::do_pool(region2, None, 3, Final)); - assert_ok!(Broker::do_purchase_credit(1, 40, 1)); + // assert_ok!(Broker::do_purchase_credit(1, 40, 1)); advance_to(8); assert_ok!(TestCoretimeProvider::spend_instantaneous(1, 40)); advance_to(11); @@ -502,6 +508,8 @@ fn instapool_partial_core_payouts_work() { #[test] fn instapool_core_payouts_work_with_partitioned_region() { + // Commented out code is from the reference test implementation and should be uncommented as + // soon as we have the credit system implemented TestExt::new().endow(1, 1000).execute_with(|| { assert_ok!(Broker::do_start_sales(100, 1)); advance_to(2); @@ -514,14 +522,14 @@ fn instapool_core_payouts_work_with_partitioned_region() { // coretime will be purchased from `region2`. assert_ok!(Broker::do_pool(region1, None, 2, Final)); assert_ok!(Broker::do_pool(region2, None, 3, Final)); - assert_ok!(Broker::do_purchase_credit(1, 20, 1)); + // assert_ok!(Broker::do_purchase_credit(1, 20, 1)); advance_to(8); assert_ok!(TestCoretimeProvider::spend_instantaneous(1, 10)); advance_to(11); - assert_eq!(pot(), 20); + assert_eq!(pot(), 10); assert_eq!(revenue(), 100); assert_ok!(Broker::do_claim_revenue(region1, 100)); - assert_eq!(pot(), 10); + assert_eq!(pot(), 0); assert_eq!(balance(2), 10); advance_to(12); assert_ok!(TestCoretimeProvider::spend_instantaneous(1, 10)); diff --git a/substrate/frame/broker/src/tick_impls.rs b/substrate/frame/broker/src/tick_impls.rs index 20637cf7b90..3292faa4eb7 100644 --- a/substrate/frame/broker/src/tick_impls.rs +++ b/substrate/frame/broker/src/tick_impls.rs @@ -16,7 +16,7 @@ // limitations under the License. use super::*; -use frame_support::{pallet_prelude::*, weights::WeightMeter}; +use frame_support::{pallet_prelude::*, traits::defensive_prelude::*, weights::WeightMeter}; use sp_arithmetic::traits::{One, SaturatedConversion, Saturating, Zero}; use sp_runtime::traits::ConvertBack; use sp_std::{vec, vec::Vec}; @@ -76,6 +76,8 @@ impl Pallet { let rc_block = T::TimeslicePeriod::get() * status.last_timeslice.into(); T::Coretime::request_revenue_info_at(rc_block); meter.consume(T::WeightInfo::request_revenue_info_at()); + T::Coretime::on_new_timeslice(status.last_timeslice); + meter.consume(T::WeightInfo::on_new_timeslice()); } Status::::put(&status); @@ -93,15 +95,23 @@ impl Pallet { } pub(crate) fn process_revenue() -> bool { - let Some((until, amount)) = T::Coretime::check_notify_revenue_info() else { return false }; + let Some(OnDemandRevenueRecord { until, amount }) = RevenueInbox::::take() else { + return false + }; let when: Timeslice = (until / T::TimeslicePeriod::get()).saturating_sub(One::one()).saturated_into(); - let mut revenue = T::ConvertBalance::convert_back(amount); + let mut revenue = T::ConvertBalance::convert_back(amount.clone()); if revenue.is_zero() { Self::deposit_event(Event::::HistoryDropped { when, revenue }); InstaPoolHistory::::remove(when); return true } + + log::debug!( + target: "pallet_broker::process_revenue", + "Received {amount:?} from RC, converted into {revenue:?} revenue", + ); + let mut r = InstaPoolHistory::::get(when).unwrap_or_default(); if r.maybe_payout.is_some() { Self::deposit_event(Event::::HistoryIgnored { when, revenue }); @@ -112,7 +122,7 @@ impl Pallet { let system_payout = if !total_contrib.is_zero() { let system_payout = revenue.saturating_mul(r.system_contributions.into()) / total_contrib.into(); - let _ = Self::charge(&Self::account_id(), system_payout); + Self::charge(&Self::account_id(), system_payout).defensive_ok(); revenue.saturating_reduce(system_payout); system_payout @@ -120,6 +130,11 @@ impl Pallet { Zero::zero() }; + log::debug!( + target: "pallet_broker::process_revenue", + "Charged {system_payout:?} for system payouts, {revenue:?} remaining for private contributions", + ); + if !revenue.is_zero() && r.private_contributions > 0 { r.maybe_payout = Some(revenue); InstaPoolHistory::::insert(when, &r); diff --git a/substrate/frame/broker/src/types.rs b/substrate/frame/broker/src/types.rs index 885cac9a5c2..dcfa9a77e4f 100644 --- a/substrate/frame/broker/src/types.rs +++ b/substrate/frame/broker/src/types.rs @@ -255,6 +255,21 @@ pub struct LeaseRecordItem { pub type LeasesRecord = BoundedVec; pub type LeasesRecordOf = LeasesRecord<::MaxLeasedCores>; +/// Record for On demand core sales. +/// +/// The blocknumber is the relay chain block height `until` which the original request +/// for revenue was made. +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub struct OnDemandRevenueRecord { + /// The height of the Relay-chain at the time the revenue request was made. + pub until: RelayBlockNumber, + /// The accumulated balance of on demand sales made on the relay chain. + pub amount: RelayBalance, +} + +pub type OnDemandRevenueRecordOf = + OnDemandRevenueRecord, RelayBalanceOf>; + /// Configuration of this pallet. #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub struct ConfigRecord { diff --git a/substrate/frame/broker/src/weights.rs b/substrate/frame/broker/src/weights.rs index d9d9d348e47..4889c2577dd 100644 --- a/substrate/frame/broker/src/weights.rs +++ b/substrate/frame/broker/src/weights.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for `pallet_broker` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-05-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-06-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vicqj8em-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-x5tnzzy-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -75,8 +75,10 @@ pub trait WeightInfo { fn process_core_schedule() -> Weight; fn request_revenue_info_at() -> Weight; fn notify_core_count() -> Weight; + fn notify_revenue() -> Weight; fn do_tick_base() -> Weight; fn swap_leases() -> Weight; + fn on_new_timeslice() -> Weight; } /// Weights for `pallet_broker` using the Substrate node and recommended hardware. @@ -88,8 +90,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_945_000 picoseconds. - Weight::from_parts(2_142_000, 0) + // Minimum execution time: 1_977_000 picoseconds. + Weight::from_parts(2_114_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Broker::Reservations` (r:1 w:1) @@ -98,8 +100,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `5016` // Estimated: `7496` - // Minimum execution time: 16_274_000 picoseconds. - Weight::from_parts(16_828_000, 7496) + // Minimum execution time: 16_880_000 picoseconds. + Weight::from_parts(17_506_000, 7496) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -109,8 +111,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6218` // Estimated: `7496` - // Minimum execution time: 15_080_000 picoseconds. - Weight::from_parts(15_874_000, 7496) + // Minimum execution time: 15_569_000 picoseconds. + Weight::from_parts(16_123_000, 7496) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -120,8 +122,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `239` // Estimated: `1526` - // Minimum execution time: 8_761_000 picoseconds. - Weight::from_parts(9_203_000, 1526) + // Minimum execution time: 8_962_000 picoseconds. + Weight::from_parts(9_389_000, 1526) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -144,10 +146,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6330` // Estimated: `8499` - // Minimum execution time: 26_057_000 picoseconds. - Weight::from_parts(46_673_357, 8499) - // Standard Error: 456 - .saturating_add(Weight::from_parts(2_677, 0).saturating_mul(n.into())) + // Minimum execution time: 27_119_000 picoseconds. + Weight::from_parts(47_930_900, 8499) + // Standard Error: 464 + .saturating_add(Weight::from_parts(2_940, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(15_u64)) } @@ -165,8 +167,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `651` // Estimated: `2136` - // Minimum execution time: 40_907_000 picoseconds. - Weight::from_parts(42_566_000, 2136) + // Minimum execution time: 42_429_000 picoseconds. + Weight::from_parts(43_538_000, 2136) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -188,8 +190,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `769` // Estimated: `4698` - // Minimum execution time: 65_209_000 picoseconds. - Weight::from_parts(68_604_000, 4698) + // Minimum execution time: 62_957_000 picoseconds. + Weight::from_parts(66_821_000, 4698) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -199,8 +201,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 15_860_000 picoseconds. - Weight::from_parts(16_393_000, 3551) + // Minimum execution time: 16_146_000 picoseconds. + Weight::from_parts(16_775_000, 3551) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -210,8 +212,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 17_651_000 picoseconds. - Weight::from_parts(18_088_000, 3551) + // Minimum execution time: 17_720_000 picoseconds. + Weight::from_parts(18_916_000, 3551) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -221,8 +223,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 18_576_000 picoseconds. - Weight::from_parts(19_810_000, 3551) + // Minimum execution time: 19_088_000 picoseconds. + Weight::from_parts(19_732_000, 3551) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -238,8 +240,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `741` // Estimated: `4681` - // Minimum execution time: 31_015_000 picoseconds. - Weight::from_parts(31_932_000, 4681) + // Minimum execution time: 30_522_000 picoseconds. + Weight::from_parts(31_573_000, 4681) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -257,8 +259,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `776` // Estimated: `5996` - // Minimum execution time: 36_473_000 picoseconds. - Weight::from_parts(37_382_000, 5996) + // Minimum execution time: 35_833_000 picoseconds. + Weight::from_parts(36_830_000, 5996) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -273,10 +275,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `859` // Estimated: `6196 + m * (2520 ±0)` - // Minimum execution time: 64_957_000 picoseconds. - Weight::from_parts(66_024_232, 6196) - // Standard Error: 50_170 - .saturating_add(Weight::from_parts(1_290_632, 0).saturating_mul(m.into())) + // Minimum execution time: 65_882_000 picoseconds. + Weight::from_parts(67_506_904, 6196) + // Standard Error: 49_386 + .saturating_add(Weight::from_parts(1_197_959, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes(5_u64)) @@ -288,8 +290,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 39_939_000 picoseconds. - Weight::from_parts(40_788_000, 3593) + // Minimum execution time: 41_860_000 picoseconds. + Weight::from_parts(42_478_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -301,8 +303,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `604` // Estimated: `3551` - // Minimum execution time: 31_709_000 picoseconds. - Weight::from_parts(37_559_000, 3551) + // Minimum execution time: 32_593_000 picoseconds. + Weight::from_parts(35_399_000, 3551) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -316,8 +318,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `601` // Estimated: `3533` - // Minimum execution time: 42_895_000 picoseconds. - Weight::from_parts(53_945_000, 3533) + // Minimum execution time: 41_934_000 picoseconds. + Weight::from_parts(50_480_000, 3533) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -333,8 +335,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `995` // Estimated: `3593` - // Minimum execution time: 50_770_000 picoseconds. - Weight::from_parts(63_117_000, 3593) + // Minimum execution time: 47_167_000 picoseconds. + Weight::from_parts(54_289_000, 3593) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -346,18 +348,20 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `661` // Estimated: `4698` - // Minimum execution time: 33_396_000 picoseconds. - Weight::from_parts(36_247_000, 4698) + // Minimum execution time: 29_755_000 picoseconds. + Weight::from_parts(32_857_000, 4698) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// The range of component `n` is `[0, 1000]`. - fn request_core_count(_n: u32, ) -> Weight { + fn request_core_count(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_625_000 picoseconds. - Weight::from_parts(4_011_396, 0) + // Minimum execution time: 3_793_000 picoseconds. + Weight::from_parts(4_086_907, 0) + // Standard Error: 14 + .saturating_add(Weight::from_parts(60, 0).saturating_mul(n.into())) } /// Storage: `Broker::CoreCountInbox` (r:1 w:1) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) @@ -366,13 +370,13 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `404` // Estimated: `1487` - // Minimum execution time: 6_217_000 picoseconds. - Weight::from_parts(6_608_394, 1487) + // Minimum execution time: 6_262_000 picoseconds. + Weight::from_parts(6_734_896, 1487) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) - /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `Broker::RevenueInbox` (r:1 w:1) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) /// Storage: `Broker::InstaPoolHistory` (r:1 w:1) /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:1 w:1) @@ -383,10 +387,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn process_revenue() -> Weight { // Proof Size summary in bytes: - // Measured: `972` - // Estimated: `4437` - // Minimum execution time: 46_853_000 picoseconds. - Weight::from_parts(47_740_000, 4437) + // Measured: `829` + // Estimated: `3593` + // Minimum execution time: 39_812_000 picoseconds. + Weight::from_parts(41_227_000, 3593) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -405,8 +409,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6281` // Estimated: `8499` - // Minimum execution time: 34_240_000 picoseconds. - Weight::from_parts(35_910_175, 8499) + // Minimum execution time: 34_576_000 picoseconds. + Weight::from_parts(36_303_629, 8499) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(15_u64)) } @@ -418,8 +422,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `180` // Estimated: `3493` - // Minimum execution time: 7_083_000 picoseconds. - Weight::from_parts(7_336_000, 3493) + // Minimum execution time: 6_978_000 picoseconds. + Weight::from_parts(7_206_000, 3493) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -431,8 +435,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1423` // Estimated: `4681` - // Minimum execution time: 15_029_000 picoseconds. - Weight::from_parts(15_567_000, 4681) + // Minimum execution time: 15_063_000 picoseconds. + Weight::from_parts(15_463_000, 4681) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -440,8 +444,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 123_000 picoseconds. - Weight::from_parts(136_000, 0) + // Minimum execution time: 126_000 picoseconds. + Weight::from_parts(157_000, 0) } /// Storage: `Broker::CoreCountInbox` (r:0 w:1) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) @@ -449,8 +453,18 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_775_000 picoseconds. - Weight::from_parts(1_911_000, 0) + // Minimum execution time: 1_803_000 picoseconds. + Weight::from_parts(1_965_000, 0) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `Broker::RevenueInbox` (r:0 w:1) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) + fn notify_revenue() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_902_000 picoseconds. + Weight::from_parts(2_116_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Broker::Status` (r:1 w:1) @@ -459,16 +473,16 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) /// Storage: `Broker::CoreCountInbox` (r:1 w:0) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) - /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `Broker::RevenueInbox` (r:1 w:0) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) fn do_tick_base() -> Weight { // Proof Size summary in bytes: - // Measured: `603` - // Estimated: `4068` - // Minimum execution time: 11_859_000 picoseconds. - Weight::from_parts(12_214_000, 4068) + // Measured: `441` + // Estimated: `1516` + // Minimum execution time: 9_313_000 picoseconds. + Weight::from_parts(9_699_000, 1516) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Broker::Leases` (r:1 w:1) /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) @@ -476,11 +490,18 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `239` // Estimated: `1526` - // Minimum execution time: 5_864_000 picoseconds. - Weight::from_parts(6_231_000, 1526) + // Minimum execution time: 5_984_000 picoseconds. + Weight::from_parts(6_296_000, 1526) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } + fn on_new_timeslice() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 229_000 picoseconds. + Weight::from_parts(268_000, 0) + } } // For backwards compatibility and tests. @@ -491,8 +512,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_945_000 picoseconds. - Weight::from_parts(2_142_000, 0) + // Minimum execution time: 1_977_000 picoseconds. + Weight::from_parts(2_114_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Broker::Reservations` (r:1 w:1) @@ -501,8 +522,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `5016` // Estimated: `7496` - // Minimum execution time: 16_274_000 picoseconds. - Weight::from_parts(16_828_000, 7496) + // Minimum execution time: 16_880_000 picoseconds. + Weight::from_parts(17_506_000, 7496) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -512,8 +533,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6218` // Estimated: `7496` - // Minimum execution time: 15_080_000 picoseconds. - Weight::from_parts(15_874_000, 7496) + // Minimum execution time: 15_569_000 picoseconds. + Weight::from_parts(16_123_000, 7496) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -523,8 +544,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `239` // Estimated: `1526` - // Minimum execution time: 8_761_000 picoseconds. - Weight::from_parts(9_203_000, 1526) + // Minimum execution time: 8_962_000 picoseconds. + Weight::from_parts(9_389_000, 1526) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -547,10 +568,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6330` // Estimated: `8499` - // Minimum execution time: 26_057_000 picoseconds. - Weight::from_parts(46_673_357, 8499) - // Standard Error: 456 - .saturating_add(Weight::from_parts(2_677, 0).saturating_mul(n.into())) + // Minimum execution time: 27_119_000 picoseconds. + Weight::from_parts(47_930_900, 8499) + // Standard Error: 464 + .saturating_add(Weight::from_parts(2_940, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(15_u64)) } @@ -568,8 +589,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `651` // Estimated: `2136` - // Minimum execution time: 40_907_000 picoseconds. - Weight::from_parts(42_566_000, 2136) + // Minimum execution time: 42_429_000 picoseconds. + Weight::from_parts(43_538_000, 2136) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -591,8 +612,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `769` // Estimated: `4698` - // Minimum execution time: 65_209_000 picoseconds. - Weight::from_parts(68_604_000, 4698) + // Minimum execution time: 62_957_000 picoseconds. + Weight::from_parts(66_821_000, 4698) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -602,8 +623,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 15_860_000 picoseconds. - Weight::from_parts(16_393_000, 3551) + // Minimum execution time: 16_146_000 picoseconds. + Weight::from_parts(16_775_000, 3551) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -613,8 +634,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 17_651_000 picoseconds. - Weight::from_parts(18_088_000, 3551) + // Minimum execution time: 17_720_000 picoseconds. + Weight::from_parts(18_916_000, 3551) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -624,8 +645,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `496` // Estimated: `3551` - // Minimum execution time: 18_576_000 picoseconds. - Weight::from_parts(19_810_000, 3551) + // Minimum execution time: 19_088_000 picoseconds. + Weight::from_parts(19_732_000, 3551) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -641,8 +662,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `741` // Estimated: `4681` - // Minimum execution time: 31_015_000 picoseconds. - Weight::from_parts(31_932_000, 4681) + // Minimum execution time: 30_522_000 picoseconds. + Weight::from_parts(31_573_000, 4681) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -660,8 +681,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `776` // Estimated: `5996` - // Minimum execution time: 36_473_000 picoseconds. - Weight::from_parts(37_382_000, 5996) + // Minimum execution time: 35_833_000 picoseconds. + Weight::from_parts(36_830_000, 5996) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -676,10 +697,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `859` // Estimated: `6196 + m * (2520 ±0)` - // Minimum execution time: 64_957_000 picoseconds. - Weight::from_parts(66_024_232, 6196) - // Standard Error: 50_170 - .saturating_add(Weight::from_parts(1_290_632, 0).saturating_mul(m.into())) + // Minimum execution time: 65_882_000 picoseconds. + Weight::from_parts(67_506_904, 6196) + // Standard Error: 49_386 + .saturating_add(Weight::from_parts(1_197_959, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(RocksDbWeight::get().writes(5_u64)) @@ -691,8 +712,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 39_939_000 picoseconds. - Weight::from_parts(40_788_000, 3593) + // Minimum execution time: 41_860_000 picoseconds. + Weight::from_parts(42_478_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -704,8 +725,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `604` // Estimated: `3551` - // Minimum execution time: 31_709_000 picoseconds. - Weight::from_parts(37_559_000, 3551) + // Minimum execution time: 32_593_000 picoseconds. + Weight::from_parts(35_399_000, 3551) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -719,8 +740,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `601` // Estimated: `3533` - // Minimum execution time: 42_895_000 picoseconds. - Weight::from_parts(53_945_000, 3533) + // Minimum execution time: 41_934_000 picoseconds. + Weight::from_parts(50_480_000, 3533) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -736,8 +757,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `995` // Estimated: `3593` - // Minimum execution time: 50_770_000 picoseconds. - Weight::from_parts(63_117_000, 3593) + // Minimum execution time: 47_167_000 picoseconds. + Weight::from_parts(54_289_000, 3593) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -749,18 +770,20 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `661` // Estimated: `4698` - // Minimum execution time: 33_396_000 picoseconds. - Weight::from_parts(36_247_000, 4698) + // Minimum execution time: 29_755_000 picoseconds. + Weight::from_parts(32_857_000, 4698) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// The range of component `n` is `[0, 1000]`. - fn request_core_count(_n: u32, ) -> Weight { + fn request_core_count(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_625_000 picoseconds. - Weight::from_parts(4_011_396, 0) + // Minimum execution time: 3_793_000 picoseconds. + Weight::from_parts(4_086_907, 0) + // Standard Error: 14 + .saturating_add(Weight::from_parts(60, 0).saturating_mul(n.into())) } /// Storage: `Broker::CoreCountInbox` (r:1 w:1) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) @@ -769,13 +792,13 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `404` // Estimated: `1487` - // Minimum execution time: 6_217_000 picoseconds. - Weight::from_parts(6_608_394, 1487) + // Minimum execution time: 6_262_000 picoseconds. + Weight::from_parts(6_734_896, 1487) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) - /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `Broker::RevenueInbox` (r:1 w:1) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) /// Storage: `Broker::InstaPoolHistory` (r:1 w:1) /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:1 w:1) @@ -786,10 +809,10 @@ impl WeightInfo for () { /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn process_revenue() -> Weight { // Proof Size summary in bytes: - // Measured: `972` - // Estimated: `4437` - // Minimum execution time: 46_853_000 picoseconds. - Weight::from_parts(47_740_000, 4437) + // Measured: `829` + // Estimated: `3593` + // Minimum execution time: 39_812_000 picoseconds. + Weight::from_parts(41_227_000, 3593) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -808,8 +831,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6281` // Estimated: `8499` - // Minimum execution time: 34_240_000 picoseconds. - Weight::from_parts(35_910_175, 8499) + // Minimum execution time: 34_576_000 picoseconds. + Weight::from_parts(36_303_629, 8499) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(15_u64)) } @@ -821,8 +844,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `180` // Estimated: `3493` - // Minimum execution time: 7_083_000 picoseconds. - Weight::from_parts(7_336_000, 3493) + // Minimum execution time: 6_978_000 picoseconds. + Weight::from_parts(7_206_000, 3493) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -834,8 +857,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1423` // Estimated: `4681` - // Minimum execution time: 15_029_000 picoseconds. - Weight::from_parts(15_567_000, 4681) + // Minimum execution time: 15_063_000 picoseconds. + Weight::from_parts(15_463_000, 4681) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -843,8 +866,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 123_000 picoseconds. - Weight::from_parts(136_000, 0) + // Minimum execution time: 126_000 picoseconds. + Weight::from_parts(157_000, 0) } /// Storage: `Broker::CoreCountInbox` (r:0 w:1) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) @@ -852,8 +875,18 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_775_000 picoseconds. - Weight::from_parts(1_911_000, 0) + // Minimum execution time: 1_803_000 picoseconds. + Weight::from_parts(1_965_000, 0) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `Broker::RevenueInbox` (r:0 w:1) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) + fn notify_revenue() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_902_000 picoseconds. + Weight::from_parts(2_116_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Broker::Status` (r:1 w:1) @@ -862,16 +895,16 @@ impl WeightInfo for () { /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) /// Storage: `Broker::CoreCountInbox` (r:1 w:0) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) - /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `Broker::RevenueInbox` (r:1 w:0) + /// Proof: `Broker::RevenueInbox` (`max_values`: Some(1), `max_size`: Some(20), added: 515, mode: `MaxEncodedLen`) fn do_tick_base() -> Weight { // Proof Size summary in bytes: - // Measured: `603` - // Estimated: `4068` - // Minimum execution time: 11_859_000 picoseconds. - Weight::from_parts(12_214_000, 4068) + // Measured: `441` + // Estimated: `1516` + // Minimum execution time: 9_313_000 picoseconds. + Weight::from_parts(9_699_000, 1516) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Broker::Leases` (r:1 w:1) /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) @@ -879,9 +912,16 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `239` // Estimated: `1526` - // Minimum execution time: 5_864_000 picoseconds. - Weight::from_parts(6_231_000, 1526) + // Minimum execution time: 5_984_000 picoseconds. + Weight::from_parts(6_296_000, 1526) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } + fn on_new_timeslice() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 229_000 picoseconds. + Weight::from_parts(268_000, 0) + } } -- GitLab From 929a273ae1ba647628c4ba6e2f8737e58b596d6a Mon Sep 17 00:00:00 2001 From: Muharem Date: Wed, 26 Jun 2024 18:36:33 +0200 Subject: [PATCH 062/130] pallet assets: optional auto-increment for the asset ID (#4757) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce an optional auto-increment setup for the IDs of new assets. --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: Bastian Köcher --- Cargo.lock | 1 + .../xcm/xcm-builder/src/tests/pay/mock.rs | 1 + polkadot/xcm/xcm-runtime-apis/tests/mock.rs | 1 + prdoc/pr_4757.prdoc | 18 +++++ .../cli/tests/res/default_genesis_config.json | 6 +- substrate/frame/assets-freezer/src/mock.rs | 1 + substrate/frame/assets/Cargo.toml | 1 + substrate/frame/assets/src/functions.rs | 3 + substrate/frame/assets/src/lib.rs | 74 +++++++++++++++++-- substrate/frame/assets/src/migration.rs | 24 ++++++ substrate/frame/assets/src/mock.rs | 3 +- substrate/frame/assets/src/tests.rs | 68 +++++++++++++++++ .../frame/contracts/mock-network/src/lib.rs | 1 + 13 files changed, 194 insertions(+), 8 deletions(-) create mode 100644 prdoc/pr_4757.prdoc diff --git a/Cargo.lock b/Cargo.lock index 5a1e5d4a744..15b5ea3431c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9806,6 +9806,7 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "impl-trait-for-tuples", "log", "pallet-balances", "parity-scale-codec", diff --git a/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs b/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs index 10e9f4c6c08..18bde3aab48 100644 --- a/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs +++ b/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs @@ -299,6 +299,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities { (1, TreasuryAccountId::get(), INITIAL_BALANCE), (100, TreasuryAccountId::get(), INITIAL_BALANCE), ], + next_asset_id: None, } .assimilate_storage(&mut t) .unwrap(); diff --git a/polkadot/xcm/xcm-runtime-apis/tests/mock.rs b/polkadot/xcm/xcm-runtime-apis/tests/mock.rs index 3b73070da45..e723e254635 100644 --- a/polkadot/xcm/xcm-runtime-apis/tests/mock.rs +++ b/polkadot/xcm/xcm-runtime-apis/tests/mock.rs @@ -389,6 +389,7 @@ pub fn new_test_ext_with_balances_and_assets( (1, "Relay Token".into(), "RLY".into(), 12), ], accounts: assets, + next_asset_id: None, } .assimilate_storage(&mut t) .unwrap(); diff --git a/prdoc/pr_4757.prdoc b/prdoc/pr_4757.prdoc new file mode 100644 index 00000000000..d94a20d7bb1 --- /dev/null +++ b/prdoc/pr_4757.prdoc @@ -0,0 +1,18 @@ +title: "pallet assets: optional auto-increment for the asset ID" + +doc: + - audience: Runtime Dev + description: | + Introduce an optional auto-increment setup for the IDs of new assets. + +crates: + - name: pallet-assets + bump: major + - name: staging-xcm-builder + bump: patch + - name: staging-xcm + bump: patch + - name: pallet-assets-freezer + bump: patch + - name: pallet-contracts + bump: patch diff --git a/substrate/bin/node/cli/tests/res/default_genesis_config.json b/substrate/bin/node/cli/tests/res/default_genesis_config.json index bba2076f400..b63e5ff549e 100644 --- a/substrate/bin/node/cli/tests/res/default_genesis_config.json +++ b/substrate/bin/node/cli/tests/res/default_genesis_config.json @@ -81,12 +81,14 @@ "assets": { "assets": [], "metadata": [], - "accounts": [] + "accounts": [], + "nextAssetId": null }, "poolAssets": { "assets": [], "metadata": [], - "accounts": [] + "accounts": [], + "nextAssetId": null }, "transactionStorage": { "byteFee": 10, diff --git a/substrate/frame/assets-freezer/src/mock.rs b/substrate/frame/assets-freezer/src/mock.rs index b4e8c857fba..5e04dfe8e2b 100644 --- a/substrate/frame/assets-freezer/src/mock.rs +++ b/substrate/frame/assets-freezer/src/mock.rs @@ -137,6 +137,7 @@ pub fn new_test_ext(execute: impl FnOnce()) -> sp_io::TestExternalities { assets: vec![(1, 0, true, 1)], metadata: vec![], accounts: vec![(1, 1, 100)], + next_asset_id: None, }, system: Default::default(), balances: Default::default(), diff --git a/substrate/frame/assets/Cargo.toml b/substrate/frame/assets/Cargo.toml index 412524f0b35..d0b5dc77789 100644 --- a/substrate/frame/assets/Cargo.toml +++ b/substrate/frame/assets/Cargo.toml @@ -17,6 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { workspace = true } +impl-trait-for-tuples = "0.2.2" log = { workspace = true } scale-info = { features = ["derive"], workspace = true } sp-std = { workspace = true } diff --git a/substrate/frame/assets/src/functions.rs b/substrate/frame/assets/src/functions.rs index 9309d010117..2fb8aee1a97 100644 --- a/substrate/frame/assets/src/functions.rs +++ b/substrate/frame/assets/src/functions.rs @@ -709,6 +709,9 @@ impl, I: 'static> Pallet { ) -> DispatchResult { ensure!(!Asset::::contains_key(&id), Error::::InUse); ensure!(!min_balance.is_zero(), Error::::MinBalanceZero); + if let Some(next_id) = NextAssetId::::get() { + ensure!(id == next_id, Error::::BadAssetId); + } Asset::::insert( &id, diff --git a/substrate/frame/assets/src/lib.rs b/substrate/frame/assets/src/lib.rs index d5214922555..6dbce717a8e 100644 --- a/substrate/frame/assets/src/lib.rs +++ b/substrate/frame/assets/src/lib.rs @@ -174,6 +174,7 @@ use sp_runtime::{ }; use sp_std::prelude::*; +use core::marker::PhantomData; use frame_support::{ dispatch::DispatchResult, ensure, @@ -182,7 +183,7 @@ use frame_support::{ traits::{ tokens::{fungibles, DepositConsequence, WithdrawConsequence}, BalanceStatus::Reserved, - Currency, EnsureOriginWithArg, ReservableCurrency, StoredMap, + Currency, EnsureOriginWithArg, Incrementable, ReservableCurrency, StoredMap, }, }; use frame_system::Config as SystemConfig; @@ -206,8 +207,37 @@ pub trait AssetsCallback { } } -/// Empty implementation in case no callbacks are required. -impl AssetsCallback for () {} +#[impl_trait_for_tuples::impl_for_tuples(10)] +impl AssetsCallback for Tuple { + fn created(id: &AssetId, owner: &AccountId) -> Result<(), ()> { + for_tuples!( #( Tuple::created(id, owner)?; )* ); + Ok(()) + } + + fn destroyed(id: &AssetId) -> Result<(), ()> { + for_tuples!( #( Tuple::destroyed(id)?; )* ); + Ok(()) + } +} + +/// Auto-increment the [`NextAssetId`] when an asset is created. +/// +/// This has not effect if the [`NextAssetId`] value is not present. +pub struct AutoIncAssetId(PhantomData<(T, I)>); +impl, I> AssetsCallback for AutoIncAssetId +where + T::AssetId: Incrementable, +{ + fn created(_: &T::AssetId, _: &T::AccountId) -> Result<(), ()> { + let Some(next_id) = NextAssetId::::get() else { + // Auto increment for the asset id is not enabled. + return Ok(()); + }; + let next_id = next_id.increment().ok_or(())?; + NextAssetId::::put(next_id); + Ok(()) + } +} #[frame_support::pallet] pub mod pallet { @@ -361,6 +391,11 @@ pub mod pallet { type Extra: Member + Parameter + Default + MaxEncodedLen; /// Callback methods for asset state change (e.g. asset created or destroyed) + /// + /// Types implementing the [`AssetsCallback`] can be chained when listed together as a + /// tuple. + /// The [`AutoIncAssetId`] callback, in conjunction with the [`NextAssetId`], can be + /// used to set up auto-incrementing asset IDs for this collection. type CallbackHandle: AssetsCallback; /// Weight information for extrinsics in this pallet. @@ -415,6 +450,18 @@ pub mod pallet { ValueQuery, >; + /// The asset ID enforced for the next asset creation, if any present. Otherwise, this storage + /// item has no effect. + /// + /// This can be useful for setting up constraints for IDs of the new assets. For example, by + /// providing an initial [`NextAssetId`] and using the [`crate::AutoIncAssetId`] callback, an + /// auto-increment model can be applied to all new asset IDs. + /// + /// The initial next asset ID can be set using the [`GenesisConfig`] or the + /// [SetNextAssetId](`migration::next_asset_id::SetNextAssetId`) migration. + #[pallet::storage] + pub type NextAssetId, I: 'static = ()> = StorageValue<_, T::AssetId, OptionQuery>; + #[pallet::genesis_config] #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig, I: 'static = ()> { @@ -424,6 +471,13 @@ pub mod pallet { pub metadata: Vec<(T::AssetId, Vec, Vec, u8)>, /// Genesis accounts: id, account_id, balance pub accounts: Vec<(T::AssetId, T::AccountId, T::Balance)>, + /// Genesis [`NextAssetId`]. + /// + /// Refer to the [`NextAssetId`] item for more information. + /// + /// This does not enforce the asset ID for the [assets](`GenesisConfig::assets`) within the + /// genesis config. It sets the [`NextAssetId`] after they have been created. + pub next_asset_id: Option, } #[pallet::genesis_build] @@ -485,6 +539,10 @@ pub mod pallet { ); assert!(result.is_ok()); } + + if let Some(next_asset_id) = &self.next_asset_id { + NextAssetId::::put(next_asset_id); + } } } @@ -622,6 +680,8 @@ pub mod pallet { NotFrozen, /// Callback action resulted in error CallbackFailed, + /// The asset ID must be equal to the [`NextAssetId`]. + BadAssetId, } #[pallet::call(weight(>::WeightInfo))] @@ -636,7 +696,7 @@ pub mod pallet { /// /// Parameters: /// - `id`: The identifier of the new asset. This must not be currently in use to identify - /// an existing asset. + /// an existing asset. If [`NextAssetId`] is set, then this must be equal to it. /// - `admin`: The admin of this class of assets. The admin is the initial address of each /// member of the asset class's admin team. /// - `min_balance`: The minimum balance of this new asset that any single account must @@ -659,6 +719,10 @@ pub mod pallet { ensure!(!Asset::::contains_key(&id), Error::::InUse); ensure!(!min_balance.is_zero(), Error::::MinBalanceZero); + if let Some(next_id) = NextAssetId::::get() { + ensure!(id == next_id, Error::::BadAssetId); + } + let deposit = T::AssetDeposit::get(); T::Currency::reserve(&owner, deposit)?; @@ -698,7 +762,7 @@ pub mod pallet { /// Unlike `create`, no funds are reserved. /// /// - `id`: The identifier of the new asset. This must not be currently in use to identify - /// an existing asset. + /// an existing asset. If [`NextAssetId`] is set, then this must be equal to it. /// - `owner`: The owner of this class of assets. The owner has full superuser permissions /// over this asset, but may later change and configure the permissions using /// `transfer_ownership` and `set_team`. diff --git a/substrate/frame/assets/src/migration.rs b/substrate/frame/assets/src/migration.rs index dd7c12293e8..9096f25fb79 100644 --- a/substrate/frame/assets/src/migration.rs +++ b/substrate/frame/assets/src/migration.rs @@ -22,6 +22,30 @@ use log; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; +pub mod next_asset_id { + use super::*; + use sp_core::Get; + + /// Set [`NextAssetId`] to the value of `ID` if [`NextAssetId`] does not exist yet. + pub struct SetNextAssetId, I: 'static = ()>( + core::marker::PhantomData<(ID, T, I)>, + ); + impl, I: 'static> OnRuntimeUpgrade for SetNextAssetId + where + T::AssetId: Incrementable, + ID: Get, + { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + if !NextAssetId::::exists() { + NextAssetId::::put(ID::get()); + T::DbWeight::get().reads_writes(1, 1) + } else { + T::DbWeight::get().reads(1) + } + } + } +} + pub mod v1 { use frame_support::{pallet_prelude::*, weights::Weight}; diff --git a/substrate/frame/assets/src/mock.rs b/substrate/frame/assets/src/mock.rs index 694ef234dff..2c160840e14 100644 --- a/substrate/frame/assets/src/mock.rs +++ b/substrate/frame/assets/src/mock.rs @@ -103,7 +103,7 @@ impl Config for Test { type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = frame_system::EnsureRoot; type Freezer = TestFreezer; - type CallbackHandle = AssetsCallbackHandle; + type CallbackHandle = (AssetsCallbackHandle, AutoIncAssetId); } use std::collections::HashMap; @@ -167,6 +167,7 @@ pub(crate) fn new_test_ext() -> sp_io::TestExternalities { // id, account_id, balance (999, 1, 100), ], + next_asset_id: None, }; config.assimilate_storage(&mut storage).unwrap(); diff --git a/substrate/frame/assets/src/tests.rs b/substrate/frame/assets/src/tests.rs index c7021bcad53..62106d47a15 100644 --- a/substrate/frame/assets/src/tests.rs +++ b/substrate/frame/assets/src/tests.rs @@ -1777,3 +1777,71 @@ fn asset_destroy_refund_existence_deposit() { assert_eq!(Balances::reserved_balance(&admin), 0); }); } + +#[test] +fn asset_id_cannot_be_reused() { + new_test_ext().execute_with(|| { + Balances::make_free_balance_be(&1, 100); + // Asset id can be reused till auto increment is not enabled. + assert_ok!(Assets::create(RuntimeOrigin::signed(1), 0, 1, 1)); + + assert_ok!(Assets::start_destroy(RuntimeOrigin::signed(1), 0)); + assert_ok!(Assets::finish_destroy(RuntimeOrigin::signed(1), 0)); + + assert!(!Asset::::contains_key(0)); + + // Asset id `0` is reused. + assert_ok!(Assets::create(RuntimeOrigin::signed(1), 0, 1, 1)); + assert!(Asset::::contains_key(0)); + + assert_ok!(Assets::start_destroy(RuntimeOrigin::signed(1), 0)); + assert_ok!(Assets::finish_destroy(RuntimeOrigin::signed(1), 0)); + + assert!(!Asset::::contains_key(0)); + + // Enable auto increment. Next asset id must be 5. + pallet::NextAssetId::::put(5); + + assert_noop!(Assets::create(RuntimeOrigin::signed(1), 0, 1, 1), Error::::BadAssetId); + assert_noop!(Assets::create(RuntimeOrigin::signed(1), 1, 1, 1), Error::::BadAssetId); + assert_noop!( + Assets::force_create(RuntimeOrigin::root(), 0, 1, false, 1), + Error::::BadAssetId + ); + assert_noop!( + Assets::force_create(RuntimeOrigin::root(), 1, 1, true, 1), + Error::::BadAssetId + ); + + // Asset with id `5` is created. + assert_ok!(Assets::create(RuntimeOrigin::signed(1), 5, 1, 1)); + assert!(Asset::::contains_key(5)); + + // Destroy asset with id `6`. + assert_ok!(Assets::start_destroy(RuntimeOrigin::signed(1), 5)); + assert_ok!(Assets::finish_destroy(RuntimeOrigin::signed(1), 5)); + + assert!(!Asset::::contains_key(0)); + + // Asset id `5` cannot be reused. + assert_noop!(Assets::create(RuntimeOrigin::signed(1), 5, 1, 1), Error::::BadAssetId); + + assert_ok!(Assets::create(RuntimeOrigin::signed(1), 6, 1, 1)); + assert!(Asset::::contains_key(6)); + + // Destroy asset with id `6`. + assert_ok!(Assets::start_destroy(RuntimeOrigin::signed(1), 6)); + assert_ok!(Assets::finish_destroy(RuntimeOrigin::signed(1), 6)); + + assert!(!Asset::::contains_key(6)); + + // Asset id `6` cannot be reused with force. + assert_noop!( + Assets::force_create(RuntimeOrigin::root(), 6, 1, false, 1), + Error::::BadAssetId + ); + + assert_ok!(Assets::force_create(RuntimeOrigin::root(), 7, 1, false, 1)); + assert!(Asset::::contains_key(7)); + }); +} diff --git a/substrate/frame/contracts/mock-network/src/lib.rs b/substrate/frame/contracts/mock-network/src/lib.rs index 20ded0f4a0b..34cc95f2eae 100644 --- a/substrate/frame/contracts/mock-network/src/lib.rs +++ b/substrate/frame/contracts/mock-network/src/lib.rs @@ -112,6 +112,7 @@ pub fn para_ext(para_id: u32) -> sp_io::TestExternalities { (0u128, ALICE, INITIAL_BALANCE), (0u128, relay_sovereign_account_id(), INITIAL_BALANCE), ], + next_asset_id: None, } .assimilate_storage(&mut t) .unwrap(); -- GitLab From 7c6ab07193e60a06de14f90fd3f618ac72ff17b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 27 Jun 2024 12:49:55 +0200 Subject: [PATCH 063/130] Mention the signed extensions in the reference docs (#4887) Co-authored-by: gupnik --- Cargo.lock | 3 ++ docs/sdk/Cargo.toml | 3 ++ .../src/reference_docs/signed_extensions.rs | 54 ++++++++++++++++++- .../system/src/extensions/check_mortality.rs | 3 ++ .../skip-feeless-payment/src/lib.rs | 9 ++-- 5 files changed, 67 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 15b5ea3431c..753857e9ba8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14612,6 +14612,8 @@ dependencies = [ "frame-system", "kitchensink-runtime", "minimal-template-runtime", + "pallet-asset-conversion-tx-payment", + "pallet-asset-tx-payment", "pallet-assets", "pallet-aura", "pallet-authorship", @@ -14630,6 +14632,7 @@ dependencies = [ "pallet-proxy", "pallet-referenda", "pallet-scheduler", + "pallet-skip-feeless-payment", "pallet-timestamp", "pallet-transaction-payment", "pallet-uniques", diff --git a/docs/sdk/Cargo.toml b/docs/sdk/Cargo.toml index 7d3d2da51ab..d3e48de5d18 100644 --- a/docs/sdk/Cargo.toml +++ b/docs/sdk/Cargo.toml @@ -74,6 +74,9 @@ pallet-balances = { workspace = true, default-features = true } pallet-assets = { workspace = true, default-features = true } pallet-preimage = { workspace = true, default-features = true } pallet-transaction-payment = { workspace = true, default-features = true } +pallet-asset-tx-payment = { workspace = true, default-features = true } +pallet-skip-feeless-payment = { workspace = true, default-features = true } +pallet-asset-conversion-tx-payment = { workspace = true, default-features = true } pallet-utility = { workspace = true, default-features = true } pallet-multisig = { workspace = true, default-features = true } pallet-proxy = { workspace = true, default-features = true } diff --git a/docs/sdk/src/reference_docs/signed_extensions.rs b/docs/sdk/src/reference_docs/signed_extensions.rs index 43a6bcc14c5..c644aeaa416 100644 --- a/docs/sdk/src/reference_docs/signed_extensions.rs +++ b/docs/sdk/src/reference_docs/signed_extensions.rs @@ -1,7 +1,59 @@ //! Signed extensions are, briefly, a means for different chains to extend the "basic" extrinsic //! format with custom data that can be checked by the runtime. //! -//! # Example +//! # FRAME provided signed extensions +//! +//! FRAME by default already provides the following signed extensions: +//! +//! - [`CheckGenesis`](frame_system::CheckGenesis): Ensures that a transaction was sent for the same +//! network. Determined based on genesis. +//! +//! - [`CheckMortality`](frame_system::CheckMortality): Extends a transaction with a configurable +//! mortality. +//! +//! - [`CheckNonZeroSender`](frame_system::CheckNonZeroSender): Ensures that the sender of a +//! transaction is not the *all zero account* (all bytes of the accountid are zero). +//! +//! - [`CheckNonce`](frame_system::CheckNonce): Extends a transaction with a nonce to prevent replay +//! of transactions and to provide ordering of transactions. +//! +//! - [`CheckSpecVersion`](frame_system::CheckSpecVersion): Ensures that a transaction was built for +//! the currently active runtime. +//! +//! - [`CheckTxVersion`](frame_system::CheckTxVersion): Ensures that the transaction signer used the +//! correct encoding of the call. +//! +//! - [`CheckWeight`](frame_system::CheckWeight): Ensures that the transaction fits into the block +//! before dispatching it. +//! +//! - [`ChargeTransactionPayment`](pallet_transaction_payment::ChargeTransactionPayment): Charges +//! transaction fees from the signer based on the weight of the call using the native token. +//! +//! - [`ChargeAssetTxPayment`](pallet_asset_tx_payment::ChargeAssetTxPayment): Charges transaction +//! fees from the signer based on the weight of the call using any supported asset (including the +//! native token). +//! +//! - [`ChargeAssetTxPayment`(using +//! conversion)](pallet_asset_conversion_tx_payment::ChargeAssetTxPayment): Charges transaction +//! fees from the signer based on the weight of the call using any supported asset (including the +//! native token). The asset is converted to the native token using a pool. +//! +//! - [`SkipCheckIfFeeless`](pallet_skip_feeless_payment::SkipCheckIfFeeless): Allows transactions +//! to be processed without paying any fee. This requires that the `call` that should be +//! dispatched is augmented with the [`feeless_if`](frame_support::pallet_macros::feeless_if) +//! attribute. +//! +//! - [`CheckMetadataHash`](frame_metadata_hash_extension::CheckMetadataHash): Extends transactions +//! to include the so-called metadata hash. This is required by chains to support the generic +//! Ledger application and other similar offline wallets. +//! +//! - [`StorageWeightReclaim`](cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim): A +//! signed extension for parachains that reclaims unused storage weight after executing a +//! transaction. +//! +//! For more information about these extensions, follow the link to the type documentation. +//! +//! # Building a custom signed extension //! //! Defining a couple of very simple signed extensions looks like the following: #![doc = docify::embed!("./src/reference_docs/signed_extensions.rs", signed_extensions_example)] diff --git a/substrate/frame/system/src/extensions/check_mortality.rs b/substrate/frame/system/src/extensions/check_mortality.rs index 148dfd4aad4..31fdbba5950 100644 --- a/substrate/frame/system/src/extensions/check_mortality.rs +++ b/substrate/frame/system/src/extensions/check_mortality.rs @@ -28,6 +28,9 @@ use sp_runtime::{ /// Check for transaction mortality. /// +/// The extension adds [`Era`] to every signed extrinsic. It also contributes to the signed data, by +/// including the hash of the block at [`Era::birth`]. +/// /// # Transaction Validity /// /// The extension affects `longevity` of the transaction according to the [`Era`] definition. diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs b/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs index 00391d79478..682fb320356 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs @@ -16,8 +16,8 @@ //! # Skip Feeless Payment Pallet //! //! This pallet allows runtimes that include it to skip payment of transaction fees for -//! dispatchables marked by [`#[pallet::feeless_if]`](`macro@ -//! frame_support::pallet_prelude::feeless_if`). +//! dispatchables marked by +//! [`#[pallet::feeless_if]`](frame_support::pallet_prelude::feeless_if). //! //! ## Overview //! @@ -30,8 +30,9 @@ //! ## Integration //! //! This pallet wraps an existing transaction payment pallet. This means you should both pallets -//! in your `construct_runtime` macro and include this pallet's -//! [`SignedExtension`] ([`SkipCheckIfFeeless`]) that would accept the existing one as an argument. +//! in your [`construct_runtime`](frame_support::construct_runtime) macro and +//! include this pallet's [`SignedExtension`] ([`SkipCheckIfFeeless`]) that would accept the +//! existing one as an argument. #![cfg_attr(not(feature = "std"), no_std)] -- GitLab From d604e84ee71d685ac3b143b19976d0093b95a1e2 Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Thu, 27 Jun 2024 14:17:11 +0300 Subject: [PATCH 064/130] Ensure key ownership proof is optimal (#4699) Ensure that the key ownership proof doesn't contain duplicate or unneeded nodes. We already have these checks for the bridge messages proof. Just making them more generic and performing them also for the key ownership proof. --------- Co-authored-by: Adrian Catangiu --- bridges/bin/runtime-common/src/messages.rs | 7 +- .../primitives/runtime/src/storage_proof.rs | 97 +++++--------- substrate/frame/session/src/historical/mod.rs | 112 ++++++++--------- .../trie/src/accessed_nodes_tracker.rs | 119 ++++++++++++++++++ substrate/primitives/trie/src/lib.rs | 51 +++++++- substrate/primitives/trie/src/recorder.rs | 29 ++--- substrate/primitives/trie/src/recorder_ext.rs | 47 +++++++ .../primitives/trie/src/storage_proof.rs | 48 +++++++ 8 files changed, 366 insertions(+), 144 deletions(-) create mode 100644 substrate/primitives/trie/src/accessed_nodes_tracker.rs create mode 100644 substrate/primitives/trie/src/recorder_ext.rs diff --git a/bridges/bin/runtime-common/src/messages.rs b/bridges/bin/runtime-common/src/messages.rs index 0fe9935dbdb..03801d5279d 100644 --- a/bridges/bin/runtime-common/src/messages.rs +++ b/bridges/bin/runtime-common/src/messages.rs @@ -395,6 +395,7 @@ mod tests { use codec::Encode; use sp_core::H256; use sp_runtime::traits::Header as _; + use sp_trie::accessed_nodes_tracker::Error as AccessedNodesTrackerError; #[test] fn verify_chain_message_rejects_message_with_too_large_declared_weight() { @@ -541,7 +542,7 @@ mod tests { target::verify_messages_proof::(proof, 10) },), Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( - StorageProofError::DuplicateNodesInProof + StorageProofError::StorageProof(sp_trie::StorageProofError::DuplicateNodes.into()) ))), ); } @@ -553,7 +554,9 @@ mod tests { proof.storage_proof.push(vec![42]); target::verify_messages_proof::(proof, 10) },), - Err(VerificationError::StorageProof(StorageProofError::UnusedNodesInTheProof)), + Err(VerificationError::StorageProof(StorageProofError::AccessedNodesTracker( + AccessedNodesTrackerError::UnusedNodes.into() + ))), ); } diff --git a/bridges/primitives/runtime/src/storage_proof.rs b/bridges/primitives/runtime/src/storage_proof.rs index 1b706aa66c1..251ceec5a9e 100644 --- a/bridges/primitives/runtime/src/storage_proof.rs +++ b/bridges/primitives/runtime/src/storage_proof.rs @@ -21,15 +21,16 @@ use codec::{Decode, Encode}; use frame_support::PalletError; use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; use scale_info::TypeInfo; -use sp_std::{boxed::Box, collections::btree_set::BTreeSet, vec::Vec}; +use sp_std::{boxed::Box, vec::Vec}; +pub use sp_trie::RawStorageProof; use sp_trie::{ - read_trie_value, LayoutV1, MemoryDB, Recorder, StorageProof, Trie, TrieConfiguration, + accessed_nodes_tracker::{AccessedNodesTracker, Error as AccessedNodesTrackerError}, + read_trie_value, + recorder_ext::RecorderExt, + LayoutV1, MemoryDB, Recorder, StorageProof, StorageProofError, Trie, TrieConfiguration, TrieDBBuilder, TrieError, TrieHash, }; -/// Raw storage proof type (just raw trie nodes). -pub type RawStorageProof = Vec>; - /// Storage proof size requirements. /// /// This is currently used by benchmarks when generating storage proofs. @@ -51,10 +52,9 @@ pub struct StorageProofChecker where H: Hasher, { - proof_nodes_count: usize, root: H::Out, db: MemoryDB, - recorder: Recorder>, + accessed_nodes_tracker: AccessedNodesTracker, } impl StorageProofChecker @@ -65,52 +65,39 @@ where /// /// This returns an error if the given proof is invalid with respect to the given root. pub fn new(root: H::Out, proof: RawStorageProof) -> Result { - // 1. we don't want extra items in the storage proof - // 2. `StorageProof` is storing all trie nodes in the `BTreeSet` - // - // => someone could simply add duplicate items to the proof and we won't be - // able to detect that by just using `StorageProof` - // - // => let's check it when we are converting our "raw proof" into `StorageProof` - let proof_nodes_count = proof.len(); - let proof = StorageProof::new(proof); - if proof_nodes_count != proof.iter_nodes().count() { - return Err(Error::DuplicateNodesInProof) - } + let proof = StorageProof::new_with_duplicate_nodes_check(proof) + .map_err(|e| Error::StorageProof(e.into()))?; + + let recorder = AccessedNodesTracker::new(proof.len()); let db = proof.into_memory_db(); if !db.contains(&root, EMPTY_PREFIX) { return Err(Error::StorageRootMismatch) } - let recorder = Recorder::default(); - let checker = StorageProofChecker { proof_nodes_count, root, db, recorder }; - Ok(checker) + Ok(StorageProofChecker { root, db, accessed_nodes_tracker: recorder }) } /// Returns error if the proof has some nodes that are left intact by previous `read_value` /// calls. - pub fn ensure_no_unused_nodes(mut self) -> Result<(), Error> { - let visited_nodes = self - .recorder - .drain() - .into_iter() - .map(|record| record.data) - .collect::>(); - let visited_nodes_count = visited_nodes.len(); - if self.proof_nodes_count == visited_nodes_count { - Ok(()) - } else { - Err(Error::UnusedNodesInTheProof) - } + pub fn ensure_no_unused_nodes(self) -> Result<(), Error> { + self.accessed_nodes_tracker + .ensure_no_unused_nodes() + .map_err(|e| Error::AccessedNodesTracker(e.into())) } /// Reads a value from the available subset of storage. If the value cannot be read due to an /// incomplete or otherwise invalid proof, this function returns an error. pub fn read_value(&mut self, key: &[u8]) -> Result>, Error> { // LayoutV1 or LayoutV0 is identical for proof that only read values. - read_trie_value::, _>(&self.db, &self.root, key, Some(&mut self.recorder), None) - .map_err(|_| Error::StorageValueUnavailable) + read_trie_value::, _>( + &self.db, + &self.root, + key, + Some(&mut self.accessed_nodes_tracker), + None, + ) + .map_err(|_| Error::StorageValueUnavailable) } /// Reads and decodes a value from the available subset of storage. If the value cannot be read @@ -145,10 +132,10 @@ where /// Storage proof related errors. #[derive(Encode, Decode, Clone, Eq, PartialEq, PalletError, Debug, TypeInfo)] pub enum Error { - /// Duplicate trie nodes are found in the proof. - DuplicateNodesInProof, - /// Unused trie nodes are found in the proof. - UnusedNodesInTheProof, + /// Error generated by the `AccessedNodesTrackerError`. + AccessedNodesTracker(StrippableError), + /// Error originating in the `storage_proof` module. + StorageProof(StrippableError), /// Expected storage root is missing from the proof. StorageRootMismatch, /// Unable to reach expected storage value using provided trie nodes. @@ -202,15 +189,7 @@ where trie.get(&key)?; } - // recorder may record the same trie node multiple times and we don't want duplicate nodes - // in our proofs => let's deduplicate it by collecting to the BTreeSet first - Ok(recorder - .drain() - .into_iter() - .map(|n| n.data.to_vec()) - .collect::>() - .into_iter() - .collect()) + Ok(recorder.into_raw_storage_proof()) } #[cfg(test)] @@ -243,30 +222,22 @@ pub mod tests { ); } - #[test] - fn proof_with_duplicate_items_is_rejected() { - let (root, mut proof) = craft_valid_storage_proof(); - proof.push(proof.first().unwrap().clone()); - - assert_eq!( - StorageProofChecker::::new(root, proof).map(drop), - Err(Error::DuplicateNodesInProof), - ); - } - #[test] fn proof_with_unused_items_is_rejected() { let (root, proof) = craft_valid_storage_proof(); let mut checker = StorageProofChecker::::new(root, proof.clone()).unwrap(); - checker.read_value(b"key1").unwrap(); + checker.read_value(b"key1").unwrap().unwrap(); checker.read_value(b"key2").unwrap(); checker.read_value(b"key4").unwrap(); checker.read_value(b"key22").unwrap(); assert_eq!(checker.ensure_no_unused_nodes(), Ok(())); let checker = StorageProofChecker::::new(root, proof).unwrap(); - assert_eq!(checker.ensure_no_unused_nodes(), Err(Error::UnusedNodesInTheProof)); + assert_eq!( + checker.ensure_no_unused_nodes(), + Err(Error::AccessedNodesTracker(AccessedNodesTrackerError::UnusedNodes.into())) + ); } } diff --git a/substrate/frame/session/src/historical/mod.rs b/substrate/frame/session/src/historical/mod.rs index b9cecea1a7f..618497e3d54 100644 --- a/substrate/frame/session/src/historical/mod.rs +++ b/substrate/frame/session/src/historical/mod.rs @@ -37,21 +37,22 @@ use sp_runtime::{ }; use sp_session::{MembershipProof, ValidatorCount}; use sp_staking::SessionIndex; -use sp_std::prelude::*; +use sp_std::{fmt::Debug, prelude::*}; use sp_trie::{ trie_types::{TrieDBBuilder, TrieDBMutBuilderV0}, - LayoutV0, MemoryDB, Recorder, Trie, TrieMut, EMPTY_PREFIX, + LayoutV0, MemoryDB, Recorder, StorageProof, Trie, TrieMut, TrieRecorder, }; use frame_support::{ print, traits::{KeyOwnerProofSystem, ValidatorSet, ValidatorSetWithIdentification}, - Parameter, + Parameter, LOG_TARGET, }; use crate::{self as pallet_session, Pallet as Session}; pub use pallet::*; +use sp_trie::{accessed_nodes_tracker::AccessedNodesTracker, recorder_ext::RecorderExt}; #[frame_support::pallet] pub mod pallet { @@ -118,6 +119,16 @@ impl Pallet { } }) } + + fn full_id_validators() -> Vec<(T::ValidatorId, T::FullIdentification)> { + >::validators() + .into_iter() + .filter_map(|validator| { + T::FullIdentificationOf::convert(validator.clone()) + .map(|full_id| (validator, full_id)) + }) + .collect::>() + } } impl ValidatorSet for Pallet { @@ -264,35 +275,16 @@ impl ProvingTrie { Ok(ProvingTrie { db, root }) } - fn from_nodes(root: T::Hash, nodes: &[Vec]) -> Self { - use sp_trie::HashDBT; - - let mut memory_db = MemoryDB::default(); - for node in nodes { - HashDBT::insert(&mut memory_db, EMPTY_PREFIX, &node[..]); - } - - ProvingTrie { db: memory_db, root } + fn from_proof(root: T::Hash, proof: StorageProof) -> Self { + ProvingTrie { db: proof.into_memory_db(), root } } /// Prove the full verification data for a given key and key ID. pub fn prove(&self, key_id: KeyTypeId, key_data: &[u8]) -> Option>> { let mut recorder = Recorder::>::new(); - { - let trie = - TrieDBBuilder::new(&self.db, &self.root).with_recorder(&mut recorder).build(); - let val_idx = (key_id, key_data).using_encoded(|s| { - trie.get(s).ok()?.and_then(|raw| u32::decode(&mut &*raw).ok()) - })?; - - val_idx.using_encoded(|s| { - trie.get(s) - .ok()? - .and_then(|raw| >::decode(&mut &*raw).ok()) - })?; - } + self.query(key_id, key_data, Some(&mut recorder)); - Some(recorder.drain().into_iter().map(|r| r.data).collect()) + Some(recorder.into_raw_storage_proof()) } /// Access the underlying trie root. @@ -300,10 +292,17 @@ impl ProvingTrie { &self.root } - // Check a proof contained within the current memory-db. Returns `None` if the - // nodes within the current `MemoryDB` are insufficient to query the item. - fn query(&self, key_id: KeyTypeId, key_data: &[u8]) -> Option> { - let trie = TrieDBBuilder::new(&self.db, &self.root).build(); + /// Search for a key inside the proof. + fn query( + &self, + key_id: KeyTypeId, + key_data: &[u8], + recorder: Option<&mut dyn TrieRecorder>, + ) -> Option> { + let trie = TrieDBBuilder::new(&self.db, &self.root) + .with_optional_recorder(recorder) + .build(); + let val_idx = (key_id, key_data) .using_encoded(|s| trie.get(s)) .ok()? @@ -322,13 +321,7 @@ impl> KeyOwnerProofSystem<(KeyTypeId, D)> for Pallet Option { let session = >::current_index(); - let validators = >::validators() - .into_iter() - .filter_map(|validator| { - T::FullIdentificationOf::convert(validator.clone()) - .map(|full_id| (validator, full_id)) - }) - .collect::>(); + let validators = Self::full_id_validators(); let count = validators.len() as ValidatorCount; @@ -343,30 +336,35 @@ impl> KeyOwnerProofSystem<(KeyTypeId, D)> for Pallet Option> { - let (id, data) = key; - - if proof.session == >::current_index() { - >::key_owner(id, data.as_ref()).and_then(|owner| { - T::FullIdentificationOf::convert(owner.clone()).and_then(move |id| { - let count = >::validators().len() as ValidatorCount; - - if count != proof.validator_count { - return None - } + fn print_error(e: E) { + log::error!( + target: LOG_TARGET, + "Rejecting equivocation report because of key ownership proof error: {:?}", e + ); + } - Some((owner, id)) - }) - }) + let (id, data) = key; + let (root, count) = if proof.session == >::current_index() { + let validators = Self::full_id_validators(); + let count = validators.len() as ValidatorCount; + let trie = ProvingTrie::::generate_for(validators).ok()?; + (trie.root, count) } else { - let (root, count) = >::get(&proof.session)?; - - if count != proof.validator_count { - return None - } + >::get(&proof.session)? + }; - let trie = ProvingTrie::::from_nodes(root, &proof.trie_nodes); - trie.query(id, data.as_ref()) + if count != proof.validator_count { + return None } + + let proof = StorageProof::new_with_duplicate_nodes_check(proof.trie_nodes) + .map_err(print_error) + .ok()?; + let mut accessed_nodes_tracker = AccessedNodesTracker::::new(proof.len()); + let trie = ProvingTrie::::from_proof(root, proof); + let res = trie.query(id, data.as_ref(), Some(&mut accessed_nodes_tracker))?; + accessed_nodes_tracker.ensure_no_unused_nodes().map_err(print_error).ok()?; + Some(res) } } diff --git a/substrate/primitives/trie/src/accessed_nodes_tracker.rs b/substrate/primitives/trie/src/accessed_nodes_tracker.rs new file mode 100644 index 00000000000..378e3c2812c --- /dev/null +++ b/substrate/primitives/trie/src/accessed_nodes_tracker.rs @@ -0,0 +1,119 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Helpers for checking for duplicate nodes. + +use alloc::collections::BTreeSet; +use core::hash::Hash; +use scale_info::TypeInfo; +use sp_core::{Decode, Encode}; +use trie_db::{RecordedForKey, TrieAccess, TrieRecorder}; + +/// Error associated with the `AccessedNodesTracker` module. +#[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo)] +pub enum Error { + /// The proof contains unused nodes. + UnusedNodes, +} + +/// Helper struct used to ensure that a storage proof doesn't contain duplicate or unused nodes. +/// +/// The struct needs to be used as a `TrieRecorder` and `ensure_no_unused_nodes()` has to be called +/// to actually perform the check. +pub struct AccessedNodesTracker { + proof_nodes_count: usize, + recorder: BTreeSet, +} + +impl AccessedNodesTracker { + /// Create a new instance of `RedundantNodesChecker`, starting from a `RawStorageProof`. + pub fn new(proof_nodes_count: usize) -> Self { + Self { proof_nodes_count, recorder: BTreeSet::new() } + } + + /// Ensure that all the nodes in the proof have been accessed. + pub fn ensure_no_unused_nodes(self) -> Result<(), Error> { + if self.proof_nodes_count != self.recorder.len() { + return Err(Error::UnusedNodes) + } + + Ok(()) + } +} + +impl TrieRecorder for AccessedNodesTracker { + fn record(&mut self, access: TrieAccess) { + match access { + TrieAccess::NodeOwned { hash, .. } | + TrieAccess::EncodedNode { hash, .. } | + TrieAccess::Value { hash, .. } => { + self.recorder.insert(hash); + }, + _ => {}, + } + } + + fn trie_nodes_recorded_for_key(&self, _key: &[u8]) -> RecordedForKey { + RecordedForKey::None + } +} + +#[cfg(test)] +pub mod tests { + use super::*; + use crate::{tests::create_storage_proof, StorageProof}; + use hash_db::Hasher; + use trie_db::{Trie, TrieDBBuilder}; + + type Hash = ::Out; + type Layout = crate::LayoutV1; + + const TEST_DATA: &[(&[u8], &[u8])] = + &[(b"key1", &[1; 64]), (b"key2", &[2; 64]), (b"key3", &[3; 64])]; + + #[test] + fn proof_with_unused_nodes_is_rejected() { + let (raw_proof, root) = create_storage_proof::(TEST_DATA); + let proof = StorageProof::new(raw_proof.clone()); + let proof_nodes_count = proof.len(); + + let mut accessed_nodes_tracker = AccessedNodesTracker::::new(proof_nodes_count); + { + let db = proof.clone().into_memory_db(); + let trie = TrieDBBuilder::::new(&db, &root) + .with_recorder(&mut accessed_nodes_tracker) + .build(); + + trie.get(b"key1").unwrap().unwrap(); + trie.get(b"key2").unwrap().unwrap(); + trie.get(b"key3").unwrap().unwrap(); + } + assert_eq!(accessed_nodes_tracker.ensure_no_unused_nodes(), Ok(())); + + let mut accessed_nodes_tracker = AccessedNodesTracker::::new(proof_nodes_count); + { + let db = proof.into_memory_db(); + let trie = TrieDBBuilder::::new(&db, &root) + .with_recorder(&mut accessed_nodes_tracker) + .build(); + + trie.get(b"key1").unwrap().unwrap(); + trie.get(b"key2").unwrap().unwrap(); + } + assert_eq!(accessed_nodes_tracker.ensure_no_unused_nodes(), Err(Error::UnusedNodes)); + } +} diff --git a/substrate/primitives/trie/src/lib.rs b/substrate/primitives/trie/src/lib.rs index 0c14e3af196..ef6b6a5743c 100644 --- a/substrate/primitives/trie/src/lib.rs +++ b/substrate/primitives/trie/src/lib.rs @@ -21,6 +21,7 @@ extern crate alloc; +pub mod accessed_nodes_tracker; #[cfg(feature = "std")] pub mod cache; mod error; @@ -28,6 +29,7 @@ mod node_codec; mod node_header; #[cfg(feature = "std")] pub mod recorder; +pub mod recorder_ext; mod storage_proof; mod trie_codec; mod trie_stream; @@ -46,7 +48,7 @@ use hash_db::{Hasher, Prefix}; pub use memory_db::{prefixed_key, HashKey, KeyFunction, PrefixedKey}; /// The Substrate format implementation of `NodeCodec`. pub use node_codec::NodeCodec; -pub use storage_proof::{CompactProof, StorageProof}; +pub use storage_proof::{CompactProof, StorageProof, StorageProofError}; /// Trie codec reexport, mainly child trie support /// for trie compact proof. pub use trie_codec::{decode_compact, encode_compact, Error as CompactProofError}; @@ -64,6 +66,9 @@ pub use trie_db::{proof::VerifyError, MerkleValue}; /// The Substrate format implementation of `TrieStream`. pub use trie_stream::TrieStream; +/// Raw storage proof type (just raw trie nodes). +pub type RawStorageProof = Vec>; + /// substrate trie layout pub struct LayoutV0(PhantomData); @@ -616,6 +621,50 @@ mod tests { type MemoryDBMeta = memory_db::MemoryDB, trie_db::DBValue>; + pub fn create_trie( + data: &[(&[u8], &[u8])], + ) -> (MemoryDB, trie_db::TrieHash) { + let mut db = MemoryDB::default(); + let mut root = Default::default(); + + { + let mut trie = trie_db::TrieDBMutBuilder::::new(&mut db, &mut root).build(); + for (k, v) in data { + trie.insert(k, v).expect("Inserts data"); + } + } + + let mut recorder = Recorder::::new(); + { + let trie = trie_db::TrieDBBuilder::::new(&mut db, &mut root) + .with_recorder(&mut recorder) + .build(); + for (k, _v) in data { + trie.get(k).unwrap(); + } + } + + (db, root) + } + + pub fn create_storage_proof( + data: &[(&[u8], &[u8])], + ) -> (RawStorageProof, trie_db::TrieHash) { + let (db, root) = create_trie::(data); + + let mut recorder = Recorder::::new(); + { + let trie = trie_db::TrieDBBuilder::::new(&db, &root) + .with_recorder(&mut recorder) + .build(); + for (k, _v) in data { + trie.get(k).unwrap(); + } + } + + (recorder.drain().into_iter().map(|record| record.data).collect(), root) + } + fn hashed_null_node() -> TrieHash { ::hashed_null_node() } diff --git a/substrate/primitives/trie/src/recorder.rs b/substrate/primitives/trie/src/recorder.rs index 22a22b33b37..2886577eddc 100644 --- a/substrate/primitives/trie/src/recorder.rs +++ b/substrate/primitives/trie/src/recorder.rs @@ -145,7 +145,7 @@ impl Recorder { /// Convert the recording to a [`StorageProof`]. /// - /// In contrast to [`Self::drain_storage_proof`] this doesn't consumes and doesn't clears the + /// In contrast to [`Self::drain_storage_proof`] this doesn't consume and doesn't clear the /// recordings. /// /// Returns the [`StorageProof`]. @@ -429,7 +429,8 @@ impl<'a, H: Hasher> trie_db::TrieRecorder for TrieRecorder<'a, H> { #[cfg(test)] mod tests { use super::*; - use trie_db::{Trie, TrieDBBuilder, TrieDBMutBuilder, TrieHash, TrieMut, TrieRecorder}; + use crate::tests::create_trie; + use trie_db::{Trie, TrieDBBuilder, TrieRecorder}; type MemoryDB = crate::MemoryDB; type Layout = crate::LayoutV1; @@ -438,23 +439,9 @@ mod tests { const TEST_DATA: &[(&[u8], &[u8])] = &[(b"key1", &[1; 64]), (b"key2", &[2; 64]), (b"key3", &[3; 64]), (b"key4", &[4; 64])]; - fn create_trie() -> (MemoryDB, TrieHash) { - let mut db = MemoryDB::default(); - let mut root = Default::default(); - - { - let mut trie = TrieDBMutBuilder::::new(&mut db, &mut root).build(); - for (k, v) in TEST_DATA { - trie.insert(k, v).expect("Inserts data"); - } - } - - (db, root) - } - #[test] fn recorder_works() { - let (db, root) = create_trie(); + let (db, root) = create_trie::(TEST_DATA); let recorder = Recorder::default(); @@ -498,7 +485,7 @@ mod tests { #[test] fn recorder_transactions_rollback_work() { - let (db, root) = create_trie(); + let (db, root) = create_trie::(TEST_DATA); let recorder = Recorder::default(); let mut stats = vec![RecorderStats::default()]; @@ -547,7 +534,7 @@ mod tests { #[test] fn recorder_transactions_commit_work() { - let (db, root) = create_trie(); + let (db, root) = create_trie::(TEST_DATA); let recorder = Recorder::default(); @@ -586,7 +573,7 @@ mod tests { #[test] fn recorder_transactions_commit_and_rollback_work() { - let (db, root) = create_trie(); + let (db, root) = create_trie::(TEST_DATA); let recorder = Recorder::default(); @@ -645,7 +632,7 @@ mod tests { #[test] fn recorder_transaction_accessed_keys_works() { let key = TEST_DATA[0].0; - let (db, root) = create_trie(); + let (db, root) = create_trie::(TEST_DATA); let recorder = Recorder::default(); diff --git a/substrate/primitives/trie/src/recorder_ext.rs b/substrate/primitives/trie/src/recorder_ext.rs new file mode 100644 index 00000000000..866d5b72c5d --- /dev/null +++ b/substrate/primitives/trie/src/recorder_ext.rs @@ -0,0 +1,47 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Extension for the default recorder. + +use crate::RawStorageProof; +use alloc::{collections::BTreeSet, vec::Vec}; +use trie_db::{Recorder, TrieLayout}; + +/// Convenience extension for the `Recorder` struct. +/// +/// Used to deduplicate some logic. +pub trait RecorderExt +where + Self: Sized, +{ + /// Convert the recorder into a `BTreeSet`. + fn into_set(self) -> BTreeSet>; + + /// Convert the recorder into a `RawStorageProof`, avoiding duplicate nodes. + fn into_raw_storage_proof(self) -> RawStorageProof { + // The recorder may record the same trie node multiple times, + // and we don't want duplicate nodes in our proofs + // => let's deduplicate it by collecting to a BTreeSet first + self.into_set().into_iter().collect() + } +} + +impl RecorderExt for Recorder { + fn into_set(mut self) -> BTreeSet> { + self.drain().into_iter().map(|record| record.data).collect::>() + } +} diff --git a/substrate/primitives/trie/src/storage_proof.rs b/substrate/primitives/trie/src/storage_proof.rs index e46c49be19c..a9f6298742f 100644 --- a/substrate/primitives/trie/src/storage_proof.rs +++ b/substrate/primitives/trie/src/storage_proof.rs @@ -25,6 +25,13 @@ use scale_info::TypeInfo; // with `LayoutV0`. use crate::LayoutV1 as Layout; +/// Error associated with the `storage_proof` module. +#[derive(Encode, Decode, Clone, Eq, PartialEq, Debug, TypeInfo)] +pub enum StorageProofError { + /// The proof contains duplicate nodes. + DuplicateNodes, +} + /// A proof that some set of key-value pairs are included in the storage trie. The proof contains /// the storage values so that the partial storage backend can be reconstructed by a verifier that /// does not already have access to the key-value pairs. @@ -43,6 +50,22 @@ impl StorageProof { StorageProof { trie_nodes: BTreeSet::from_iter(trie_nodes) } } + /// Constructs a storage proof from a subset of encoded trie nodes in a storage backend. + /// + /// Returns an error if the provided subset of encoded trie nodes contains duplicates. + pub fn new_with_duplicate_nodes_check( + trie_nodes: impl IntoIterator>, + ) -> Result { + let mut trie_nodes_set = BTreeSet::new(); + for node in trie_nodes { + if !trie_nodes_set.insert(node) { + return Err(StorageProofError::DuplicateNodes); + } + } + + Ok(StorageProof { trie_nodes: trie_nodes_set }) + } + /// Returns a new empty proof. /// /// An empty proof is capable of only proving trivial statements (ie. that an empty set of @@ -56,6 +79,11 @@ impl StorageProof { self.trie_nodes.is_empty() } + /// Returns the number of nodes in the proof. + pub fn len(&self) -> usize { + self.trie_nodes.len() + } + /// Convert into an iterator over encoded trie nodes in lexicographical order constructed /// from the proof. pub fn into_iter_nodes(self) -> impl Sized + DoubleEndedIterator> { @@ -198,3 +226,23 @@ impl CompactProof { Ok((db, root)) } } + +#[cfg(test)] +pub mod tests { + use super::*; + use crate::{tests::create_storage_proof, StorageProof}; + + type Layout = crate::LayoutV1; + + const TEST_DATA: &[(&[u8], &[u8])] = + &[(b"key1", &[1; 64]), (b"key2", &[2; 64]), (b"key3", &[3; 64]), (b"key11", &[4; 64])]; + + #[test] + fn proof_with_duplicate_nodes_is_rejected() { + let (raw_proof, _root) = create_storage_proof::(TEST_DATA); + assert!(matches!( + StorageProof::new_with_duplicate_nodes_check(raw_proof), + Err(StorageProofError::DuplicateNodes) + )); + } +} -- GitLab From 569f994b71fd09b865c961bf5183f0627f244e55 Mon Sep 17 00:00:00 2001 From: Jun Jiang Date: Thu, 27 Jun 2024 20:46:20 +0800 Subject: [PATCH 065/130] Only sc-rpc-server uses `http` (#4890) --- Cargo.toml | 2 +- substrate/client/rpc-servers/Cargo.toml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 44f4eac5c8c..54ab9c37583 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -779,7 +779,7 @@ hex-literal = { version = "0.4.1", default-features = false } hkdf = { version = "0.12.0" } hmac = { version = "0.12.1" } honggfuzz = { version = "0.5.55" } -http = { version = "0.2.8" } +http = { version = "1.1.0" } http-body-util = { version = "0.1.2" } hyper = { version = "0.14.27", default-features = false } hyper-rustls = { version = "0.24.0" } diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index 7986408d2b2..2f51d42bc15 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -19,6 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] forwarded-header-value = { workspace = true } futures = { workspace = true } governor = { workspace = true } +http = { workspace = true } http-body-util = { workspace = true } ip_network = { workspace = true } jsonrpsee = { features = ["server"], workspace = true } @@ -30,7 +31,6 @@ tokio = { features = ["parking_lot"], workspace = true, default-features = true tower = { workspace = true, features = ["util"] } tower-http = { workspace = true, features = ["cors"] } -# Dependencies outside of the polkadot-sdk workspace -# which requires hyper v1 and http v1 -http = "1.1" +# Dependencies outside the polkadot-sdk workspace +# which requires hyper v1 hyper = "1.3" -- GitLab From 29a8da4f996de3b455ae140f8c1a3de51b878739 Mon Sep 17 00:00:00 2001 From: Lulu Date: Thu, 27 Jun 2024 14:17:27 +0100 Subject: [PATCH 066/130] Use newer nightly in check-semver (#4895) Co-authored-by: Oliver Tale-Yazdi --- .github/workflows/check-semver.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/check-semver.yml b/.github/workflows/check-semver.yml index 12f2149cdf2..47f9e5061b4 100644 --- a/.github/workflows/check-semver.yml +++ b/.github/workflows/check-semver.yml @@ -5,6 +5,8 @@ on: types: [opened, synchronize, reopened, ready_for_review] paths: - prdoc/*.prdoc +env: + TOOLCHAIN: nightly-2024-03-01 jobs: check-semver: @@ -24,9 +26,9 @@ jobs: - name: Rust compilation prerequisites run: | - rustup default $(parity-publish semver --minimum-nightly-rust-version) - rustup target add wasm32-unknown-unknown --toolchain $(parity-publish semver --minimum-nightly-rust-version) - rustup component add rust-src --toolchain $(parity-publish semver --minimum-nightly-rust-version) + rustup default $TOOLCHAIN + rustup target add wasm32-unknown-unknown --toolchain $TOOLCHAIN + rustup component add rust-src --toolchain $TOOLCHAIN - name: extra git setup run: | @@ -39,7 +41,7 @@ jobs: export CARGO_TARGET_DIR=target export RUSTFLAGS='-A warnings -A missing_docs' export SKIP_WASM_BUILD=1 - if ! parity-publish --color always prdoc --since old --validate prdoc/pr_$PR.prdoc -v; then + if ! parity-publish --color always prdoc --since old --validate prdoc/pr_$PR.prdoc -v --toolchain $TOOLCHAIN; then cat < Date: Thu, 27 Jun 2024 15:38:07 +0200 Subject: [PATCH 067/130] BridgeHubs fresh weights for bridging pallets (#4891) Co-authored-by: command-bot <> --- .../src/weights/pallet_bridge_grandpa.rs | 20 +++-- ...idge_messages_rococo_to_rococo_bulletin.rs | 70 +++++++-------- ...allet_bridge_messages_rococo_to_westend.rs | 88 +++++++++---------- .../src/weights/pallet_bridge_parachains.rs | 46 +++++----- .../src/weights/pallet_bridge_relayers.rs | 36 ++++---- .../src/weights/pallet_bridge_grandpa.rs | 20 ++--- .../src/weights/pallet_bridge_messages.rs | 88 +++++++++---------- .../src/weights/pallet_bridge_parachains.rs | 46 ++++++---- .../src/weights/pallet_bridge_relayers.rs | 26 +++--- 9 files changed, 227 insertions(+), 213 deletions(-) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs index 11e1439a1f6..bbd27bbb1d7 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_bridge_grandpa` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-05-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vicqj8em-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -64,15 +64,17 @@ impl pallet_bridge_grandpa::WeightInfo for WeightInfo Weight { + fn submit_finality_proof(p: u32, v: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `438 + p * (60 ±0)` // Estimated: `51735` - // Minimum execution time: 300_829_000 picoseconds. - Weight::from_parts(321_573_000, 0) + // Minimum execution time: 302_299_000 picoseconds. + Weight::from_parts(39_997_741, 0) .saturating_add(Weight::from_parts(0, 51735)) - // Standard Error: 25_917 - .saturating_add(Weight::from_parts(48_613_160, 0).saturating_mul(p.into())) + // Standard Error: 22_953 + .saturating_add(Weight::from_parts(44_095_182, 0).saturating_mul(p.into())) + // Standard Error: 76_592 + .saturating_add(Weight::from_parts(2_262_037, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -90,8 +92,8 @@ impl pallet_bridge_grandpa::WeightInfo for WeightInfo pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_single_message_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `621` + // Measured: `654` // Estimated: `52645` - // Minimum execution time: 36_661_000 picoseconds. - Weight::from_parts(38_106_000, 0) + // Minimum execution time: 37_405_000 picoseconds. + Weight::from_parts(38_397_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -76,10 +76,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_two_messages_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `621` + // Measured: `654` // Estimated: `52645` - // Minimum execution time: 47_599_000 picoseconds. - Weight::from_parts(49_731_000, 0) + // Minimum execution time: 48_076_000 picoseconds. + Weight::from_parts(49_374_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -94,10 +94,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_single_message_proof_with_outbound_lane_state() -> Weight { // Proof Size summary in bytes: - // Measured: `621` + // Measured: `654` // Estimated: `52645` - // Minimum execution time: 42_211_000 picoseconds. - Weight::from_parts(43_454_000, 0) + // Minimum execution time: 42_529_000 picoseconds. + Weight::from_parts(44_536_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -110,10 +110,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) fn receive_single_message_proof_1_kb() -> Weight { // Proof Size summary in bytes: - // Measured: `589` + // Measured: `622` // Estimated: `52645` - // Minimum execution time: 36_072_000 picoseconds. - Weight::from_parts(37_260_000, 0) + // Minimum execution time: 36_101_000 picoseconds. + Weight::from_parts(37_356_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,10 +126,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) fn receive_single_message_proof_16_kb() -> Weight { // Proof Size summary in bytes: - // Measured: `589` + // Measured: `622` // Estimated: `52645` - // Minimum execution time: 66_995_000 picoseconds. - Weight::from_parts(68_661_000, 0) + // Minimum execution time: 70_370_000 picoseconds. + Weight::from_parts(72_054_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -142,10 +142,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgePolkadotBulletinMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_single_message() -> Weight { // Proof Size summary in bytes: - // Measured: `588` + // Measured: `621` // Estimated: `2543` - // Minimum execution time: 25_553_000 picoseconds. - Weight::from_parts(26_205_000, 0) + // Minimum execution time: 25_144_000 picoseconds. + Weight::from_parts(25_876_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -158,10 +158,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgePolkadotBulletinMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { // Proof Size summary in bytes: - // Measured: `588` + // Measured: `621` // Estimated: `2543` - // Minimum execution time: 25_610_000 picoseconds. - Weight::from_parts(26_273_000, 0) + // Minimum execution time: 25_085_000 picoseconds. + Weight::from_parts(25_872_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -174,10 +174,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgePolkadotBulletinMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { // Proof Size summary in bytes: - // Measured: `588` + // Measured: `621` // Estimated: `2543` - // Minimum execution time: 25_651_000 picoseconds. - Weight::from_parts(26_172_000, 0) + // Minimum execution time: 25_181_000 picoseconds. + Weight::from_parts(25_920_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -191,7 +191,7 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) - /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -201,20 +201,20 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) - /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: Some(105506), added: 107981, mode: `MaxEncodedLen`) /// The range of component `i` is `[128, 2048]`. /// The range of component `i` is `[128, 2048]`. fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `780` + // Measured: `813` // Estimated: `52645` - // Minimum execution time: 64_219_000 picoseconds. - Weight::from_parts(65_848_290, 0) + // Minimum execution time: 57_941_000 picoseconds. + Weight::from_parts(59_000_115, 0) .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 43 - .saturating_add(Weight::from_parts(7_577, 0).saturating_mul(i.into())) + // Standard Error: 46 + .saturating_add(Weight::from_parts(8_660, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs index 30ea9eed4a5..e096c40d284 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_bridge_messages` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -51,7 +51,7 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeWestendMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeWestendMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendMessages::InboundLanes` (r:1 w:1) @@ -60,10 +60,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_single_message_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `605` + // Measured: `658` // Estimated: `52645` - // Minimum execution time: 40_349_000 picoseconds. - Weight::from_parts(41_856_000, 0) + // Minimum execution time: 41_848_000 picoseconds. + Weight::from_parts(43_363_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -71,7 +71,7 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeWestendMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeWestendMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendMessages::InboundLanes` (r:1 w:1) @@ -80,10 +80,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_two_messages_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `605` + // Measured: `658` // Estimated: `52645` - // Minimum execution time: 50_514_000 picoseconds. - Weight::from_parts(52_254_000, 0) + // Minimum execution time: 52_674_000 picoseconds. + Weight::from_parts(55_080_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -91,7 +91,7 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeWestendMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeWestendMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendMessages::InboundLanes` (r:1 w:1) @@ -100,10 +100,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_single_message_proof_with_outbound_lane_state() -> Weight { // Proof Size summary in bytes: - // Measured: `605` + // Measured: `658` // Estimated: `52645` - // Minimum execution time: 45_761_000 picoseconds. - Weight::from_parts(47_075_000, 0) + // Minimum execution time: 46_892_000 picoseconds. + Weight::from_parts(49_441_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -111,17 +111,17 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeWestendMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeWestendMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendMessages::InboundLanes` (r:1 w:1) /// Proof: `BridgeWestendMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) fn receive_single_message_proof_1_kb() -> Weight { // Proof Size summary in bytes: - // Measured: `573` + // Measured: `626` // Estimated: `52645` - // Minimum execution time: 39_098_000 picoseconds. - Weight::from_parts(40_577_000, 0) + // Minimum execution time: 41_262_000 picoseconds. + Weight::from_parts(42_734_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -129,17 +129,17 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeWestendMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeWestendMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendMessages::InboundLanes` (r:1 w:1) /// Proof: `BridgeWestendMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) fn receive_single_message_proof_16_kb() -> Weight { // Proof Size summary in bytes: - // Measured: `573` + // Measured: `626` // Estimated: `52645` - // Minimum execution time: 69_120_000 picoseconds. - Weight::from_parts(71_810_000, 0) + // Minimum execution time: 75_654_000 picoseconds. + Weight::from_parts(76_866_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -156,11 +156,11 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_single_message() -> Weight { // Proof Size summary in bytes: - // Measured: `447` - // Estimated: `3912` - // Minimum execution time: 32_325_000 picoseconds. - Weight::from_parts(33_070_000, 0) - .saturating_add(Weight::from_parts(0, 3912)) + // Measured: `501` + // Estimated: `3966` + // Minimum execution time: 32_911_000 picoseconds. + Weight::from_parts(33_644_000, 0) + .saturating_add(Weight::from_parts(0, 3966)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -176,11 +176,11 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { // Proof Size summary in bytes: - // Measured: `447` - // Estimated: `3912` - // Minimum execution time: 32_180_000 picoseconds. - Weight::from_parts(33_202_000, 0) - .saturating_add(Weight::from_parts(0, 3912)) + // Measured: `501` + // Estimated: `3966` + // Minimum execution time: 32_830_000 picoseconds. + Weight::from_parts(33_675_000, 0) + .saturating_add(Weight::from_parts(0, 3966)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -196,10 +196,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { // Proof Size summary in bytes: - // Measured: `447` + // Measured: `501` // Estimated: `6086` - // Minimum execution time: 36_774_000 picoseconds. - Weight::from_parts(37_774_000, 0) + // Minimum execution time: 37_024_000 picoseconds. + Weight::from_parts(38_112_000, 0) .saturating_add(Weight::from_parts(0, 6086)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) @@ -207,7 +207,7 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeWestendMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeWestendMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendMessages::InboundLanes` (r:1 w:1) @@ -215,7 +215,7 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) - /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -225,18 +225,18 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) - /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: Some(105506), added: 107981, mode: `MaxEncodedLen`) /// The range of component `i` is `[128, 2048]`. /// The range of component `i` is `[128, 2048]`. fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `736` + // Measured: `789` // Estimated: `52645` - // Minimum execution time: 65_934_000 picoseconds. - Weight::from_parts(67_915_916, 0) + // Minimum execution time: 60_653_000 picoseconds. + Weight::from_parts(62_358_212, 0) .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 65 - .saturating_add(Weight::from_parts(7_190, 0).saturating_mul(i.into())) + // Standard Error: 57 + .saturating_add(Weight::from_parts(8_660, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs index ea68852804e..af216cd997c 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_bridge_parachains` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -56,20 +56,20 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf /// Proof: `BridgeWestendParachains::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHashes` (r:1 w:1) /// Proof: `BridgeWestendParachains::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) + /// Storage: `BridgeWestendGrandpa::FreeHeadersRemaining` (r:1 w:1) + /// Proof: `BridgeWestendGrandpa::FreeHeadersRemaining` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:0 w:1) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(p: u32, ) -> Weight { + fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `558` // Estimated: `2543` - // Minimum execution time: 31_135_000 picoseconds. - Weight::from_parts(32_061_351, 0) + // Minimum execution time: 35_711_000 picoseconds. + Weight::from_parts(37_344_514, 0) .saturating_add(Weight::from_parts(0, 2543)) - // Standard Error: 80_309 - .saturating_add(Weight::from_parts(99_724, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `BridgeWestendParachains::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeWestendParachains::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) @@ -79,17 +79,19 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf /// Proof: `BridgeWestendParachains::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHashes` (r:1 w:1) /// Proof: `BridgeWestendParachains::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) + /// Storage: `BridgeWestendGrandpa::FreeHeadersRemaining` (r:1 w:1) + /// Proof: `BridgeWestendGrandpa::FreeHeadersRemaining` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:0 w:1) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) fn submit_parachain_heads_with_1kb_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `558` // Estimated: `2543` - // Minimum execution time: 32_263_000 picoseconds. - Weight::from_parts(33_139_000, 0) + // Minimum execution time: 37_717_000 picoseconds. + Weight::from_parts(38_374_000, 0) .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `BridgeWestendParachains::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeWestendParachains::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) @@ -99,16 +101,18 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf /// Proof: `BridgeWestendParachains::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHashes` (r:1 w:1) /// Proof: `BridgeWestendParachains::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) + /// Storage: `BridgeWestendGrandpa::FreeHeadersRemaining` (r:1 w:1) + /// Proof: `BridgeWestendGrandpa::FreeHeadersRemaining` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:0 w:1) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) fn submit_parachain_heads_with_16kb_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `558` // Estimated: `2543` - // Minimum execution time: 61_313_000 picoseconds. - Weight::from_parts(62_200_000, 0) + // Minimum execution time: 70_203_000 picoseconds. + Weight::from_parts(70_994_000, 0) .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs index 5ab4cb900d8..a66a7fb08aa 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_bridge_relayers` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,10 +54,10 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn claim_rewards() -> Weight { // Proof Size summary in bytes: - // Measured: `244` + // Measured: `278` // Estimated: `3593` - // Minimum execution time: 45_393_000 picoseconds. - Weight::from_parts(46_210_000, 0) + // Minimum execution time: 43_669_000 picoseconds. + Weight::from_parts(44_907_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,10 +70,10 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< /// Proof: `Balances::Reserves` (`max_values`: None, `max_size`: Some(1249), added: 3724, mode: `MaxEncodedLen`) fn register() -> Weight { // Proof Size summary in bytes: - // Measured: `97` + // Measured: `131` // Estimated: `4714` - // Minimum execution time: 23_767_000 picoseconds. - Weight::from_parts(24_217_000, 0) + // Minimum execution time: 24_024_000 picoseconds. + Weight::from_parts(24_582_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -84,10 +84,10 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< /// Proof: `Balances::Reserves` (`max_values`: None, `max_size`: Some(1249), added: 3724, mode: `MaxEncodedLen`) fn deregister() -> Weight { // Proof Size summary in bytes: - // Measured: `197` + // Measured: `231` // Estimated: `4714` - // Minimum execution time: 25_745_000 picoseconds. - Weight::from_parts(26_319_000, 0) + // Minimum execution time: 24_522_000 picoseconds. + Weight::from_parts(25_362_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -100,10 +100,10 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn slash_and_deregister() -> Weight { // Proof Size summary in bytes: - // Measured: `300` + // Measured: `334` // Estimated: `4714` - // Minimum execution time: 27_497_000 picoseconds. - Weight::from_parts(27_939_000, 0) + // Minimum execution time: 26_963_000 picoseconds. + Weight::from_parts(27_686_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -112,10 +112,10 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn register_relayer_reward() -> Weight { // Proof Size summary in bytes: - // Measured: `42` + // Measured: `76` // Estimated: `3538` - // Minimum execution time: 5_584_000 picoseconds. - Weight::from_parts(5_908_000, 0) + // Minimum execution time: 5_401_000 picoseconds. + Weight::from_parts(5_563_000, 0) .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs index e98be6ba39b..a9ccb00b1a1 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_bridge_grandpa` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-05-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vicqj8em-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -68,13 +68,13 @@ impl pallet_bridge_grandpa::WeightInfo for WeightInfo pallet_bridge_grandpa::WeightInfo for WeightInfo pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) @@ -60,10 +60,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_single_message_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `502` + // Measured: `522` // Estimated: `52645` - // Minimum execution time: 40_646_000 picoseconds. - Weight::from_parts(41_754_000, 0) + // Minimum execution time: 41_095_000 picoseconds. + Weight::from_parts(42_438_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -71,7 +71,7 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) @@ -80,10 +80,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_two_messages_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `502` + // Measured: `522` // Estimated: `52645` - // Minimum execution time: 50_898_000 picoseconds. - Weight::from_parts(52_743_000, 0) + // Minimum execution time: 51_974_000 picoseconds. + Weight::from_parts(53_444_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -91,7 +91,7 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) @@ -100,10 +100,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_single_message_proof_with_outbound_lane_state() -> Weight { // Proof Size summary in bytes: - // Measured: `502` + // Measured: `522` // Estimated: `52645` - // Minimum execution time: 45_848_000 picoseconds. - Weight::from_parts(47_036_000, 0) + // Minimum execution time: 45_949_000 picoseconds. + Weight::from_parts(47_912_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -111,17 +111,17 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) fn receive_single_message_proof_1_kb() -> Weight { // Proof Size summary in bytes: - // Measured: `433` + // Measured: `453` // Estimated: `52645` - // Minimum execution time: 39_085_000 picoseconds. - Weight::from_parts(41_623_000, 0) + // Minimum execution time: 39_349_000 picoseconds. + Weight::from_parts(40_723_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -129,17 +129,17 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) fn receive_single_message_proof_16_kb() -> Weight { // Proof Size summary in bytes: - // Measured: `433` + // Measured: `453` // Estimated: `52645` - // Minimum execution time: 72_754_000 picoseconds. - Weight::from_parts(74_985_000, 0) + // Minimum execution time: 70_566_000 picoseconds. + Weight::from_parts(73_240_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -156,11 +156,11 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_single_message() -> Weight { // Proof Size summary in bytes: - // Measured: `337` - // Estimated: `3802` - // Minimum execution time: 31_479_000 picoseconds. - Weight::from_parts(32_280_000, 0) - .saturating_add(Weight::from_parts(0, 3802)) + // Measured: `357` + // Estimated: `3822` + // Minimum execution time: 31_381_000 picoseconds. + Weight::from_parts(31_980_000, 0) + .saturating_add(Weight::from_parts(0, 3822)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -176,11 +176,11 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { // Proof Size summary in bytes: - // Measured: `337` - // Estimated: `3802` - // Minimum execution time: 31_807_000 picoseconds. - Weight::from_parts(32_219_000, 0) - .saturating_add(Weight::from_parts(0, 3802)) + // Measured: `357` + // Estimated: `3822` + // Minimum execution time: 31_479_000 picoseconds. + Weight::from_parts(32_220_000, 0) + .saturating_add(Weight::from_parts(0, 3822)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -196,10 +196,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { // Proof Size summary in bytes: - // Measured: `337` + // Measured: `357` // Estimated: `6086` - // Minimum execution time: 36_450_000 picoseconds. - Weight::from_parts(37_288_000, 0) + // Minimum execution time: 35_724_000 picoseconds. + Weight::from_parts(36_460_000, 0) .saturating_add(Weight::from_parts(0, 6086)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) @@ -207,7 +207,7 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) @@ -215,7 +215,7 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) - /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -225,17 +225,17 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) - /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: Some(105506), added: 107981, mode: `MaxEncodedLen`) /// The range of component `i` is `[128, 2048]`. fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `633` + // Measured: `653` // Estimated: `52645` - // Minimum execution time: 67_047_000 picoseconds. - Weight::from_parts(68_717_105, 0) + // Minimum execution time: 60_476_000 picoseconds. + Weight::from_parts(61_832_928, 0) .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 138 - .saturating_add(Weight::from_parts(8_056, 0).saturating_mul(i.into())) + // Standard Error: 73 + .saturating_add(Weight::from_parts(7_951, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs index 9819bd40654..82764a48b48 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_bridge_parachains` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -56,18 +56,22 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf /// Proof: `BridgeRococoParachains::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHashes` (r:1 w:1) /// Proof: `BridgeRococoParachains::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoGrandpa::FreeHeadersRemaining` (r:1 w:1) + /// Proof: `BridgeRococoGrandpa::FreeHeadersRemaining` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:0 w:1) /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { + fn submit_parachain_heads_with_n_parachains(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `291` + // Measured: `315` // Estimated: `2543` - // Minimum execution time: 29_994_000 picoseconds. - Weight::from_parts(31_005_636, 0) + // Minimum execution time: 34_408_000 picoseconds. + Weight::from_parts(35_467_881, 0) .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + // Standard Error: 100_493 + .saturating_add(Weight::from_parts(63_859, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `BridgeRococoParachains::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeRococoParachains::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) @@ -77,17 +81,19 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf /// Proof: `BridgeRococoParachains::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHashes` (r:1 w:1) /// Proof: `BridgeRococoParachains::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoGrandpa::FreeHeadersRemaining` (r:1 w:1) + /// Proof: `BridgeRococoGrandpa::FreeHeadersRemaining` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:0 w:1) /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) fn submit_parachain_heads_with_1kb_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `291` + // Measured: `315` // Estimated: `2543` - // Minimum execution time: 31_425_000 picoseconds. - Weight::from_parts(32_163_000, 0) + // Minimum execution time: 36_125_000 picoseconds. + Weight::from_parts(36_703_000, 0) .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `BridgeRococoParachains::PalletOperatingMode` (r:1 w:0) /// Proof: `BridgeRococoParachains::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) @@ -97,16 +103,18 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf /// Proof: `BridgeRococoParachains::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHashes` (r:1 w:1) /// Proof: `BridgeRococoParachains::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoGrandpa::FreeHeadersRemaining` (r:1 w:1) + /// Proof: `BridgeRococoGrandpa::FreeHeadersRemaining` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:0 w:1) /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) fn submit_parachain_heads_with_16kb_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `291` + // Measured: `315` // Estimated: `2543` - // Minimum execution time: 60_062_000 picoseconds. - Weight::from_parts(61_201_000, 0) + // Minimum execution time: 64_697_000 picoseconds. + Weight::from_parts(68_015_000, 0) .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs index ed96f0cd87c..7e3f3f3d723 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_bridge_relayers` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -56,8 +56,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `207` // Estimated: `3593` - // Minimum execution time: 45_732_000 picoseconds. - Weight::from_parts(46_282_000, 0) + // Minimum execution time: 43_291_000 picoseconds. + Weight::from_parts(44_118_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -72,8 +72,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `61` // Estimated: `4714` - // Minimum execution time: 22_934_000 picoseconds. - Weight::from_parts(23_531_000, 0) + // Minimum execution time: 23_286_000 picoseconds. + Weight::from_parts(23_823_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -86,8 +86,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `160` // Estimated: `4714` - // Minimum execution time: 25_187_000 picoseconds. - Weight::from_parts(25_679_000, 0) + // Minimum execution time: 24_145_000 picoseconds. + Weight::from_parts(24_541_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -102,8 +102,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `263` // Estimated: `4714` - // Minimum execution time: 27_015_000 picoseconds. - Weight::from_parts(27_608_000, 0) + // Minimum execution time: 26_707_000 picoseconds. + Weight::from_parts(27_266_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -114,8 +114,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `6` // Estimated: `3538` - // Minimum execution time: 5_207_000 picoseconds. - Weight::from_parts(5_394_000, 0) + // Minimum execution time: 4_850_000 picoseconds. + Weight::from_parts(5_116_000, 0) .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) -- GitLab From de41ae85ec600189c4621aaf9e58afc612f101f7 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 27 Jun 2024 17:45:29 +0200 Subject: [PATCH 068/130] chore(deps): upgrade prometheous server to hyper v1 (#4898) Partly fixes https://github.com/paritytech/polkadot-sdk/pull/4890#discussion_r1655548633 Still the offchain API needs to be updated to hyper v1.0 and I opened an issue for it, it's using low-level http body features that have been removed --- Cargo.lock | 30 +++--- Cargo.toml | 12 ++- polkadot/node/metrics/Cargo.toml | 4 +- polkadot/node/metrics/src/tests.rs | 14 ++- substrate/client/offchain/Cargo.toml | 2 +- substrate/client/offchain/src/api/http.rs | 2 + substrate/utils/prometheus/Cargo.toml | 8 +- substrate/utils/prometheus/src/lib.rs | 107 +++++++++++----------- 8 files changed, 102 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 753857e9ba8..7796a2d2cf2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6855,9 +6855,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", @@ -6870,7 +6870,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite 0.2.12", - "socket2 0.4.9", + "socket2 0.5.7", "tokio", "tower-service", "tracing", @@ -6900,13 +6900,13 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.9", - "hyper 0.14.27", + "hyper 0.14.29", "log", "rustls 0.21.7", "rustls-native-certs 0.6.3", @@ -7036,7 +7036,7 @@ dependencies = [ "bytes", "futures", "http 0.2.9", - "hyper 0.14.27", + "hyper 0.14.29", "log", "rand", "tokio", @@ -13700,7 +13700,9 @@ dependencies = [ "bs58 0.5.0", "futures", "futures-timer", - "hyper 0.14.27", + "http-body-util", + "hyper 1.3.1", + "hyper-util", "log", "parity-scale-codec", "polkadot-primitives", @@ -16322,8 +16324,8 @@ dependencies = [ "h2 0.3.26", "http 0.2.9", "http-body 0.4.5", - "hyper 0.14.27", - "hyper-rustls 0.24.1", + "hyper 0.14.29", + "hyper-rustls 0.24.2", "ipnet", "js-sys", "log", @@ -18063,8 +18065,8 @@ dependencies = [ "fnv", "futures", "futures-timer", - "hyper 0.14.27", - "hyper-rustls 0.24.1", + "hyper 0.14.29", + "hyper-rustls 0.24.2", "lazy_static", "log", "num_cpus", @@ -21396,7 +21398,9 @@ dependencies = [ name = "substrate-prometheus-endpoint" version = "0.17.0" dependencies = [ - "hyper 0.14.27", + "http-body-util", + "hyper 1.3.1", + "hyper-util", "log", "prometheus", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index 54ab9c37583..db9a2bd7227 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -779,10 +779,14 @@ hex-literal = { version = "0.4.1", default-features = false } hkdf = { version = "0.12.0" } hmac = { version = "0.12.1" } honggfuzz = { version = "0.5.55" } -http = { version = "1.1.0" } -http-body-util = { version = "0.1.2" } -hyper = { version = "0.14.27", default-features = false } -hyper-rustls = { version = "0.24.0" } +http = { version = "1.1" } +http-body = { version = "1", default-features = false } +http-body-util = { version = "0.1.2", default-features = false } +hyper = { version = "1.3.1", default-features = false } +hyper-rustls = { version = "0.24.2" } +hyper-util = { version = "0.1.5", default-features = false } +# TODO: remove hyper v0.14 https://github.com/paritytech/polkadot-sdk/issues/4896 +hyperv14 = { package = "hyper", version = "0.14.29", default-features = false } impl-serde = { version = "0.4.0", default-features = false } impl-trait-for-tuples = { version = "0.2.2" } indexmap = { version = "2.0.0" } diff --git a/polkadot/node/metrics/Cargo.toml b/polkadot/node/metrics/Cargo.toml index f4ffbaf1949..41b08b66e9b 100644 --- a/polkadot/node/metrics/Cargo.toml +++ b/polkadot/node/metrics/Cargo.toml @@ -29,7 +29,9 @@ log = { workspace = true, default-features = true } [dev-dependencies] assert_cmd = { workspace = true } tempfile = { workspace = true } -hyper = { features = ["http1", "tcp"], workspace = true } +hyper-util = { features = ["client-legacy", "tokio"], workspace = true } +hyper = { workspace = true } +http-body-util = { workspace = true } tokio = { workspace = true, default-features = true } polkadot-test-service = { features = ["runtime-metrics"], workspace = true } substrate-test-utils = { workspace = true } diff --git a/polkadot/node/metrics/src/tests.rs b/polkadot/node/metrics/src/tests.rs index fde7c314413..e720924feb6 100644 --- a/polkadot/node/metrics/src/tests.rs +++ b/polkadot/node/metrics/src/tests.rs @@ -16,7 +16,9 @@ //! Polkadot runtime metrics integration test. -use hyper::{Client, Uri}; +use http_body_util::BodyExt; +use hyper::Uri; +use hyper_util::{client::legacy::Client, rt::TokioExecutor}; use polkadot_primitives::metric_definitions::PARACHAIN_INHERENT_DATA_BITFIELDS_PROCESSED; use polkadot_test_service::{node_config, run_validator_node, test_prometheus_config}; use sp_keyring::AccountKeyring::*; @@ -66,14 +68,20 @@ async fn runtime_can_publish_metrics() { } async fn scrape_prometheus_metrics(metrics_uri: &str) -> HashMap { - let res = Client::new() + let res = Client::builder(TokioExecutor::new()) + .build_http::>() .get(Uri::try_from(metrics_uri).expect("bad URI")) .await .expect("GET request failed"); // Retrieve the `HTTP` response body. let body = String::from_utf8( - hyper::body::to_bytes(res).await.expect("can't get body as bytes").to_vec(), + res.into_body() + .collect() + .await + .expect("can't get body as bytes") + .to_bytes() + .to_vec(), ) .expect("body is not an UTF8 string"); diff --git a/substrate/client/offchain/Cargo.toml b/substrate/client/offchain/Cargo.toml index 5046808f013..12e017317b2 100644 --- a/substrate/client/offchain/Cargo.toml +++ b/substrate/client/offchain/Cargo.toml @@ -22,7 +22,7 @@ codec = { features = ["derive"], workspace = true, default-features = true } fnv = { workspace = true } futures = { workspace = true } futures-timer = { workspace = true } -hyper = { features = ["http2", "stream"], workspace = true, default-features = true } +hyperv14 = { features = ["http2", "stream"], workspace = true, default-features = true } hyper-rustls = { features = ["http2"], workspace = true } num_cpus = { workspace = true } once_cell = { workspace = true } diff --git a/substrate/client/offchain/src/api/http.rs b/substrate/client/offchain/src/api/http.rs index 46f573341c5..fda5728b0d0 100644 --- a/substrate/client/offchain/src/api/http.rs +++ b/substrate/client/offchain/src/api/http.rs @@ -27,6 +27,8 @@ //! (i.e.: the socket should continue being processed) in the background even if the runtime isn't //! actively calling any function. +use hyperv14 as hyper; + use crate::api::timestamp; use bytes::buf::{Buf, Reader}; use fnv::FnvHashMap; diff --git a/substrate/utils/prometheus/Cargo.toml b/substrate/utils/prometheus/Cargo.toml index 4b566c79ff9..9f5516cd8d7 100644 --- a/substrate/utils/prometheus/Cargo.toml +++ b/substrate/utils/prometheus/Cargo.toml @@ -16,12 +16,14 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -hyper = { features = ["http1", "server", "tcp"], workspace = true } +http-body-util = { workspace = true } +hyper = { features = ["http1", "server"], workspace = true } +hyper-util = { features = ["server-auto", "tokio"], workspace = true } log = { workspace = true, default-features = true } prometheus = { workspace = true } thiserror = { workspace = true } tokio = { features = ["parking_lot"], workspace = true, default-features = true } [dev-dependencies] -hyper = { features = ["client"], workspace = true, default-features = true } -tokio = { features = ["rt-multi-thread"], workspace = true, default-features = true } +hyper-util = { features = ["client-legacy", "tokio"], workspace = true, default-features = true } +tokio = { features = ["macros", "rt-multi-thread"], workspace = true, default-features = true } diff --git a/substrate/utils/prometheus/src/lib.rs b/substrate/utils/prometheus/src/lib.rs index ed1f9137aec..7a8c6559060 100644 --- a/substrate/utils/prometheus/src/lib.rs +++ b/substrate/utils/prometheus/src/lib.rs @@ -15,12 +15,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -use hyper::{ - http::StatusCode, - server::Server, - service::{make_service_fn, service_fn}, - Body, Request, Response, -}; +mod sourced; + +use hyper::{http::StatusCode, Request, Response}; +use prometheus::{core::Collector, Encoder, TextEncoder}; +use std::net::SocketAddr; + pub use prometheus::{ self, core::{ @@ -30,13 +30,10 @@ pub use prometheus::{ exponential_buckets, Error as PrometheusError, Histogram, HistogramOpts, HistogramVec, Opts, Registry, }; -use prometheus::{core::Collector, Encoder, TextEncoder}; -use std::net::SocketAddr; - -mod sourced; - pub use sourced::{MetricSource, SourcedCounter, SourcedGauge, SourcedMetric}; +type Body = http_body_util::Full; + pub fn register( metric: T, registry: &Registry, @@ -63,7 +60,10 @@ pub enum Error { PortInUse(SocketAddr), } -async fn request_metrics(req: Request, registry: Registry) -> Result, Error> { +async fn request_metrics( + req: Request, + registry: Registry, +) -> Result, Error> { if req.uri().path() == "/metrics" { let metric_families = registry.gather(); let mut buffer = vec![]; @@ -98,46 +98,49 @@ async fn init_prometheus_with_listener( listener: tokio::net::TcpListener, registry: Registry, ) -> Result<(), Error> { - let listener = hyper::server::conn::AddrIncoming::from_listener(listener)?; - log::info!("〽️ Prometheus exporter started at {}", listener.local_addr()); - - let service = make_service_fn(move |_| { - let registry = registry.clone(); - - async move { - Ok::<_, hyper::Error>(service_fn(move |req: Request| { - request_metrics(req, registry.clone()) - })) - } - }); + log::info!(target: "prometheus", "〽️ Prometheus exporter started at {}", listener.local_addr()?); - let (signal, on_exit) = tokio::sync::oneshot::channel::<()>(); - let server = Server::builder(listener).serve(service).with_graceful_shutdown(async { - let _ = on_exit.await; - }); + let server = hyper_util::server::conn::auto::Builder::new(hyper_util::rt::TokioExecutor::new()); - let result = server.await.map_err(Into::into); + loop { + let io = match listener.accept().await { + Ok((sock, _)) => hyper_util::rt::TokioIo::new(sock), + Err(e) => { + log::debug!(target: "prometheus", "Error accepting connection: {:?}", e); + continue; + }, + }; - // Gracefully shutdown server, otherwise the server does not stop if it has open connections - let _ = signal.send(()); + let registry = registry.clone(); - result + let conn = server + .serve_connection_with_upgrades( + io, + hyper::service::service_fn(move |req| request_metrics(req, registry.clone())), + ) + .into_owned(); + + tokio::spawn(async move { + if let Err(err) = conn.await { + log::debug!(target: "prometheus", "connection error: {:?}", err); + } + }); + } } #[cfg(test)] mod tests { use super::*; - use hyper::{Client, Uri}; - - #[test] - fn prometheus_works() { - const METRIC_NAME: &str = "test_test_metric_name_test_test"; + use http_body_util::BodyExt; + use hyper::Uri; + use hyper_util::{client::legacy::Client, rt::TokioExecutor}; - let runtime = tokio::runtime::Runtime::new().expect("Creates the runtime"); + const METRIC_NAME: &str = "test_test_metric_name_test_test"; - let listener = runtime - .block_on(tokio::net::TcpListener::bind("127.0.0.1:0")) - .expect("Creates listener"); + #[tokio::test] + async fn prometheus_works() { + let listener = + tokio::net::TcpListener::bind("127.0.0.1:0").await.expect("Creates listener"); let local_addr = listener.local_addr().expect("Returns the local addr"); @@ -148,20 +151,20 @@ mod tests { ) .expect("Registers the test metric"); - runtime.spawn(init_prometheus_with_listener(listener, registry)); + tokio::spawn(init_prometheus_with_listener(listener, registry)); - runtime.block_on(async { - let client = Client::new(); + let client = Client::builder(TokioExecutor::new()).build_http::(); - let res = client - .get(Uri::try_from(&format!("http://{}/metrics", local_addr)).expect("Parses URI")) - .await - .expect("Requests metrics"); + let res = client + .get(Uri::try_from(&format!("http://{}/metrics", local_addr)).expect("Parses URI")) + .await + .expect("Requests metrics"); - let buf = hyper::body::to_bytes(res).await.expect("Converts body to bytes"); + assert!(res.status().is_success()); - let body = String::from_utf8(buf.to_vec()).expect("Converts body to String"); - assert!(body.contains(&format!("{} 0", METRIC_NAME))); - }); + let buf = res.into_body().collect().await.expect("Failed to read HTTP body").to_bytes(); + let body = String::from_utf8(buf.to_vec()).expect("Converts body to String"); + + assert!(body.contains(&format!("{} 0", METRIC_NAME))); } } -- GitLab From 18a6a56cf35590062792a7122404a1ca09ab7fe8 Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Fri, 28 Jun 2024 09:02:30 +0300 Subject: [PATCH 069/130] Add `Runtime::OmniNode` variant to `polkadot-parachain` (#4805) Adding `Runtime::OmniNode` variant + small changes --------- Co-authored-by: kianenigma --- cumulus/polkadot-parachain/src/cli.rs | 33 +- cumulus/polkadot-parachain/src/command.rs | 366 +++++++++++++--------- cumulus/polkadot-parachain/src/main.rs | 25 +- 3 files changed, 253 insertions(+), 171 deletions(-) diff --git a/cumulus/polkadot-parachain/src/cli.rs b/cumulus/polkadot-parachain/src/cli.rs index fa4b4da1ba9..3f8a2ec0d11 100644 --- a/cumulus/polkadot-parachain/src/cli.rs +++ b/cumulus/polkadot-parachain/src/cli.rs @@ -14,7 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use clap::{CommandFactory, FromArgMatches}; +use clap::{Command, CommandFactory, FromArgMatches}; +use sc_cli::SubstrateCli; use std::path::PathBuf; /// Sub-commands supported by the collator. @@ -58,22 +59,13 @@ pub enum Subcommand { Benchmark(frame_benchmarking_cli::BenchmarkCmd), } -const AFTER_HELP_EXAMPLE: &str = color_print::cstr!( - r#"Examples: - polkadot-parachain --chain asset-hub-polkadot --sync warp -- --chain polkadot --sync warp - Launch a warp-syncing full node of the Asset Hub parachain on the Polkadot Relay Chain. - polkadot-parachain --chain asset-hub-polkadot --sync warp --relay-chain-rpc-url ws://rpc.example.com -- --chain polkadot - Launch a warp-syncing full node of the Asset Hub parachain on the Polkadot Relay Chain. - Uses ws://rpc.example.com as remote relay chain node. - "# -); #[derive(Debug, clap::Parser)] #[command( propagate_version = true, args_conflicts_with_subcommands = true, - subcommand_negates_reqs = true + subcommand_negates_reqs = true, + after_help = crate::examples(Self::executable_name()) )] -#[clap(after_help = AFTER_HELP_EXAMPLE)] pub struct Cli { #[command(subcommand)] pub subcommand: Option, @@ -93,7 +85,7 @@ pub struct Cli { /// Relay chain arguments #[arg(raw = true)] - pub relaychain_args: Vec, + pub relay_chain_args: Vec, } #[derive(Debug)] @@ -109,12 +101,25 @@ pub struct RelayChainCli { } impl RelayChainCli { + fn polkadot_cmd() -> Command { + let help_template = color_print::cformat!( + "The arguments that are passed to the relay chain node. \n\ + \n\ + RELAY_CHAIN_ARGS: \n\ + {{options}}", + ); + + polkadot_cli::RunCmd::command() + .no_binary_name(true) + .help_template(help_template) + } + /// Parse the relay chain CLI parameters using the parachain `Configuration`. pub fn new<'a>( para_config: &sc_service::Configuration, relay_chain_args: impl Iterator, ) -> Self { - let polkadot_cmd = polkadot_cli::RunCmd::command().no_binary_name(true); + let polkadot_cmd = Self::polkadot_cmd(); let matches = polkadot_cmd.get_matches_from(relay_chain_args); let base = FromArgMatches::from_arg_matches(&matches).unwrap_or_else(|e| e.exit()); diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index 6b3f4b4cd0a..aa75b6b6ae3 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -36,25 +36,35 @@ use sc_service::config::{BasePath, PrometheusConfig}; use sp_runtime::traits::AccountIdConversion; use std::{net::SocketAddr, path::PathBuf}; +/// The choice of consensus for the parachain omni-node. +#[derive(PartialEq, Eq, Debug, Default)] +pub enum Consensus { + /// Aura consensus. + #[default] + Aura, + /// Use the relay chain consensus. + // TODO: atm this is just a demonstration, not really reach-able. We can add it to the CLI, + // env, or the chain spec. Or, just don't, and when we properly refactor this mess we will + // re-introduce it. + #[allow(unused)] + Relay, +} + /// Helper enum that is used for better distinction of different parachain/runtime configuration /// (it is based/calculated on ChainSpec's ID attribute) -#[derive(Debug, PartialEq, Default)] +#[derive(Debug, PartialEq)] enum Runtime { - /// This is the default runtime (actually based on rococo) - #[default] - Default, + /// None of the system-chain runtimes, rather the node will act agnostic to the runtime ie. be + /// an omni-node, and simply run a node with the given consensus algorithm. + Omni(Consensus), Shell, Seedling, AssetHubPolkadot, - AssetHubKusama, - AssetHubRococo, - AssetHubWestend, + AssetHub, Penpal(ParaId), ContractsRococo, - CollectivesPolkadot, - CollectivesWestend, + Collectives, Glutton, - GluttonWestend, BridgeHub(chain_spec::bridge_hubs::BridgeHubRuntimeType), Coretime(chain_spec::coretime::CoretimeRuntimeType), People(chain_spec::people::PeopleRuntimeType), @@ -97,20 +107,19 @@ fn runtime(id: &str) -> Runtime { Runtime::Seedling } else if id.starts_with("asset-hub-polkadot") | id.starts_with("statemint") { Runtime::AssetHubPolkadot - } else if id.starts_with("asset-hub-kusama") | id.starts_with("statemine") { - Runtime::AssetHubKusama - } else if id.starts_with("asset-hub-rococo") { - Runtime::AssetHubRococo - } else if id.starts_with("asset-hub-westend") | id.starts_with("westmint") { - Runtime::AssetHubWestend + } else if id.starts_with("asset-hub-kusama") | + id.starts_with("statemine") | + id.starts_with("asset-hub-rococo") | + id.starts_with("asset-hub-westend") | + id.starts_with("westmint") + { + Runtime::AssetHub } else if id.starts_with("penpal") { Runtime::Penpal(para_id.unwrap_or(ParaId::new(0))) } else if id.starts_with("contracts-rococo") { Runtime::ContractsRococo - } else if id.starts_with("collectives-polkadot") { - Runtime::CollectivesPolkadot - } else if id.starts_with("collectives-westend") { - Runtime::CollectivesWestend + } else if id.starts_with("collectives-polkadot") || id.starts_with("collectives-westend") { + Runtime::Collectives } else if id.starts_with(chain_spec::bridge_hubs::BridgeHubRuntimeType::ID_PREFIX) { Runtime::BridgeHub( id.parse::() @@ -120,15 +129,17 @@ fn runtime(id: &str) -> Runtime { Runtime::Coretime( id.parse::().expect("Invalid value"), ) - } else if id.starts_with("glutton-westend") { - Runtime::GluttonWestend } else if id.starts_with("glutton") { Runtime::Glutton } else if id.starts_with(chain_spec::people::PeopleRuntimeType::ID_PREFIX) { Runtime::People(id.parse::().expect("Invalid value")) } else { - log::warn!("No specific runtime was recognized for ChainSpec's id: '{}', so Runtime::default() will be used", id); - Runtime::default() + log::warn!( + "No specific runtime was recognized for ChainSpec's id: '{}', \ + so Runtime::Omni(Consensus::Aura) will be used", + id + ); + Runtime::Omni(Consensus::Aura) } } @@ -274,55 +285,34 @@ fn load_spec(id: &str) -> std::result::Result, String> { /// (H/T to Phala for the idea) /// E.g. "penpal-kusama-2004" yields ("penpal-kusama", Some(2004)) fn extract_parachain_id(id: &str) -> (&str, &str, Option) { - const ROCOCO_TEST_PARA_PREFIX: &str = "penpal-rococo-"; - const KUSAMA_TEST_PARA_PREFIX: &str = "penpal-kusama-"; - const POLKADOT_TEST_PARA_PREFIX: &str = "penpal-polkadot-"; - - const GLUTTON_PARA_DEV_PREFIX: &str = "glutton-kusama-dev-"; - const GLUTTON_PARA_LOCAL_PREFIX: &str = "glutton-kusama-local-"; - const GLUTTON_PARA_GENESIS_PREFIX: &str = "glutton-kusama-genesis-"; - - const GLUTTON_WESTEND_PARA_DEV_PREFIX: &str = "glutton-westend-dev-"; - const GLUTTON_WESTEND_PARA_LOCAL_PREFIX: &str = "glutton-westend-local-"; - const GLUTTON_WESTEND_PARA_GENESIS_PREFIX: &str = "glutton-westend-genesis-"; - - let (norm_id, orig_id, para) = if let Some(suffix) = id.strip_prefix(ROCOCO_TEST_PARA_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..ROCOCO_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(KUSAMA_TEST_PARA_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..KUSAMA_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(POLKADOT_TEST_PARA_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..POLKADOT_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(GLUTTON_PARA_DEV_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..GLUTTON_PARA_DEV_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(GLUTTON_PARA_LOCAL_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..GLUTTON_PARA_LOCAL_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(GLUTTON_PARA_GENESIS_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..GLUTTON_PARA_GENESIS_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(GLUTTON_WESTEND_PARA_DEV_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..GLUTTON_WESTEND_PARA_DEV_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(GLUTTON_WESTEND_PARA_LOCAL_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..GLUTTON_WESTEND_PARA_LOCAL_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(GLUTTON_WESTEND_PARA_GENESIS_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..GLUTTON_WESTEND_PARA_GENESIS_PREFIX.len() - 1], id, Some(para_id)) - } else { - (id, id, None) - }; + let para_prefixes = [ + // Penpal + "penpal-rococo-", + "penpal-kusama-", + "penpal-polkadot-", + // Glutton Kusama + "glutton-kusama-dev-", + "glutton-kusama-local-", + "glutton-kusama-genesis-", + // Glutton Westend + "glutton-westend-dev-", + "glutton-westend-local-", + "glutton-westend-genesis-", + ]; + + for para_prefix in para_prefixes { + if let Some(suffix) = id.strip_prefix(para_prefix) { + let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); + return (&id[..para_prefix.len() - 1], id, Some(para_id.into())) + } + } - (norm_id, orig_id, para.map(Into::into)) + (id, id, None) } impl SubstrateCli for Cli { fn impl_name() -> String { - "Polkadot parachain".into() + Self::executable_name() } fn impl_version() -> String { @@ -331,10 +321,12 @@ impl SubstrateCli for Cli { fn description() -> String { format!( - "Polkadot parachain\n\nThe command-line arguments provided first will be \ - passed to the parachain node, while the arguments provided after -- will be passed \ - to the relaychain node.\n\n\ - {} [parachain-args] -- [relaychain-args]", + "The command-line arguments provided first will be passed to the parachain node, \n\ + and the arguments provided after -- will be passed to the relay chain node. \n\ + \n\ + Example: \n\ + \n\ + {} [parachain-args] -- [relay-chain-args]", Self::executable_name() ) } @@ -358,33 +350,27 @@ impl SubstrateCli for Cli { impl SubstrateCli for RelayChainCli { fn impl_name() -> String { - "Polkadot parachain".into() + Cli::impl_name() } fn impl_version() -> String { - env!("SUBSTRATE_CLI_IMPL_VERSION").into() + Cli::impl_version() } fn description() -> String { - format!( - "Polkadot parachain\n\nThe command-line arguments provided first will be \ - passed to the parachain node, while the arguments provided after -- will be passed \ - to the relay chain node.\n\n\ - {} [parachain-args] -- [relay_chain-args]", - Self::executable_name() - ) + Cli::description() } fn author() -> String { - env!("CARGO_PKG_AUTHORS").into() + Cli::author() } fn support_url() -> String { - "https://github.com/paritytech/polkadot-sdk/issues/new".into() + Cli::support_url() } fn copyright_start_year() -> i32 { - 2017 + Cli::copyright_start_year() } fn load_spec(&self, id: &str) -> std::result::Result, String> { @@ -403,12 +389,9 @@ macro_rules! construct_partials { )?; $code }, - Runtime::AssetHubKusama | - Runtime::AssetHubRococo | - Runtime::AssetHubWestend | + Runtime::AssetHub | Runtime::BridgeHub(_) | - Runtime::CollectivesPolkadot | - Runtime::CollectivesWestend | + Runtime::Collectives | Runtime::Coretime(_) | Runtime::People(_) => { let $partials = new_partial::( @@ -417,20 +400,36 @@ macro_rules! construct_partials { )?; $code }, - Runtime::GluttonWestend | Runtime::Glutton | Runtime::Shell | Runtime::Seedling => { + Runtime::Glutton | Runtime::Shell | Runtime::Seedling => { let $partials = new_partial::( &$config, crate::service::build_shell_import_queue, )?; $code }, - Runtime::ContractsRococo | Runtime::Penpal(_) | Runtime::Default => { + Runtime::ContractsRococo | Runtime::Penpal(_) => { let $partials = new_partial::( &$config, crate::service::build_aura_import_queue, )?; $code }, + Runtime::Omni(consensus) => match consensus { + Consensus::Aura => { + let $partials = new_partial::( + &$config, + crate::service::build_aura_import_queue, + )?; + $code + }, + Consensus::Relay => { + let $partials = new_partial::( + &$config, + crate::service::build_shell_import_queue, + )?; + $code + }, + }, } }; } @@ -449,12 +448,9 @@ macro_rules! construct_async_run { { $( $code )* }.map(|v| (v, task_manager)) }) }, - Runtime::AssetHubKusama | - Runtime::AssetHubRococo | - Runtime::AssetHubWestend | + Runtime::AssetHub | Runtime::BridgeHub(_) | - Runtime::CollectivesPolkadot | - Runtime::CollectivesWestend | + Runtime::Collectives | Runtime::Coretime(_) | Runtime::People(_) => { runner.async_run(|$config| { @@ -468,7 +464,6 @@ macro_rules! construct_async_run { }, Runtime::Shell | Runtime::Seedling | - Runtime::GluttonWestend | Runtime::Glutton => { runner.async_run(|$config| { let $components = new_partial::( @@ -479,7 +474,7 @@ macro_rules! construct_async_run { { $( $code )* }.map(|v| (v, task_manager)) }) } - Runtime::ContractsRococo | Runtime::Penpal(_) | Runtime::Default => { + Runtime::ContractsRococo | Runtime::Penpal(_) => { runner.async_run(|$config| { let $components = new_partial::< RuntimeApi, @@ -492,6 +487,35 @@ macro_rules! construct_async_run { { $( $code )* }.map(|v| (v, task_manager)) }) }, + Runtime::Omni(consensus) => match consensus { + Consensus::Aura => { + runner.async_run(|$config| { + let $components = new_partial::< + RuntimeApi, + _, + >( + &$config, + crate::service::build_aura_import_queue, + )?; + let task_manager = $components.task_manager; + { $( $code )* }.map(|v| (v, task_manager)) + }) + }, + Consensus::Relay + => { + runner.async_run(|$config| { + let $components = new_partial::< + RuntimeApi, + _, + >( + &$config, + crate::service::build_shell_import_queue, + )?; + let task_manager = $components.task_manager; + { $( $code )* }.map(|v| (v, task_manager)) + }) + }, + } } }} } @@ -530,7 +554,7 @@ pub fn run() -> Result<()> { }), Some(Subcommand::PurgeChain(cmd)) => { let runner = cli.create_runner(cmd)?; - let polkadot_cli = RelayChainCli::new(runner.config(), cli.relaychain_args.iter()); + let polkadot_cli = RelayChainCli::new(runner.config(), cli.relay_chain_args.iter()); runner.sync_run(|config| { let polkadot_config = SubstrateCli::create_configuration( @@ -599,7 +623,7 @@ pub fn run() -> Result<()> { Some(Subcommand::Key(cmd)) => Ok(cmd.run(&cli)?), None => { let runner = cli.create_runner(&cli.run.normalize())?; - let polkadot_cli = RelayChainCli::new(runner.config(), cli.relaychain_args.iter()); + let polkadot_cli = RelayChainCli::new(runner.config(), cli.relay_chain_args.iter()); let collator_options = cli.run.collator_options(); runner.run_node_until_exit(|config| async move { @@ -655,9 +679,9 @@ pub fn run() -> Result<()> { SubstrateCli::create_configuration(&polkadot_cli, &polkadot_cli, tokio_handle) .map_err(|err| format!("Relay chain argument error: {}", err))?; - info!("Parachain id: {:?}", id); - info!("Parachain Account: {}", parachain_account); - info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); + info!("🪪 Parachain id: {:?}", id); + info!("🧾 Parachain Account: {}", parachain_account); + info!("✍️ Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); match config.network.network_backend { sc_network::config::NetworkBackendType::Libp2p => @@ -701,29 +725,25 @@ async fn start_node>( .map(|r| r.0) .map_err(Into::into), - Runtime::AssetHubRococo | Runtime::AssetHubWestend | Runtime::AssetHubKusama => - crate::service::start_asset_hub_lookahead_node::( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), + Runtime::AssetHub => crate::service::start_asset_hub_lookahead_node::< + RuntimeApi, + AuraId, + Network, + >(config, polkadot_config, collator_options, id, hwbench) + .await + .map(|r| r.0) + .map_err(Into::into), - Runtime::CollectivesWestend | Runtime::CollectivesPolkadot => - crate::service::start_generic_aura_lookahead_node::( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), + Runtime::Collectives => crate::service::start_generic_aura_lookahead_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), Runtime::Seedling | Runtime::Shell => crate::service::start_shell_node::( config, @@ -793,29 +813,27 @@ async fn start_node>( } .map_err(Into::into), - Runtime::Penpal(_) | Runtime::Default => - crate::service::start_rococo_parachain_node::( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), + Runtime::Penpal(_) => crate::service::start_rococo_parachain_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), - Runtime::Glutton | Runtime::GluttonWestend => - crate::service::start_basic_lookahead_node::( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), + Runtime::Glutton => crate::service::start_basic_lookahead_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), Runtime::People(people_runtime_type) => match people_runtime_type { chain_spec::people::PeopleRuntimeType::Kusama | @@ -839,6 +857,30 @@ async fn start_node>( .map(|r| r.0), } .map_err(Into::into), + Runtime::Omni(consensus) => match consensus { + // rococo actually uses aura import and consensus, unlike most system chains that use + // relay to aura. + Consensus::Aura => crate::service::start_rococo_parachain_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), + Consensus::Relay => crate::service::start_shell_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), + }, } } @@ -971,7 +1013,7 @@ impl CliConfiguration for RelayChainCli { mod tests { use crate::{ chain_spec::{get_account_id_from_seed, get_from_seed}, - command::{Runtime, RuntimeResolver}, + command::{Consensus, Runtime, RuntimeResolver}, }; use sc_chain_spec::{ChainSpec, ChainSpecExtension, ChainSpecGroup, ChainType, Extension}; use serde::{Deserialize, Serialize}; @@ -998,9 +1040,9 @@ mod tests { pub attribute_z: u32, } - fn store_configuration(dir: &TempDir, spec: Box) -> PathBuf { + fn store_configuration(dir: &TempDir, spec: &dyn ChainSpec) -> PathBuf { let raw_output = true; - let json = sc_service::chain_ops::build_spec(&*spec, raw_output) + let json = sc_service::chain_ops::build_spec(spec, raw_output) .expect("Failed to build json string"); let mut cfg_file_path = dir.path().to_path_buf(); cfg_file_path.push(spec.id()); @@ -1041,32 +1083,44 @@ mod tests { let path = store_configuration( &temp_dir, - Box::new(create_default_with_extensions("shell-1", Extensions1::default())), + &create_default_with_extensions("shell-1", Extensions1::default()), ); assert_eq!(Runtime::Shell, path.runtime().unwrap()); let path = store_configuration( &temp_dir, - Box::new(create_default_with_extensions("shell-2", Extensions2::default())), + &create_default_with_extensions("shell-2", Extensions2::default()), ); assert_eq!(Runtime::Shell, path.runtime().unwrap()); let path = store_configuration( &temp_dir, - Box::new(create_default_with_extensions("seedling", Extensions2::default())), + &create_default_with_extensions("seedling", Extensions2::default()), ); assert_eq!(Runtime::Seedling, path.runtime().unwrap()); let path = store_configuration( &temp_dir, - Box::new(crate::chain_spec::rococo_parachain::rococo_parachain_local_config()), + &create_default_with_extensions("penpal-rococo-1000", Extensions2::default()), ); - assert_eq!(Runtime::Default, path.runtime().unwrap()); + assert_eq!(Runtime::Penpal(1000.into()), path.runtime().unwrap()); let path = store_configuration( &temp_dir, - Box::new(crate::chain_spec::contracts::contracts_rococo_local_config()), + &create_default_with_extensions("penpal-polkadot-2000", Extensions2::default()), + ); + assert_eq!(Runtime::Penpal(2000.into()), path.runtime().unwrap()); + + let path = store_configuration( + &temp_dir, + &crate::chain_spec::contracts::contracts_rococo_local_config(), ); assert_eq!(Runtime::ContractsRococo, path.runtime().unwrap()); + + let path = store_configuration( + &temp_dir, + &crate::chain_spec::rococo_parachain::rococo_parachain_local_config(), + ); + assert_eq!(Runtime::Omni(Consensus::Aura), path.runtime().unwrap()); } } diff --git a/cumulus/polkadot-parachain/src/main.rs b/cumulus/polkadot-parachain/src/main.rs index 2bf659228bc..cbb76fa214c 100644 --- a/cumulus/polkadot-parachain/src/main.rs +++ b/cumulus/polkadot-parachain/src/main.rs @@ -14,11 +14,34 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -//! Cumulus test parachain collator +//! Polkadot parachain node. #![warn(missing_docs)] #![warn(unused_extern_crates)] +pub(crate) fn examples(executable_name: String) -> String { + color_print::cformat!( + r#"Examples: + + {0} --chain para.json --sync warp -- --chain relay.json --sync warp + Launch a warp-syncing full node of a given para's chain-spec, and a given relay's chain-spec. + + The above approach is the most flexible, and the most forward-compatible way to spawn an omni-node. + + You can find the chain-spec of some networks in: + https://paritytech.github.io/chainspecs + + {0} --chain asset-hub-polkadot --sync warp -- --chain polkadot --sync warp + Launch a warp-syncing full node of the Asset Hub parachain on the Polkadot Relay Chain. + + {0} --chain asset-hub-kusama --sync warp --relay-chain-rpc-url ws://rpc.example.com -- --chain kusama + Launch a warp-syncing full node of the Asset Hub parachain on the Kusama Relay Chain. + Uses ws://rpc.example.com as remote relay chain node. + "#, + executable_name, + ) +} + mod chain_spec; mod cli; mod command; -- GitLab From 30cdf5dac8b8074a63d686477d1795494099a6be Mon Sep 17 00:00:00 2001 From: Radha <86818441+DrW3RK@users.noreply.github.com> Date: Fri, 28 Jun 2024 09:59:16 +0200 Subject: [PATCH 070/130] Add Async Backing guide (#4363) Update the instructions to work with the latest parachain template on Polkadot SDK --------- Co-authored-by: kianenigma Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --- docs/sdk/src/guides/async_backing_guide.rs | 254 ++++++++++++++++++ docs/sdk/src/guides/mod.rs | 3 + templates/parachain/node/src/service.rs | 2 + templates/parachain/runtime/src/apis.rs | 20 +- .../parachain/runtime/src/configs/mod.rs | 1 + templates/parachain/runtime/src/lib.rs | 49 ++-- 6 files changed, 308 insertions(+), 21 deletions(-) create mode 100644 docs/sdk/src/guides/async_backing_guide.rs diff --git a/docs/sdk/src/guides/async_backing_guide.rs b/docs/sdk/src/guides/async_backing_guide.rs new file mode 100644 index 00000000000..f2f4dcabfd2 --- /dev/null +++ b/docs/sdk/src/guides/async_backing_guide.rs @@ -0,0 +1,254 @@ +//! # Upgrade Parachain for Asynchronous Backing Compatibility +//! +//! This guide is relevant for cumulus based parachain projects started in 2023 or before, whose +//! backing process is synchronous where parablocks can only be built on the latest Relay Chain +//! block. Async Backing allows collators to build parablocks on older Relay Chain blocks and create +//! pipelines of multiple pending parablocks. This parallel block generation increases efficiency +//! and throughput. For more information on Async backing and its terminology, refer to the document +//! on [the Polkadot Wiki.](https://wiki.polkadot.network/docs/maintain-guides-async-backing) +//! +//! > If starting a new parachain project, please use an async backing compatible template such as +//! > the +//! > [parachain template](https://github.com/paritytech/polkadot-sdk/tree/master/templates/parachain). +//! The rollout process for Async Backing has three phases. Phases 1 and 2 below put new +//! infrastructure in place. Then we can simply turn on async backing in phase 3. +//! +//! ## Prerequisite +//! +//! The relay chain needs to have async backing enabled so double-check that the relay-chain +//! configuration contains the following three parameters (especially when testing locally e.g. with +//! zombienet): +//! +//! ```json +//! "async_backing_params": { +//! "max_candidate_depth": 3, +//! "allowed_ancestry_len": 2 +//! }, +//! "scheduling_lookahead": 2 +//! ``` +//! +//!
    `scheduling_lookahead` must be set to 2, otherwise parachain block times +//! will degrade to worse than with sync backing!
    +//! +//! ## Phase 1 - Update Parachain Runtime +//! +//! This phase involves configuring your parachain’s runtime `/runtime/src/lib.rs` to make use of +//! async backing system. +//! +//! 1. Establish and ensure constants for `capacity` and `velocity` are both set to 1 in the +//! runtime. +//! 2. Establish and ensure the constant relay chain slot duration measured in milliseconds equal to +//! `6000` in the runtime. +//! ```rust +//! // Maximum number of blocks simultaneously accepted by the Runtime, not yet included into the +//! // relay chain. +//! pub const UNINCLUDED_SEGMENT_CAPACITY: u32 = 1; +//! // How many parachain blocks are processed by the relay chain per parent. Limits the number of +//! // blocks authored per slot. +//! pub const BLOCK_PROCESSING_VELOCITY: u32 = 1; +//! // Relay chain slot duration, in milliseconds. +//! pub const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; +//! ``` +//! +//! 3. Establish constants `MILLISECS_PER_BLOCK` and `SLOT_DURATION` if not already present in the +//! runtime. +//! ```ignore +//! // `SLOT_DURATION` is picked up by `pallet_timestamp` which is in turn picked +//! // up by `pallet_aura` to implement `fn slot_duration()`. +//! // +//! // Change this to adjust the block time. +//! pub const MILLISECS_PER_BLOCK: u64 = 12000; +//! pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; +//! ``` +//! +//! 4. Configure `cumulus_pallet_parachain_system` in the runtime. +//! +//! - Define a `FixedVelocityConsensusHook` using our capacity, velocity, and relay slot duration +//! constants. Use this to set the parachain system `ConsensusHook` property. +#![doc = docify::embed!("../../templates/parachain/runtime/src/lib.rs", ConsensusHook)] +//! ```ignore +//! impl cumulus_pallet_parachain_system::Config for Runtime { +//! .. +//! type ConsensusHook = ConsensusHook; +//! .. +//! } +//! ``` +//! - Set the parachain system property `CheckAssociatedRelayNumber` to +//! `RelayNumberMonotonicallyIncreases` +//! ```ignore +//! impl cumulus_pallet_parachain_system::Config for Runtime { +//! .. +//! type CheckAssociatedRelayNumber = RelayNumberMonotonicallyIncreases; +//! .. +//! } +//! ``` +//! +//! 5. Configure `pallet_aura` in the runtime. +//! +//! - Set `AllowMultipleBlocksPerSlot` to `false` (don't worry, we will set it to `true` when we +//! activate async backing in phase 3). +//! +//! - Define `pallet_aura::SlotDuration` using our constant `SLOT_DURATION` +//! ```ignore +//! impl pallet_aura::Config for Runtime { +//! .. +//! type AllowMultipleBlocksPerSlot = ConstBool; +//! #[cfg(feature = "experimental")] +//! type SlotDuration = ConstU64; +//! .. +//! } +//! ``` +//! +//! 6. Update `sp_consensus_aura::AuraApi::slot_duration` in `sp_api::impl_runtime_apis` to match +//! the constant `SLOT_DURATION` +#![doc = docify::embed!("../../templates/parachain/runtime/src/apis.rs", impl_slot_duration)] +//! +//! 7. Implement the `AuraUnincludedSegmentApi`, which allows the collator client to query its +//! runtime to determine whether it should author a block. +//! +//! - Add the dependency `cumulus-primitives-aura` to the `runtime/Cargo.toml` file for your +//! runtime +//! ```ignore +//! .. +//! cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } +//! .. +//! ``` +//! +//! - In the same file, add `"cumulus-primitives-aura/std",` to the `std` feature. +//! +//! - Inside the `impl_runtime_apis!` block for your runtime, implement the +//! `cumulus_primitives_aura::AuraUnincludedSegmentApi` as shown below. +#![doc = docify::embed!("../../templates/parachain/runtime/src/apis.rs", impl_can_build_upon)] +//! +//! **Note:** With a capacity of 1 we have an effective velocity of ½ even when velocity is +//! configured to some larger value. This is because capacity will be filled after a single block is +//! produced and will only be freed up after that block is included on the relay chain, which takes +//! 2 relay blocks to accomplish. Thus with capacity 1 and velocity 1 we get the customary 12 second +//! parachain block time. +//! +//! 8. If your `runtime/src/lib.rs` provides a `CheckInherents` type to `register_validate_block`, +//! remove it. `FixedVelocityConsensusHook` makes it unnecessary. The following example shows how +//! `register_validate_block` should look after removing `CheckInherents`. +#![doc = docify::embed!("../../templates/parachain/runtime/src/lib.rs", register_validate_block)] +//! +//! +//! ## Phase 2 - Update Parachain Nodes +//! +//! This phase consists of plugging in the new lookahead collator node. +//! +//! 1. Import `cumulus_primitives_core::ValidationCode` to `node/src/service.rs`. +#![doc = docify::embed!("../../templates/parachain/node/src/service.rs", cumulus_primitives)] +//! +//! 2. In `node/src/service.rs`, modify `sc_service::spawn_tasks` to use a clone of `Backend` rather +//! than the original +//! ```ignore +//! sc_service::spawn_tasks(sc_service::SpawnTasksParams { +//! .. +//! backend: backend.clone(), +//! .. +//! })?; +//! ``` +//! +//! 3. Add `backend` as a parameter to `start_consensus()` in `node/src/service.rs` +//! ```text +//! fn start_consensus( +//! .. +//! backend: Arc, +//! .. +//! ``` +//! ```ignore +//! if validator { +//! start_consensus( +//! .. +//! backend.clone(), +//! .. +//! )?; +//! } +//! ``` +//! +//! 4. In `node/src/service.rs` import the lookahead collator rather than the basic collator +#![doc = docify::embed!("../../templates/parachain/node/src/service.rs", lookahead_collator)] +//! +//! 5. In `start_consensus()` replace the `BasicAuraParams` struct with `AuraParams` +//! - Change the struct type from `BasicAuraParams` to `AuraParams` +//! - In the `para_client` field, pass in a cloned para client rather than the original +//! - Add a `para_backend` parameter after `para_client`, passing in our para backend +//! - Provide a `code_hash_provider` closure like that shown below +//! - Increase `authoring_duration` from 500 milliseconds to 1500 +//! ```ignore +//! let params = AuraParams { +//! .. +//! para_client: client.clone(), +//! para_backend: backend.clone(), +//! .. +//! code_hash_provider: move |block_hash| { +//! client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) +//! }, +//! .. +//! authoring_duration: Duration::from_millis(1500), +//! .. +//! }; +//! ``` +//! +//! **Note:** Set `authoring_duration` to whatever you want, taking your own hardware into account. +//! But if the backer who should be slower than you due to reading from disk, times out at two +//! seconds your candidates will be rejected. +//! +//! 6. In `start_consensus()` replace `basic_aura::run` with `aura::run` +//! ```ignore +//! let fut = +//! aura::run::( +//! params, +//! ); +//! task_manager.spawn_essential_handle().spawn("aura", None, fut); +//! ``` +//! +//! ## Phase 3 - Activate Async Backing +//! +//! This phase consists of changes to your parachain’s runtime that activate async backing feature. +//! +//! 1. Configure `pallet_aura`, setting `AllowMultipleBlocksPerSlot` to true in +//! `runtime/src/lib.rs`. +#![doc = docify::embed!("../../templates/parachain/runtime/src/configs/mod.rs", aura_config)] +//! +//! 2. Increase the maximum `UNINCLUDED_SEGMENT_CAPACITY` in `runtime/src/lib.rs`. +#![doc = docify::embed!("../../templates/parachain/runtime/src/lib.rs", async_backing_params)] +//! +//! 3. Decrease `MILLISECS_PER_BLOCK` to 6000. +//! +//! - Note: For a parachain which measures time in terms of its own block number rather than by +//! relay block number it may be preferable to increase velocity. Changing block time may cause +//! complications, requiring additional changes. See the section “Timing by Block Number”. +#![doc = docify::embed!("../../templates/parachain/runtime/src/lib.rs", block_times)] +//! +//! 4. Update `MAXIMUM_BLOCK_WEIGHT` to reflect the increased time available for block production. +#![doc = docify::embed!("../../templates/parachain/runtime/src/lib.rs", max_block_weight)] +//! +//! 5. Add a feature flagged alternative for `MinimumPeriod` in `pallet_timestamp`. The type should +//! be `ConstU64<0>` with the feature flag experimental, and `ConstU64<{SLOT_DURATION / 2}>` +//! without. +//! ```ignore +//! impl pallet_timestamp::Config for Runtime { +//! .. +//! #[cfg(feature = "experimental")] +//! type MinimumPeriod = ConstU64<0>; +//! #[cfg(not(feature = "experimental"))] +//! type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; +//! .. +//! } +//! ``` +//! +//! ## Timing by Block Number +//! +//! With asynchronous backing it will be possible for parachains to opt for a block time of 6 +//! seconds rather than 12 seconds. But modifying block duration isn’t so simple for a parachain +//! which was measuring time in terms of its own block number. It could result in expected and +//! actual time not matching up, stalling the parachain. +//! +//! One strategy to deal with this issue is to instead rely on relay chain block numbers for timing. +//! Relay block number is kept track of by each parachain in `pallet-parachain-system` with the +//! storage value `LastRelayChainBlockNumber`. This value can be obtained and used wherever timing +//! based on block number is needed. + +#![deny(rustdoc::broken_intra_doc_links)] +#![deny(rustdoc::private_intra_doc_links)] diff --git a/docs/sdk/src/guides/mod.rs b/docs/sdk/src/guides/mod.rs index 485cdc30636..8296ed447e1 100644 --- a/docs/sdk/src/guides/mod.rs +++ b/docs/sdk/src/guides/mod.rs @@ -36,5 +36,8 @@ pub mod your_first_runtime; /// How to enable storage weight reclaiming in a parachain node and runtime. pub mod enable_pov_reclaim; +/// How to enable Async Backing on parachain projects that started in 2023 or before. +pub mod async_backing_guide; + /// How to enable metadata hash verification in the runtime. pub mod enable_metadata_hash; diff --git a/templates/parachain/node/src/service.rs b/templates/parachain/node/src/service.rs index 587dd19faf3..bf44207acc9 100644 --- a/templates/parachain/node/src/service.rs +++ b/templates/parachain/node/src/service.rs @@ -12,6 +12,7 @@ use parachain_template_runtime::{ // Cumulus Imports use cumulus_client_collator::service::CollatorService; +#[docify::export(lookahead_collator)] use cumulus_client_consensus_aura::collators::lookahead::{self as aura, Params as AuraParams}; use cumulus_client_consensus_common::ParachainBlockImport as TParachainBlockImport; use cumulus_client_consensus_proposer::Proposer; @@ -20,6 +21,7 @@ use cumulus_client_service::{ BuildNetworkParams, CollatorSybilResistance, DARecoveryProfile, ParachainHostFunctions, StartRelayChainTasksParams, }; +#[docify::export(cumulus_primitives)] use cumulus_primitives_core::{ relay_chain::{CollatorPair, ValidationCode}, ParaId, diff --git a/templates/parachain/runtime/src/apis.rs b/templates/parachain/runtime/src/apis.rs index 107956ded41..bc3c3808fb7 100644 --- a/templates/parachain/runtime/src/apis.rs +++ b/templates/parachain/runtime/src/apis.rs @@ -47,10 +47,26 @@ use super::{ SLOT_DURATION, VERSION, }; +// we move some impls outside so we can easily use them with `docify`. +impl Runtime { + #[docify::export] + fn impl_slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(SLOT_DURATION) + } + + #[docify::export] + fn impl_can_build_upon( + included_hash: ::Hash, + slot: cumulus_primitives_aura::Slot, + ) -> bool { + ConsensusHook::can_build_upon(included_hash, slot) + } +} + impl_runtime_apis! { impl sp_consensus_aura::AuraApi for Runtime { fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(SLOT_DURATION) + Runtime::impl_slot_duration() } fn authorities() -> Vec { @@ -63,7 +79,7 @@ impl_runtime_apis! { included_hash: ::Hash, slot: cumulus_primitives_aura::Slot, ) -> bool { - ConsensusHook::can_build_upon(included_hash, slot) + Runtime::impl_can_build_upon(included_hash, slot) } } diff --git a/templates/parachain/runtime/src/configs/mod.rs b/templates/parachain/runtime/src/configs/mod.rs index 8a410a27e4a..204e74a11e6 100644 --- a/templates/parachain/runtime/src/configs/mod.rs +++ b/templates/parachain/runtime/src/configs/mod.rs @@ -265,6 +265,7 @@ impl pallet_session::Config for Runtime { type WeightInfo = (); } +#[docify::export(aura_config)] impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); diff --git a/templates/parachain/runtime/src/lib.rs b/templates/parachain/runtime/src/lib.rs index 6e6491a19ad..3a9fee38f24 100644 --- a/templates/parachain/runtime/src/lib.rs +++ b/templates/parachain/runtime/src/lib.rs @@ -168,17 +168,21 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { state_version: 1, }; -/// This determines the average expected block time that we are targeting. -/// Blocks will be produced at a minimum duration defined by `SLOT_DURATION`. -/// `SLOT_DURATION` is picked up by `pallet_timestamp` which is in turn picked -/// up by `pallet_aura` to implement `fn slot_duration()`. -/// -/// Change this to adjust the block time. -pub const MILLISECS_PER_BLOCK: u64 = 6000; - -// NOTE: Currently it is not possible to change the slot duration after the chain has started. -// Attempting to do so will brick block production. -pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; +#[docify::export] +mod block_times { + /// This determines the average expected block time that we are targeting. Blocks will be + /// produced at a minimum duration defined by `SLOT_DURATION`. `SLOT_DURATION` is picked up by + /// `pallet_timestamp` which is in turn picked up by `pallet_aura` to implement `fn + /// slot_duration()`. + /// + /// Change this to adjust the block time. + pub const MILLISECS_PER_BLOCK: u64 = 6000; + + // NOTE: Currently it is not possible to change the slot duration after the chain has started. + // Attempting to do so will brick block production. + pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; +} +pub use block_times::*; // Time is measured by number of blocks. pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); @@ -201,21 +205,27 @@ const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); /// `Operational` extrinsics. const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); +#[docify::export(max_block_weight)] /// We allow for 2 seconds of compute with a 6 second average block time. const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( WEIGHT_REF_TIME_PER_SECOND.saturating_mul(2), cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, ); -/// Maximum number of blocks simultaneously accepted by the Runtime, not yet included -/// into the relay chain. -const UNINCLUDED_SEGMENT_CAPACITY: u32 = 3; -/// How many parachain blocks are processed by the relay chain per parent. Limits the -/// number of blocks authored per slot. -const BLOCK_PROCESSING_VELOCITY: u32 = 1; -/// Relay chain slot duration, in milliseconds. -const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; +#[docify::export] +mod async_backing_params { + /// Maximum number of blocks simultaneously accepted by the Runtime, not yet included + /// into the relay chain. + pub(crate) const UNINCLUDED_SEGMENT_CAPACITY: u32 = 3; + /// How many parachain blocks are processed by the relay chain per parent. Limits the + /// number of blocks authored per slot. + pub(crate) const BLOCK_PROCESSING_VELOCITY: u32 = 1; + /// Relay chain slot duration, in milliseconds. + pub(crate) const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; +} +pub(crate) use async_backing_params::*; +#[docify::export] /// Aura consensus hook type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< Runtime, @@ -293,6 +303,7 @@ mod runtime { pub type TemplatePallet = pallet_parachain_template; } +#[docify::export(register_validate_block)] cumulus_pallet_parachain_system::register_validate_block! { Runtime = Runtime, BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, -- GitLab From 016f394854a3fad6762913a0f208cece181c34fe Mon Sep 17 00:00:00 2001 From: Adrian Catangiu Date: Fri, 28 Jun 2024 12:09:38 +0300 Subject: [PATCH 071/130] [Rococo<>Westend bridge] Allow any asset over the lane between the two Asset Hubs (#4888) On Westend Asset Hub, we allow Rococo Asset Hub to act as reserve for any asset native to the Rococo or Ethereum ecosystems (practically providing Westend access to Ethereum assets through double bridging: W<>R<>Eth). On Rococo Asset Hub, we allow Westend Asset Hub to act as reserve for any asset native to the Westend ecosystem. We also allow Ethereum contracts to act as reserves for the foreign assets identified by the same respective contracts locations. - [x] add emulated tests for various assets (native, trust-based, foreign/bridged) going AHR -> AHW, - [x] add equivalent tests for the other direction AHW -> AHR. This PR is a prerequisite to doing the same for Polkadot<>Kusama bridge. --- Cargo.lock | 1 + .../assets/asset-hub-rococo/src/genesis.rs | 7 +- .../emulated/common/src/lib.rs | 7 +- .../asset-hub-rococo/src/tests/treasury.rs | 12 +- .../bridges/bridge-hub-rococo/src/lib.rs | 4 +- .../src/tests/asset_transfers.rs | 283 ++++++++--------- .../bridge-hub-rococo/src/tests/mod.rs | 122 ++++++- .../bridge-hub-rococo/src/tests/send_xcm.rs | 16 +- .../bridge-hub-rococo/src/tests/snowbridge.rs | 4 +- .../bridges/bridge-hub-westend/Cargo.toml | 1 + .../bridges/bridge-hub-westend/src/lib.rs | 4 +- .../src/tests/asset_transfers.rs | 299 ++++++++++-------- .../bridge-hub-westend/src/tests/mod.rs | 141 ++++++++- .../bridge-hub-westend/src/tests/send_xcm.rs | 16 +- .../assets/asset-hub-rococo/src/xcm_config.rs | 34 +- .../asset-hub-westend/src/xcm_config.rs | 36 +-- .../runtimes/assets/common/src/matching.rs | 44 +-- prdoc/pr_4888.prdoc | 35 ++ 18 files changed, 680 insertions(+), 386 deletions(-) create mode 100644 prdoc/pr_4888.prdoc diff --git a/Cargo.lock b/Cargo.lock index 7796a2d2cf2..8af41e3eae5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2252,6 +2252,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "emulated-integration-tests-common", "frame-support", + "hex-literal", "pallet-asset-conversion", "pallet-assets", "pallet-balances", diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs index e5378b35f5e..3a87322664d 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs @@ -21,7 +21,7 @@ use sp_core::{sr25519, storage::Storage}; use emulated_integration_tests_common::{ accounts, build_genesis_storage, collators, get_account_id_from_seed, PenpalSiblingSovereignAccount, PenpalTeleportableAssetLocation, RESERVABLE_ASSET_ID, - SAFE_XCM_VERSION, + SAFE_XCM_VERSION, USDT_ID, }; use parachains_common::{AccountId, Balance}; @@ -68,7 +68,10 @@ pub fn genesis() -> Storage { ..Default::default() }, assets: asset_hub_rococo_runtime::AssetsConfig { - assets: vec![(RESERVABLE_ASSET_ID, AssetHubRococoAssetOwner::get(), true, ED)], + assets: vec![ + (RESERVABLE_ASSET_ID, AssetHubRococoAssetOwner::get(), true, ED), + (USDT_ID, AssetHubRococoAssetOwner::get(), true, ED), + ], ..Default::default() }, foreign_assets: asset_hub_rococo_runtime::ForeignAssetsConfig { diff --git a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs index 4a9d3b3a5aa..7077fbbb0a9 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs @@ -51,11 +51,14 @@ pub const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION; type AccountPublic = ::Signer; -// This asset is added to AH as Asset and reserved transfer between Parachain and AH +// (trust-backed) Asset registered on AH and reserve-transferred between Parachain and AH pub const RESERVABLE_ASSET_ID: u32 = 1; -// This asset is added to AH as ForeignAsset and teleported between Penpal and AH +// ForeignAsset registered on AH and teleported between Penpal and AH pub const TELEPORTABLE_ASSET_ID: u32 = 2; +// USDT registered on AH as (trust-backed) Asset and reserve-transferred between Parachain and AH +pub const USDT_ID: u32 = 1984; + pub const PENPAL_ID: u32 = 2000; pub const ASSETS_PALLET_ID: u8 = 50; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs index 01bf40ae8fd..809641c626f 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs @@ -20,7 +20,7 @@ use frame_support::{ sp_runtime::traits::Dispatchable, traits::{ fungible::Inspect, - fungibles::{Create, Inspect as FungiblesInspect, Mutate}, + fungibles::{Inspect as FungiblesInspect, Mutate}, }, }; use parachains_common::AccountId; @@ -163,7 +163,7 @@ fn spend_roc_on_asset_hub() { #[test] fn create_and_claim_treasury_spend_in_usdt() { const ASSET_ID: u32 = 1984; - const SPEND_AMOUNT: u128 = 1_000_000; + const SPEND_AMOUNT: u128 = 10_000_000; // treasury location from a sibling parachain. let treasury_location: Location = Location::new(1, PalletInstance(18)); // treasury account on a sibling parachain. @@ -190,13 +190,7 @@ fn create_and_claim_treasury_spend_in_usdt() { AssetHubRococo::execute_with(|| { type Assets = ::Assets; - // create an asset class and mint some assets to the treasury account. - assert_ok!(>::create( - ASSET_ID, - treasury_account.clone(), - true, - SPEND_AMOUNT / 2 - )); + // USDT created at genesis, mint some assets to the treasury account. assert_ok!(>::mint_into(ASSET_ID, &treasury_account, SPEND_AMOUNT * 4)); // beneficiary has zero balance. assert_eq!(>::balance(ASSET_ID, &alice,), 0u128,); diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs index 0415af580ef..abfbd9b45a9 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs @@ -35,11 +35,13 @@ mod imports { xcm_emulator::{ assert_expected_events, bx, Chain, Parachain as Para, RelayChain as Relay, TestExt, }, + ASSETS_PALLET_ID, USDT_ID, }; pub use parachains_common::AccountId; pub use rococo_westend_system_emulated_network::{ asset_hub_rococo_emulated_chain::{ - genesis::ED as ASSET_HUB_ROCOCO_ED, AssetHubRococoParaPallet as AssetHubRococoPallet, + genesis::{AssetHubRococoAssetOwner, ED as ASSET_HUB_ROCOCO_ED}, + AssetHubRococoParaPallet as AssetHubRococoPallet, }, asset_hub_westend_emulated_chain::{ genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet, diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs index 87fb70e4de2..995c992c70f 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs @@ -15,7 +15,7 @@ use crate::tests::*; -fn send_asset_from_asset_hub_rococo_to_asset_hub_westend(id: Location, amount: u128) { +fn send_assets_from_asset_hub_rococo_to_asset_hub_westend(assets: Assets, fee_idx: u32) { let destination = asset_hub_westend_location(); // fund the AHR's SA on BHR for paying bridge transport fees @@ -26,7 +26,7 @@ fn send_asset_from_asset_hub_rococo_to_asset_hub_westend(id: Location, amount: u BridgeHubRococo::force_xcm_version(bridge_hub_westend_location(), XCM_VERSION); // send message over bridge - assert_ok!(send_asset_from_asset_hub_rococo(destination, (id, amount))); + assert_ok!(send_assets_from_asset_hub_rococo(destination, assets, fee_idx)); assert_bridge_hub_rococo_message_accepted(true); assert_bridge_hub_westend_message_received(); } @@ -103,80 +103,42 @@ fn send_asset_from_penpal_rococo_through_local_asset_hub_to_westend_asset_hub( } #[test] -fn send_rocs_from_asset_hub_rococo_to_asset_hub_westend() { - let roc_at_asset_hub_rococo: v3::Location = v3::Parent.into(); - let roc_at_asset_hub_westend = - v3::Location::new(2, [v3::Junction::GlobalConsensus(v3::NetworkId::Rococo)]); - let owner: AccountId = AssetHubWestend::account_id_of(ALICE); - AssetHubWestend::force_create_foreign_asset( - roc_at_asset_hub_westend, - owner, - true, - ASSET_MIN_BALANCE, - vec![], - ); +/// Test transfer of ROC, USDT and wETH from AssetHub Rococo to AssetHub Westend. +/// +/// This mix of assets should cover the whole range: +/// - native assets: ROC, +/// - trust-based assets: USDT (exists only on Rococo, Westend gets it from Rococo over bridge), +/// - foreign asset / bridged asset (other bridge / Snowfork): wETH (bridged from Ethereum to Rococo +/// over Snowbridge, then bridged over to Westend through this bridge). +fn send_roc_usdt_and_weth_from_asset_hub_rococo_to_asset_hub_westend() { + let amount = ASSET_HUB_ROCOCO_ED * 1_000_000; + let sender = AssetHubRococoSender::get(); + let receiver = AssetHubWestendReceiver::get(); + let roc_at_asset_hub_rococo: v3::Location = roc_at_ah_rococo().try_into().unwrap(); + let bridged_roc_at_asset_hub_westend = bridged_roc_at_ah_westend().try_into().unwrap(); + + create_foreign_on_ah_westend(bridged_roc_at_asset_hub_westend, true); + set_up_pool_with_wnd_on_ah_westend(bridged_roc_at_asset_hub_westend); + + //////////////////////////////////////////////////////////// + // Let's first send over just some ROCs as a simple example + //////////////////////////////////////////////////////////// let sov_ahw_on_ahr = AssetHubRococo::sovereign_account_of_parachain_on_other_global_consensus( Westend, AssetHubWestend::para_id(), ); - - AssetHubWestend::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - // setup a pool to pay xcm fees with `roc_at_asset_hub_westend` tokens - assert_ok!(::ForeignAssets::mint( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - roc_at_asset_hub_westend.into(), - AssetHubWestendSender::get().into(), - 3_000_000_000_000, - )); - - assert_ok!(::AssetConversion::create_pool( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - Box::new(xcm::v3::Parent.into()), - Box::new(roc_at_asset_hub_westend), - )); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::PoolCreated { .. }) => {}, - ] - ); - - assert_ok!(::AssetConversion::add_liquidity( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - Box::new(xcm::v3::Parent.into()), - Box::new(roc_at_asset_hub_westend), - 1_000_000_000_000, - 2_000_000_000_000, - 1, - 1, - AssetHubWestendSender::get().into() - )); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {..}) => {}, - ] - ); - }); - let rocs_in_reserve_on_ahr_before = ::account_data_of(sov_ahw_on_ahr.clone()).free; - let sender_rocs_before = - ::account_data_of(AssetHubRococoSender::get()).free; - let receiver_rocs_before = AssetHubWestend::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance(roc_at_asset_hub_westend, &AssetHubWestendReceiver::get()) - }); + let sender_rocs_before = ::account_data_of(sender.clone()).free; + let receiver_rocs_before = + foreign_balance_on_ah_westend(bridged_roc_at_asset_hub_westend, &receiver); - let amount = ASSET_HUB_ROCOCO_ED * 1_000_000; - send_asset_from_asset_hub_rococo_to_asset_hub_westend( - roc_at_asset_hub_rococo.try_into().unwrap(), - amount, - ); + // send ROCs, use them for fees + let assets: Assets = (Location::try_from(roc_at_asset_hub_rococo).unwrap(), amount).into(); + let fee_index = 0; + send_assets_from_asset_hub_rococo_to_asset_hub_westend(assets, fee_index); + + // verify expected events on final destination AssetHubWestend::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( @@ -185,7 +147,7 @@ fn send_rocs_from_asset_hub_rococo_to_asset_hub_westend() { // issue ROCs on AHW RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { asset_id: *asset_id == roc_at_asset_hub_rococo, - owner: *owner == AssetHubWestendReceiver::get(), + owner: owner == &receiver, }, // message processed successfully RuntimeEvent::MessageQueue( @@ -195,36 +157,99 @@ fn send_rocs_from_asset_hub_rococo_to_asset_hub_westend() { ); }); - let sender_rocs_after = - ::account_data_of(AssetHubRococoSender::get()).free; - let receiver_rocs_after = AssetHubWestend::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance(roc_at_asset_hub_westend, &AssetHubWestendReceiver::get()) - }); + let sender_rocs_after = ::account_data_of(sender.clone()).free; + let receiver_rocs_after = + foreign_balance_on_ah_westend(bridged_roc_at_asset_hub_westend, &receiver); let rocs_in_reserve_on_ahr_after = ::account_data_of(sov_ahw_on_ahr.clone()).free; - // Sender's balance is reduced + // Sender's ROC balance is reduced assert!(sender_rocs_before > sender_rocs_after); - // Receiver's balance is increased + // Receiver's ROC balance is increased assert!(receiver_rocs_after > receiver_rocs_before); - // Reserve balance is increased by sent amount + // Reserve ROC balance is increased by sent amount assert_eq!(rocs_in_reserve_on_ahr_after, rocs_in_reserve_on_ahr_before + amount); + + ///////////////////////////////////////////////////////////// + // Now let's send over USDTs + wETH (and pay fees with USDT) + ///////////////////////////////////////////////////////////// + + let usdt_at_asset_hub_rococo = usdt_at_ah_rococo(); + let bridged_usdt_at_asset_hub_westend = bridged_usdt_at_ah_westend().try_into().unwrap(); + // wETH has same relative location on both Rococo and Westend AssetHubs + let bridged_weth_at_ah = weth_at_asset_hubs().try_into().unwrap(); + + // mint USDT in sender's account (USDT already created in genesis) + AssetHubRococo::mint_asset( + ::RuntimeOrigin::signed(AssetHubRococoAssetOwner::get()), + USDT_ID, + sender.clone(), + amount * 2, + ); + // create wETH at src and dest and prefund sender's account + create_foreign_on_ah_rococo(bridged_weth_at_ah, true, vec![(sender.clone(), amount * 2)]); + create_foreign_on_ah_westend(bridged_weth_at_ah, true); + create_foreign_on_ah_westend(bridged_usdt_at_asset_hub_westend, true); + set_up_pool_with_wnd_on_ah_westend(bridged_usdt_at_asset_hub_westend); + + let receiver_usdts_before = + foreign_balance_on_ah_westend(bridged_usdt_at_asset_hub_westend, &receiver); + let receiver_weth_before = foreign_balance_on_ah_westend(bridged_weth_at_ah, &receiver); + + // send USDTs and wETHs + let assets: Assets = vec![ + (usdt_at_asset_hub_rococo.clone(), amount).into(), + (Location::try_from(bridged_weth_at_ah).unwrap(), amount).into(), + ] + .into(); + // use USDT for fees + let fee: AssetId = usdt_at_asset_hub_rococo.into(); + + // use the more involved transfer extrinsic + let custom_xcm_on_dest = Xcm::<()>(vec![DepositAsset { + assets: Wild(AllCounted(assets.len() as u32)), + beneficiary: AccountId32Junction { network: None, id: receiver.clone().into() }.into(), + }]); + assert_ok!(AssetHubRococo::execute_with(|| { + ::PolkadotXcm::transfer_assets_using_type_and_then( + ::RuntimeOrigin::signed(sender.into()), + bx!(asset_hub_westend_location().into()), + bx!(assets.into()), + bx!(TransferType::LocalReserve), + bx!(fee.into()), + bx!(TransferType::LocalReserve), + bx!(VersionedXcm::from(custom_xcm_on_dest)), + WeightLimit::Unlimited, + ) + })); + // verify hops (also advances the message through the hops) + assert_bridge_hub_rococo_message_accepted(true); + assert_bridge_hub_westend_message_received(); + AssetHubWestend::execute_with(|| { + AssetHubWestend::assert_xcmp_queue_success(None); + }); + + let receiver_usdts_after = + foreign_balance_on_ah_westend(bridged_usdt_at_asset_hub_westend, &receiver); + let receiver_weth_after = foreign_balance_on_ah_westend(bridged_weth_at_ah, &receiver); + + // Receiver's USDT balance is increased by almost `amount` (minus fees) + assert!(receiver_usdts_after > receiver_usdts_before); + assert!(receiver_usdts_after < receiver_usdts_before + amount); + // Receiver's wETH balance is increased by sent amount + assert_eq!(receiver_weth_after, receiver_weth_before + amount); } #[test] -fn send_wnds_from_asset_hub_rococo_to_asset_hub_westend() { +/// Send bridged WNDs "back" from AssetHub Rococo to AssetHub Westend. +fn send_back_wnds_from_asset_hub_rococo_to_asset_hub_westend() { let prefund_amount = 10_000_000_000_000u128; - let wnd_at_asset_hub_rococo = - v3::Location::new(2, [v3::Junction::GlobalConsensus(v3::NetworkId::Westend)]); - let owner: AccountId = AssetHubRococo::account_id_of(ALICE); - AssetHubRococo::force_create_foreign_asset( - wnd_at_asset_hub_rococo, - owner, - true, - ASSET_MIN_BALANCE, - vec![(AssetHubRococoSender::get(), prefund_amount)], - ); + let sender = AssetHubRococoSender::get(); + let receiver = AssetHubWestendReceiver::get(); + let wnd_at_asset_hub_rococo = bridged_wnd_at_ah_rococo(); + let wnd_at_asset_hub_rococo_v3 = wnd_at_asset_hub_rococo.clone().try_into().unwrap(); + let prefund_accounts = vec![(sender.clone(), prefund_amount)]; + create_foreign_on_ah_rococo(wnd_at_asset_hub_rococo_v3, true, prefund_accounts); // fund the AHR's SA on AHW with the WND tokens held in reserve let sov_ahr_on_ahw = AssetHubWestend::sovereign_account_of_parachain_on_other_global_consensus( @@ -236,19 +261,17 @@ fn send_wnds_from_asset_hub_rococo_to_asset_hub_westend() { let wnds_in_reserve_on_ahw_before = ::account_data_of(sov_ahr_on_ahw.clone()).free; assert_eq!(wnds_in_reserve_on_ahw_before, prefund_amount); - let sender_wnds_before = AssetHubRococo::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance(wnd_at_asset_hub_rococo, &AssetHubRococoSender::get()) - }); + + let sender_wnds_before = foreign_balance_on_ah_rococo(wnd_at_asset_hub_rococo_v3, &sender); assert_eq!(sender_wnds_before, prefund_amount); - let receiver_wnds_before = - ::account_data_of(AssetHubWestendReceiver::get()).free; + let receiver_wnds_before = ::account_data_of(receiver.clone()).free; let amount_to_send = ASSET_HUB_WESTEND_ED * 1_000; - send_asset_from_asset_hub_rococo_to_asset_hub_westend( - Location::try_from(wnd_at_asset_hub_rococo).unwrap(), - amount_to_send, + send_assets_from_asset_hub_rococo_to_asset_hub_westend( + (wnd_at_asset_hub_rococo, amount_to_send).into(), + 0, ); + AssetHubWestend::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( @@ -263,7 +286,7 @@ fn send_wnds_from_asset_hub_rococo_to_asset_hub_westend() { }, // WNDs deposited to beneficiary RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { - who: *who == AssetHubWestendReceiver::get(), + who: who == &receiver, }, // message processed successfully RuntimeEvent::MessageQueue( @@ -273,12 +296,8 @@ fn send_wnds_from_asset_hub_rococo_to_asset_hub_westend() { ); }); - let sender_wnds_after = AssetHubRococo::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance(wnd_at_asset_hub_rococo, &AssetHubRococoSender::get()) - }); - let receiver_wnds_after = - ::account_data_of(AssetHubWestendReceiver::get()).free; + let sender_wnds_after = foreign_balance_on_ah_rococo(wnd_at_asset_hub_rococo_v3, &sender); + let receiver_wnds_after = ::account_data_of(receiver).free; let wnds_in_reserve_on_ahw_after = ::account_data_of(sov_ahr_on_ahw).free; @@ -292,22 +311,13 @@ fn send_wnds_from_asset_hub_rococo_to_asset_hub_westend() { #[test] fn send_rocs_from_penpal_rococo_through_asset_hub_rococo_to_asset_hub_westend() { - let roc_at_rococo_parachains: Location = Parent.into(); - let roc_at_asset_hub_westend = Location::new(2, [Junction::GlobalConsensus(NetworkId::Rococo)]); - let owner: AccountId = AssetHubWestend::account_id_of(ALICE); - AssetHubWestend::force_create_foreign_asset( - roc_at_asset_hub_westend.clone().try_into().unwrap(), - owner, - true, - ASSET_MIN_BALANCE, - vec![], - ); - let sov_ahw_on_ahr = AssetHubRococo::sovereign_account_of_parachain_on_other_global_consensus( - Westend, - AssetHubWestend::para_id(), - ); + let roc_at_rococo_parachains = roc_at_ah_rococo(); + let roc_at_asset_hub_westend = bridged_roc_at_ah_westend().try_into().unwrap(); + create_foreign_on_ah_westend(roc_at_asset_hub_westend, true); let amount = ASSET_HUB_ROCOCO_ED * 10_000_000; + let sender = PenpalASender::get(); + let receiver = AssetHubWestendReceiver::get(); let penpal_location = AssetHubRococo::sibling_location_of(PenpalA::para_id()); let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of(penpal_location); // fund Penpal's sovereign account on AssetHub @@ -316,26 +326,23 @@ fn send_rocs_from_penpal_rococo_through_asset_hub_rococo_to_asset_hub_westend() PenpalA::mint_foreign_asset( ::RuntimeOrigin::signed(PenpalAssetOwner::get()), roc_at_rococo_parachains.clone(), - PenpalASender::get(), + sender.clone(), amount * 2, ); + let sov_ahw_on_ahr = AssetHubRococo::sovereign_account_of_parachain_on_other_global_consensus( + Westend, + AssetHubWestend::para_id(), + ); let rocs_in_reserve_on_ahr_before = ::account_data_of(sov_ahw_on_ahr.clone()).free; let sender_rocs_before = PenpalA::execute_with(|| { type ForeignAssets = ::ForeignAssets; - >::balance( - roc_at_rococo_parachains.clone(), - &PenpalASender::get(), - ) - }); - let receiver_rocs_before = AssetHubWestend::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance( - roc_at_asset_hub_westend.clone().try_into().unwrap(), - &AssetHubWestendReceiver::get(), - ) + >::balance(roc_at_rococo_parachains.clone(), &sender) }); + let receiver_rocs_before = foreign_balance_on_ah_westend(roc_at_asset_hub_westend, &receiver); + + // Send ROCs over bridge send_asset_from_penpal_rococo_through_local_asset_hub_to_westend_asset_hub( roc_at_rococo_parachains.clone(), amount, @@ -349,7 +356,7 @@ fn send_rocs_from_penpal_rococo_through_asset_hub_rococo_to_asset_hub_westend() // issue ROCs on AHW RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { asset_id: *asset_id == roc_at_rococo_parachains.clone().try_into().unwrap(), - owner: *owner == AssetHubWestendReceiver::get(), + owner: owner == &receiver, }, // message processed successfully RuntimeEvent::MessageQueue( @@ -361,15 +368,9 @@ fn send_rocs_from_penpal_rococo_through_asset_hub_rococo_to_asset_hub_westend() let sender_rocs_after = PenpalA::execute_with(|| { type ForeignAssets = ::ForeignAssets; - >::balance(roc_at_rococo_parachains, &PenpalASender::get()) - }); - let receiver_rocs_after = AssetHubWestend::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance( - roc_at_asset_hub_westend.try_into().unwrap(), - &AssetHubWestendReceiver::get(), - ) + >::balance(roc_at_rococo_parachains, &sender) }); + let receiver_rocs_after = foreign_balance_on_ah_westend(roc_at_asset_hub_westend, &receiver); let rocs_in_reserve_on_ahr_after = ::account_data_of(sov_ahw_on_ahr.clone()).free; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs index 88dad06434b..58c52e1328c 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs @@ -21,39 +21,141 @@ mod snowbridge; mod teleport; pub(crate) fn asset_hub_westend_location() -> Location { + Location::new(2, [GlobalConsensus(Westend), Parachain(AssetHubWestend::para_id().into())]) +} +pub(crate) fn bridge_hub_westend_location() -> Location { + Location::new(2, [GlobalConsensus(Westend), Parachain(BridgeHubWestend::para_id().into())]) +} + +// ROC and wROC +pub(crate) fn roc_at_ah_rococo() -> Location { + Parent.into() +} +pub(crate) fn bridged_roc_at_ah_westend() -> Location { + Location::new(2, [GlobalConsensus(Rococo)]) +} + +// wWND +pub(crate) fn bridged_wnd_at_ah_rococo() -> Location { + Location::new(2, [GlobalConsensus(Westend)]) +} + +// USDT and wUSDT +pub(crate) fn usdt_at_ah_rococo() -> Location { + Location::new(0, [PalletInstance(ASSETS_PALLET_ID), GeneralIndex(USDT_ID.into())]) +} +pub(crate) fn bridged_usdt_at_ah_westend() -> Location { Location::new( 2, - [GlobalConsensus(NetworkId::Westend), Parachain(AssetHubWestend::para_id().into())], + [ + GlobalConsensus(Rococo), + Parachain(AssetHubRococo::para_id().into()), + PalletInstance(ASSETS_PALLET_ID), + GeneralIndex(USDT_ID.into()), + ], ) } -pub(crate) fn bridge_hub_westend_location() -> Location { +// wETH has same relative location on both Rococo and Westend AssetHubs +pub(crate) fn weth_at_asset_hubs() -> Location { Location::new( 2, - [GlobalConsensus(NetworkId::Westend), Parachain(BridgeHubWestend::para_id().into())], + [ + GlobalConsensus(Ethereum { chain_id: snowbridge::CHAIN_ID }), + AccountKey20 { network: None, key: snowbridge::WETH }, + ], ) } -pub(crate) fn send_asset_from_asset_hub_rococo( +pub(crate) fn create_foreign_on_ah_rococo( + id: v3::Location, + sufficient: bool, + prefund_accounts: Vec<(AccountId, u128)>, +) { + let owner = AssetHubRococo::account_id_of(ALICE); + let min = ASSET_MIN_BALANCE; + AssetHubRococo::force_create_foreign_asset(id, owner, sufficient, min, prefund_accounts); +} + +pub(crate) fn create_foreign_on_ah_westend(id: v3::Location, sufficient: bool) { + let owner = AssetHubWestend::account_id_of(ALICE); + AssetHubWestend::force_create_foreign_asset(id, owner, sufficient, ASSET_MIN_BALANCE, vec![]); +} + +pub(crate) fn foreign_balance_on_ah_rococo(id: v3::Location, who: &AccountId) -> u128 { + AssetHubRococo::execute_with(|| { + type Assets = ::ForeignAssets; + >::balance(id, who) + }) +} +pub(crate) fn foreign_balance_on_ah_westend(id: v3::Location, who: &AccountId) -> u128 { + AssetHubWestend::execute_with(|| { + type Assets = ::ForeignAssets; + >::balance(id, who) + }) +} + +// set up pool +pub(crate) fn set_up_pool_with_wnd_on_ah_westend(foreign_asset: v3::Location) { + let wnd: v3::Location = v3::Parent.into(); + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + let owner = AssetHubWestendSender::get(); + let signed_owner = ::RuntimeOrigin::signed(owner.clone()); + + assert_ok!(::ForeignAssets::mint( + signed_owner.clone(), + foreign_asset.into(), + owner.clone().into(), + 3_000_000_000_000, + )); + assert_ok!(::AssetConversion::create_pool( + signed_owner.clone(), + Box::new(wnd), + Box::new(foreign_asset), + )); + assert_expected_events!( + AssetHubWestend, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::PoolCreated { .. }) => {}, + ] + ); + assert_ok!(::AssetConversion::add_liquidity( + signed_owner.clone(), + Box::new(wnd), + Box::new(foreign_asset), + 1_000_000_000_000, + 2_000_000_000_000, + 1, + 1, + owner.into() + )); + assert_expected_events!( + AssetHubWestend, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {..}) => {}, + ] + ); + }); +} + +pub(crate) fn send_assets_from_asset_hub_rococo( destination: Location, - (id, amount): (Location, u128), + assets: Assets, + fee_idx: u32, ) -> DispatchResult { let signed_origin = ::RuntimeOrigin::signed(AssetHubRococoSender::get().into()); - let beneficiary: Location = AccountId32Junction { network: None, id: AssetHubWestendReceiver::get().into() }.into(); - let assets: Assets = (id, amount).into(); - let fee_asset_item = 0; - AssetHubRococo::execute_with(|| { ::PolkadotXcm::limited_reserve_transfer_assets( signed_origin, bx!(destination.into()), bx!(beneficiary.into()), bx!(assets.into()), - fee_asset_item, + fee_idx, WeightLimit::Unlimited, ) }) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs index 78788634e6f..652447fa560 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs @@ -81,7 +81,11 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { // send XCM from AssetHubRococo - fails - destination version not known assert_err!( - send_asset_from_asset_hub_rococo(destination.clone(), (native_token.clone(), amount)), + send_assets_from_asset_hub_rococo( + destination.clone(), + (native_token.clone(), amount).into(), + 0 + ), DispatchError::Module(sp_runtime::ModuleError { index: 31, error: [1, 0, 0, 0], @@ -98,9 +102,10 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { newer_xcm_version, ); // send XCM from AssetHubRococo - ok - assert_ok!(send_asset_from_asset_hub_rococo( + assert_ok!(send_assets_from_asset_hub_rococo( destination.clone(), - (native_token.clone(), amount) + (native_token.clone(), amount).into(), + 0, )); // `ExportMessage` on local BridgeHub - fails - remote BridgeHub version not known @@ -115,9 +120,10 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { ); // send XCM from AssetHubRococo - ok - assert_ok!(send_asset_from_asset_hub_rococo( + assert_ok!(send_assets_from_asset_hub_rococo( destination.clone(), - (native_token.clone(), amount) + (native_token.clone(), amount).into(), + 0, )); assert_bridge_hub_rococo_message_accepted(true); assert_bridge_hub_westend_message_received(); diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 8196b27cfe0..e2f62fdb94e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -34,10 +34,10 @@ use sp_runtime::{DispatchError::Token, TokenError::FundsUnavailable}; use testnet_parachains_constants::rococo::snowbridge::EthereumNetwork; const INITIAL_FUND: u128 = 5_000_000_000 * ROCOCO_ED; -const CHAIN_ID: u64 = 11155111; +pub const CHAIN_ID: u64 = 11155111; const TREASURY_ACCOUNT: [u8; 32] = hex!("6d6f646c70792f74727372790000000000000000000000000000000000000000"); -const WETH: [u8; 20] = hex!("87d1f7fdfEe7f651FaBc8bFCB6E086C278b77A7d"); +pub const WETH: [u8; 20] = hex!("87d1f7fdfEe7f651FaBc8bFCB6E086C278b77A7d"); const ETHEREUM_DESTINATION_ADDRESS: [u8; 20] = hex!("44a57ee2f2FCcb85FDa2B0B18EBD0D8D2333700e"); const INSUFFICIENT_XCM_FEE: u128 = 1000; const XCM_FEE: u128 = 4_000_000_000; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml index 9ea8d0b81bd..4be226f0dc7 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml @@ -11,6 +11,7 @@ publish = false workspace = true [dependencies] +hex-literal = { workspace = true, default-features = true } # Substrate frame-support = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs index 36b846e1031..b92a22cef62 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs @@ -36,11 +36,13 @@ mod imports { xcm_emulator::{ assert_expected_events, bx, Chain, Parachain as Para, RelayChain as Relay, TestExt, }, + ASSETS_PALLET_ID, USDT_ID, }; pub use parachains_common::AccountId; pub use rococo_westend_system_emulated_network::{ asset_hub_rococo_emulated_chain::{ - genesis::ED as ASSET_HUB_ROCOCO_ED, AssetHubRococoParaPallet as AssetHubRococoPallet, + genesis::{AssetHubRococoAssetOwner, ED as ASSET_HUB_ROCOCO_ED}, + AssetHubRococoParaPallet as AssetHubRococoPallet, }, asset_hub_westend_emulated_chain::{ genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet, diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs index 597e77d9049..63ccb0ff486 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs @@ -14,7 +14,7 @@ // limitations under the License. use crate::tests::*; -fn send_asset_from_asset_hub_westend_to_asset_hub_rococo(id: Location, amount: u128) { +fn send_assets_from_asset_hub_westend_to_asset_hub_rococo(assets: Assets, fee_idx: u32) { let destination = asset_hub_rococo_location(); // fund the AHW's SA on BHW for paying bridge transport fees @@ -25,7 +25,7 @@ fn send_asset_from_asset_hub_westend_to_asset_hub_rococo(id: Location, amount: u BridgeHubWestend::force_xcm_version(bridge_hub_rococo_location(), XCM_VERSION); // send message over bridge - assert_ok!(send_asset_from_asset_hub_westend(destination, (id, amount))); + assert_ok!(send_assets_from_asset_hub_westend(destination, assets, fee_idx)); assert_bridge_hub_westend_message_accepted(true); assert_bridge_hub_rococo_message_received(); } @@ -102,77 +102,33 @@ fn send_asset_from_penpal_westend_through_local_asset_hub_to_rococo_asset_hub( } #[test] +/// Test transfer of WND from AssetHub Westend to AssetHub Rococo. fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { - let wnd_at_asset_hub_westend: Location = Parent.into(); - let wnd_at_asset_hub_rococo = - v3::Location::new(2, [v3::Junction::GlobalConsensus(v3::NetworkId::Westend)]); - let owner: AccountId = AssetHubRococo::account_id_of(ALICE); - AssetHubRococo::force_create_foreign_asset( - wnd_at_asset_hub_rococo, - owner, - true, - ASSET_MIN_BALANCE, - vec![], - ); + let amount = ASSET_HUB_WESTEND_ED * 1_000; + let sender = AssetHubWestendSender::get(); + let receiver = AssetHubRococoReceiver::get(); + let wnd_at_asset_hub_westend = wnd_at_ah_westend(); + let bridged_wnd_at_asset_hub_rococo = bridged_wnd_at_ah_rococo().try_into().unwrap(); + create_foreign_on_ah_rococo(bridged_wnd_at_asset_hub_rococo, true); + + set_up_pool_with_roc_on_ah_rococo(bridged_wnd_at_asset_hub_rococo, true); + let sov_ahr_on_ahw = AssetHubWestend::sovereign_account_of_parachain_on_other_global_consensus( Rococo, AssetHubRococo::para_id(), ); - - AssetHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - // setup a pool to pay xcm fees with `wnd_at_asset_hub_rococo` tokens - assert_ok!(::ForeignAssets::mint( - ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - wnd_at_asset_hub_rococo.into(), - AssetHubRococoSender::get().into(), - 3_000_000_000_000, - )); - - assert_ok!(::AssetConversion::create_pool( - ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - Box::new(xcm::v3::Parent.into()), - Box::new(wnd_at_asset_hub_rococo), - )); - - assert_expected_events!( - AssetHubRococo, - vec![ - RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::PoolCreated { .. }) => {}, - ] - ); - - assert_ok!(::AssetConversion::add_liquidity( - ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - Box::new(xcm::v3::Parent.into()), - Box::new(wnd_at_asset_hub_rococo), - 1_000_000_000_000, - 2_000_000_000_000, - 1, - 1, - AssetHubRococoSender::get().into() - )); - - assert_expected_events!( - AssetHubRococo, - vec![ - RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {..}) => {}, - ] - ); - }); - let wnds_in_reserve_on_ahw_before = ::account_data_of(sov_ahr_on_ahw.clone()).free; - let sender_wnds_before = - ::account_data_of(AssetHubWestendSender::get()).free; - let receiver_wnds_before = AssetHubRococo::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance(wnd_at_asset_hub_rococo, &AssetHubRococoReceiver::get()) - }); + let sender_wnds_before = ::account_data_of(sender.clone()).free; + let receiver_wnds_before = + foreign_balance_on_ah_rococo(bridged_wnd_at_asset_hub_rococo, &receiver); - let amount = ASSET_HUB_WESTEND_ED * 1_000; - send_asset_from_asset_hub_westend_to_asset_hub_rococo(wnd_at_asset_hub_westend, amount); + // send WNDs, use them for fees + let assets: Assets = (wnd_at_asset_hub_westend, amount).into(); + let fee_index = 0; + send_assets_from_asset_hub_westend_to_asset_hub_rococo(assets, fee_index); + + // verify expected events on final destination AssetHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( @@ -180,8 +136,8 @@ fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { vec![ // issue WNDs on AHR RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { - asset_id: *asset_id == wnd_at_asset_hub_rococo, - owner: *owner == AssetHubRococoReceiver::get(), + asset_id: *asset_id == bridged_wnd_at_asset_hub_rococo, + owner: *owner == receiver, }, // message processed successfully RuntimeEvent::MessageQueue( @@ -191,12 +147,9 @@ fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { ); }); - let sender_wnds_after = - ::account_data_of(AssetHubWestendSender::get()).free; - let receiver_wnds_after = AssetHubRococo::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance(wnd_at_asset_hub_rococo, &AssetHubRococoReceiver::get()) - }); + let sender_wnds_after = ::account_data_of(sender).free; + let receiver_wnds_after = + foreign_balance_on_ah_rococo(bridged_wnd_at_asset_hub_rococo, &receiver); let wnds_in_reserve_on_ahw_after = ::account_data_of(sov_ahr_on_ahw).free; @@ -209,18 +162,27 @@ fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { } #[test] -fn send_rocs_from_asset_hub_westend_to_asset_hub_rococo() { +/// Send bridged assets "back" from AssetHub Rococo to AssetHub Westend. +/// +/// This mix of assets should cover the whole range: +/// - bridged native assets: ROC, +/// - bridged trust-based assets: USDT (exists only on Rococo, Westend gets it from Rococo over +/// bridge), +/// - bridged foreign asset / double-bridged asset (other bridge / Snowfork): wETH (bridged from +/// Ethereum to Rococo over Snowbridge, then bridged over to Westend through this bridge). +fn send_back_rocs_usdt_and_weth_from_asset_hub_westend_to_asset_hub_rococo() { let prefund_amount = 10_000_000_000_000u128; - let roc_at_asset_hub_westend = - v3::Location::new(2, [v3::Junction::GlobalConsensus(v3::NetworkId::Rococo)]); - let owner: AccountId = AssetHubWestend::account_id_of(ALICE); - AssetHubWestend::force_create_foreign_asset( - roc_at_asset_hub_westend, - owner, - true, - ASSET_MIN_BALANCE, - vec![(AssetHubWestendSender::get(), prefund_amount)], - ); + let sender = AssetHubWestendSender::get(); + let receiver = AssetHubRococoReceiver::get(); + let bridged_roc_at_asset_hub_westend = bridged_roc_at_ah_westend(); + let bridged_roc_at_asset_hub_westend_v3 = + bridged_roc_at_asset_hub_westend.clone().try_into().unwrap(); + let prefund_accounts = vec![(sender.clone(), prefund_amount)]; + create_foreign_on_ah_westend(bridged_roc_at_asset_hub_westend_v3, true, prefund_accounts); + + //////////////////////////////////////////////////////////// + // Let's first send back just some ROCs as a simple example + //////////////////////////////////////////////////////////// // fund the AHW's SA on AHR with the ROC tokens held in reserve let sov_ahw_on_ahr = AssetHubRococo::sovereign_account_of_parachain_on_other_global_consensus( @@ -232,18 +194,16 @@ fn send_rocs_from_asset_hub_westend_to_asset_hub_rococo() { let rocs_in_reserve_on_ahr_before = ::account_data_of(sov_ahw_on_ahr.clone()).free; assert_eq!(rocs_in_reserve_on_ahr_before, prefund_amount); - let sender_rocs_before = AssetHubWestend::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance(roc_at_asset_hub_westend, &AssetHubWestendSender::get()) - }); + + let sender_rocs_before = + foreign_balance_on_ah_westend(bridged_roc_at_asset_hub_westend_v3, &sender); assert_eq!(sender_rocs_before, prefund_amount); - let receiver_rocs_before = - ::account_data_of(AssetHubRococoReceiver::get()).free; + let receiver_rocs_before = ::account_data_of(receiver.clone()).free; let amount_to_send = ASSET_HUB_ROCOCO_ED * 1_000; - send_asset_from_asset_hub_westend_to_asset_hub_rococo( - roc_at_asset_hub_westend.try_into().unwrap(), - amount_to_send, + send_assets_from_asset_hub_westend_to_asset_hub_rococo( + (bridged_roc_at_asset_hub_westend, amount_to_send).into(), + 0, ); AssetHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; @@ -259,7 +219,7 @@ fn send_rocs_from_asset_hub_westend_to_asset_hub_rococo() { }, // ROCs deposited to beneficiary RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { - who: *who == AssetHubRococoReceiver::get(), + who: *who == receiver, }, // message processed successfully RuntimeEvent::MessageQueue( @@ -269,12 +229,9 @@ fn send_rocs_from_asset_hub_westend_to_asset_hub_rococo() { ); }); - let sender_rocs_after = AssetHubWestend::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance(roc_at_asset_hub_westend, &AssetHubWestendSender::get()) - }); - let receiver_rocs_after = - ::account_data_of(AssetHubRococoReceiver::get()).free; + let sender_rocs_after = + foreign_balance_on_ah_westend(bridged_roc_at_asset_hub_westend_v3, &sender); + let receiver_rocs_after = ::account_data_of(receiver.clone()).free; let rocs_in_reserve_on_ahr_after = ::account_data_of(sov_ahw_on_ahr.clone()).free; @@ -284,26 +241,107 @@ fn send_rocs_from_asset_hub_westend_to_asset_hub_rococo() { assert!(receiver_rocs_after > receiver_rocs_before); // Reserve balance is reduced by sent amount assert_eq!(rocs_in_reserve_on_ahr_after, rocs_in_reserve_on_ahr_before - amount_to_send); + + ////////////////////////////////////////////////////////////////// + // Now let's send back over USDTs + wETH (and pay fees with USDT) + ////////////////////////////////////////////////////////////////// + + // wETH has same relative location on both Rococo and Westend AssetHubs + let bridged_weth_at_ah = weth_at_asset_hubs().try_into().unwrap(); + let bridged_usdt_at_asset_hub_westend = bridged_usdt_at_ah_westend().try_into().unwrap(); + + // set up destination chain AH Rococo: + // create a ROC/USDT pool to be able to pay fees with USDT (USDT created in genesis) + set_up_pool_with_roc_on_ah_rococo(usdt_at_ah_rococo().try_into().unwrap(), false); + // create wETH on Rococo (IRL it's already created by Snowbridge) + create_foreign_on_ah_rococo(bridged_weth_at_ah, true); + // prefund AHW's sovereign account on AHR to be able to withdraw USDT and wETH from reserves + let sov_ahw_on_ahr = AssetHubRococo::sovereign_account_of_parachain_on_other_global_consensus( + Westend, + AssetHubWestend::para_id(), + ); + AssetHubRococo::mint_asset( + ::RuntimeOrigin::signed(AssetHubRococoAssetOwner::get()), + USDT_ID, + sov_ahw_on_ahr.clone(), + amount_to_send * 2, + ); + AssetHubRococo::mint_foreign_asset( + ::RuntimeOrigin::signed(AssetHubRococo::account_id_of(ALICE)), + bridged_weth_at_ah, + sov_ahw_on_ahr, + amount_to_send * 2, + ); + + // set up source chain AH Westend: + // create wETH and USDT foreign assets on Westend and prefund sender's account + let prefund_accounts = vec![(sender.clone(), amount_to_send * 2)]; + create_foreign_on_ah_westend(bridged_weth_at_ah, true, prefund_accounts.clone()); + create_foreign_on_ah_westend(bridged_usdt_at_asset_hub_westend, true, prefund_accounts); + + // check balances before + let receiver_usdts_before = AssetHubRococo::execute_with(|| { + type Assets = ::Assets; + >::balance(USDT_ID, &receiver) + }); + let receiver_weth_before = foreign_balance_on_ah_rococo(bridged_weth_at_ah, &receiver); + + let usdt_id: AssetId = Location::try_from(bridged_usdt_at_asset_hub_westend).unwrap().into(); + // send USDTs and wETHs + let assets: Assets = vec![ + (usdt_id.clone(), amount_to_send).into(), + (Location::try_from(bridged_weth_at_ah).unwrap(), amount_to_send).into(), + ] + .into(); + // use USDT for fees + let fee = usdt_id; + + // use the more involved transfer extrinsic + let custom_xcm_on_dest = Xcm::<()>(vec![DepositAsset { + assets: Wild(AllCounted(assets.len() as u32)), + beneficiary: AccountId32Junction { network: None, id: receiver.clone().into() }.into(), + }]); + assert_ok!(AssetHubWestend::execute_with(|| { + ::PolkadotXcm::transfer_assets_using_type_and_then( + ::RuntimeOrigin::signed(sender.into()), + bx!(asset_hub_rococo_location().into()), + bx!(assets.into()), + bx!(TransferType::DestinationReserve), + bx!(fee.into()), + bx!(TransferType::DestinationReserve), + bx!(VersionedXcm::from(custom_xcm_on_dest)), + WeightLimit::Unlimited, + ) + })); + // verify hops (also advances the message through the hops) + assert_bridge_hub_westend_message_accepted(true); + assert_bridge_hub_rococo_message_received(); + AssetHubRococo::execute_with(|| { + AssetHubRococo::assert_xcmp_queue_success(None); + }); + + let receiver_usdts_after = AssetHubRococo::execute_with(|| { + type Assets = ::Assets; + >::balance(USDT_ID, &receiver) + }); + let receiver_weth_after = foreign_balance_on_ah_rococo(bridged_weth_at_ah, &receiver); + + // Receiver's USDT balance is increased by almost `amount_to_send` (minus fees) + assert!(receiver_usdts_after > receiver_usdts_before); + assert!(receiver_usdts_after < receiver_usdts_before + amount_to_send); + // Receiver's wETH balance is increased by `amount_to_send` + assert_eq!(receiver_weth_after, receiver_weth_before + amount_to_send); } #[test] fn send_wnds_from_penpal_westend_through_asset_hub_westend_to_asset_hub_rococo() { - let wnd_at_westend_parachains: Location = Parent.into(); - let wnd_at_asset_hub_rococo = Location::new(2, [Junction::GlobalConsensus(NetworkId::Westend)]); - let owner: AccountId = AssetHubRococo::account_id_of(ALICE); - AssetHubRococo::force_create_foreign_asset( - wnd_at_asset_hub_rococo.clone().try_into().unwrap(), - owner, - true, - ASSET_MIN_BALANCE, - vec![], - ); - let sov_ahr_on_ahw = AssetHubWestend::sovereign_account_of_parachain_on_other_global_consensus( - Rococo, - AssetHubRococo::para_id(), - ); + let wnd_at_westend_parachains = wnd_at_ah_westend(); + let wnd_at_asset_hub_rococo = bridged_wnd_at_ah_rococo().try_into().unwrap(); + create_foreign_on_ah_rococo(wnd_at_asset_hub_rococo, true); let amount = ASSET_HUB_WESTEND_ED * 10_000_000; + let sender = PenpalBSender::get(); + let receiver = AssetHubRococoReceiver::get(); let penpal_location = AssetHubWestend::sibling_location_of(PenpalB::para_id()); let sov_penpal_on_ahw = AssetHubWestend::sovereign_account_id_of(penpal_location); // fund Penpal's sovereign account on AssetHub @@ -312,26 +350,23 @@ fn send_wnds_from_penpal_westend_through_asset_hub_westend_to_asset_hub_rococo() PenpalB::mint_foreign_asset( ::RuntimeOrigin::signed(PenpalAssetOwner::get()), wnd_at_westend_parachains.clone(), - PenpalBSender::get(), + sender.clone(), amount * 2, ); + let sov_ahr_on_ahw = AssetHubWestend::sovereign_account_of_parachain_on_other_global_consensus( + Rococo, + AssetHubRococo::para_id(), + ); let wnds_in_reserve_on_ahw_before = ::account_data_of(sov_ahr_on_ahw.clone()).free; let sender_wnds_before = PenpalB::execute_with(|| { type ForeignAssets = ::ForeignAssets; - >::balance( - wnd_at_westend_parachains.clone(), - &PenpalBSender::get(), - ) - }); - let receiver_wnds_before = AssetHubRococo::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance( - wnd_at_asset_hub_rococo.clone().try_into().unwrap(), - &AssetHubRococoReceiver::get(), - ) + >::balance(wnd_at_westend_parachains.clone(), &sender) }); + let receiver_wnds_before = foreign_balance_on_ah_rococo(wnd_at_asset_hub_rococo, &receiver); + + // Send WNDs over bridge send_asset_from_penpal_westend_through_local_asset_hub_to_rococo_asset_hub( wnd_at_westend_parachains.clone(), amount, @@ -345,7 +380,7 @@ fn send_wnds_from_penpal_westend_through_asset_hub_westend_to_asset_hub_rococo() // issue WNDs on AHR RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { asset_id: *asset_id == wnd_at_westend_parachains.clone().try_into().unwrap(), - owner: *owner == AssetHubRococoReceiver::get(), + owner: owner == &receiver, }, // message processed successfully RuntimeEvent::MessageQueue( @@ -357,15 +392,9 @@ fn send_wnds_from_penpal_westend_through_asset_hub_westend_to_asset_hub_rococo() let sender_wnds_after = PenpalB::execute_with(|| { type ForeignAssets = ::ForeignAssets; - >::balance(wnd_at_westend_parachains, &PenpalBSender::get()) - }); - let receiver_wnds_after = AssetHubRococo::execute_with(|| { - type Assets = ::ForeignAssets; - >::balance( - wnd_at_asset_hub_rococo.try_into().unwrap(), - &AssetHubRococoReceiver::get(), - ) + >::balance(wnd_at_westend_parachains, &sender) }); + let receiver_wnds_after = foreign_balance_on_ah_rococo(wnd_at_asset_hub_rococo, &receiver); let wnds_in_reserve_on_ahw_after = ::account_data_of(sov_ahr_on_ahw.clone()).free; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs index b781d6e987c..92e864229a9 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs @@ -19,40 +19,161 @@ mod asset_transfers; mod send_xcm; mod teleport; +mod snowbridge { + pub const CHAIN_ID: u64 = 11155111; + pub const WETH: [u8; 20] = hex_literal::hex!("87d1f7fdfEe7f651FaBc8bFCB6E086C278b77A7d"); +} + pub(crate) fn asset_hub_rococo_location() -> Location { + Location::new(2, [GlobalConsensus(Rococo), Parachain(AssetHubRococo::para_id().into())]) +} + +pub(crate) fn bridge_hub_rococo_location() -> Location { + Location::new(2, [GlobalConsensus(Rococo), Parachain(BridgeHubRococo::para_id().into())]) +} + +// WND and wWND +pub(crate) fn wnd_at_ah_westend() -> Location { + Parent.into() +} +pub(crate) fn bridged_wnd_at_ah_rococo() -> Location { + Location::new(2, [GlobalConsensus(Westend)]) +} + +// wROC +pub(crate) fn bridged_roc_at_ah_westend() -> Location { + Location::new(2, [GlobalConsensus(Rococo)]) +} + +// USDT and wUSDT +pub(crate) fn usdt_at_ah_rococo() -> Location { + Location::new(0, [PalletInstance(ASSETS_PALLET_ID), GeneralIndex(USDT_ID.into())]) +} +pub(crate) fn bridged_usdt_at_ah_westend() -> Location { Location::new( 2, - [GlobalConsensus(NetworkId::Rococo), Parachain(AssetHubRococo::para_id().into())], + [ + GlobalConsensus(Rococo), + Parachain(AssetHubRococo::para_id().into()), + PalletInstance(ASSETS_PALLET_ID), + GeneralIndex(USDT_ID.into()), + ], ) } -pub(crate) fn bridge_hub_rococo_location() -> Location { +// wETH has same relative location on both Rococo and Westend AssetHubs +pub(crate) fn weth_at_asset_hubs() -> Location { Location::new( 2, - [GlobalConsensus(NetworkId::Rococo), Parachain(BridgeHubRococo::para_id().into())], + [ + GlobalConsensus(Ethereum { chain_id: snowbridge::CHAIN_ID }), + AccountKey20 { network: None, key: snowbridge::WETH }, + ], ) } -pub(crate) fn send_asset_from_asset_hub_westend( +pub(crate) fn create_foreign_on_ah_rococo(id: v3::Location, sufficient: bool) { + let owner = AssetHubRococo::account_id_of(ALICE); + AssetHubRococo::force_create_foreign_asset(id, owner, sufficient, ASSET_MIN_BALANCE, vec![]); +} + +pub(crate) fn create_foreign_on_ah_westend( + id: v3::Location, + sufficient: bool, + prefund_accounts: Vec<(AccountId, u128)>, +) { + let owner = AssetHubWestend::account_id_of(ALICE); + let min = ASSET_MIN_BALANCE; + AssetHubWestend::force_create_foreign_asset(id, owner, sufficient, min, prefund_accounts); +} + +pub(crate) fn foreign_balance_on_ah_rococo(id: v3::Location, who: &AccountId) -> u128 { + AssetHubRococo::execute_with(|| { + type Assets = ::ForeignAssets; + >::balance(id, who) + }) +} +pub(crate) fn foreign_balance_on_ah_westend(id: v3::Location, who: &AccountId) -> u128 { + AssetHubWestend::execute_with(|| { + type Assets = ::ForeignAssets; + >::balance(id, who) + }) +} + +// set up pool +pub(crate) fn set_up_pool_with_roc_on_ah_rococo(asset: v3::Location, is_foreign: bool) { + let roc: v3::Location = v3::Parent.into(); + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + let owner = AssetHubRococoSender::get(); + let signed_owner = ::RuntimeOrigin::signed(owner.clone()); + + if is_foreign { + assert_ok!(::ForeignAssets::mint( + signed_owner.clone(), + asset.into(), + owner.clone().into(), + 3_000_000_000_000, + )); + } else { + let asset_id = match asset.interior.split_last() { + (_, Some(v3::Junction::GeneralIndex(id))) => id as u32, + _ => unreachable!(), + }; + assert_ok!(::Assets::mint( + signed_owner.clone(), + asset_id.into(), + owner.clone().into(), + 3_000_000_000_000, + )); + } + assert_ok!(::AssetConversion::create_pool( + signed_owner.clone(), + Box::new(roc), + Box::new(asset), + )); + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::PoolCreated { .. }) => {}, + ] + ); + assert_ok!(::AssetConversion::add_liquidity( + signed_owner.clone(), + Box::new(roc), + Box::new(asset), + 1_000_000_000_000, + 2_000_000_000_000, + 1, + 1, + owner.into() + )); + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {..}) => {}, + ] + ); + }); +} + +pub(crate) fn send_assets_from_asset_hub_westend( destination: Location, - (id, amount): (Location, u128), + assets: Assets, + fee_idx: u32, ) -> DispatchResult { let signed_origin = ::RuntimeOrigin::signed(AssetHubWestendSender::get().into()); - let beneficiary: Location = AccountId32Junction { network: None, id: AssetHubRococoReceiver::get().into() }.into(); - let assets: Assets = (id, amount).into(); - let fee_asset_item = 0; - AssetHubWestend::execute_with(|| { ::PolkadotXcm::limited_reserve_transfer_assets( signed_origin, bx!(destination.into()), bx!(beneficiary.into()), bx!(assets.into()), - fee_asset_item, + fee_idx, WeightLimit::Unlimited, ) }) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs index 8539df97be9..dee411bea8b 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs @@ -81,7 +81,11 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { // send XCM from AssetHubWestend - fails - destination version not known assert_err!( - send_asset_from_asset_hub_westend(destination.clone(), (native_token.clone(), amount)), + send_assets_from_asset_hub_westend( + destination.clone(), + (native_token.clone(), amount).into(), + 0 + ), DispatchError::Module(sp_runtime::ModuleError { index: 31, error: [1, 0, 0, 0], @@ -98,9 +102,10 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { newer_xcm_version, ); // send XCM from AssetHubWestend - ok - assert_ok!(send_asset_from_asset_hub_westend( + assert_ok!(send_assets_from_asset_hub_westend( destination.clone(), - (native_token.clone(), amount) + (native_token.clone(), amount).into(), + 0 )); // `ExportMessage` on local BridgeHub - fails - remote BridgeHub version not known @@ -115,9 +120,10 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { ); // send XCM from AssetHubWestend - ok - assert_ok!(send_asset_from_asset_hub_westend( + assert_ok!(send_assets_from_asset_hub_westend( destination.clone(), - (native_token.clone(), amount) + (native_token.clone(), amount).into(), + 0 )); assert_bridge_hub_westend_message_accepted(true); assert_bridge_hub_rococo_message_received(); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index cf5a3905e58..03de2c971b7 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -337,10 +337,11 @@ impl xcm_executor::Config for XcmConfig { type OriginConverter = XcmOriginToTransactDispatchOrigin; // Asset Hub trusts only particular, pre-configured bridged locations from a different consensus // as reserve locations (we trust the Bridge Hub to relay the message that a reserve is being - // held). Asset Hub may _act_ as a reserve location for ROC and assets created - // under `pallet-assets`. Users must use teleport where allowed (e.g. ROC with the Relay Chain). + // held). On Rococo Asset Hub, we allow Westend Asset Hub to act as reserve for any asset native + // to the Westend ecosystem. We also allow Ethereum contracts to act as reserves for the foreign + // assets identified by the same respective contracts locations. type IsReserve = ( - bridging::to_westend::IsTrustedBridgedReserveLocationForConcreteAsset, + bridging::to_westend::WestendAssetFromAssetHubWestend, bridging::to_ethereum::IsTrustedBridgedReserveLocationForForeignAsset, ); type IsTeleporter = TrustedTeleporters; @@ -568,13 +569,12 @@ pub mod bridging { ); pub const WestendNetwork: NetworkId = NetworkId::Westend; - pub AssetHubWestend: Location = Location::new(2, [GlobalConsensus(WestendNetwork::get()), Parachain(bp_asset_hub_westend::ASSET_HUB_WESTEND_PARACHAIN_ID)]); + pub WestendEcosystem: Location = Location::new(2, [GlobalConsensus(WestendNetwork::get())]); pub WndLocation: Location = Location::new(2, [GlobalConsensus(WestendNetwork::get())]); - - pub WndFromAssetHubWestend: (AssetFilter, Location) = ( - Wild(AllOf { fun: WildFungible, id: AssetId(WndLocation::get()) }), - AssetHubWestend::get() - ); + pub AssetHubWestend: Location = Location::new(2, [ + GlobalConsensus(WestendNetwork::get()), + Parachain(bp_asset_hub_westend::ASSET_HUB_WESTEND_PARACHAIN_ID) + ]); /// Set up exporters configuration. /// `Option` represents static "base fee" which is used for total delivery fee calculation. @@ -607,17 +607,9 @@ pub mod bridging { } } - /// Trusted reserve locations filter for `xcm_executor::Config::IsReserve`. - /// Locations from which the runtime accepts reserved assets. - pub type IsTrustedBridgedReserveLocationForConcreteAsset = - matching::IsTrustedBridgedReserveLocationForConcreteAsset< - UniversalLocation, - ( - // allow receive WND from AssetHubWestend - xcm_builder::Case, - // and nothing else - ), - >; + /// Allow any asset native to the Westend ecosystem if it comes from Westend Asset Hub. + pub type WestendAssetFromAssetHubWestend = + matching::RemoteAssetFromLocation, AssetHubWestend>; impl Contains for ToWestendXcmRouter { fn contains(call: &RuntimeCall) -> bool { @@ -672,7 +664,7 @@ pub mod bridging { } pub type IsTrustedBridgedReserveLocationForForeignAsset = - matching::IsForeignConcreteAsset>; + IsForeignConcreteAsset>; impl Contains<(Location, Junction)> for UniversalAliases { fn contains(alias: &(Location, Junction)) -> bool { diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index ff1fc99cba8..fc2e68c599f 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -357,9 +357,9 @@ impl xcm_executor::Config for XcmConfig { type OriginConverter = XcmOriginToTransactDispatchOrigin; // Asset Hub trusts only particular, pre-configured bridged locations from a different consensus // as reserve locations (we trust the Bridge Hub to relay the message that a reserve is being - // held). Asset Hub may _act_ as a reserve location for WND and assets created - // under `pallet-assets`. Users must use teleport where allowed (e.g. WND with the Relay Chain). - type IsReserve = (bridging::to_rococo::IsTrustedBridgedReserveLocationForConcreteAsset,); + // held). On Westend Asset Hub, we allow Rococo Asset Hub to act as reserve for any asset native + // to the Rococo or Ethereum ecosystems. + type IsReserve = (bridging::to_rococo::RococoOrEthereumAssetFromAssetHubRococo,); type IsTeleporter = TrustedTeleporters; type UniversalLocation = UniversalLocation; type Barrier = Barrier; @@ -569,13 +569,14 @@ pub mod bridging { ); pub const RococoNetwork: NetworkId = NetworkId::Rococo; - pub AssetHubRococo: Location = Location::new(2, [GlobalConsensus(RococoNetwork::get()), Parachain(bp_asset_hub_rococo::ASSET_HUB_ROCOCO_PARACHAIN_ID)]); + pub const EthereumNetwork: NetworkId = NetworkId::Ethereum { chain_id: 11155111 }; + pub RococoEcosystem: Location = Location::new(2, [GlobalConsensus(RococoNetwork::get())]); pub RocLocation: Location = Location::new(2, [GlobalConsensus(RococoNetwork::get())]); - - pub RocFromAssetHubRococo: (AssetFilter, Location) = ( - Wild(AllOf { fun: WildFungible, id: AssetId(RocLocation::get()) }), - AssetHubRococo::get() - ); + pub EthereumEcosystem: Location = Location::new(2, [GlobalConsensus(EthereumNetwork::get())]); + pub AssetHubRococo: Location = Location::new(2, [ + GlobalConsensus(RococoNetwork::get()), + Parachain(bp_asset_hub_rococo::ASSET_HUB_ROCOCO_PARACHAIN_ID) + ]); /// Set up exporters configuration. /// `Option` represents static "base fee" which is used for total delivery fee calculation. @@ -608,17 +609,12 @@ pub mod bridging { } } - /// Reserve locations filter for `xcm_executor::Config::IsReserve`. - /// Locations from which the runtime accepts reserved assets. - pub type IsTrustedBridgedReserveLocationForConcreteAsset = - matching::IsTrustedBridgedReserveLocationForConcreteAsset< - UniversalLocation, - ( - // allow receive ROC from AssetHubRococo - xcm_builder::Case, - // and nothing else - ), - >; + /// Allow any asset native to the Rococo or Ethereum ecosystems if it comes from Rococo + /// Asset Hub. + pub type RococoOrEthereumAssetFromAssetHubRococo = matching::RemoteAssetFromLocation< + (StartsWith, StartsWith), + AssetHubRococo, + >; impl Contains for ToRococoXcmRouter { fn contains(call: &RuntimeCall) -> bool { diff --git a/cumulus/parachains/runtimes/assets/common/src/matching.rs b/cumulus/parachains/runtimes/assets/common/src/matching.rs index 3aad88e177c..f356cb54131 100644 --- a/cumulus/parachains/runtimes/assets/common/src/matching.rs +++ b/cumulus/parachains/runtimes/assets/common/src/matching.rs @@ -14,7 +14,10 @@ // limitations under the License. use cumulus_primitives_core::ParaId; -use frame_support::{pallet_prelude::Get, traits::ContainsPair}; +use frame_support::{ + pallet_prelude::Get, + traits::{Contains, ContainsPair}, +}; use xcm::prelude::*; use xcm_builder::ensure_is_remote; @@ -94,36 +97,33 @@ impl< } } -/// Adapter verifies if it is allowed to receive `Asset` from `Location`. -/// -/// Note: `Location` has to be from a different global consensus. -pub struct IsTrustedBridgedReserveLocationForConcreteAsset( - sp_std::marker::PhantomData<(UniversalLocation, Reserves)>, +/// Accept an asset if it is native to `AssetsAllowedNetworks` and it is coming from +/// `OriginLocation`. +pub struct RemoteAssetFromLocation( + sp_std::marker::PhantomData<(AssetsAllowedNetworks, OriginLocation)>, ); -impl, Reserves: ContainsPair> - ContainsPair - for IsTrustedBridgedReserveLocationForConcreteAsset +impl, OriginLocation: Get> + ContainsPair for RemoteAssetFromLocation { fn contains(asset: &Asset, origin: &Location) -> bool { - let universal_source = UniversalLocation::get(); - log::trace!( - target: "xcm::contains", - "IsTrustedBridgedReserveLocationForConcreteAsset asset: {:?}, origin: {:?}, universal_source: {:?}", - asset, origin, universal_source - ); - - // check remote origin - if ensure_is_remote(universal_source.clone(), origin.clone()).is_err() { + let expected_origin = OriginLocation::get(); + // ensure `origin` is expected `OriginLocation` + if !expected_origin.eq(origin) { log::trace!( target: "xcm::contains", - "IsTrustedBridgedReserveLocationForConcreteAsset origin: {:?} is not remote to the universal_source: {:?}", - origin, universal_source + "RemoteAssetFromLocation asset: {:?}, origin: {:?} is not from expected {:?}", + asset, origin, expected_origin, ); return false + } else { + log::trace!( + target: "xcm::contains", + "RemoteAssetFromLocation asset: {asset:?}, origin: {origin:?}", + ); } - // check asset according to the configured reserve locations - Reserves::contains(asset, origin) + // ensure `asset` is from remote consensus listed in `AssetsAllowedNetworks` + AssetsAllowedNetworks::contains(&asset.id.0) } } diff --git a/prdoc/pr_4888.prdoc b/prdoc/pr_4888.prdoc new file mode 100644 index 00000000000..e8cfb25d924 --- /dev/null +++ b/prdoc/pr_4888.prdoc @@ -0,0 +1,35 @@ +title: "Allow any asset over the bridge lane between the two Asset Hubs" + +doc: + - audience: Runtime User + description: | + Allow all Rococo-native, Westend-native and Ethereum-native assets to flow over + the bridge between the Rococo and Westend AssetHubs. + + On Rococo Asset Hub, we allow Westend Asset Hub to act as reserve for any asset + native to the Westend ecosystem. + We also allow Ethereum contracts to act as reserves for the foreign assets + identified by the same respective contracts locations (on the other side of Snowbridge). + + On Westend Asset Hub, we allow Rococo Asset Hub to act as reserve for any asset + native to the Rococo or Ethereum ecosystems (practically providing Westend access + to Ethereum assets through double bridging: Ethereum <> Rococo <> Westend). + +crates: + - name: assets-common + bump: major + - name: asset-hub-rococo-runtime + bump: major + - name: asset-hub-westend-runtime + bump: major + - name: asset-hub-rococo-emulated-chain + bump: minor + - name: asset-hub-rococo-integration-tests + bump: minor + - name: bridge-hub-rococo-integration-tests + bump: minor + - name: bridge-hub-westend-integration-tests + bump: minor + - name: emulated-integration-tests-common + bump: minor + -- GitLab From 31986a60b7492659e9a148843a752c2fcbb7d2f3 Mon Sep 17 00:00:00 2001 From: Santi Balaguer Date: Fri, 28 Jun 2024 15:20:11 +0200 Subject: [PATCH 072/130] Adds CheckMetadata SignedExtension to Coretime Parachains (Rococo and Westend) (#4738) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds the new `SignedExtension` to Coretime Rococo and Coretime Westend runtimes. --------- Co-authored-by: Dónal Murray --- Cargo.lock | 2 ++ .../coretime/coretime-rococo/Cargo.toml | 10 ++++++++ .../coretime/coretime-rococo/build.rs | 24 ++++++++++++------- .../coretime/coretime-rococo/src/lib.rs | 3 ++- .../coretime/coretime-westend/Cargo.toml | 10 ++++++++ .../coretime/coretime-westend/build.rs | 24 ++++++++++++------- .../coretime/coretime-westend/src/lib.rs | 3 ++- prdoc/pr_4738.prdoc | 18 ++++++++++++++ 8 files changed, 74 insertions(+), 20 deletions(-) create mode 100644 prdoc/pr_4738.prdoc diff --git a/Cargo.lock b/Cargo.lock index 8af41e3eae5..91d604d6fa3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3297,6 +3297,7 @@ dependencies = [ "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", + "frame-metadata-hash-extension", "frame-support", "frame-system", "frame-system-benchmarking", @@ -3363,6 +3364,7 @@ dependencies = [ "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", + "frame-metadata-hash-extension", "frame-support", "frame-system", "frame-system-benchmarking", diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml index ce6bdcdf4f2..57a0782b1ef 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml @@ -22,6 +22,7 @@ serde = { optional = true, features = ["derive"], workspace = true, default-feat # Substrate frame-benchmarking = { optional = true, workspace = true } frame-executive = { workspace = true } +frame-metadata-hash-extension = { workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } frame-system-benchmarking = { optional = true, workspace = true } @@ -94,6 +95,7 @@ std = [ "cumulus-primitives-utility/std", "frame-benchmarking?/std", "frame-executive/std", + "frame-metadata-hash-extension/std", "frame-support/std", "frame-system-benchmarking?/std", "frame-system-rpc-runtime-api/std", @@ -202,3 +204,11 @@ try-runtime = [ fast-runtime = [ "rococo-runtime-constants/fast-runtime", ] + +# Enable the metadata hash generation in the wasm builder. +metadata-hash = ["substrate-wasm-builder/metadata-hash"] + +# A feature that should be enabled when the runtime should be built for on-chain +# deployment. This will disable stuff that shouldn't be part of the on-chain wasm +# to make it smaller, like logging for example. +on-chain-release-build = ["metadata-hash", "sp-api/disable-logging"] diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs index 28dacd20cf3..368a1e427aa 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs @@ -13,20 +13,26 @@ // See the License for the specific language governing permissions and // limitations under the License. -#[cfg(feature = "std")] +#[cfg(all(not(feature = "metadata-hash"), feature = "std"))] fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() + substrate_wasm_builder::WasmBuilder::build_using_defaults(); + + substrate_wasm_builder::WasmBuilder::init_with_defaults() + .set_file_name("fast_runtime_binary.rs") + .enable_feature("fast-runtime") + .build(); +} + +#[cfg(all(feature = "metadata-hash", feature = "std"))] +fn main() { + substrate_wasm_builder::WasmBuilder::init_with_defaults() + .enable_metadata_hash("ROC", 12) .build(); - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() + substrate_wasm_builder::WasmBuilder::init_with_defaults() .set_file_name("fast_runtime_binary.rs") .enable_feature("fast-runtime") - .import_memory() - .export_heap_base() + .enable_metadata_hash("ROC", 12) .build(); } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 7bd3c675468..17030da51ec 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -104,6 +104,7 @@ pub type SignedExtra = ( frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, + frame_metadata_hash_extension::CheckMetadataHash, ); /// Unchecked extrinsic type as expected by this runtime. @@ -146,7 +147,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 1, + transaction_version: 2, state_version: 1, }; diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml index 735e9542197..d3bf6b43a7e 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml @@ -22,6 +22,7 @@ serde = { optional = true, features = ["derive"], workspace = true, default-feat # Substrate frame-benchmarking = { optional = true, workspace = true } frame-executive = { workspace = true } +frame-metadata-hash-extension = { workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } frame-system-benchmarking = { optional = true, workspace = true } @@ -94,6 +95,7 @@ std = [ "cumulus-primitives-utility/std", "frame-benchmarking?/std", "frame-executive/std", + "frame-metadata-hash-extension/std", "frame-support/std", "frame-system-benchmarking?/std", "frame-system-rpc-runtime-api/std", @@ -199,3 +201,11 @@ try-runtime = [ fast-runtime = [ "westend-runtime-constants/fast-runtime", ] + +# Enable the metadata hash generation in the wasm builder. +metadata-hash = ["substrate-wasm-builder/metadata-hash"] + +# A feature that should be enabled when the runtime should be built for on-chain +# deployment. This will disable stuff that shouldn't be part of the on-chain wasm +# to make it smaller, like logging for example. +on-chain-release-build = ["metadata-hash", "sp-api/disable-logging"] diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs index 28dacd20cf3..2f10a39d1b2 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs @@ -13,20 +13,26 @@ // See the License for the specific language governing permissions and // limitations under the License. -#[cfg(feature = "std")] +#[cfg(all(not(feature = "metadata-hash"), feature = "std"))] fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() + substrate_wasm_builder::WasmBuilder::build_using_defaults(); + + substrate_wasm_builder::WasmBuilder::init_with_defaults() + .set_file_name("fast_runtime_binary.rs") + .enable_feature("fast-runtime") + .build(); +} + +#[cfg(all(feature = "metadata-hash", feature = "std"))] +fn main() { + substrate_wasm_builder::WasmBuilder::init_with_defaults() + .enable_metadata_hash("WND", 12) .build(); - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() + substrate_wasm_builder::WasmBuilder::init_with_defaults() .set_file_name("fast_runtime_binary.rs") .enable_feature("fast-runtime") - .import_memory() - .export_heap_base() + .enable_metadata_hash("WND", 12) .build(); } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs index bc71ee705e9..1bd7e143c1b 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -104,6 +104,7 @@ pub type SignedExtra = ( frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, + frame_metadata_hash_extension::CheckMetadataHash, ); /// Unchecked extrinsic type as expected by this runtime. @@ -145,7 +146,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_version: 1_013_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 1, + transaction_version: 2, state_version: 1, }; diff --git a/prdoc/pr_4738.prdoc b/prdoc/pr_4738.prdoc new file mode 100644 index 00000000000..751f318e64f --- /dev/null +++ b/prdoc/pr_4738.prdoc @@ -0,0 +1,18 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Add CheckMetadata SignedExtension to Rococo and Westend Coretime chains + +doc: + - audience: Runtime User + description: | + This brings support for the new Ledger app and similar hardware wallets to the Coretime + Chain on Rococo and Westend. These hardware wallets will be able to decode the transaction + using the metadata. The runtime will ensure that the metadata used for this decoding process + is correct and that the online wallet did not try to trick you. + +crates: + - name: coretime-rococo-runtime + bump: major + - name: coretime-westend-runtime + bump: major -- GitLab From aaf0443591b134a0da217d575161872796e75059 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Fri, 28 Jun 2024 16:43:22 +0300 Subject: [PATCH 073/130] network: Sync peerstore constants between libp2p and litep2p (#4906) Counterpart of: https://github.com/paritytech/polkadot-sdk/pull/4031 cc @paritytech/networking --------- Signed-off-by: Alexandru Vasile Co-authored-by: Sebastian Kunert --- .../client/network/src/litep2p/peerstore.rs | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/substrate/client/network/src/litep2p/peerstore.rs b/substrate/client/network/src/litep2p/peerstore.rs index dd377ea09af..3f7155edbc9 100644 --- a/substrate/client/network/src/litep2p/peerstore.rs +++ b/substrate/client/network/src/litep2p/peerstore.rs @@ -42,14 +42,20 @@ use std::{ const LOG_TARGET: &str = "sub-libp2p::peerstore"; /// We don't accept nodes whose reputation is under this value. -pub const BANNED_THRESHOLD: i32 = 82 * (i32::MIN / 100); +pub const BANNED_THRESHOLD: i32 = 71 * (i32::MIN / 100); /// Relative decrement of a reputation value that is applied every second. I.e., for inverse -/// decrement of 50 we decrease absolute value of the reputation by 1/50. This corresponds to a -/// factor of `k = 0.98`. It takes ~ `ln(0.5) / ln(k)` seconds to reduce the reputation by half, -/// or 34.3 seconds for the values above. In this setup the maximum allowed absolute value of -/// `i32::MAX` becomes 0 in ~1100 seconds (actually less due to integer arithmetic). -const INVERSE_DECREMENT: i32 = 50; +/// decrement of 200 we decrease absolute value of the reputation by 1/200. +/// +/// This corresponds to a factor of `k = 0.995`, where k = 1 - 1 / INVERSE_DECREMENT. +/// +/// It takes ~ `ln(0.5) / ln(k)` seconds to reduce the reputation by half, or 138.63 seconds for the +/// values above. +/// +/// In this setup: +/// - `i32::MAX` becomes 0 in exactly 3544 seconds, or approximately 59 minutes +/// - `i32::MIN` escapes the banned threshold in 69 seconds +const INVERSE_DECREMENT: i32 = 200; /// Amount of time between the moment we last updated the [`PeerStore`] entry and the moment we /// remove it, once the reputation value reaches 0. @@ -362,7 +368,7 @@ mod tests { #[test] fn decaying_max_reputation_finally_yields_zero() { const INITIAL_REPUTATION: i32 = i32::MAX; - const SECONDS: u64 = 1000; + const SECONDS: u64 = 3544; let mut peer_info = PeerInfo::default(); peer_info.reputation = INITIAL_REPUTATION; @@ -377,7 +383,7 @@ mod tests { #[test] fn decaying_min_reputation_finally_yields_zero() { const INITIAL_REPUTATION: i32 = i32::MIN; - const SECONDS: u64 = 1000; + const SECONDS: u64 = 3544; let mut peer_info = PeerInfo::default(); peer_info.reputation = INITIAL_REPUTATION; -- GitLab From 333f4c78109345debb5cf6e8c8b3fe75a7bbe3fb Mon Sep 17 00:00:00 2001 From: "polka.dom" Date: Mon, 1 Jul 2024 05:25:26 -0700 Subject: [PATCH 074/130] Remove getters from pallet-membership (#4840) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As per #3326 , removes pallet::getter macro usage from pallet-membership. The syntax StorageItem::::get() should be used instead. Also converts some syntax to turbo and reimplements the removed getters, following #223 cc @muraca --------- Co-authored-by: Dónal Murray Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --- prdoc/pr_4840.prdoc | 14 ++ substrate/frame/membership/src/lib.rs | 176 +++++++++++++++----------- 2 files changed, 118 insertions(+), 72 deletions(-) create mode 100644 prdoc/pr_4840.prdoc diff --git a/prdoc/pr_4840.prdoc b/prdoc/pr_4840.prdoc new file mode 100644 index 00000000000..265e1f41c3f --- /dev/null +++ b/prdoc/pr_4840.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from pallet-membership + +doc: + - audience: Runtime Dev + description: | + This PR removed the `pallet::getter`s from `pallet-membership`. + The syntax `StorageItem::::get()` should be used instead. + +crates: + - name: pallet-membership + bump: minor \ No newline at end of file diff --git a/substrate/frame/membership/src/lib.rs b/substrate/frame/membership/src/lib.rs index 8deb4fc022f..d5dad68e811 100644 --- a/substrate/frame/membership/src/lib.rs +++ b/substrate/frame/membership/src/lib.rs @@ -95,13 +95,11 @@ pub mod pallet { /// The current membership, stored as an ordered Vec. #[pallet::storage] - #[pallet::getter(fn members)] pub type Members, I: 'static = ()> = StorageValue<_, BoundedVec, ValueQuery>; /// The current prime member, if one exists. #[pallet::storage] - #[pallet::getter(fn prime)] pub type Prime, I: 'static = ()> = StorageValue<_, T::AccountId, OptionQuery>; #[pallet::genesis_config] @@ -126,7 +124,7 @@ pub mod pallet { let mut members = self.members.clone(); members.sort(); T::MembershipInitialized::initialize_members(&members); - >::put(members); + Members::::put(members); } } @@ -171,14 +169,14 @@ pub mod pallet { T::AddOrigin::ensure_origin(origin)?; let who = T::Lookup::lookup(who)?; - let mut members = >::get(); + let mut members = Members::::get(); let init_length = members.len(); let location = members.binary_search(&who).err().ok_or(Error::::AlreadyMember)?; members .try_insert(location, who.clone()) .map_err(|_| Error::::TooManyMembers)?; - >::put(&members); + Members::::put(&members); T::MembershipChanged::change_members_sorted(&[who], &[], &members[..]); @@ -199,12 +197,12 @@ pub mod pallet { T::RemoveOrigin::ensure_origin(origin)?; let who = T::Lookup::lookup(who)?; - let mut members = >::get(); + let mut members = Members::::get(); let init_length = members.len(); let location = members.binary_search(&who).ok().ok_or(Error::::NotMember)?; members.remove(location); - >::put(&members); + Members::::put(&members); T::MembershipChanged::change_members_sorted(&[], &[who], &members[..]); Self::rejig_prime(&members); @@ -233,13 +231,13 @@ pub mod pallet { return Ok(().into()); } - let mut members = >::get(); + let mut members = Members::::get(); let location = members.binary_search(&remove).ok().ok_or(Error::::NotMember)?; let _ = members.binary_search(&add).err().ok_or(Error::::AlreadyMember)?; members[location] = add.clone(); members.sort(); - >::put(&members); + Members::::put(&members); T::MembershipChanged::change_members_sorted(&[add], &[remove], &members[..]); Self::rejig_prime(&members); @@ -260,7 +258,7 @@ pub mod pallet { let mut members: BoundedVec = BoundedVec::try_from(members).map_err(|_| Error::::TooManyMembers)?; members.sort(); - >::mutate(|m| { + Members::::mutate(|m| { T::MembershipChanged::set_members_sorted(&members[..], m); Self::rejig_prime(&members); *m = members; @@ -288,14 +286,14 @@ pub mod pallet { return Ok(().into()); } - let mut members = >::get(); + let mut members = Members::::get(); let members_length = members.len() as u32; let location = members.binary_search(&remove).ok().ok_or(Error::::NotMember)?; let _ = members.binary_search(&new).err().ok_or(Error::::AlreadyMember)?; members[location] = new.clone(); members.sort(); - >::put(&members); + Members::::put(&members); T::MembershipChanged::change_members_sorted( &[new.clone()], @@ -323,7 +321,7 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { T::PrimeOrigin::ensure_origin(origin)?; let who = T::Lookup::lookup(who)?; - let members = Self::members(); + let members = Members::::get(); members.binary_search(&who).ok().ok_or(Error::::NotMember)?; Prime::::put(&who); T::MembershipChanged::set_prime(Some(who)); @@ -345,6 +343,16 @@ pub mod pallet { } impl, I: 'static> Pallet { + /// The current membership, stored as an ordered `Vec`. + pub fn members() -> BoundedVec { + Members::::get() + } + + /// The current prime member, if one exists. + pub fn prime() -> Option { + Prime::::get() + } + fn rejig_prime(members: &[T::AccountId]) { if let Some(prime) = Prime::::get() { match members.binary_search(&prime) { @@ -357,7 +365,7 @@ impl, I: 'static> Pallet { impl, I: 'static> Contains for Pallet { fn contains(t: &T::AccountId) -> bool { - Self::members().binary_search(t).is_ok() + Members::::get().binary_search(t).is_ok() } } @@ -374,7 +382,7 @@ impl ContainsLengthBound for Pallet { impl, I: 'static> SortedMembers for Pallet { fn sorted_members() -> Vec { - Self::members().to_vec() + Members::::get().to_vec() } fn count() -> usize { @@ -409,12 +417,12 @@ mod benchmark { let prime_origin = T::PrimeOrigin::try_successful_origin() .expect("PrimeOrigin has no successful origin required for the benchmark"); - assert_ok!(>::reset_members(reset_origin, members.clone())); + assert_ok!(Membership::::reset_members(reset_origin, members.clone())); if let Some(prime) = prime.map(|i| members[i].clone()) { let prime_lookup = T::Lookup::unlookup(prime); - assert_ok!(>::set_prime(prime_origin, prime_lookup)); + assert_ok!(Membership::::set_prime(prime_origin, prime_lookup)); } else { - assert_ok!(>::clear_prime(prime_origin)); + assert_ok!(Membership::::clear_prime(prime_origin)); } } @@ -427,12 +435,12 @@ mod benchmark { let new_member = account::("add", m, SEED); let new_member_lookup = T::Lookup::unlookup(new_member.clone()); }: { - assert_ok!(>::add_member( + assert_ok!(Membership::::add_member( T::AddOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?, new_member_lookup, )); } verify { - assert!(>::get().contains(&new_member)); + assert!(Members::::get().contains(&new_member)); #[cfg(test)] crate::tests::clean(); } @@ -447,14 +455,14 @@ mod benchmark { let to_remove = members.first().cloned().unwrap(); let to_remove_lookup = T::Lookup::unlookup(to_remove.clone()); }: { - assert_ok!(>::remove_member( + assert_ok!(Membership::::remove_member( T::RemoveOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?, to_remove_lookup, )); } verify { - assert!(!>::get().contains(&to_remove)); + assert!(!Members::::get().contains(&to_remove)); // prime is rejigged - assert!(>::get().is_some() && T::MembershipChanged::get_prime().is_some()); + assert!(Prime::::get().is_some() && T::MembershipChanged::get_prime().is_some()); #[cfg(test)] crate::tests::clean(); } @@ -469,16 +477,16 @@ mod benchmark { let remove = members.first().cloned().unwrap(); let remove_lookup = T::Lookup::unlookup(remove.clone()); }: { - assert_ok!(>::swap_member( + assert_ok!(Membership::::swap_member( T::SwapOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?, remove_lookup, add_lookup, )); } verify { - assert!(!>::get().contains(&remove)); - assert!(>::get().contains(&add)); + assert!(!Members::::get().contains(&remove)); + assert!(Members::::get().contains(&add)); // prime is rejigged - assert!(>::get().is_some() && T::MembershipChanged::get_prime().is_some()); + assert!(Prime::::get().is_some() && T::MembershipChanged::get_prime().is_some()); #[cfg(test)] crate::tests::clean(); } @@ -490,15 +498,15 @@ mod benchmark { set_members::(members.clone(), Some(members.len() - 1)); let mut new_members = (m..2*m).map(|i| account("member", i, SEED)).collect::>(); }: { - assert_ok!(>::reset_members( + assert_ok!(Membership::::reset_members( T::ResetOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?, new_members.clone(), )); } verify { new_members.sort(); - assert_eq!(>::get(), new_members); + assert_eq!(Members::::get(), new_members); // prime is rejigged - assert!(>::get().is_some() && T::MembershipChanged::get_prime().is_some()); + assert!(Prime::::get().is_some() && T::MembershipChanged::get_prime().is_some()); #[cfg(test)] crate::tests::clean(); } @@ -514,12 +522,12 @@ mod benchmark { let add_lookup = T::Lookup::unlookup(add.clone()); whitelist!(prime); }: { - assert_ok!(>::change_key(RawOrigin::Signed(prime.clone()).into(), add_lookup)); + assert_ok!(Membership::::change_key(RawOrigin::Signed(prime.clone()).into(), add_lookup)); } verify { - assert!(!>::get().contains(&prime)); - assert!(>::get().contains(&add)); + assert!(!Members::::get().contains(&prime)); + assert!(Members::::get().contains(&add)); // prime is rejigged - assert_eq!(>::get().unwrap(), add); + assert_eq!(Prime::::get().unwrap(), add); #[cfg(test)] crate::tests::clean(); } @@ -530,12 +538,12 @@ mod benchmark { let prime_lookup = T::Lookup::unlookup(prime.clone()); set_members::(members, None); }: { - assert_ok!(>::set_prime( + assert_ok!(Membership::::set_prime( T::PrimeOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?, prime_lookup, )); } verify { - assert!(>::get().is_some()); + assert!(Prime::::get().is_some()); assert!(::get_prime().is_some()); #[cfg(test)] crate::tests::clean(); } @@ -545,11 +553,11 @@ mod benchmark { let prime = members.last().cloned().unwrap(); set_members::(members, None); }: { - assert_ok!(>::clear_prime( + assert_ok!(Membership::::clear_prime( T::PrimeOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?, )); } verify { - assert!(>::get().is_none()); + assert!(Prime::::get().is_none()); assert!(::get_prime().is_none()); #[cfg(test)] crate::tests::clean(); } @@ -666,7 +674,7 @@ mod tests { #[test] fn query_membership_works() { new_test_ext().execute_with(|| { - assert_eq!(Membership::members(), vec![10, 20, 30]); + assert_eq!(crate::Members::::get(), vec![10, 20, 30]); assert_eq!(MEMBERS.with(|m| m.borrow().clone()), vec![10, 20, 30]); }); } @@ -680,12 +688,12 @@ mod tests { Error::::NotMember ); assert_ok!(Membership::set_prime(RuntimeOrigin::signed(5), 20)); - assert_eq!(Membership::prime(), Some(20)); - assert_eq!(PRIME.with(|m| *m.borrow()), Membership::prime()); + assert_eq!(crate::Prime::::get(), Some(20)); + assert_eq!(PRIME.with(|m| *m.borrow()), crate::Prime::::get()); assert_ok!(Membership::clear_prime(RuntimeOrigin::signed(5))); - assert_eq!(Membership::prime(), None); - assert_eq!(PRIME.with(|m| *m.borrow()), Membership::prime()); + assert_eq!(crate::Prime::::get(), None); + assert_eq!(PRIME.with(|m| *m.borrow()), crate::Prime::::get()); }); } @@ -698,8 +706,11 @@ mod tests { Error::::AlreadyMember ); assert_ok!(Membership::add_member(RuntimeOrigin::signed(1), 15)); - assert_eq!(Membership::members(), vec![10, 15, 20, 30]); - assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members().to_vec()); + assert_eq!(crate::Members::::get(), vec![10, 15, 20, 30]); + assert_eq!( + MEMBERS.with(|m| m.borrow().clone()), + crate::Members::::get().to_vec() + ); }); } @@ -713,10 +724,13 @@ mod tests { ); assert_ok!(Membership::set_prime(RuntimeOrigin::signed(5), 20)); assert_ok!(Membership::remove_member(RuntimeOrigin::signed(2), 20)); - assert_eq!(Membership::members(), vec![10, 30]); - assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members().to_vec()); - assert_eq!(Membership::prime(), None); - assert_eq!(PRIME.with(|m| *m.borrow()), Membership::prime()); + assert_eq!(crate::Members::::get(), vec![10, 30]); + assert_eq!( + MEMBERS.with(|m| m.borrow().clone()), + crate::Members::::get().to_vec() + ); + assert_eq!(crate::Prime::::get(), None); + assert_eq!(PRIME.with(|m| *m.borrow()), crate::Prime::::get()); }); } @@ -735,16 +749,19 @@ mod tests { assert_ok!(Membership::set_prime(RuntimeOrigin::signed(5), 20)); assert_ok!(Membership::swap_member(RuntimeOrigin::signed(3), 20, 20)); - assert_eq!(Membership::members(), vec![10, 20, 30]); - assert_eq!(Membership::prime(), Some(20)); - assert_eq!(PRIME.with(|m| *m.borrow()), Membership::prime()); + assert_eq!(crate::Members::::get(), vec![10, 20, 30]); + assert_eq!(crate::Prime::::get(), Some(20)); + assert_eq!(PRIME.with(|m| *m.borrow()), crate::Prime::::get()); assert_ok!(Membership::set_prime(RuntimeOrigin::signed(5), 10)); assert_ok!(Membership::swap_member(RuntimeOrigin::signed(3), 10, 25)); - assert_eq!(Membership::members(), vec![20, 25, 30]); - assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members().to_vec()); - assert_eq!(Membership::prime(), None); - assert_eq!(PRIME.with(|m| *m.borrow()), Membership::prime()); + assert_eq!(crate::Members::::get(), vec![20, 25, 30]); + assert_eq!( + MEMBERS.with(|m| m.borrow().clone()), + crate::Members::::get().to_vec() + ); + assert_eq!(crate::Prime::::get(), None); + assert_eq!(PRIME.with(|m| *m.borrow()), crate::Prime::::get()); }); } @@ -752,8 +769,11 @@ mod tests { fn swap_member_works_that_does_not_change_order() { new_test_ext().execute_with(|| { assert_ok!(Membership::swap_member(RuntimeOrigin::signed(3), 10, 5)); - assert_eq!(Membership::members(), vec![5, 20, 30]); - assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members().to_vec()); + assert_eq!(crate::Members::::get(), vec![5, 20, 30]); + assert_eq!( + MEMBERS.with(|m| m.borrow().clone()), + crate::Members::::get().to_vec() + ); }); } @@ -781,10 +801,13 @@ mod tests { Error::::AlreadyMember ); assert_ok!(Membership::change_key(RuntimeOrigin::signed(10), 40)); - assert_eq!(Membership::members(), vec![20, 30, 40]); - assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members().to_vec()); - assert_eq!(Membership::prime(), Some(40)); - assert_eq!(PRIME.with(|m| *m.borrow()), Membership::prime()); + assert_eq!(crate::Members::::get(), vec![20, 30, 40]); + assert_eq!( + MEMBERS.with(|m| m.borrow().clone()), + crate::Members::::get().to_vec() + ); + assert_eq!(crate::Prime::::get(), Some(40)); + assert_eq!(PRIME.with(|m| *m.borrow()), crate::Prime::::get()); }); } @@ -792,8 +815,11 @@ mod tests { fn change_key_works_that_does_not_change_order() { new_test_ext().execute_with(|| { assert_ok!(Membership::change_key(RuntimeOrigin::signed(10), 5)); - assert_eq!(Membership::members(), vec![5, 20, 30]); - assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members().to_vec()); + assert_eq!(crate::Members::::get(), vec![5, 20, 30]); + assert_eq!( + MEMBERS.with(|m| m.borrow().clone()), + crate::Members::::get().to_vec() + ); }); } @@ -814,16 +840,22 @@ mod tests { ); assert_ok!(Membership::reset_members(RuntimeOrigin::signed(4), vec![20, 40, 30])); - assert_eq!(Membership::members(), vec![20, 30, 40]); - assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members().to_vec()); - assert_eq!(Membership::prime(), Some(20)); - assert_eq!(PRIME.with(|m| *m.borrow()), Membership::prime()); + assert_eq!(crate::Members::::get(), vec![20, 30, 40]); + assert_eq!( + MEMBERS.with(|m| m.borrow().clone()), + crate::Members::::get().to_vec() + ); + assert_eq!(crate::Prime::::get(), Some(20)); + assert_eq!(PRIME.with(|m| *m.borrow()), crate::Prime::::get()); assert_ok!(Membership::reset_members(RuntimeOrigin::signed(4), vec![10, 40, 30])); - assert_eq!(Membership::members(), vec![10, 30, 40]); - assert_eq!(MEMBERS.with(|m| m.borrow().clone()), Membership::members().to_vec()); - assert_eq!(Membership::prime(), None); - assert_eq!(PRIME.with(|m| *m.borrow()), Membership::prime()); + assert_eq!(crate::Members::::get(), vec![10, 30, 40]); + assert_eq!( + MEMBERS.with(|m| m.borrow().clone()), + crate::Members::::get().to_vec() + ); + assert_eq!(crate::Prime::::get(), None); + assert_eq!(PRIME.with(|m| *m.borrow()), crate::Prime::::get()); }); } -- GitLab From 18228a9bdbe5b560a39a31810fdf2e3fba59a40d Mon Sep 17 00:00:00 2001 From: Yuri Volkov <0@mcornholio.ru> Date: Mon, 1 Jul 2024 16:54:21 +0200 Subject: [PATCH 075/130] prdoc upgrade (#4918) Co-authored-by: Oliver Tale-Yazdi --- .github/workflows/check-prdoc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-prdoc.yml b/.github/workflows/check-prdoc.yml index c31dee06ec5..5df03f1044d 100644 --- a/.github/workflows/check-prdoc.yml +++ b/.github/workflows/check-prdoc.yml @@ -6,7 +6,7 @@ on: merge_group: env: - IMAGE: docker.io/paritytech/prdoc:v0.0.7 + IMAGE: docker.io/paritytech/prdoc:v0.0.8 API_BASE: https://api.github.com/repos REPO: ${{ github.repository }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -- GitLab From 18ed309a37036db8429665f1e91fb24ab312e646 Mon Sep 17 00:00:00 2001 From: Kazunobu Ndong <33208377+ndkazu@users.noreply.github.com> Date: Tue, 2 Jul 2024 05:18:27 +0900 Subject: [PATCH 076/130] Pallet Name Customisation (#4806) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added Instructions for pallet name customisation in the ReadMe --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: Oliver Tale-Yazdi Co-authored-by: Bastian Köcher --- templates/minimal/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/templates/minimal/README.md b/templates/minimal/README.md index f00bfd4d487..1909c777aed 100644 --- a/templates/minimal/README.md +++ b/templates/minimal/README.md @@ -37,6 +37,21 @@ A Polkadot SDK based project such as this one consists of: * 🛠️ Depending on your operating system and Rust version, there might be additional packages required to compile this template - please take note of the Rust compiler output. +## Customization + +In case you would like to change the pallet's name from `pallet-minimal-template` to `pallet-test`, +you would need to implement the following changes: +* Change the pallet folder name from `template` to `test` for consistency +* Also for consistency, in `/runtime/src/lib.rs`, change from `pub type Template` to `pub type Test`, +and don't forget to also customize the corresponding comments. +* Change `pallet-minimal-template` to `pallet-test` in the following files: + * `/runtime/Cargo.toml` + * `/runtime/src/lib.rs` + * `/pallets/test/Cargo.toml` + * `/src/lib.rs` +* Change `pallet_minimal_template` to `pallet_test` in the following files: + * `/runtime/src/lib.rs` + ### Build 🔨 Use the following command to build the node without launching it: -- GitLab From b69fc1749473c9aff84645e676d51a03953c1751 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Wed, 3 Jul 2024 10:51:26 +0330 Subject: [PATCH 077/130] Update `PULL_REQUEST_TEMPLATE` and `CONTRIBUTING` docs. (#4908) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- docs/contributor/CONTRIBUTING.md | 132 ++++++++++------------ docs/contributor/PULL_REQUEST_TEMPLATE.md | 43 ++++--- templates/minimal/README.md | 4 +- 3 files changed, 86 insertions(+), 93 deletions(-) diff --git a/docs/contributor/CONTRIBUTING.md b/docs/contributor/CONTRIBUTING.md index 96dc86e9780..7d54b2681b4 100644 --- a/docs/contributor/CONTRIBUTING.md +++ b/docs/contributor/CONTRIBUTING.md @@ -4,18 +4,16 @@ The `Polkadot SDK` project is an **OPENISH Open Source Project** ## What? -Individuals making significant and valuable contributions are given commit-access to the project. -Contributions are done via pull-requests and need to be approved by the maintainers. +Individuals making significant and valuable contributions are given commit-access to the project. Contributions are done +via pull-requests and need to be approved by the maintainers. ## Rules There are a few basic ground-rules for contributors (including the maintainer(s) of the project): -1. **No `--force` pushes** or modifying the master branch history in any way. - If you need to rebase, ensure you do it in your own repo. No rewriting of the history - after the code has been shared (e.g. through a Pull-Request). -2. **Non-master branches**, prefixed with a short name moniker (e.g. `gav-my-feature`) must be - used for ongoing work. +1. **No `--force` pushes** or modifying the master branch history in any way. If you need to rebase, ensure you do it in + your own repo. No rewriting of the history after the code has been shared (e.g. through a Pull-Request). +2. **Non-master branches**, prefixed with a short name moniker (e.g. `gav-my-feature`) must be used for ongoing work. 3. **All modifications** must be made in a **pull-request** to solicit feedback from other contributors. 4. A pull-request **must not be merged until CI** has finished successfully. 5. Contributors should adhere to the [house coding style](./STYLE_GUIDE.md). @@ -25,12 +23,10 @@ There are a few basic ground-rules for contributors (including the maintainer(s) ### In General -A Pull Request (PR) needs to be reviewed and approved by project maintainers. -If a change does not alter any logic (e.g. comments, dependencies, docs), then it may be tagged -`A1-insubstantial` and merged faster. -If it is an urgent fix with no large change to logic, then it may be merged after a non-author -contributor has reviewed it well and approved the review once CI is complete. -No PR should be merged until all reviews' comments are addressed. +* A Pull Request (PR) needs to be reviewed and approved by project maintainers. +* If a change does not alter any logic (e.g. comments, dependencies, docs), then it may be tagged `A1-insubstantial` and +merged faster. +* No PR should be merged until all reviews' comments are addressed. ### Labels @@ -38,39 +34,26 @@ The set of labels and their description can be found [here](https://paritytech.g ### Process -1. Please use our [Pull Request Template](./PULL_REQUEST_TEMPLATE.md) and make sure all relevant - information is reflected in your PR. -2. Please tag each PR with minimum one `T*` label. The respective `T*` labels should signal the - component that was changed, they are also used by downstream users to track changes and to - include these changes properly into their own releases. -3. If you’re still working on your PR, please submit as “Draft”. Once a PR is ready for review change - the status to “Open”, so that the maintainers get to review your PR. Generally PRs should sit for - 48 hours in order to garner feedback. It may be merged before if all relevant parties had a look at it. -4. If you’re introducing a major change, that might impact the documentation please add the label - `T13-documentation`. The docs team will get in touch. -5. If your PR changes files in these paths: - - `polkadot` : `^runtime/polkadot` - `polkadot` : `^runtime/kusama` - `polkadot` : `^primitives/src/` - `polkadot` : `^runtime/common` - `substrate` : `^frame/` - `substrate` : `^primitives/` - - It should be added to the [security audit board](https://github.com/orgs/paritytech/projects/103) - and will need to undergo an audit before merge. -6. PRs will be able to be merged once all reviewers' comments are addressed and CI is successful. - -**Noting breaking changes:** -When breaking APIs, the PR description should mention what was changed alongside some examples on how -to change the code to make it work/compile. -It should also mention potential storage migrations and if they require some special setup aside adding -it to the list of migrations in the runtime. +1. Please use our [Pull Request Template](./PULL_REQUEST_TEMPLATE.md) and make sure all relevant information is + reflected in your PR. +2. Please tag each PR with minimum one `T*` label. The respective `T*` labels should signal the component that was + changed, they are also used by downstream users to track changes and to include these changes properly into their own + releases. +3. If you’re still working on your PR, please submit as “Draft”. Once a PR is ready for review change the status to + “Open”, so that the maintainers get to review your PR. Generally PRs should sit for 48 hours in order to garner + feedback. It may be merged before if all relevant parties had a look at it. +4. With respect to auditing, please see [AUDIT.md](../AUDIT.md). In general, merging to master can happen independent of + audit. +5. PRs will be able to be merged once all reviewers' comments are addressed and CI is successful. + +**Noting breaking changes:** When breaking APIs, the PR description should mention what was changed alongside some +examples on how to change the code to make it work/compile. It should also mention potential storage migrations and if +they require some special setup aside adding it to the list of migrations in the runtime. ## Reviewing pull requests -When reviewing a pull request, the end-goal is to suggest useful changes to the author. -Reviews should finish with approval unless there are issues that would result in: +When reviewing a pull request, the end-goal is to suggest useful changes to the author. Reviews should finish with +approval unless there are issues that would result in: 1. Buggy behavior. 2. Undue maintenance burden. 3. Breaking with house coding style. @@ -80,18 +63,17 @@ Reviews should finish with approval unless there are issues that would result in The reviewers are also responsible to check: -1. if a changelog is necessary and attached -1. the quality of information in the changelog file -1. the PR has an impact on docs -1. that the docs team was included in the review process of a docs update +* if the PR description is well written to facilitate integration, in case it contains breaking changes. +* the PR has an impact on docs. **Reviews may not be used as an effective veto for a PR because**: 1. There exists a somewhat cleaner/better/faster way of accomplishing the same feature/fix. 2. It does not fit well with some other contributors' longer-term vision for the project. -## Documentation +## `PRDoc` -All Pull Requests must contain proper title & description. +All Pull Requests must contain proper title & description, as described in [Pull Request +Template](./PULL_REQUEST_TEMPLATE.md). Moreover, all pull requests must have a proper `prdoc` file attached. Some Pull Requests can be exempt of `prdoc` documentation, those must be labelled with [`R0-silent`](https://github.com/paritytech/labels/blob/main/ruled_labels/specs_polkadot-sdk.yaml#L89-L91). @@ -102,46 +84,49 @@ See more about `prdoc` [here](./prdoc.md) ## Helping out -We use [labels](https://github.com/paritytech/polkadot-sdk/labels) to manage PRs and issues and communicate -state of a PR. Please familiarise yourself with them. Best way to get started is to a pick a ticket tagged -[easy](https://github.com/paritytech/polkadot-sdk/issues?q=is%3Aopen+is%3Aissue+label%3AD0-easy) -or [medium](https://github.com/paritytech/polkadot-sdk/issues?q=is%3Aopen+is%3Aissue+label%3AD1-medium) -and get going. Alternatively, look out for issues tagged [mentor](https://github.com/paritytech/polkadot-sdk/issues?q=is%3Aopen+is%3Aissue+label%3AC1-mentor) -and get in contact with the mentor offering their support on that larger task. +We use [labels](https://github.com/paritytech/polkadot-sdk/labels) to manage PRs and issues and communicate state of a +PR. Please familiarise yourself with them. Best way to get started is to a pick a ticket tagged +[easy](https://github.com/paritytech/polkadot-sdk/issues?q=is%3Aopen+is%3Aissue+label%3AD0-easy) or +[medium](https://github.com/paritytech/polkadot-sdk/issues?q=is%3Aopen+is%3Aissue+label%3AD1-medium) and get going. +Alternatively, look out for issues tagged +[mentor](https://github.com/paritytech/polkadot-sdk/issues?q=is%3Aopen+is%3Aissue+label%3AC1-mentor) and get in contact +with the mentor offering their support on that larger task. **** ### Issues If what you are looking for is an answer rather than proposing a new feature or fix, search -[https://substrate.stackexchange.com](https://substrate.stackexchange.com/) to see if an post already -exists, and ask if not. Please do not file support issues here. -Before opening a new issue search to see if a similar one already exists and leave a comment that you -also experienced this issue or add your specifics that are related to an existing issue. -Please label issues with the following labels: +[https://substrate.stackexchange.com](https://substrate.stackexchange.com/) to see if an post already exists, and ask if +not. Please do not file support issues here. + +Before opening a new issue search to see if a similar one already exists and leave a comment that you also experienced +this issue or add your specifics that are related to an existing issue. + +Please label issues with the following labels (only relevant for maintainer): 1. `I*` issue severity and type. EXACTLY ONE REQUIRED. 2. `D*` issue difficulty, suggesting the level of complexity this issue has. AT MOST ONE ALLOWED. 3. `T*` Issue topic. MULTIPLE ALLOWED. ## Releases -Declaring formal releases remains the prerogative of the project maintainer(s). +Declaring formal releases remains the prerogative of the project maintainer(s). See [RELEASE.md](../RELEASE.md). ## UI tests -UI tests are used for macros to ensure that the output of a macro doesn’t change and is in the expected format. -These UI tests are sensible to any changes in the macro generated code or to switching the rust stable version. -The tests are only run when the `RUN_UI_TESTS` environment variable is set. So, when the CI is for example complaining -about failing UI tests and it is expected that they fail these tests need to be executed locally. -To simplify the updating of the UI test output there is a script -- `./scripts/update-ui-tests.sh` to update the tests for a current rust version locally -- `./scripts/update-ui-tests.sh 1.70` # to update the tests for a specific rust version locally +UI tests are used for macros to ensure that the output of a macro doesn’t change and is in the expected format. These UI +tests are sensible to any changes in the macro generated code or to switching the rust stable version. The tests are +only run when the `RUN_UI_TESTS` environment variable is set. So, when the CI is for example complaining about failing +UI tests and it is expected that they fail these tests need to be executed locally. To simplify the updating of the UI +test output there is a script +* `./scripts/update-ui-tests.sh` to update the tests for a current rust version locally +* `./scripts/update-ui-tests.sh 1.70` # to update the tests for a specific rust version locally Or if you have opened PR and you're member of `paritytech` - you can use command-bot to run the tests for you in CI: -- `bot update-ui` - will run the tests for the current rust version -- `bot update-ui latest --rust_version=1.70.0` - will run the tests for the specified rust version -- `bot update-ui latest -v CMD_IMAGE=paritytech/ci-unified:bullseye-1.70.0-2023-05-23 --rust_version=1.70.0` - -will run the tests for the specified rust version and specified image +* `bot update-ui` - will run the tests for the current rust version +* `bot update-ui latest --rust_version=1.70.0` - will run the tests for the specified rust version +* `bot update-ui latest -v CMD_IMAGE=paritytech/ci-unified:bullseye-1.70.0-2023-05-23 --rust_version=1.70.0` - will run +the tests for the specified rust version and specified image ## Feature Propagation @@ -157,4 +142,5 @@ Start with comment in PR: `bot help` to see the list of available commands. ## Deprecating code When deprecating and removing code you need to be mindful of how this could impact downstream developers. In order to -mitigate this impact, it is recommended to adhere to the steps outlined in the [Deprecation Checklist](./DEPRECATION_CHECKLIST.md). +mitigate this impact, it is recommended to adhere to the steps outlined in the [Deprecation +Checklist](./DEPRECATION_CHECKLIST.md). diff --git a/docs/contributor/PULL_REQUEST_TEMPLATE.md b/docs/contributor/PULL_REQUEST_TEMPLATE.md index 79a036a235a..083b30b4a35 100644 --- a/docs/contributor/PULL_REQUEST_TEMPLATE.md +++ b/docs/contributor/PULL_REQUEST_TEMPLATE.md @@ -2,35 +2,42 @@ ✄ ----------------------------------------------------------------------------- -Thank you for your Pull Request! 🙏 Please make sure it follows the contribution guidelines outlined in -[this document](https://github.com/paritytech/polkadot-sdk/blob/master/docs/contributor/CONTRIBUTING.md) and fill -out the sections below. Once you're ready to submit your PR for review, please -delete this section and leave only the text under the "Description" heading. +Thank you for your Pull Request! 🙏 Please make sure it follows the contribution guidelines outlined in [this +document](https://github.com/paritytech/polkadot-sdk/blob/master/docs/contributor/CONTRIBUTING.md) and fill out the +sections below. Once you're ready to submit your PR for review, please delete this section and leave only the text under +the "Description" heading. # Description -*Please include a summary of the changes and the related issue. Please also include relevant motivation and context, -including:* +*A concise description of what your PR is doing, and what potential issue it is solving. Use [Github semantic +linking](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) +to link the PR to an issue that must be closed once this is merged.* -- What does this PR do? -- Why are these changes needed? -- How were these changes implemented and what do they affect? +## Integration -*Use [Github semantic -linking](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) -to address any open issues this PR relates to or closes.* +*In depth notes about how this PR should be integrated by downstream projects. This part is mandatory, and should be +reviewed by reviewers, if the PR does NOT have the `R0-Silent` label. In case of a `R0-Silent`, it can be ignored.* + +## Review Notes + +*In depth notes about the **implenentation** details of your PR. This should be the main guide for reviewers to +understand your approach and effectively review it. If too long, use +[`
    `](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details)*. -Fixes # (issue number, *if applicable*) +*Imagine that someone who is depending on the old code wants to integrate your new code and the only information that +they get is this section. It helps to include example usage and default value here, with a `diff` code-block to show +possibly integration.* -Closes # (issue number, *if applicable*) +*Include your leftover TODOs, if any, here.* # Checklist -- [ ] My PR includes a detailed description as outlined in the "Description" section above -- [ ] My PR follows the [labeling requirements](CONTRIBUTING.md#Process) of this project (at minimum one label for `T` +* [ ] My PR includes a detailed description as outlined in the "Description" and its two subsections above. +* [ ] My PR follows the [labeling requirements](CONTRIBUTING.md#Process) of this project (at minimum one label for `T` required) -- [ ] I have made corresponding changes to the documentation (if applicable) -- [ ] I have added tests that prove my fix is effective or that my feature works (if applicable) + * External contributors: ask maintainers to put the right label on your PR. +* [ ] I have made corresponding changes to the documentation (if applicable) +* [ ] I have added tests that prove my fix is effective or that my feature works (if applicable) You can remove the "Checklist" section once all have been checked. Thank you for your contribution! diff --git a/templates/minimal/README.md b/templates/minimal/README.md index 1909c777aed..9d27bcc9944 100644 --- a/templates/minimal/README.md +++ b/templates/minimal/README.md @@ -39,10 +39,10 @@ packages required to compile this template - please take note of the Rust compil ## Customization -In case you would like to change the pallet's name from `pallet-minimal-template` to `pallet-test`, +In case you would like to change the pallet's name from `pallet-minimal-template` to `pallet-test`, you would need to implement the following changes: * Change the pallet folder name from `template` to `test` for consistency -* Also for consistency, in `/runtime/src/lib.rs`, change from `pub type Template` to `pub type Test`, +* Also for consistency, in `/runtime/src/lib.rs`, change from `pub type Template` to `pub type Test`, and don't forget to also customize the corresponding comments. * Change `pallet-minimal-template` to `pallet-test` in the following files: * `/runtime/Cargo.toml` -- GitLab From 62b955e98d36e4cfce680fddc967e3821b83c994 Mon Sep 17 00:00:00 2001 From: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:03:41 +0300 Subject: [PATCH 078/130] Fix markdown lint step (#4933) CI required markdown step seems to start failing after https://github.com/paritytech/polkadot-sdk/pull/4806 Signed-off-by: Alexandru Gheorghe -- GitLab From b31880c55ab421888501df8aa0f0adea7497f9ae Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Wed, 3 Jul 2024 10:43:10 +0200 Subject: [PATCH 079/130] `polkadot-parachain`: Unify asset-hub authoring codepath with general AURA (#4932) Recently thought about the special handling we have for asset-hub chains. They started with relay chain consensus and transitioned to AURA at some point. However, nobody should be authoring with relay chain consensus on these chains anymore, the transition is long done. I propose to remove this special handling, allowing us to unify one more execution path. --- cumulus/polkadot-parachain/src/command.rs | 30 ++-- cumulus/polkadot-parachain/src/service.rs | 170 +++++++--------------- prdoc/pr_4932.prdoc | 15 ++ 3 files changed, 76 insertions(+), 139 deletions(-) create mode 100644 prdoc/pr_4932.prdoc diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index aa75b6b6ae3..2a1f20d5c17 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -725,25 +725,17 @@ async fn start_node>( .map(|r| r.0) .map_err(Into::into), - Runtime::AssetHub => crate::service::start_asset_hub_lookahead_node::< - RuntimeApi, - AuraId, - Network, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - - Runtime::Collectives => crate::service::start_generic_aura_lookahead_node::( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), + Runtime::AssetHub | Runtime::Collectives => + crate::service::start_generic_aura_lookahead_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), Runtime::Seedling | Runtime::Shell => crate::service::start_shell_node::( config, diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index a22ae77a775..42efe8098b2 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -14,7 +14,6 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use codec::Decode; use cumulus_client_cli::CollatorOptions; use cumulus_client_collator::service::CollatorService; use cumulus_client_consensus_aura::collators::lookahead::{self as aura, Params as AuraParams}; @@ -45,7 +44,7 @@ pub use parachains_common::{AccountId, AuraId, Balance, Block, Hash, Nonce}; use cumulus_client_consensus_relay_chain::Verifier as RelayChainVerifier; use futures::prelude::*; use prometheus_endpoint::Registry; -use sc_client_api::Backend as ClientApiBackend; +use sc_client_api::BlockchainEvents; use sc_consensus::{ import_queue::{BasicQueue, Verifier as VerifierT}, BlockImportParams, ImportQueue, @@ -55,14 +54,10 @@ use sc_network::{config::FullNetworkConfiguration, service::traits::NetworkBacke use sc_network_sync::SyncingService; use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; -use sp_api::{ConstructRuntimeApi, ProvideRuntimeApi}; -use sp_blockchain::HeaderBackend; -use sp_core::traits::SpawnEssentialNamed; +use sp_api::{ApiExt, ConstructRuntimeApi, ProvideRuntimeApi}; +use sp_consensus_aura::AuraApi; use sp_keystore::KeystorePtr; -use sp_runtime::{ - app_crypto::AppCrypto, - traits::{Block as BlockT, Header as HeaderT}, -}; +use sp_runtime::{app_crypto::AppCrypto, traits::Header as HeaderT}; use std::{marker::PhantomData, sync::Arc, time::Duration}; use polkadot_primitives::CollatorPair; @@ -423,7 +418,7 @@ pub async fn start_rococo_parachain_node>( para_id, build_parachain_rpc_extensions::, build_aura_import_queue, - start_lookahead_aura_consensus, + start_lookahead_aura_consensus::<_, AuraId>, hwbench, ) .await @@ -600,7 +595,7 @@ pub async fn start_generic_aura_lookahead_node> para_id, build_parachain_rpc_extensions::, build_relay_to_aura_import_queue::<_, AuraId>, - start_lookahead_aura_consensus, + start_lookahead_aura_consensus::<_, AuraId>, hwbench, ) .await @@ -635,109 +630,42 @@ where para_id, build_parachain_rpc_extensions::, build_relay_to_aura_import_queue::<_, AuraId>, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - sync_oracle, - keystore, - relay_chain_slot_duration, - para_id, - collator_key, - overseer_handle, - announce_block, - backend| { - let relay_chain_interface2 = relay_chain_interface.clone(); - - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); - - let spawner = task_manager.spawn_handle(); - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - spawner, - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - - let collation_future = Box::pin(async move { - // Start collating with the `shell` runtime while waiting for an upgrade to an Aura - // compatible runtime. - let mut request_stream = cumulus_client_collator::relay_chain_driven::init( - collator_key.clone(), - para_id, - overseer_handle.clone(), - ) - .await; - while let Some(request) = request_stream.next().await { - let pvd = request.persisted_validation_data().clone(); - let last_head_hash = - match ::Header::decode(&mut &pvd.parent_head.0[..]) { - Ok(header) => header.hash(), - Err(e) => { - log::error!("Could not decode the head data: {e}"); - request.complete(None); - continue - }, - }; - - // Check if we have upgraded to an Aura compatible runtime and transition if - // necessary. - if client.runtime_api().has_aura_api(last_head_hash) { - // Respond to this request before transitioning to Aura. - request.complete(None); - break - } - } - - // Move to Aura consensus. - let proposer = Proposer::new(proposer_factory); - - let params = AuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client.clone(), - para_backend: backend, - relay_client: relay_chain_interface2, - code_hash_provider: move |block_hash| { - client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) - }, - sync_oracle, - keystore, - collator_key, - para_id, - overseer_handle, - relay_chain_slot_duration, - proposer, - collator_service, - authoring_duration: Duration::from_millis(1500), - reinitialize: true, /* we need to always re-initialize for asset-hub moving - * to aura */ - }; - - aura::run::::Pair, _, _, _, _, _, _, _, _, _>(params) - .await - }); - - let spawner = task_manager.spawn_essential_handle(); - spawner.spawn_essential("cumulus-asset-hub-collator", None, collation_future); - - Ok(()) - }, + start_lookahead_aura_consensus::, hwbench, ) .await } +/// Wait for the Aura runtime API to appear on chain. +/// This is useful for chains that started out without Aura. Components that +/// are depending on Aura functionality will wait until Aura appears in the runtime. +async fn wait_for_aura(client: Arc>) +where + RuntimeApi: ConstructNodeRuntimeApi>, + RuntimeApi::RuntimeApi: AuraRuntimeApi, + AuraId: AuraIdT + Sync, +{ + let finalized_hash = client.chain_info().finalized_hash; + if client + .runtime_api() + .has_api::>(finalized_hash) + .unwrap_or(false) + { + return; + }; + + let mut stream = client.finality_notification_stream(); + while let Some(notification) = stream.next().await { + let has_aura_api = client + .runtime_api() + .has_api::>(notification.hash) + .unwrap_or(false); + if has_aura_api { + return; + } + } +} + /// Start relay-chain consensus that is free for all. Everyone can submit a block, the relay-chain /// decides what is backed and included. fn start_relay_chain_consensus( @@ -811,7 +739,7 @@ fn start_relay_chain_consensus( } /// Start consensus using the lookahead aura collator. -fn start_lookahead_aura_consensus( +fn start_lookahead_aura_consensus( client: Arc>, block_import: ParachainBlockImport, prometheus_registry: Option<&Registry>, @@ -831,12 +759,8 @@ fn start_lookahead_aura_consensus( where RuntimeApi: ConstructNodeRuntimeApi>, RuntimeApi::RuntimeApi: AuraRuntimeApi, + AuraId: AuraIdT + Sync, { - let info = backend.blockchain().info(); - if !client.runtime_api().has_aura_api(info.finalized_hash) { - return Err(sc_service::error::Error::Other("Missing aura runtime APIs".to_string())); - } - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( task_manager.spawn_handle(), client.clone(), @@ -858,8 +782,11 @@ where para_client: client.clone(), para_backend: backend, relay_client: relay_chain_interface, - code_hash_provider: move |block_hash| { - client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) + code_hash_provider: { + let client = client.clone(); + move |block_hash| { + client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) + } }, sync_oracle, keystore, @@ -873,7 +800,10 @@ where reinitialize: false, }; - let fut = aura::run::::Pair, _, _, _, _, _, _, _, _, _>(params); + let fut = async move { + wait_for_aura(client).await; + aura::run::::Pair, _, _, _, _, _, _, _, _, _>(params).await; + }; task_manager.spawn_essential_handle().spawn("aura", None, fut); Ok(()) @@ -897,7 +827,7 @@ pub async fn start_basic_lookahead_node>( para_id, |_, _, _, _| Ok(RpcModule::new(())), build_relay_to_aura_import_queue::<_, AuraId>, - start_lookahead_aura_consensus, + start_lookahead_aura_consensus::<_, AuraId>, hwbench, ) .await @@ -919,7 +849,7 @@ pub async fn start_contracts_rococo_node>( para_id, build_contracts_rpc_extensions, build_aura_import_queue, - start_lookahead_aura_consensus, + start_lookahead_aura_consensus::<_, AuraId>, hwbench, ) .await diff --git a/prdoc/pr_4932.prdoc b/prdoc/pr_4932.prdoc new file mode 100644 index 00000000000..94af00d9249 --- /dev/null +++ b/prdoc/pr_4932.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Remove relay-chain consensus authoring support for asset-hub chains from polkadot-parachain. + +doc: + - audience: Node Operator + description: | + The polkadot-parachain node had special handling for asset-hub parachains. They started out + using relay-chain consensus and later migrated to Aura as soon as it became available. The codepath for authoring + with relay chain consensus has been removed, since all asset hub chains have long migrated. + +crates: + - name: polkadot-parachain-bin + bump: major -- GitLab From 6b9d14a1742341b439025d3878036cec632e42ac Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:56:20 +0300 Subject: [PATCH 080/130] litep2p: Increment random walk metrics (#4929) This PR exposes the `RandomKademliaStarted` event from the litep2p network backend, and then increments the appropriate metrics. This is part of: https://github.com/paritytech/polkadot-sdk/issues/4681. However, it is more of an effort to debug low peer count ### Testing Done - Started a node and fetched queries: `substrate_sub_libp2p_kademlia_random_queries_total` produces results for litep2p backend cc @paritytech/networking --------- Signed-off-by: Alexandru Vasile --- substrate/client/network/src/litep2p/discovery.rs | 4 ++++ substrate/client/network/src/litep2p/mod.rs | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/substrate/client/network/src/litep2p/discovery.rs b/substrate/client/network/src/litep2p/discovery.rs index ef0de981929..6ff05e6af32 100644 --- a/substrate/client/network/src/litep2p/discovery.rs +++ b/substrate/client/network/src/litep2p/discovery.rs @@ -145,6 +145,9 @@ pub enum DiscoveryEvent { /// Record. record: Record, }, + + /// Started a random Kademlia query. + RandomKademliaStarted, } /// Discovery. @@ -456,6 +459,7 @@ impl Stream for Discovery { match this.kademlia_handle.try_find_node(peer) { Ok(query_id) => { this.find_node_query_id = Some(query_id); + return Poll::Ready(Some(DiscoveryEvent::RandomKademliaStarted)) }, Err(()) => { this.duration_to_next_find_query = cmp::min( diff --git a/substrate/client/network/src/litep2p/mod.rs b/substrate/client/network/src/litep2p/mod.rs index 329eb68997b..824f62082ca 100644 --- a/substrate/client/network/src/litep2p/mod.rs +++ b/substrate/client/network/src/litep2p/mod.rs @@ -929,6 +929,12 @@ impl NetworkBackend for Litep2pNetworkBac expires, ) )); + }, + + Some(DiscoveryEvent::RandomKademliaStarted) => { + if let Some(metrics) = self.metrics.as_ref() { + metrics.kademlia_random_queries_total.inc(); + } } }, event = self.litep2p.next_event() => match event { -- GitLab From 98ce675a6bfafa145dd6be74c95d7768917392c1 Mon Sep 17 00:00:00 2001 From: Adrian Catangiu Date: Wed, 3 Jul 2024 12:07:55 +0300 Subject: [PATCH 081/130] bridge tests: send bridged assets from random parachain to bridged asset hub (#4870) - Send bridged WNDs: Penpal Rococo -> AH Rococo -> AH Westend - Send bridged ROCs: Penpal Westend -> AH Westend -> AH Rococo The tests send both ROCs and WNDs, for each direction the native asset is only used to pay for the transport fees on the local AssetHub, and are not sent over the bridge. Including the native asset won't be necessary anymore once we get #4375. --------- Signed-off-by: Adrian Catangiu Co-authored-by: command-bot <> --- Cargo.lock | 16 - .../assets/asset-hub-rococo/src/lib.rs | 2 + .../assets/asset-hub-westend/src/lib.rs | 2 + .../bridges/bridge-hub-rococo/src/lib.rs | 5 + .../bridges/bridge-hub-westend/src/lib.rs | 2 + .../collectives-westend/src/lib.rs | 2 + .../people/people-rococo/src/lib.rs | 1 + .../people/people-westend/src/lib.rs | 1 + .../parachains/testing/penpal/src/lib.rs | 5 +- .../emulated/chains/relays/rococo/src/lib.rs | 1 + .../emulated/chains/relays/westend/src/lib.rs | 1 + .../tests/assets/asset-hub-rococo/Cargo.toml | 3 - .../tests/assets/asset-hub-rococo/src/lib.rs | 36 +- .../src/tests/hybrid_transfers.rs | 6 +- .../assets/asset-hub-rococo/src/tests/swap.rs | 19 +- .../asset-hub-rococo/src/tests/treasury.rs | 10 +- .../tests/assets/asset-hub-westend/Cargo.toml | 3 - .../tests/assets/asset-hub-westend/src/lib.rs | 32 +- .../src/tests/fellowship_treasury.rs | 5 +- .../src/tests/hybrid_transfers.rs | 6 +- .../asset-hub-westend/src/tests/swap.rs | 16 +- .../asset-hub-westend/src/tests/treasury.rs | 5 +- .../bridges/bridge-hub-rococo/Cargo.toml | 8 +- .../bridges/bridge-hub-rococo/src/lib.rs | 13 +- .../src/tests/asset_transfers.rs | 329 ++++++++++++----- .../bridge-hub-rococo/src/tests/snowbridge.rs | 8 +- .../bridge-hub-rococo/src/tests/teleport.rs | 9 +- .../bridges/bridge-hub-westend/Cargo.toml | 3 +- .../bridges/bridge-hub-westend/src/lib.rs | 7 +- .../src/tests/asset_transfers.rs | 331 +++++++++++++----- .../bridge-hub-westend/src/tests/teleport.rs | 9 +- .../collectives-westend/Cargo.toml | 3 - .../collectives-westend/src/lib.rs | 15 +- .../src/tests/fellowship_treasury.rs | 9 +- .../tests/people/people-rococo/Cargo.toml | 10 +- .../tests/people/people-rococo/src/lib.rs | 14 +- .../people-rococo/src/tests/reap_identity.rs | 6 +- .../people-rococo/src/tests/teleport.rs | 2 - .../tests/people/people-westend/Cargo.toml | 10 +- .../tests/people/people-westend/src/lib.rs | 15 +- .../people-westend/src/tests/reap_identity.rs | 6 +- .../people-westend/src/tests/teleport.rs | 2 - 42 files changed, 632 insertions(+), 356 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 91d604d6fa3..7b08e96f4bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -805,7 +805,6 @@ name = "asset-hub-rococo-integration-tests" version = "1.0.0" dependencies = [ "assert_matches", - "asset-hub-rococo-runtime", "asset-test-utils", "cumulus-pallet-parachain-system", "emulated-integration-tests-common", @@ -819,9 +818,7 @@ dependencies = [ "pallet-xcm", "parachains-common", "parity-scale-codec", - "penpal-runtime", "polkadot-runtime-common", - "rococo-runtime", "rococo-runtime-constants", "rococo-system-emulated-network", "sp-runtime", @@ -933,7 +930,6 @@ name = "asset-hub-westend-integration-tests" version = "1.0.0" dependencies = [ "assert_matches", - "asset-hub-westend-runtime", "asset-test-utils", "cumulus-pallet-parachain-system", "cumulus-pallet-xcmp-queue", @@ -951,14 +947,12 @@ dependencies = [ "pallet-xcm", "parachains-common", "parity-scale-codec", - "penpal-runtime", "polkadot-runtime-common", "sp-core", "sp-keyring", "sp-runtime", "staging-xcm", "staging-xcm-executor", - "westend-runtime", "westend-system-emulated-network", "xcm-runtime-apis", ] @@ -2063,8 +2057,6 @@ dependencies = [ name = "bridge-hub-rococo-integration-tests" version = "1.0.0" dependencies = [ - "asset-hub-rococo-runtime", - "bridge-hub-rococo-runtime", "cumulus-pallet-xcmp-queue", "emulated-integration-tests-common", "frame-support", @@ -2248,7 +2240,6 @@ dependencies = [ name = "bridge-hub-westend-integration-tests" version = "1.0.0" dependencies = [ - "bridge-hub-westend-runtime", "cumulus-pallet-xcmp-queue", "emulated-integration-tests-common", "frame-support", @@ -2893,8 +2884,6 @@ name = "collectives-westend-integration-tests" version = "1.0.0" dependencies = [ "assert_matches", - "asset-hub-westend-runtime", - "collectives-westend-runtime", "cumulus-pallet-parachain-system", "cumulus-pallet-xcmp-queue", "emulated-integration-tests-common", @@ -2913,7 +2902,6 @@ dependencies = [ "staging-xcm", "staging-xcm-executor", "testnet-parachains-constants", - "westend-runtime", "westend-runtime-constants", "westend-system-emulated-network", ] @@ -12571,9 +12559,7 @@ dependencies = [ "pallet-message-queue", "parachains-common", "parity-scale-codec", - "people-rococo-runtime", "polkadot-runtime-common", - "rococo-runtime", "rococo-runtime-constants", "rococo-system-emulated-network", "sp-runtime", @@ -12672,12 +12658,10 @@ dependencies = [ "pallet-message-queue", "parachains-common", "parity-scale-codec", - "people-westend-runtime", "polkadot-runtime-common", "sp-runtime", "staging-xcm", "staging-xcm-executor", - "westend-runtime", "westend-runtime-constants", "westend-system-emulated-network", ] diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs index 202d02b250b..80d2376c681 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs @@ -13,6 +13,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +pub use asset_hub_rococo_runtime; + pub mod genesis; // Substrate diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs index 6043a6aeda4..608690218d2 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs @@ -13,6 +13,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +pub use asset_hub_westend_runtime; + pub mod genesis; // Substrate diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs index 8c18d112bc1..d8b8edaf240 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs @@ -15,6 +15,11 @@ pub mod genesis; +pub use bridge_hub_rococo_runtime::{ + xcm_config::XcmConfig as BridgeHubRococoXcmConfig, EthereumBeaconClient, EthereumInboundQueue, + RuntimeOrigin as BridgeHubRococoRuntimeOrigin, +}; + // Substrate use frame_support::traits::OnInitialize; diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs index b0dddc9dbf9..f701b309699 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs @@ -15,6 +15,8 @@ pub mod genesis; +pub use bridge_hub_westend_runtime::xcm_config::XcmConfig as BridgeHubWestendXcmConfig; + // Substrate use frame_support::traits::OnInitialize; diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/lib.rs index a32e865dd9c..f90d82231a3 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/lib.rs @@ -13,6 +13,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +pub use collectives_westend_runtime; + pub mod genesis; // Substrate diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/lib.rs index fa818bf81bf..c8da97cc3e8 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/lib.rs @@ -12,6 +12,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +pub use people_rococo_runtime; pub mod genesis; diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/lib.rs index 775b89ac208..904ce34d8c0 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/lib.rs @@ -12,6 +12,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +pub use people_westend_runtime; pub mod genesis; diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs index c268b014bfa..91793d33f30 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs @@ -13,11 +13,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +pub use penpal_runtime::{self, xcm_config::RelayNetworkId as PenpalRelayNetworkId}; + mod genesis; pub use genesis::{genesis, PenpalAssetOwner, PenpalSudoAccount, ED, PARA_ID_A, PARA_ID_B}; -pub use penpal_runtime::xcm_config::{ - CustomizableAssetFromSystemAssetHub, RelayNetworkId as PenpalRelayNetworkId, -}; // Substrate use frame_support::traits::OnInitialize; diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs index 7a3a936ec97..bd637a5f796 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs @@ -12,6 +12,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +pub use rococo_runtime; pub mod genesis; diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs index 83af58f6173..ce9fafcd5bd 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs @@ -12,6 +12,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +pub use westend_runtime; pub mod genesis; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml index 19d3bb3cb29..b4579da94cb 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml @@ -28,7 +28,6 @@ pallet-utility = { workspace = true } xcm = { workspace = true } pallet-xcm = { workspace = true } xcm-executor = { workspace = true } -rococo-runtime = { workspace = true } polkadot-runtime-common = { workspace = true, default-features = true } rococo-runtime-constants = { workspace = true, default-features = true } @@ -36,7 +35,5 @@ rococo-runtime-constants = { workspace = true, default-features = true } asset-test-utils = { workspace = true, default-features = true } cumulus-pallet-parachain-system = { workspace = true } parachains-common = { workspace = true, default-features = true } -asset-hub-rococo-runtime = { workspace = true, default-features = true } -penpal-runtime = { workspace = true } emulated-integration-tests-common = { workspace = true } rococo-system-emulated-network = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs index 2bd388bee40..f0094592696 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs @@ -46,14 +46,36 @@ mod imports { pub use parachains_common::Balance; pub use rococo_system_emulated_network::{ asset_hub_rococo_emulated_chain::{ + asset_hub_rococo_runtime::{ + xcm_config::{ + self as ahr_xcm_config, TokenLocation as RelayLocation, + XcmConfig as AssetHubRococoXcmConfig, + }, + AssetConversionOrigin as AssetHubRococoAssetConversionOrigin, + }, genesis::{AssetHubRococoAssetOwner, ED as ASSET_HUB_ROCOCO_ED}, AssetHubRococoParaPallet as AssetHubRococoPallet, }, penpal_emulated_chain::{ + penpal_runtime::xcm_config::{ + CustomizableAssetFromSystemAssetHub as PenpalCustomizableAssetFromSystemAssetHub, + LocalReservableFromAssetHub as PenpalLocalReservableFromAssetHub, + LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub, + }, PenpalAParaPallet as PenpalAPallet, PenpalAssetOwner, PenpalBParaPallet as PenpalBPallet, ED as PENPAL_ED, }, - rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, + rococo_emulated_chain::{ + genesis::ED as ROCOCO_ED, + rococo_runtime::{ + governance as rococo_governance, + xcm_config::{ + UniversalLocation as RococoUniversalLocation, XcmConfig as RococoXcmConfig, + }, + OriginCaller as RococoOriginCaller, + }, + RococoRelayPallet as RococoPallet, + }, AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, AssetHubRococoParaSender as AssetHubRococoSender, BridgeHubRococoPara as BridgeHubRococo, BridgeHubRococoParaReceiver as BridgeHubRococoReceiver, PenpalAPara as PenpalA, @@ -62,18 +84,6 @@ mod imports { RococoRelayReceiver as RococoReceiver, RococoRelaySender as RococoSender, }; - // Runtimes - pub use asset_hub_rococo_runtime::xcm_config::{ - TokenLocation as RelayLocation, XcmConfig as AssetHubRococoXcmConfig, - }; - pub use penpal_runtime::xcm_config::{ - LocalReservableFromAssetHub as PenpalLocalReservableFromAssetHub, - LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub, - }; - pub use rococo_runtime::xcm_config::{ - UniversalLocation as RococoUniversalLocation, XcmConfig as RococoXcmConfig, - }; - pub const ASSET_ID: u32 = 3; pub const ASSET_MIN_BALANCE: u128 = 1000; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/hybrid_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/hybrid_transfers.rs index edaaa998a9c..7ff6d6c193c 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/hybrid_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/hybrid_transfers.rs @@ -170,7 +170,7 @@ fn transfer_foreign_assets_from_asset_hub_to_para() { assert_ok!(::System::set_storage( ::RuntimeOrigin::root(), vec![( - penpal_runtime::xcm_config::CustomizableAssetFromSystemAssetHub::key().to_vec(), + PenpalCustomizableAssetFromSystemAssetHub::key().to_vec(), Location::new(2, [GlobalConsensus(Westend)]).encode(), )], )); @@ -300,7 +300,7 @@ fn transfer_foreign_assets_from_para_to_asset_hub() { assert_ok!(::System::set_storage( ::RuntimeOrigin::root(), vec![( - penpal_runtime::xcm_config::CustomizableAssetFromSystemAssetHub::key().to_vec(), + PenpalCustomizableAssetFromSystemAssetHub::key().to_vec(), Location::new(2, [GlobalConsensus(Westend)]).encode(), )], )); @@ -454,7 +454,7 @@ fn transfer_foreign_assets_from_para_to_para_through_asset_hub() { assert_ok!(::System::set_storage( ::RuntimeOrigin::root(), vec![( - penpal_runtime::xcm_config::CustomizableAssetFromSystemAssetHub::key().to_vec(), + PenpalCustomizableAssetFromSystemAssetHub::key().to_vec(), Location::new(2, [GlobalConsensus(Westend)]).encode(), )], )); diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs index ec48e400ff5..16e0512da96 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs @@ -17,10 +17,7 @@ use crate::imports::*; #[test] fn swap_locally_on_chain_using_local_assets() { - let asset_native = Box::new( - v3::Location::try_from(asset_hub_rococo_runtime::xcm_config::TokenLocation::get()) - .expect("conversion works"), - ); + let asset_native = Box::new(v3::Location::try_from(RelayLocation::get()).unwrap()); let asset_one = Box::new(v3::Location::new( 0, [ @@ -230,12 +227,12 @@ fn swap_locally_on_chain_using_foreign_assets() { #[test] fn cannot_create_pool_from_pool_assets() { - let asset_native = asset_hub_rococo_runtime::xcm_config::TokenLocation::get(); - let mut asset_one = asset_hub_rococo_runtime::xcm_config::PoolAssetsPalletLocation::get(); + let asset_native = RelayLocation::get(); + let mut asset_one = ahr_xcm_config::PoolAssetsPalletLocation::get(); asset_one.append_with(GeneralIndex(ASSET_ID.into())).expect("pool assets"); AssetHubRococo::execute_with(|| { - let pool_owner_account_id = asset_hub_rococo_runtime::AssetConversionOrigin::get(); + let pool_owner_account_id = AssetHubRococoAssetConversionOrigin::get(); assert_ok!(::PoolAssets::create( ::RuntimeOrigin::signed(pool_owner_account_id.clone()), @@ -255,8 +252,8 @@ fn cannot_create_pool_from_pool_assets() { assert_matches::assert_matches!( ::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - Box::new(v3::Location::try_from(asset_native).expect("conversion works")), - Box::new(v3::Location::try_from(asset_one).expect("conversion works")), + Box::new(v3::Location::try_from(asset_native).unwrap()), + Box::new(v3::Location::try_from(asset_one).unwrap()), ), Err(DispatchError::Module(ModuleError{index: _, error: _, message})) => assert_eq!(message, Some("Unknown")) ); @@ -265,9 +262,7 @@ fn cannot_create_pool_from_pool_assets() { #[test] fn pay_xcm_fee_with_some_asset_swapped_for_native() { - let asset_native = - v3::Location::try_from(asset_hub_rococo_runtime::xcm_config::TokenLocation::get()) - .expect("conversion works"); + let asset_native = v3::Location::try_from(RelayLocation::get()).unwrap(); let asset_one = xcm::v3::Location { parents: 0, interior: [ diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs index 809641c626f..f8190e11c51 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs @@ -25,7 +25,6 @@ use frame_support::{ }; use parachains_common::AccountId; use polkadot_runtime_common::impls::VersionedLocatableAsset; -use rococo_runtime::OriginCaller; use rococo_runtime_constants::currency::GRAND; use xcm_executor::traits::ConvertLocation; @@ -67,7 +66,7 @@ fn spend_roc_on_asset_hub() { let treasury_location: Location = (Parent, PalletInstance(18)).into(); let teleport_call = RuntimeCall::Utility(pallet_utility::Call::::dispatch_as { - as_origin: bx!(OriginCaller::system(RawOrigin::Signed(treasury_account))), + as_origin: bx!(RococoOriginCaller::system(RawOrigin::Signed(treasury_account))), call: bx!(RuntimeCall::XcmPallet(pallet_xcm::Call::::teleport_assets { dest: bx!(VersionedLocation::V4(asset_hub_location.clone())), beneficiary: bx!(VersionedLocation::V4(treasury_location)), @@ -99,7 +98,7 @@ fn spend_roc_on_asset_hub() { // Fund Alice account from Rococo Treasury account on Asset Hub. let treasury_origin: RuntimeOrigin = - rococo_runtime::governance::pallet_custom_origins::Origin::Treasurer.into(); + rococo_governance::pallet_custom_origins::Origin::Treasurer.into(); let alice_location: Location = [Junction::AccountId32 { network: None, id: Rococo::account_id_of(ALICE).into() }] @@ -168,10 +167,7 @@ fn create_and_claim_treasury_spend_in_usdt() { let treasury_location: Location = Location::new(1, PalletInstance(18)); // treasury account on a sibling parachain. let treasury_account = - asset_hub_rococo_runtime::xcm_config::LocationToAccountId::convert_location( - &treasury_location, - ) - .unwrap(); + ahr_xcm_config::LocationToAccountId::convert_location(&treasury_location).unwrap(); let asset_hub_location = v3::Location::new(0, v3::Junction::Parachain(AssetHubRococo::para_id().into())); let root = ::RuntimeOrigin::root(); diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml index 2f4cc5ea39c..6b50b6f473e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml @@ -35,12 +35,9 @@ xcm = { workspace = true } xcm-executor = { workspace = true } pallet-xcm = { workspace = true } xcm-runtime-apis = { workspace = true } -westend-runtime = { workspace = true } # Cumulus parachains-common = { workspace = true, default-features = true } -penpal-runtime = { workspace = true } -asset-hub-westend-runtime = { workspace = true } asset-test-utils = { workspace = true, default-features = true } cumulus-pallet-xcmp-queue = { workspace = true } cumulus-pallet-parachain-system = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs index 1c4a0ef4c8d..db8ada3f4ea 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs @@ -46,15 +46,33 @@ mod imports { pub use parachains_common::{AccountId, Balance}; pub use westend_system_emulated_network::{ asset_hub_westend_emulated_chain::{ + asset_hub_westend_runtime::{ + xcm_config::{ + self as ahw_xcm_config, WestendLocation as RelayLocation, + XcmConfig as AssetHubWestendXcmConfig, + }, + AssetConversionOrigin as AssetHubWestendAssetConversionOrigin, + }, genesis::{AssetHubWestendAssetOwner, ED as ASSET_HUB_WESTEND_ED}, AssetHubWestendParaPallet as AssetHubWestendPallet, }, collectives_westend_emulated_chain::CollectivesWestendParaPallet as CollectivesWestendPallet, penpal_emulated_chain::{ + penpal_runtime::xcm_config::{ + CustomizableAssetFromSystemAssetHub as PenpalCustomizableAssetFromSystemAssetHub, + LocalReservableFromAssetHub as PenpalLocalReservableFromAssetHub, + LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub, + }, PenpalAParaPallet as PenpalAPallet, PenpalAssetOwner, PenpalBParaPallet as PenpalBPallet, }, - westend_emulated_chain::{genesis::ED as WESTEND_ED, WestendRelayPallet as WestendPallet}, + westend_emulated_chain::{ + genesis::ED as WESTEND_ED, + westend_runtime::xcm_config::{ + UniversalLocation as WestendUniversalLocation, XcmConfig as WestendXcmConfig, + }, + WestendRelayPallet as WestendPallet, + }, AssetHubWestendPara as AssetHubWestend, AssetHubWestendParaReceiver as AssetHubWestendReceiver, AssetHubWestendParaSender as AssetHubWestendSender, @@ -66,18 +84,6 @@ mod imports { WestendRelayReceiver as WestendReceiver, WestendRelaySender as WestendSender, }; - // Runtimes - pub use asset_hub_westend_runtime::xcm_config::{ - WestendLocation as RelayLocation, XcmConfig as AssetHubWestendXcmConfig, - }; - pub use penpal_runtime::xcm_config::{ - LocalReservableFromAssetHub as PenpalLocalReservableFromAssetHub, - LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub, - }; - pub use westend_runtime::xcm_config::{ - UniversalLocation as WestendUniversalLocation, XcmConfig as WestendXcmConfig, - }; - pub const ASSET_ID: u32 = 3; pub const ASSET_MIN_BALANCE: u128 = 1000; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs index 2d02e90f47f..15f4fe33bdd 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs @@ -28,10 +28,7 @@ fn create_and_claim_treasury_spend() { Location::new(1, [Parachain(CollectivesWestend::para_id().into()), PalletInstance(65)]); // treasury account on a sibling parachain. let treasury_account = - asset_hub_westend_runtime::xcm_config::LocationToAccountId::convert_location( - &treasury_location, - ) - .unwrap(); + ahw_xcm_config::LocationToAccountId::convert_location(&treasury_location).unwrap(); let asset_hub_location = Location::new(1, [Parachain(AssetHubWestend::para_id().into())]); let root = ::RuntimeOrigin::root(); // asset kind to be spent from the treasury. diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/hybrid_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/hybrid_transfers.rs index d39c72c7c5f..49dfe8d5839 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/hybrid_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/hybrid_transfers.rs @@ -170,7 +170,7 @@ fn transfer_foreign_assets_from_asset_hub_to_para() { assert_ok!(::System::set_storage( ::RuntimeOrigin::root(), vec![( - penpal_runtime::xcm_config::CustomizableAssetFromSystemAssetHub::key().to_vec(), + PenpalCustomizableAssetFromSystemAssetHub::key().to_vec(), Location::new(2, [GlobalConsensus(Rococo)]).encode(), )], )); @@ -300,7 +300,7 @@ fn transfer_foreign_assets_from_para_to_asset_hub() { assert_ok!(::System::set_storage( ::RuntimeOrigin::root(), vec![( - penpal_runtime::xcm_config::CustomizableAssetFromSystemAssetHub::key().to_vec(), + PenpalCustomizableAssetFromSystemAssetHub::key().to_vec(), Location::new(2, [GlobalConsensus(Rococo)]).encode(), )], )); @@ -455,7 +455,7 @@ fn transfer_foreign_assets_from_para_to_para_through_asset_hub() { assert_ok!(::System::set_storage( ::RuntimeOrigin::root(), vec![( - penpal_runtime::xcm_config::CustomizableAssetFromSystemAssetHub::key().to_vec(), + PenpalCustomizableAssetFromSystemAssetHub::key().to_vec(), Location::new(2, [GlobalConsensus(Rococo)]).encode(), )], )); diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs index f6b65809886..cf429378cf6 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs @@ -17,10 +17,8 @@ use crate::imports::*; #[test] fn swap_locally_on_chain_using_local_assets() { - let asset_native = Box::new( - v3::Location::try_from(asset_hub_westend_runtime::xcm_config::WestendLocation::get()) - .expect("conversion works"), - ); + let asset_native = + Box::new(v3::Location::try_from(RelayLocation::get()).expect("conversion works")); let asset_one = Box::new(v3::Location { parents: 0, interior: [ @@ -229,12 +227,12 @@ fn swap_locally_on_chain_using_foreign_assets() { #[test] fn cannot_create_pool_from_pool_assets() { - let asset_native = asset_hub_westend_runtime::xcm_config::WestendLocation::get(); - let mut asset_one = asset_hub_westend_runtime::xcm_config::PoolAssetsPalletLocation::get(); + let asset_native = RelayLocation::get(); + let mut asset_one = ahw_xcm_config::PoolAssetsPalletLocation::get(); asset_one.append_with(GeneralIndex(ASSET_ID.into())).expect("pool assets"); AssetHubWestend::execute_with(|| { - let pool_owner_account_id = asset_hub_westend_runtime::AssetConversionOrigin::get(); + let pool_owner_account_id = AssetHubWestendAssetConversionOrigin::get(); assert_ok!(::PoolAssets::create( ::RuntimeOrigin::signed(pool_owner_account_id.clone()), @@ -264,9 +262,7 @@ fn cannot_create_pool_from_pool_assets() { #[test] fn pay_xcm_fee_with_some_asset_swapped_for_native() { - let asset_native = - v3::Location::try_from(asset_hub_westend_runtime::xcm_config::WestendLocation::get()) - .expect("conversion works"); + let asset_native = v3::Location::try_from(RelayLocation::get()).expect("conversion works"); let asset_one = xcm::v3::Location { parents: 0, interior: [ diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs index 6d8c0f5e5de..8cbce3e0d22 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs @@ -27,10 +27,7 @@ fn create_and_claim_treasury_spend() { let treasury_location: Location = Location::new(1, PalletInstance(37)); // treasury account on a sibling parachain. let treasury_account = - asset_hub_westend_runtime::xcm_config::LocationToAccountId::convert_location( - &treasury_location, - ) - .unwrap(); + ahw_xcm_config::LocationToAccountId::convert_location(&treasury_location).unwrap(); let asset_hub_location = Location::new(0, Parachain(AssetHubWestend::para_id().into())); let root = ::RuntimeOrigin::root(); // asset kind to be spend from the treasury. diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml index 23dee370bf3..a5787885329 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml @@ -33,14 +33,12 @@ xcm-executor = { workspace = true } pallet-bridge-messages = { workspace = true } # Cumulus -parachains-common = { workspace = true, default-features = true } -testnet-parachains-constants = { features = ["rococo"], workspace = true, default-features = true } cumulus-pallet-xcmp-queue = { workspace = true } -bridge-hub-rococo-runtime = { workspace = true } emulated-integration-tests-common = { workspace = true } -rococo-westend-system-emulated-network = { workspace = true } +parachains-common = { workspace = true, default-features = true } rococo-system-emulated-network = { workspace = true } -asset-hub-rococo-runtime = { workspace = true } +rococo-westend-system-emulated-network = { workspace = true } +testnet-parachains-constants = { features = ["rococo"], workspace = true, default-features = true } # Snowbridge snowbridge-core = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs index abfbd9b45a9..04466a611c7 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs @@ -40,6 +40,7 @@ mod imports { pub use parachains_common::AccountId; pub use rococo_westend_system_emulated_network::{ asset_hub_rococo_emulated_chain::{ + asset_hub_rococo_runtime::xcm_config as ahr_xcm_config, genesis::{AssetHubRococoAssetOwner, ED as ASSET_HUB_ROCOCO_ED}, AssetHubRococoParaPallet as AssetHubRococoPallet, }, @@ -47,9 +48,17 @@ mod imports { genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet, }, bridge_hub_rococo_emulated_chain::{ - genesis::ED as BRIDGE_HUB_ROCOCO_ED, BridgeHubRococoParaPallet as BridgeHubRococoPallet, + genesis::ED as BRIDGE_HUB_ROCOCO_ED, + BridgeHubRococoParaPallet as BridgeHubRococoPallet, BridgeHubRococoRuntimeOrigin, + BridgeHubRococoXcmConfig, EthereumBeaconClient, EthereumInboundQueue, + }, + penpal_emulated_chain::{ + penpal_runtime::xcm_config::{ + CustomizableAssetFromSystemAssetHub as PenpalCustomizableAssetFromSystemAssetHub, + UniversalLocation as PenpalUniversalLocation, + }, + PenpalAParaPallet as PenpalAPallet, PenpalAssetOwner, }, - penpal_emulated_chain::{PenpalAParaPallet as PenpalAPallet, PenpalAssetOwner}, rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWestendPara as AssetHubWestend, diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs index 995c992c70f..6053936487b 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs @@ -15,91 +15,98 @@ use crate::tests::*; -fn send_assets_from_asset_hub_rococo_to_asset_hub_westend(assets: Assets, fee_idx: u32) { - let destination = asset_hub_westend_location(); - +fn send_assets_over_bridge(send_fn: F) { // fund the AHR's SA on BHR for paying bridge transport fees BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id(), 10_000_000_000_000u128); // set XCM versions - AssetHubRococo::force_xcm_version(destination.clone(), XCM_VERSION); + let local_asset_hub = PenpalA::sibling_location_of(AssetHubRococo::para_id()); + PenpalA::force_xcm_version(local_asset_hub.clone(), XCM_VERSION); + AssetHubRococo::force_xcm_version(asset_hub_westend_location(), XCM_VERSION); BridgeHubRococo::force_xcm_version(bridge_hub_westend_location(), XCM_VERSION); // send message over bridge - assert_ok!(send_assets_from_asset_hub_rococo(destination, assets, fee_idx)); + send_fn(); + + // process and verify intermediary hops assert_bridge_hub_rococo_message_accepted(true); assert_bridge_hub_westend_message_received(); } -fn send_asset_from_penpal_rococo_through_local_asset_hub_to_westend_asset_hub( - id: Location, - transfer_amount: u128, -) { - let destination = asset_hub_westend_location(); - let local_asset_hub: Location = PenpalA::sibling_location_of(AssetHubRococo::para_id()); - let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of( - AssetHubRococo::sibling_location_of(PenpalA::para_id()), - ); - let sov_ahw_on_ahr = AssetHubRococo::sovereign_account_of_parachain_on_other_global_consensus( - Westend, - AssetHubWestend::para_id(), - ); - - // fund the AHR's SA on BHR for paying bridge transport fees - BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id(), 10_000_000_000_000u128); - - // set XCM versions - PenpalA::force_xcm_version(local_asset_hub.clone(), XCM_VERSION); - AssetHubRococo::force_xcm_version(destination.clone(), XCM_VERSION); - BridgeHubRococo::force_xcm_version(bridge_hub_westend_location(), XCM_VERSION); +fn set_up_rocs_for_penpal_rococo_through_ahr_to_ahw( + sender: &AccountId, + amount: u128, +) -> (Location, v3::Location) { + let roc_at_rococo_parachains = roc_at_ah_rococo(); + let roc_at_asset_hub_westend = bridged_roc_at_ah_westend().try_into().unwrap(); + create_foreign_on_ah_westend(roc_at_asset_hub_westend, true); - // send message over bridge - assert_ok!(PenpalA::execute_with(|| { - let signed_origin = ::RuntimeOrigin::signed(PenpalASender::get()); - let beneficiary: Location = - AccountId32Junction { network: None, id: AssetHubWestendReceiver::get().into() }.into(); - let assets: Assets = (id.clone(), transfer_amount).into(); - let fees_id: AssetId = id.into(); - let custom_xcm_on_dest = Xcm::<()>(vec![DepositAsset { - assets: Wild(AllCounted(assets.len() as u32)), - beneficiary, - }]); + let penpal_location = AssetHubRococo::sibling_location_of(PenpalA::para_id()); + let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of(penpal_location); + // fund Penpal's sovereign account on AssetHub + AssetHubRococo::fund_accounts(vec![(sov_penpal_on_ahr.into(), amount * 2)]); + // fund Penpal's sender account + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(PenpalAssetOwner::get()), + roc_at_rococo_parachains.clone(), + sender.clone(), + amount * 2, + ); + (roc_at_rococo_parachains, roc_at_asset_hub_westend) +} - ::PolkadotXcm::transfer_assets_using_type_and_then( - signed_origin, - bx!(destination.into()), - bx!(assets.clone().into()), - bx!(TransferType::RemoteReserve(local_asset_hub.clone().into())), - bx!(fees_id.into()), - bx!(TransferType::RemoteReserve(local_asset_hub.into())), - bx!(VersionedXcm::from(custom_xcm_on_dest)), - WeightLimit::Unlimited, - ) - })); - AssetHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - assert_expected_events!( - AssetHubRococo, - vec![ - // Amount to reserve transfer is withdrawn from Penpal's sovereign account - RuntimeEvent::Balances( - pallet_balances::Event::Burned { who, amount } - ) => { - who: *who == sov_penpal_on_ahr.clone().into(), - amount: *amount == transfer_amount, - }, - // Amount deposited in AHW's sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { - who: *who == sov_ahw_on_ahr.clone().into(), - }, - RuntimeEvent::XcmpQueue( - cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. } - ) => {}, - ] +fn send_assets_from_penpal_rococo_through_rococo_ah_to_westend_ah( + destination: Location, + assets: (Assets, TransferType), + fees: (AssetId, TransferType), + custom_xcm_on_dest: Xcm<()>, +) { + send_assets_over_bridge(|| { + let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of( + AssetHubRococo::sibling_location_of(PenpalA::para_id()), ); + let sov_ahw_on_ahr = + AssetHubRococo::sovereign_account_of_parachain_on_other_global_consensus( + Westend, + AssetHubWestend::para_id(), + ); + // send message over bridge + assert_ok!(PenpalA::execute_with(|| { + let signed_origin = ::RuntimeOrigin::signed(PenpalASender::get()); + ::PolkadotXcm::transfer_assets_using_type_and_then( + signed_origin, + bx!(destination.into()), + bx!(assets.0.into()), + bx!(assets.1), + bx!(fees.0.into()), + bx!(fees.1), + bx!(VersionedXcm::from(custom_xcm_on_dest)), + WeightLimit::Unlimited, + ) + })); + // verify intermediary AH Rococo hop + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + assert_expected_events!( + AssetHubRococo, + vec![ + // Amount to reserve transfer is withdrawn from Penpal's sovereign account + RuntimeEvent::Balances( + pallet_balances::Event::Burned { who, .. } + ) => { + who: *who == sov_penpal_on_ahr.clone().into(), + }, + // Amount deposited in AHW's sovereign account + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { + who: *who == sov_ahw_on_ahr.clone().into(), + }, + RuntimeEvent::XcmpQueue( + cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. } + ) => {}, + ] + ); + }); }); - assert_bridge_hub_rococo_message_accepted(true); - assert_bridge_hub_westend_message_received(); } #[test] @@ -134,9 +141,12 @@ fn send_roc_usdt_and_weth_from_asset_hub_rococo_to_asset_hub_westend() { foreign_balance_on_ah_westend(bridged_roc_at_asset_hub_westend, &receiver); // send ROCs, use them for fees - let assets: Assets = (Location::try_from(roc_at_asset_hub_rococo).unwrap(), amount).into(); - let fee_index = 0; - send_assets_from_asset_hub_rococo_to_asset_hub_westend(assets, fee_index); + send_assets_over_bridge(|| { + let destination = asset_hub_westend_location(); + let assets: Assets = (Location::try_from(roc_at_asset_hub_rococo).unwrap(), amount).into(); + let fee_idx = 0; + assert_ok!(send_assets_from_asset_hub_rococo(destination, assets, fee_idx)); + }); // verify expected events on final destination AssetHubWestend::execute_with(|| { @@ -244,6 +254,7 @@ fn send_roc_usdt_and_weth_from_asset_hub_rococo_to_asset_hub_westend() { /// Send bridged WNDs "back" from AssetHub Rococo to AssetHub Westend. fn send_back_wnds_from_asset_hub_rococo_to_asset_hub_westend() { let prefund_amount = 10_000_000_000_000u128; + let amount_to_send = ASSET_HUB_WESTEND_ED * 1_000; let sender = AssetHubRococoSender::get(); let receiver = AssetHubWestendReceiver::get(); let wnd_at_asset_hub_rococo = bridged_wnd_at_ah_rococo(); @@ -266,11 +277,13 @@ fn send_back_wnds_from_asset_hub_rococo_to_asset_hub_westend() { assert_eq!(sender_wnds_before, prefund_amount); let receiver_wnds_before = ::account_data_of(receiver.clone()).free; - let amount_to_send = ASSET_HUB_WESTEND_ED * 1_000; - send_assets_from_asset_hub_rococo_to_asset_hub_westend( - (wnd_at_asset_hub_rococo, amount_to_send).into(), - 0, - ); + // send back WNDs, use them for fees + send_assets_over_bridge(|| { + let destination = asset_hub_westend_location(); + let assets: Assets = (wnd_at_asset_hub_rococo, amount_to_send).into(); + let fee_idx = 0; + assert_ok!(send_assets_from_asset_hub_rococo(destination, assets, fee_idx)); + }); AssetHubWestend::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; @@ -311,24 +324,12 @@ fn send_back_wnds_from_asset_hub_rococo_to_asset_hub_westend() { #[test] fn send_rocs_from_penpal_rococo_through_asset_hub_rococo_to_asset_hub_westend() { - let roc_at_rococo_parachains = roc_at_ah_rococo(); - let roc_at_asset_hub_westend = bridged_roc_at_ah_westend().try_into().unwrap(); - create_foreign_on_ah_westend(roc_at_asset_hub_westend, true); - let amount = ASSET_HUB_ROCOCO_ED * 10_000_000; let sender = PenpalASender::get(); let receiver = AssetHubWestendReceiver::get(); - let penpal_location = AssetHubRococo::sibling_location_of(PenpalA::para_id()); - let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of(penpal_location); - // fund Penpal's sovereign account on AssetHub - AssetHubRococo::fund_accounts(vec![(sov_penpal_on_ahr.into(), amount * 2)]); - // fund Penpal's sender account - PenpalA::mint_foreign_asset( - ::RuntimeOrigin::signed(PenpalAssetOwner::get()), - roc_at_rococo_parachains.clone(), - sender.clone(), - amount * 2, - ); + let local_asset_hub = PenpalA::sibling_location_of(AssetHubRococo::para_id()); + let (roc_at_rococo_parachains, roc_at_asset_hub_westend) = + set_up_rocs_for_penpal_rococo_through_ahr_to_ahw(&sender, amount); let sov_ahw_on_ahr = AssetHubRococo::sovereign_account_of_parachain_on_other_global_consensus( Westend, @@ -343,11 +344,27 @@ fn send_rocs_from_penpal_rococo_through_asset_hub_rococo_to_asset_hub_westend() let receiver_rocs_before = foreign_balance_on_ah_westend(roc_at_asset_hub_westend, &receiver); // Send ROCs over bridge - send_asset_from_penpal_rococo_through_local_asset_hub_to_westend_asset_hub( - roc_at_rococo_parachains.clone(), - amount, - ); + { + let destination = asset_hub_westend_location(); + let assets: Assets = (roc_at_rococo_parachains.clone(), amount).into(); + let asset_transfer_type = TransferType::RemoteReserve(local_asset_hub.clone().into()); + let fees_id: AssetId = roc_at_rococo_parachains.clone().into(); + let fees_transfer_type = TransferType::RemoteReserve(local_asset_hub.into()); + let beneficiary: Location = + AccountId32Junction { network: None, id: receiver.clone().into() }.into(); + let custom_xcm_on_dest = Xcm::<()>(vec![DepositAsset { + assets: Wild(AllCounted(assets.len() as u32)), + beneficiary, + }]); + send_assets_from_penpal_rococo_through_rococo_ah_to_westend_ah( + destination, + (assets, asset_transfer_type), + (fees_id, fees_transfer_type), + custom_xcm_on_dest, + ); + } + // process AHW incoming message and check events AssetHubWestend::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( @@ -382,3 +399,121 @@ fn send_rocs_from_penpal_rococo_through_asset_hub_rococo_to_asset_hub_westend() assert!(rocs_in_reserve_on_ahr_after > rocs_in_reserve_on_ahr_before); assert!(rocs_in_reserve_on_ahr_after <= rocs_in_reserve_on_ahr_before + amount); } + +#[test] +fn send_back_wnds_from_penpal_rococo_through_asset_hub_rococo_to_asset_hub_westend() { + let wnd_at_rococo_parachains = bridged_wnd_at_ah_rococo(); + let wnd_at_rococo_parachains_v3 = wnd_at_rococo_parachains.clone().try_into().unwrap(); + let amount = ASSET_HUB_ROCOCO_ED * 10_000_000; + let sender = PenpalASender::get(); + let receiver = AssetHubWestendReceiver::get(); + + // set up ROCs for transfer + let (roc_at_rococo_parachains, _) = + set_up_rocs_for_penpal_rococo_through_ahr_to_ahw(&sender, amount); + + // set up WNDs for transfer + let penpal_location = AssetHubRococo::sibling_location_of(PenpalA::para_id()); + let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of(penpal_location); + let prefund_accounts = vec![(sov_penpal_on_ahr, amount * 2)]; + create_foreign_on_ah_rococo(wnd_at_rococo_parachains_v3, true, prefund_accounts); + let asset_owner: AccountId = AssetHubRococo::account_id_of(ALICE); + PenpalA::force_create_foreign_asset( + wnd_at_rococo_parachains.clone(), + asset_owner.clone(), + true, + ASSET_MIN_BALANCE, + vec![(sender.clone(), amount * 2)], + ); + + // fund the AHR's SA on AHW with the WND tokens held in reserve + let sov_ahr_on_ahw = AssetHubWestend::sovereign_account_of_parachain_on_other_global_consensus( + NetworkId::Rococo, + AssetHubRococo::para_id(), + ); + AssetHubWestend::fund_accounts(vec![(sov_ahr_on_ahw.clone(), amount * 2)]); + + // balances before + let sender_wnds_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(wnd_at_rococo_parachains.clone().into(), &sender) + }); + let receiver_wnds_before = ::account_data_of(receiver.clone()).free; + + // send WNDs over the bridge, ROCs only used to pay fees on local AH, pay with WND on remote AH + { + let final_destination = asset_hub_westend_location(); + let intermediary_hop = PenpalA::sibling_location_of(AssetHubRococo::para_id()); + let context = PenpalA::execute_with(|| PenpalUniversalLocation::get()); + + // what happens at final destination + let beneficiary = AccountId32Junction { network: None, id: receiver.clone().into() }.into(); + // use WND as fees on the final destination (AHW) + let remote_fees: Asset = (wnd_at_rococo_parachains.clone(), amount).into(); + let remote_fees = remote_fees.reanchored(&final_destination, &context).unwrap(); + // buy execution using WNDs, then deposit all remaining WNDs + let xcm_on_final_dest = Xcm::<()>(vec![ + BuyExecution { fees: remote_fees, weight_limit: WeightLimit::Unlimited }, + DepositAsset { assets: Wild(AllCounted(1)), beneficiary }, + ]); + + // what happens at intermediary hop + // reanchor final dest (Asset Hub Westend) to the view of hop (Asset Hub Rococo) + let mut final_destination = final_destination.clone(); + final_destination.reanchor(&intermediary_hop, &context).unwrap(); + // reanchor WNDs to the view of hop (Asset Hub Rococo) + let asset: Asset = (wnd_at_rococo_parachains.clone(), amount).into(); + let asset = asset.reanchored(&intermediary_hop, &context).unwrap(); + // on Asset Hub Rococo, forward a request to withdraw WNDs from reserve on Asset Hub Westend + let xcm_on_hop = Xcm::<()>(vec![InitiateReserveWithdraw { + assets: Definite(asset.into()), // WNDs + reserve: final_destination, // AHW + xcm: xcm_on_final_dest, // XCM to execute on AHW + }]); + // assets to send from Penpal and how they reach the intermediary hop + let assets: Assets = vec![ + (wnd_at_rococo_parachains.clone(), amount).into(), + (roc_at_rococo_parachains.clone(), amount).into(), + ] + .into(); + let asset_transfer_type = TransferType::DestinationReserve; + let fees_id: AssetId = roc_at_rococo_parachains.into(); + let fees_transfer_type = TransferType::DestinationReserve; + + // initiate the transfer + send_assets_from_penpal_rococo_through_rococo_ah_to_westend_ah( + intermediary_hop, + (assets, asset_transfer_type), + (fees_id, fees_transfer_type), + xcm_on_hop, + ); + } + + // process AHW incoming message and check events + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + assert_expected_events!( + AssetHubWestend, + vec![ + // issue ROCs on AHW + RuntimeEvent::Balances(pallet_balances::Event::Issued { .. }) => {}, + // message processed successfully + RuntimeEvent::MessageQueue( + pallet_message_queue::Event::Processed { success: true, .. } + ) => {}, + ] + ); + }); + + let sender_wnds_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(wnd_at_rococo_parachains.into(), &sender) + }); + let receiver_wnds_after = ::account_data_of(receiver).free; + + // Sender's balance is reduced by sent "amount" + assert_eq!(sender_wnds_after, sender_wnds_before - amount); + // Receiver's balance is increased by no more than "amount" + assert!(receiver_wnds_after > receiver_wnds_before); + assert!(receiver_wnds_after <= receiver_wnds_before + amount); +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index e2f62fdb94e..40a1968ec55 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -13,12 +13,10 @@ // See the License for the specific language governing permissions and // limitations under the License. use crate::imports::*; -use bridge_hub_rococo_runtime::{EthereumBeaconClient, EthereumInboundQueue, RuntimeOrigin}; use codec::{Decode, Encode}; use emulated_integration_tests_common::xcm_emulator::ConvertLocation; use frame_support::pallet_prelude::TypeInfo; use hex_literal::hex; -use rococo_system_emulated_network::penpal_emulated_chain::CustomizableAssetFromSystemAssetHub; use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeHubRococoSender; use snowbridge_core::{inbound::InboundQueueFixture, outbound::OperatingMode}; use snowbridge_pallet_inbound_queue_fixtures::{ @@ -64,7 +62,7 @@ pub fn send_inbound_message(fixture: InboundQueueFixture) -> DispatchResult { ) .unwrap(); EthereumInboundQueue::submit( - RuntimeOrigin::signed(BridgeHubRococoSender::get()), + BridgeHubRococoRuntimeOrigin::signed(BridgeHubRococoSender::get()), fixture.message, ) } @@ -298,7 +296,7 @@ fn send_token_from_ethereum_to_penpal() { assert_ok!(::System::set_storage( ::RuntimeOrigin::root(), vec![( - CustomizableAssetFromSystemAssetHub::key().to_vec(), + PenpalCustomizableAssetFromSystemAssetHub::key().to_vec(), Location::new(2, [GlobalConsensus(Ethereum { chain_id: CHAIN_ID })]).encode(), )], )); @@ -379,7 +377,7 @@ fn send_token_from_ethereum_to_penpal() { /// - returning the token to Ethereum #[test] fn send_weth_asset_from_asset_hub_to_ethereum() { - use asset_hub_rococo_runtime::xcm_config::bridging::to_ethereum::DefaultBridgeHubEthereumBaseFee; + use ahr_xcm_config::bridging::to_ethereum::DefaultBridgeHubEthereumBaseFee; let assethub_location = BridgeHubRococo::sibling_location_of(AssetHubRococo::para_id()); let assethub_sovereign = BridgeHubRococo::sovereign_account_id_of(assethub_location); diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs index 8f51f5b1800..1fb03748d92 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs @@ -13,8 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::tests::*; -use bridge_hub_rococo_runtime::xcm_config::XcmConfig; +use crate::imports::*; #[test] fn teleport_to_other_system_parachains_works() { @@ -22,9 +21,9 @@ fn teleport_to_other_system_parachains_works() { let native_asset: Assets = (Parent, amount).into(); test_parachain_is_trusted_teleporter!( - BridgeHubRococo, // Origin - XcmConfig, // XCM configuration - vec![AssetHubRococo], // Destinations + BridgeHubRococo, // Origin + BridgeHubRococoXcmConfig, // XCM configuration + vec![AssetHubRococo], // Destinations (native_asset, amount) ); } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml index 4be226f0dc7..6b83479eaf8 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml @@ -30,8 +30,7 @@ xcm-executor = { workspace = true } pallet-bridge-messages = { workspace = true } # Cumulus -parachains-common = { workspace = true, default-features = true } cumulus-pallet-xcmp-queue = { workspace = true } -bridge-hub-westend-runtime = { workspace = true } emulated-integration-tests-common = { workspace = true } +parachains-common = { workspace = true, default-features = true } rococo-westend-system-emulated-network = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs index b92a22cef62..3b0fcea57a2 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs @@ -49,9 +49,12 @@ mod imports { }, bridge_hub_westend_emulated_chain::{ genesis::ED as BRIDGE_HUB_WESTEND_ED, - BridgeHubWestendParaPallet as BridgeHubWestendPallet, + BridgeHubWestendParaPallet as BridgeHubWestendPallet, BridgeHubWestendXcmConfig, + }, + penpal_emulated_chain::{ + penpal_runtime::xcm_config::UniversalLocation as PenpalUniversalLocation, + PenpalAssetOwner, PenpalBParaPallet as PenpalBPallet, }, - penpal_emulated_chain::{PenpalAssetOwner, PenpalBParaPallet as PenpalBPallet}, westend_emulated_chain::WestendRelayPallet as WestendPallet, AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWestendPara as AssetHubWestend, diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs index 63ccb0ff486..0c0b04cd45a 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs @@ -14,91 +14,99 @@ // limitations under the License. use crate::tests::*; -fn send_assets_from_asset_hub_westend_to_asset_hub_rococo(assets: Assets, fee_idx: u32) { - let destination = asset_hub_rococo_location(); - +fn send_assets_over_bridge(send_fn: F) { // fund the AHW's SA on BHW for paying bridge transport fees BridgeHubWestend::fund_para_sovereign(AssetHubWestend::para_id(), 10_000_000_000_000u128); // set XCM versions - AssetHubWestend::force_xcm_version(destination.clone(), XCM_VERSION); + let local_asset_hub = PenpalB::sibling_location_of(AssetHubWestend::para_id()); + PenpalB::force_xcm_version(local_asset_hub.clone(), XCM_VERSION); + AssetHubWestend::force_xcm_version(asset_hub_rococo_location(), XCM_VERSION); BridgeHubWestend::force_xcm_version(bridge_hub_rococo_location(), XCM_VERSION); // send message over bridge - assert_ok!(send_assets_from_asset_hub_westend(destination, assets, fee_idx)); + send_fn(); + + // process and verify intermediary hops assert_bridge_hub_westend_message_accepted(true); assert_bridge_hub_rococo_message_received(); } -fn send_asset_from_penpal_westend_through_local_asset_hub_to_rococo_asset_hub( - id: Location, - transfer_amount: u128, -) { - let destination = asset_hub_rococo_location(); - let local_asset_hub: Location = PenpalB::sibling_location_of(AssetHubWestend::para_id()); - let sov_penpal_on_ahw = AssetHubWestend::sovereign_account_id_of( - AssetHubWestend::sibling_location_of(PenpalB::para_id()), - ); - let sov_ahr_on_ahw = AssetHubWestend::sovereign_account_of_parachain_on_other_global_consensus( - Rococo, - AssetHubRococo::para_id(), - ); - - // fund the AHW's SA on BHW for paying bridge transport fees - BridgeHubWestend::fund_para_sovereign(AssetHubWestend::para_id(), 10_000_000_000_000u128); - - // set XCM versions - PenpalB::force_xcm_version(local_asset_hub.clone(), XCM_VERSION); - AssetHubWestend::force_xcm_version(destination.clone(), XCM_VERSION); - BridgeHubWestend::force_xcm_version(bridge_hub_rococo_location(), XCM_VERSION); +fn set_up_wnds_for_penpal_westend_through_ahw_to_ahr( + sender: &AccountId, + amount: u128, +) -> (Location, v3::Location) { + let wnd_at_westend_parachains = wnd_at_ah_westend(); + let wnd_at_asset_hub_rococo = bridged_wnd_at_ah_rococo().try_into().unwrap(); + create_foreign_on_ah_rococo(wnd_at_asset_hub_rococo, true); - // send message over bridge - assert_ok!(PenpalB::execute_with(|| { - let signed_origin = ::RuntimeOrigin::signed(PenpalBSender::get()); - let beneficiary: Location = - AccountId32Junction { network: None, id: AssetHubRococoReceiver::get().into() }.into(); - let assets: Assets = (id.clone(), transfer_amount).into(); - let fees_id: AssetId = id.into(); - let custom_xcm_on_dest = Xcm::<()>(vec![DepositAsset { - assets: Wild(AllCounted(assets.len() as u32)), - beneficiary, - }]); + let penpal_location = AssetHubWestend::sibling_location_of(PenpalB::para_id()); + let sov_penpal_on_ahw = AssetHubWestend::sovereign_account_id_of(penpal_location); + // fund Penpal's sovereign account on AssetHub + AssetHubWestend::fund_accounts(vec![(sov_penpal_on_ahw.into(), amount * 2)]); + // fund Penpal's sender account + PenpalB::mint_foreign_asset( + ::RuntimeOrigin::signed(PenpalAssetOwner::get()), + wnd_at_westend_parachains.clone(), + sender.clone(), + amount * 2, + ); + (wnd_at_westend_parachains, wnd_at_asset_hub_rococo) +} - ::PolkadotXcm::transfer_assets_using_type_and_then( - signed_origin, - bx!(destination.into()), - bx!(assets.into()), - bx!(TransferType::RemoteReserve(local_asset_hub.clone().into())), - bx!(fees_id.into()), - bx!(TransferType::RemoteReserve(local_asset_hub.into())), - bx!(VersionedXcm::from(custom_xcm_on_dest)), - WeightLimit::Unlimited, - ) - })); - AssetHubWestend::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - assert_expected_events!( - AssetHubWestend, - vec![ - // Amount to reserve transfer is withdrawn from Penpal's sovereign account - RuntimeEvent::Balances( - pallet_balances::Event::Burned { who, amount } - ) => { - who: *who == sov_penpal_on_ahw.clone().into(), - amount: *amount == transfer_amount, - }, - // Amount deposited in AHR's sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { - who: *who == sov_ahr_on_ahw.clone().into(), - }, - RuntimeEvent::XcmpQueue( - cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. } - ) => {}, - ] +fn send_assets_from_penpal_westend_through_westend_ah_to_rococo_ah( + destination: Location, + assets: (Assets, TransferType), + fees: (AssetId, TransferType), + custom_xcm_on_dest: Xcm<()>, +) { + send_assets_over_bridge(|| { + let sov_penpal_on_ahw = AssetHubWestend::sovereign_account_id_of( + AssetHubWestend::sibling_location_of(PenpalB::para_id()), ); + let sov_ahr_on_ahw = + AssetHubWestend::sovereign_account_of_parachain_on_other_global_consensus( + Rococo, + AssetHubRococo::para_id(), + ); + + // send message over bridge + assert_ok!(PenpalB::execute_with(|| { + let signed_origin = ::RuntimeOrigin::signed(PenpalBSender::get()); + ::PolkadotXcm::transfer_assets_using_type_and_then( + signed_origin, + bx!(destination.into()), + bx!(assets.0.into()), + bx!(assets.1), + bx!(fees.0.into()), + bx!(fees.1), + bx!(VersionedXcm::from(custom_xcm_on_dest)), + WeightLimit::Unlimited, + ) + })); + // verify intermediary AH Westend hop + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + assert_expected_events!( + AssetHubWestend, + vec![ + // Amount to reserve transfer is withdrawn from Penpal's sovereign account + RuntimeEvent::Balances( + pallet_balances::Event::Burned { who, .. } + ) => { + who: *who == sov_penpal_on_ahw.clone().into(), + }, + // Amount deposited in AHR's sovereign account + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { + who: *who == sov_ahr_on_ahw.clone().into(), + }, + RuntimeEvent::XcmpQueue( + cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. } + ) => {}, + ] + ); + }); }); - assert_bridge_hub_westend_message_accepted(true); - assert_bridge_hub_rococo_message_received(); } #[test] @@ -124,9 +132,12 @@ fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { foreign_balance_on_ah_rococo(bridged_wnd_at_asset_hub_rococo, &receiver); // send WNDs, use them for fees - let assets: Assets = (wnd_at_asset_hub_westend, amount).into(); - let fee_index = 0; - send_assets_from_asset_hub_westend_to_asset_hub_rococo(assets, fee_index); + send_assets_over_bridge(|| { + let destination = asset_hub_rococo_location(); + let assets: Assets = (wnd_at_asset_hub_westend, amount).into(); + let fee_idx = 0; + assert_ok!(send_assets_from_asset_hub_westend(destination, assets, fee_idx)); + }); // verify expected events on final destination AssetHubRococo::execute_with(|| { @@ -172,6 +183,7 @@ fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { /// Ethereum to Rococo over Snowbridge, then bridged over to Westend through this bridge). fn send_back_rocs_usdt_and_weth_from_asset_hub_westend_to_asset_hub_rococo() { let prefund_amount = 10_000_000_000_000u128; + let amount_to_send = ASSET_HUB_ROCOCO_ED * 1_000; let sender = AssetHubWestendSender::get(); let receiver = AssetHubRococoReceiver::get(); let bridged_roc_at_asset_hub_westend = bridged_roc_at_ah_westend(); @@ -200,11 +212,14 @@ fn send_back_rocs_usdt_and_weth_from_asset_hub_westend_to_asset_hub_rococo() { assert_eq!(sender_rocs_before, prefund_amount); let receiver_rocs_before = ::account_data_of(receiver.clone()).free; - let amount_to_send = ASSET_HUB_ROCOCO_ED * 1_000; - send_assets_from_asset_hub_westend_to_asset_hub_rococo( - (bridged_roc_at_asset_hub_westend, amount_to_send).into(), - 0, - ); + // send back ROCs, use them for fees + send_assets_over_bridge(|| { + let destination = asset_hub_rococo_location(); + let assets: Assets = (bridged_roc_at_asset_hub_westend, amount_to_send).into(); + let fee_idx = 0; + assert_ok!(send_assets_from_asset_hub_westend(destination, assets, fee_idx)); + }); + AssetHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( @@ -335,24 +350,12 @@ fn send_back_rocs_usdt_and_weth_from_asset_hub_westend_to_asset_hub_rococo() { #[test] fn send_wnds_from_penpal_westend_through_asset_hub_westend_to_asset_hub_rococo() { - let wnd_at_westend_parachains = wnd_at_ah_westend(); - let wnd_at_asset_hub_rococo = bridged_wnd_at_ah_rococo().try_into().unwrap(); - create_foreign_on_ah_rococo(wnd_at_asset_hub_rococo, true); - let amount = ASSET_HUB_WESTEND_ED * 10_000_000; let sender = PenpalBSender::get(); let receiver = AssetHubRococoReceiver::get(); - let penpal_location = AssetHubWestend::sibling_location_of(PenpalB::para_id()); - let sov_penpal_on_ahw = AssetHubWestend::sovereign_account_id_of(penpal_location); - // fund Penpal's sovereign account on AssetHub - AssetHubWestend::fund_accounts(vec![(sov_penpal_on_ahw.into(), amount * 2)]); - // fund Penpal's sender account - PenpalB::mint_foreign_asset( - ::RuntimeOrigin::signed(PenpalAssetOwner::get()), - wnd_at_westend_parachains.clone(), - sender.clone(), - amount * 2, - ); + let local_asset_hub = PenpalB::sibling_location_of(AssetHubWestend::para_id()); + let (wnd_at_westend_parachains, wnd_at_asset_hub_rococo) = + set_up_wnds_for_penpal_westend_through_ahw_to_ahr(&sender, amount); let sov_ahr_on_ahw = AssetHubWestend::sovereign_account_of_parachain_on_other_global_consensus( Rococo, @@ -367,11 +370,27 @@ fn send_wnds_from_penpal_westend_through_asset_hub_westend_to_asset_hub_rococo() let receiver_wnds_before = foreign_balance_on_ah_rococo(wnd_at_asset_hub_rococo, &receiver); // Send WNDs over bridge - send_asset_from_penpal_westend_through_local_asset_hub_to_rococo_asset_hub( - wnd_at_westend_parachains.clone(), - amount, - ); + { + let destination = asset_hub_rococo_location(); + let assets: Assets = (wnd_at_westend_parachains.clone(), amount).into(); + let asset_transfer_type = TransferType::RemoteReserve(local_asset_hub.clone().into()); + let fees_id: AssetId = wnd_at_westend_parachains.clone().into(); + let fees_transfer_type = TransferType::RemoteReserve(local_asset_hub.into()); + let beneficiary: Location = + AccountId32Junction { network: None, id: receiver.clone().into() }.into(); + let custom_xcm_on_dest = Xcm::<()>(vec![DepositAsset { + assets: Wild(AllCounted(assets.len() as u32)), + beneficiary, + }]); + send_assets_from_penpal_westend_through_westend_ah_to_rococo_ah( + destination, + (assets, asset_transfer_type), + (fees_id, fees_transfer_type), + custom_xcm_on_dest, + ); + } + // process AHR incoming message and check events AssetHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( @@ -406,3 +425,121 @@ fn send_wnds_from_penpal_westend_through_asset_hub_westend_to_asset_hub_rococo() assert!(wnds_in_reserve_on_ahw_after > wnds_in_reserve_on_ahw_before); assert!(wnds_in_reserve_on_ahw_after <= wnds_in_reserve_on_ahw_before + amount); } + +#[test] +fn send_back_rocs_from_penpal_westend_through_asset_hub_westend_to_asset_hub_rococo() { + let roc_at_westend_parachains = bridged_roc_at_ah_westend(); + let roc_at_westend_parachains_v3 = roc_at_westend_parachains.clone().try_into().unwrap(); + let amount = ASSET_HUB_WESTEND_ED * 10_000_000; + let sender = PenpalBSender::get(); + let receiver = AssetHubRococoReceiver::get(); + + // set up WNDs for transfer + let (wnd_at_westend_parachains, _) = + set_up_wnds_for_penpal_westend_through_ahw_to_ahr(&sender, amount); + + // set up ROCs for transfer + let penpal_location = AssetHubWestend::sibling_location_of(PenpalB::para_id()); + let sov_penpal_on_ahr = AssetHubWestend::sovereign_account_id_of(penpal_location); + let prefund_accounts = vec![(sov_penpal_on_ahr, amount * 2)]; + create_foreign_on_ah_westend(roc_at_westend_parachains_v3, true, prefund_accounts); + let asset_owner: AccountId = AssetHubWestend::account_id_of(ALICE); + PenpalB::force_create_foreign_asset( + roc_at_westend_parachains.clone(), + asset_owner.clone(), + true, + ASSET_MIN_BALANCE, + vec![(sender.clone(), amount * 2)], + ); + + // fund the AHW's SA on AHR with the ROC tokens held in reserve + let sov_ahw_on_ahr = AssetHubRococo::sovereign_account_of_parachain_on_other_global_consensus( + NetworkId::Westend, + AssetHubWestend::para_id(), + ); + AssetHubRococo::fund_accounts(vec![(sov_ahw_on_ahr.clone(), amount * 2)]); + + // balances before + let sender_rocs_before = PenpalB::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(roc_at_westend_parachains.clone().into(), &sender) + }); + let receiver_rocs_before = ::account_data_of(receiver.clone()).free; + + // send ROCs over the bridge, WNDs only used to pay fees on local AH, pay with ROC on remote AH + { + let final_destination = asset_hub_rococo_location(); + let intermediary_hop = PenpalB::sibling_location_of(AssetHubWestend::para_id()); + let context = PenpalB::execute_with(|| PenpalUniversalLocation::get()); + + // what happens at final destination + let beneficiary = AccountId32Junction { network: None, id: receiver.clone().into() }.into(); + // use ROC as fees on the final destination (AHW) + let remote_fees: Asset = (roc_at_westend_parachains.clone(), amount).into(); + let remote_fees = remote_fees.reanchored(&final_destination, &context).unwrap(); + // buy execution using ROCs, then deposit all remaining ROCs + let xcm_on_final_dest = Xcm::<()>(vec![ + BuyExecution { fees: remote_fees, weight_limit: WeightLimit::Unlimited }, + DepositAsset { assets: Wild(AllCounted(1)), beneficiary }, + ]); + + // what happens at intermediary hop + // reanchor final dest (Asset Hub Rococo) to the view of hop (Asset Hub Westend) + let mut final_destination = final_destination.clone(); + final_destination.reanchor(&intermediary_hop, &context).unwrap(); + // reanchor ROCs to the view of hop (Asset Hub Westend) + let asset: Asset = (roc_at_westend_parachains.clone(), amount).into(); + let asset = asset.reanchored(&intermediary_hop, &context).unwrap(); + // on Asset Hub Westend, forward a request to withdraw ROCs from reserve on Asset Hub Rococo + let xcm_on_hop = Xcm::<()>(vec![InitiateReserveWithdraw { + assets: Definite(asset.into()), // ROCs + reserve: final_destination, // AHR + xcm: xcm_on_final_dest, // XCM to execute on AHR + }]); + // assets to send from Penpal and how they reach the intermediary hop + let assets: Assets = vec![ + (roc_at_westend_parachains.clone(), amount).into(), + (wnd_at_westend_parachains.clone(), amount).into(), + ] + .into(); + let asset_transfer_type = TransferType::DestinationReserve; + let fees_id: AssetId = wnd_at_westend_parachains.into(); + let fees_transfer_type = TransferType::DestinationReserve; + + // initiate the transfer + send_assets_from_penpal_westend_through_westend_ah_to_rococo_ah( + intermediary_hop, + (assets, asset_transfer_type), + (fees_id, fees_transfer_type), + xcm_on_hop, + ); + } + + // process AHR incoming message and check events + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + assert_expected_events!( + AssetHubRococo, + vec![ + // issue WNDs on AHR + RuntimeEvent::Balances(pallet_balances::Event::Issued { .. }) => {}, + // message processed successfully + RuntimeEvent::MessageQueue( + pallet_message_queue::Event::Processed { success: true, .. } + ) => {}, + ] + ); + }); + + let sender_rocs_after = PenpalB::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(roc_at_westend_parachains.into(), &sender) + }); + let receiver_rocs_after = ::account_data_of(receiver).free; + + // Sender's balance is reduced by sent "amount" + assert_eq!(sender_rocs_after, sender_rocs_before - amount); + // Receiver's balance is increased by no more than "amount" + assert!(receiver_rocs_after > receiver_rocs_before); + assert!(receiver_rocs_after <= receiver_rocs_before + amount); +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs index c960233c08b..64378a844f5 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs @@ -13,8 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::tests::*; -use bridge_hub_westend_runtime::xcm_config::XcmConfig; +use crate::imports::*; #[test] fn teleport_to_other_system_parachains_works() { @@ -22,9 +21,9 @@ fn teleport_to_other_system_parachains_works() { let native_asset: Assets = (Parent, amount).into(); test_parachain_is_trusted_teleporter!( - BridgeHubWestend, // Origin - XcmConfig, // XCM configuration - vec![AssetHubWestend], // Destinations + BridgeHubWestend, // Origin + BridgeHubWestendXcmConfig, // XCM configuration + vec![AssetHubWestend], // Destinations (native_asset, amount) ); } diff --git a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/Cargo.toml index c546132fa63..3012e2b19f5 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/Cargo.toml @@ -29,14 +29,11 @@ polkadot-runtime-common = { workspace = true, default-features = true } xcm = { workspace = true } xcm-executor = { workspace = true } pallet-xcm = { workspace = true } -westend-runtime = { workspace = true } westend-runtime-constants = { workspace = true, default-features = true } # Cumulus parachains-common = { workspace = true, default-features = true } testnet-parachains-constants = { features = ["westend"], workspace = true, default-features = true } -asset-hub-westend-runtime = { workspace = true } -collectives-westend-runtime = { workspace = true } cumulus-pallet-xcmp-queue = { workspace = true } cumulus-pallet-parachain-system = { workspace = true } emulated-integration-tests-common = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/lib.rs index 97239330216..8af93a62f4a 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/lib.rs @@ -19,9 +19,18 @@ pub use emulated_integration_tests_common::xcm_emulator::{ assert_expected_events, bx, Chain, RelayChain as Relay, TestExt, }; pub use westend_system_emulated_network::{ - asset_hub_westend_emulated_chain::AssetHubWestendParaPallet as AssetHubWestendPallet, - collectives_westend_emulated_chain::CollectivesWestendParaPallet as CollectivesWestendPallet, - westend_emulated_chain::WestendRelayPallet as WestendPallet, + asset_hub_westend_emulated_chain::{ + asset_hub_westend_runtime::xcm_config::LocationToAccountId as AssetHubLocationToAccountId, + AssetHubWestendParaPallet as AssetHubWestendPallet, + }, + collectives_westend_emulated_chain::{ + collectives_westend_runtime::fellowship as collectives_fellowship, + CollectivesWestendParaPallet as CollectivesWestendPallet, + }, + westend_emulated_chain::{ + westend_runtime::{governance as westend_governance, OriginCaller as WestendOriginCaller}, + WestendRelayPallet as WestendPallet, + }, AssetHubWestendPara as AssetHubWestend, CollectivesWestendPara as CollectivesWestend, WestendRelay as Westend, }; diff --git a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/fellowship_treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/fellowship_treasury.rs index bde1220e249..abd9a982c8e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/fellowship_treasury.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/fellowship_treasury.rs @@ -14,14 +14,12 @@ // limitations under the License. use crate::*; -use asset_hub_westend_runtime::xcm_config::LocationToAccountId as AssetHubLocationToAccountId; use emulated_integration_tests_common::accounts::ALICE; use frame_support::{ assert_ok, dispatch::RawOrigin, instances::Instance1, sp_runtime::traits::Dispatchable, traits::fungible::Inspect, }; use polkadot_runtime_common::impls::VersionedLocatableAsset; -use westend_runtime::OriginCaller; use westend_runtime_constants::currency::UNITS; use xcm_executor::traits::ConvertLocation; @@ -65,7 +63,7 @@ fn fellowship_treasury_spend() { let treasury_location: Location = (Parent, PalletInstance(37)).into(); let teleport_call = RuntimeCall::Utility(pallet_utility::Call::::dispatch_as { - as_origin: bx!(OriginCaller::system(RawOrigin::Signed(treasury_account))), + as_origin: bx!(WestendOriginCaller::system(RawOrigin::Signed(treasury_account))), call: bx!(RuntimeCall::XcmPallet(pallet_xcm::Call::::teleport_assets { dest: bx!(VersionedLocation::V4(asset_hub_location.clone())), beneficiary: bx!(VersionedLocation::V4(treasury_location)), @@ -97,7 +95,7 @@ fn fellowship_treasury_spend() { // Fund Fellowship Treasury from Westend Treasury. let treasury_origin: RuntimeOrigin = - westend_runtime::governance::pallet_custom_origins::Origin::Treasurer.into(); + westend_governance::pallet_custom_origins::Origin::Treasurer.into(); let fellowship_treasury_location: Location = Location::new(1, [Parachain(1001), PalletInstance(65)]); let asset_hub_location: Location = [Parachain(1000)].into(); @@ -170,8 +168,7 @@ fn fellowship_treasury_spend() { // Fund Alice account from Fellowship Treasury. let fellows_origin: RuntimeOrigin = - collectives_westend_runtime::fellowship::pallet_fellowship_origins::Origin::Fellows - .into(); + collectives_fellowship::pallet_fellowship_origins::Origin::Fellows.into(); let asset_hub_location: Location = (Parent, Parachain(1000)).into(); let native_asset = Location::parent(); diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml index 5221b782ac6..011be93ecac 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml @@ -11,22 +11,20 @@ publish = false codec = { workspace = true } # Substrate -sp-runtime = { workspace = true } frame-support = { workspace = true } pallet-balances = { workspace = true } pallet-message-queue = { workspace = true } pallet-identity = { workspace = true } +sp-runtime = { workspace = true } # Polkadot +polkadot-runtime-common = { workspace = true, default-features = true } +rococo-runtime-constants = { workspace = true, default-features = true } xcm = { workspace = true } xcm-executor = { workspace = true } -rococo-runtime = { workspace = true } -rococo-runtime-constants = { workspace = true, default-features = true } -polkadot-runtime-common = { workspace = true, default-features = true } # Cumulus asset-test-utils = { workspace = true, default-features = true } -parachains-common = { workspace = true, default-features = true } -people-rococo-runtime = { workspace = true } emulated-integration-tests-common = { workspace = true } +parachains-common = { workspace = true, default-features = true } rococo-system-emulated-network = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs index 38ff08b486d..6c23c2f1f29 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs @@ -37,9 +37,19 @@ mod imports { pub use parachains_common::Balance; pub use rococo_system_emulated_network::{ people_rococo_emulated_chain::{ - genesis::ED as PEOPLE_ROCOCO_ED, PeopleRococoParaPallet as PeopleRococoPallet, + genesis::ED as PEOPLE_ROCOCO_ED, + people_rococo_runtime::{people, xcm_config::XcmConfig as PeopleRococoXcmConfig}, + PeopleRococoParaPallet as PeopleRococoPallet, + }, + rococo_emulated_chain::{ + genesis::ED as ROCOCO_ED, + rococo_runtime::{ + xcm_config::XcmConfig as RococoXcmConfig, BasicDeposit, ByteDeposit, + MaxAdditionalFields, MaxSubAccounts, RuntimeOrigin as RococoOrigin, + SubAccountDeposit, + }, + RococoRelayPallet as RococoPallet, }, - rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, PeopleRococoPara as PeopleRococo, PeopleRococoParaReceiver as PeopleRococoReceiver, PeopleRococoParaSender as PeopleRococoSender, RococoRelay as Rococo, RococoRelayReceiver as RococoReceiver, RococoRelaySender as RococoSender, diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs index 3f1f8638d6f..342a8f053f6 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs @@ -42,14 +42,10 @@ use crate::imports::*; use frame_support::BoundedVec; use pallet_balances::Event as BalancesEvent; use pallet_identity::{legacy::IdentityInfo, Data, Event as IdentityEvent}; -use people_rococo_runtime::people::{ +use people::{ BasicDeposit as BasicDepositParachain, ByteDeposit as ByteDepositParachain, IdentityInfo as IdentityInfoParachain, SubAccountDeposit as SubAccountDepositParachain, }; -use rococo_runtime::{ - BasicDeposit, ByteDeposit, MaxAdditionalFields, MaxSubAccounts, RuntimeOrigin as RococoOrigin, - SubAccountDeposit, -}; use rococo_runtime_constants::currency::*; use rococo_system_emulated_network::{ rococo_emulated_chain::RococoRelayPallet, RococoRelay, RococoRelaySender, diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs index 350d87d638a..4410d1bd40d 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs @@ -14,8 +14,6 @@ // limitations under the License. use crate::imports::*; -use people_rococo_runtime::xcm_config::XcmConfig as PeopleRococoXcmConfig; -use rococo_runtime::xcm_config::XcmConfig as RococoXcmConfig; fn relay_origin_assertions(t: RelayToSystemParaTest) { type RuntimeEvent = ::RuntimeEvent; diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml index 58dbf82f222..f7e1cce85a2 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml @@ -11,22 +11,20 @@ publish = false codec = { workspace = true } # Substrate -sp-runtime = { workspace = true } frame-support = { workspace = true } pallet-balances = { workspace = true } pallet-message-queue = { workspace = true } pallet-identity = { workspace = true } +sp-runtime = { workspace = true } # Polkadot +polkadot-runtime-common = { workspace = true, default-features = true } +westend-runtime-constants = { workspace = true, default-features = true } xcm = { workspace = true } xcm-executor = { workspace = true } -westend-runtime = { workspace = true } -westend-runtime-constants = { workspace = true, default-features = true } -polkadot-runtime-common = { workspace = true, default-features = true } # Cumulus asset-test-utils = { workspace = true, default-features = true } -parachains-common = { workspace = true, default-features = true } -people-westend-runtime = { workspace = true } emulated-integration-tests-common = { workspace = true } +parachains-common = { workspace = true, default-features = true } westend-system-emulated-network = { workspace = true } diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs index 77ac7cfc78c..ce1ed9751a2 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs @@ -35,10 +35,21 @@ mod imports { }; pub use parachains_common::Balance; pub use westend_system_emulated_network::{ + self, people_westend_emulated_chain::{ - genesis::ED as PEOPLE_WESTEND_ED, PeopleWestendParaPallet as PeopleWestendPallet, + genesis::ED as PEOPLE_WESTEND_ED, + people_westend_runtime::{people, xcm_config::XcmConfig as PeopleWestendXcmConfig}, + PeopleWestendParaPallet as PeopleWestendPallet, + }, + westend_emulated_chain::{ + genesis::ED as WESTEND_ED, + westend_runtime::{ + xcm_config::XcmConfig as WestendXcmConfig, BasicDeposit, ByteDeposit, + MaxAdditionalFields, MaxSubAccounts, RuntimeOrigin as WestendOrigin, + SubAccountDeposit, + }, + WestendRelayPallet as WestendPallet, }, - westend_emulated_chain::{genesis::ED as WESTEND_ED, WestendRelayPallet as WestendPallet}, PeopleWestendPara as PeopleWestend, PeopleWestendParaReceiver as PeopleWestendReceiver, PeopleWestendParaSender as PeopleWestendSender, WestendRelay as Westend, WestendRelayReceiver as WestendReceiver, WestendRelaySender as WestendSender, diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs index 3ed8592918d..28d1be85320 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs @@ -42,14 +42,10 @@ use crate::imports::*; use frame_support::BoundedVec; use pallet_balances::Event as BalancesEvent; use pallet_identity::{legacy::IdentityInfo, Data, Event as IdentityEvent}; -use people_westend_runtime::people::{ +use people::{ BasicDeposit as BasicDepositParachain, ByteDeposit as ByteDepositParachain, IdentityInfo as IdentityInfoParachain, SubAccountDeposit as SubAccountDepositParachain, }; -use westend_runtime::{ - BasicDeposit, ByteDeposit, MaxAdditionalFields, MaxSubAccounts, RuntimeOrigin as WestendOrigin, - SubAccountDeposit, -}; use westend_runtime_constants::currency::*; use westend_system_emulated_network::{ westend_emulated_chain::WestendRelayPallet, WestendRelay, WestendRelaySender, diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs index 8697477ba76..6fd3cdeb61f 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs @@ -14,8 +14,6 @@ // limitations under the License. use crate::imports::*; -use people_westend_runtime::xcm_config::XcmConfig as PeopleWestendXcmConfig; -use westend_runtime::xcm_config::XcmConfig as WestendXcmConfig; fn relay_origin_assertions(t: RelayToSystemParaTest) { type RuntimeEvent = ::RuntimeEvent; -- GitLab From 33324fe01c5b1f341687cef2aa6e767f6acf40f3 Mon Sep 17 00:00:00 2001 From: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Date: Wed, 3 Jul 2024 14:01:57 +0300 Subject: [PATCH 082/130] approval-voting: Make tests deterministic (#3899) With random connectivity and latency is hard to actually figure it out a delta in the benchmarking, so disable them in order to get full deterministic behaviour when measuring performance. At least on my machine with this configuration the results for approval-throughput are really similar between subsequent runs: ``` CPU usage, seconds total per block approval-distribution 36.9025 3.6902 approval-distribution 36.7579 3.6758 approval-distribution 37.0418 3.7042 approval-distribution 37.0339 3.7034 approval-distribution 36.9342 3.6934 approval-distribution 36.7177 3.6718 approval-voting 52.7756 5.2776 approval-voting 52.5999 5.2600 approval-voting 53.2158 5.3216 approval-voting 53.2493 5.3249 approval-voting 52.8524 5.2852 approval-voting 52.8611 5.2861 approval-voting 52.8210 5.2821 ``` --------- Signed-off-by: Alexandru Gheorghe --- .../examples/approvals_no_shows.yaml | 2 ++ .../examples/approvals_throughput.yaml | 2 ++ .../approvals_throughput_best_case.yaml | 3 +++ ...als_throughput_no_optimisations_enabled.yaml | 3 +++ .../subsystem-bench/src/lib/approval/mod.rs | 17 +++++++++-------- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/polkadot/node/subsystem-bench/examples/approvals_no_shows.yaml b/polkadot/node/subsystem-bench/examples/approvals_no_shows.yaml index 146da57d44c..cae1a30914d 100644 --- a/polkadot/node/subsystem-bench/examples/approvals_no_shows.yaml +++ b/polkadot/node/subsystem-bench/examples/approvals_no_shows.yaml @@ -16,3 +16,5 @@ TestConfiguration: peer_bandwidth: 524288000000 bandwidth: 524288000000 num_blocks: 10 + connectivity: 100 + latency: null diff --git a/polkadot/node/subsystem-bench/examples/approvals_throughput.yaml b/polkadot/node/subsystem-bench/examples/approvals_throughput.yaml index 6b17e62c20a..7edb48e302a 100644 --- a/polkadot/node/subsystem-bench/examples/approvals_throughput.yaml +++ b/polkadot/node/subsystem-bench/examples/approvals_throughput.yaml @@ -16,3 +16,5 @@ TestConfiguration: peer_bandwidth: 524288000000 bandwidth: 524288000000 num_blocks: 10 + connectivity: 100 + latency: null diff --git a/polkadot/node/subsystem-bench/examples/approvals_throughput_best_case.yaml b/polkadot/node/subsystem-bench/examples/approvals_throughput_best_case.yaml index e946c28e8ef..7c24f50e6af 100644 --- a/polkadot/node/subsystem-bench/examples/approvals_throughput_best_case.yaml +++ b/polkadot/node/subsystem-bench/examples/approvals_throughput_best_case.yaml @@ -16,3 +16,6 @@ TestConfiguration: peer_bandwidth: 524288000000 bandwidth: 524288000000 num_blocks: 10 + connectivity: 100 + latency: null + diff --git a/polkadot/node/subsystem-bench/examples/approvals_throughput_no_optimisations_enabled.yaml b/polkadot/node/subsystem-bench/examples/approvals_throughput_no_optimisations_enabled.yaml index 8f4b050e72f..fe2402faecc 100644 --- a/polkadot/node/subsystem-bench/examples/approvals_throughput_no_optimisations_enabled.yaml +++ b/polkadot/node/subsystem-bench/examples/approvals_throughput_no_optimisations_enabled.yaml @@ -16,3 +16,6 @@ TestConfiguration: peer_bandwidth: 524288000000 bandwidth: 524288000000 num_blocks: 10 + connectivity: 100 + latency: null + diff --git a/polkadot/node/subsystem-bench/src/lib/approval/mod.rs b/polkadot/node/subsystem-bench/src/lib/approval/mod.rs index b033be9986f..4ac044ea345 100644 --- a/polkadot/node/subsystem-bench/src/lib/approval/mod.rs +++ b/polkadot/node/subsystem-bench/src/lib/approval/mod.rs @@ -698,12 +698,12 @@ impl PeerMessageProducer { .expect("We can't handle unknown peers") .clone(); - self.network - .send_message_from_peer( - &peer_authority_id, - protocol_v3::ValidationProtocol::ApprovalDistribution(message.msg).into(), - ) - .unwrap_or_else(|_| panic!("Network should be up and running {:?}", sent_by)); + if let Err(err) = self.network.send_message_from_peer( + &peer_authority_id, + protocol_v3::ValidationProtocol::ApprovalDistribution(message.msg).into(), + ) { + gum::warn!(target: LOG_TARGET, ?sent_by, ?err, "Validator can not send message"); + } } // Queues a message to be sent by the peer identified by the `sent_by` value. @@ -994,11 +994,12 @@ pub async fn bench_approvals_run( "polkadot_parachain_subsystem_bounded_received", Some(("subsystem_name", "approval-distribution-subsystem")), |value| { - gum::info!(target: LOG_TARGET, ?value, ?at_least_messages, "Waiting metric"); + gum::debug!(target: LOG_TARGET, ?value, ?at_least_messages, "Waiting metric"); value >= at_least_messages as f64 }, ) .await; + gum::info!("Requesting approval votes ms"); for info in &state.blocks { @@ -1038,7 +1039,7 @@ pub async fn bench_approvals_run( "polkadot_parachain_subsystem_bounded_received", Some(("subsystem_name", "approval-distribution-subsystem")), |value| { - gum::info!(target: LOG_TARGET, ?value, ?at_least_messages, "Waiting metric"); + gum::debug!(target: LOG_TARGET, ?value, ?at_least_messages, "Waiting metric"); value >= at_least_messages as f64 }, ) -- GitLab From e5791a56dcc35e308a80985cc3b6b7f2ed1eb6ec Mon Sep 17 00:00:00 2001 From: gupnik Date: Wed, 3 Jul 2024 17:02:25 +0530 Subject: [PATCH 083/130] Fixes warnings in `frame-support-procedural` crate (#4915) This PR fixes the unused warnings in `frame-support-procedural` crate, raised by the latest stable rust release. --- .../procedural/src/construct_runtime/parse.rs | 33 +++++------------ .../procedural/src/pallet/expand/error.rs | 36 ++++++++++--------- .../procedural/src/pallet/parse/composite.rs | 4 --- .../procedural/src/pallet/parse/config.rs | 4 --- .../procedural/src/pallet/parse/error.rs | 10 +----- .../src/pallet/parse/extra_constants.rs | 11 ++---- .../src/pallet/parse/genesis_build.rs | 10 ++---- .../procedural/src/pallet/parse/hooks.rs | 9 +---- .../procedural/src/pallet/parse/inherent.rs | 6 ++-- .../procedural/src/pallet/parse/mod.rs | 20 +++++------ .../procedural/src/pallet/parse/origin.rs | 8 ++--- .../procedural/src/pallet/parse/tasks.rs | 17 +++------ .../procedural/src/pallet/parse/type_value.rs | 23 ++---------- .../src/pallet/parse/validate_unsigned.rs | 17 +++------ .../procedural/src/runtime/parse/mod.rs | 8 ++--- .../src/runtime/parse/pallet_decl.rs | 6 ++-- .../src/runtime/parse/runtime_struct.rs | 5 ++- 17 files changed, 64 insertions(+), 163 deletions(-) diff --git a/substrate/frame/support/procedural/src/construct_runtime/parse.rs b/substrate/frame/support/procedural/src/construct_runtime/parse.rs index ded77bed4c8..532e032d0cb 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/parse.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/parse.rs @@ -65,8 +65,6 @@ pub enum RuntimeDeclaration { /// Declaration of a runtime with some pallet with implicit declaration of parts. #[derive(Debug)] pub struct ImplicitRuntimeDeclaration { - pub name: Ident, - pub where_section: Option, pub pallets: Vec, } @@ -98,11 +96,7 @@ impl Parse for RuntimeDeclaration { match convert_pallets(pallets.content.inner.into_iter().collect())? { PalletsConversion::Implicit(pallets) => - Ok(RuntimeDeclaration::Implicit(ImplicitRuntimeDeclaration { - name, - where_section, - pallets, - })), + Ok(RuntimeDeclaration::Implicit(ImplicitRuntimeDeclaration { pallets })), PalletsConversion::Explicit(pallets) => Ok(RuntimeDeclaration::Explicit(ExplicitRuntimeDeclaration { name, @@ -124,9 +118,6 @@ impl Parse for RuntimeDeclaration { #[derive(Debug)] pub struct WhereSection { pub span: Span, - pub block: syn::TypePath, - pub node_block: syn::TypePath, - pub unchecked_extrinsic: syn::TypePath, } impl Parse for WhereSection { @@ -145,10 +136,9 @@ impl Parse for WhereSection { } input.parse::()?; } - let block = remove_kind(input, WhereKind::Block, &mut definitions)?.value; - let node_block = remove_kind(input, WhereKind::NodeBlock, &mut definitions)?.value; - let unchecked_extrinsic = - remove_kind(input, WhereKind::UncheckedExtrinsic, &mut definitions)?.value; + remove_kind(input, WhereKind::Block, &mut definitions)?; + remove_kind(input, WhereKind::NodeBlock, &mut definitions)?; + remove_kind(input, WhereKind::UncheckedExtrinsic, &mut definitions)?; if let Some(WhereDefinition { ref kind_span, ref kind, .. }) = definitions.first() { let msg = format!( "`{:?}` was declared above. Please use exactly one declaration for `{:?}`.", @@ -156,7 +146,7 @@ impl Parse for WhereSection { ); return Err(Error::new(*kind_span, msg)) } - Ok(Self { span: input.span(), block, node_block, unchecked_extrinsic }) + Ok(Self { span: input.span() }) } } @@ -171,7 +161,6 @@ pub enum WhereKind { pub struct WhereDefinition { pub kind_span: Span, pub kind: WhereKind, - pub value: syn::TypePath, } impl Parse for WhereDefinition { @@ -187,14 +176,10 @@ impl Parse for WhereDefinition { return Err(lookahead.error()) }; - Ok(Self { - kind_span, - kind, - value: { - let _: Token![=] = input.parse()?; - input.parse()? - }, - }) + let _: Token![=] = input.parse()?; + let _: syn::TypePath = input.parse()?; + + Ok(Self { kind_span, kind }) } } diff --git a/substrate/frame/support/procedural/src/pallet/expand/error.rs b/substrate/frame/support/procedural/src/pallet/expand/error.rs index 72fb6e92357..b921d66ff9e 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/error.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/error.rs @@ -71,23 +71,25 @@ pub fn expand_error(def: &mut Def) -> proc_macro2::TokenStream { ) ); - let as_str_matches = error.variants.iter().map( - |VariantDef { ident: variant, field: field_ty, docs: _, cfg_attrs }| { - let variant_str = variant.to_string(); - let cfg_attrs = cfg_attrs.iter().map(|attr| attr.to_token_stream()); - match field_ty { - Some(VariantField { is_named: true }) => { - quote::quote_spanned!(error.attr_span => #( #cfg_attrs )* Self::#variant { .. } => #variant_str,) - }, - Some(VariantField { is_named: false }) => { - quote::quote_spanned!(error.attr_span => #( #cfg_attrs )* Self::#variant(..) => #variant_str,) - }, - None => { - quote::quote_spanned!(error.attr_span => #( #cfg_attrs )* Self::#variant => #variant_str,) - }, - } - }, - ); + let as_str_matches = + error + .variants + .iter() + .map(|VariantDef { ident: variant, field: field_ty, cfg_attrs }| { + let variant_str = variant.to_string(); + let cfg_attrs = cfg_attrs.iter().map(|attr| attr.to_token_stream()); + match field_ty { + Some(VariantField { is_named: true }) => { + quote::quote_spanned!(error.attr_span => #( #cfg_attrs )* Self::#variant { .. } => #variant_str,) + }, + Some(VariantField { is_named: false }) => { + quote::quote_spanned!(error.attr_span => #( #cfg_attrs )* Self::#variant(..) => #variant_str,) + }, + None => { + quote::quote_spanned!(error.attr_span => #( #cfg_attrs )* Self::#variant => #variant_str,) + }, + } + }); let error_item = { let item = &mut def.item.content.as_mut().expect("Checked by def parser").1[error.index]; diff --git a/substrate/frame/support/procedural/src/pallet/parse/composite.rs b/substrate/frame/support/procedural/src/pallet/parse/composite.rs index c3ac74846bf..20fc30cd26b 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/composite.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/composite.rs @@ -87,8 +87,6 @@ pub mod keyword { } pub struct CompositeDef { - /// The index of the CompositeDef item in the pallet module. - pub index: usize, /// The composite keyword used (contains span). pub composite_keyword: keyword::CompositeKeyword, /// Name of the associated type. @@ -104,7 +102,6 @@ pub struct CompositeDef { impl CompositeDef { pub fn try_from( attr_span: proc_macro2::Span, - index: usize, scrate: &syn::Path, item: &mut syn::Item, ) -> syn::Result { @@ -180,7 +177,6 @@ impl CompositeDef { syn::parse2::(item.ident.to_token_stream())?; Ok(CompositeDef { - index, composite_keyword, attr_span, generics: item.generics.clone(), diff --git a/substrate/frame/support/procedural/src/pallet/parse/config.rs b/substrate/frame/support/procedural/src/pallet/parse/config.rs index eaeaab24758..6febaac9ffa 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/config.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/config.rs @@ -62,8 +62,6 @@ pub struct ConfigDef { pub has_event_type: bool, /// The where clause on trait definition but modified so `Self` is `T`. pub where_clause: Option, - /// The span of the pallet::config attribute. - pub attr_span: proc_macro2::Span, /// Whether a default sub-trait should be generated. /// /// Contains default sub-trait items (instantiated by `#[pallet::config(with_default)]`). @@ -325,7 +323,6 @@ pub fn replace_self_by_t(input: proc_macro2::TokenStream) -> proc_macro2::TokenS impl ConfigDef { pub fn try_from( frame_system: &syn::Path, - attr_span: proc_macro2::Span, index: usize, item: &mut syn::Item, enable_default: bool, @@ -484,7 +481,6 @@ impl ConfigDef { consts_metadata, has_event_type, where_clause, - attr_span, default_sub_trait, }) } diff --git a/substrate/frame/support/procedural/src/pallet/parse/error.rs b/substrate/frame/support/procedural/src/pallet/parse/error.rs index 362df8d7340..bc4087a0ea7 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/error.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/error.rs @@ -16,7 +16,6 @@ // limitations under the License. use super::helper; -use frame_support_procedural_tools::get_doc_literals; use quote::ToTokens; use syn::{spanned::Spanned, Fields}; @@ -37,8 +36,6 @@ pub struct VariantDef { pub ident: syn::Ident, /// The variant field, if any. pub field: Option, - /// The variant doc literals. - pub docs: Vec, /// The `cfg` attributes. pub cfg_attrs: Vec, } @@ -101,12 +98,7 @@ impl ErrorDef { } let cfg_attrs: Vec = helper::get_item_cfg_attrs(&variant.attrs); - Ok(VariantDef { - ident: variant.ident.clone(), - field: field_ty, - docs: get_doc_literals(&variant.attrs), - cfg_attrs, - }) + Ok(VariantDef { ident: variant.ident.clone(), field: field_ty, cfg_attrs }) }) .collect::>()?; diff --git a/substrate/frame/support/procedural/src/pallet/parse/extra_constants.rs b/substrate/frame/support/procedural/src/pallet/parse/extra_constants.rs index 2ba6c44b7d1..12a373db180 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/extra_constants.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/extra_constants.rs @@ -37,8 +37,6 @@ pub struct ExtraConstantsDef { pub where_clause: Option, /// A set of usage of instance, must be check for consistency with trait. pub instances: Vec, - /// The index of call item in pallet module. - pub index: usize, /// The extra constant defined. pub extra_constants: Vec, } @@ -77,7 +75,7 @@ impl syn::parse::Parse for ExtraConstAttr { } impl ExtraConstantsDef { - pub fn try_from(index: usize, item: &mut syn::Item) -> syn::Result { + pub fn try_from(item: &mut syn::Item) -> syn::Result { let item = if let syn::Item::Impl(item) = item { item } else { @@ -150,11 +148,6 @@ impl ExtraConstantsDef { }); } - Ok(Self { - index, - instances, - where_clause: item.generics.where_clause.clone(), - extra_constants, - }) + Ok(Self { instances, where_clause: item.generics.where_clause.clone(), extra_constants }) } } diff --git a/substrate/frame/support/procedural/src/pallet/parse/genesis_build.rs b/substrate/frame/support/procedural/src/pallet/parse/genesis_build.rs index d0e1d9ec998..bc925a21c9c 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/genesis_build.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/genesis_build.rs @@ -20,8 +20,6 @@ use syn::spanned::Spanned; /// Definition for pallet genesis build implementation. pub struct GenesisBuildDef { - /// The index of item in pallet module. - pub index: usize, /// A set of usage of instance, must be check for consistency with trait. pub instances: Option>, /// The where_clause used. @@ -31,11 +29,7 @@ pub struct GenesisBuildDef { } impl GenesisBuildDef { - pub fn try_from( - attr_span: proc_macro2::Span, - index: usize, - item: &mut syn::Item, - ) -> syn::Result { + pub fn try_from(attr_span: proc_macro2::Span, item: &mut syn::Item) -> syn::Result { let item = if let syn::Item::Impl(item) = item { item } else { @@ -56,6 +50,6 @@ impl GenesisBuildDef { let instances = helper::check_genesis_builder_usage(item_trait)?.map(|instances| vec![instances]); - Ok(Self { attr_span, index, instances, where_clause: item.generics.where_clause.clone() }) + Ok(Self { attr_span, instances, where_clause: item.generics.where_clause.clone() }) } } diff --git a/substrate/frame/support/procedural/src/pallet/parse/hooks.rs b/substrate/frame/support/procedural/src/pallet/parse/hooks.rs index 37d7d22f4b6..07b51c8b91f 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/hooks.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/hooks.rs @@ -20,8 +20,6 @@ use syn::spanned::Spanned; /// Implementation of the pallet hooks. pub struct HooksDef { - /// The index of item in pallet. - pub index: usize, /// A set of usage of instance, must be check for consistency with trait. pub instances: Vec, /// The where_clause used. @@ -33,11 +31,7 @@ pub struct HooksDef { } impl HooksDef { - pub fn try_from( - attr_span: proc_macro2::Span, - index: usize, - item: &mut syn::Item, - ) -> syn::Result { + pub fn try_from(attr_span: proc_macro2::Span, item: &mut syn::Item) -> syn::Result { let item = if let syn::Item::Impl(item) = item { item } else { @@ -77,7 +71,6 @@ impl HooksDef { Ok(Self { attr_span, - index, instances, has_runtime_upgrade, where_clause: item.generics.where_clause.clone(), diff --git a/substrate/frame/support/procedural/src/pallet/parse/inherent.rs b/substrate/frame/support/procedural/src/pallet/parse/inherent.rs index d8641691a40..56ebe8e5df4 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/inherent.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/inherent.rs @@ -20,14 +20,12 @@ use syn::spanned::Spanned; /// The definition of the pallet inherent implementation. pub struct InherentDef { - /// The index of inherent item in pallet module. - pub index: usize, /// A set of usage of instance, must be check for consistency with trait. pub instances: Vec, } impl InherentDef { - pub fn try_from(index: usize, item: &mut syn::Item) -> syn::Result { + pub fn try_from(item: &mut syn::Item) -> syn::Result { let item = if let syn::Item::Impl(item) = item { item } else { @@ -55,6 +53,6 @@ impl InherentDef { helper::check_impl_gen(&item.generics, item.impl_token.span())?, ]; - Ok(InherentDef { index, instances }) + Ok(InherentDef { instances }) } } diff --git a/substrate/frame/support/procedural/src/pallet/parse/mod.rs b/substrate/frame/support/procedural/src/pallet/parse/mod.rs index 6e12774611d..f55b166c791 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/mod.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/mod.rs @@ -109,10 +109,9 @@ impl Def { let pallet_attr: Option = helper::take_first_item_pallet_attr(item)?; match pallet_attr { - Some(PalletAttr::Config(span, with_default)) if config.is_none() => + Some(PalletAttr::Config(_, with_default)) if config.is_none() => config = Some(config::ConfigDef::try_from( &frame_system, - span, index, item, with_default, @@ -122,7 +121,7 @@ impl Def { pallet_struct = Some(p); }, Some(PalletAttr::Hooks(span)) if hooks.is_none() => { - let m = hooks::HooksDef::try_from(span, index, item)?; + let m = hooks::HooksDef::try_from(span, item)?; hooks = Some(m); }, Some(PalletAttr::RuntimeCall(cw, span)) if call.is_none() => @@ -162,27 +161,27 @@ impl Def { genesis_config = Some(g); }, Some(PalletAttr::GenesisBuild(span)) if genesis_build.is_none() => { - let g = genesis_build::GenesisBuildDef::try_from(span, index, item)?; + let g = genesis_build::GenesisBuildDef::try_from(span, item)?; genesis_build = Some(g); }, Some(PalletAttr::RuntimeOrigin(_)) if origin.is_none() => - origin = Some(origin::OriginDef::try_from(index, item)?), + origin = Some(origin::OriginDef::try_from(item)?), Some(PalletAttr::Inherent(_)) if inherent.is_none() => - inherent = Some(inherent::InherentDef::try_from(index, item)?), + inherent = Some(inherent::InherentDef::try_from(item)?), Some(PalletAttr::Storage(span)) => storages.push(storage::StorageDef::try_from(span, index, item, dev_mode)?), Some(PalletAttr::ValidateUnsigned(_)) if validate_unsigned.is_none() => { - let v = validate_unsigned::ValidateUnsignedDef::try_from(index, item)?; + let v = validate_unsigned::ValidateUnsignedDef::try_from(item)?; validate_unsigned = Some(v); }, Some(PalletAttr::TypeValue(span)) => type_values.push(type_value::TypeValueDef::try_from(span, index, item)?), Some(PalletAttr::ExtraConstants(_)) => extra_constants = - Some(extra_constants::ExtraConstantsDef::try_from(index, item)?), + Some(extra_constants::ExtraConstantsDef::try_from(item)?), Some(PalletAttr::Composite(span)) => { let composite = - composite::CompositeDef::try_from(span, index, &frame_support, item)?; + composite::CompositeDef::try_from(span, &frame_support, item)?; if composites.iter().any(|def| { match (&def.composite_keyword, &composite.composite_keyword) { ( @@ -722,7 +721,6 @@ impl syn::parse::Parse for PalletAttr { #[derive(Clone)] pub struct InheritedCallWeightAttr { pub typename: syn::Type, - pub span: proc_macro2::Span, } impl syn::parse::Parse for InheritedCallWeightAttr { @@ -744,6 +742,6 @@ impl syn::parse::Parse for InheritedCallWeightAttr { return Err(lookahead.error()) }; - Ok(Self { typename: buffer.parse()?, span: input.span() }) + Ok(Self { typename: buffer.parse()? }) } } diff --git a/substrate/frame/support/procedural/src/pallet/parse/origin.rs b/substrate/frame/support/procedural/src/pallet/parse/origin.rs index 76e2a884119..11311b3d503 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/origin.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/origin.rs @@ -25,16 +25,13 @@ use syn::spanned::Spanned; /// * `struct Origin` /// * `enum Origin` pub struct OriginDef { - /// The index of item in pallet module. - pub index: usize, - pub has_instance: bool, pub is_generic: bool, /// A set of usage of instance, must be check for consistency with trait. pub instances: Vec, } impl OriginDef { - pub fn try_from(index: usize, item: &mut syn::Item) -> syn::Result { + pub fn try_from(item: &mut syn::Item) -> syn::Result { let item_span = item.span(); let (vis, ident, generics) = match &item { syn::Item::Enum(item) => (&item.vis, &item.ident, &item.generics), @@ -46,7 +43,6 @@ impl OriginDef { }, }; - let has_instance = generics.params.len() == 2; let is_generic = !generics.params.is_empty(); let mut instances = vec![]; @@ -67,6 +63,6 @@ impl OriginDef { return Err(syn::Error::new(ident.span(), msg)) } - Ok(OriginDef { index, has_instance, is_generic, instances }) + Ok(OriginDef { is_generic, instances }) } } diff --git a/substrate/frame/support/procedural/src/pallet/parse/tasks.rs b/substrate/frame/support/procedural/src/pallet/parse/tasks.rs index 6405bb415a6..ed860849a4d 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/tasks.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/tasks.rs @@ -34,8 +34,8 @@ use syn::{ parse2, spanned::Spanned, token::{Bracket, Paren, PathSep, Pound}, - Attribute, Error, Expr, Ident, ImplItem, ImplItemFn, ItemEnum, ItemImpl, LitInt, Path, - PathArguments, Result, TypePath, + Error, Expr, Ident, ImplItem, ImplItemFn, ItemEnum, ItemImpl, LitInt, Path, PathArguments, + Result, TypePath, }; pub mod keywords { @@ -180,7 +180,6 @@ pub struct TaskDef { pub condition_attr: TaskConditionAttr, pub list_attr: TaskListAttr, pub weight_attr: TaskWeightAttr, - pub normal_attrs: Vec, pub item: ImplItemFn, pub arg_names: Vec, } @@ -190,7 +189,7 @@ impl syn::parse::Parse for TaskDef { let item = input.parse::()?; // we only want to activate TaskAttrType parsing errors for tasks-related attributes, // so we filter them here - let (task_attrs, normal_attrs) = partition_task_attrs(&item); + let task_attrs = partition_task_attrs(&item).0; let task_attrs: Vec = task_attrs .into_iter() @@ -293,15 +292,7 @@ impl syn::parse::Parse for TaskDef { let list_attr = list_attr.try_into().expect("we check the type above; QED"); let weight_attr = weight_attr.try_into().expect("we check the type above; QED"); - Ok(TaskDef { - index_attr, - condition_attr, - list_attr, - weight_attr, - normal_attrs, - item, - arg_names, - }) + Ok(TaskDef { index_attr, condition_attr, list_attr, weight_attr, item, arg_names }) } } diff --git a/substrate/frame/support/procedural/src/pallet/parse/type_value.rs b/substrate/frame/support/procedural/src/pallet/parse/type_value.rs index 4d9db30b3a7..b9c0635bb3f 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/type_value.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/type_value.rs @@ -28,12 +28,8 @@ pub struct TypeValueDef { pub ident: syn::Ident, /// The type return by Get. pub type_: Box, - /// The block returning the value to get - pub block: Box, /// If type value is generic over `T` (or `T` and `I` for instantiable pallet) pub is_generic: bool, - /// A set of usage of instance, must be check for consistency with config. - pub instances: Vec, /// The where clause of the function. pub where_clause: Option, /// The span of the pallet::type_value attribute. @@ -90,7 +86,6 @@ impl TypeValueDef { let vis = item.vis.clone(); let ident = item.sig.ident.clone(); - let block = item.block.clone(); let type_ = match item.sig.output.clone() { syn::ReturnType::Type(_, type_) => type_, syn::ReturnType::Default => { @@ -99,25 +94,11 @@ impl TypeValueDef { }, }; - let mut instances = vec![]; - if let Some(usage) = helper::check_type_value_gen(&item.sig.generics, item.sig.span())? { - instances.push(usage); - } + helper::check_type_value_gen(&item.sig.generics, item.sig.span())?; let is_generic = item.sig.generics.type_params().count() > 0; let where_clause = item.sig.generics.where_clause.clone(); - Ok(TypeValueDef { - attr_span, - index, - is_generic, - vis, - ident, - block, - type_, - instances, - where_clause, - docs, - }) + Ok(TypeValueDef { attr_span, index, is_generic, vis, ident, type_, where_clause, docs }) } } diff --git a/substrate/frame/support/procedural/src/pallet/parse/validate_unsigned.rs b/substrate/frame/support/procedural/src/pallet/parse/validate_unsigned.rs index 2bf0a1b6c18..038db0d3258 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/validate_unsigned.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/validate_unsigned.rs @@ -19,15 +19,10 @@ use super::helper; use syn::spanned::Spanned; /// The definition of the pallet validate unsigned implementation. -pub struct ValidateUnsignedDef { - /// The index of validate unsigned item in pallet module. - pub index: usize, - /// A set of usage of instance, must be check for consistency with config. - pub instances: Vec, -} +pub struct ValidateUnsignedDef {} impl ValidateUnsignedDef { - pub fn try_from(index: usize, item: &mut syn::Item) -> syn::Result { + pub fn try_from(item: &mut syn::Item) -> syn::Result { let item = if let syn::Item::Impl(item) = item { item } else { @@ -52,11 +47,9 @@ impl ValidateUnsignedDef { return Err(syn::Error::new(item.span(), msg)) } - let instances = vec![ - helper::check_pallet_struct_usage(&item.self_ty)?, - helper::check_impl_gen(&item.generics, item.impl_token.span())?, - ]; + helper::check_pallet_struct_usage(&item.self_ty)?; + helper::check_impl_gen(&item.generics, item.impl_token.span())?; - Ok(ValidateUnsignedDef { index, instances }) + Ok(ValidateUnsignedDef {}) } } diff --git a/substrate/frame/support/procedural/src/runtime/parse/mod.rs b/substrate/frame/support/procedural/src/runtime/parse/mod.rs index 49647993aac..a3d1c9417df 100644 --- a/substrate/frame/support/procedural/src/runtime/parse/mod.rs +++ b/substrate/frame/support/procedural/src/runtime/parse/mod.rs @@ -109,7 +109,6 @@ pub enum AllPalletsDeclaration { /// Declaration of a runtime with some pallet with implicit declaration of parts. #[derive(Debug, Clone)] pub struct ImplicitAllPalletsDeclaration { - pub name: Ident, pub pallet_decls: Vec, pub pallet_count: usize, } @@ -123,7 +122,6 @@ pub struct ExplicitAllPalletsDeclaration { pub struct Def { pub input: TokenStream2, - pub item: syn::ItemMod, pub runtime_struct: runtime_struct::RuntimeStructDef, pub pallets: AllPalletsDeclaration, pub runtime_types: Vec, @@ -161,8 +159,8 @@ impl Def { helper::take_first_item_runtime_attr::(item)? { match runtime_attr { - RuntimeAttr::Runtime(span) if runtime_struct.is_none() => { - let p = runtime_struct::RuntimeStructDef::try_from(span, item)?; + RuntimeAttr::Runtime(_) if runtime_struct.is_none() => { + let p = runtime_struct::RuntimeStructDef::try_from(item)?; runtime_struct = Some(p); }, RuntimeAttr::Derive(_, types) if runtime_types.is_none() => { @@ -240,7 +238,6 @@ impl Def { let decl_count = pallet_decls.len(); let pallets = if decl_count > 0 { AllPalletsDeclaration::Implicit(ImplicitAllPalletsDeclaration { - name, pallet_decls, pallet_count: decl_count.saturating_add(pallets.len()), }) @@ -250,7 +247,6 @@ impl Def { let def = Def { input, - item, runtime_struct: runtime_struct.ok_or_else(|| { syn::Error::new(item_span, "Missing Runtime. Please add a struct inside the module and annotate it with `#[runtime::runtime]`" diff --git a/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs b/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs index fbac75336f2..d34df77b7cf 100644 --- a/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs +++ b/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs @@ -15,15 +15,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use syn::{Attribute, Ident, PathArguments}; +use syn::{Ident, PathArguments}; /// The declaration of a pallet. #[derive(Debug, Clone)] pub struct PalletDeclaration { /// The name of the pallet, e.g.`System` in `pub type System = frame_system`. pub name: Ident, - /// Optional attributes tagged right above a pallet declaration. - pub attrs: Vec, /// The path of the pallet, e.g. `frame_system` in `pub type System = frame_system`. pub path: syn::Path, /// The segment of the pallet, e.g. `Pallet` in `pub type System = frame_system::Pallet`. @@ -91,7 +89,7 @@ impl PalletDeclaration { }; } - Ok(Self { name, path, pallet_segment, runtime_param, instance, attrs: item.attrs.clone() }) + Ok(Self { name, path, pallet_segment, runtime_param, instance }) } } diff --git a/substrate/frame/support/procedural/src/runtime/parse/runtime_struct.rs b/substrate/frame/support/procedural/src/runtime/parse/runtime_struct.rs index 8fa746ee807..33c845ee946 100644 --- a/substrate/frame/support/procedural/src/runtime/parse/runtime_struct.rs +++ b/substrate/frame/support/procedural/src/runtime/parse/runtime_struct.rs @@ -18,11 +18,10 @@ use syn::spanned::Spanned; pub struct RuntimeStructDef { pub ident: syn::Ident, - pub attr_span: proc_macro2::Span, } impl RuntimeStructDef { - pub fn try_from(attr_span: proc_macro2::Span, item: &mut syn::Item) -> syn::Result { + pub fn try_from(item: &mut syn::Item) -> syn::Result { let item = if let syn::Item::Struct(item) = item { item } else { @@ -30,6 +29,6 @@ impl RuntimeStructDef { return Err(syn::Error::new(item.span(), msg)) }; - Ok(Self { ident: item.ident.clone(), attr_span }) + Ok(Self { ident: item.ident.clone() }) } } -- GitLab From b6f18232449b003d716a0d630f3da3a9dce669ab Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Wed, 3 Jul 2024 16:44:21 +0300 Subject: [PATCH 084/130] [BEEFY] Add runtime support for reporting fork voting (#4522) Related to https://github.com/paritytech/polkadot-sdk/issues/4523 Extracting part of https://github.com/paritytech/polkadot-sdk/pull/1903 (credits to @Lederstrumpf for the high-level strategy), but also introducing significant adjustments both to the approach and to the code. The main adjustment is the fact that the `ForkVotingProof` accepts only one vote, compared to the original version which accepted a `vec![]`. With this approach more calls are needed in order to report multiple equivocated votes on the same commit, but it simplifies a lot the checking logic. We can add support for reporting multiple signatures at once in the future. There are 2 things that are missing in order to consider this issue done, but I would propose to do them in a separate PR since this one is already pretty big: - benchmarks/computing a weight for the new extrinsic (this wasn't present in https://github.com/paritytech/polkadot-sdk/pull/1903 either) - exposing an API for generating the ancestry proof. I'm not sure if we should do this in the Mmr pallet or in the Beefy pallet Co-authored-by: Robert Hambrock --------- Co-authored-by: Adrian Catangiu --- polkadot/node/service/src/fake_runtime_api.rs | 2 +- polkadot/runtime/rococo/src/lib.rs | 7 +- polkadot/runtime/test-runtime/src/lib.rs | 2 +- polkadot/runtime/westend/src/lib.rs | 6 +- prdoc/pr_4522.prdoc | 39 ++ substrate/bin/node/runtime/src/lib.rs | 7 +- .../client/consensus/beefy/src/fisherman.rs | 6 +- substrate/client/consensus/beefy/src/tests.rs | 2 +- .../client/consensus/beefy/src/worker.rs | 6 +- substrate/frame/beefy-mmr/src/lib.rs | 79 ++- substrate/frame/beefy-mmr/src/mock.rs | 1 + substrate/frame/beefy-mmr/src/tests.rs | 224 ++++++- substrate/frame/beefy/src/default_weights.rs | 16 +- substrate/frame/beefy/src/equivocation.rs | 285 ++++++--- substrate/frame/beefy/src/lib.rs | 218 ++++++- substrate/frame/beefy/src/mock.rs | 47 +- substrate/frame/beefy/src/tests.rs | 572 +++++++++++++----- .../frame/merkle-mountain-range/src/lib.rs | 52 +- .../merkle-mountain-range/src/mmr/mmr.rs | 74 ++- .../merkle-mountain-range/src/mmr/mod.rs | 2 +- .../merkle-mountain-range/src/mmr/storage.rs | 3 +- .../frame/merkle-mountain-range/src/tests.rs | 20 +- .../primitives/consensus/beefy/src/lib.rs | 58 +- .../primitives/consensus/beefy/src/payload.rs | 2 +- .../consensus/beefy/src/test_utils.rs | 48 +- 25 files changed, 1378 insertions(+), 400 deletions(-) create mode 100644 prdoc/pr_4522.prdoc diff --git a/polkadot/node/service/src/fake_runtime_api.rs b/polkadot/node/service/src/fake_runtime_api.rs index debf3690aea..e971830c95c 100644 --- a/polkadot/node/service/src/fake_runtime_api.rs +++ b/polkadot/node/service/src/fake_runtime_api.rs @@ -241,7 +241,7 @@ sp_api::impl_runtime_apis! { unimplemented!() } - fn submit_report_equivocation_unsigned_extrinsic( + fn submit_report_double_voting_unsigned_extrinsic( _: sp_consensus_beefy::DoubleVotingProof< BlockNumber, BeefyId, diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index c91a712cce0..015e433382c 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -1283,6 +1283,7 @@ impl pallet_beefy::Config for Runtime { type MaxNominators = ConstU32<0>; type MaxSetIdSessionEntries = BeefySetIdSessionEntries; type OnNewValidatorSet = MmrLeaf; + type AncestryHelper = MmrLeaf; type WeightInfo = (); type KeyOwnerProof = >::Proof; type EquivocationReportSystem = @@ -2052,7 +2053,7 @@ sp_api::impl_runtime_apis! { } } - #[api_version(3)] + #[api_version(4)] impl sp_consensus_beefy::BeefyApi for Runtime { fn beefy_genesis() -> Option { pallet_beefy::GenesisBlock::::get() @@ -2062,7 +2063,7 @@ sp_api::impl_runtime_apis! { Beefy::validator_set() } - fn submit_report_equivocation_unsigned_extrinsic( + fn submit_report_double_voting_unsigned_extrinsic( equivocation_proof: sp_consensus_beefy::DoubleVotingProof< BlockNumber, BeefyId, @@ -2072,7 +2073,7 @@ sp_api::impl_runtime_apis! { ) -> Option<()> { let key_owner_proof = key_owner_proof.decode()?; - Beefy::submit_unsigned_equivocation_report( + Beefy::submit_unsigned_double_voting_report( equivocation_proof, key_owner_proof, ) diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index 334c6eb733a..96392c026d5 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -1015,7 +1015,7 @@ sp_api::impl_runtime_apis! { None } - fn submit_report_equivocation_unsigned_extrinsic( + fn submit_report_double_voting_unsigned_extrinsic( _equivocation_proof: sp_consensus_beefy::DoubleVotingProof< BlockNumber, BeefyId, diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 5b50a078539..ca58a639010 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -328,6 +328,7 @@ impl pallet_beefy::Config for Runtime { type MaxNominators = MaxNominators; type MaxSetIdSessionEntries = BeefySetIdSessionEntries; type OnNewValidatorSet = BeefyMmrLeaf; + type AncestryHelper = BeefyMmrLeaf; type WeightInfo = (); type KeyOwnerProof = sp_session::MembershipProof; type EquivocationReportSystem = @@ -2009,6 +2010,7 @@ sp_api::impl_runtime_apis! { } } + #[api_version(4)] impl sp_consensus_beefy::BeefyApi for Runtime { fn beefy_genesis() -> Option { pallet_beefy::GenesisBlock::::get() @@ -2018,7 +2020,7 @@ sp_api::impl_runtime_apis! { Beefy::validator_set() } - fn submit_report_equivocation_unsigned_extrinsic( + fn submit_report_double_voting_unsigned_extrinsic( equivocation_proof: sp_consensus_beefy::DoubleVotingProof< BlockNumber, BeefyId, @@ -2028,7 +2030,7 @@ sp_api::impl_runtime_apis! { ) -> Option<()> { let key_owner_proof = key_owner_proof.decode()?; - Beefy::submit_unsigned_equivocation_report( + Beefy::submit_unsigned_double_voting_report( equivocation_proof, key_owner_proof, ) diff --git a/prdoc/pr_4522.prdoc b/prdoc/pr_4522.prdoc new file mode 100644 index 00000000000..c8fdcfa51a4 --- /dev/null +++ b/prdoc/pr_4522.prdoc @@ -0,0 +1,39 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Added runtime support for reporting BEEFY fork voting + +doc: + - audience: + - Runtime Dev + - Runtime User + description: | + This PR adds the `report_fork_voting`, `report_future_voting` extrinsics to `pallet-beefy` + and renames the `report_equivocation` extrinsic to `report_double_voting`. + `report_fork_voting` can't be called yet, since it uses `Weight::MAX` weight. We will + add benchmarks for it and set the proper weight in a future PR. + Also a new `AncestryHelper` associated trait was added to `pallet_beefy::Config`. + - audience: Node Dev + description: | + This PR renames the `submit_report_equivocation_unsigned_extrinsic` in `BeefyApi` to + `submit_report_double_voting_unsigned_extrinsic`and bumps the `BeefyApi` version from 3 to 4. + +crates: + - name: pallet-beefy + bump: major + - name: pallet-beefy-mmr + bump: minor + - name: pallet-mmr + bump: major + - name: sc-consensus-beefy + bump: patch + - name: kitchensink-runtime + bump: major + - name: rococo-runtime + bump: major + - name: westend-runtime + bump: major + - name: sp-consensus-beefy + bump: major + - name: polkadot-service + bump: patch diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 839e157ae76..fc87fea57ba 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -2548,6 +2548,7 @@ impl pallet_beefy::Config for Runtime { type MaxNominators = ConstU32<0>; type MaxSetIdSessionEntries = BeefySetIdSessionEntries; type OnNewValidatorSet = MmrLeaf; + type AncestryHelper = MmrLeaf; type WeightInfo = (); type KeyOwnerProof = >::Proof; type EquivocationReportSystem = @@ -3032,7 +3033,7 @@ impl_runtime_apis! { } } - #[api_version(3)] + #[api_version(4)] impl sp_consensus_beefy::BeefyApi for Runtime { fn beefy_genesis() -> Option { pallet_beefy::GenesisBlock::::get() @@ -3042,7 +3043,7 @@ impl_runtime_apis! { Beefy::validator_set() } - fn submit_report_equivocation_unsigned_extrinsic( + fn submit_report_double_voting_unsigned_extrinsic( equivocation_proof: sp_consensus_beefy::DoubleVotingProof< BlockNumber, BeefyId, @@ -3052,7 +3053,7 @@ impl_runtime_apis! { ) -> Option<()> { let key_owner_proof = key_owner_proof.decode()?; - Beefy::submit_unsigned_equivocation_report( + Beefy::submit_unsigned_double_voting_report( equivocation_proof, key_owner_proof, ) diff --git a/substrate/client/consensus/beefy/src/fisherman.rs b/substrate/client/consensus/beefy/src/fisherman.rs index 073fee0bdbd..faa4d34eff5 100644 --- a/substrate/client/consensus/beefy/src/fisherman.rs +++ b/substrate/client/consensus/beefy/src/fisherman.rs @@ -23,7 +23,7 @@ use sp_api::ProvideRuntimeApi; use sp_application_crypto::RuntimeAppPublic; use sp_blockchain::HeaderBackend; use sp_consensus_beefy::{ - check_equivocation_proof, AuthorityIdBound, BeefyApi, BeefySignatureHasher, DoubleVotingProof, + check_double_voting_proof, AuthorityIdBound, BeefyApi, BeefySignatureHasher, DoubleVotingProof, OpaqueKeyOwnershipProof, ValidatorSetId, }; use sp_runtime::{ @@ -132,7 +132,7 @@ where (active_rounds.validators(), active_rounds.validator_set_id()); let offender_id = proof.offender_id(); - if !check_equivocation_proof::<_, _, BeefySignatureHasher>(&proof) { + if !check_double_voting_proof::<_, _, BeefySignatureHasher>(&proof) { debug!(target: LOG_TARGET, "🥩 Skipping report for bad equivocation {:?}", proof); return Ok(()); } @@ -155,7 +155,7 @@ where for ProvedValidator { key_owner_proof, .. } in key_owner_proofs { self.runtime .runtime_api() - .submit_report_equivocation_unsigned_extrinsic( + .submit_report_double_voting_unsigned_extrinsic( best_block_hash, proof.clone(), key_owner_proof, diff --git a/substrate/client/consensus/beefy/src/tests.rs b/substrate/client/consensus/beefy/src/tests.rs index 681e11a0c53..d8f5b39dbba 100644 --- a/substrate/client/consensus/beefy/src/tests.rs +++ b/substrate/client/consensus/beefy/src/tests.rs @@ -314,7 +314,7 @@ sp_api::mock_impl_runtime_apis! { self.inner.validator_set.clone() } - fn submit_report_equivocation_unsigned_extrinsic( + fn submit_report_double_voting_unsigned_extrinsic( proof: DoubleVotingProof, AuthorityId, Signature>, _dummy: OpaqueKeyOwnershipProof, ) -> Option<()> { diff --git a/substrate/client/consensus/beefy/src/worker.rs b/substrate/client/consensus/beefy/src/worker.rs index 3ce4da7ecd5..4a9f7a2d0e3 100644 --- a/substrate/client/consensus/beefy/src/worker.rs +++ b/substrate/client/consensus/beefy/src/worker.rs @@ -1039,7 +1039,7 @@ pub(crate) mod tests { ecdsa_crypto, known_payloads, known_payloads::MMR_ROOT_ID, mmr::MmrRootProvider, - test_utils::{generate_equivocation_proof, Keyring}, + test_utils::{generate_double_voting_proof, Keyring}, ConsensusLog, Payload, SignedCommitment, }; use sp_runtime::traits::{Header as HeaderT, One}; @@ -1586,7 +1586,7 @@ pub(crate) mod tests { let payload2 = Payload::from_single_entry(MMR_ROOT_ID, vec![128]); // generate an equivocation proof, with Bob as perpetrator - let good_proof = generate_equivocation_proof( + let good_proof = generate_double_voting_proof( (block_num, payload1.clone(), set_id, &Keyring::Bob), (block_num, payload2.clone(), set_id, &Keyring::Bob), ); @@ -1618,7 +1618,7 @@ pub(crate) mod tests { assert!(api_alice.reported_equivocations.as_ref().unwrap().lock().is_empty()); // now let's try reporting a self-equivocation - let self_proof = generate_equivocation_proof( + let self_proof = generate_double_voting_proof( (block_num, payload1.clone(), set_id, &Keyring::Alice), (block_num, payload2.clone(), set_id, &Keyring::Alice), ); diff --git a/substrate/frame/beefy-mmr/src/lib.rs b/substrate/frame/beefy-mmr/src/lib.rs index e423f1b342f..18ebc9d8f38 100644 --- a/substrate/frame/beefy-mmr/src/lib.rs +++ b/substrate/frame/beefy-mmr/src/lib.rs @@ -33,20 +33,22 @@ //! //! and thanks to versioning can be easily updated in the future. -use sp_runtime::traits::{Convert, Member}; +use sp_runtime::traits::{Convert, Header, Member}; use sp_std::prelude::*; use codec::Decode; -use pallet_mmr::{LeafDataProvider, ParentNumberAndHash}; +use pallet_mmr::{primitives::AncestryProof, LeafDataProvider, ParentNumberAndHash}; use sp_consensus_beefy::{ + known_payloads, mmr::{BeefyAuthoritySet, BeefyDataProvider, BeefyNextAuthoritySet, MmrLeaf, MmrLeafVersion}, - ValidatorSet as BeefyValidatorSet, + AncestryHelper, Commitment, ConsensusLog, ValidatorSet as BeefyValidatorSet, }; use frame_support::{crypto::ecdsa::ECDSAExt, traits::Get}; -use frame_system::pallet_prelude::BlockNumberFor; +use frame_system::pallet_prelude::{BlockNumberFor, HeaderFor}; pub use pallet::*; +use sp_runtime::generic::OpaqueDigestItemId; #[cfg(test)] mod mock; @@ -172,6 +174,75 @@ where } } +impl AncestryHelper> for Pallet +where + T: pallet_mmr::Config, +{ + type Proof = AncestryProof>; + type ValidationContext = MerkleRootOf; + + fn extract_validation_context(header: HeaderFor) -> Option { + // Check if the provided header is canonical. + let expected_hash = frame_system::Pallet::::block_hash(header.number()); + if expected_hash != header.hash() { + return None; + } + + // Extract the MMR root from the header digest + header.digest().convert_first(|l| { + l.try_to(OpaqueDigestItemId::Consensus(&sp_consensus_beefy::BEEFY_ENGINE_ID)) + .and_then(|log: ConsensusLog<::BeefyId>| match log { + ConsensusLog::MmrRoot(mmr_root) => Some(mmr_root), + _ => None, + }) + }) + } + + fn is_non_canonical( + commitment: &Commitment>, + proof: Self::Proof, + context: Self::ValidationContext, + ) -> bool { + let commitment_leaf_count = + match pallet_mmr::Pallet::::block_num_to_leaf_count(commitment.block_number) { + Ok(commitment_leaf_count) => commitment_leaf_count, + Err(_) => { + // We can't prove that the commitment is non-canonical if the + // `commitment.block_number` is invalid. + return false + }, + }; + if commitment_leaf_count != proof.prev_leaf_count { + // Can't prove that the commitment is non-canonical if the `commitment.block_number` + // doesn't match the ancestry proof. + return false; + } + + let canonical_mmr_root = context; + let canonical_prev_root = + match pallet_mmr::Pallet::::verify_ancestry_proof(canonical_mmr_root, proof) { + Ok(canonical_prev_root) => canonical_prev_root, + Err(_) => { + // Can't prove that the commitment is non-canonical if the proof + // is invalid. + return false + }, + }; + + let commitment_root = + match commitment.payload.get_decoded::>(&known_payloads::MMR_ROOT_ID) { + Some(commitment_root) => commitment_root, + None => { + // If the commitment doesn't contain any MMR root, while the proof is valid, + // the commitment is invalid + return true + }, + }; + + canonical_prev_root != commitment_root + } +} + impl Pallet { /// Return the currently active BEEFY authority set proof. pub fn authority_set_proof() -> BeefyAuthoritySet> { diff --git a/substrate/frame/beefy-mmr/src/mock.rs b/substrate/frame/beefy-mmr/src/mock.rs index d59c219d3e7..0521bdabbe4 100644 --- a/substrate/frame/beefy-mmr/src/mock.rs +++ b/substrate/frame/beefy-mmr/src/mock.rs @@ -101,6 +101,7 @@ impl pallet_beefy::Config for Test { type MaxNominators = ConstU32<1000>; type MaxSetIdSessionEntries = ConstU64<100>; type OnNewValidatorSet = BeefyMmr; + type AncestryHelper = BeefyMmr; type WeightInfo = (); type KeyOwnerProof = sp_core::Void; type EquivocationReportSystem = (); diff --git a/substrate/frame/beefy-mmr/src/tests.rs b/substrate/frame/beefy-mmr/src/tests.rs index fac799bf64e..f99835a1dc0 100644 --- a/substrate/frame/beefy-mmr/src/tests.rs +++ b/substrate/frame/beefy-mmr/src/tests.rs @@ -19,11 +19,15 @@ use std::vec; use codec::{Decode, Encode}; use sp_consensus_beefy::{ + known_payloads, mmr::{BeefyNextAuthoritySet, MmrLeafVersion}, - ValidatorSet, + AncestryHelper, Commitment, Payload, ValidatorSet, }; -use sp_core::H256; +use sp_core::{ + offchain::{testing::TestOffchainExt, OffchainDbExt, OffchainWorkerExt}, + H256, +}; use sp_io::TestExternalities; use sp_runtime::{traits::Keccak256, DigestItem}; @@ -31,8 +35,9 @@ use frame_support::traits::OnInitialize; use crate::mock::*; -fn init_block(block: u64) { - System::set_block_number(block); +fn init_block(block: u64, maybe_parent_hash: Option) { + let parent_hash = maybe_parent_hash.unwrap_or(H256::repeat_byte(block as u8)); + System::initialize(&block, &parent_hash, &Default::default()); Session::on_initialize(block); Mmr::on_initialize(block); Beefy::on_initialize(block); @@ -61,38 +66,32 @@ fn read_mmr_leaf(ext: &mut TestExternalities, key: Vec) -> MmrLeaf { fn should_contain_mmr_digest() { let mut ext = new_test_ext(vec![1, 2, 3, 4]); ext.execute_with(|| { - init_block(1); - + init_block(1, None); assert_eq!( System::digest().logs, vec![ beefy_log(ConsensusLog::AuthoritiesChange( ValidatorSet::new(vec![mock_beefy_id(1), mock_beefy_id(2)], 1).unwrap() )), - beefy_log(ConsensusLog::MmrRoot(array_bytes::hex_n_into_unchecked( - "95803defe6ea9f41e7ec6afa497064f21bfded027d8812efacbdf984e630cbdc" - ))) + beefy_log(ConsensusLog::MmrRoot(H256::from_slice(&[ + 117, 0, 56, 25, 185, 195, 71, 232, 67, 213, 27, 178, 64, 168, 137, 220, 64, + 184, 64, 240, 83, 245, 18, 93, 185, 202, 125, 205, 17, 254, 18, 143 + ]))) ] ); // unique every time - init_block(2); - + init_block(2, None); assert_eq!( System::digest().logs, vec![ - beefy_log(ConsensusLog::AuthoritiesChange( - ValidatorSet::new(vec![mock_beefy_id(1), mock_beefy_id(2)], 1).unwrap() - )), - beefy_log(ConsensusLog::MmrRoot(array_bytes::hex_n_into_unchecked( - "95803defe6ea9f41e7ec6afa497064f21bfded027d8812efacbdf984e630cbdc" - ))), beefy_log(ConsensusLog::AuthoritiesChange( ValidatorSet::new(vec![mock_beefy_id(3), mock_beefy_id(4)], 2).unwrap() )), - beefy_log(ConsensusLog::MmrRoot(array_bytes::hex_n_into_unchecked( - "a73271a0974f1e67d6e9b8dd58e506177a2e556519a330796721e98279a753e2" - ))), + beefy_log(ConsensusLog::MmrRoot(H256::from_slice(&[ + 193, 246, 48, 7, 89, 204, 186, 109, 167, 226, 188, 211, 8, 243, 203, 154, 234, + 235, 136, 210, 245, 7, 209, 27, 241, 90, 156, 113, 137, 65, 191, 139 + ]))), ] ); }); @@ -106,7 +105,7 @@ fn should_contain_valid_leaf_data() { let mut ext = new_test_ext(vec![1, 2, 3, 4]); let parent_hash = ext.execute_with(|| { - init_block(1); + init_block(1, None); frame_system::Pallet::::parent_hash() }); @@ -115,7 +114,7 @@ fn should_contain_valid_leaf_data() { mmr_leaf, MmrLeaf { version: MmrLeafVersion::new(1, 5), - parent_number_and_hash: (0_u64, H256::repeat_byte(0x45)), + parent_number_and_hash: (0_u64, H256::repeat_byte(1)), beefy_next_authority_set: BeefyNextAuthoritySet { id: 2, len: 2, @@ -131,7 +130,7 @@ fn should_contain_valid_leaf_data() { // build second block on top let parent_hash = ext.execute_with(|| { - init_block(2); + init_block(2, None); frame_system::Pallet::::parent_hash() }); @@ -140,7 +139,7 @@ fn should_contain_valid_leaf_data() { mmr_leaf, MmrLeaf { version: MmrLeafVersion::new(1, 5), - parent_number_and_hash: (1_u64, H256::repeat_byte(0x45)), + parent_number_and_hash: (1_u64, H256::repeat_byte(2)), beefy_next_authority_set: BeefyNextAuthoritySet { id: 3, len: 2, @@ -175,7 +174,7 @@ fn should_update_authorities() { assert_eq!(auth_set.keyset_commitment, next_auth_set.keyset_commitment); let announced_set = next_auth_set; - init_block(1); + init_block(1, None); let auth_set = BeefyMmr::authority_set_proof(); let next_auth_set = BeefyMmr::next_authority_set_proof(); @@ -191,7 +190,7 @@ fn should_update_authorities() { assert_eq!(want, next_auth_set.keyset_commitment); let announced_set = next_auth_set; - init_block(2); + init_block(2, None); let auth_set = BeefyMmr::authority_set_proof(); let next_auth_set = BeefyMmr::next_authority_set_proof(); @@ -207,3 +206,176 @@ fn should_update_authorities() { assert_eq!(want, next_auth_set.keyset_commitment); }); } + +#[test] +fn extract_validation_context_should_work_correctly() { + let mut ext = new_test_ext(vec![1, 2]); + + // Register offchain ext. + let (offchain, _offchain_state) = TestOffchainExt::with_offchain_db(ext.offchain_db()); + ext.register_extension(OffchainDbExt::new(offchain.clone())); + ext.register_extension(OffchainWorkerExt::new(offchain)); + + ext.execute_with(|| { + init_block(1, None); + let h1 = System::finalize(); + init_block(2, Some(h1.hash())); + let h2 = System::finalize(); + + // Check the MMR root log + let expected_mmr_root: [u8; 32] = array_bytes::hex_n_into_unchecked( + "b2106eff9894288bc212b3a9389caa54efd37962c3a7b71b3b0b06a0911b88a5", + ); + assert_eq!( + System::digest().logs, + vec![beefy_log(ConsensusLog::MmrRoot(H256::from_slice(&expected_mmr_root)))] + ); + + // Make sure that all the info about h2 was stored on-chain + init_block(3, Some(h2.hash())); + + // `extract_validation_context` should return the MMR root when the provided header + // is part of the chain, + assert_eq!( + BeefyMmr::extract_validation_context(h2.clone()), + Some(H256::from_slice(&expected_mmr_root)) + ); + + // `extract_validation_context` should return `None` when the provided header + // is not part of the chain. + let mut fork_h2 = h2; + fork_h2.state_root = H256::repeat_byte(0); + assert_eq!(BeefyMmr::extract_validation_context(fork_h2), None); + }); +} + +#[test] +fn is_non_canonical_should_work_correctly() { + let mut ext = new_test_ext(vec![1, 2]); + + let mut prev_roots = vec![]; + ext.execute_with(|| { + for block_num in 1..=500 { + init_block(block_num, None); + prev_roots.push(Mmr::mmr_root()) + } + }); + ext.persist_offchain_overlay(); + + // Register offchain ext. + let (offchain, _offchain_state) = TestOffchainExt::with_offchain_db(ext.offchain_db()); + ext.register_extension(OffchainDbExt::new(offchain.clone())); + ext.register_extension(OffchainWorkerExt::new(offchain)); + + ext.execute_with(|| { + let valid_proof = Mmr::generate_ancestry_proof(250, None).unwrap(); + let mut invalid_proof = valid_proof.clone(); + invalid_proof.items.push((300, Default::default())); + + // The commitment is invalid if it has no MMR root payload and the proof is valid. + assert_eq!( + BeefyMmr::is_non_canonical( + &Commitment { + payload: Payload::from_single_entry([0, 0], vec![]), + block_number: 250, + validator_set_id: 0 + }, + valid_proof.clone(), + Mmr::mmr_root(), + ), + true + ); + + // If the `commitment.payload` contains an MMR root that doesn't match the ancestry proof, + // it's non-canonical. + assert_eq!( + BeefyMmr::is_non_canonical( + &Commitment { + payload: Payload::from_single_entry( + known_payloads::MMR_ROOT_ID, + H256::repeat_byte(0).encode(), + ), + block_number: 250, + validator_set_id: 0, + }, + valid_proof.clone(), + Mmr::mmr_root(), + ), + true + ); + + // Should return false if the proof is invalid, no matter the payload. + assert_eq!( + BeefyMmr::is_non_canonical( + &Commitment { + payload: Payload::from_single_entry( + known_payloads::MMR_ROOT_ID, + H256::repeat_byte(0).encode(), + ), + block_number: 250, + validator_set_id: 0 + }, + invalid_proof, + Mmr::mmr_root(), + ), + false + ); + + // Can't prove that the commitment is non-canonical if the `commitment.block_number` + // doesn't match the ancestry proof. + assert_eq!( + BeefyMmr::is_non_canonical( + &Commitment { + payload: Payload::from_single_entry( + known_payloads::MMR_ROOT_ID, + prev_roots[250 - 1].encode(), + ), + block_number: 300, + validator_set_id: 0, + }, + valid_proof, + Mmr::mmr_root(), + ), + false + ); + + // For each previous block, the check: + // - should return false, if the commitment is targeting the canonical chain + // - should return true if the commitment is NOT targeting the canonical chain + for prev_block_number in 1usize..=500 { + let proof = Mmr::generate_ancestry_proof(prev_block_number as u64, None).unwrap(); + + assert_eq!( + BeefyMmr::is_non_canonical( + &Commitment { + payload: Payload::from_single_entry( + known_payloads::MMR_ROOT_ID, + prev_roots[prev_block_number - 1].encode(), + ), + block_number: prev_block_number as u64, + validator_set_id: 0, + }, + proof.clone(), + Mmr::mmr_root(), + ), + false + ); + + assert_eq!( + BeefyMmr::is_non_canonical( + &Commitment { + payload: Payload::from_single_entry( + known_payloads::MMR_ROOT_ID, + H256::repeat_byte(0).encode(), + ), + block_number: prev_block_number as u64, + validator_set_id: 0, + }, + proof, + Mmr::mmr_root(), + ), + true + ) + } + }); +} diff --git a/substrate/frame/beefy/src/default_weights.rs b/substrate/frame/beefy/src/default_weights.rs index 8042f0c932e..70dd3bb02bf 100644 --- a/substrate/frame/beefy/src/default_weights.rs +++ b/substrate/frame/beefy/src/default_weights.rs @@ -24,7 +24,11 @@ use frame_support::weights::{ }; impl crate::WeightInfo for () { - fn report_equivocation(validator_count: u32, max_nominators_per_validator: u32) -> Weight { + fn report_voting_equivocation( + votes_count: u32, + validator_count: u32, + max_nominators_per_validator: u32, + ) -> Weight { // we take the validator set count from the membership proof to // calculate the weight but we set a floor of 100 validators. let validator_count = validator_count.max(100) as u64; @@ -37,7 +41,10 @@ impl crate::WeightInfo for () { ) .saturating_add(DbWeight::get().reads(5)) // check equivocation proof - .saturating_add(Weight::from_parts(95u64 * WEIGHT_REF_TIME_PER_MICROS, 0)) + .saturating_add(Weight::from_parts( + (50u64 * WEIGHT_REF_TIME_PER_MICROS).saturating_mul(votes_count as u64), + 0, + )) // report offence .saturating_add(Weight::from_parts(110u64 * WEIGHT_REF_TIME_PER_MICROS, 0)) .saturating_add(Weight::from_parts( @@ -50,6 +57,11 @@ impl crate::WeightInfo for () { .saturating_add(DbWeight::get().reads(2)) } + // TODO: Calculate + fn report_fork_voting(_validator_count: u32, _max_nominators_per_validator: u32) -> Weight { + Weight::MAX + } + fn set_new_genesis() -> Weight { DbWeight::get().writes(1) } diff --git a/substrate/frame/beefy/src/equivocation.rs b/substrate/frame/beefy/src/equivocation.rs index aecc9e721d5..a1526e78111 100644 --- a/substrate/frame/beefy/src/equivocation.rs +++ b/substrate/frame/beefy/src/equivocation.rs @@ -36,9 +36,12 @@ use codec::{self as codec, Decode, Encode}; use frame_support::traits::{Get, KeyOwnerProofSystem}; -use frame_system::pallet_prelude::BlockNumberFor; +use frame_system::pallet_prelude::{BlockNumberFor, HeaderFor}; use log::{error, info}; -use sp_consensus_beefy::{DoubleVotingProof, ValidatorSetId, KEY_TYPE as BEEFY_KEY_TYPE}; +use sp_consensus_beefy::{ + check_commitment_signature, AncestryHelper, DoubleVotingProof, ForkVotingProof, + FutureBlockVotingProof, ValidatorSetId, KEY_TYPE as BEEFY_KEY_TYPE, +}; use sp_runtime::{ transaction_validity::{ InvalidTransaction, TransactionPriority, TransactionSource, TransactionValidity, @@ -118,18 +121,143 @@ where /// `offchain::SendTransactionTypes`. /// - On-chain validity checks and processing are mostly delegated to the user provided generic /// types implementing `KeyOwnerProofSystem` and `ReportOffence` traits. -/// - Offence reporter for unsigned transactions is fetched via the the authorship pallet. +/// - Offence reporter for unsigned transactions is fetched via the authorship pallet. pub struct EquivocationReportSystem(sp_std::marker::PhantomData<(T, R, P, L)>); /// Equivocation evidence convenience alias. -pub type EquivocationEvidenceFor = ( - DoubleVotingProof< - BlockNumberFor, - ::BeefyId, - <::BeefyId as RuntimeAppPublic>::Signature, - >, - ::KeyOwnerProof, -); +pub enum EquivocationEvidenceFor { + DoubleVotingProof( + DoubleVotingProof< + BlockNumberFor, + T::BeefyId, + ::Signature, + >, + T::KeyOwnerProof, + ), + ForkVotingProof( + ForkVotingProof< + HeaderFor, + T::BeefyId, + >>::Proof, + >, + T::KeyOwnerProof, + ), + FutureBlockVotingProof(FutureBlockVotingProof, T::BeefyId>, T::KeyOwnerProof), +} + +impl EquivocationEvidenceFor { + /// Returns the authority id of the equivocator. + fn offender_id(&self) -> &T::BeefyId { + match self { + EquivocationEvidenceFor::DoubleVotingProof(equivocation_proof, _) => + equivocation_proof.offender_id(), + EquivocationEvidenceFor::ForkVotingProof(equivocation_proof, _) => + &equivocation_proof.vote.id, + EquivocationEvidenceFor::FutureBlockVotingProof(equivocation_proof, _) => + &equivocation_proof.vote.id, + } + } + + /// Returns the round number at which the equivocation occurred. + fn round_number(&self) -> &BlockNumberFor { + match self { + EquivocationEvidenceFor::DoubleVotingProof(equivocation_proof, _) => + equivocation_proof.round_number(), + EquivocationEvidenceFor::ForkVotingProof(equivocation_proof, _) => + &equivocation_proof.vote.commitment.block_number, + EquivocationEvidenceFor::FutureBlockVotingProof(equivocation_proof, _) => + &equivocation_proof.vote.commitment.block_number, + } + } + + /// Returns the set id at which the equivocation occurred. + fn set_id(&self) -> ValidatorSetId { + match self { + EquivocationEvidenceFor::DoubleVotingProof(equivocation_proof, _) => + equivocation_proof.set_id(), + EquivocationEvidenceFor::ForkVotingProof(equivocation_proof, _) => + equivocation_proof.vote.commitment.validator_set_id, + EquivocationEvidenceFor::FutureBlockVotingProof(equivocation_proof, _) => + equivocation_proof.vote.commitment.validator_set_id, + } + } + + /// Returns the set id at which the equivocation occurred. + fn key_owner_proof(&self) -> &T::KeyOwnerProof { + match self { + EquivocationEvidenceFor::DoubleVotingProof(_, key_owner_proof) => key_owner_proof, + EquivocationEvidenceFor::ForkVotingProof(_, key_owner_proof) => key_owner_proof, + EquivocationEvidenceFor::FutureBlockVotingProof(_, key_owner_proof) => key_owner_proof, + } + } + + fn checked_offender

    (&self) -> Option + where + P: KeyOwnerProofSystem<(KeyTypeId, T::BeefyId), Proof = T::KeyOwnerProof>, + { + let key = (BEEFY_KEY_TYPE, self.offender_id().clone()); + P::check_proof(key, self.key_owner_proof().clone()) + } + + fn check_equivocation_proof(self) -> Result<(), Error> { + match self { + EquivocationEvidenceFor::DoubleVotingProof(equivocation_proof, _) => { + // Validate equivocation proof (check votes are different and signatures are valid). + if !sp_consensus_beefy::check_double_voting_proof(&equivocation_proof) { + return Err(Error::::InvalidDoubleVotingProof); + } + + return Ok(()) + }, + EquivocationEvidenceFor::ForkVotingProof(equivocation_proof, _) => { + let ForkVotingProof { vote, ancestry_proof, header } = equivocation_proof; + + let maybe_validation_context = , + >>::extract_validation_context(header); + let validation_context = match maybe_validation_context { + Some(validation_context) => validation_context, + None => { + return Err(Error::::InvalidForkVotingProof); + }, + }; + + let is_non_canonical = + >>::is_non_canonical( + &vote.commitment, + ancestry_proof, + validation_context, + ); + if !is_non_canonical { + return Err(Error::::InvalidForkVotingProof); + } + + let is_signature_valid = + check_commitment_signature(&vote.commitment, &vote.id, &vote.signature); + if !is_signature_valid { + return Err(Error::::InvalidForkVotingProof); + } + + Ok(()) + }, + EquivocationEvidenceFor::FutureBlockVotingProof(equivocation_proof, _) => { + let FutureBlockVotingProof { vote } = equivocation_proof; + // Check if the commitment actually targets a future block + if vote.commitment.block_number < frame_system::Pallet::::block_number() { + return Err(Error::::InvalidFutureBlockVotingProof); + } + + let is_signature_valid = + check_commitment_signature(&vote.commitment, &vote.id, &vote.signature); + if !is_signature_valid { + return Err(Error::::InvalidForkVotingProof); + } + + Ok(()) + }, + } + } +} impl OffenceReportSystem, EquivocationEvidenceFor> for EquivocationReportSystem @@ -148,13 +276,8 @@ where fn publish_evidence(evidence: EquivocationEvidenceFor) -> Result<(), ()> { use frame_system::offchain::SubmitTransaction; - let (equivocation_proof, key_owner_proof) = evidence; - - let call = Call::report_equivocation_unsigned { - equivocation_proof: Box::new(equivocation_proof), - key_owner_proof, - }; + let call: Call = evidence.into(); let res = SubmitTransaction::>::submit_unsigned_transaction(call.into()); match res { Ok(_) => info!(target: LOG_TARGET, "Submitted equivocation report."), @@ -166,18 +289,10 @@ where fn check_evidence( evidence: EquivocationEvidenceFor, ) -> Result<(), TransactionValidityError> { - let (equivocation_proof, key_owner_proof) = evidence; - - // Check the membership proof to extract the offender's id - let key = (BEEFY_KEY_TYPE, equivocation_proof.offender_id().clone()); - let offender = P::check_proof(key, key_owner_proof).ok_or(InvalidTransaction::BadProof)?; + let offender = evidence.checked_offender::

    ().ok_or(InvalidTransaction::BadProof)?; // Check if the offence has already been reported, and if so then we can discard the report. - let time_slot = TimeSlot { - set_id: equivocation_proof.set_id(), - round: *equivocation_proof.round_number(), - }; - + let time_slot = TimeSlot { set_id: evidence.set_id(), round: *evidence.round_number() }; if R::is_known_offence(&[offender], &time_slot) { Err(InvalidTransaction::Stale.into()) } else { @@ -189,47 +304,37 @@ where reporter: Option, evidence: EquivocationEvidenceFor, ) -> Result<(), DispatchError> { - let (equivocation_proof, key_owner_proof) = evidence; let reporter = reporter.or_else(|| pallet_authorship::Pallet::::author()); - let offender = equivocation_proof.offender_id().clone(); - - // We check the equivocation within the context of its set id (and - // associated session) and round. We also need to know the validator - // set count at the time of the offence since it is required to calculate - // the slash amount. - let set_id = equivocation_proof.set_id(); - let round = *equivocation_proof.round_number(); - let session_index = key_owner_proof.session(); - let validator_set_count = key_owner_proof.validator_count(); - // Validate the key ownership proof extracting the id of the offender. - let offender = P::check_proof((BEEFY_KEY_TYPE, offender), key_owner_proof) - .ok_or(Error::::InvalidKeyOwnershipProof)?; + // We check the equivocation within the context of its set id (and associated session). + let set_id = evidence.set_id(); + let round = *evidence.round_number(); + let set_id_session_index = crate::SetIdSession::::get(set_id) + .ok_or(Error::::InvalidEquivocationProofSession)?; - // Validate equivocation proof (check votes are different and signatures are valid). - if !sp_consensus_beefy::check_equivocation_proof(&equivocation_proof) { - return Err(Error::::InvalidEquivocationProof.into()) - } - - // Check that the session id for the membership proof is within the - // bounds of the set id reported in the equivocation. - let set_id_session_index = - crate::SetIdSession::::get(set_id).ok_or(Error::::InvalidEquivocationProof)?; + // Check that the session id for the membership proof is within the bounds + // of the set id reported in the equivocation. + let key_owner_proof = evidence.key_owner_proof(); + let validator_count = key_owner_proof.validator_count(); + let session_index = key_owner_proof.session(); if session_index != set_id_session_index { - return Err(Error::::InvalidEquivocationProof.into()) + return Err(Error::::InvalidEquivocationProofSession.into()) } + // Validate the key ownership proof extracting the id of the offender. + let offender = + evidence.checked_offender::

    ().ok_or(Error::::InvalidKeyOwnershipProof)?; + + evidence.check_equivocation_proof()?; + let offence = EquivocationOffence { time_slot: TimeSlot { set_id, round }, session_index, - validator_set_count, + validator_set_count: validator_count, offender, }; - R::report_offence(reporter.into_iter().collect(), offence) - .map_err(|_| Error::::DuplicateOffenceReport)?; - - Ok(()) + .map_err(|_| Error::::DuplicateOffenceReport.into()) } } @@ -239,49 +344,37 @@ where /// unsigned equivocation reports. impl Pallet { pub fn validate_unsigned(source: TransactionSource, call: &Call) -> TransactionValidity { - if let Call::report_equivocation_unsigned { equivocation_proof, key_owner_proof } = call { - // discard equivocation report not coming from the local node - match source { - TransactionSource::Local | TransactionSource::InBlock => { /* allowed */ }, - _ => { - log::warn!( - target: LOG_TARGET, - "rejecting unsigned report equivocation transaction because it is not local/in-block." - ); - return InvalidTransaction::Call.into() - }, - } - - let evidence = (*equivocation_proof.clone(), key_owner_proof.clone()); - T::EquivocationReportSystem::check_evidence(evidence)?; - - let longevity = - >::Longevity::get(); - - ValidTransaction::with_tag_prefix("BeefyEquivocation") - // We assign the maximum priority for any equivocation report. - .priority(TransactionPriority::MAX) - // Only one equivocation report for the same offender at the same slot. - .and_provides(( - equivocation_proof.offender_id().clone(), - equivocation_proof.set_id(), - *equivocation_proof.round_number(), - )) - .longevity(longevity) - // We don't propagate this. This can never be included on a remote node. - .propagate(false) - .build() - } else { - InvalidTransaction::Call.into() + // discard equivocation report not coming from the local node + match source { + TransactionSource::Local | TransactionSource::InBlock => { /* allowed */ }, + _ => { + log::warn!( + target: LOG_TARGET, + "rejecting unsigned report equivocation transaction because it is not local/in-block." + ); + return InvalidTransaction::Call.into() + }, } + + let evidence = call.to_equivocation_evidence_for().ok_or(InvalidTransaction::Call)?; + let tag = (evidence.offender_id().clone(), evidence.set_id(), *evidence.round_number()); + T::EquivocationReportSystem::check_evidence(evidence)?; + + let longevity = + >::Longevity::get(); + ValidTransaction::with_tag_prefix("BeefyEquivocation") + // We assign the maximum priority for any equivocation report. + .priority(TransactionPriority::MAX) + // Only one equivocation report for the same offender at the same slot. + .and_provides(tag) + .longevity(longevity) + // We don't propagate this. This can never be included on a remote node. + .propagate(false) + .build() } pub fn pre_dispatch(call: &Call) -> Result<(), TransactionValidityError> { - if let Call::report_equivocation_unsigned { equivocation_proof, key_owner_proof } = call { - let evidence = (*equivocation_proof.clone(), key_owner_proof.clone()); - T::EquivocationReportSystem::check_evidence(evidence) - } else { - Err(InvalidTransaction::Call.into()) - } + let evidence = call.to_equivocation_evidence_for().ok_or(InvalidTransaction::Call)?; + T::EquivocationReportSystem::check_evidence(evidence) } } diff --git a/substrate/frame/beefy/src/lib.rs b/substrate/frame/beefy/src/lib.rs index 63f3e9bb309..a49f5d28f45 100644 --- a/substrate/frame/beefy/src/lib.rs +++ b/substrate/frame/beefy/src/lib.rs @@ -28,7 +28,7 @@ use frame_support::{ }; use frame_system::{ ensure_none, ensure_signed, - pallet_prelude::{BlockNumberFor, OriginFor}, + pallet_prelude::{BlockNumberFor, HeaderFor, OriginFor}, }; use log; use sp_runtime::{ @@ -41,8 +41,9 @@ use sp_staking::{offence::OffenceReportSystem, SessionIndex}; use sp_std::prelude::*; use sp_consensus_beefy::{ - AuthorityIndex, BeefyAuthorityId, ConsensusLog, DoubleVotingProof, OnNewValidatorSet, - ValidatorSet, BEEFY_ENGINE_ID, GENESIS_AUTHORITY_SET_ID, + AncestryHelper, AuthorityIndex, BeefyAuthorityId, ConsensusLog, DoubleVotingProof, + ForkVotingProof, FutureBlockVotingProof, OnNewValidatorSet, ValidatorSet, BEEFY_ENGINE_ID, + GENESIS_AUTHORITY_SET_ID, }; mod default_weights; @@ -98,6 +99,9 @@ pub mod pallet { /// weight MMR root over validators and make it available for Light Clients. type OnNewValidatorSet: OnNewValidatorSet<::BeefyId>; + /// Hook for checking commitment canonicity. + type AncestryHelper: AncestryHelper>; + /// Weights for this pallet. type WeightInfo: WeightInfo; @@ -188,8 +192,14 @@ pub mod pallet { pub enum Error { /// A key ownership proof provided as part of an equivocation report is invalid. InvalidKeyOwnershipProof, - /// An equivocation proof provided as part of an equivocation report is invalid. - InvalidEquivocationProof, + /// A double voting proof provided as part of an equivocation report is invalid. + InvalidDoubleVotingProof, + /// A fork voting proof provided as part of an equivocation report is invalid. + InvalidForkVotingProof, + /// A future block voting proof provided as part of an equivocation report is invalid. + InvalidFutureBlockVotingProof, + /// The session of the equivocation proof is invalid + InvalidEquivocationProofSession, /// A given equivocation report is valid but already previously reported. DuplicateOffenceReport, /// Submitted configuration is invalid. @@ -203,11 +213,11 @@ pub mod pallet { /// against the extracted offender. If both are valid, the offence /// will be reported. #[pallet::call_index(0)] - #[pallet::weight(T::WeightInfo::report_equivocation( + #[pallet::weight(T::WeightInfo::report_double_voting( key_owner_proof.validator_count(), T::MaxNominators::get(), ))] - pub fn report_equivocation( + pub fn report_double_voting( origin: OriginFor, equivocation_proof: Box< DoubleVotingProof< @@ -222,7 +232,7 @@ pub mod pallet { T::EquivocationReportSystem::process_evidence( Some(reporter), - (*equivocation_proof, key_owner_proof), + EquivocationEvidenceFor::DoubleVotingProof(*equivocation_proof, key_owner_proof), )?; // Waive the fee since the report is valid and beneficial Ok(Pays::No.into()) @@ -238,11 +248,11 @@ pub mod pallet { /// if the block author is defined it will be defined as the equivocation /// reporter. #[pallet::call_index(1)] - #[pallet::weight(T::WeightInfo::report_equivocation( + #[pallet::weight(T::WeightInfo::report_double_voting( key_owner_proof.validator_count(), T::MaxNominators::get(), ))] - pub fn report_equivocation_unsigned( + pub fn report_double_voting_unsigned( origin: OriginFor, equivocation_proof: Box< DoubleVotingProof< @@ -257,7 +267,7 @@ pub mod pallet { T::EquivocationReportSystem::process_evidence( None, - (*equivocation_proof, key_owner_proof), + EquivocationEvidenceFor::DoubleVotingProof(*equivocation_proof, key_owner_proof), )?; Ok(Pays::No.into()) } @@ -278,6 +288,126 @@ pub mod pallet { GenesisBlock::::put(Some(genesis_block)); Ok(()) } + + /// Report fork voting equivocation. This method will verify the equivocation proof + /// and validate the given key ownership proof against the extracted offender. + /// If both are valid, the offence will be reported. + #[pallet::call_index(3)] + #[pallet::weight(T::WeightInfo::report_fork_voting( + key_owner_proof.validator_count(), + T::MaxNominators::get(), + ))] + pub fn report_fork_voting( + origin: OriginFor, + equivocation_proof: Box< + ForkVotingProof< + HeaderFor, + T::BeefyId, + >>::Proof, + >, + >, + key_owner_proof: T::KeyOwnerProof, + ) -> DispatchResultWithPostInfo { + let reporter = ensure_signed(origin)?; + + T::EquivocationReportSystem::process_evidence( + Some(reporter), + EquivocationEvidenceFor::ForkVotingProof(*equivocation_proof, key_owner_proof), + )?; + // Waive the fee since the report is valid and beneficial + Ok(Pays::No.into()) + } + + /// Report fork voting equivocation. This method will verify the equivocation proof + /// and validate the given key ownership proof against the extracted offender. + /// If both are valid, the offence will be reported. + /// + /// This extrinsic must be called unsigned and it is expected that only + /// block authors will call it (validated in `ValidateUnsigned`), as such + /// if the block author is defined it will be defined as the equivocation + /// reporter. + #[pallet::call_index(4)] + #[pallet::weight(T::WeightInfo::report_fork_voting( + key_owner_proof.validator_count(), + T::MaxNominators::get(), + ))] + pub fn report_fork_voting_unsigned( + origin: OriginFor, + equivocation_proof: Box< + ForkVotingProof< + HeaderFor, + T::BeefyId, + >>::Proof, + >, + >, + key_owner_proof: T::KeyOwnerProof, + ) -> DispatchResultWithPostInfo { + ensure_none(origin)?; + + T::EquivocationReportSystem::process_evidence( + None, + EquivocationEvidenceFor::ForkVotingProof(*equivocation_proof, key_owner_proof), + )?; + // Waive the fee since the report is valid and beneficial + Ok(Pays::No.into()) + } + + /// Report future block voting equivocation. This method will verify the equivocation proof + /// and validate the given key ownership proof against the extracted offender. + /// If both are valid, the offence will be reported. + #[pallet::call_index(5)] + #[pallet::weight(T::WeightInfo::report_fork_voting( + key_owner_proof.validator_count(), + T::MaxNominators::get(), + ))] + pub fn report_future_block_voting( + origin: OriginFor, + equivocation_proof: Box, T::BeefyId>>, + key_owner_proof: T::KeyOwnerProof, + ) -> DispatchResultWithPostInfo { + let reporter = ensure_signed(origin)?; + + T::EquivocationReportSystem::process_evidence( + Some(reporter), + EquivocationEvidenceFor::FutureBlockVotingProof( + *equivocation_proof, + key_owner_proof, + ), + )?; + // Waive the fee since the report is valid and beneficial + Ok(Pays::No.into()) + } + + /// Report future block voting equivocation. This method will verify the equivocation proof + /// and validate the given key ownership proof against the extracted offender. + /// If both are valid, the offence will be reported. + /// + /// This extrinsic must be called unsigned and it is expected that only + /// block authors will call it (validated in `ValidateUnsigned`), as such + /// if the block author is defined it will be defined as the equivocation + /// reporter. + #[pallet::call_index(6)] + #[pallet::weight(T::WeightInfo::report_fork_voting( + key_owner_proof.validator_count(), + T::MaxNominators::get(), + ))] + pub fn report_future_block_voting_unsigned( + origin: OriginFor, + equivocation_proof: Box, T::BeefyId>>, + key_owner_proof: T::KeyOwnerProof, + ) -> DispatchResultWithPostInfo { + ensure_none(origin)?; + + T::EquivocationReportSystem::process_evidence( + None, + EquivocationEvidenceFor::FutureBlockVotingProof( + *equivocation_proof, + key_owner_proof, + ), + )?; + // Waive the fee since the report is valid and beneficial + Ok(Pays::No.into()) + } } #[pallet::hooks] @@ -300,6 +430,48 @@ pub mod pallet { Self::validate_unsigned(source, call) } } + + impl Call { + pub fn to_equivocation_evidence_for(&self) -> Option> { + match self { + Call::report_double_voting_unsigned { equivocation_proof, key_owner_proof } => + Some(EquivocationEvidenceFor::::DoubleVotingProof( + *equivocation_proof.clone(), + key_owner_proof.clone(), + )), + Call::report_fork_voting_unsigned { equivocation_proof, key_owner_proof } => + Some(EquivocationEvidenceFor::::ForkVotingProof( + *equivocation_proof.clone(), + key_owner_proof.clone(), + )), + _ => None, + } + } + } + + impl From> for Call { + fn from(evidence: EquivocationEvidenceFor) -> Self { + match evidence { + EquivocationEvidenceFor::DoubleVotingProof(equivocation_proof, key_owner_proof) => + Call::report_double_voting_unsigned { + equivocation_proof: Box::new(equivocation_proof), + key_owner_proof, + }, + EquivocationEvidenceFor::ForkVotingProof(equivocation_proof, key_owner_proof) => + Call::report_fork_voting_unsigned { + equivocation_proof: Box::new(equivocation_proof), + key_owner_proof, + }, + EquivocationEvidenceFor::FutureBlockVotingProof( + equivocation_proof, + key_owner_proof, + ) => Call::report_future_block_voting_unsigned { + equivocation_proof: Box::new(equivocation_proof), + key_owner_proof, + }, + } + } + } } #[cfg(any(feature = "try-runtime", test))] @@ -367,7 +539,7 @@ impl Pallet { /// Submits an extrinsic to report an equivocation. This method will create /// an unsigned extrinsic with a call to `report_equivocation_unsigned` and /// will push the transaction to the pool. Only useful in an offchain context. - pub fn submit_unsigned_equivocation_report( + pub fn submit_unsigned_double_voting_report( equivocation_proof: DoubleVotingProof< BlockNumberFor, T::BeefyId, @@ -375,7 +547,11 @@ impl Pallet { >, key_owner_proof: T::KeyOwnerProof, ) -> Option<()> { - T::EquivocationReportSystem::publish_evidence((equivocation_proof, key_owner_proof)).ok() + T::EquivocationReportSystem::publish_evidence(EquivocationEvidenceFor::DoubleVotingProof( + equivocation_proof, + key_owner_proof, + )) + .ok() } fn change_authorities( @@ -526,6 +702,20 @@ impl IsMember for Pallet { } pub trait WeightInfo { - fn report_equivocation(validator_count: u32, max_nominators_per_validator: u32) -> Weight; + fn report_voting_equivocation( + votes_count: u32, + validator_count: u32, + max_nominators_per_validator: u32, + ) -> Weight; + fn report_double_voting(validator_count: u32, max_nominators_per_validator: u32) -> Weight { + Self::report_voting_equivocation(2, validator_count, max_nominators_per_validator) + } + fn report_fork_voting(validator_count: u32, max_nominators_per_validator: u32) -> Weight; + fn report_future_block_voting( + validator_count: u32, + max_nominators_per_validator: u32, + ) -> Weight { + Self::report_voting_equivocation(1, validator_count, max_nominators_per_validator) + } fn set_new_genesis() -> Weight; } diff --git a/substrate/frame/beefy/src/mock.rs b/substrate/frame/beefy/src/mock.rs index 35bf172d606..03efccff764 100644 --- a/substrate/frame/beefy/src/mock.rs +++ b/substrate/frame/beefy/src/mock.rs @@ -15,6 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use codec::{Decode, Encode}; +use scale_info::TypeInfo; use std::vec; use frame_election_provider_support::{ @@ -28,8 +30,12 @@ use frame_support::{ use pallet_session::historical as pallet_session_historical; use sp_core::{crypto::KeyTypeId, ConstU128}; use sp_runtime::{ - app_crypto::ecdsa::Public, curve::PiecewiseLinear, impl_opaque_keys, testing::TestXt, - traits::OpaqueKeys, BuildStorage, Perbill, + app_crypto::ecdsa::Public, + curve::PiecewiseLinear, + impl_opaque_keys, + testing::TestXt, + traits::{Header as HeaderT, OpaqueKeys}, + BuildStorage, Perbill, }; use sp_staking::{EraIndex, SessionIndex}; use sp_state_machine::BasicExternalities; @@ -37,6 +43,7 @@ use sp_state_machine::BasicExternalities; use crate as pallet_beefy; pub use sp_consensus_beefy::{ecdsa_crypto::AuthorityId as BeefyId, ConsensusLog, BEEFY_ENGINE_ID}; +use sp_consensus_beefy::{AncestryHelper, Commitment}; impl_opaque_keys! { pub struct MockSessionKeys { @@ -75,11 +82,46 @@ where type Extrinsic = TestXt; } +#[derive(Clone, Debug, Decode, Encode, PartialEq, TypeInfo)] +pub struct MockAncestryProofContext { + pub is_valid: bool, +} + +#[derive(Clone, Debug, Decode, Encode, PartialEq, TypeInfo)] +pub struct MockAncestryProof { + pub is_non_canonical: bool, +} + parameter_types! { pub const Period: u64 = 1; pub const ReportLongevity: u64 = BondingDuration::get() as u64 * SessionsPerEra::get() as u64 * Period::get(); pub const MaxSetIdSessionEntries: u32 = BondingDuration::get() * SessionsPerEra::get(); + + pub storage AncestryProofContext: Option = Some( + MockAncestryProofContext { + is_valid: true, + } + ); +} + +pub struct MockAncestryHelper; + +impl AncestryHelper

    for MockAncestryHelper { + type Proof = MockAncestryProof; + type ValidationContext = MockAncestryProofContext; + + fn extract_validation_context(_header: Header) -> Option { + AncestryProofContext::get() + } + + fn is_non_canonical( + _commitment: &Commitment, + proof: Self::Proof, + context: Self::ValidationContext, + ) -> bool { + context.is_valid && proof.is_non_canonical + } } impl pallet_beefy::Config for Test { @@ -88,6 +130,7 @@ impl pallet_beefy::Config for Test { type MaxNominators = ConstU32<1000>; type MaxSetIdSessionEntries = MaxSetIdSessionEntries; type OnNewValidatorSet = (); + type AncestryHelper = MockAncestryHelper; type WeightInfo = (); type KeyOwnerProof = >::Proof; type EquivocationReportSystem = diff --git a/substrate/frame/beefy/src/tests.rs b/substrate/frame/beefy/src/tests.rs index 6a6aa245ce1..a63b3532b69 100644 --- a/substrate/frame/beefy/src/tests.rs +++ b/substrate/frame/beefy/src/tests.rs @@ -20,18 +20,22 @@ use std::vec; use frame_support::{ assert_err, assert_ok, - dispatch::{GetDispatchInfo, Pays}, + dispatch::{DispatchResultWithPostInfo, Pays}, traits::{Currency, KeyOwnerProofSystem, OnInitialize}, }; use sp_consensus_beefy::{ - check_equivocation_proof, + check_double_voting_proof, ecdsa_crypto, known_payloads::MMR_ROOT_ID, - test_utils::{generate_equivocation_proof, Keyring as BeefyKeyring}, - Payload, ValidatorSet, KEY_TYPE as BEEFY_KEY_TYPE, + test_utils::{ + generate_double_voting_proof, generate_fork_voting_proof, + generate_future_block_voting_proof, Keyring as BeefyKeyring, + }, + Payload, ValidatorSet, ValidatorSetId, KEY_TYPE as BEEFY_KEY_TYPE, }; use sp_runtime::DigestItem; +use sp_session::MembershipProof; -use crate::{self as beefy, mock::*, Call, Config, Error, Weight, WeightInfo}; +use crate::{self as beefy, mock::*, Call, Config, Error, WeightInfo}; fn init_block(block: u64) { System::set_block_number(block); @@ -222,51 +226,90 @@ fn should_sign_and_verify() { // generate an equivocation proof, with two votes in the same round for // same payload signed by the same key - let equivocation_proof = generate_equivocation_proof( + let equivocation_proof = generate_double_voting_proof( (1, payload1.clone(), set_id, &BeefyKeyring::Bob), (1, payload1.clone(), set_id, &BeefyKeyring::Bob), ); // expect invalid equivocation proof - assert!(!check_equivocation_proof::<_, _, Keccak256>(&equivocation_proof)); + assert!(!check_double_voting_proof::<_, _, Keccak256>(&equivocation_proof)); // generate an equivocation proof, with two votes in different rounds for // different payloads signed by the same key - let equivocation_proof = generate_equivocation_proof( + let equivocation_proof = generate_double_voting_proof( (1, payload1.clone(), set_id, &BeefyKeyring::Bob), (2, payload2.clone(), set_id, &BeefyKeyring::Bob), ); // expect invalid equivocation proof - assert!(!check_equivocation_proof::<_, _, Keccak256>(&equivocation_proof)); + assert!(!check_double_voting_proof::<_, _, Keccak256>(&equivocation_proof)); // generate an equivocation proof, with two votes by different authorities - let equivocation_proof = generate_equivocation_proof( + let equivocation_proof = generate_double_voting_proof( (1, payload1.clone(), set_id, &BeefyKeyring::Alice), (1, payload2.clone(), set_id, &BeefyKeyring::Bob), ); // expect invalid equivocation proof - assert!(!check_equivocation_proof::<_, _, Keccak256>(&equivocation_proof)); + assert!(!check_double_voting_proof::<_, _, Keccak256>(&equivocation_proof)); // generate an equivocation proof, with two votes in different set ids - let equivocation_proof = generate_equivocation_proof( + let equivocation_proof = generate_double_voting_proof( (1, payload1.clone(), set_id, &BeefyKeyring::Bob), (1, payload2.clone(), set_id + 1, &BeefyKeyring::Bob), ); // expect invalid equivocation proof - assert!(!check_equivocation_proof::<_, _, Keccak256>(&equivocation_proof)); + assert!(!check_double_voting_proof::<_, _, Keccak256>(&equivocation_proof)); // generate an equivocation proof, with two votes in the same round for // different payloads signed by the same key let payload2 = Payload::from_single_entry(MMR_ROOT_ID, vec![128]); - let equivocation_proof = generate_equivocation_proof( + let equivocation_proof = generate_double_voting_proof( (1, payload1, set_id, &BeefyKeyring::Bob), (1, payload2, set_id, &BeefyKeyring::Bob), ); // expect valid equivocation proof - assert!(check_equivocation_proof::<_, _, Keccak256>(&equivocation_proof)); + assert!(check_double_voting_proof::<_, _, Keccak256>(&equivocation_proof)); } -#[test] -fn report_equivocation_current_set_works() { +trait ReportEquivocationFn: + FnMut( + u64, + ValidatorSetId, + &BeefyKeyring, + MembershipProof, +) -> DispatchResultWithPostInfo +{ +} + +impl ReportEquivocationFn for F where + F: FnMut( + u64, + ValidatorSetId, + &BeefyKeyring, + MembershipProof, + ) -> DispatchResultWithPostInfo +{ +} + +fn report_double_voting( + block_num: u64, + set_id: ValidatorSetId, + equivocation_keyring: &BeefyKeyring, + key_owner_proof: MembershipProof, +) -> DispatchResultWithPostInfo { + let payload1 = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); + let payload2 = Payload::from_single_entry(MMR_ROOT_ID, vec![128]); + let equivocation_proof = generate_double_voting_proof( + (block_num, payload1, set_id, &equivocation_keyring), + (block_num, payload2, set_id, &equivocation_keyring), + ); + + Beefy::report_double_voting_unsigned( + RuntimeOrigin::none(), + Box::new(equivocation_proof), + key_owner_proof, + ) +} + +fn report_equivocation_current_set_works(mut f: impl ReportEquivocationFn) { let authorities = test_authorities(); ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { @@ -297,24 +340,11 @@ fn report_equivocation_current_set_works() { let equivocation_key = &authorities[equivocation_authority_index]; let equivocation_keyring = BeefyKeyring::from_public(equivocation_key).unwrap(); - let payload1 = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); - let payload2 = Payload::from_single_entry(MMR_ROOT_ID, vec![128]); - // generate an equivocation proof, with two votes in the same round for - // different payloads signed by the same key - let equivocation_proof = generate_equivocation_proof( - (block_num, payload1, set_id, &equivocation_keyring), - (block_num, payload2, set_id, &equivocation_keyring), - ); - // create the key ownership proof let key_owner_proof = Historical::prove((BEEFY_KEY_TYPE, &equivocation_key)).unwrap(); // report the equivocation and the tx should be dispatched successfully - assert_ok!(Beefy::report_equivocation_unsigned( - RuntimeOrigin::none(), - Box::new(equivocation_proof), - key_owner_proof, - ),); + assert_ok!(f(block_num, set_id, &equivocation_keyring, key_owner_proof)); start_era(2); @@ -345,8 +375,7 @@ fn report_equivocation_current_set_works() { }); } -#[test] -fn report_equivocation_old_set_works() { +fn report_equivocation_old_set_works(mut f: impl ReportEquivocationFn) { let authorities = test_authorities(); ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { @@ -384,20 +413,8 @@ fn report_equivocation_old_set_works() { let equivocation_keyring = BeefyKeyring::from_public(equivocation_key).unwrap(); - let payload1 = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); - let payload2 = Payload::from_single_entry(MMR_ROOT_ID, vec![128]); - // generate an equivocation proof for the old set, - let equivocation_proof = generate_equivocation_proof( - (block_num, payload1, old_set_id, &equivocation_keyring), - (block_num, payload2, old_set_id, &equivocation_keyring), - ); - // report the equivocation and the tx should be dispatched successfully - assert_ok!(Beefy::report_equivocation_unsigned( - RuntimeOrigin::none(), - Box::new(equivocation_proof), - key_owner_proof, - ),); + assert_ok!(f(block_num, old_set_id, &equivocation_keyring, key_owner_proof)); start_era(3); @@ -428,8 +445,7 @@ fn report_equivocation_old_set_works() { }); } -#[test] -fn report_equivocation_invalid_set_id() { +fn report_equivocation_invalid_set_id(mut f: impl ReportEquivocationFn) { let authorities = test_authorities(); ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { @@ -446,28 +462,15 @@ fn report_equivocation_invalid_set_id() { let key_owner_proof = Historical::prove((BEEFY_KEY_TYPE, &equivocation_key)).unwrap(); - let payload1 = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); - let payload2 = Payload::from_single_entry(MMR_ROOT_ID, vec![128]); - // generate an equivocation for a future set - let equivocation_proof = generate_equivocation_proof( - (block_num, payload1, set_id + 1, &equivocation_keyring), - (block_num, payload2, set_id + 1, &equivocation_keyring), - ); - // the call for reporting the equivocation should error assert_err!( - Beefy::report_equivocation_unsigned( - RuntimeOrigin::none(), - Box::new(equivocation_proof), - key_owner_proof, - ), - Error::::InvalidEquivocationProof, + f(block_num, set_id + 1, &equivocation_keyring, key_owner_proof), + Error::::InvalidEquivocationProofSession, ); }); } -#[test] -fn report_equivocation_invalid_session() { +fn report_equivocation_invalid_session(mut f: impl ReportEquivocationFn) { let authorities = test_authorities(); ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { @@ -488,29 +491,16 @@ fn report_equivocation_invalid_session() { let set_id = Beefy::validator_set().unwrap().id(); - let payload1 = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); - let payload2 = Payload::from_single_entry(MMR_ROOT_ID, vec![128]); - // generate an equivocation proof at following era set id = 2 - let equivocation_proof = generate_equivocation_proof( - (block_num, payload1, set_id, &equivocation_keyring), - (block_num, payload2, set_id, &equivocation_keyring), - ); - // report an equivocation for the current set using an key ownership // proof from the previous set, the session should be invalid. assert_err!( - Beefy::report_equivocation_unsigned( - RuntimeOrigin::none(), - Box::new(equivocation_proof), - key_owner_proof, - ), - Error::::InvalidEquivocationProof, + f(block_num, set_id + 1, &equivocation_keyring, key_owner_proof), + Error::::InvalidEquivocationProofSession, ); }); } -#[test] -fn report_equivocation_invalid_key_owner_proof() { +fn report_equivocation_invalid_key_owner_proof(mut f: impl ReportEquivocationFn) { let authorities = test_authorities(); ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { @@ -532,14 +522,6 @@ fn report_equivocation_invalid_key_owner_proof() { let equivocation_key = &authorities[equivocation_authority_index]; let equivocation_keyring = BeefyKeyring::from_public(equivocation_key).unwrap(); - let payload1 = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); - let payload2 = Payload::from_single_entry(MMR_ROOT_ID, vec![128]); - // generate an equivocation proof for the authority at index 0 - let equivocation_proof = generate_equivocation_proof( - (block_num, payload1, set_id + 1, &equivocation_keyring), - (block_num, payload2, set_id + 1, &equivocation_keyring), - ); - // we need to start a new era otherwise the key ownership proof won't be // checked since the authorities are part of the current session start_era(2); @@ -547,18 +529,81 @@ fn report_equivocation_invalid_key_owner_proof() { // report an equivocation for the current set using a key ownership // proof for a different key than the one in the equivocation proof. assert_err!( - Beefy::report_equivocation_unsigned( - RuntimeOrigin::none(), - Box::new(equivocation_proof), - invalid_key_owner_proof, - ), + f(block_num, set_id, &equivocation_keyring, invalid_key_owner_proof), Error::::InvalidKeyOwnershipProof, ); }); } +fn valid_equivocation_reports_dont_pay_fees(mut f: impl ReportEquivocationFn) { + let authorities = test_authorities(); + + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { + start_era(1); + + let block_num = System::block_number(); + let validator_set = Beefy::validator_set().unwrap(); + let authorities = validator_set.validators(); + let set_id = validator_set.id(); + + let equivocation_authority_index = 0; + let equivocation_key = &authorities[equivocation_authority_index]; + let equivocation_keyring = BeefyKeyring::from_public(equivocation_key).unwrap(); + + // create the key ownership proof. + let key_owner_proof = Historical::prove((BEEFY_KEY_TYPE, &equivocation_key)).unwrap(); + + // report the equivocation. + let post_info = + f(block_num, set_id, &equivocation_keyring, key_owner_proof.clone()).unwrap(); + + // the original weight should be kept, but given that the report + // is valid the fee is waived. + assert!(post_info.actual_weight.is_none()); + assert_eq!(post_info.pays_fee, Pays::No); + + // report the equivocation again which is invalid now since it is + // duplicate. + let post_info = f(block_num, set_id, &equivocation_keyring, key_owner_proof) + .err() + .unwrap() + .post_info; + + // the fee is not waived and the original weight is kept. + assert!(post_info.actual_weight.is_none()); + assert_eq!(post_info.pays_fee, Pays::Yes); + }) +} + +// Test double voting reporting logic. + #[test] -fn report_equivocation_invalid_equivocation_proof() { +fn report_double_voting_current_set_works() { + report_equivocation_current_set_works(report_double_voting); +} + +#[test] +fn report_double_voting_old_set_works() { + report_equivocation_old_set_works(report_double_voting); +} + +#[test] +fn report_double_voting_invalid_set_id() { + report_equivocation_invalid_set_id(report_double_voting); +} + +#[test] +fn report_double_voting_invalid_session() { + report_equivocation_invalid_session(report_double_voting); +} + +#[test] +fn report_double_voting_invalid_key_owner_proof() { + report_equivocation_invalid_key_owner_proof(report_double_voting); +} + +#[test] +fn report_double_voting_invalid_equivocation_proof() { let authorities = test_authorities(); ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { @@ -578,12 +623,12 @@ fn report_equivocation_invalid_equivocation_proof() { let assert_invalid_equivocation_proof = |equivocation_proof| { assert_err!( - Beefy::report_equivocation_unsigned( + Beefy::report_double_voting_unsigned( RuntimeOrigin::none(), Box::new(equivocation_proof), key_owner_proof.clone(), ), - Error::::InvalidEquivocationProof, + Error::::InvalidDoubleVotingProof, ); }; @@ -594,31 +639,31 @@ fn report_equivocation_invalid_equivocation_proof() { // both votes target the same block number and payload, // there is no equivocation. - assert_invalid_equivocation_proof(generate_equivocation_proof( + assert_invalid_equivocation_proof(generate_double_voting_proof( (block_num, payload1.clone(), set_id, &equivocation_keyring), (block_num, payload1.clone(), set_id, &equivocation_keyring), )); // votes targeting different rounds, there is no equivocation. - assert_invalid_equivocation_proof(generate_equivocation_proof( + assert_invalid_equivocation_proof(generate_double_voting_proof( (block_num, payload1.clone(), set_id, &equivocation_keyring), (block_num + 1, payload2.clone(), set_id, &equivocation_keyring), )); // votes signed with different authority keys - assert_invalid_equivocation_proof(generate_equivocation_proof( + assert_invalid_equivocation_proof(generate_double_voting_proof( (block_num, payload1.clone(), set_id, &equivocation_keyring), (block_num, payload1.clone(), set_id, &BeefyKeyring::Charlie), )); // votes signed with a key that isn't part of the authority set - assert_invalid_equivocation_proof(generate_equivocation_proof( + assert_invalid_equivocation_proof(generate_double_voting_proof( (block_num, payload1.clone(), set_id, &equivocation_keyring), (block_num, payload1.clone(), set_id, &BeefyKeyring::Dave), )); // votes targeting different set ids - assert_invalid_equivocation_proof(generate_equivocation_proof( + assert_invalid_equivocation_proof(generate_double_voting_proof( (block_num, payload1, set_id, &equivocation_keyring), (block_num, payload2, set_id + 1, &equivocation_keyring), )); @@ -626,7 +671,7 @@ fn report_equivocation_invalid_equivocation_proof() { } #[test] -fn report_equivocation_validate_unsigned_prevents_duplicates() { +fn report_double_voting_validate_unsigned_prevents_duplicates() { use sp_runtime::transaction_validity::{ InvalidTransaction, TransactionPriority, TransactionSource, TransactionValidity, ValidTransaction, @@ -649,14 +694,14 @@ fn report_equivocation_validate_unsigned_prevents_duplicates() { let payload1 = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); let payload2 = Payload::from_single_entry(MMR_ROOT_ID, vec![128]); - let equivocation_proof = generate_equivocation_proof( + let equivocation_proof = generate_double_voting_proof( (block_num, payload1, set_id, &equivocation_keyring), (block_num, payload2, set_id, &equivocation_keyring), ); let key_owner_proof = Historical::prove((BEEFY_KEY_TYPE, &equivocation_key)).unwrap(); - let call = Call::report_equivocation_unsigned { + let call = Call::report_double_voting_unsigned { equivocation_proof: Box::new(equivocation_proof.clone()), key_owner_proof: key_owner_proof.clone(), }; @@ -691,7 +736,7 @@ fn report_equivocation_validate_unsigned_prevents_duplicates() { assert_ok!(::pre_dispatch(&call)); // we submit the report - Beefy::report_equivocation_unsigned( + Beefy::report_double_voting_unsigned( RuntimeOrigin::none(), Box::new(equivocation_proof), key_owner_proof, @@ -716,11 +761,11 @@ fn report_equivocation_validate_unsigned_prevents_duplicates() { } #[test] -fn report_equivocation_has_valid_weight() { +fn report_double_voting_has_valid_weight() { // the weight depends on the size of the validator set, // but there's a lower bound of 100 validators. assert!((1..=100) - .map(|validators| ::WeightInfo::report_equivocation(validators, 1000)) + .map(|validators| ::WeightInfo::report_double_voting(validators, 1000)) .collect::>() .windows(2) .all(|w| w[0] == w[1])); @@ -728,20 +773,75 @@ fn report_equivocation_has_valid_weight() { // after 100 validators the weight should keep increasing // with every extra validator. assert!((100..=1000) - .map(|validators| ::WeightInfo::report_equivocation(validators, 1000)) + .map(|validators| ::WeightInfo::report_double_voting(validators, 1000)) .collect::>() .windows(2) .all(|w| w[0].ref_time() < w[1].ref_time())); } #[test] -fn valid_equivocation_reports_dont_pay_fees() { +fn valid_double_voting_reports_dont_pay_fees() { + valid_equivocation_reports_dont_pay_fees(report_double_voting) +} + +// Test fork voting reporting logic. + +fn report_fork_voting( + block_num: u64, + set_id: ValidatorSetId, + equivocation_keyring: &BeefyKeyring, + key_owner_proof: MembershipProof, +) -> DispatchResultWithPostInfo { + let payload = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); + let equivocation_proof = generate_fork_voting_proof( + (block_num, payload, set_id, &equivocation_keyring), + MockAncestryProof { is_non_canonical: true }, + System::finalize(), + ); + + Beefy::report_fork_voting_unsigned( + RuntimeOrigin::none(), + Box::new(equivocation_proof), + key_owner_proof, + ) +} + +#[test] +fn report_fork_voting_current_set_works() { + report_equivocation_current_set_works(report_fork_voting); +} + +#[test] +fn report_fork_voting_old_set_works() { + report_equivocation_old_set_works(report_fork_voting); +} + +#[test] +fn report_fork_voting_invalid_set_id() { + report_equivocation_invalid_set_id(report_fork_voting); +} + +#[test] +fn report_fork_voting_invalid_session() { + report_equivocation_invalid_session(report_fork_voting); +} + +#[test] +fn report_fork_voting_invalid_key_owner_proof() { + report_equivocation_invalid_key_owner_proof(report_fork_voting); +} + +#[test] +fn report_fork_voting_invalid_equivocation_proof() { let authorities = test_authorities(); - ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { - start_era(1); + let mut ext = ExtBuilder::default().add_authorities(authorities).build(); + let mut era = 1; + let (block_num, set_id, equivocation_keyring, key_owner_proof) = ext.execute_with(|| { + start_era(era); let block_num = System::block_number(); + let validator_set = Beefy::validator_set().unwrap(); let authorities = validator_set.validators(); let set_id = validator_set.id(); @@ -750,56 +850,224 @@ fn valid_equivocation_reports_dont_pay_fees() { let equivocation_key = &authorities[equivocation_authority_index]; let equivocation_keyring = BeefyKeyring::from_public(equivocation_key).unwrap(); - // generate equivocation proof - let payload1 = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); - let payload2 = Payload::from_single_entry(MMR_ROOT_ID, vec![128]); - let equivocation_proof = generate_equivocation_proof( - (block_num, payload1, set_id, &equivocation_keyring), - (block_num, payload2, set_id, &equivocation_keyring), + // generate a key ownership proof at set id in era 1 + let key_owner_proof = Historical::prove((BEEFY_KEY_TYPE, &equivocation_key)).unwrap(); + + era += 1; + start_era(era); + (block_num, set_id, equivocation_keyring, key_owner_proof) + }); + ext.persist_offchain_overlay(); + + ext.execute_with(|| { + let payload = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); + + // vote signed with a key that isn't part of the authority set + let equivocation_proof = generate_fork_voting_proof( + (block_num, payload.clone(), set_id, &BeefyKeyring::Dave), + MockAncestryProof { is_non_canonical: true }, + System::finalize(), + ); + assert_err!( + Beefy::report_fork_voting_unsigned( + RuntimeOrigin::none(), + Box::new(equivocation_proof), + key_owner_proof.clone(), + ), + Error::::InvalidKeyOwnershipProof, ); - // create the key ownership proof. - let key_owner_proof = Historical::prove((BEEFY_KEY_TYPE, &equivocation_key)).unwrap(); + // Simulate InvalidForkVotingProof error. + let equivocation_proof = generate_fork_voting_proof( + (block_num + 1, payload.clone(), set_id, &equivocation_keyring), + MockAncestryProof { is_non_canonical: false }, + System::finalize(), + ); + assert_err!( + Beefy::report_fork_voting_unsigned( + RuntimeOrigin::none(), + Box::new(equivocation_proof), + key_owner_proof.clone(), + ), + Error::::InvalidForkVotingProof, + ); + }); +} - // check the dispatch info for the call. - let info = Call::::report_equivocation_unsigned { - equivocation_proof: Box::new(equivocation_proof.clone()), - key_owner_proof: key_owner_proof.clone(), +#[test] +fn report_fork_voting_invalid_context() { + let authorities = test_authorities(); + + let mut ext = ExtBuilder::default().add_authorities(authorities).build(); + + let mut era = 1; + let block_num = ext.execute_with(|| { + assert_eq!(Staking::current_era(), Some(0)); + assert_eq!(Session::current_index(), 0); + start_era(era); + + let block_num = System::block_number(); + era += 1; + start_era(era); + block_num + }); + ext.persist_offchain_overlay(); + + ext.execute_with(|| { + let validator_set = Beefy::validator_set().unwrap(); + let authorities = validator_set.validators(); + let set_id = validator_set.id(); + let validators = Session::validators(); + + // make sure that all validators have the same balance + for validator in &validators { + assert_eq!(Balances::total_balance(validator), 10_000_000); + assert_eq!(Staking::slashable_balance_of(validator), 10_000); + + assert_eq!( + Staking::eras_stakers(era, validator), + pallet_staking::Exposure { total: 10_000, own: 10_000, others: vec![] }, + ); } - .get_dispatch_info(); - // it should have non-zero weight and the fee has to be paid. - assert!(info.weight.any_gt(Weight::zero())); - assert_eq!(info.pays_fee, Pays::Yes); + assert_eq!(authorities.len(), 2); + let equivocation_authority_index = 1; + let equivocation_key = &authorities[equivocation_authority_index]; + let equivocation_keyring = BeefyKeyring::from_public(equivocation_key).unwrap(); - // report the equivocation. - let post_info = Beefy::report_equivocation_unsigned( - RuntimeOrigin::none(), - Box::new(equivocation_proof.clone()), - key_owner_proof.clone(), - ) - .unwrap(); + let payload = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); - // the original weight should be kept, but given that the report - // is valid the fee is waived. - assert!(post_info.actual_weight.is_none()); - assert_eq!(post_info.pays_fee, Pays::No); + // generate a fork equivocation proof, with a vote in the same round for a + // different payload than finalized + let equivocation_proof = generate_fork_voting_proof( + (block_num, payload, set_id, &equivocation_keyring), + MockAncestryProof { is_non_canonical: true }, + System::finalize(), + ); - // report the equivocation again which is invalid now since it is - // duplicate. - let post_info = Beefy::report_equivocation_unsigned( - RuntimeOrigin::none(), - Box::new(equivocation_proof), - key_owner_proof, - ) - .err() - .unwrap() - .post_info; + // create the key ownership proof + let key_owner_proof = Historical::prove((BEEFY_KEY_TYPE, &equivocation_key)).unwrap(); - // the fee is not waived and the original weight is kept. - assert!(post_info.actual_weight.is_none()); - assert_eq!(post_info.pays_fee, Pays::Yes); - }) + // report an equivocation for the current set. Simulate a failure of + // `extract_validation_context` + AncestryProofContext::set(&None); + assert_err!( + Beefy::report_fork_voting_unsigned( + RuntimeOrigin::none(), + Box::new(equivocation_proof.clone()), + key_owner_proof.clone(), + ), + Error::::InvalidForkVotingProof, + ); + + // report an equivocation for the current set. Simulate an invalid context. + AncestryProofContext::set(&Some(MockAncestryProofContext { is_valid: false })); + assert_err!( + Beefy::report_fork_voting_unsigned( + RuntimeOrigin::none(), + Box::new(equivocation_proof), + key_owner_proof, + ), + Error::::InvalidForkVotingProof, + ); + }); +} + +#[test] +fn valid_fork_voting_reports_dont_pay_fees() { + valid_equivocation_reports_dont_pay_fees(report_fork_voting) +} + +// Test future block voting reporting logic. + +fn report_future_block_voting( + block_num: u64, + set_id: ValidatorSetId, + equivocation_keyring: &BeefyKeyring, + key_owner_proof: MembershipProof, +) -> DispatchResultWithPostInfo { + let payload = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); + let equivocation_proof = generate_future_block_voting_proof(( + block_num + 100, + payload, + set_id, + &equivocation_keyring, + )); + + Beefy::report_future_block_voting_unsigned( + RuntimeOrigin::none(), + Box::new(equivocation_proof), + key_owner_proof, + ) +} + +#[test] +fn report_future_block_voting_current_set_works() { + report_equivocation_current_set_works(report_future_block_voting); +} + +#[test] +fn report_future_block_voting_old_set_works() { + report_equivocation_old_set_works(report_future_block_voting); +} + +#[test] +fn report_future_block_voting_invalid_set_id() { + report_equivocation_invalid_set_id(report_future_block_voting); +} + +#[test] +fn report_future_block_voting_invalid_session() { + report_equivocation_invalid_session(report_future_block_voting); +} + +#[test] +fn report_future_block_voting_invalid_key_owner_proof() { + report_equivocation_invalid_key_owner_proof(report_future_block_voting); +} + +#[test] +fn report_future_block_voting_invalid_equivocation_proof() { + let authorities = test_authorities(); + + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { + start_era(1); + + let validator_set = Beefy::validator_set().unwrap(); + let authorities = validator_set.validators(); + let set_id = validator_set.id(); + + let equivocation_authority_index = 0; + let equivocation_key = &authorities[equivocation_authority_index]; + let equivocation_keyring = BeefyKeyring::from_public(equivocation_key).unwrap(); + + // create the key ownership proof + let key_owner_proof = Historical::prove((BEEFY_KEY_TYPE, &equivocation_key)).unwrap(); + + start_era(2); + + let payload = Payload::from_single_entry(MMR_ROOT_ID, vec![42]); + + // vote targeting old block + assert_err!( + Beefy::report_future_block_voting_unsigned( + RuntimeOrigin::none(), + Box::new(generate_future_block_voting_proof(( + 1, + payload.clone(), + set_id, + &equivocation_keyring, + ))), + key_owner_proof.clone(), + ), + Error::::InvalidFutureBlockVotingProof, + ); + }); +} + +#[test] +fn valid_future_block_voting_reports_dont_pay_fees() { + valid_equivocation_reports_dont_pay_fees(report_future_block_voting) } #[test] diff --git a/substrate/frame/merkle-mountain-range/src/lib.rs b/substrate/frame/merkle-mountain-range/src/lib.rs index a86443f2e01..47a325db605 100644 --- a/substrate/frame/merkle-mountain-range/src/lib.rs +++ b/substrate/frame/merkle-mountain-range/src/lib.rs @@ -282,6 +282,19 @@ where } } +/// Stateless ancestry proof verification. +pub fn verify_ancestry_proof( + root: H::Output, + ancestry_proof: primitives::AncestryProof, +) -> Result +where + H: traits::Hash, + L: primitives::FullLeaf, +{ + mmr::verify_ancestry_proof::(root, ancestry_proof) + .map_err(|_| Error::Verify.log_debug(("The ancestry proof is incorrect.", root))) +} + impl, I: 'static> Pallet { /// Build offchain key from `parent_hash` of block that originally added node `pos` to MMR. /// @@ -303,17 +316,14 @@ impl, I: 'static> Pallet { } /// Provide the parent number for the block that added `leaf_index` to the MMR. - fn leaf_index_to_parent_block_num( - leaf_index: LeafIndex, - leaves_count: LeafIndex, - ) -> BlockNumberFor { + fn leaf_index_to_parent_block_num(leaf_index: LeafIndex) -> BlockNumberFor { // leaves are zero-indexed and were added one per block since pallet activation, // while block numbers are one-indexed, so block number that added `leaf_idx` is: // `block_num = block_num_when_pallet_activated + leaf_idx + 1` // `block_num = (current_block_num - leaves_count) + leaf_idx + 1` // `parent_block_num = current_block_num - leaves_count + leaf_idx`. >::block_number() - .saturating_sub(leaves_count.saturated_into()) + .saturating_sub(Self::mmr_leaves().saturated_into()) .saturating_add(leaf_index.saturated_into()) } @@ -330,6 +340,15 @@ impl, I: 'static> Pallet { utils::block_num_to_leaf_index::>(block_num, first_mmr_block) } + /// Convert a block number into a leaf index. + pub fn block_num_to_leaf_count(block_num: BlockNumberFor) -> Result + where + T: frame_system::Config, + { + let leaf_index = Self::block_num_to_leaf_index(block_num)?; + Ok(leaf_index.saturating_add(1)) + } + /// Generate an MMR proof for the given `block_numbers`. /// If `best_known_block_number = Some(n)`, this generates a historical proof for /// the chain with head at height `n`. @@ -347,8 +366,7 @@ impl, I: 'static> Pallet { let best_known_block_number = best_known_block_number.unwrap_or_else(|| >::block_number()); - let leaves_count = - Self::block_num_to_leaf_index(best_known_block_number)?.saturating_add(1); + let leaf_count = Self::block_num_to_leaf_count(best_known_block_number)?; // we need to translate the block_numbers into leaf indices. let leaf_indices = block_numbers @@ -358,7 +376,7 @@ impl, I: 'static> Pallet { }) .collect::, _>>()?; - let mmr: ModuleMmr = mmr::Mmr::new(leaves_count); + let mmr: ModuleMmr = mmr::Mmr::new(leaf_count); mmr.generate_proof(leaf_indices) } @@ -374,7 +392,7 @@ impl, I: 'static> Pallet { ) -> Result<(), primitives::Error> { if proof.leaf_count > NumberOfLeaves::::get() || proof.leaf_count == 0 || - (proof.items.len().saturating_add(leaves.len())) as u64 > proof.leaf_count + proof.items.len().saturating_add(leaves.len()) as u64 > proof.leaf_count { return Err(primitives::Error::Verify .log_debug("The proof has incorrect number of leaves or proof items.")) @@ -397,24 +415,18 @@ impl, I: 'static> Pallet { let best_known_block_number = best_known_block_number.unwrap_or_else(|| >::block_number()); - let leaf_count = Self::block_num_to_leaf_index(best_known_block_number)?.saturating_add(1); - let prev_leaf_count = Self::block_num_to_leaf_index(prev_block_number)?.saturating_add(1); + let leaf_count = Self::block_num_to_leaf_count(best_known_block_number)?; + let prev_leaf_count = Self::block_num_to_leaf_count(prev_block_number)?; let mmr: ModuleMmr = mmr::Mmr::new(leaf_count); mmr.generate_ancestry_proof(prev_leaf_count) } pub fn verify_ancestry_proof( + root: HashOf, ancestry_proof: primitives::AncestryProof>, - ) -> Result<(), Error> { - let mmr: ModuleMmr = - mmr::Mmr::new(ancestry_proof.leaf_count); - let is_valid = mmr.verify_ancestry_proof(ancestry_proof)?; - if is_valid { - Ok(()) - } else { - Err(Error::Verify.log_debug("The ancestry proof is incorrect.")) - } + ) -> Result, Error> { + verify_ancestry_proof::, LeafOf>(root, ancestry_proof) } /// Return the on-chain MMR root hash. diff --git a/substrate/frame/merkle-mountain-range/src/mmr/mmr.rs b/substrate/frame/merkle-mountain-range/src/mmr/mmr.rs index 5efc172d1e9..8a99f4d87de 100644 --- a/substrate/frame/merkle-mountain-range/src/mmr/mmr.rs +++ b/substrate/frame/merkle-mountain-range/src/mmr/mmr.rs @@ -60,6 +60,42 @@ where .map_err(|e| Error::Verify.log_debug(e)) } +pub fn verify_ancestry_proof( + root: H::Output, + ancestry_proof: primitives::AncestryProof, +) -> Result +where + H: sp_runtime::traits::Hash, + L: primitives::FullLeaf, +{ + let mmr_size = NodesUtils::new(ancestry_proof.leaf_count).size(); + + let prev_peaks_proof = mmr_lib::NodeMerkleProof::, Hasher>::new( + mmr_size, + ancestry_proof + .items + .into_iter() + .map(|(index, hash)| (index, Node::Hash(hash))) + .collect(), + ); + + let raw_ancestry_proof = mmr_lib::AncestryProof::, Hasher> { + prev_peaks: ancestry_proof.prev_peaks.into_iter().map(|hash| Node::Hash(hash)).collect(), + prev_size: mmr_lib::helper::leaf_index_to_mmr_size(ancestry_proof.prev_leaf_count - 1), + proof: prev_peaks_proof, + }; + + let prev_root = mmr_lib::ancestry_proof::bagging_peaks_hashes::, Hasher>( + raw_ancestry_proof.prev_peaks.clone(), + ) + .map_err(|e| Error::Verify.log_debug(e))?; + raw_ancestry_proof + .verify_ancestor(Node::Hash(root), prev_root.clone()) + .map_err(|e| Error::Verify.log_debug(e))?; + + Ok(prev_root.hash()) +} + /// A wrapper around an MMR library to expose limited functionality. /// /// Available functions depend on the storage kind ([Runtime](crate::mmr::storage::RuntimeStorage) @@ -119,44 +155,6 @@ where .map_err(|e| Error::Verify.log_debug(e)) } - pub fn verify_ancestry_proof( - &self, - ancestry_proof: primitives::AncestryProof>, - ) -> Result { - let prev_peaks_proof = - mmr_lib::NodeMerkleProof::, Hasher, L>>::new( - self.mmr.mmr_size(), - ancestry_proof - .items - .into_iter() - .map(|(index, hash)| (index, Node::Hash(hash))) - .collect(), - ); - - let raw_ancestry_proof = mmr_lib::AncestryProof::< - NodeOf, - Hasher, L>, - > { - prev_peaks: ancestry_proof - .prev_peaks - .into_iter() - .map(|hash| Node::Hash(hash)) - .collect(), - prev_size: mmr_lib::helper::leaf_index_to_mmr_size(ancestry_proof.prev_leaf_count - 1), - proof: prev_peaks_proof, - }; - - let prev_root = mmr_lib::ancestry_proof::bagging_peaks_hashes::< - NodeOf, - Hasher, L>, - >(raw_ancestry_proof.prev_peaks.clone()) - .map_err(|e| Error::Verify.log_debug(e))?; - let root = self.mmr.get_root().map_err(|e| Error::GetRoot.log_error(e))?; - raw_ancestry_proof - .verify_ancestor(root, prev_root) - .map_err(|e| Error::Verify.log_debug(e)) - } - /// Return the internal size of the MMR (number of nodes). #[cfg(test)] pub fn size(&self) -> NodeIndex { diff --git a/substrate/frame/merkle-mountain-range/src/mmr/mod.rs b/substrate/frame/merkle-mountain-range/src/mmr/mod.rs index 93fefe910e4..5b73f53506e 100644 --- a/substrate/frame/merkle-mountain-range/src/mmr/mod.rs +++ b/substrate/frame/merkle-mountain-range/src/mmr/mod.rs @@ -21,7 +21,7 @@ pub mod storage; use sp_mmr_primitives::{mmr_lib, DataOrHash, FullLeaf}; use sp_runtime::traits; -pub use self::mmr::{verify_leaves_proof, Mmr}; +pub use self::mmr::{verify_ancestry_proof, verify_leaves_proof, Mmr}; /// Node type for runtime `T`. pub type NodeOf = Node<>::Hashing, L>; diff --git a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs index 6848b8f1b99..e27440be35c 100644 --- a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs +++ b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs @@ -67,7 +67,6 @@ where L: primitives::FullLeaf + codec::Decode, { fn get_elem(&self, pos: NodeIndex) -> mmr_lib::Result>> { - let leaves = NumberOfLeaves::::get(); // Find out which leaf added node `pos` in the MMR. let ancestor_leaf_idx = NodesUtils::leaf_index_that_added_node(pos); @@ -86,7 +85,7 @@ where // Fall through to searching node using fork-specific key. let ancestor_parent_block_num = - Pallet::::leaf_index_to_parent_block_num(ancestor_leaf_idx, leaves); + Pallet::::leaf_index_to_parent_block_num(ancestor_leaf_idx); let ancestor_parent_hash = T::BlockHashProvider::block_hash(ancestor_parent_block_num); let temp_key = Pallet::::node_temp_offchain_key(pos, ancestor_parent_hash); debug!( diff --git a/substrate/frame/merkle-mountain-range/src/tests.rs b/substrate/frame/merkle-mountain-range/src/tests.rs index f8cfcb4e2c2..b8c9d54db82 100644 --- a/substrate/frame/merkle-mountain-range/src/tests.rs +++ b/substrate/frame/merkle-mountain-range/src/tests.rs @@ -792,16 +792,28 @@ fn does_not_panic_when_generating_historical_proofs() { fn generating_and_verifying_ancestry_proofs_works_correctly() { let _ = env_logger::try_init(); let mut ext = new_test_ext(); - ext.execute_with(|| add_blocks(500)); + + let mut prev_roots = vec![]; + ext.execute_with(|| { + for _ in 1..=500 { + add_blocks(1); + prev_roots.push(Pallet::::mmr_root()) + } + }); ext.persist_offchain_overlay(); register_offchain_ext(&mut ext); ext.execute_with(|| { + let root = Pallet::::mmr_root(); // Check that generating and verifying ancestry proofs works correctly // for each previous block - for prev_block_number in 1..501 { - let proof = Pallet::::generate_ancestry_proof(prev_block_number, None).unwrap(); - Pallet::::verify_ancestry_proof(proof).unwrap(); + for prev_block_number in 1usize..=500 { + let proof = + Pallet::::generate_ancestry_proof(prev_block_number as u64, None).unwrap(); + assert_eq!( + Pallet::::verify_ancestry_proof(root, proof), + Ok(prev_roots[prev_block_number - 1]) + ); } // Check that we can't generate ancestry proofs for a future block. diff --git a/substrate/primitives/consensus/beefy/src/lib.rs b/substrate/primitives/consensus/beefy/src/lib.rs index 913184402ae..7f6f733d0e3 100644 --- a/substrate/primitives/consensus/beefy/src/lib.rs +++ b/substrate/primitives/consensus/beefy/src/lib.rs @@ -53,7 +53,7 @@ use scale_info::TypeInfo; use sp_application_crypto::{AppPublic, RuntimeAppPublic}; use sp_core::H256; use sp_runtime::{ - traits::{Hash, Keccak256, NumberFor}, + traits::{Hash, Header as HeaderT, Keccak256, NumberFor}, OpaqueValue, }; @@ -307,8 +307,10 @@ pub struct VoteMessage { pub signature: Signature, } -/// Proof of voter misbehavior on a given set id. Misbehavior/equivocation in -/// BEEFY happens when a voter votes on the same round/block for different payloads. +/// Proof showing that an authority voted twice in the same round. +/// +/// One type of misbehavior in BEEFY happens when an authority votes in the same round/block +/// for different payloads. /// Proving is achieved by collecting the signed commitments of conflicting votes. #[derive(Clone, Debug, Decode, Encode, PartialEq, TypeInfo)] pub struct DoubleVotingProof { @@ -333,6 +335,27 @@ impl DoubleVotingProof { } } +/// Proof showing that an authority voted for a non-canonical chain. +/// +/// Proving is achieved by providing a proof that contains relevant info about the canonical chain +/// at `commitment.block_number`. The `commitment` can be checked against this info. +#[derive(Clone, Debug, Decode, Encode, PartialEq, TypeInfo)] +pub struct ForkVotingProof { + /// The equivocated vote. + pub vote: VoteMessage, + /// Proof containing info about the canonical chain at `commitment.block_number`. + pub ancestry_proof: AncestryProof, + /// The header of the block where the ancestry proof was generated + pub header: Header, +} + +/// Proof showing that an authority voted for a future block. +#[derive(Clone, Debug, Decode, Encode, PartialEq, TypeInfo)] +pub struct FutureBlockVotingProof { + /// The equivocated vote. + pub vote: VoteMessage, +} + /// Check a commitment signature by encoding the commitment and /// verifying the provided signature using the expected authority id. pub fn check_commitment_signature( @@ -351,7 +374,7 @@ where /// Verifies the equivocation proof by making sure that both votes target /// different blocks and that its signatures are valid. -pub fn check_equivocation_proof( +pub fn check_double_voting_proof( report: &DoubleVotingProof::Signature>, ) -> bool where @@ -398,6 +421,25 @@ impl OnNewValidatorSet for () { fn on_new_validator_set(_: &ValidatorSet, _: &ValidatorSet) {} } +/// Hook containing helper methods for proving/checking commitment canonicity. +pub trait AncestryHelper { + /// Type containing proved info about the canonical chain at a certain height. + type Proof: Clone + Debug + Decode + Encode + PartialEq + TypeInfo; + /// The data needed for validating the proof. + type ValidationContext; + + /// Extract the validation context from the provided header. + fn extract_validation_context(header: Header) -> Option; + + /// Check if a commitment is pointing to a header on a non-canonical chain + /// against a canonicity proof generated at the same header height. + fn is_non_canonical( + commitment: &Commitment, + proof: Self::Proof, + context: Self::ValidationContext, + ) -> bool; +} + /// An opaque type used to represent the key ownership proof at the runtime API /// boundary. The inner value is an encoded representation of the actual key /// ownership proof which will be parameterized when defining the runtime. At @@ -408,7 +450,7 @@ pub type OpaqueKeyOwnershipProof = OpaqueValue; sp_api::decl_runtime_apis! { /// API necessary for BEEFY voters. - #[api_version(3)] + #[api_version(4)] pub trait BeefyApi where AuthorityId : Codec + RuntimeAppPublic, { @@ -418,15 +460,15 @@ sp_api::decl_runtime_apis! { /// Return the current active BEEFY validator set fn validator_set() -> Option>; - /// Submits an unsigned extrinsic to report an equivocation. The caller - /// must provide the equivocation proof and a key ownership proof + /// Submits an unsigned extrinsic to report a double voting equivocation. The caller + /// must provide the double voting proof and a key ownership proof /// (should be obtained using `generate_key_ownership_proof`). The /// extrinsic will be unsigned and should only be accepted for local /// authorship (not to be broadcast to the network). This method returns /// `None` when creation of the extrinsic fails, e.g. if equivocation /// reporting is disabled for the given runtime (i.e. this method is /// hardcoded to return `None`). Only useful in an offchain context. - fn submit_report_equivocation_unsigned_extrinsic( + fn submit_report_double_voting_unsigned_extrinsic( equivocation_proof: DoubleVotingProof, AuthorityId, ::Signature>, key_owner_proof: OpaqueKeyOwnershipProof, diff --git a/substrate/primitives/consensus/beefy/src/payload.rs b/substrate/primitives/consensus/beefy/src/payload.rs index 1a06e620e7a..d22255c384b 100644 --- a/substrate/primitives/consensus/beefy/src/payload.rs +++ b/substrate/primitives/consensus/beefy/src/payload.rs @@ -58,7 +58,7 @@ impl Payload { /// Returns a decoded payload value under given `id`. /// - /// In case the value is not there or it cannot be decoded does not match `None` is returned. + /// In case the value is not there, or it cannot be decoded `None` is returned. pub fn get_decoded(&self, id: &BeefyPayloadId) -> Option { self.get_raw(id).and_then(|raw| T::decode(&mut &raw[..]).ok()) } diff --git a/substrate/primitives/consensus/beefy/src/test_utils.rs b/substrate/primitives/consensus/beefy/src/test_utils.rs index d7fd49214f1..bd335ede489 100644 --- a/substrate/primitives/consensus/beefy/src/test_utils.rs +++ b/substrate/primitives/consensus/beefy/src/test_utils.rs @@ -18,12 +18,12 @@ #[cfg(feature = "bls-experimental")] use crate::ecdsa_bls_crypto; use crate::{ - ecdsa_crypto, AuthorityIdBound, BeefySignatureHasher, Commitment, DoubleVotingProof, Payload, - ValidatorSetId, VoteMessage, + ecdsa_crypto, AuthorityIdBound, BeefySignatureHasher, Commitment, DoubleVotingProof, + ForkVotingProof, FutureBlockVotingProof, Payload, ValidatorSetId, VoteMessage, }; use sp_application_crypto::{AppCrypto, AppPair, RuntimeAppPublic, Wraps}; use sp_core::{ecdsa, Pair}; -use sp_runtime::traits::Hash; +use sp_runtime::traits::{BlockNumber, Hash, Header as HeaderT}; use codec::Encode; use std::{collections::HashMap, marker::PhantomData}; @@ -136,20 +136,42 @@ impl From> for ecdsa_crypto::Public { } } -/// Create a new `EquivocationProof` based on given arguments. -pub fn generate_equivocation_proof( +/// Create a new `VoteMessage` from commitment primitives and keyring +pub fn signed_vote( + block_number: Number, + payload: Payload, + validator_set_id: ValidatorSetId, + keyring: &Keyring, +) -> VoteMessage { + let commitment = Commitment { validator_set_id, block_number, payload }; + let signature = keyring.sign(&commitment.encode()); + VoteMessage { commitment, id: keyring.public(), signature } +} + +/// Create a new `DoubleVotingProof` based on given arguments. +pub fn generate_double_voting_proof( vote1: (u64, Payload, ValidatorSetId, &Keyring), vote2: (u64, Payload, ValidatorSetId, &Keyring), ) -> DoubleVotingProof { - let signed_vote = |block_number: u64, - payload: Payload, - validator_set_id: ValidatorSetId, - keyring: &Keyring| { - let commitment = Commitment { validator_set_id, block_number, payload }; - let signature = keyring.sign(&commitment.encode()); - VoteMessage { commitment, id: keyring.public(), signature } - }; let first = signed_vote(vote1.0, vote1.1, vote1.2, vote1.3); let second = signed_vote(vote2.0, vote2.1, vote2.2, vote2.3); DoubleVotingProof { first, second } } + +/// Create a new `ForkVotingProof` based on vote & canonical header. +pub fn generate_fork_voting_proof, AncestryProof>( + vote: (u64, Payload, ValidatorSetId, &Keyring), + ancestry_proof: AncestryProof, + header: Header, +) -> ForkVotingProof { + let signed_vote = signed_vote(vote.0, vote.1, vote.2, vote.3); + ForkVotingProof { vote: signed_vote, ancestry_proof, header } +} + +/// Create a new `ForkVotingProof` based on vote & canonical header. +pub fn generate_future_block_voting_proof( + vote: (u64, Payload, ValidatorSetId, &Keyring), +) -> FutureBlockVotingProof { + let signed_vote = signed_vote(vote.0, vote.1, vote.2, vote.3); + FutureBlockVotingProof { vote: signed_vote } +} -- GitLab From 282eaaa5f49749f68508752a993d6c79d64f6162 Mon Sep 17 00:00:00 2001 From: Ankan <10196091+Ank4n@users.noreply.github.com> Date: Wed, 3 Jul 2024 19:16:42 +0200 Subject: [PATCH 085/130] [Staking] Delegators can stake but stakers can't delegate (#4904) Related: https://github.com/paritytech/polkadot-sdk/pull/4804. Fixes the try state error in Westend: https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/6564522. Passes here: https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/6580393 ## Context Currently in Kusama and Polkadot, an account can do both, directly stake, and join a pool. With the migration of pools to `DelegateStake` (See https://github.com/paritytech/polkadot-sdk/pull/3905), the funds of pool members are locked in a different way than for direct stakers. - Pool member funds uses `holds`. - `pallet-staking` uses deprecated locks (analogous to freeze) which can overlap with holds. An existing delegator can stake directly since pallet-staking only uses free balance. But once an account becomes staker, we cannot allow them to be delegator as this risks an account to use already staked (frozen) funds in pools. When an account gets into a situation where it is participating in both pools and staking, it would no longer would be able to add any extra bond to the pool but they can still withdraw funds. ## Changes - Add test for the above scenario. - Removes the assumption that a delegator cannot be a staker. --- substrate/frame/delegated-staking/src/lib.rs | 4 -- .../frame/delegated-staking/src/tests.rs | 43 ++++++++++++++++++- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/substrate/frame/delegated-staking/src/lib.rs b/substrate/frame/delegated-staking/src/lib.rs index 4b924bce3a5..f16bb0d1dc0 100644 --- a/substrate/frame/delegated-staking/src/lib.rs +++ b/substrate/frame/delegated-staking/src/lib.rs @@ -823,10 +823,6 @@ impl Pallet { ) -> Result<(), sp_runtime::TryRuntimeError> { let mut delegation_aggregation = BTreeMap::>::new(); for (delegator, delegation) in delegations.iter() { - ensure!( - T::CoreStaking::status(delegator).is_err(), - "delegator should not be directly staked" - ); ensure!(!Self::is_agent(delegator), "delegator cannot be an agent"); delegation_aggregation diff --git a/substrate/frame/delegated-staking/src/tests.rs b/substrate/frame/delegated-staking/src/tests.rs index 2295f7d0c87..385bb17ddad 100644 --- a/substrate/frame/delegated-staking/src/tests.rs +++ b/substrate/frame/delegated-staking/src/tests.rs @@ -21,7 +21,7 @@ use super::*; use crate::mock::*; use frame_support::{assert_noop, assert_ok, traits::fungible::InspectHold}; use pallet_nomination_pools::{Error as PoolsError, Event as PoolsEvent}; -use pallet_staking::Error as StakingError; +use pallet_staking::{Error as StakingError, RewardDestination}; use sp_staking::{Agent, DelegationInterface, Delegator, StakerStatus}; #[test] @@ -337,7 +337,6 @@ fn apply_pending_slash() { /// Integration tests with pallet-staking. mod staking_integration { use super::*; - use pallet_staking::RewardDestination; use sp_staking::Stake; #[test] @@ -1217,6 +1216,46 @@ mod pool_integration { }); } + #[test] + fn existing_pool_member_can_stake() { + // A pool member is able to stake directly since staking only uses free funds but once a + // staker, they cannot join/add extra bond to the pool. They can still withdraw funds. + ExtBuilder::default().build_and_execute(|| { + start_era(1); + // GIVEN: a pool. + fund(&200, 1000); + let pool_id = create_pool(200, 800); + + // WHEN: delegator joins a pool + let delegator = 100; + fund(&delegator, 1000); + assert_ok!(Pools::join(RawOrigin::Signed(delegator).into(), 200, pool_id)); + + // THEN: they can still stake directly. + assert_ok!(Staking::bond( + RuntimeOrigin::signed(delegator), + 500, + RewardDestination::Account(101) + )); + assert_ok!(Staking::nominate( + RuntimeOrigin::signed(delegator), + vec![GENESIS_VALIDATOR] + )); + + // The delegator cannot add any extra bond to the pool anymore. + assert_noop!( + Pools::bond_extra(RawOrigin::Signed(delegator).into(), BondExtra::FreeBalance(100)), + Error::::AlreadyStaking + ); + + // But they can unbond + assert_ok!(Pools::unbond(RawOrigin::Signed(delegator).into(), delegator, 50)); + // and withdraw + start_era(4); + assert_ok!(Pools::withdraw_unbonded(RawOrigin::Signed(delegator).into(), delegator, 0)); + }); + } + fn create_pool(creator: AccountId, amount: Balance) -> u32 { fund(&creator, amount * 2); assert_ok!(Pools::create( -- GitLab From 60849232ff11be10aa3afaa5085503a9c19028bd Mon Sep 17 00:00:00 2001 From: Deepak Chaudhary <54492415+Aideepakchaudhary@users.noreply.github.com> Date: Thu, 4 Jul 2024 03:20:38 +0800 Subject: [PATCH 086/130] Remove pallet::getter usage from all pallet-tips (#4871) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### ISSUE Link to the issue: https://github.com/paritytech/polkadot-sdk/issues/3326 cc @muraca Deliverables - [Deprecation] remove pallet::getter usage from all pallet-tips ### Test Outcomes ___ Successful tests by running `cargo test -p pallet-tips --features runtime-benchmarks` running 26 tests test tests::__construct_runtime_integrity_test::runtime_integrity_tests ... ok test benchmarking::bench_retract_tip ... ok test tests::equal_entries_invariant ... ok test benchmarking::bench_tip ... ok test tests::finders_fee_invariant ... ok test tests::genesis_config_works ... ok test tests::genesis_funding_works ... ok test benchmarking::bench_slash_tip ... ok test tests::reasons_invariant ... ok test benchmarking::bench_report_awesome ... ok test tests::close_tip_works ... ok test tests::report_awesome_from_beneficiary_and_tip_works ... ok test tests::test_genesis_config_builds ... ok test tests::test_last_reward_migration ... ok test benchmarking::bench_tip_new ... ok test benchmarking::bench_close_tip ... ok test tests::test_migration_v4 ... ok test tests::slash_tip_works ... ok test tests::report_awesome_and_tip_works_second_instance ... ok test tests::report_awesome_and_tip_works ... ok test tests::tip_changing_works ... ok test tests::zero_base_deposit_prohibited - should panic ... ok test tests::tip_median_calculation_works ... ok test tests::tip_new_cannot_be_used_twice ... ok test tests::tip_large_should_fail ... ok test tests::retract_tip_works ... ok test result: ok. 26 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Doc-tests pallet_tips running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s --- Polkadot Address: 16htXkeVhfroBhL6nuqiwknfXKcT6WadJPZqEi2jRf9z4XPY --------- Co-authored-by: Bastian Köcher --- prdoc/pr_4871.prdoc | 14 ++++++++++++++ substrate/frame/tips/src/lib.rs | 14 ++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 prdoc/pr_4871.prdoc diff --git a/prdoc/pr_4871.prdoc b/prdoc/pr_4871.prdoc new file mode 100644 index 00000000000..6ff36f59d70 --- /dev/null +++ b/prdoc/pr_4871.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from the pallet-tips + +doc: + - audience: Runtime Dev + description: | + This PR removed `pallet::getter`s from `pallet-tips`s storage items. + When accessed inside the pallet, use the syntax `StorageItem::::get()`. + +crates: + - name: pallet-tips + bump: minor diff --git a/substrate/frame/tips/src/lib.rs b/substrate/frame/tips/src/lib.rs index e16ee041fcd..a75aed89d0b 100644 --- a/substrate/frame/tips/src/lib.rs +++ b/substrate/frame/tips/src/lib.rs @@ -180,7 +180,6 @@ pub mod pallet { /// This has the insecure enumerable hash function since the key itself is already /// guaranteed to be a secure hash. #[pallet::storage] - #[pallet::getter(fn tips)] pub type Tips, I: 'static = ()> = StorageMap< _, Twox64Concat, @@ -192,7 +191,6 @@ pub mod pallet { /// Simple preimage lookup from the reason's hash to the original data. Again, has an /// insecure enumerable hash since the key is guaranteed to be the result of a secure hash. #[pallet::storage] - #[pallet::getter(fn reasons)] pub type Reasons, I: 'static = ()> = StorageMap<_, Identity, T::Hash, Vec, OptionQuery>; @@ -492,6 +490,18 @@ pub mod pallet { impl, I: 'static> Pallet { // Add public immutables and private mutables. + /// Access tips storage from outside + pub fn tips( + hash: T::Hash, + ) -> Option, BlockNumberFor, T::Hash>> { + Tips::::get(hash) + } + + /// Access reasons storage from outside + pub fn reasons(hash: T::Hash) -> Option> { + Reasons::::get(hash) + } + /// The account ID of the treasury pot. /// /// This actually does computation. If you need to keep using it, then make sure you cache the -- GitLab From 51e98273d78ebd9c1f2b259c9d67e75780c0192a Mon Sep 17 00:00:00 2001 From: Axay Sagathiya Date: Thu, 4 Jul 2024 01:07:56 +0530 Subject: [PATCH 087/130] rename the candidate backing message from `GetBackedCandidates` to `GetBackableCandidates` (#4921) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Backable Candidate**: If a candidate receives enough supporting Statements from the Parachain Validators currently assigned, that candidate is considered backable. **Backed Candidate**: A Backable Candidate noted in a relay-chain block --- When the candidate backing subsystem receives the `GetBackedCandidates` message, it sends back **backable** candidates, not **backed** candidates. So we should rename this message to `GetBackableCandidates` Co-authored-by: Bastian Köcher --- polkadot/node/core/backing/src/lib.rs | 6 +++--- polkadot/node/core/backing/src/tests/mod.rs | 14 +++++++------- polkadot/node/core/provisioner/src/lib.rs | 2 +- polkadot/node/core/provisioner/src/tests.rs | 2 +- polkadot/node/overseer/src/tests.rs | 2 +- polkadot/node/subsystem-types/src/messages.rs | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/polkadot/node/core/backing/src/lib.rs b/polkadot/node/core/backing/src/lib.rs index 1bda81c5197..5bcd47a2434 100644 --- a/polkadot/node/core/backing/src/lib.rs +++ b/polkadot/node/core/backing/src/lib.rs @@ -827,8 +827,8 @@ async fn handle_communication( CandidateBackingMessage::Statement(relay_parent, statement) => { handle_statement_message(ctx, state, relay_parent, statement, metrics).await?; }, - CandidateBackingMessage::GetBackedCandidates(requested_candidates, tx) => - handle_get_backed_candidates_message(state, requested_candidates, tx, metrics)?, + CandidateBackingMessage::GetBackableCandidates(requested_candidates, tx) => + handle_get_backable_candidates_message(state, requested_candidates, tx, metrics)?, CandidateBackingMessage::CanSecond(request, tx) => handle_can_second_request(ctx, state, request, tx).await, } @@ -2158,7 +2158,7 @@ async fn handle_statement_message( } } -fn handle_get_backed_candidates_message( +fn handle_get_backable_candidates_message( state: &State, requested_candidates: HashMap>, tx: oneshot::Sender>>, diff --git a/polkadot/node/core/backing/src/tests/mod.rs b/polkadot/node/core/backing/src/tests/mod.rs index 5f2bc7e1842..10eb45b82d1 100644 --- a/polkadot/node/core/backing/src/tests/mod.rs +++ b/polkadot/node/core/backing/src/tests/mod.rs @@ -703,7 +703,7 @@ fn backing_works(#[case] elastic_scaling_mvp: bool) { virtual_overseer.send(FromOrchestra::Communication { msg: statement }).await; let (tx, rx) = oneshot::channel(); - let msg = CandidateBackingMessage::GetBackedCandidates( + let msg = CandidateBackingMessage::GetBackableCandidates( std::iter::once(( test_state.chain_ids[0], vec![(candidate_a_hash, test_state.relay_parent)], @@ -895,7 +895,7 @@ fn get_backed_candidate_preserves_order() { // Happy case, all candidates should be present. let (tx, rx) = oneshot::channel(); - let msg = CandidateBackingMessage::GetBackedCandidates( + let msg = CandidateBackingMessage::GetBackableCandidates( [ ( test_state.chain_ids[0], @@ -946,7 +946,7 @@ fn get_backed_candidate_preserves_order() { ], ] { let (tx, rx) = oneshot::channel(); - let msg = CandidateBackingMessage::GetBackedCandidates( + let msg = CandidateBackingMessage::GetBackableCandidates( [ (test_state.chain_ids[0], candidates), (test_state.chain_ids[1], vec![(candidate_c_hash, test_state.relay_parent)]), @@ -985,7 +985,7 @@ fn get_backed_candidate_preserves_order() { ], ] { let (tx, rx) = oneshot::channel(); - let msg = CandidateBackingMessage::GetBackedCandidates( + let msg = CandidateBackingMessage::GetBackableCandidates( [ (test_state.chain_ids[0], candidates), (test_state.chain_ids[1], vec![(candidate_c_hash, test_state.relay_parent)]), @@ -1030,7 +1030,7 @@ fn get_backed_candidate_preserves_order() { ], ] { let (tx, rx) = oneshot::channel(); - let msg = CandidateBackingMessage::GetBackedCandidates( + let msg = CandidateBackingMessage::GetBackableCandidates( [ (test_state.chain_ids[0], candidates), (test_state.chain_ids[1], vec![(candidate_c_hash, test_state.relay_parent)]), @@ -1321,7 +1321,7 @@ fn backing_works_while_validation_ongoing() { virtual_overseer.send(FromOrchestra::Communication { msg: statement }).await; let (tx, rx) = oneshot::channel(); - let msg = CandidateBackingMessage::GetBackedCandidates( + let msg = CandidateBackingMessage::GetBackableCandidates( std::iter::once(( test_state.chain_ids[0], vec![(candidate_a.hash(), test_state.relay_parent)], @@ -1942,7 +1942,7 @@ fn backing_works_after_failed_validation() { // Try to get a set of backable candidates to trigger _some_ action in the subsystem // and check that it is still alive. let (tx, rx) = oneshot::channel(); - let msg = CandidateBackingMessage::GetBackedCandidates( + let msg = CandidateBackingMessage::GetBackableCandidates( std::iter::once(( test_state.chain_ids[0], vec![(candidate.hash(), test_state.relay_parent)], diff --git a/polkadot/node/core/provisioner/src/lib.rs b/polkadot/node/core/provisioner/src/lib.rs index fa16b38d28b..3f622a60a05 100644 --- a/polkadot/node/core/provisioner/src/lib.rs +++ b/polkadot/node/core/provisioner/src/lib.rs @@ -822,7 +822,7 @@ async fn select_candidates( // now get the backed candidates corresponding to these candidate receipts let (tx, rx) = oneshot::channel(); - sender.send_unbounded_message(CandidateBackingMessage::GetBackedCandidates( + sender.send_unbounded_message(CandidateBackingMessage::GetBackableCandidates( selected_candidates.clone(), tx, )); diff --git a/polkadot/node/core/provisioner/src/tests.rs b/polkadot/node/core/provisioner/src/tests.rs index 0d3675777cb..b38459302c8 100644 --- a/polkadot/node/core/provisioner/src/tests.rs +++ b/polkadot/node/core/provisioner/src/tests.rs @@ -578,7 +578,7 @@ mod select_candidates { )) => tx.send(Ok(Some(Default::default()))).unwrap(), AllMessages::RuntimeApi(Request(_parent_hash, AvailabilityCores(tx))) => tx.send(Ok(mock_availability_cores.clone())).unwrap(), - AllMessages::CandidateBacking(CandidateBackingMessage::GetBackedCandidates( + AllMessages::CandidateBacking(CandidateBackingMessage::GetBackableCandidates( hashes, sender, )) => { diff --git a/polkadot/node/overseer/src/tests.rs b/polkadot/node/overseer/src/tests.rs index 177e3addf36..8e78d8fc892 100644 --- a/polkadot/node/overseer/src/tests.rs +++ b/polkadot/node/overseer/src/tests.rs @@ -813,7 +813,7 @@ fn test_candidate_validation_msg() -> CandidateValidationMessage { fn test_candidate_backing_msg() -> CandidateBackingMessage { let (sender, _) = oneshot::channel(); - CandidateBackingMessage::GetBackedCandidates(Default::default(), sender) + CandidateBackingMessage::GetBackableCandidates(Default::default(), sender) } fn test_chain_api_msg() -> ChainApiMessage { diff --git a/polkadot/node/subsystem-types/src/messages.rs b/polkadot/node/subsystem-types/src/messages.rs index 722a97989bc..ee937bca05b 100644 --- a/polkadot/node/subsystem-types/src/messages.rs +++ b/polkadot/node/subsystem-types/src/messages.rs @@ -85,7 +85,7 @@ pub enum CandidateBackingMessage { /// candidates of the same para that follow it in the input vector. In other words, assuming /// candidates are supplied in dependency order, we must ensure that this dependency order is /// preserved. - GetBackedCandidates( + GetBackableCandidates( HashMap>, oneshot::Sender>>, ), -- GitLab From 924728cf19523f826a08e1c0eeee711ca3bb8ee7 Mon Sep 17 00:00:00 2001 From: "polka.dom" Date: Wed, 3 Jul 2024 13:53:09 -0700 Subject: [PATCH 088/130] Remove getter macro from pallet-insecure-randomness-collective-flip (#4839) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As per #3326, removes pallet::getter macro usage from the pallet-insecure-randomness-collective-flip. The syntax `StorageItem::::get()` should be used instead. Explicitly implements the getters that were removed as well, following #223 Also makes the storage values public and converts some syntax to turbo cc @muraca --------- Co-authored-by: Bastian Köcher Co-authored-by: Oliver Tale-Yazdi --- prdoc/pr_4839.prdoc | 14 ++++++++++ .../README.md | 2 +- .../src/lib.rs | 28 +++++++++++-------- 3 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 prdoc/pr_4839.prdoc diff --git a/prdoc/pr_4839.prdoc b/prdoc/pr_4839.prdoc new file mode 100644 index 00000000000..84bb393d4c4 --- /dev/null +++ b/prdoc/pr_4839.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from pallet-insecure-randomness-collective-flip + +doc: + - audience: Runtime Dev + description: | + This PR removed the `pallet::getter`s from `pallet-insecure-randomness-collective-flip`. + The syntax `StorageItem::::get()` should be used instead. + +crates: + - name: pallet-insecure-randomness-collective-flip + bump: patch diff --git a/substrate/frame/insecure-randomness-collective-flip/README.md b/substrate/frame/insecure-randomness-collective-flip/README.md index 4f02782fa65..fc38367bf55 100644 --- a/substrate/frame/insecure-randomness-collective-flip/README.md +++ b/substrate/frame/insecure-randomness-collective-flip/README.md @@ -44,7 +44,7 @@ pub mod pallet { impl Pallet { #[pallet::weight(0)] pub fn random_module_example(origin: OriginFor) -> DispatchResult { - let _random_value = >::random(&b"my context"[..]); + let _random_value = pallet_insecure_randomness_collective_flip::Pallet::::random(&b"my context"[..]); Ok(()) } } diff --git a/substrate/frame/insecure-randomness-collective-flip/src/lib.rs b/substrate/frame/insecure-randomness-collective-flip/src/lib.rs index bdb089a1420..b605b4d0858 100644 --- a/substrate/frame/insecure-randomness-collective-flip/src/lib.rs +++ b/substrate/frame/insecure-randomness-collective-flip/src/lib.rs @@ -60,7 +60,7 @@ //! impl Pallet { //! #[pallet::weight(0)] //! pub fn random_module_example(origin: OriginFor) -> DispatchResult { -//! let _random_value = >::random(&b"my context"[..]); +//! let _random_value = pallet_insecure_randomness_collective_flip::Pallet::::random(&b"my context"[..]); //! Ok(()) //! } //! } @@ -101,9 +101,9 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(block_number: BlockNumberFor) -> Weight { - let parent_hash = >::parent_hash(); + let parent_hash = frame_system::Pallet::::parent_hash(); - >::mutate(|ref mut values| { + RandomMaterial::::mutate(|ref mut values| { if values.try_push(parent_hash).is_err() { let index = block_number_to_index::(block_number); values[index] = parent_hash; @@ -118,9 +118,15 @@ pub mod pallet { /// is arranged as a ring buffer with `block_number % 81` being the index into the `Vec` of /// the oldest hash. #[pallet::storage] - #[pallet::getter(fn random_material)] - pub(super) type RandomMaterial = + pub type RandomMaterial = StorageValue<_, BoundedVec>, ValueQuery>; + + impl Pallet { + /// Gets the random material storage value + pub fn random_material() -> BoundedVec> { + RandomMaterial::::get() + } + } } impl Randomness> for Pallet { @@ -135,10 +141,10 @@ impl Randomness> for Pallet { /// and mean that all bits of the resulting value are entirely manipulatable by the author of /// the parent block, who can determine the value of `parent_hash`. fn random(subject: &[u8]) -> (T::Hash, BlockNumberFor) { - let block_number = >::block_number(); + let block_number = frame_system::Pallet::::block_number(); let index = block_number_to_index::(block_number); - let hash_series = >::get(); + let hash_series = RandomMaterial::::get(); let seed = if !hash_series.is_empty() { // Always the case after block 1 is initialized. hash_series @@ -226,7 +232,7 @@ mod tests { setup_blocks(38); - let random_material = CollectiveFlip::random_material(); + let random_material = RandomMaterial::::get(); assert_eq!(random_material.len(), 38); assert_eq!(random_material[0], genesis_hash); @@ -240,7 +246,7 @@ mod tests { setup_blocks(81); - let random_material = CollectiveFlip::random_material(); + let random_material = RandomMaterial::::get(); assert_eq!(random_material.len(), 81); assert_ne!(random_material[0], random_material[1]); @@ -255,7 +261,7 @@ mod tests { setup_blocks(162); - let random_material = CollectiveFlip::random_material(); + let random_material = RandomMaterial::::get(); assert_eq!(random_material.len(), 81); assert_ne!(random_material[0], random_material[1]); @@ -276,7 +282,7 @@ mod tests { assert_eq!(known_since, 162 - RANDOM_MATERIAL_LEN as u64); assert_ne!(random, H256::zero()); - assert!(!CollectiveFlip::random_material().contains(&random)); + assert!(!RandomMaterial::::get().contains(&random)); }); } } -- GitLab From e44f61af440316f4050f69df024fe964ffcd9346 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Fri, 5 Jul 2024 11:00:51 +0200 Subject: [PATCH 089/130] Introduce basic slot-based collator (#4097) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part of #3168 On top of #3568 ### Changes Overview - Introduces a new collator variant in `cumulus/client/consensus/aura/src/collators/slot_based/mod.rs` - Two tasks are part of that module, one for block building and one for collation building and submission. - Introduces a new variant of `cumulus-test-runtime` which has 2s slot duration, used for zombienet testing - Zombienet tests for the new collator **Note:** This collator is considered experimental and should only be used for testing and exploration for now. ### Comparison with `lookahead` collator - The new variant is slot based, meaning it waits for the next slot of the parachain, then starts authoring - The search for potential parents remains mostly unchanged from lookahead - As anchor, we use the current best relay parent - In general, the new collator tends to be anchored to one relay parent earlier. `lookahead` generally waits for a new relay block to arrive before it attempts to build a block. This means the actual timing of parachain blocks depends on when the relay block has been authored and imported. With the slot-triggered approach we are authoring directly on the slot boundary, were a new relay chain block has probably not yet arrived. ### Limitations - Overall, the current implementation focuses on the "happy path" - We assume that we want to collate close to the tip of the relay chain. It would be useful however to have some kind of configurable drift, so that we could lag behind a bit. https://github.com/paritytech/polkadot-sdk/issues/3965 - The collation task is pretty dumb currently. It checks if we have cores scheduled and if yes, submits all the messages we have received from the block builder until we have something submitted for every core. Ideally we should do some extra checks, i.e. we do not need to submit if the built block is already too old (build on a out of range relay parent) or was authored with a relay parent that is not an ancestor of the relay block we are submitting at. https://github.com/paritytech/polkadot-sdk/issues/3966 - There is no throttling, we assume that we can submit _velocity_ blocks every relay chain block. There should be communication between the collator task and block-builder task. - The parent search and ConsensusHook are not yet properly adjusted. The parent search makes assumptions about the pending candidate which no longer hold. https://github.com/paritytech/polkadot-sdk/issues/3967 - Custom triggers for block building not implemented. --------- Co-authored-by: Davide Galassi Co-authored-by: Andrei Sandu <54316454+sandreim@users.noreply.github.com> Co-authored-by: Bastian Köcher Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> Co-authored-by: command-bot <> --- .gitlab/pipeline/zombienet/cumulus.yml | 24 + Cargo.lock | 12 +- cumulus/client/consensus/aura/Cargo.toml | 2 + cumulus/client/consensus/aura/src/collator.rs | 64 ++- .../consensus/aura/src/collators/basic.rs | 10 +- .../consensus/aura/src/collators/lookahead.rs | 220 +------- .../consensus/aura/src/collators/mod.rs | 182 ++++++- .../slot_based/block_builder_task.rs | 491 ++++++++++++++++++ .../collators/slot_based/collation_task.rs | 140 +++++ .../aura/src/collators/slot_based/mod.rs | 178 +++++++ cumulus/client/consensus/common/src/lib.rs | 202 +------ .../common/src/parachain_consensus.rs | 105 ++-- .../consensus/common/src/parent_search.rs | 418 +++++++++++++++ cumulus/client/consensus/common/src/tests.rs | 373 ++++++++++++- cumulus/client/network/src/tests.rs | 14 +- cumulus/client/parachain-inherent/Cargo.toml | 1 - cumulus/client/pov-recovery/src/tests.rs | 11 +- .../src/lib.rs | 13 +- .../client/relay-chain-interface/src/lib.rs | 19 +- .../relay-chain-minimal-node/Cargo.toml | 7 - .../relay-chain-rpc-interface/src/lib.rs | 9 +- .../pallets/aura-ext/src/consensus_hook.rs | 21 +- cumulus/pallets/aura-ext/src/lib.rs | 2 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- cumulus/polkadot-parachain/src/cli.rs | 6 + cumulus/polkadot-parachain/src/command.rs | 38 +- cumulus/polkadot-parachain/src/service.rs | 137 ++++- cumulus/test/client/src/lib.rs | 1 + cumulus/test/runtime/Cargo.toml | 1 + cumulus/test/runtime/build.rs | 7 + cumulus/test/runtime/src/lib.rs | 26 +- cumulus/test/service/Cargo.toml | 3 - cumulus/test/service/src/chain_spec.rs | 19 +- cumulus/test/service/src/cli.rs | 18 +- cumulus/test/service/src/lib.rs | 117 +++-- cumulus/test/service/src/main.rs | 2 + .../tests/0003-full_node_catching_up.zndsl | 3 + .../0006-rpc_collator_builds_blocks.zndsl | 4 + .../tests/0008-elastic_authoring.toml | 50 ++ .../tests/0008-elastic_authoring.zndsl | 19 + .../tests/0009-elastic_pov_recovery.toml | 48 ++ .../tests/0009-elastic_pov_recovery.zndsl | 19 + cumulus/zombienet/tests/assign-core.js | 46 ++ .../0001-basic-3cores-6s-blocks.toml | 4 +- prdoc/pr_4097.prdoc | 45 ++ .../basic-authorship/src/basic_authorship.rs | 6 +- .../client/consensus/aura/src/standalone.rs | 6 +- substrate/client/consensus/slots/src/lib.rs | 2 +- templates/parachain/node/src/service.rs | 12 +- 49 files changed, 2554 insertions(+), 605 deletions(-) create mode 100644 cumulus/client/consensus/aura/src/collators/slot_based/block_builder_task.rs create mode 100644 cumulus/client/consensus/aura/src/collators/slot_based/collation_task.rs create mode 100644 cumulus/client/consensus/aura/src/collators/slot_based/mod.rs create mode 100644 cumulus/client/consensus/common/src/parent_search.rs create mode 100644 cumulus/zombienet/tests/0008-elastic_authoring.toml create mode 100644 cumulus/zombienet/tests/0008-elastic_authoring.zndsl create mode 100644 cumulus/zombienet/tests/0009-elastic_pov_recovery.toml create mode 100644 cumulus/zombienet/tests/0009-elastic_pov_recovery.zndsl create mode 100644 cumulus/zombienet/tests/assign-core.js create mode 100644 prdoc/pr_4097.prdoc diff --git a/.gitlab/pipeline/zombienet/cumulus.yml b/.gitlab/pipeline/zombienet/cumulus.yml index a7f321505ba..6e2b53fae61 100644 --- a/.gitlab/pipeline/zombienet/cumulus.yml +++ b/.gitlab/pipeline/zombienet/cumulus.yml @@ -149,3 +149,27 @@ zombienet-cumulus-0007-full_node_warp_sync: --local-dir="${LOCAL_DIR}" --concurrency=1 --test="0007-full_node_warp_sync.zndsl" + +zombienet-cumulus-0008-elastic_authoring: + extends: + - .zombienet-cumulus-common + - .zombienet-refs + - .zombienet-before-script + - .zombienet-after-script + script: + - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh + --local-dir="${LOCAL_DIR}" + --concurrency=1 + --test="0008-elastic_authoring.zndsl" + +zombienet-cumulus-0009-elastic_pov_recovery: + extends: + - .zombienet-cumulus-common + - .zombienet-refs + - .zombienet-before-script + - .zombienet-after-script + script: + - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh + --local-dir="${LOCAL_DIR}" + --concurrency=1 + --test="0009-elastic_pov_recovery.zndsl" diff --git a/Cargo.lock b/Cargo.lock index 7b08e96f4bb..f3808b7eaa5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3772,6 +3772,7 @@ dependencies = [ "sc-consensus-babe", "sc-consensus-slots", "sc-telemetry", + "sc-utils", "schnellru", "sp-api", "sp-application-crypto", @@ -3786,6 +3787,7 @@ dependencies = [ "sp-state-machine", "sp-timestamp", "substrate-prometheus-endpoint", + "tokio", "tracing", ] @@ -3906,7 +3908,6 @@ dependencies = [ "cumulus-test-relay-sproof-builder", "parity-scale-codec", "sc-client-api", - "scale-info", "sp-api", "sp-crypto-hashing", "sp-inherents", @@ -4333,15 +4334,8 @@ dependencies = [ "cumulus-relay-chain-interface", "cumulus-relay-chain-rpc-interface", "futures", - "parking_lot 0.12.3", - "polkadot-availability-recovery", - "polkadot-collator-protocol", "polkadot-core-primitives", "polkadot-network-bridge", - "polkadot-node-collation-generation", - "polkadot-node-core-chain-api", - "polkadot-node-core-prospective-parachains", - "polkadot-node-core-runtime-api", "polkadot-node-network-protocol", "polkadot-node-subsystem-util", "polkadot-overseer", @@ -4535,7 +4529,6 @@ dependencies = [ "polkadot-test-service", "portpicker", "rand", - "rococo-parachain-runtime", "sc-basic-authorship", "sc-block-builder", "sc-chain-spec", @@ -4560,7 +4553,6 @@ dependencies = [ "sp-blockchain", "sp-consensus", "sp-consensus-aura", - "sp-consensus-grandpa", "sp-core", "sp-io", "sp-keyring", diff --git a/cumulus/client/consensus/aura/Cargo.toml b/cumulus/client/consensus/aura/Cargo.toml index 5ab3e6f2512..01e07cb395a 100644 --- a/cumulus/client/consensus/aura/Cargo.toml +++ b/cumulus/client/consensus/aura/Cargo.toml @@ -16,6 +16,7 @@ futures = { workspace = true } parking_lot = { workspace = true } tracing = { workspace = true, default-features = true } schnellru = { workspace = true } +tokio = { workspace = true, features = ["macros"] } # Substrate sc-client-api = { workspace = true, default-features = true } @@ -23,6 +24,7 @@ sc-consensus = { workspace = true, default-features = true } sc-consensus-aura = { workspace = true, default-features = true } sc-consensus-babe = { workspace = true, default-features = true } sc-consensus-slots = { workspace = true, default-features = true } +sc-utils = { workspace = true, default-features = true } sc-telemetry = { workspace = true, default-features = true } sp-api = { workspace = true, default-features = true } sp-application-crypto = { workspace = true, default-features = true } diff --git a/cumulus/client/consensus/aura/src/collator.rs b/cumulus/client/consensus/aura/src/collator.rs index 776052215d9..dc830e463a4 100644 --- a/cumulus/client/consensus/aura/src/collator.rs +++ b/cumulus/client/consensus/aura/src/collator.rs @@ -156,15 +156,8 @@ where Ok((paras_inherent_data, other_inherent_data)) } - /// Propose, seal, and import a block, packaging it into a collation. - /// - /// Provide the slot to build at as well as any other necessary pre-digest logs, - /// the inherent data, and the proposal duration and PoV size limits. - /// - /// The Aura pre-digest should not be explicitly provided and is set internally. - /// - /// This does not announce the collation to the parachain network or the relay chain. - pub async fn collate( + /// Build and import a parachain block on the given parent header, using the given slot claim. + pub async fn build_block_and_import( &mut self, parent_header: &Block::Header, slot_claim: &SlotClaim, @@ -172,10 +165,7 @@ where inherent_data: (ParachainInherentData, InherentData), proposal_duration: Duration, max_pov_size: usize, - ) -> Result< - Option<(Collation, ParachainBlockData, Block::Hash)>, - Box, - > { + ) -> Result>, Box> { let mut digest = additional_pre_digest.into().unwrap_or_default(); digest.push(slot_claim.pre_digest.clone()); @@ -205,7 +195,6 @@ where ) .map_err(|e| e as Box)?; - let post_hash = sealed_importable.post_hash(); let block = Block::new( sealed_importable.post_header(), sealed_importable @@ -220,11 +209,46 @@ where .map_err(|e| Box::new(e) as Box) .await?; - if let Some((collation, block_data)) = self.collator_service.build_collation( - parent_header, - post_hash, - ParachainCandidate { block, proof: proposal.proof }, - ) { + Ok(Some(ParachainCandidate { block, proof: proposal.proof })) + } + + /// Propose, seal, import a block and packaging it into a collation. + /// + /// Provide the slot to build at as well as any other necessary pre-digest logs, + /// the inherent data, and the proposal duration and PoV size limits. + /// + /// The Aura pre-digest should not be explicitly provided and is set internally. + /// + /// This does not announce the collation to the parachain network or the relay chain. + pub async fn collate( + &mut self, + parent_header: &Block::Header, + slot_claim: &SlotClaim, + additional_pre_digest: impl Into>>, + inherent_data: (ParachainInherentData, InherentData), + proposal_duration: Duration, + max_pov_size: usize, + ) -> Result< + Option<(Collation, ParachainBlockData, Block::Hash)>, + Box, + > { + let maybe_candidate = self + .build_block_and_import( + parent_header, + slot_claim, + additional_pre_digest, + inherent_data, + proposal_duration, + max_pov_size, + ) + .await?; + + let Some(candidate) = maybe_candidate else { return Ok(None) }; + + let hash = candidate.block.header().hash(); + if let Some((collation, block_data)) = + self.collator_service.build_collation(parent_header, hash, candidate) + { tracing::info!( target: crate::LOG_TARGET, "PoV size {{ header: {}kb, extrinsics: {}kb, storage_proof: {}kb }}", @@ -241,7 +265,7 @@ where ); } - Ok(Some((collation, block_data, post_hash))) + Ok(Some((collation, block_data, hash))) } else { Err(Box::::from("Unable to produce collation") as Box) diff --git a/cumulus/client/consensus/aura/src/collators/basic.rs b/cumulus/client/consensus/aura/src/collators/basic.rs index 1047c6219ad..4efd50a04ec 100644 --- a/cumulus/client/consensus/aura/src/collators/basic.rs +++ b/cumulus/client/consensus/aura/src/collators/basic.rs @@ -41,7 +41,6 @@ use sc_consensus::BlockImport; use sp_api::{CallApiAt, ProvideRuntimeApi}; use sp_application_crypto::AppPublic; use sp_blockchain::HeaderBackend; -use sp_consensus::SyncOracle; use sp_consensus_aura::AuraApi; use sp_core::crypto::Pair; use sp_inherents::CreateInherentDataProviders; @@ -53,7 +52,7 @@ use std::{sync::Arc, time::Duration}; use crate::collator as collator_util; /// Parameters for [`run`]. -pub struct Params { +pub struct Params { /// Inherent data providers. Only non-consensus inherent data should be provided, i.e. /// the timestamp, slot, and paras inherents should be omitted, as they are set by this /// collator. @@ -64,8 +63,6 @@ pub struct Params { pub para_client: Arc, /// A handle to the relay-chain client. pub relay_client: RClient, - /// A chain synchronization oracle. - pub sync_oracle: SO, /// The underlying keystore, which should contain Aura consensus keys. pub keystore: KeystorePtr, /// The collator key used to sign collations before submitting to validators. @@ -89,8 +86,8 @@ pub struct Params { } /// Run bare Aura consensus as a relay-chain-driven collator. -pub fn run( - params: Params, +pub fn run( + params: Params, ) -> impl Future + Send + 'static where Block: BlockT + Send, @@ -108,7 +105,6 @@ where CIDP: CreateInherentDataProviders + Send + 'static, CIDP::InherentDataProviders: Send, BI: BlockImport + ParachainBlockImportMarker + Send + Sync + 'static, - SO: SyncOracle + Send + Sync + Clone + 'static, Proposer: ProposerInterface + Send + Sync + 'static, CS: CollatorServiceInterface + Send + Sync + 'static, P: Pair, diff --git a/cumulus/client/consensus/aura/src/collators/lookahead.rs b/cumulus/client/consensus/aura/src/collators/lookahead.rs index b6f7b07f55d..749b1311239 100644 --- a/cumulus/client/consensus/aura/src/collators/lookahead.rs +++ b/cumulus/client/consensus/aura/src/collators/lookahead.rs @@ -33,46 +33,34 @@ use codec::{Codec, Encode}; use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface; -use cumulus_client_consensus_common::{ - self as consensus_common, load_abridged_host_configuration, ParachainBlockImportMarker, - ParentSearchParams, -}; +use cumulus_client_consensus_common::{self as consensus_common, ParachainBlockImportMarker}; use cumulus_client_consensus_proposer::ProposerInterface; use cumulus_primitives_aura::AuraUnincludedSegmentApi; -use cumulus_primitives_core::{ - relay_chain::Hash as PHash, CollectCollationInfo, PersistedValidationData, -}; +use cumulus_primitives_core::{CollectCollationInfo, PersistedValidationData}; use cumulus_relay_chain_interface::RelayChainInterface; use polkadot_node_primitives::SubmitCollationParams; -use polkadot_node_subsystem::messages::{ - CollationGenerationMessage, RuntimeApiMessage, RuntimeApiRequest, -}; +use polkadot_node_subsystem::messages::CollationGenerationMessage; use polkadot_overseer::Handle as OverseerHandle; -use polkadot_primitives::{ - AsyncBackingParams, CollatorPair, CoreIndex, CoreState, Id as ParaId, OccupiedCoreAssumption, -}; +use polkadot_primitives::{CollatorPair, Id as ParaId, OccupiedCoreAssumption}; -use futures::{channel::oneshot, prelude::*}; +use futures::prelude::*; use sc_client_api::{backend::AuxStore, BlockBackend, BlockOf}; use sc_consensus::BlockImport; -use sc_consensus_aura::standalone as aura_internal; use sp_api::ProvideRuntimeApi; use sp_application_crypto::AppPublic; use sp_blockchain::HeaderBackend; -use sp_consensus::SyncOracle; use sp_consensus_aura::{AuraApi, Slot}; use sp_core::crypto::Pair; use sp_inherents::CreateInherentDataProviders; use sp_keystore::KeystorePtr; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Member}; -use sp_timestamp::Timestamp; use std::{sync::Arc, time::Duration}; -use crate::collator::{self as collator_util, SlotClaim}; +use crate::collator::{self as collator_util}; /// Parameters for [`run`]. -pub struct Params { +pub struct Params { /// Inherent data providers. Only non-consensus inherent data should be provided, i.e. /// the timestamp, slot, and paras inherents should be omitted, as they are set by this /// collator. @@ -87,8 +75,6 @@ pub struct Params { pub relay_client: RClient, /// A validation code hash provider, used to get the current validation code hash. pub code_hash_provider: CHP, - /// A chain synchronization oracle. - pub sync_oracle: SO, /// The underlying keystore, which should contain Aura consensus keys. pub keystore: KeystorePtr, /// The collator key used to sign collations before submitting to validators. @@ -110,8 +96,8 @@ pub struct Params { } /// Run async-backing-friendly Aura. -pub fn run( - mut params: Params, +pub fn run( + mut params: Params, ) -> impl Future + Send + 'static where Block: BlockT, @@ -130,7 +116,6 @@ where CIDP: CreateInherentDataProviders + 'static, CIDP::InherentDataProviders: Send, BI: BlockImport + ParachainBlockImportMarker + Send + Sync + 'static, - SO: SyncOracle + Send + Sync + Clone + 'static, Proposer: ProposerInterface + Send + Sync + 'static, CS: CollatorServiceInterface + Send + Sync + 'static, CHP: consensus_common::ValidationCodeHashProvider + Send + 'static, @@ -138,14 +123,6 @@ where P::Public: AppPublic + Member + Codec, P::Signature: TryFrom> + Member + Codec, { - // This is an arbitrary value which is likely guaranteed to exceed any reasonable - // limit, as it would correspond to 10 non-included blocks. - // - // Since we only search for parent blocks which have already been imported, - // we can guarantee that all imported blocks respect the unincluded segment - // rules specified by the parachain's runtime and thus will never be too deep. - const PARENT_SEARCH_DEPTH: usize = 10; - async move { cumulus_client_collator::initialize_collator_subsystems( &mut params.overseer_handle, @@ -186,12 +163,9 @@ where while let Some(relay_parent_header) = import_notifications.next().await { let relay_parent = relay_parent_header.hash(); - // TODO: Currently we use just the first core here, but for elastic scaling - // we iterate and build on all of the cores returned. - let core_index = if let Some(core_index) = cores_scheduled_for_para( + let core_index = if let Some(core_index) = super::cores_scheduled_for_para( relay_parent, params.para_id, - &mut params.overseer_handle, &mut params.relay_client, ) .await @@ -226,42 +200,16 @@ where }, }; - let parent_search_params = ParentSearchParams { + let (included_block, initial_parent) = match crate::collators::find_parent( relay_parent, - para_id: params.para_id, - ancestry_lookback: async_backing_params(relay_parent, ¶ms.relay_client) - .await - .map(|c| c.allowed_ancestry_len as usize) - .unwrap_or(0), - max_depth: PARENT_SEARCH_DEPTH, - ignore_alternative_branches: true, - }; - - let potential_parents = - cumulus_client_consensus_common::find_potential_parents::( - parent_search_params, - &*params.para_backend, - ¶ms.relay_client, - ) - .await; - - let mut potential_parents = match potential_parents { - Err(e) => { - tracing::error!( - target: crate::LOG_TARGET, - ?relay_parent, - err = ?e, - "Could not fetch potential parents to build upon" - ); - - continue - }, - Ok(x) => x, - }; - - let included_block = match potential_parents.iter().find(|x| x.depth == 0) { - None => continue, // also serves as an `is_empty` check. - Some(b) => b.hash, + params.para_id, + &*params.para_backend, + ¶ms.relay_client, + ) + .await + { + Some(value) => value, + None => continue, }; let para_client = &*params.para_client; @@ -292,7 +240,7 @@ where relay_chain_slot_duration = ?params.relay_chain_slot_duration, "Adjusted relay-chain slot to parachain slot" ); - Some(can_build_upon::<_, _, P>( + Some(super::can_build_upon::<_, _, P>( slot_now, timestamp, block_hash, @@ -302,13 +250,6 @@ where )) }; - // Sort by depth, ascending, to choose the longest chain. - // - // If the longest chain has space, build upon that. Otherwise, don't - // build at all. - potential_parents.sort_by_key(|a| a.depth); - let Some(initial_parent) = potential_parents.pop() else { continue }; - // Build in a loop until not allowed. Note that the authorities can change // at any block, so we need to re-claim our slot every time. let mut parent_hash = initial_parent.hash; @@ -435,124 +376,3 @@ where } } } - -// Checks if we own the slot at the given block and whether there -// is space in the unincluded segment. -async fn can_build_upon( - slot: Slot, - timestamp: Timestamp, - parent_hash: Block::Hash, - included_block: Block::Hash, - client: &Client, - keystore: &KeystorePtr, -) -> Option> -where - Client: ProvideRuntimeApi, - Client::Api: AuraApi + AuraUnincludedSegmentApi, - P: Pair, - P::Public: Codec, - P::Signature: Codec, -{ - let runtime_api = client.runtime_api(); - let authorities = runtime_api.authorities(parent_hash).ok()?; - let author_pub = aura_internal::claim_slot::

    (slot, &authorities, keystore).await?; - - // Here we lean on the property that building on an empty unincluded segment must always - // be legal. Skipping the runtime API query here allows us to seamlessly run this - // collator against chains which have not yet upgraded their runtime. - if parent_hash != included_block { - if !runtime_api.can_build_upon(parent_hash, included_block, slot).ok()? { - return None - } - } - - Some(SlotClaim::unchecked::

    (author_pub, slot, timestamp)) -} - -/// Reads async backing parameters from the relay chain storage at the given relay parent. -async fn async_backing_params( - relay_parent: PHash, - relay_client: &impl RelayChainInterface, -) -> Option { - match load_abridged_host_configuration(relay_parent, relay_client).await { - Ok(Some(config)) => Some(config.async_backing_params), - Ok(None) => { - tracing::error!( - target: crate::LOG_TARGET, - "Active config is missing in relay chain storage", - ); - None - }, - Err(err) => { - tracing::error!( - target: crate::LOG_TARGET, - ?err, - ?relay_parent, - "Failed to read active config from relay chain client", - ); - None - }, - } -} - -// Return all the cores assigned to the para at the provided relay parent. -async fn cores_scheduled_for_para( - relay_parent: PHash, - para_id: ParaId, - overseer_handle: &mut OverseerHandle, - relay_client: &impl RelayChainInterface, -) -> Vec { - // Get `AvailabilityCores` from runtime - let (tx, rx) = oneshot::channel(); - let request = RuntimeApiRequest::AvailabilityCores(tx); - overseer_handle - .send_msg(RuntimeApiMessage::Request(relay_parent, request), "LookaheadCollator") - .await; - - let cores = match rx.await { - Ok(Ok(cores)) => cores, - Ok(Err(error)) => { - tracing::error!( - target: crate::LOG_TARGET, - ?error, - ?relay_parent, - "Failed to query availability cores runtime API", - ); - return Vec::new() - }, - Err(oneshot::Canceled) => { - tracing::error!( - target: crate::LOG_TARGET, - ?relay_parent, - "Sender for availability cores runtime request dropped", - ); - return Vec::new() - }, - }; - - let max_candidate_depth = async_backing_params(relay_parent, relay_client) - .await - .map(|c| c.max_candidate_depth) - .unwrap_or(0); - - cores - .iter() - .enumerate() - .filter_map(|(index, core)| { - let core_para_id = match core { - CoreState::Scheduled(scheduled_core) => Some(scheduled_core.para_id), - CoreState::Occupied(occupied_core) if max_candidate_depth >= 1 => occupied_core - .next_up_on_available - .as_ref() - .map(|scheduled_core| scheduled_core.para_id), - CoreState::Free | CoreState::Occupied(_) => None, - }; - - if core_para_id == Some(para_id) { - Some(CoreIndex(index as u32)) - } else { - None - } - }) - .collect() -} diff --git a/cumulus/client/consensus/aura/src/collators/mod.rs b/cumulus/client/consensus/aura/src/collators/mod.rs index 0abc034c1ed..7d430ecdc72 100644 --- a/cumulus/client/consensus/aura/src/collators/mod.rs +++ b/cumulus/client/consensus/aura/src/collators/mod.rs @@ -20,13 +20,35 @@ //! included parachain block, as well as the [`lookahead`] collator, which prospectively //! builds on parachain blocks which have not yet been included in the relay chain. +use crate::collator::SlotClaim; +use codec::Codec; +use cumulus_client_consensus_common::{ + self as consensus_common, load_abridged_host_configuration, ParentSearchParams, +}; +use cumulus_primitives_aura::{AuraUnincludedSegmentApi, Slot}; +use cumulus_primitives_core::{relay_chain::Hash as ParaHash, BlockT}; use cumulus_relay_chain_interface::RelayChainInterface; use polkadot_primitives::{ - Hash as RHash, Id as ParaId, OccupiedCoreAssumption, ValidationCodeHash, + AsyncBackingParams, CoreIndex, CoreState, Hash as RelayHash, Id as ParaId, + OccupiedCoreAssumption, ValidationCodeHash, }; +use sc_consensus_aura::{standalone as aura_internal, AuraApi}; +use sp_api::ProvideRuntimeApi; +use sp_core::Pair; +use sp_keystore::KeystorePtr; +use sp_timestamp::Timestamp; pub mod basic; pub mod lookahead; +pub mod slot_based; + +// This is an arbitrary value which is likely guaranteed to exceed any reasonable +// limit, as it would correspond to 10 non-included blocks. +// +// Since we only search for parent blocks which have already been imported, +// we can guarantee that all imported blocks respect the unincluded segment +// rules specified by the parachain's runtime and thus will never be too deep. +const PARENT_SEARCH_DEPTH: usize = 10; /// Check the `local_validation_code_hash` against the validation code hash in the relay chain /// state. @@ -36,7 +58,7 @@ async fn check_validation_code_or_log( local_validation_code_hash: &ValidationCodeHash, para_id: ParaId, relay_client: &impl RelayChainInterface, - relay_parent: RHash, + relay_parent: RelayHash, ) { let state_validation_code_hash = match relay_client .validation_code_hash(relay_parent, para_id, OccupiedCoreAssumption::Included) @@ -77,3 +99,159 @@ async fn check_validation_code_or_log( }, } } + +/// Reads async backing parameters from the relay chain storage at the given relay parent. +async fn async_backing_params( + relay_parent: RelayHash, + relay_client: &impl RelayChainInterface, +) -> Option { + match load_abridged_host_configuration(relay_parent, relay_client).await { + Ok(Some(config)) => Some(config.async_backing_params), + Ok(None) => { + tracing::error!( + target: crate::LOG_TARGET, + "Active config is missing in relay chain storage", + ); + None + }, + Err(err) => { + tracing::error!( + target: crate::LOG_TARGET, + ?err, + ?relay_parent, + "Failed to read active config from relay chain client", + ); + None + }, + } +} + +// Return all the cores assigned to the para at the provided relay parent. +async fn cores_scheduled_for_para( + relay_parent: RelayHash, + para_id: ParaId, + relay_client: &impl RelayChainInterface, +) -> Vec { + // Get `AvailabilityCores` from runtime + let cores = match relay_client.availability_cores(relay_parent).await { + Ok(cores) => cores, + Err(error) => { + tracing::error!( + target: crate::LOG_TARGET, + ?error, + ?relay_parent, + "Failed to query availability cores runtime API", + ); + return Vec::new() + }, + }; + + let max_candidate_depth = async_backing_params(relay_parent, relay_client) + .await + .map(|c| c.max_candidate_depth) + .unwrap_or(0); + + cores + .iter() + .enumerate() + .filter_map(|(index, core)| { + let core_para_id = match core { + CoreState::Scheduled(scheduled_core) => Some(scheduled_core.para_id), + CoreState::Occupied(occupied_core) if max_candidate_depth > 0 => occupied_core + .next_up_on_available + .as_ref() + .map(|scheduled_core| scheduled_core.para_id), + CoreState::Free | CoreState::Occupied(_) => None, + }; + + if core_para_id == Some(para_id) { + Some(CoreIndex(index as u32)) + } else { + None + } + }) + .collect() +} + +// Checks if we own the slot at the given block and whether there +// is space in the unincluded segment. +async fn can_build_upon( + slot: Slot, + timestamp: Timestamp, + parent_hash: Block::Hash, + included_block: Block::Hash, + client: &Client, + keystore: &KeystorePtr, +) -> Option> +where + Client: ProvideRuntimeApi, + Client::Api: AuraApi + AuraUnincludedSegmentApi, + P: Pair, + P::Public: Codec, + P::Signature: Codec, +{ + let runtime_api = client.runtime_api(); + let authorities = runtime_api.authorities(parent_hash).ok()?; + let author_pub = aura_internal::claim_slot::

    (slot, &authorities, keystore).await?; + + // Here we lean on the property that building on an empty unincluded segment must always + // be legal. Skipping the runtime API query here allows us to seamlessly run this + // collator against chains which have not yet upgraded their runtime. + if parent_hash != included_block && + !runtime_api.can_build_upon(parent_hash, included_block, slot).ok()? + { + return None + } + + Some(SlotClaim::unchecked::

    (author_pub, slot, timestamp)) +} + +/// Use [`cumulus_client_consensus_common::find_potential_parents`] to find parachain blocks that +/// we can build on. Once a list of potential parents is retrieved, return the last one of the +/// longest chain. +async fn find_parent( + relay_parent: ParaHash, + para_id: ParaId, + para_backend: &impl sc_client_api::Backend, + relay_client: &impl RelayChainInterface, +) -> Option<(::Hash, consensus_common::PotentialParent)> +where + Block: BlockT, +{ + let parent_search_params = ParentSearchParams { + relay_parent, + para_id, + ancestry_lookback: crate::collators::async_backing_params(relay_parent, relay_client) + .await + .map_or(0, |params| params.allowed_ancestry_len as usize), + max_depth: PARENT_SEARCH_DEPTH, + ignore_alternative_branches: true, + }; + + let potential_parents = cumulus_client_consensus_common::find_potential_parents::( + parent_search_params, + para_backend, + relay_client, + ) + .await; + + let potential_parents = match potential_parents { + Err(e) => { + tracing::error!( + target: crate::LOG_TARGET, + ?relay_parent, + err = ?e, + "Could not fetch potential parents to build upon" + ); + + return None + }, + Ok(x) => x, + }; + + let included_block = potential_parents.iter().find(|x| x.depth == 0)?.hash; + potential_parents + .into_iter() + .max_by_key(|a| a.depth) + .map(|parent| (included_block, parent)) +} diff --git a/cumulus/client/consensus/aura/src/collators/slot_based/block_builder_task.rs b/cumulus/client/consensus/aura/src/collators/slot_based/block_builder_task.rs new file mode 100644 index 00000000000..1fbc0689da8 --- /dev/null +++ b/cumulus/client/consensus/aura/src/collators/slot_based/block_builder_task.rs @@ -0,0 +1,491 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use codec::{Codec, Encode}; + +use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface; +use cumulus_client_consensus_common::{self as consensus_common, ParachainBlockImportMarker}; +use cumulus_client_consensus_proposer::ProposerInterface; +use cumulus_primitives_aura::AuraUnincludedSegmentApi; +use cumulus_primitives_core::{CollectCollationInfo, PersistedValidationData}; +use cumulus_relay_chain_interface::RelayChainInterface; + +use polkadot_primitives::{ + BlockId, CoreIndex, Hash as RelayHash, Header as RelayHeader, Id as ParaId, + OccupiedCoreAssumption, +}; + +use futures::prelude::*; +use sc_client_api::{backend::AuxStore, BlockBackend, BlockOf, UsageProvider}; +use sc_consensus::BlockImport; +use sp_api::ProvideRuntimeApi; +use sp_application_crypto::AppPublic; +use sp_blockchain::HeaderBackend; +use sp_consensus_aura::{AuraApi, Slot, SlotDuration}; +use sp_core::crypto::Pair; +use sp_inherents::CreateInherentDataProviders; +use sp_keystore::KeystorePtr; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Member}; +use sp_timestamp::Timestamp; +use std::{sync::Arc, time::Duration}; + +use super::CollatorMessage; +use crate::{ + collator::{self as collator_util}, + collators::{check_validation_code_or_log, cores_scheduled_for_para}, + LOG_TARGET, +}; + +/// Parameters for [`run_block_builder`]. +pub struct BuilderTaskParams< + Block: BlockT, + BI, + CIDP, + Client, + Backend, + RelayClient, + CHP, + Proposer, + CS, +> { + /// Inherent data providers. Only non-consensus inherent data should be provided, i.e. + /// the timestamp, slot, and paras inherents should be omitted, as they are set by this + /// collator. + pub create_inherent_data_providers: CIDP, + /// Used to actually import blocks. + pub block_import: BI, + /// The underlying para client. + pub para_client: Arc, + /// The para client's backend, used to access the database. + pub para_backend: Arc, + /// A handle to the relay-chain client. + pub relay_client: RelayClient, + /// A validation code hash provider, used to get the current validation code hash. + pub code_hash_provider: CHP, + /// The underlying keystore, which should contain Aura consensus keys. + pub keystore: KeystorePtr, + /// The para's ID. + pub para_id: ParaId, + /// The underlying block proposer this should call into. + pub proposer: Proposer, + /// The generic collator service used to plug into this consensus engine. + pub collator_service: CS, + /// The amount of time to spend authoring each block. + pub authoring_duration: Duration, + /// Channel to send built blocks to the collation task. + pub collator_sender: sc_utils::mpsc::TracingUnboundedSender>, + /// Slot duration of the relay chain + pub relay_chain_slot_duration: Duration, + /// Drift every slot by this duration. + /// This is a time quantity that is subtracted from the actual timestamp when computing + /// the time left to enter a new slot. In practice, this *left-shifts* the clock time with the + /// intent to keep our "clock" slightly behind the relay chain one and thus reducing the + /// likelihood of encountering unfavorable notification arrival timings (i.e. we don't want to + /// wait for relay chain notifications because we woke up too early). + pub slot_drift: Duration, +} + +#[derive(Debug)] +struct SlotInfo { + pub timestamp: Timestamp, + pub slot: Slot, + pub slot_duration: SlotDuration, +} + +#[derive(Debug)] +struct SlotTimer { + client: Arc, + drift: Duration, + _marker: std::marker::PhantomData<(Block, Box)>, +} + +/// Returns current duration since Unix epoch. +fn duration_now() -> Duration { + use std::time::SystemTime; + let now = SystemTime::now(); + now.duration_since(SystemTime::UNIX_EPOCH).unwrap_or_else(|e| { + panic!("Current time {:?} is before Unix epoch. Something is wrong: {:?}", now, e) + }) +} + +/// Returns the duration until the next slot from now. +fn time_until_next_slot(slot_duration: Duration, drift: Duration) -> Duration { + let now = duration_now().as_millis() - drift.as_millis(); + + let next_slot = (now + slot_duration.as_millis()) / slot_duration.as_millis(); + let remaining_millis = next_slot * slot_duration.as_millis() - now; + Duration::from_millis(remaining_millis as u64) +} + +impl SlotTimer +where + Block: BlockT, + Client: ProvideRuntimeApi + Send + Sync + 'static + UsageProvider, + Client::Api: AuraApi, + P: Pair, + P::Public: AppPublic + Member + Codec, + P::Signature: TryFrom> + Member + Codec, +{ + pub fn new_with_drift(client: Arc, drift: Duration) -> Self { + Self { client, drift, _marker: Default::default() } + } + + /// Returns a future that resolves when the next slot arrives. + pub async fn wait_until_next_slot(&self) -> Result { + let Ok(slot_duration) = crate::slot_duration(&*self.client) else { + tracing::error!(target: crate::LOG_TARGET, "Failed to fetch slot duration from runtime."); + return Err(()) + }; + + let time_until_next_slot = time_until_next_slot(slot_duration.as_duration(), self.drift); + tokio::time::sleep(time_until_next_slot).await; + let timestamp = sp_timestamp::Timestamp::current(); + Ok(SlotInfo { + slot: Slot::from_timestamp(timestamp, slot_duration), + timestamp, + slot_duration, + }) + } +} + +/// Run block-builder. +pub fn run_block_builder( + params: BuilderTaskParams, +) -> impl Future + Send + 'static +where + Block: BlockT, + Client: ProvideRuntimeApi + + UsageProvider + + BlockOf + + AuxStore + + HeaderBackend + + BlockBackend + + Send + + Sync + + 'static, + Client::Api: + AuraApi + CollectCollationInfo + AuraUnincludedSegmentApi, + Backend: sc_client_api::Backend + 'static, + RelayClient: RelayChainInterface + Clone + 'static, + CIDP: CreateInherentDataProviders + 'static, + CIDP::InherentDataProviders: Send, + BI: BlockImport + ParachainBlockImportMarker + Send + Sync + 'static, + Proposer: ProposerInterface + Send + Sync + 'static, + CS: CollatorServiceInterface + Send + Sync + 'static, + CHP: consensus_common::ValidationCodeHashProvider + Send + 'static, + P: Pair, + P::Public: AppPublic + Member + Codec, + P::Signature: TryFrom> + Member + Codec, +{ + async move { + tracing::info!(target: LOG_TARGET, "Starting slot-based block-builder task."); + let BuilderTaskParams { + relay_client, + create_inherent_data_providers, + para_client, + keystore, + block_import, + para_id, + proposer, + collator_service, + collator_sender, + code_hash_provider, + authoring_duration, + para_backend, + relay_chain_slot_duration, + slot_drift, + } = params; + + let slot_timer = SlotTimer::<_, _, P>::new_with_drift(para_client.clone(), slot_drift); + + let mut collator = { + let params = collator_util::Params { + create_inherent_data_providers, + block_import, + relay_client: relay_client.clone(), + keystore: keystore.clone(), + para_id, + proposer, + collator_service, + }; + + collator_util::Collator::::new(params) + }; + + let mut relay_chain_fetcher = RelayChainCachingFetcher::new(relay_client.clone(), para_id); + + loop { + // We wait here until the next slot arrives. + let Ok(para_slot) = slot_timer.wait_until_next_slot().await else { + return; + }; + + let Some(expected_cores) = + expected_core_count(relay_chain_slot_duration, para_slot.slot_duration) + else { + return + }; + + let Ok(RelayChainData { + relay_parent_header, + max_pov_size, + relay_parent_hash: relay_parent, + scheduled_cores, + }) = relay_chain_fetcher.get_relay_chain_data().await + else { + continue; + }; + + if scheduled_cores.is_empty() { + tracing::debug!(target: LOG_TARGET, "Parachain not scheduled, skipping slot."); + continue; + } + + let core_index_in_scheduled: u64 = *para_slot.slot % expected_cores; + let Some(core_index) = scheduled_cores.get(core_index_in_scheduled as usize) else { + tracing::debug!(target: LOG_TARGET, core_index_in_scheduled, core_len = scheduled_cores.len(), "Para is scheduled, but not enough cores available."); + continue; + }; + + let Some((included_block, parent)) = + crate::collators::find_parent(relay_parent, para_id, &*para_backend, &relay_client) + .await + else { + continue + }; + + let parent_header = parent.header; + let parent_hash = parent.hash; + + // We mainly call this to inform users at genesis if there is a mismatch with the + // on-chain data. + collator.collator_service().check_block_status(parent_hash, &parent_header); + + let slot_claim = match crate::collators::can_build_upon::<_, _, P>( + para_slot.slot, + para_slot.timestamp, + parent_hash, + included_block, + &*para_client, + &keystore, + ) + .await + { + Some(slot) => slot, + None => { + tracing::debug!( + target: crate::LOG_TARGET, + ?core_index, + slot_info = ?para_slot, + unincluded_segment_len = parent.depth, + relay_parent = %relay_parent, + included = %included_block, + parent = %parent_hash, + "Not building block." + ); + continue + }, + }; + + tracing::debug!( + target: crate::LOG_TARGET, + ?core_index, + slot_info = ?para_slot, + unincluded_segment_len = parent.depth, + relay_parent = %relay_parent, + included = %included_block, + parent = %parent_hash, + "Building block." + ); + + let validation_data = PersistedValidationData { + parent_head: parent_header.encode().into(), + relay_parent_number: *relay_parent_header.number(), + relay_parent_storage_root: *relay_parent_header.state_root(), + max_pov_size, + }; + + let (parachain_inherent_data, other_inherent_data) = match collator + .create_inherent_data( + relay_parent, + &validation_data, + parent_hash, + slot_claim.timestamp(), + ) + .await + { + Err(err) => { + tracing::error!(target: crate::LOG_TARGET, ?err); + break + }, + Ok(x) => x, + }; + + let validation_code_hash = match code_hash_provider.code_hash_at(parent_hash) { + None => { + tracing::error!(target: crate::LOG_TARGET, ?parent_hash, "Could not fetch validation code hash"); + break + }, + Some(v) => v, + }; + + check_validation_code_or_log( + &validation_code_hash, + para_id, + &relay_client, + relay_parent, + ) + .await; + + let Ok(Some(candidate)) = collator + .build_block_and_import( + &parent_header, + &slot_claim, + None, + (parachain_inherent_data, other_inherent_data), + authoring_duration, + // Set the block limit to 50% of the maximum PoV size. + // + // TODO: If we got benchmarking that includes the proof size, + // we should be able to use the maximum pov size. + (validation_data.max_pov_size / 2) as usize, + ) + .await + else { + tracing::error!(target: crate::LOG_TARGET, "Unable to build block at slot."); + continue; + }; + + let new_block_hash = candidate.block.header().hash(); + + // Announce the newly built block to our peers. + collator.collator_service().announce_block(new_block_hash, None); + + if let Err(err) = collator_sender.unbounded_send(CollatorMessage { + relay_parent, + parent_header, + parachain_candidate: candidate, + validation_code_hash, + core_index: *core_index, + }) { + tracing::error!(target: crate::LOG_TARGET, ?err, "Unable to send block to collation task."); + return + } + } + } +} + +/// Calculate the expected core count based on the slot duration of the relay and parachain. +/// +/// If `slot_duration` is smaller than `relay_chain_slot_duration` that means that we produce more +/// than one parachain block per relay chain block. In order to get these backed, we need multiple +/// cores. This method calculates how many cores we should expect to have scheduled under the +/// assumption that we have a fixed number of cores assigned to our parachain. +fn expected_core_count( + relay_chain_slot_duration: Duration, + slot_duration: SlotDuration, +) -> Option { + let slot_duration_millis = slot_duration.as_millis(); + u64::try_from(relay_chain_slot_duration.as_millis()) + .map_err(|e| tracing::error!("Unable to calculate expected parachain core count: {e}")) + .map(|relay_slot_duration| (relay_slot_duration / slot_duration_millis).max(1)) + .ok() +} + +/// Contains relay chain data necessary for parachain block building. +#[derive(Clone)] +struct RelayChainData { + /// Current relay chain parent header. + pub relay_parent_header: RelayHeader, + /// The cores this para is scheduled on in the context of the relay parent. + pub scheduled_cores: Vec, + /// Maximum configured PoV size on the relay chain. + pub max_pov_size: u32, + /// Current relay chain parent header. + pub relay_parent_hash: RelayHash, +} + +/// Simple helper to fetch relay chain data and cache it based on the current relay chain best block +/// hash. +struct RelayChainCachingFetcher { + relay_client: RI, + para_id: ParaId, + last_data: Option<(RelayHash, RelayChainData)>, +} + +impl RelayChainCachingFetcher +where + RI: RelayChainInterface + Clone + 'static, +{ + pub fn new(relay_client: RI, para_id: ParaId) -> Self { + Self { relay_client, para_id, last_data: None } + } + + /// Fetch required [`RelayChainData`] from the relay chain. + /// If this data has been fetched in the past for the incoming hash, it will reuse + /// cached data. + pub async fn get_relay_chain_data(&mut self) -> Result { + let Ok(relay_parent) = self.relay_client.best_block_hash().await else { + tracing::warn!(target: crate::LOG_TARGET, "Unable to fetch latest relay chain block hash."); + return Err(()) + }; + + match &self.last_data { + Some((last_seen_hash, data)) if *last_seen_hash == relay_parent => { + tracing::trace!(target: crate::LOG_TARGET, %relay_parent, "Using cached data for relay parent."); + Ok(data.clone()) + }, + _ => { + tracing::trace!(target: crate::LOG_TARGET, %relay_parent, "Relay chain best block changed, fetching new data from relay chain."); + let data = self.update_for_relay_parent(relay_parent).await?; + self.last_data = Some((relay_parent, data.clone())); + Ok(data) + }, + } + } + + /// Fetch fresh data from the relay chain for the given relay parent hash. + async fn update_for_relay_parent(&self, relay_parent: RelayHash) -> Result { + let scheduled_cores = + cores_scheduled_for_para(relay_parent, self.para_id, &self.relay_client).await; + let Ok(Some(relay_parent_header)) = + self.relay_client.header(BlockId::Hash(relay_parent)).await + else { + tracing::warn!(target: crate::LOG_TARGET, "Unable to fetch latest relay chain block header."); + return Err(()) + }; + + let max_pov_size = match self + .relay_client + .persisted_validation_data(relay_parent, self.para_id, OccupiedCoreAssumption::Included) + .await + { + Ok(None) => return Err(()), + Ok(Some(pvd)) => pvd.max_pov_size, + Err(err) => { + tracing::error!(target: crate::LOG_TARGET, ?err, "Failed to gather information from relay-client"); + return Err(()) + }, + }; + + Ok(RelayChainData { + relay_parent_hash: relay_parent, + relay_parent_header, + scheduled_cores, + max_pov_size, + }) + } +} diff --git a/cumulus/client/consensus/aura/src/collators/slot_based/collation_task.rs b/cumulus/client/consensus/aura/src/collators/slot_based/collation_task.rs new file mode 100644 index 00000000000..5b8151f6302 --- /dev/null +++ b/cumulus/client/consensus/aura/src/collators/slot_based/collation_task.rs @@ -0,0 +1,140 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use codec::Encode; + +use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface; +use cumulus_relay_chain_interface::RelayChainInterface; + +use polkadot_node_primitives::{MaybeCompressedPoV, SubmitCollationParams}; +use polkadot_node_subsystem::messages::CollationGenerationMessage; +use polkadot_overseer::Handle as OverseerHandle; +use polkadot_primitives::{CollatorPair, Id as ParaId}; + +use futures::prelude::*; + +use sc_utils::mpsc::TracingUnboundedReceiver; +use sp_runtime::traits::{Block as BlockT, Header}; + +use super::CollatorMessage; + +const LOG_TARGET: &str = "aura::cumulus::collation_task"; + +/// Parameters for the collation task. +pub struct Params { + /// A handle to the relay-chain client. + pub relay_client: RClient, + /// The collator key used to sign collations before submitting to validators. + pub collator_key: CollatorPair, + /// The para's ID. + pub para_id: ParaId, + /// Whether we should reinitialize the collator config (i.e. we are transitioning to aura). + pub reinitialize: bool, + /// Collator service interface + pub collator_service: CS, + /// Receiver channel for communication with the block builder task. + pub collator_receiver: TracingUnboundedReceiver>, +} + +/// Asynchronously executes the collation task for a parachain. +/// +/// This function initializes the collator subsystems necessary for producing and submitting +/// collations to the relay chain. It listens for new best relay chain block notifications and +/// handles collator messages. If our parachain is scheduled on a core and we have a candidate, +/// the task will build a collation and send it to the relay chain. +pub async fn run_collation_task(mut params: Params) +where + Block: BlockT, + CS: CollatorServiceInterface + Send + Sync + 'static, + RClient: RelayChainInterface + Clone + 'static, +{ + let Ok(mut overseer_handle) = params.relay_client.overseer_handle() else { + tracing::error!(target: LOG_TARGET, "Failed to get overseer handle."); + return + }; + + cumulus_client_collator::initialize_collator_subsystems( + &mut overseer_handle, + params.collator_key, + params.para_id, + params.reinitialize, + ) + .await; + + let collator_service = params.collator_service; + while let Some(collator_message) = params.collator_receiver.next().await { + handle_collation_message(collator_message, &collator_service, &mut overseer_handle).await; + } +} + +/// Handle an incoming collation message from the block builder task. +/// This builds the collation from the [`CollatorMessage`] and submits it to +/// the collation-generation subsystem of the relay chain. +async fn handle_collation_message( + message: CollatorMessage, + collator_service: &impl CollatorServiceInterface, + overseer_handle: &mut OverseerHandle, +) { + let CollatorMessage { + parent_header, + parachain_candidate, + validation_code_hash, + relay_parent, + core_index, + } = message; + + let hash = parachain_candidate.block.header().hash(); + let number = *parachain_candidate.block.header().number(); + let (collation, block_data) = + match collator_service.build_collation(&parent_header, hash, parachain_candidate) { + Some(collation) => collation, + None => { + tracing::warn!(target: LOG_TARGET, %hash, ?number, ?core_index, "Unable to build collation."); + return; + }, + }; + + tracing::info!( + target: LOG_TARGET, + "PoV size {{ header: {:.2}kB, extrinsics: {:.2}kB, storage_proof: {:.2}kB }}", + block_data.header().encoded_size() as f64 / 1024f64, + block_data.extrinsics().encoded_size() as f64 / 1024f64, + block_data.storage_proof().encoded_size() as f64 / 1024f64, + ); + + if let MaybeCompressedPoV::Compressed(ref pov) = collation.proof_of_validity { + tracing::info!( + target: LOG_TARGET, + "Compressed PoV size: {}kb", + pov.block_data.0.len() as f64 / 1024f64, + ); + } + + tracing::debug!(target: LOG_TARGET, ?core_index, %hash, %number, "Submitting collation for core."); + overseer_handle + .send_msg( + CollationGenerationMessage::SubmitCollation(SubmitCollationParams { + relay_parent, + collation, + parent_head: parent_header.encode().into(), + validation_code_hash, + core_index, + result_sender: None, + }), + "SubmitCollation", + ) + .await; +} diff --git a/cumulus/client/consensus/aura/src/collators/slot_based/mod.rs b/cumulus/client/consensus/aura/src/collators/slot_based/mod.rs new file mode 100644 index 00000000000..0fe49d58d25 --- /dev/null +++ b/cumulus/client/consensus/aura/src/collators/slot_based/mod.rs @@ -0,0 +1,178 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! A collator for Aura that looks ahead of the most recently included parachain block +//! when determining what to build upon. +//! +//! The block building mechanism consists of two parts: +//! 1. A block-builder task that builds parachain blocks at each of our slots. +//! 2. A collator task that transforms the blocks into a collation and submits them to the relay +//! chain. +//! +//! Blocks are built on every parachain slot if there is a core scheduled on the relay chain. At the +//! beginning of each block building loop, we determine how many blocks we expect to build per relay +//! chain block. The collator implementation then expects that we have that many cores scheduled +//! during the relay chain block. After the block is built, the block builder task sends it to +//! the collation task which compresses it and submits it to the collation-generation subsystem. + +use codec::Codec; +use consensus_common::ParachainCandidate; +use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface; +use cumulus_client_consensus_common::{self as consensus_common, ParachainBlockImportMarker}; +use cumulus_client_consensus_proposer::ProposerInterface; +use cumulus_primitives_aura::AuraUnincludedSegmentApi; +use cumulus_primitives_core::CollectCollationInfo; +use cumulus_relay_chain_interface::RelayChainInterface; +use polkadot_primitives::{ + CollatorPair, CoreIndex, Hash as RelayHash, Id as ParaId, ValidationCodeHash, +}; + +use sc_client_api::{backend::AuxStore, BlockBackend, BlockOf, UsageProvider}; +use sc_consensus::BlockImport; +use sc_utils::mpsc::tracing_unbounded; + +use sp_api::ProvideRuntimeApi; +use sp_application_crypto::AppPublic; +use sp_blockchain::HeaderBackend; +use sp_consensus_aura::AuraApi; +use sp_core::crypto::Pair; +use sp_inherents::CreateInherentDataProviders; +use sp_keystore::KeystorePtr; +use sp_runtime::traits::{Block as BlockT, Member}; + +use std::{sync::Arc, time::Duration}; + +use self::{block_builder_task::run_block_builder, collation_task::run_collation_task}; + +mod block_builder_task; +mod collation_task; + +/// Parameters for [`run`]. +pub struct Params { + /// Inherent data providers. Only non-consensus inherent data should be provided, i.e. + /// the timestamp, slot, and paras inherents should be omitted, as they are set by this + /// collator. + pub create_inherent_data_providers: CIDP, + /// Used to actually import blocks. + pub block_import: BI, + /// The underlying para client. + pub para_client: Arc, + /// The para client's backend, used to access the database. + pub para_backend: Arc, + /// A handle to the relay-chain client. + pub relay_client: RClient, + /// A validation code hash provider, used to get the current validation code hash. + pub code_hash_provider: CHP, + /// The underlying keystore, which should contain Aura consensus keys. + pub keystore: KeystorePtr, + /// The collator key used to sign collations before submitting to validators. + pub collator_key: CollatorPair, + /// The para's ID. + pub para_id: ParaId, + /// The length of slots in the relay chain. + pub relay_chain_slot_duration: Duration, + /// The underlying block proposer this should call into. + pub proposer: Proposer, + /// The generic collator service used to plug into this consensus engine. + pub collator_service: CS, + /// The amount of time to spend authoring each block. + pub authoring_duration: Duration, + /// Whether we should reinitialize the collator config (i.e. we are transitioning to aura). + pub reinitialize: bool, + /// Drift slots by a fixed duration. This can be used to create more preferrable authoring + /// timings. + pub slot_drift: Duration, +} + +/// Run aura-based block building and collation task. +pub fn run( + params: Params, +) -> (impl futures::Future, impl futures::Future) +where + Block: BlockT, + Client: ProvideRuntimeApi + + BlockOf + + AuxStore + + HeaderBackend + + BlockBackend + + UsageProvider + + Send + + Sync + + 'static, + Client::Api: + AuraApi + CollectCollationInfo + AuraUnincludedSegmentApi, + Backend: sc_client_api::Backend + 'static, + RClient: RelayChainInterface + Clone + 'static, + CIDP: CreateInherentDataProviders + 'static, + CIDP::InherentDataProviders: Send, + BI: BlockImport + ParachainBlockImportMarker + Send + Sync + 'static, + Proposer: ProposerInterface + Send + Sync + 'static, + CS: CollatorServiceInterface + Send + Sync + Clone + 'static, + CHP: consensus_common::ValidationCodeHashProvider + Send + 'static, + P: Pair + 'static, + P::Public: AppPublic + Member + Codec, + P::Signature: TryFrom> + Member + Codec, +{ + let (tx, rx) = tracing_unbounded("mpsc_builder_to_collator", 100); + let collator_task_params = collation_task::Params { + relay_client: params.relay_client.clone(), + collator_key: params.collator_key, + para_id: params.para_id, + reinitialize: params.reinitialize, + collator_service: params.collator_service.clone(), + collator_receiver: rx, + }; + + let collation_task_fut = run_collation_task::(collator_task_params); + + let block_builder_params = block_builder_task::BuilderTaskParams { + create_inherent_data_providers: params.create_inherent_data_providers, + block_import: params.block_import, + para_client: params.para_client, + para_backend: params.para_backend, + relay_client: params.relay_client, + code_hash_provider: params.code_hash_provider, + keystore: params.keystore, + para_id: params.para_id, + proposer: params.proposer, + collator_service: params.collator_service, + authoring_duration: params.authoring_duration, + collator_sender: tx, + relay_chain_slot_duration: params.relay_chain_slot_duration, + slot_drift: params.slot_drift, + }; + + let block_builder_fut = + run_block_builder::(block_builder_params); + + (collation_task_fut, block_builder_fut) +} + +/// Message to be sent from the block builder to the collation task. +/// +/// Contains all data necessary to submit a collation to the relay chain. +struct CollatorMessage { + /// The hash of the relay chain block that provides the context for the parachain block. + pub relay_parent: RelayHash, + /// The header of the parent block. + pub parent_header: Block::Header, + /// The parachain block candidate. + pub parachain_candidate: ParachainCandidate, + /// The validation code hash at the parent block. + pub validation_code_hash: ValidationCodeHash, + /// Core index that this block should be submitted on + pub core_index: CoreIndex, +} diff --git a/cumulus/client/consensus/common/src/lib.rs b/cumulus/client/consensus/common/src/lib.rs index 2b0d8290182..e12750dcc55 100644 --- a/cumulus/client/consensus/common/src/lib.rs +++ b/cumulus/client/consensus/common/src/lib.rs @@ -19,16 +19,13 @@ use polkadot_primitives::{ Block as PBlock, Hash as PHash, Header as PHeader, PersistedValidationData, ValidationCodeHash, }; -use cumulus_primitives_core::{ - relay_chain::{self, BlockId as RBlockId, OccupiedCoreAssumption}, - AbridgedHostConfiguration, ParaId, -}; +use cumulus_primitives_core::{relay_chain, AbridgedHostConfiguration}; use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface}; -use sc_client_api::{Backend, HeaderBackend}; +use sc_client_api::Backend; use sc_consensus::{shared_data::SharedData, BlockImport, ImportResult}; -use sp_blockchain::Backend as BlockchainBackend; use sp_consensus_slots::Slot; + use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; use sp_timestamp::Timestamp; @@ -36,9 +33,12 @@ use std::{sync::Arc, time::Duration}; mod level_monitor; mod parachain_consensus; +mod parent_search; #[cfg(test)] mod tests; +pub use parent_search::*; + pub use parachain_consensus::run_parachain_consensus; use level_monitor::LevelMonitor; @@ -229,196 +229,6 @@ pub trait ParachainBlockImportMarker {} impl ParachainBlockImportMarker for ParachainBlockImport {} -/// Parameters when searching for suitable parents to build on top of. -#[derive(Debug)] -pub struct ParentSearchParams { - /// The relay-parent that is intended to be used. - pub relay_parent: PHash, - /// The ID of the parachain. - pub para_id: ParaId, - /// A limitation on the age of relay parents for parachain blocks that are being - /// considered. This is relative to the `relay_parent` number. - pub ancestry_lookback: usize, - /// How "deep" parents can be relative to the included parachain block at the relay-parent. - /// The included block has depth 0. - pub max_depth: usize, - /// Whether to only ignore "alternative" branches, i.e. branches of the chain - /// which do not contain the block pending availability. - pub ignore_alternative_branches: bool, -} - -/// A potential parent block returned from [`find_potential_parents`] -#[derive(Debug, PartialEq)] -pub struct PotentialParent { - /// The hash of the block. - pub hash: B::Hash, - /// The header of the block. - pub header: B::Header, - /// The depth of the block. - pub depth: usize, - /// Whether the block is the included block, is itself pending on-chain, or descends - /// from the block pending availability. - pub aligned_with_pending: bool, -} - -/// Perform a recursive search through blocks to find potential -/// parent blocks for a new block. -/// -/// This accepts a relay-chain block to be used as an anchor and a maximum search depth, -/// along with some arguments for filtering parachain blocks and performs a recursive search -/// for parachain blocks. The search begins at the last included parachain block and returns -/// a set of [`PotentialParent`]s which could be potential parents of a new block with this -/// relay-parent according to the search parameters. -/// -/// A parachain block is a potential parent if it is either the last included parachain block, the -/// pending parachain block (when `max_depth` >= 1), or all of the following hold: -/// * its parent is a potential parent -/// * its relay-parent is within `ancestry_lookback` of the targeted relay-parent. -/// * its relay-parent is within the same session as the targeted relay-parent. -/// * the block number is within `max_depth` blocks of the included block -pub async fn find_potential_parents( - params: ParentSearchParams, - client: &impl Backend, - relay_client: &impl RelayChainInterface, -) -> Result>, RelayChainError> { - // 1. Build up the ancestry record of the relay chain to compare against. - let rp_ancestry = { - let mut ancestry = Vec::with_capacity(params.ancestry_lookback + 1); - let mut current_rp = params.relay_parent; - let mut required_session = None; - - while ancestry.len() <= params.ancestry_lookback { - let header = match relay_client.header(RBlockId::hash(current_rp)).await? { - None => break, - Some(h) => h, - }; - - let session = relay_client.session_index_for_child(current_rp).await?; - if let Some(required_session) = required_session { - // Respect the relay-chain rule not to cross session boundaries. - if session != required_session { - break - } - } else { - required_session = Some(session); - } - - ancestry.push((current_rp, *header.state_root())); - current_rp = *header.parent_hash(); - - // don't iterate back into the genesis block. - if header.number == 1 { - break - } - } - - ancestry - }; - - let is_hash_in_ancestry = |hash| rp_ancestry.iter().any(|x| x.0 == hash); - let is_root_in_ancestry = |root| rp_ancestry.iter().any(|x| x.1 == root); - - // 2. Get the included and pending availability blocks. - let included_header = relay_client - .persisted_validation_data( - params.relay_parent, - params.para_id, - OccupiedCoreAssumption::TimedOut, - ) - .await?; - - let included_header = match included_header { - Some(pvd) => pvd.parent_head, - None => return Ok(Vec::new()), // this implies the para doesn't exist. - }; - - let pending_header = relay_client - .persisted_validation_data( - params.relay_parent, - params.para_id, - OccupiedCoreAssumption::Included, - ) - .await? - .and_then(|x| if x.parent_head != included_header { Some(x.parent_head) } else { None }); - - let included_header = match B::Header::decode(&mut &included_header.0[..]).ok() { - None => return Ok(Vec::new()), - Some(x) => x, - }; - // Silently swallow if pending block can't decode. - let pending_header = pending_header.and_then(|p| B::Header::decode(&mut &p.0[..]).ok()); - let included_hash = included_header.hash(); - let pending_hash = pending_header.as_ref().map(|hdr| hdr.hash()); - - let mut frontier = vec![PotentialParent:: { - hash: included_hash, - header: included_header, - depth: 0, - aligned_with_pending: true, - }]; - - // Recursive search through descendants of the included block which have acceptable - // relay parents. - let mut potential_parents = Vec::new(); - while let Some(entry) = frontier.pop() { - let is_pending = - entry.depth == 1 && pending_hash.as_ref().map_or(false, |h| &entry.hash == h); - let is_included = entry.depth == 0; - - // note: even if the pending block or included block have a relay parent - // outside of the expected part of the relay chain, they are always allowed - // because they have already been posted on chain. - let is_potential = is_pending || is_included || { - let digest = entry.header.digest(); - cumulus_primitives_core::extract_relay_parent(digest).map_or(false, is_hash_in_ancestry) || - cumulus_primitives_core::rpsr_digest::extract_relay_parent_storage_root(digest) - .map(|(r, _n)| r) - .map_or(false, is_root_in_ancestry) - }; - - let parent_aligned_with_pending = entry.aligned_with_pending; - let child_depth = entry.depth + 1; - let hash = entry.hash; - - if is_potential { - potential_parents.push(entry); - } - - if !is_potential || child_depth > params.max_depth { - continue - } - - // push children onto search frontier. - for child in client.blockchain().children(hash).ok().into_iter().flatten() { - let aligned_with_pending = parent_aligned_with_pending && - if child_depth == 1 { - pending_hash.as_ref().map_or(true, |h| &child == h) - } else { - true - }; - - if params.ignore_alternative_branches && !aligned_with_pending { - continue - } - - let header = match client.blockchain().header(child) { - Ok(Some(h)) => h, - Ok(None) => continue, - Err(_) => continue, - }; - - frontier.push(PotentialParent { - hash: child, - header, - depth: child_depth, - aligned_with_pending, - }); - } - } - - Ok(potential_parents) -} - /// Get the relay-parent slot and timestamp from a header. pub fn relay_slot_and_timestamp( relay_parent_header: &PHeader, diff --git a/cumulus/client/consensus/common/src/parachain_consensus.rs b/cumulus/client/consensus/common/src/parachain_consensus.rs index b4b315bb32b..944917673b1 100644 --- a/cumulus/client/consensus/common/src/parachain_consensus.rs +++ b/cumulus/client/consensus/common/src/parachain_consensus.rs @@ -375,60 +375,61 @@ async fn handle_new_best_parachain_head( target: LOG_TARGET, block_hash = ?hash, "Skipping set new best block, because block is already the best.", - ) - } else { - // Make sure the block is already known or otherwise we skip setting new best. - match parachain.block_status(hash) { - Ok(BlockStatus::InChainWithState) => { - unset_best_header.take(); - tracing::debug!( - target: LOG_TARGET, - ?hash, - "Importing block as new best for parachain.", - ); - import_block_as_new_best(hash, parachain_head, parachain).await; - }, - Ok(BlockStatus::InChainPruned) => { - tracing::error!( - target: LOG_TARGET, - block_hash = ?hash, - "Trying to set pruned block as new best!", - ); - }, - Ok(BlockStatus::Unknown) => { - *unset_best_header = Some(parachain_head); + ); + return; + } - tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Parachain block not yet imported, waiting for import to enact as best block.", - ); - - if let Some(ref mut recovery_chan_tx) = recovery_chan_tx { - // Best effort channel to actively encourage block recovery. - // An error here is not fatal; the relay chain continuously re-announces - // the best block, thus we will have other opportunities to retry. - let req = RecoveryRequest { hash, kind: RecoveryKind::Full }; - if let Err(err) = recovery_chan_tx.try_send(req) { - tracing::warn!( - target: LOG_TARGET, - block_hash = ?hash, - error = ?err, - "Unable to notify block recovery subsystem" - ) - } + // Make sure the block is already known or otherwise we skip setting new best. + match parachain.block_status(hash) { + Ok(BlockStatus::InChainWithState) => { + unset_best_header.take(); + tracing::debug!( + target: LOG_TARGET, + included = ?hash, + "Importing block as new best for parachain.", + ); + import_block_as_new_best(hash, parachain_head, parachain).await; + }, + Ok(BlockStatus::InChainPruned) => { + tracing::error!( + target: LOG_TARGET, + block_hash = ?hash, + "Trying to set pruned block as new best!", + ); + }, + Ok(BlockStatus::Unknown) => { + *unset_best_header = Some(parachain_head); + + tracing::debug!( + target: LOG_TARGET, + block_hash = ?hash, + "Parachain block not yet imported, waiting for import to enact as best block.", + ); + + if let Some(ref mut recovery_chan_tx) = recovery_chan_tx { + // Best effort channel to actively encourage block recovery. + // An error here is not fatal; the relay chain continuously re-announces + // the best block, thus we will have other opportunities to retry. + let req = RecoveryRequest { hash, kind: RecoveryKind::Full }; + if let Err(err) = recovery_chan_tx.try_send(req) { + tracing::warn!( + target: LOG_TARGET, + block_hash = ?hash, + error = ?err, + "Unable to notify block recovery subsystem" + ) } - }, - Err(e) => { - tracing::error!( - target: LOG_TARGET, - block_hash = ?hash, - error = ?e, - "Failed to get block status of block.", - ); - }, - _ => {}, - } + } + }, + Err(e) => { + tracing::error!( + target: LOG_TARGET, + block_hash = ?hash, + error = ?e, + "Failed to get block status of block.", + ); + }, + _ => {}, } } diff --git a/cumulus/client/consensus/common/src/parent_search.rs b/cumulus/client/consensus/common/src/parent_search.rs new file mode 100644 index 00000000000..c371ec62f84 --- /dev/null +++ b/cumulus/client/consensus/common/src/parent_search.rs @@ -0,0 +1,418 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use codec::Decode; +use polkadot_primitives::Hash as RelayHash; + +use cumulus_primitives_core::{ + relay_chain::{BlockId as RBlockId, OccupiedCoreAssumption}, + ParaId, +}; +use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface}; + +use sc_client_api::{Backend, HeaderBackend}; + +use sp_blockchain::{Backend as BlockchainBackend, TreeRoute}; + +use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; + +const PARENT_SEARCH_LOG_TARGET: &str = "consensus::common::find_potential_parents"; + +/// Parameters when searching for suitable parents to build on top of. +#[derive(Debug)] +pub struct ParentSearchParams { + /// The relay-parent that is intended to be used. + pub relay_parent: RelayHash, + /// The ID of the parachain. + pub para_id: ParaId, + /// A limitation on the age of relay parents for parachain blocks that are being + /// considered. This is relative to the `relay_parent` number. + pub ancestry_lookback: usize, + /// How "deep" parents can be relative to the included parachain block at the relay-parent. + /// The included block has depth 0. + pub max_depth: usize, + /// Whether to only ignore "alternative" branches, i.e. branches of the chain + /// which do not contain the block pending availability. + pub ignore_alternative_branches: bool, +} + +/// A potential parent block returned from [`find_potential_parents`] +#[derive(PartialEq)] +pub struct PotentialParent { + /// The hash of the block. + pub hash: B::Hash, + /// The header of the block. + pub header: B::Header, + /// The depth of the block with respect to the included block. + pub depth: usize, + /// Whether the block is the included block, is itself pending on-chain, or descends + /// from the block pending availability. + pub aligned_with_pending: bool, +} + +impl std::fmt::Debug for PotentialParent { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("PotentialParent") + .field("hash", &self.hash) + .field("depth", &self.depth) + .field("aligned_with_pending", &self.aligned_with_pending) + .field("number", &self.header.number()) + .finish() + } +} + +/// Perform a recursive search through blocks to find potential +/// parent blocks for a new block. +/// +/// This accepts a relay-chain block to be used as an anchor and a maximum search depth, +/// along with some arguments for filtering parachain blocks and performs a recursive search +/// for parachain blocks. The search begins at the last included parachain block and returns +/// a set of [`PotentialParent`]s which could be potential parents of a new block with this +/// relay-parent according to the search parameters. +/// +/// A parachain block is a potential parent if it is either the last included parachain block, the +/// pending parachain block (when `max_depth` >= 1), or all of the following hold: +/// * its parent is a potential parent +/// * its relay-parent is within `ancestry_lookback` of the targeted relay-parent. +/// * its relay-parent is within the same session as the targeted relay-parent. +/// * the block number is within `max_depth` blocks of the included block +pub async fn find_potential_parents( + params: ParentSearchParams, + backend: &impl Backend, + relay_client: &impl RelayChainInterface, +) -> Result>, RelayChainError> { + tracing::trace!("Parent search parameters: {params:?}"); + // Get the included block. + let Some((included_header, included_hash)) = + fetch_included_from_relay_chain(relay_client, backend, params.para_id, params.relay_parent) + .await? + else { + return Ok(Default::default()) + }; + + let only_included = vec![PotentialParent { + hash: included_hash, + header: included_header.clone(), + depth: 0, + aligned_with_pending: true, + }]; + + if params.max_depth == 0 { + return Ok(only_included) + }; + + // Pending header and hash. + let maybe_pending = { + // Fetch the most recent pending header from the relay chain. We use + // `OccupiedCoreAssumption::Included` so the candidate pending availability gets enacted + // before being returned to us. + let pending_header = relay_client + .persisted_validation_data( + params.relay_parent, + params.para_id, + OccupiedCoreAssumption::Included, + ) + .await? + .and_then(|p| B::Header::decode(&mut &p.parent_head.0[..]).ok()) + .filter(|x| x.hash() != included_hash); + + // If the pending block is not locally known, we can't do anything. + if let Some(header) = pending_header { + let pending_hash = header.hash(); + match backend.blockchain().header(pending_hash) { + // We are supposed to ignore branches that don't contain the pending block, but we + // do not know the pending block locally. + Ok(None) | Err(_) if params.ignore_alternative_branches => { + tracing::warn!( + target: PARENT_SEARCH_LOG_TARGET, + %pending_hash, + "Failed to get header for pending block.", + ); + return Ok(Default::default()) + }, + Ok(Some(_)) => Some((header, pending_hash)), + _ => None, + } + } else { + None + } + }; + + let maybe_route_to_last_pending = maybe_pending + .as_ref() + .map(|(_, pending)| { + sp_blockchain::tree_route(backend.blockchain(), included_hash, *pending) + }) + .transpose()?; + + // If we want to ignore alternative branches there is no reason to start + // the parent search at the included block. We can add the included block and + // the path to the pending block to the potential parents directly (limited by max_depth). + let (frontier, potential_parents) = match ( + &maybe_pending, + params.ignore_alternative_branches, + &maybe_route_to_last_pending, + ) { + (Some((pending_header, pending_hash)), true, Some(ref route_to_pending)) => { + let mut potential_parents = only_included; + + // This is a defensive check, should never happen. + if !route_to_pending.retracted().is_empty() { + tracing::warn!(target: PARENT_SEARCH_LOG_TARGET, "Included block not an ancestor of pending block. This should not happen."); + return Ok(Default::default()) + } + + // Add all items on the path included -> pending - 1 to the potential parents, but + // not more than `max_depth`. + let num_parents_on_path = + route_to_pending.enacted().len().saturating_sub(1).min(params.max_depth); + for (num, block) in + route_to_pending.enacted().iter().take(num_parents_on_path).enumerate() + { + let Ok(Some(header)) = backend.blockchain().header(block.hash) else { continue }; + + potential_parents.push(PotentialParent { + hash: block.hash, + header, + depth: 1 + num, + aligned_with_pending: true, + }); + } + + // The search for additional potential parents should now start at the children of + // the pending block. + ( + vec![PotentialParent { + hash: *pending_hash, + header: pending_header.clone(), + depth: route_to_pending.enacted().len(), + aligned_with_pending: true, + }], + potential_parents, + ) + }, + _ => (only_included, Default::default()), + }; + + if potential_parents.len() > params.max_depth { + return Ok(potential_parents); + } + + // Build up the ancestry record of the relay chain to compare against. + let rp_ancestry = + build_relay_parent_ancestry(params.ancestry_lookback, params.relay_parent, relay_client) + .await?; + + Ok(search_child_branches_for_parents( + frontier, + maybe_route_to_last_pending, + included_header, + maybe_pending.map(|(_, hash)| hash), + backend, + params.max_depth, + params.ignore_alternative_branches, + rp_ancestry, + potential_parents, + )) +} + +/// Fetch the included block from the relay chain. +async fn fetch_included_from_relay_chain( + relay_client: &impl RelayChainInterface, + backend: &impl Backend, + para_id: ParaId, + relay_parent: RelayHash, +) -> Result, RelayChainError> { + // Fetch the pending header from the relay chain. We use `OccupiedCoreAssumption::TimedOut` + // so that even if there is a pending candidate, we assume it is timed out and we get the + // included head. + let included_header = relay_client + .persisted_validation_data(relay_parent, para_id, OccupiedCoreAssumption::TimedOut) + .await?; + let included_header = match included_header { + Some(pvd) => pvd.parent_head, + None => return Ok(None), // this implies the para doesn't exist. + }; + + let included_header = match B::Header::decode(&mut &included_header.0[..]).ok() { + None => return Ok(None), + Some(x) => x, + }; + + let included_hash = included_header.hash(); + // If the included block is not locally known, we can't do anything. + match backend.blockchain().header(included_hash) { + Ok(None) => { + tracing::warn!( + target: PARENT_SEARCH_LOG_TARGET, + %included_hash, + "Failed to get header for included block.", + ); + return Ok(None) + }, + Err(e) => { + tracing::warn!( + target: PARENT_SEARCH_LOG_TARGET, + %included_hash, + %e, + "Failed to get header for included block.", + ); + return Ok(None) + }, + _ => {}, + }; + + Ok(Some((included_header, included_hash))) +} + +/// Build an ancestry of relay parents that are acceptable. +/// +/// An acceptable relay parent is one that is no more than `ancestry_lookback` + 1 blocks below the +/// relay parent we want to build on. Parachain blocks anchored on relay parents older than that can +/// not be considered potential parents for block building. They have no chance of still getting +/// included, so our newly build parachain block would also not get included. +/// +/// On success, returns a vector of `(header_hash, state_root)` of the relevant relay chain +/// ancestry blocks. +async fn build_relay_parent_ancestry( + ancestry_lookback: usize, + relay_parent: RelayHash, + relay_client: &impl RelayChainInterface, +) -> Result, RelayChainError> { + let mut ancestry = Vec::with_capacity(ancestry_lookback + 1); + let mut current_rp = relay_parent; + let mut required_session = None; + while ancestry.len() <= ancestry_lookback { + let Some(header) = relay_client.header(RBlockId::hash(current_rp)).await? else { break }; + + let session = relay_client.session_index_for_child(current_rp).await?; + if required_session.get_or_insert(session) != &session { + // Respect the relay-chain rule not to cross session boundaries. + break; + } + + ancestry.push((current_rp, *header.state_root())); + current_rp = *header.parent_hash(); + + // don't iterate back into the genesis block. + if header.number == 1 { + break + } + } + Ok(ancestry) +} + +/// Start search for child blocks that can be used as parents. +pub fn search_child_branches_for_parents( + mut frontier: Vec>, + maybe_route_to_last_pending: Option>, + included_header: Block::Header, + pending_hash: Option, + backend: &impl Backend, + max_depth: usize, + ignore_alternative_branches: bool, + rp_ancestry: Vec<(RelayHash, RelayHash)>, + mut potential_parents: Vec>, +) -> Vec> { + let included_hash = included_header.hash(); + let is_hash_in_ancestry = |hash| rp_ancestry.iter().any(|x| x.0 == hash); + let is_root_in_ancestry = |root| rp_ancestry.iter().any(|x| x.1 == root); + + // The distance between pending and included block. Is later used to check if a child + // is aligned with pending when it is between pending and included block. + let pending_distance = maybe_route_to_last_pending.as_ref().map(|route| route.enacted().len()); + + // If a block is on the path included -> pending, we consider it `aligned_with_pending`. + let is_child_pending = |hash| { + maybe_route_to_last_pending + .as_ref() + .map_or(true, |route| route.enacted().iter().any(|x| x.hash == hash)) + }; + + tracing::trace!( + target: PARENT_SEARCH_LOG_TARGET, + ?included_hash, + included_num = ?included_header.number(), + ?pending_hash , + ?rp_ancestry, + "Searching relay chain ancestry." + ); + while let Some(entry) = frontier.pop() { + let is_pending = pending_hash.as_ref().map_or(false, |h| &entry.hash == h); + let is_included = included_hash == entry.hash; + + // note: even if the pending block or included block have a relay parent + // outside of the expected part of the relay chain, they are always allowed + // because they have already been posted on chain. + let is_potential = is_pending || is_included || { + let digest = entry.header.digest(); + let is_hash_in_ancestry_check = cumulus_primitives_core::extract_relay_parent(digest) + .map_or(false, is_hash_in_ancestry); + let is_root_in_ancestry_check = + cumulus_primitives_core::rpsr_digest::extract_relay_parent_storage_root(digest) + .map(|(r, _n)| r) + .map_or(false, is_root_in_ancestry); + + is_hash_in_ancestry_check || is_root_in_ancestry_check + }; + + let parent_aligned_with_pending = entry.aligned_with_pending; + let child_depth = entry.depth + 1; + let hash = entry.hash; + + tracing::trace!( + target: PARENT_SEARCH_LOG_TARGET, + ?hash, + is_potential, + is_pending, + is_included, + "Checking potential parent." + ); + + if is_potential { + potential_parents.push(entry); + } + + if !is_potential || child_depth > max_depth { + continue + } + + // push children onto search frontier. + for child in backend.blockchain().children(hash).ok().into_iter().flatten() { + tracing::trace!(target: PARENT_SEARCH_LOG_TARGET, ?child, child_depth, ?pending_distance, "Looking at child."); + + let aligned_with_pending = parent_aligned_with_pending && + (pending_distance.map_or(true, |dist| child_depth > dist) || + is_child_pending(child)); + + if ignore_alternative_branches && !aligned_with_pending { + tracing::trace!(target: PARENT_SEARCH_LOG_TARGET, ?child, "Child is not aligned with pending block."); + continue + } + + let Ok(Some(header)) = backend.blockchain().header(child) else { continue }; + + frontier.push(PotentialParent { + hash: child, + header, + depth: child_depth, + aligned_with_pending, + }); + } + } + + potential_parents +} diff --git a/cumulus/client/consensus/common/src/tests.rs b/cumulus/client/consensus/common/src/tests.rs index 2a944bc7f9f..284fa39ed1e 100644 --- a/cumulus/client/consensus/common/src/tests.rs +++ b/cumulus/client/consensus/common/src/tests.rs @@ -20,7 +20,7 @@ use async_trait::async_trait; use codec::Encode; use cumulus_client_pov_recovery::RecoveryKind; use cumulus_primitives_core::{ - relay_chain::{self, BlockId}, + relay_chain::{BlockId, BlockNumber, CoreState}, CumulusDigestItem, InboundDownwardMessage, InboundHrmpMessage, }; use cumulus_relay_chain_interface::{ @@ -37,6 +37,7 @@ use futures_timer::Delay; use polkadot_primitives::HeadData; use sc_client_api::{Backend as _, UsageProvider}; use sc_consensus::{BlockImport, BlockImportParams, ForkChoiceStrategy}; +use sp_blockchain::Backend as BlockchainBackend; use sp_consensus::{BlockOrigin, BlockStatus}; use sp_version::RuntimeVersion; use std::{ @@ -46,11 +47,11 @@ use std::{ time::Duration, }; -fn relay_block_num_from_hash(hash: &PHash) -> relay_chain::BlockNumber { +fn relay_block_num_from_hash(hash: &PHash) -> BlockNumber { hash.to_low_u64_be() as u32 } -fn relay_hash_from_block_num(block_number: relay_chain::BlockNumber) -> PHash { +fn relay_hash_from_block_num(block_number: BlockNumber) -> PHash { PHash::from_low_u64_be(block_number as u64) } @@ -257,6 +258,13 @@ impl RelayChainInterface for Relaychain { })) } + async fn availability_cores( + &self, + _relay_parent: PHash, + ) -> RelayChainResult>> { + unimplemented!("Not needed for test"); + } + async fn version(&self, _: PHash) -> RelayChainResult { unimplemented!("Not needed for test") } @@ -1138,6 +1146,357 @@ fn find_potential_parents_with_max_depth() { } } +#[test] +fn find_potential_parents_unknown_included() { + sp_tracing::try_init_simple(); + + const NON_INCLUDED_CHAIN_LEN: usize = 5; + + let backend = Arc::new(Backend::new_test(1000, 1)); + let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build()); + let relay_parent = relay_hash_from_block_num(10); + // Choose different relay parent for alternative chain to get new hashes. + let search_relay_parent = relay_hash_from_block_num(11); + + let sproof = sproof_with_best_parent(&client); + let included_but_unknown = build_block(&*client, sproof, None, None, Some(relay_parent)); + + let relay_chain = Relaychain::new(); + { + let relay_inner = &mut relay_chain.inner.lock().unwrap(); + relay_inner + .relay_chain_hash_to_header + .insert(search_relay_parent, included_but_unknown.header().clone()); + } + + // Ignore alternative branch: + let potential_parents = block_on(find_potential_parents( + ParentSearchParams { + relay_parent: search_relay_parent, + para_id: ParaId::from(100), + ancestry_lookback: 1, // aligned chain is in ancestry. + max_depth: NON_INCLUDED_CHAIN_LEN, + ignore_alternative_branches: true, + }, + &*backend, + &relay_chain, + )) + .unwrap(); + + assert_eq!(potential_parents.len(), 0); +} + +#[test] +fn find_potential_parents_unknown_pending() { + sp_tracing::try_init_simple(); + + const NON_INCLUDED_CHAIN_LEN: usize = 5; + + let backend = Arc::new(Backend::new_test(1000, 1)); + let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build()); + let mut para_import = + ParachainBlockImport::new_with_delayed_best_block(client.clone(), backend.clone()); + + let relay_parent = relay_hash_from_block_num(10); + // Choose different relay parent for alternative chain to get new hashes. + let search_relay_parent = relay_hash_from_block_num(11); + let included_block = build_and_import_block_ext( + &client, + BlockOrigin::NetworkInitialSync, + true, + &mut para_import, + None, + None, + Some(relay_parent), + ); + + let sproof = sproof_with_parent_by_hash(&client, included_block.header().hash()); + let pending_but_unknown = build_block( + &*client, + sproof, + Some(included_block.header().hash()), + None, + Some(relay_parent), + ); + + let relay_chain = Relaychain::new(); + { + let relay_inner = &mut relay_chain.inner.lock().unwrap(); + relay_inner + .relay_chain_hash_to_header + .insert(search_relay_parent, included_block.header().clone()); + relay_inner + .relay_chain_hash_to_header_pending + .insert(search_relay_parent, pending_but_unknown.header().clone()); + } + + // Ignore alternative branch: + let potential_parents = block_on(find_potential_parents( + ParentSearchParams { + relay_parent: search_relay_parent, + para_id: ParaId::from(100), + ancestry_lookback: 1, // aligned chain is in ancestry. + max_depth: NON_INCLUDED_CHAIN_LEN, + ignore_alternative_branches: true, + }, + &*backend, + &relay_chain, + )) + .unwrap(); + + assert!(potential_parents.is_empty()); +} + +#[test] +fn find_potential_parents_unknown_pending_include_alternative_branches() { + sp_tracing::try_init_simple(); + + const NON_INCLUDED_CHAIN_LEN: usize = 5; + + let backend = Arc::new(Backend::new_test(1000, 1)); + let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build()); + let mut para_import = + ParachainBlockImport::new_with_delayed_best_block(client.clone(), backend.clone()); + + let relay_parent = relay_hash_from_block_num(10); + + // Choose different relay parent for alternative chain to get new hashes. + let search_relay_parent = relay_hash_from_block_num(11); + + let included_block = build_and_import_block_ext( + &client, + BlockOrigin::NetworkInitialSync, + true, + &mut para_import, + None, + None, + Some(relay_parent), + ); + + let alt_block = build_and_import_block_ext( + &client, + BlockOrigin::NetworkInitialSync, + true, + &mut para_import, + Some(included_block.header().hash()), + None, + Some(search_relay_parent), + ); + + tracing::info!(hash = %alt_block.header().hash(), "Alt block."); + let sproof = sproof_with_parent_by_hash(&client, included_block.header().hash()); + let pending_but_unknown = build_block( + &*client, + sproof, + Some(included_block.header().hash()), + None, + Some(relay_parent), + ); + + let relay_chain = Relaychain::new(); + { + let relay_inner = &mut relay_chain.inner.lock().unwrap(); + relay_inner + .relay_chain_hash_to_header + .insert(search_relay_parent, included_block.header().clone()); + relay_inner + .relay_chain_hash_to_header_pending + .insert(search_relay_parent, pending_but_unknown.header().clone()); + } + + // Ignore alternative branch: + let potential_parents = block_on(find_potential_parents( + ParentSearchParams { + relay_parent: search_relay_parent, + para_id: ParaId::from(100), + ancestry_lookback: 1, // aligned chain is in ancestry. + max_depth: NON_INCLUDED_CHAIN_LEN, + ignore_alternative_branches: false, + }, + &*backend, + &relay_chain, + )) + .unwrap(); + + let expected_parents: Vec<_> = vec![&included_block, &alt_block]; + assert_eq!(potential_parents.len(), 2); + assert_eq!(expected_parents[0].hash(), potential_parents[0].hash); + assert_eq!(expected_parents[1].hash(), potential_parents[1].hash); +} + +/// Test where there are multiple pending blocks. +#[test] +fn find_potential_parents_aligned_with_late_pending() { + sp_tracing::try_init_simple(); + + const NON_INCLUDED_CHAIN_LEN: usize = 5; + + let backend = Arc::new(Backend::new_test(1000, 1)); + let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build()); + let mut para_import = + ParachainBlockImport::new_with_delayed_best_block(client.clone(), backend.clone()); + + let relay_parent = relay_hash_from_block_num(10); + // Choose different relay parent for alternative chain to get new hashes. + let search_relay_parent = relay_hash_from_block_num(11); + let included_block = build_and_import_block_ext( + &client, + BlockOrigin::NetworkInitialSync, + true, + &mut para_import, + None, + None, + Some(relay_parent), + ); + + let in_between_block = build_and_import_block_ext( + &client, + BlockOrigin::NetworkInitialSync, + true, + &mut para_import, + Some(included_block.header().hash()), + None, + Some(relay_parent), + ); + + let pending_block = build_and_import_block_ext( + &client, + BlockOrigin::Own, + true, + &mut para_import, + Some(in_between_block.header().hash()), + None, + Some(relay_parent), + ); + + let relay_chain = Relaychain::new(); + { + let relay_inner = &mut relay_chain.inner.lock().unwrap(); + relay_inner + .relay_chain_hash_to_header + .insert(search_relay_parent, included_block.header().clone()); + relay_inner + .relay_chain_hash_to_header_pending + .insert(search_relay_parent, in_between_block.header().clone()); + relay_inner + .relay_chain_hash_to_header_pending + .insert(search_relay_parent, pending_block.header().clone()); + } + + // Build some blocks on the pending block and on the included block. + // We end up with two sibling chains, one is aligned with the pending block, + // the other is not. + let mut aligned_blocks = Vec::new(); + let mut parent = pending_block.header().hash(); + for _ in 2..NON_INCLUDED_CHAIN_LEN { + let block = build_and_import_block_ext( + &client, + BlockOrigin::Own, + true, + &mut para_import, + Some(parent), + None, + Some(relay_parent), + ); + parent = block.header().hash(); + aligned_blocks.push(block); + } + + let mut alt_blocks = Vec::new(); + let mut parent = included_block.header().hash(); + for _ in 0..NON_INCLUDED_CHAIN_LEN { + let block = build_and_import_block_ext( + &client, + BlockOrigin::NetworkInitialSync, + true, + &mut para_import, + Some(parent), + None, + Some(search_relay_parent), + ); + parent = block.header().hash(); + alt_blocks.push(block); + } + + // Ignore alternative branch: + for max_depth in 0..=NON_INCLUDED_CHAIN_LEN { + let potential_parents = block_on(find_potential_parents( + ParentSearchParams { + relay_parent: search_relay_parent, + para_id: ParaId::from(100), + ancestry_lookback: 1, // aligned chain is in ancestry. + max_depth, + ignore_alternative_branches: true, + }, + &*backend, + &relay_chain, + )) + .unwrap(); + + assert_eq!(potential_parents.len(), max_depth + 1); + let expected_parents: Vec<_> = [&included_block, &in_between_block, &pending_block] + .into_iter() + .chain(aligned_blocks.iter()) + .take(max_depth + 1) + .collect(); + + for i in 0..(max_depth + 1) { + let parent = &potential_parents[i]; + let expected = &expected_parents[i]; + + assert_eq!(parent.hash, expected.hash()); + assert_eq!(&parent.header, expected.header()); + assert_eq!(parent.depth, i); + assert!(parent.aligned_with_pending); + } + } + + // Do not ignore: + for max_depth in 0..=NON_INCLUDED_CHAIN_LEN { + let potential_parents = block_on(find_potential_parents( + ParentSearchParams { + relay_parent: search_relay_parent, + para_id: ParaId::from(100), + ancestry_lookback: 1, // aligned chain is in ancestry. + max_depth, + ignore_alternative_branches: false, + }, + &*backend, + &relay_chain, + )) + .unwrap(); + + let expected_len = 2 * max_depth + 1; + assert_eq!(potential_parents.len(), expected_len); + let expected_aligned: Vec<_> = [&included_block, &in_between_block, &pending_block] + .into_iter() + .chain(aligned_blocks.iter()) + .take(max_depth + 1) + .collect(); + let expected_alt = alt_blocks.iter().take(max_depth); + + let expected_parents: Vec<_> = + expected_aligned.clone().into_iter().chain(expected_alt).collect(); + // Check correctness. + assert_eq!(expected_parents.len(), expected_len); + + for i in 0..expected_len { + let parent = &potential_parents[i]; + let expected = expected_parents + .iter() + .find(|block| block.header().hash() == parent.hash) + .expect("missing parent"); + + let is_aligned = expected_aligned.contains(&expected); + + assert_eq!(parent.hash, expected.hash()); + assert_eq!(&parent.header, expected.header()); + + assert_eq!(parent.aligned_with_pending, is_aligned); + } + } +} + #[test] fn find_potential_parents_aligned_with_pending() { sp_tracing::try_init_simple(); @@ -1249,6 +1608,7 @@ fn find_potential_parents_aligned_with_pending() { // Do not ignore: for max_depth in 0..=NON_INCLUDED_CHAIN_LEN { + log::info!("Ran with max_depth = {max_depth}"); let potential_parents = block_on(find_potential_parents( ParentSearchParams { relay_parent: search_relay_parent, @@ -1276,6 +1636,7 @@ fn find_potential_parents_aligned_with_pending() { // Check correctness. assert_eq!(expected_parents.len(), expected_len); + potential_parents.iter().for_each(|p| log::info!("result: {:?}", p)); for i in 0..expected_len { let parent = &potential_parents[i]; let expected = expected_parents @@ -1288,6 +1649,12 @@ fn find_potential_parents_aligned_with_pending() { assert_eq!(parent.hash, expected.hash()); assert_eq!(&parent.header, expected.header()); + log::info!( + "Check hash: {:?} expected: {} is: {}", + parent.hash, + is_aligned, + parent.aligned_with_pending, + ); assert_eq!(parent.aligned_with_pending, is_aligned); } } diff --git a/cumulus/client/network/src/tests.rs b/cumulus/client/network/src/tests.rs index eb0d7f0e01b..18d121c41d1 100644 --- a/cumulus/client/network/src/tests.rs +++ b/cumulus/client/network/src/tests.rs @@ -26,9 +26,10 @@ use futures::{executor::block_on, poll, task::Poll, FutureExt, Stream, StreamExt use parking_lot::Mutex; use polkadot_node_primitives::{SignedFullStatement, Statement}; use polkadot_primitives::{ - CandidateCommitments, CandidateDescriptor, CollatorPair, CommittedCandidateReceipt, - Hash as PHash, HeadData, InboundDownwardMessage, InboundHrmpMessage, OccupiedCoreAssumption, - PersistedValidationData, SessionIndex, SigningContext, ValidationCodeHash, ValidatorId, + BlockNumber, CandidateCommitments, CandidateDescriptor, CollatorPair, + CommittedCandidateReceipt, CoreState, Hash as PHash, HeadData, InboundDownwardMessage, + InboundHrmpMessage, OccupiedCoreAssumption, PersistedValidationData, SessionIndex, + SigningContext, ValidationCodeHash, ValidatorId, }; use polkadot_test_client::{ Client as PClient, ClientBlockImportExt, DefaultTestClientBuilderExt, FullBackend as PBackend, @@ -297,6 +298,13 @@ impl RelayChainInterface for DummyRelayChainInterface { Ok(header) } + async fn availability_cores( + &self, + _relay_parent: PHash, + ) -> RelayChainResult>> { + unimplemented!("Not needed for test"); + } + async fn version(&self, _: PHash) -> RelayChainResult { let version = self.data.lock().runtime_version; diff --git a/cumulus/client/parachain-inherent/Cargo.toml b/cumulus/client/parachain-inherent/Cargo.toml index 9d346ce17f5..d81f727b41b 100644 --- a/cumulus/client/parachain-inherent/Cargo.toml +++ b/cumulus/client/parachain-inherent/Cargo.toml @@ -9,7 +9,6 @@ license = "Apache-2.0" [dependencies] async-trait = { workspace = true } codec = { features = ["derive"], workspace = true, default-features = true } -scale-info = { features = ["derive"], workspace = true, default-features = true } tracing = { workspace = true, default-features = true } # Substrate diff --git a/cumulus/client/pov-recovery/src/tests.rs b/cumulus/client/pov-recovery/src/tests.rs index 75bf308ef27..6f274ed18b6 100644 --- a/cumulus/client/pov-recovery/src/tests.rs +++ b/cumulus/client/pov-recovery/src/tests.rs @@ -17,7 +17,9 @@ use super::*; use assert_matches::assert_matches; use codec::{Decode, Encode}; -use cumulus_primitives_core::relay_chain::{BlockId, CandidateCommitments, CandidateDescriptor}; +use cumulus_primitives_core::relay_chain::{ + BlockId, CandidateCommitments, CandidateDescriptor, CoreState, +}; use cumulus_relay_chain_interface::{ InboundDownwardMessage, InboundHrmpMessage, OccupiedCoreAssumption, PHash, PHeader, PersistedValidationData, StorageValue, ValidationCodeHash, ValidatorId, @@ -478,6 +480,13 @@ impl RelayChainInterface for Relaychain { async fn header(&self, _: BlockId) -> RelayChainResult> { unimplemented!("Not needed for test"); } + + async fn availability_cores( + &self, + _: PHash, + ) -> RelayChainResult>>> { + unimplemented!("Not needed for test"); + } } fn make_candidate_chain(candidate_number_range: Range) -> Vec { diff --git a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs index 7871623e844..8f8d666bd14 100644 --- a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs +++ b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs @@ -19,9 +19,9 @@ use std::{pin::Pin, sync::Arc, time::Duration}; use async_trait::async_trait; use cumulus_primitives_core::{ relay_chain::{ - runtime_api::ParachainHost, Block as PBlock, BlockId, CommittedCandidateReceipt, - Hash as PHash, Header as PHeader, InboundHrmpMessage, OccupiedCoreAssumption, SessionIndex, - ValidationCodeHash, ValidatorId, + runtime_api::ParachainHost, Block as PBlock, BlockId, BlockNumber, + CommittedCandidateReceipt, CoreState, Hash as PHash, Header as PHeader, InboundHrmpMessage, + OccupiedCoreAssumption, SessionIndex, ValidationCodeHash, ValidatorId, }, InboundDownwardMessage, ParaId, PersistedValidationData, }; @@ -256,6 +256,13 @@ impl RelayChainInterface for RelayChainInProcessInterface { Ok(Box::pin(notifications_stream)) } + async fn availability_cores( + &self, + relay_parent: PHash, + ) -> RelayChainResult>> { + Ok(self.full_client.runtime_api().availability_cores(relay_parent)?) + } + async fn candidates_pending_availability( &self, hash: PHash, diff --git a/cumulus/client/relay-chain-interface/src/lib.rs b/cumulus/client/relay-chain-interface/src/lib.rs index 46e19b40f01..d02035e84e9 100644 --- a/cumulus/client/relay-chain-interface/src/lib.rs +++ b/cumulus/client/relay-chain-interface/src/lib.rs @@ -29,8 +29,8 @@ use sp_api::ApiError; use cumulus_primitives_core::relay_chain::BlockId; pub use cumulus_primitives_core::{ relay_chain::{ - CommittedCandidateReceipt, Hash as PHash, Header as PHeader, InboundHrmpMessage, - OccupiedCoreAssumption, SessionIndex, ValidationCodeHash, ValidatorId, + BlockNumber, CommittedCandidateReceipt, CoreState, Hash as PHash, Header as PHeader, + InboundHrmpMessage, OccupiedCoreAssumption, SessionIndex, ValidationCodeHash, ValidatorId, }, InboundDownwardMessage, ParaId, PersistedValidationData, }; @@ -217,6 +217,14 @@ pub trait RelayChainInterface: Send + Sync { /// Get the runtime version of the relay chain. async fn version(&self, relay_parent: PHash) -> RelayChainResult; + + /// Yields information on all availability cores as relevant to the child block. + /// + /// Cores are either free, scheduled or occupied. Free cores can have paras assigned to them. + async fn availability_cores( + &self, + relay_parent: PHash, + ) -> RelayChainResult>>; } #[async_trait] @@ -337,6 +345,13 @@ where .await } + async fn availability_cores( + &self, + relay_parent: PHash, + ) -> RelayChainResult>> { + (**self).availability_cores(relay_parent).await + } + async fn candidates_pending_availability( &self, block_id: PHash, diff --git a/cumulus/client/relay-chain-minimal-node/Cargo.toml b/cumulus/client/relay-chain-minimal-node/Cargo.toml index 1d89316d400..95ecadc8bd0 100644 --- a/cumulus/client/relay-chain-minimal-node/Cargo.toml +++ b/cumulus/client/relay-chain-minimal-node/Cargo.toml @@ -17,13 +17,7 @@ polkadot-overseer = { workspace = true, default-features = true } polkadot-node-subsystem-util = { workspace = true, default-features = true } polkadot-node-network-protocol = { workspace = true, default-features = true } -polkadot-availability-recovery = { workspace = true, default-features = true } -polkadot-collator-protocol = { workspace = true, default-features = true } polkadot-network-bridge = { workspace = true, default-features = true } -polkadot-node-collation-generation = { workspace = true, default-features = true } -polkadot-node-core-runtime-api = { workspace = true, default-features = true } -polkadot-node-core-chain-api = { workspace = true, default-features = true } -polkadot-node-core-prospective-parachains = { workspace = true, default-features = true } polkadot-service = { workspace = true, default-features = true } # substrate deps @@ -51,4 +45,3 @@ array-bytes = { workspace = true, default-features = true } tracing = { workspace = true, default-features = true } async-trait = { workspace = true } futures = { workspace = true } -parking_lot = { workspace = true, default-features = true } diff --git a/cumulus/client/relay-chain-rpc-interface/src/lib.rs b/cumulus/client/relay-chain-rpc-interface/src/lib.rs index bb7bfa5dc32..692a1fb537a 100644 --- a/cumulus/client/relay-chain-rpc-interface/src/lib.rs +++ b/cumulus/client/relay-chain-rpc-interface/src/lib.rs @@ -24,7 +24,7 @@ use cumulus_primitives_core::{ InboundDownwardMessage, ParaId, PersistedValidationData, }; use cumulus_relay_chain_interface::{ - PHeader, RelayChainError, RelayChainInterface, RelayChainResult, + BlockNumber, CoreState, PHeader, RelayChainError, RelayChainInterface, RelayChainResult, }; use futures::{FutureExt, Stream, StreamExt}; use polkadot_overseer::Handle; @@ -252,4 +252,11 @@ impl RelayChainInterface for RelayChainRpcInterface { async fn version(&self, relay_parent: RelayHash) -> RelayChainResult { self.rpc_client.runtime_version(relay_parent).await } + + async fn availability_cores( + &self, + relay_parent: RelayHash, + ) -> RelayChainResult>> { + self.rpc_client.parachain_host_availability_cores(relay_parent).await + } } diff --git a/cumulus/pallets/aura-ext/src/consensus_hook.rs b/cumulus/pallets/aura-ext/src/consensus_hook.rs index 59202980339..560d477b2a8 100644 --- a/cumulus/pallets/aura-ext/src/consensus_hook.rs +++ b/cumulus/pallets/aura-ext/src/consensus_hook.rs @@ -65,9 +65,19 @@ where let para_slot_from_relay = Slot::from_timestamp(relay_chain_timestamp.into(), para_slot_duration); - // Perform checks. - assert_eq!(slot, para_slot_from_relay, "slot number mismatch"); - if authored > velocity + 1 { + // Check that we are not too far in the future. Since we expect `V` parachain blocks + // during the relay chain slot, we can allow for `V` parachain slots into the future. + if *slot > *para_slot_from_relay + u64::from(velocity) { + panic!( + "Parachain slot is too far in the future: parachain_slot: {:?}, derived_from_relay_slot: {:?} velocity: {:?}", + slot, + para_slot_from_relay, + velocity + ); + } + + // We need to allow authoring multiple blocks in the same slot. + if slot != para_slot_from_relay && authored > velocity { panic!("authored blocks limit is reached for the slot") } let weight = T::DbWeight::get().reads(1); @@ -113,6 +123,11 @@ impl< return false } + // TODO: This logic needs to be adjusted. + // It checks that we have not authored more than `V + 1` blocks in the slot. + // As a slot however, we take the parachain slot here. Velocity should + // be measured in relation to the relay chain slot. + // https://github.com/paritytech/polkadot-sdk/issues/3967 if last_slot == new_slot { authored_so_far < velocity + 1 } else { diff --git a/cumulus/pallets/aura-ext/src/lib.rs b/cumulus/pallets/aura-ext/src/lib.rs index 7ca84dff7c5..4605dd325be 100644 --- a/cumulus/pallets/aura-ext/src/lib.rs +++ b/cumulus/pallets/aura-ext/src/lib.rs @@ -83,7 +83,7 @@ pub mod pallet { SlotInfo::::put((new_slot, authored)); - T::DbWeight::get().reads_writes(2, 1) + T::DbWeight::get().reads_writes(4, 2) } } diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index ae5abdcfab6..7085211dad2 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -120,7 +120,7 @@ substrate-build-script-utils = { workspace = true, default-features = true } assert_cmd = { workspace = true } nix = { features = ["signal"], workspace = true } tempfile = { workspace = true } -tokio = { features = ["macros", "parking_lot", "time"], workspace = true, default-features = true } +tokio = { version = "1.32.0", features = ["macros", "parking_lot", "time"] } wait-timeout = { workspace = true } [features] diff --git a/cumulus/polkadot-parachain/src/cli.rs b/cumulus/polkadot-parachain/src/cli.rs index 3f8a2ec0d11..7c01e34f9a0 100644 --- a/cumulus/polkadot-parachain/src/cli.rs +++ b/cumulus/polkadot-parachain/src/cli.rs @@ -73,6 +73,12 @@ pub struct Cli { #[command(flatten)] pub run: cumulus_client_cli::RunCmd, + /// EXPERIMENTAL: Use slot-based collator which can handle elastic scaling. + /// + /// Use with care, this flag is unstable and subject to change. + #[arg(long)] + pub experimental_use_slot_based: bool, + /// Disable automatic hardware benchmarks. /// /// By default these benchmarks are automatically ran at startup and measure diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index 2a1f20d5c17..323216f300d 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -690,6 +690,7 @@ pub fn run() -> Result<()> { polkadot_config, collator_options, id, + cli.experimental_use_slot_based, hwbench, ) .await, @@ -699,6 +700,7 @@ pub fn run() -> Result<()> { polkadot_config, collator_options, id, + cli.experimental_use_slot_based, hwbench, ) .await, @@ -713,24 +715,27 @@ async fn start_node>( polkadot_config: sc_service::Configuration, collator_options: cumulus_client_cli::CollatorOptions, id: ParaId, + use_experimental_slot_based: bool, hwbench: Option, ) -> Result { match config.chain_spec.runtime()? { - Runtime::AssetHubPolkadot => crate::service::start_asset_hub_lookahead_node::< - AssetHubPolkadotRuntimeApi, - AssetHubPolkadotAuraId, - Network, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), + Runtime::AssetHubPolkadot => + crate::service::start_asset_hub_async_backing_node::< + AssetHubPolkadotRuntimeApi, + AssetHubPolkadotAuraId, + Network, + >(config, polkadot_config, collator_options, id, use_experimental_slot_based, hwbench) + .await + .map(|r| r.0) + .map_err(Into::into), Runtime::AssetHub | Runtime::Collectives => - crate::service::start_generic_aura_lookahead_node::( + crate::service::start_generic_aura_async_backing_node::( config, polkadot_config, collator_options, id, + use_experimental_slot_based, hwbench, ) .await @@ -753,6 +758,7 @@ async fn start_node>( polkadot_config, collator_options, id, + use_experimental_slot_based, hwbench, ) .await @@ -770,11 +776,12 @@ async fn start_node>( chain_spec::bridge_hubs::BridgeHubRuntimeType::Rococo | chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoLocal | chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoDevelopment => - crate::service::start_generic_aura_lookahead_node::( + crate::service::start_generic_aura_async_backing_node::( config, polkadot_config, collator_options, id, + use_experimental_slot_based, hwbench, ) .await @@ -793,11 +800,12 @@ async fn start_node>( chain_spec::coretime::CoretimeRuntimeType::Westend | chain_spec::coretime::CoretimeRuntimeType::WestendLocal | chain_spec::coretime::CoretimeRuntimeType::WestendDevelopment => - crate::service::start_generic_aura_lookahead_node::( + crate::service::start_generic_aura_async_backing_node::( config, polkadot_config, collator_options, id, + use_experimental_slot_based, hwbench, ) .await @@ -810,17 +818,19 @@ async fn start_node>( polkadot_config, collator_options, id, + use_experimental_slot_based, hwbench, ) .await .map(|r| r.0) .map_err(Into::into), - Runtime::Glutton => crate::service::start_basic_lookahead_node::( + Runtime::Glutton => crate::service::start_basic_async_backing_node::( config, polkadot_config, collator_options, id, + use_experimental_slot_based, hwbench, ) .await @@ -838,11 +848,12 @@ async fn start_node>( chain_spec::people::PeopleRuntimeType::Westend | chain_spec::people::PeopleRuntimeType::WestendLocal | chain_spec::people::PeopleRuntimeType::WestendDevelopment => - crate::service::start_generic_aura_lookahead_node::( + crate::service::start_generic_aura_async_backing_node::( config, polkadot_config, collator_options, id, + use_experimental_slot_based, hwbench, ) .await @@ -857,6 +868,7 @@ async fn start_node>( polkadot_config, collator_options, id, + use_experimental_slot_based, hwbench, ) .await diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index 42efe8098b2..0f2aed8ee4d 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -16,7 +16,10 @@ use cumulus_client_cli::CollatorOptions; use cumulus_client_collator::service::CollatorService; -use cumulus_client_consensus_aura::collators::lookahead::{self as aura, Params as AuraParams}; +use cumulus_client_consensus_aura::collators::{ + lookahead::{self as aura, Params as AuraParams}, + slot_based::{self as slot_based, Params as SlotBasedParams}, +}; use cumulus_client_consensus_common::ParachainBlockImport as TParachainBlockImport; use cumulus_client_consensus_proposer::Proposer; #[allow(deprecated)] @@ -51,7 +54,6 @@ use sc_consensus::{ }; use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; use sc_network::{config::FullNetworkConfiguration, service::traits::NetworkBackend, NetworkBlock}; -use sc_network_sync::SyncingService; use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; use sp_api::{ApiExt, ConstructRuntimeApi, ProvideRuntimeApi}; @@ -214,7 +216,6 @@ where &TaskManager, Arc, Arc>>, - Arc>, KeystorePtr, Duration, ParaId, @@ -348,7 +349,6 @@ where &task_manager, relay_chain_interface.clone(), transaction_pool, - sync_service.clone(), params.keystore_container.keystore(), relay_chain_slot_duration, para_id, @@ -408,8 +408,14 @@ pub async fn start_rococo_parachain_node>( polkadot_config: Configuration, collator_options: CollatorOptions, para_id: ParaId, + use_experimental_slot_based: bool, hwbench: Option, ) -> sc_service::error::Result<(TaskManager, Arc>)> { + let consensus_starter = if use_experimental_slot_based { + start_slot_based_aura_consensus::<_, AuraId> + } else { + start_lookahead_aura_consensus::<_, AuraId> + }; start_node_impl::( parachain_config, polkadot_config, @@ -418,7 +424,7 @@ pub async fn start_rococo_parachain_node>( para_id, build_parachain_rpc_extensions::, build_aura_import_queue, - start_lookahead_aura_consensus::<_, AuraId>, + consensus_starter, hwbench, ) .await @@ -580,13 +586,19 @@ where /// Uses the lookahead collator to support async backing. /// /// Start an aura powered parachain node. Some system chains use this. -pub async fn start_generic_aura_lookahead_node>( +pub async fn start_generic_aura_async_backing_node>( parachain_config: Configuration, polkadot_config: Configuration, collator_options: CollatorOptions, para_id: ParaId, + use_experimental_slot_based: bool, hwbench: Option, ) -> sc_service::error::Result<(TaskManager, Arc>)> { + let consensus_starter = if use_experimental_slot_based { + start_slot_based_aura_consensus::<_, AuraId> + } else { + start_lookahead_aura_consensus::<_, AuraId> + }; start_node_impl::( parachain_config, polkadot_config, @@ -595,7 +607,7 @@ pub async fn start_generic_aura_lookahead_node> para_id, build_parachain_rpc_extensions::, build_relay_to_aura_import_queue::<_, AuraId>, - start_lookahead_aura_consensus::<_, AuraId>, + consensus_starter, hwbench, ) .await @@ -607,11 +619,12 @@ pub async fn start_generic_aura_lookahead_node> /// /// Uses the lookahead collator to support async backing. #[sc_tracing::logging::prefix_logs_with("Parachain")] -pub async fn start_asset_hub_lookahead_node( +pub async fn start_asset_hub_async_backing_node( parachain_config: Configuration, polkadot_config: Configuration, collator_options: CollatorOptions, para_id: ParaId, + use_experimental_slot_based: bool, hwbench: Option, ) -> sc_service::error::Result<(TaskManager, Arc>)> where @@ -622,15 +635,21 @@ where AuraId: AuraIdT + Sync, Net: NetworkBackend, { + let consensus_starter = if use_experimental_slot_based { + start_slot_based_aura_consensus::<_, AuraId> + } else { + start_lookahead_aura_consensus::<_, AuraId> + }; + start_node_impl::( parachain_config, polkadot_config, collator_options, CollatorSybilResistance::Resistant, // Aura para_id, - build_parachain_rpc_extensions::, + build_parachain_rpc_extensions, build_relay_to_aura_import_queue::<_, AuraId>, - start_lookahead_aura_consensus::, + consensus_starter, hwbench, ) .await @@ -676,7 +695,6 @@ fn start_relay_chain_consensus( task_manager: &TaskManager, relay_chain_interface: Arc, transaction_pool: Arc>>, - _sync_oracle: Arc>, _keystore: KeystorePtr, _relay_chain_slot_duration: Duration, para_id: ParaId, @@ -747,7 +765,6 @@ fn start_lookahead_aura_consensus( task_manager: &TaskManager, relay_chain_interface: Arc, transaction_pool: Arc>>, - sync_oracle: Arc>, keystore: KeystorePtr, relay_chain_slot_duration: Duration, para_id: ParaId, @@ -788,7 +805,6 @@ where client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) } }, - sync_oracle, keystore, collator_key, para_id, @@ -802,23 +818,104 @@ where let fut = async move { wait_for_aura(client).await; - aura::run::::Pair, _, _, _, _, _, _, _, _, _>(params).await; + aura::run::::Pair, _, _, _, _, _, _, _, _>(params).await; }; task_manager.spawn_essential_handle().spawn("aura", None, fut); Ok(()) } +/// Start consensus using the lookahead aura collator. +fn start_slot_based_aura_consensus( + client: Arc>, + block_import: ParachainBlockImport, + prometheus_registry: Option<&Registry>, + telemetry: Option, + task_manager: &TaskManager, + relay_chain_interface: Arc, + transaction_pool: Arc>>, + keystore: KeystorePtr, + relay_chain_slot_duration: Duration, + para_id: ParaId, + collator_key: CollatorPair, + _overseer_handle: OverseerHandle, + announce_block: Arc>) + Send + Sync>, + backend: Arc, +) -> Result<(), sc_service::Error> +where + RuntimeApi: ConstructNodeRuntimeApi>, + RuntimeApi::RuntimeApi: AuraRuntimeApi, + AuraId: AuraIdT + Sync, +{ + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( + task_manager.spawn_handle(), + client.clone(), + transaction_pool, + prometheus_registry, + telemetry.clone(), + ); + + let proposer = Proposer::new(proposer_factory); + let collator_service = CollatorService::new( + client.clone(), + Arc::new(task_manager.spawn_handle()), + announce_block, + client.clone(), + ); + + let client_for_aura = client.clone(); + let params = SlotBasedParams { + create_inherent_data_providers: move |_, ()| async move { Ok(()) }, + block_import, + para_client: client.clone(), + para_backend: backend.clone(), + relay_client: relay_chain_interface, + code_hash_provider: move |block_hash| { + client_for_aura.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) + }, + keystore, + collator_key, + para_id, + relay_chain_slot_duration, + proposer, + collator_service, + authoring_duration: Duration::from_millis(2000), + reinitialize: false, + slot_drift: Duration::from_secs(1), + }; + + let (collation_future, block_builder_future) = + slot_based::run::::Pair, _, _, _, _, _, _, _, _>(params); + + task_manager.spawn_essential_handle().spawn( + "collation-task", + Some("parachain-block-authoring"), + collation_future, + ); + task_manager.spawn_essential_handle().spawn( + "block-builder-task", + Some("parachain-block-authoring"), + block_builder_future, + ); + Ok(()) +} + /// Start an aura powered parachain node which uses the lookahead collator to support async backing. /// This node is basic in the sense that its runtime api doesn't include common contents such as /// transaction payment. Used for aura glutton. -pub async fn start_basic_lookahead_node>( +pub async fn start_basic_async_backing_node>( parachain_config: Configuration, polkadot_config: Configuration, collator_options: CollatorOptions, para_id: ParaId, + use_experimental_slot_based: bool, hwbench: Option, ) -> sc_service::error::Result<(TaskManager, Arc>)> { + let consensus_starter = if use_experimental_slot_based { + start_slot_based_aura_consensus::<_, AuraId> + } else { + start_lookahead_aura_consensus::<_, AuraId> + }; start_node_impl::( parachain_config, polkadot_config, @@ -827,7 +924,7 @@ pub async fn start_basic_lookahead_node>( para_id, |_, _, _, _| Ok(RpcModule::new(())), build_relay_to_aura_import_queue::<_, AuraId>, - start_lookahead_aura_consensus::<_, AuraId>, + consensus_starter, hwbench, ) .await @@ -839,8 +936,14 @@ pub async fn start_contracts_rococo_node>( polkadot_config: Configuration, collator_options: CollatorOptions, para_id: ParaId, + use_experimental_slot_based: bool, hwbench: Option, ) -> sc_service::error::Result<(TaskManager, Arc>)> { + let consensus_starter = if use_experimental_slot_based { + start_slot_based_aura_consensus::<_, AuraId> + } else { + start_lookahead_aura_consensus::<_, AuraId> + }; start_node_impl::( parachain_config, polkadot_config, @@ -849,7 +952,7 @@ pub async fn start_contracts_rococo_node>( para_id, build_contracts_rpc_extensions, build_aura_import_queue, - start_lookahead_aura_consensus::<_, AuraId>, + consensus_starter, hwbench, ) .await diff --git a/cumulus/test/client/src/lib.rs b/cumulus/test/client/src/lib.rs index d233ad26917..f26413e441e 100644 --- a/cumulus/test/client/src/lib.rs +++ b/cumulus/test/client/src/lib.rs @@ -79,6 +79,7 @@ impl substrate_test_client::GenesisInit for GenesisParameters { cumulus_test_service::chain_spec::get_chain_spec_with_extra_endowed( None, self.endowed_accounts.clone(), + cumulus_test_runtime::WASM_BINARY.expect("WASM binary not compiled!"), ) .build_storage() .expect("Builds test runtime genesis storage") diff --git a/cumulus/test/runtime/Cargo.toml b/cumulus/test/runtime/Cargo.toml index fc0eb3ce742..d5582f2d2a2 100644 --- a/cumulus/test/runtime/Cargo.toml +++ b/cumulus/test/runtime/Cargo.toml @@ -93,3 +93,4 @@ std = [ "substrate-wasm-builder", ] increment-spec-version = [] +elastic-scaling = [] diff --git a/cumulus/test/runtime/build.rs b/cumulus/test/runtime/build.rs index ebd5c178cba..bf579f4121e 100644 --- a/cumulus/test/runtime/build.rs +++ b/cumulus/test/runtime/build.rs @@ -24,6 +24,13 @@ fn main() { .enable_feature("increment-spec-version") .set_file_name("wasm_binary_spec_version_incremented.rs") .build(); + + WasmBuilder::new() + .with_current_project() + .enable_feature("elastic-scaling") + .import_memory() + .set_file_name("wasm_binary_elastic_scaling.rs") + .build(); } #[cfg(not(feature = "std"))] diff --git a/cumulus/test/runtime/src/lib.rs b/cumulus/test/runtime/src/lib.rs index 26c6635e1ad..97cb02ab779 100644 --- a/cumulus/test/runtime/src/lib.rs +++ b/cumulus/test/runtime/src/lib.rs @@ -27,6 +27,11 @@ pub mod wasm_spec_version_incremented { include!(concat!(env!("OUT_DIR"), "/wasm_binary_spec_version_incremented.rs")); } +pub mod elastic_scaling { + #[cfg(feature = "std")] + include!(concat!(env!("OUT_DIR"), "/wasm_binary_elastic_scaling.rs")); +} + mod test_pallet; use frame_support::{derive_impl, traits::OnRuntimeUpgrade, PalletId}; use sp_api::{decl_runtime_apis, impl_runtime_apis}; @@ -83,8 +88,23 @@ impl_opaque_keys! { /// The para-id used in this runtime. pub const PARACHAIN_ID: u32 = 100; -const UNINCLUDED_SEGMENT_CAPACITY: u32 = 3; +#[cfg(not(feature = "elastic-scaling"))] +const UNINCLUDED_SEGMENT_CAPACITY: u32 = 4; +#[cfg(not(feature = "elastic-scaling"))] const BLOCK_PROCESSING_VELOCITY: u32 = 1; + +#[cfg(feature = "elastic-scaling")] +const UNINCLUDED_SEGMENT_CAPACITY: u32 = 7; +#[cfg(feature = "elastic-scaling")] +const BLOCK_PROCESSING_VELOCITY: u32 = 4; + +#[cfg(not(feature = "elastic-scaling"))] +pub const MILLISECS_PER_BLOCK: u64 = 6000; +#[cfg(feature = "elastic-scaling")] +pub const MILLISECS_PER_BLOCK: u64 = 2000; + +pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; + const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; // The only difference between the two declarations below is the `spec_version`. With the @@ -126,10 +146,6 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { state_version: 1, }; -pub const MILLISECS_PER_BLOCK: u64 = 6000; - -pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; - pub const EPOCH_DURATION_IN_BLOCKS: u32 = 10 * MINUTES; // These time units are defined in number of blocks. diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index c40863b90b5..f766d123632 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -92,8 +92,6 @@ pallet-timestamp = { workspace = true, default-features = true } [dev-dependencies] futures = { workspace = true } portpicker = { workspace = true } -rococo-parachain-runtime = { workspace = true } -sp-consensus-grandpa = { workspace = true, default-features = true } sp-authority-discovery = { workspace = true, default-features = true } cumulus-test-client = { workspace = true } @@ -116,7 +114,6 @@ runtime-benchmarks = [ "polkadot-primitives/runtime-benchmarks", "polkadot-service/runtime-benchmarks", "polkadot-test-service/runtime-benchmarks", - "rococo-parachain-runtime/runtime-benchmarks", "sc-service/runtime-benchmarks", "sp-runtime/runtime-benchmarks", ] diff --git a/cumulus/test/service/src/chain_spec.rs b/cumulus/test/service/src/chain_spec.rs index 174d478f257..ae71028ad48 100644 --- a/cumulus/test/service/src/chain_spec.rs +++ b/cumulus/test/service/src/chain_spec.rs @@ -66,9 +66,10 @@ where pub fn get_chain_spec_with_extra_endowed( id: Option, extra_endowed_accounts: Vec, + code: &[u8], ) -> ChainSpec { ChainSpec::builder( - cumulus_test_runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"), + code, Extensions { para_id: id.unwrap_or(cumulus_test_runtime::PARACHAIN_ID.into()).into() }, ) .with_name("Local Testnet") @@ -83,7 +84,21 @@ pub fn get_chain_spec_with_extra_endowed( /// Get the chain spec for a specific parachain ID. pub fn get_chain_spec(id: Option) -> ChainSpec { - get_chain_spec_with_extra_endowed(id, Default::default()) + get_chain_spec_with_extra_endowed( + id, + Default::default(), + cumulus_test_runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"), + ) +} + +/// Get the chain spec for a specific parachain ID. +pub fn get_elastic_scaling_chain_spec(id: Option) -> ChainSpec { + get_chain_spec_with_extra_endowed( + id, + Default::default(), + cumulus_test_runtime::elastic_scaling::WASM_BINARY + .expect("WASM binary was not built, please build it!"), + ) } /// Local testnet genesis for testing. diff --git a/cumulus/test/service/src/cli.rs b/cumulus/test/service/src/cli.rs index 87d1d4af8a9..37ca27542cb 100644 --- a/cumulus/test/service/src/cli.rs +++ b/cumulus/test/service/src/cli.rs @@ -50,6 +50,12 @@ pub struct TestCollatorCli { #[arg(long)] pub fail_pov_recovery: bool, + + /// EXPERIMENTAL: Use slot-based collator which can handle elastic scaling. + /// + /// Use with care, this flag is unstable and subject to change. + #[arg(long)] + pub experimental_use_slot_based: bool, } #[derive(Debug, clap::Subcommand)] @@ -253,8 +259,16 @@ impl SubstrateCli for TestCollatorCli { fn load_spec(&self, id: &str) -> std::result::Result, String> { Ok(match id { - "" => - Box::new(cumulus_test_service::get_chain_spec(Some(ParaId::from(2000)))) as Box<_>, + "" => { + tracing::info!("Using default test service chain spec."); + Box::new(cumulus_test_service::get_chain_spec(Some(ParaId::from(2000)))) as Box<_> + }, + "elastic-scaling" => { + tracing::info!("Using elastic-scaling chain spec."); + Box::new(cumulus_test_service::get_elastic_scaling_chain_spec(Some(ParaId::from( + 2100, + )))) as Box<_> + }, path => { let chain_spec = cumulus_test_service::chain_spec::ChainSpec::from_json_file(path.into())?; diff --git a/cumulus/test/service/src/lib.rs b/cumulus/test/service/src/lib.rs index 6f8b9d19bb2..51cdebbaf54 100644 --- a/cumulus/test/service/src/lib.rs +++ b/cumulus/test/service/src/lib.rs @@ -25,7 +25,10 @@ pub mod chain_spec; use cumulus_client_collator::service::CollatorService; use cumulus_client_consensus_aura::{ - collators::lookahead::{self as aura, Params as AuraParams}, + collators::{ + lookahead::{self as aura, Params as AuraParams}, + slot_based::{self as slot_based, Params as SlotBasedParams}, + }, ImportQueueParams, }; use cumulus_client_consensus_proposer::Proposer; @@ -45,7 +48,7 @@ use cumulus_client_cli::{CollatorOptions, RelayChainMode}; use cumulus_client_consensus_common::{ ParachainBlockImport as TParachainBlockImport, ParachainCandidate, ParachainConsensus, }; -use cumulus_client_pov_recovery::RecoveryHandle; +use cumulus_client_pov_recovery::{RecoveryDelayRange, RecoveryHandle}; #[allow(deprecated)] use cumulus_client_service::old_consensus; use cumulus_client_service::{ @@ -304,7 +307,7 @@ async fn build_relay_chain_interface( /// Start a node with the given parachain `Configuration` and relay chain `Configuration`. /// /// This is the actual implementation that is abstract over the executor and the runtime api. -#[sc_tracing::logging::prefix_logs_with(parachain_config.network.node_name.as_str())] +#[sc_tracing::logging::prefix_logs_with("Parachain")] pub async fn start_node_impl>( parachain_config: Configuration, collator_key: Option, @@ -316,6 +319,7 @@ pub async fn start_node_impl>( consensus: Consensus, collator_options: CollatorOptions, proof_recording_during_import: bool, + use_slot_based_collator: bool, ) -> sc_service::error::Result<( TaskManager, Arc, @@ -409,7 +413,6 @@ where } else { Box::new(overseer_handle.clone()) }; - let is_collator = collator_key.is_some(); let relay_chain_slot_duration = Duration::from_secs(6); start_relay_chain_tasks(StartRelayChainTasksParams { @@ -418,11 +421,11 @@ where para_id, relay_chain_interface: relay_chain_interface.clone(), task_manager: &mut task_manager, - da_recovery_profile: if is_collator { - DARecoveryProfile::Collator - } else { - DARecoveryProfile::FullNode - }, + // Increase speed of recovery for testing purposes. + da_recovery_profile: DARecoveryProfile::Other(RecoveryDelayRange { + min: Duration::from_secs(1), + max: Duration::from_secs(5), + }), import_queue: import_queue_service, relay_chain_slot_duration, recovery_handle, @@ -461,29 +464,72 @@ where ); let client_for_aura = client.clone(); - let params = AuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client.clone(), - para_backend: backend.clone(), - relay_client: relay_chain_interface, - code_hash_provider: move |block_hash| { - client_for_aura.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) - }, - sync_oracle: sync_service, - keystore, - collator_key, - para_id, - overseer_handle, - relay_chain_slot_duration, - proposer, - collator_service, - authoring_duration: Duration::from_millis(2000), - reinitialize: false, - }; - let fut = aura::run::(params); - task_manager.spawn_essential_handle().spawn("aura", None, fut); + if use_slot_based_collator { + tracing::info!(target: LOG_TARGET, "Starting block authoring with slot based authoring."); + let params = SlotBasedParams { + create_inherent_data_providers: move |_, ()| async move { Ok(()) }, + block_import, + para_client: client.clone(), + para_backend: backend.clone(), + relay_client: relay_chain_interface, + code_hash_provider: move |block_hash| { + client_for_aura + .code_at(block_hash) + .ok() + .map(|c| ValidationCode::from(c).hash()) + }, + keystore, + collator_key, + para_id, + relay_chain_slot_duration, + proposer, + collator_service, + authoring_duration: Duration::from_millis(2000), + reinitialize: false, + slot_drift: Duration::from_secs(1), + }; + + let (collation_future, block_builer_future) = + slot_based::run::(params); + task_manager.spawn_essential_handle().spawn( + "collation-task", + None, + collation_future, + ); + task_manager.spawn_essential_handle().spawn( + "block-builder-task", + None, + block_builer_future, + ); + } else { + tracing::info!(target: LOG_TARGET, "Starting block authoring with lookahead collator."); + let params = AuraParams { + create_inherent_data_providers: move |_, ()| async move { Ok(()) }, + block_import, + para_client: client.clone(), + para_backend: backend.clone(), + relay_client: relay_chain_interface, + code_hash_provider: move |block_hash| { + client_for_aura + .code_at(block_hash) + .ok() + .map(|c| ValidationCode::from(c).hash()) + }, + keystore, + collator_key, + para_id, + overseer_handle, + relay_chain_slot_duration, + proposer, + collator_service, + authoring_duration: Duration::from_millis(2000), + reinitialize: false, + }; + + let fut = aura::run::(params); + task_manager.spawn_essential_handle().spawn("aura", None, fut); + } } } @@ -720,6 +766,7 @@ impl TestNodeBuilder { self.consensus, collator_options, self.record_proof_during_import, + false, ) .await .expect("could not create Cumulus test service"), @@ -735,6 +782,7 @@ impl TestNodeBuilder { self.consensus, collator_options, self.record_proof_during_import, + false, ) .await .expect("could not create Cumulus test service"), @@ -766,8 +814,11 @@ pub fn node_config( let root = base_path.path().join(format!("cumulus_test_service_{}", key)); let role = if is_collator { Role::Authority } else { Role::Full }; let key_seed = key.to_seed(); - let mut spec = - Box::new(chain_spec::get_chain_spec_with_extra_endowed(Some(para_id), endowed_accounts)); + let mut spec = Box::new(chain_spec::get_chain_spec_with_extra_endowed( + Some(para_id), + endowed_accounts, + cumulus_test_runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"), + )); let mut storage = spec.as_storage_builder().build_storage().expect("could not build storage"); diff --git a/cumulus/test/service/src/main.rs b/cumulus/test/service/src/main.rs index 90d37173dd5..9357978b769 100644 --- a/cumulus/test/service/src/main.rs +++ b/cumulus/test/service/src/main.rs @@ -118,6 +118,7 @@ fn main() -> Result<(), sc_cli::Error> { consensus, collator_options, true, + cli.experimental_use_slot_based, ) .await, sc_network::config::NetworkBackendType::Litep2p => @@ -135,6 +136,7 @@ fn main() -> Result<(), sc_cli::Error> { consensus, collator_options, true, + cli.experimental_use_slot_based, ) .await, } diff --git a/cumulus/zombienet/tests/0003-full_node_catching_up.zndsl b/cumulus/zombienet/tests/0003-full_node_catching_up.zndsl index 49b6d9e94fd..e1e8442f305 100644 --- a/cumulus/zombienet/tests/0003-full_node_catching_up.zndsl +++ b/cumulus/zombienet/tests/0003-full_node_catching_up.zndsl @@ -6,3 +6,6 @@ alice: parachain 2000 is registered within 225 seconds dave: reports block height is at least 7 within 250 seconds eve: reports block height is at least 7 within 250 seconds ferdie: reports block height is at least 7 within 250 seconds + +# We want to make sure that none of the consensus hook checks fail, even if the chain makes progress +charlie: count of log lines containing "set_validation_data inherent needs to be present in every block" is 0 within 10 seconds diff --git a/cumulus/zombienet/tests/0006-rpc_collator_builds_blocks.zndsl b/cumulus/zombienet/tests/0006-rpc_collator_builds_blocks.zndsl index 7da8416d016..b14c15ed5e5 100644 --- a/cumulus/zombienet/tests/0006-rpc_collator_builds_blocks.zndsl +++ b/cumulus/zombienet/tests/0006-rpc_collator_builds_blocks.zndsl @@ -13,3 +13,7 @@ two: restart after 1 seconds three: restart after 20 seconds dave: is up dave: reports block height is at least 30 within 200 seconds + +# We want to make sure that none of the consensus hook checks fail, even if the chain makes progress +dave: count of log lines containing "set_validation_data inherent needs to be present in every block" is 0 within 10 seconds +eve: count of log lines containing "set_validation_data inherent needs to be present in every block" is 0 within 10 seconds diff --git a/cumulus/zombienet/tests/0008-elastic_authoring.toml b/cumulus/zombienet/tests/0008-elastic_authoring.toml new file mode 100644 index 00000000000..f2e2010a9e4 --- /dev/null +++ b/cumulus/zombienet/tests/0008-elastic_authoring.toml @@ -0,0 +1,50 @@ +[settings] +timeout = 1000 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.async_backing_params] + max_candidate_depth = 6 + allowed_ancestry_len = 3 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 1 + num_cores = 4 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.approval_voting_params] + max_approval_coalesce_count = 5 + +[relaychain] +default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" +chain = "rococo-local" +command = "polkadot" + + [[relaychain.nodes]] + name = "alice" + args = ["" ] + + [[relaychain.node_groups]] + name = "validator" + args = ["-lruntime=debug,parachain=trace" ] + count = 8 + +# Slot based authoring with 3 cores and 2s slot duration +[[parachains]] +id = 2100 +chain = "elastic-scaling" +add_to_genesis = true + + [[parachains.collators]] + name = "collator-elastic" + image = "{{COL_IMAGE}}" + command = "test-parachain" + args = ["-laura=trace,runtime=info,cumulus-consensus=trace,consensus::common=trace,parachain::collation-generation=trace,parachain::collator-protocol=trace,parachain=debug", "--force-authoring", "--experimental-use-slot-based"] + +# Slot based authoring with 1 core and 6s slot duration +[[parachains]] +id = 2000 +add_to_genesis = true + + [[parachains.collators]] + name = "collator-single-core" + image = "{{COL_IMAGE}}" + command = "test-parachain" + args = ["-laura=trace,runtime=info,cumulus-consensus=trace,consensus::common=trace,parachain::collation-generation=trace,parachain::collator-protocol=trace,parachain=debug", "--force-authoring", "--experimental-use-slot-based"] diff --git a/cumulus/zombienet/tests/0008-elastic_authoring.zndsl b/cumulus/zombienet/tests/0008-elastic_authoring.zndsl new file mode 100644 index 00000000000..a06ffd24fef --- /dev/null +++ b/cumulus/zombienet/tests/0008-elastic_authoring.zndsl @@ -0,0 +1,19 @@ +Description: Slot based authoring for elastic scaling +Network: ./0008-elastic_authoring.toml +Creds: config + +alice: is up +collator-elastic: is up +collator-single-core: is up + + +# configure relay chain +alice: js-script ./assign-core.js with "2100,0" return is 0 within 600 seconds +alice: js-script ./assign-core.js with "2100,1" return is 0 within 600 seconds + +collator-single-core: reports block height is at least 20 within 225 seconds +collator-elastic: reports block height is at least 40 within 225 seconds + +# We want to make sure that none of the consensus hook checks fail, even if the chain makes progress +collator-elastic: count of log lines containing "set_validation_data inherent needs to be present in every block" is 0 within 10 seconds +collator-single-core: count of log lines containing "set_validation_data inherent needs to be present in every block" is 0 within 10 seconds diff --git a/cumulus/zombienet/tests/0009-elastic_pov_recovery.toml b/cumulus/zombienet/tests/0009-elastic_pov_recovery.toml new file mode 100644 index 00000000000..9b296e8a8b3 --- /dev/null +++ b/cumulus/zombienet/tests/0009-elastic_pov_recovery.toml @@ -0,0 +1,48 @@ +[settings] +timeout = 1000 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.async_backing_params] + max_candidate_depth = 6 + allowed_ancestry_len = 3 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 1 + num_cores = 4 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.approval_voting_params] + max_approval_coalesce_count = 5 + +[relaychain] +default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" +chain = "rococo-local" +command = "polkadot" + + [[relaychain.nodes]] + name = "alice" + args = ["" ] + + [[relaychain.node_groups]] + name = "validator" + args = ["-lruntime=debug,parachain=trace", "--reserved-only", "--reserved-nodes {{'alice'|zombie('multiAddress')}}"] + count = 8 + +# Slot based authoring with 3 cores and 2s slot duration +[[parachains]] +id = 2100 +chain = "elastic-scaling" +add_to_genesis = true + + # Slot based authoring with 3 cores and 2s slot duration + [[parachains.collators]] + name = "collator-elastic" + image = "{{COL_IMAGE}}" + command = "test-parachain" + args = ["--disable-block-announcements", "-laura=trace,runtime=info,cumulus-consensus=trace,consensus::common=trace,parachain::collation-generation=trace,parachain::collator-protocol=trace,parachain=debug", "--force-authoring", "--experimental-use-slot-based"] + + # run 'recovery-target' as a parachain full node + [[parachains.collators]] + name = "recovery-target" + validator = false # full node + image = "{{COL_IMAGE}}" + command = "test-parachain" + args = ["-lparachain::availability=trace,sync=debug,parachain=debug,cumulus-pov-recovery=debug,cumulus-consensus=debug", "--disable-block-announcements", "--bootnodes {{'collator-elastic'|zombie('multiAddress')}}", "--in-peers 0", "--out-peers 0", "--", "--reserved-only", "--reserved-nodes {{'alice'|zombie('multiAddress')}}"] diff --git a/cumulus/zombienet/tests/0009-elastic_pov_recovery.zndsl b/cumulus/zombienet/tests/0009-elastic_pov_recovery.zndsl new file mode 100644 index 00000000000..3a805078112 --- /dev/null +++ b/cumulus/zombienet/tests/0009-elastic_pov_recovery.zndsl @@ -0,0 +1,19 @@ +Description: Elastic scaling PoV recovery test +Network: ./0009-elastic_pov_recovery.toml +Creds: config + +alice: is up +collator-elastic: is up + +# wait 20 blocks and register parachain +alice: reports block height is at least 20 within 250 seconds + +# configure relay chain +alice: js-script ./assign-core.js with "2100,0" return is 0 within 600 seconds +alice: js-script ./assign-core.js with "2100,1" return is 0 within 600 seconds + +# check block production +collator-elastic: reports block height is at least 40 within 225 seconds +collator-elastic: count of log lines containing "set_validation_data inherent needs to be present in every block" is 0 within 10 seconds + +recovery-target: count of log lines containing "Importing block retrieved using pov_recovery" is greater than 35 within 10 seconds diff --git a/cumulus/zombienet/tests/assign-core.js b/cumulus/zombienet/tests/assign-core.js new file mode 100644 index 00000000000..4179b68b2e3 --- /dev/null +++ b/cumulus/zombienet/tests/assign-core.js @@ -0,0 +1,46 @@ +// Assign a parachain to a core. +// +// First argument should be the parachain id. +// Second argument should be the core. +async function run(nodeName, networkInfo, args) { + const { wsUri, userDefinedTypes } = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + let para = Number(args[0]); + let core = Number(args[1]); + console.log(`Assigning para ${para} to core ${core}`); + + await zombie.util.cryptoWaitReady(); + + // Submit transaction with Alice accoung + const keyring = new zombie.Keyring({ type: "sr25519" }); + const alice = keyring.addFromUri("//Alice"); + + // Wait for this transaction to be finalized in a block. + await new Promise(async (resolve, reject) => { + const unsub = await api.tx.sudo + .sudo(api.tx.coretime.assignCore(core, 0, [[{ task: para }, 57600]], null)) + .signAndSend(alice, ({ status, isError }) => { + if (status.isInBlock) { + console.log( + `Transaction included at blockhash ${status.asInBlock}`, + ); + } else if (status.isFinalized) { + console.log( + `Transaction finalized at blockHash ${status.asFinalized}`, + ); + unsub(); + return resolve(); + } else if (isError) { + console.log(`Transaction error`); + reject(`Transaction error`); + } + }); + }); + + + + return 0; +} + +module.exports = { run }; diff --git a/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.toml b/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.toml index 83f5434eddd..611978a33a5 100644 --- a/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.toml +++ b/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.toml @@ -7,11 +7,9 @@ timeout = 1000 [relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] max_validators_per_core = 1 - scheduling_lookahead = 2 num_cores = 3 [relaychain.genesis.runtimeGenesis.patch.configuration.config.approval_voting_params] - needed_approvals = 3 max_approval_coalesce_count = 5 [relaychain] @@ -48,4 +46,4 @@ addToGenesis = true [types.Header] number = "u64" parent_hash = "Hash" -post_state = "Hash" \ No newline at end of file +post_state = "Hash" diff --git a/prdoc/pr_4097.prdoc b/prdoc/pr_4097.prdoc new file mode 100644 index 00000000000..2804a9571c7 --- /dev/null +++ b/prdoc/pr_4097.prdoc @@ -0,0 +1,45 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Introduce experimental slot-based collator + +doc: + - audience: Node Operator + description: | + Introduces an experimental collator that is fit fot elastic-scaling. + It can be activated on `test-parachain` and `polkadot-parachain` binaries via + `--experimental-use-slot-based` flag. The current implementation is MVP status and purely + for testing. Behaviour can change any time and should not be relied upon in environments with + any stability requirements. + +crates: + - name: cumulus-client-consensus-aura + bump: major + - name: cumulus-client-consensus-common + bump: minor + - name: cumulus-client-pov-recovery + bump: none + validate: false + - name: cumulus-pallet-aura-ext + bump: patch + - name: cumulus-relay-chain-interface + bump: major + validate: false + - name: sc-consensus-slots + bump: minor + - name: sc-basic-authorship + bump: patch + - name: cumulus-client-network + bump: none + validate: false + - name: cumulus-relay-chain-inprocess-interface + bump: minor + - name: sc-consensus-aura + bump: patch + - name: cumulus-relay-chain-rpc-interface + bump: minor + - name: polkadot-parachain-bin + bump: patch + - name: polkadot + bump: none + validate: false diff --git a/substrate/client/basic-authorship/src/basic_authorship.rs b/substrate/client/basic-authorship/src/basic_authorship.rs index 1519c76c42c..74805488792 100644 --- a/substrate/client/basic-authorship/src/basic_authorship.rs +++ b/substrate/client/basic-authorship/src/basic_authorship.rs @@ -205,7 +205,11 @@ where ) -> Proposer { let parent_hash = parent_header.hash(); - info!("🙌 Starting consensus session on top of parent {:?}", parent_hash); + info!( + "🙌 Starting consensus session on top of parent {:?} (#{})", + parent_hash, + parent_header.number() + ); let proposer = Proposer::<_, _, _, PR> { spawn_handle: self.spawn_handle.clone(), diff --git a/substrate/client/consensus/aura/src/standalone.rs b/substrate/client/consensus/aura/src/standalone.rs index 0f9b8668d44..c1536d9ef73 100644 --- a/substrate/client/consensus/aura/src/standalone.rs +++ b/substrate/client/consensus/aura/src/standalone.rs @@ -24,7 +24,7 @@ use log::trace; use codec::Codec; -use sc_client_api::{backend::AuxStore, UsageProvider}; +use sc_client_api::UsageProvider; use sp_api::{Core, ProvideRuntimeApi}; use sp_application_crypto::{AppCrypto, AppPublic}; use sp_blockchain::Result as CResult; @@ -48,7 +48,7 @@ pub fn slot_duration(client: &C) -> CResult where A: Codec, B: BlockT, - C: AuxStore + ProvideRuntimeApi + UsageProvider, + C: ProvideRuntimeApi + UsageProvider, C::Api: AuraApi, { slot_duration_at(client, client.usage_info().chain.best_hash) @@ -59,7 +59,7 @@ pub fn slot_duration_at(client: &C, block_hash: B::Hash) -> CResult, + C: ProvideRuntimeApi, C::Api: AuraApi, { client.runtime_api().slot_duration(block_hash).map_err(|err| err.into()) diff --git a/substrate/client/consensus/slots/src/lib.rs b/substrate/client/consensus/slots/src/lib.rs index d9d79200531..7cdf90877df 100644 --- a/substrate/client/consensus/slots/src/lib.rs +++ b/substrate/client/consensus/slots/src/lib.rs @@ -29,8 +29,8 @@ mod aux_schema; mod slots; pub use aux_schema::{check_equivocation, MAX_SLOT_CAPACITY, PRUNING_BOUND}; -pub use slots::SlotInfo; use slots::Slots; +pub use slots::{time_until_next_slot, SlotInfo}; use futures::{future::Either, Future, TryFutureExt}; use futures_timer::Delay; diff --git a/templates/parachain/node/src/service.rs b/templates/parachain/node/src/service.rs index bf44207acc9..3e7d4de1055 100644 --- a/templates/parachain/node/src/service.rs +++ b/templates/parachain/node/src/service.rs @@ -35,7 +35,6 @@ use sc_client_api::Backend; use sc_consensus::ImportQueue; use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; use sc_network::NetworkBlock; -use sc_network_sync::SyncingService; use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; use sc_transaction_pool_api::OffchainTransactionPoolFactory; @@ -172,7 +171,6 @@ fn start_consensus( task_manager: &TaskManager, relay_chain_interface: Arc, transaction_pool: Arc>, - sync_oracle: Arc>, keystore: KeystorePtr, relay_chain_slot_duration: Duration, para_id: ParaId, @@ -206,7 +204,6 @@ fn start_consensus( code_hash_provider: move |block_hash| { client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) }, - sync_oracle, keystore, collator_key, para_id, @@ -217,11 +214,9 @@ fn start_consensus( authoring_duration: Duration::from_millis(2000), reinitialize: false, }; - - let fut = - aura::run::( - params, - ); + let fut = aura::run::( + params, + ); task_manager.spawn_essential_handle().spawn("aura", None, fut); Ok(()) @@ -398,7 +393,6 @@ pub async fn start_parachain_node( &task_manager, relay_chain_interface, transaction_pool, - sync_service, params.keystore_container.keystore(), relay_chain_slot_duration, para_id, -- GitLab From 299aacb56f4f11127b194d12692b00066e91ac92 Mon Sep 17 00:00:00 2001 From: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Fri, 5 Jul 2024 13:13:23 +0200 Subject: [PATCH 090/130] [ci] Increase timeout for ci jobs (#4950) Related to recent discussion. PR makes timeout less strict. cc https://github.com/paritytech/ci_cd/issues/996 --- .github/workflows/checks-quick.yml | 18 +++++++++--------- .github/workflows/command-bench-all.yml | 7 +++---- .github/workflows/command-bench-overhead.yml | 6 +++--- .github/workflows/command-bench.yml | 7 +++---- .github/workflows/command-fmt.yml | 7 ++++--- .github/workflows/command-update-ui.yml | 7 ++++--- .github/workflows/tests-linux-stable.yml | 4 ++-- .github/workflows/tests.yml | 6 +++--- 8 files changed, 31 insertions(+), 31 deletions(-) diff --git a/.github/workflows/checks-quick.yml b/.github/workflows/checks-quick.yml index 954ac764efa..1fcec5c80fd 100644 --- a/.github/workflows/checks-quick.yml +++ b/.github/workflows/checks-quick.yml @@ -20,7 +20,7 @@ jobs: # However, env variables don't work for forks: https://github.com/orgs/community/discussions/44322 # This workaround sets the container image for each job using 'set-image' job output. runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 20 outputs: IMAGE: ${{ steps.set_image.outputs.IMAGE }} steps: @@ -30,7 +30,7 @@ jobs: run: cat .github/env >> $GITHUB_OUTPUT fmt: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 20 needs: [set-image] container: image: ${{ needs.set-image.outputs.IMAGE }} @@ -40,7 +40,7 @@ jobs: run: cargo +nightly fmt --all -- --check check-dependency-rules: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 20 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: check dependency rules @@ -49,7 +49,7 @@ jobs: ../.gitlab/ensure-deps.sh check-rust-feature-propagation: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 20 needs: [set-image] container: image: ${{ needs.set-image.outputs.IMAGE }} @@ -65,7 +65,7 @@ jobs: time zepter run check test-rust-features: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 20 needs: [set-image] container: image: ${{ needs.set-image.outputs.IMAGE }} @@ -75,7 +75,7 @@ jobs: run: bash .gitlab/rust-features.sh . check-toml-format: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 20 needs: [set-image] container: image: ${{ needs.set-image.outputs.IMAGE }} @@ -87,7 +87,7 @@ jobs: echo "Please run `taplo format --config .config/taplo.toml` to fix any toml formatting issues" check-workspace: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 20 steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.0 (22. Sep 2023) - name: install python deps @@ -104,7 +104,7 @@ jobs: run: python3 .github/scripts/deny-git-deps.py . check-markdown: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 20 steps: - name: Checkout sources uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -127,7 +127,7 @@ jobs: markdownlint --config "$CONFIG" --ignore target . check-umbrella: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 20 needs: [set-image] container: image: ${{ needs.set-image.outputs.IMAGE }} diff --git a/.github/workflows/command-bench-all.yml b/.github/workflows/command-bench-all.yml index b3fa0868c48..f1d1589bea2 100644 --- a/.github/workflows/command-bench-all.yml +++ b/.github/workflows/command-bench-all.yml @@ -1,7 +1,7 @@ name: Command Bench All -on: - workflow_dispatch: +on: + workflow_dispatch: inputs: pr: description: Number of the Pull Request @@ -51,9 +51,8 @@ on: - people-rococo - people-westend - jobs: - set-image: + set-image: runs-on: ubuntu-latest outputs: IMAGE: ${{ steps.set_image.outputs.IMAGE }} diff --git a/.github/workflows/command-bench-overhead.yml b/.github/workflows/command-bench-overhead.yml index 735b4010210..16cbcefcf26 100644 --- a/.github/workflows/command-bench-overhead.yml +++ b/.github/workflows/command-bench-overhead.yml @@ -1,7 +1,7 @@ name: Command Bench Overhead -on: - workflow_dispatch: +on: + workflow_dispatch: inputs: pr: description: Number of the Pull Request @@ -31,7 +31,7 @@ on: - cumulus jobs: - set-image: + set-image: runs-on: ubuntu-latest outputs: IMAGE: ${{ steps.set_image.outputs.IMAGE }} diff --git a/.github/workflows/command-bench.yml b/.github/workflows/command-bench.yml index 0ff166be48c..b23b06d1b3c 100644 --- a/.github/workflows/command-bench.yml +++ b/.github/workflows/command-bench.yml @@ -1,7 +1,7 @@ name: Command Bench -on: - workflow_dispatch: +on: + workflow_dispatch: inputs: pr: description: Number of the Pull Request @@ -76,9 +76,8 @@ on: - starters - testing - jobs: - set-image: + set-image: runs-on: ubuntu-latest outputs: IMAGE: ${{ steps.set_image.outputs.IMAGE }} diff --git a/.github/workflows/command-fmt.yml b/.github/workflows/command-fmt.yml index d415007d938..c949d0768d7 100644 --- a/.github/workflows/command-fmt.yml +++ b/.github/workflows/command-fmt.yml @@ -1,14 +1,14 @@ name: Command FMT -on: - workflow_dispatch: +on: + workflow_dispatch: inputs: pr: description: Number of the Pull Request required: true jobs: - set-image: + set-image: runs-on: ubuntu-latest outputs: IMAGE: ${{ steps.set_image.outputs.IMAGE }} @@ -20,6 +20,7 @@ jobs: cmd-fmt: needs: [set-image] runs-on: ubuntu-latest + timeout-minutes: 20 container: image: ${{ needs.set-image.outputs.IMAGE }} steps: diff --git a/.github/workflows/command-update-ui.yml b/.github/workflows/command-update-ui.yml index 9b9c45c5c0b..b6b0420e786 100644 --- a/.github/workflows/command-update-ui.yml +++ b/.github/workflows/command-update-ui.yml @@ -1,7 +1,7 @@ name: Command Update UI -on: - workflow_dispatch: +on: + workflow_dispatch: inputs: pr: description: Number of the Pull Request @@ -11,7 +11,7 @@ on: required: false jobs: - set-image: + set-image: runs-on: ubuntu-latest outputs: IMAGE: ${{ steps.set_image.outputs.IMAGE }} @@ -23,6 +23,7 @@ jobs: cmd-update-ui: needs: [set-image] runs-on: arc-runners-polkadot-sdk-beefy + timeout-minutes: 90 container: image: ${{ needs.set-image.outputs.IMAGE }} steps: diff --git a/.github/workflows/tests-linux-stable.yml b/.github/workflows/tests-linux-stable.yml index 6f2ac87c3ef..55addf11de0 100644 --- a/.github/workflows/tests-linux-stable.yml +++ b/.github/workflows/tests-linux-stable.yml @@ -37,7 +37,7 @@ jobs: needs: [set-image, changes] if: ${{ needs.changes.outputs.rust }} runs-on: arc-runners-polkadot-sdk-beefy - timeout-minutes: 30 + timeout-minutes: 60 container: image: ${{ needs.set-image.outputs.IMAGE }} env: @@ -58,7 +58,7 @@ jobs: needs: [set-image, changes] if: ${{ needs.changes.outputs.rust }} runs-on: arc-runners-polkadot-sdk-beefy - timeout-minutes: 30 + timeout-minutes: 60 container: image: ${{ needs.set-image.outputs.IMAGE }} env: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0c1447cba33..a413d330615 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -34,7 +34,7 @@ jobs: needs: [set-image, changes] if: ${{ needs.changes.outputs.rust }} runs-on: arc-runners-polkadot-sdk-beefy - timeout-minutes: 30 + timeout-minutes: 60 container: image: ${{ needs.set-image.outputs.IMAGE }} env: @@ -53,7 +53,7 @@ jobs: needs: [set-image, changes] if: ${{ needs.changes.outputs.rust }} runs-on: arc-runners-polkadot-sdk-beefy - timeout-minutes: 30 + timeout-minutes: 60 container: image: ${{ needs.set-image.outputs.IMAGE }} continue-on-error: true # this rarely triggers in practice @@ -78,7 +78,7 @@ jobs: needs: [set-image, changes] if: ${{ needs.changes.outputs.rust }} runs-on: arc-runners-polkadot-sdk-beefy - timeout-minutes: 30 + timeout-minutes: 60 container: image: ${{ needs.set-image.outputs.IMAGE }} env: -- GitLab From 95c7e4f033895afff223b9dfaaed6d04033b0d61 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Fri, 5 Jul 2024 20:08:15 +0200 Subject: [PATCH 091/130] Stabilize elastic-scaling pov-recovery test (#4958) Timing issues in container startup have made this test flaky. We now wait for 20 and then register the parachain. This makes sure that the parachain node has the ability to see all relay chain notifications it needs. --- cumulus/zombienet/tests/0002-pov_recovery.zndsl | 4 +++- .../zombienet/tests/0009-elastic_pov_recovery.toml | 2 +- .../zombienet/tests/0009-elastic_pov_recovery.zndsl | 13 +++++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/cumulus/zombienet/tests/0002-pov_recovery.zndsl b/cumulus/zombienet/tests/0002-pov_recovery.zndsl index b05285c87bf..dc7095ced25 100644 --- a/cumulus/zombienet/tests/0002-pov_recovery.zndsl +++ b/cumulus/zombienet/tests/0002-pov_recovery.zndsl @@ -2,7 +2,9 @@ Description: PoV recovery test Network: ./0002-pov_recovery.toml Creds: config -# wait 20 blocks and register parachain +# Wait 20 blocks and register parachain. This part is important for pov-recovery. +# We need to make sure that the recovering node is able to see all relay-chain +# notifications containing the candidates to recover. validator-3: reports block height is at least 20 within 250 seconds validator-0: js-script ./register-para.js with "2000" within 240 seconds validator-0: parachain 2000 is registered within 300 seconds diff --git a/cumulus/zombienet/tests/0009-elastic_pov_recovery.toml b/cumulus/zombienet/tests/0009-elastic_pov_recovery.toml index 9b296e8a8b3..b695f8aa937 100644 --- a/cumulus/zombienet/tests/0009-elastic_pov_recovery.toml +++ b/cumulus/zombienet/tests/0009-elastic_pov_recovery.toml @@ -30,7 +30,7 @@ command = "polkadot" [[parachains]] id = 2100 chain = "elastic-scaling" -add_to_genesis = true +add_to_genesis = false # Slot based authoring with 3 cores and 2s slot duration [[parachains.collators]] diff --git a/cumulus/zombienet/tests/0009-elastic_pov_recovery.zndsl b/cumulus/zombienet/tests/0009-elastic_pov_recovery.zndsl index 3a805078112..5cca6120ff3 100644 --- a/cumulus/zombienet/tests/0009-elastic_pov_recovery.zndsl +++ b/cumulus/zombienet/tests/0009-elastic_pov_recovery.zndsl @@ -5,12 +5,17 @@ Creds: config alice: is up collator-elastic: is up -# wait 20 blocks and register parachain +# configure relay chain +alice: js-script ./assign-core.js with "2100,0" return is 0 within 200 seconds +alice: js-script ./assign-core.js with "2100,1" return is 0 within 200 seconds + +# Wait 20 blocks and register parachain. This part is important for pov-recovery. +# We need to make sure that the recovering node is able to see all relay-chain +# notifications containing the candidates to recover. alice: reports block height is at least 20 within 250 seconds +alice: js-script ./register-para.js with "2100" within 240 seconds +alice: parachain 2100 is registered within 300 seconds -# configure relay chain -alice: js-script ./assign-core.js with "2100,0" return is 0 within 600 seconds -alice: js-script ./assign-core.js with "2100,1" return is 0 within 600 seconds # check block production collator-elastic: reports block height is at least 40 within 225 seconds -- GitLab From 2b17cb8f145f602cdfb8b92f77f68285718d069a Mon Sep 17 00:00:00 2001 From: Deepak Chaudhary <54492415+Aideepakchaudhary@users.noreply.github.com> Date: Sat, 6 Jul 2024 02:22:02 +0800 Subject: [PATCH 092/130] remove getter from vesting pallet (#4902) ### ISSUE Link to the issue: https://github.com/paritytech/polkadot-sdk/issues/3326 cc @muraca Deliverables - [Deprecation] remove pallet::getter usage from all pallet-vesting ### Test Outcomes ___ Successful tests by running `cargo test -p pallet-vesting --features runtime-benchmarks` running 45 tests test benchmarking::bench_force_vested_transfer ... ok test benchmarking::bench_vest_other_locked ... ok test mock::__construct_runtime_integrity_test::runtime_integrity_tests ... ok test benchmarking::bench_not_unlocking_merge_schedules ... ok test benchmarking::bench_unlocking_merge_schedules ... ok test mock::test_genesis_config_builds ... ok test tests::build_genesis_has_storage_version_v1 ... ok test tests::check_vesting_status ... ok test benchmarking::bench_force_remove_vesting_schedule ... ok test tests::check_vesting_status_for_multi_schedule_account ... ok test benchmarking::bench_vest_locked ... ok test tests::extra_balance_should_transfer ... ok test tests::generates_multiple_schedules_from_genesis_config ... ok test tests::force_vested_transfer_allows_max_schedules ... ok test tests::force_vested_transfer_correctly_fails ... ok test tests::force_vested_transfer_works ... ok test tests::liquid_funds_should_transfer_with_delayed_vesting ... ok test tests::merge_finished_and_ongoing_schedules ... ok test benchmarking::bench_vest_unlocked ... ok test tests::merge_finished_and_yet_to_be_started_schedules ... ok test tests::merge_finishing_schedules_does_not_create_a_new_one ... ok test tests::merge_ongoing_and_yet_to_be_started_schedules ... ok test benchmarking::bench_vest_other_unlocked ... ok test tests::merge_ongoing_schedules ... ok test tests::merge_schedules_that_have_not_started ... ok test tests::merge_vesting_handles_per_block_0 ... ok test tests::per_block_works ... ok test tests::merge_schedules_throws_proper_errors ... ok test tests::multiple_schedules_from_genesis_config_errors - should panic ... ok test tests::merging_shifts_other_schedules_index ... ok test tests::non_vested_cannot_vest_other ... ok test tests::unvested_balance_should_not_transfer ... ok test tests::non_vested_cannot_vest ... ok test tests::vested_balance_should_transfer ... ok test tests::remove_vesting_schedule ... ok test tests::vested_transfer_correctly_fails ... ok test tests::vested_balance_should_transfer_with_multi_sched ... ok test tests::vested_balance_should_transfer_using_vest_other ... ok test tests::vested_transfer_less_than_existential_deposit_fails ... ok test tests::vesting_info_ending_block_as_balance_works ... ok test tests::vesting_info_validate_works ... ok test tests::vested_balance_should_transfer_using_vest_other_with_multi_sched ... ok test tests::vested_transfer_works ... ok test tests::vested_transfer_allows_max_schedules ... ok test benchmarking::bench_vested_transfer ... ok test result: ok. 45 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.10s --- Polkadot Address: 16htXkeVhfroBhL6nuqiwknfXKcT6WadJPZqEi2jRf9z4XPY --- prdoc/pr_4902.prdoc | 14 ++++ substrate/frame/vesting/src/benchmarking.rs | 18 ++--- substrate/frame/vesting/src/lib.rs | 19 +++-- substrate/frame/vesting/src/tests.rs | 90 ++++++++++----------- 4 files changed, 81 insertions(+), 60 deletions(-) create mode 100644 prdoc/pr_4902.prdoc diff --git a/prdoc/pr_4902.prdoc b/prdoc/pr_4902.prdoc new file mode 100644 index 00000000000..19fe168a74a --- /dev/null +++ b/prdoc/pr_4902.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from the pallet-vesting + +doc: + - audience: Runtime Dev + description: | + This PR removed `pallet::getter`s from `pallet-vesting`s storage items. + When accessed inside the pallet, use the syntax `StorageItem::::get()`. + +crates: + - name: pallet-vesting + bump: minor diff --git a/substrate/frame/vesting/src/benchmarking.rs b/substrate/frame/vesting/src/benchmarking.rs index 311590873d9..68214c4f47c 100644 --- a/substrate/frame/vesting/src/benchmarking.rs +++ b/substrate/frame/vesting/src/benchmarking.rs @@ -24,7 +24,7 @@ use frame_support::assert_ok; use frame_system::{pallet_prelude::BlockNumberFor, Pallet as System, RawOrigin}; use sp_runtime::traits::{Bounded, CheckedDiv, CheckedMul}; -use super::*; +use super::{Vesting as VestingStorage, *}; use crate::Pallet as Vesting; const SEED: u32 = 0; @@ -291,7 +291,7 @@ benchmarks! { "Vesting balance should equal sum locked of all schedules", ); assert_eq!( - Vesting::::vesting(&caller).unwrap().len(), + VestingStorage::::get(&caller).unwrap().len(), s as usize, "There should be exactly max vesting schedules" ); @@ -304,7 +304,7 @@ benchmarks! { ); let expected_index = (s - 2) as usize; assert_eq!( - Vesting::::vesting(&caller).unwrap()[expected_index], + VestingStorage::::get(&caller).unwrap()[expected_index], expected_schedule ); assert_eq!( @@ -313,7 +313,7 @@ benchmarks! { "Vesting balance should equal total locked of all schedules", ); assert_eq!( - Vesting::::vesting(&caller).unwrap().len(), + VestingStorage::::get(&caller).unwrap().len(), (s - 1) as usize, "Schedule count should reduce by 1" ); @@ -344,7 +344,7 @@ benchmarks! { "Vesting balance should reflect that we are half way through all schedules duration", ); assert_eq!( - Vesting::::vesting(&caller).unwrap().len(), + VestingStorage::::get(&caller).unwrap().len(), s as usize, "There should be exactly max vesting schedules" ); @@ -359,12 +359,12 @@ benchmarks! { ); let expected_index = (s - 2) as usize; assert_eq!( - Vesting::::vesting(&caller).unwrap()[expected_index], + VestingStorage::::get(&caller).unwrap()[expected_index], expected_schedule, "New schedule is properly created and placed" ); assert_eq!( - Vesting::::vesting(&caller).unwrap()[expected_index], + VestingStorage::::get(&caller).unwrap()[expected_index], expected_schedule ); assert_eq!( @@ -373,7 +373,7 @@ benchmarks! { "Vesting balance should equal half total locked of all schedules", ); assert_eq!( - Vesting::::vesting(&caller).unwrap().len(), + VestingStorage::::get(&caller).unwrap().len(), (s - 1) as usize, "Schedule count should reduce by 1" ); @@ -404,7 +404,7 @@ force_remove_vesting_schedule { }: _(RawOrigin::Root, target_lookup, schedule_index) verify { assert_eq!( - Vesting::::vesting(&target).unwrap().len(), + VestingStorage::::get(&target).unwrap().len(), schedule_index as usize, "Schedule count should reduce by 1" ); diff --git a/substrate/frame/vesting/src/lib.rs b/substrate/frame/vesting/src/lib.rs index 4101caded41..3868f1a8592 100644 --- a/substrate/frame/vesting/src/lib.rs +++ b/substrate/frame/vesting/src/lib.rs @@ -200,7 +200,6 @@ pub mod pallet { /// Information regarding the vesting of a given account. #[pallet::storage] - #[pallet::getter(fn vesting)] pub type Vesting = StorageMap< _, Blake2_128Concat, @@ -419,7 +418,7 @@ pub mod pallet { let schedule1_index = schedule1_index as usize; let schedule2_index = schedule2_index as usize; - let schedules = Self::vesting(&who).ok_or(Error::::NotVesting)?; + let schedules = Vesting::::get(&who).ok_or(Error::::NotVesting)?; let merge_action = VestingAction::Merge { index1: schedule1_index, index2: schedule2_index }; @@ -464,6 +463,14 @@ pub mod pallet { } impl Pallet { + // Public function for accessing vesting storage + pub fn vesting( + account: T::AccountId, + ) -> Option, BlockNumberFor>, MaxVestingSchedulesGet>> + { + Vesting::::get(account) + } + // Create a new `VestingInfo`, based off of two other `VestingInfo`s. // NOTE: We assume both schedules have had funds unlocked up through the current block. fn merge_vesting_info( @@ -622,7 +629,7 @@ impl Pallet { /// Unlock any vested funds of `who`. fn do_vest(who: T::AccountId) -> DispatchResult { - let schedules = Self::vesting(&who).ok_or(Error::::NotVesting)?; + let schedules = Vesting::::get(&who).ok_or(Error::::NotVesting)?; let (schedules, locked_now) = Self::exec_action(schedules.to_vec(), VestingAction::Passive)?; @@ -687,7 +694,7 @@ where /// Get the amount that is currently being vested and cannot be transferred out of this account. fn vesting_balance(who: &T::AccountId) -> Option> { - if let Some(v) = Self::vesting(who) { + if let Some(v) = Vesting::::get(who) { let now = T::BlockNumberProvider::current_block_number(); let total_locked_now = v.iter().fold(Zero::zero(), |total, schedule| { schedule.locked_at::(now).saturating_add(total) @@ -726,7 +733,7 @@ where return Err(Error::::InvalidScheduleParams.into()) }; - let mut schedules = Self::vesting(who).unwrap_or_default(); + let mut schedules = Vesting::::get(who).unwrap_or_default(); // NOTE: we must push the new schedule so that `exec_action` // will give the correct new locked amount. @@ -764,7 +771,7 @@ where /// Remove a vesting schedule for a given account. fn remove_vesting_schedule(who: &T::AccountId, schedule_index: u32) -> DispatchResult { - let schedules = Self::vesting(who).ok_or(Error::::NotVesting)?; + let schedules = Vesting::::get(who).ok_or(Error::::NotVesting)?; let remove_action = VestingAction::Remove { index: schedule_index as usize }; let (schedules, locked_now) = Self::exec_action(schedules.to_vec(), remove_action)?; diff --git a/substrate/frame/vesting/src/tests.rs b/substrate/frame/vesting/src/tests.rs index 2e1e41fc957..004da0dfbfa 100644 --- a/substrate/frame/vesting/src/tests.rs +++ b/substrate/frame/vesting/src/tests.rs @@ -65,9 +65,9 @@ fn check_vesting_status() { 64, // Vesting over 20 blocks 10, ); - assert_eq!(Vesting::vesting(&1).unwrap(), vec![user1_vesting_schedule]); // Account 1 has a vesting schedule - assert_eq!(Vesting::vesting(&2).unwrap(), vec![user2_vesting_schedule]); // Account 2 has a vesting schedule - assert_eq!(Vesting::vesting(&12).unwrap(), vec![user12_vesting_schedule]); // Account 12 has a vesting schedule + assert_eq!(VestingStorage::::get(&1).unwrap(), vec![user1_vesting_schedule]); // Account 1 has a vesting schedule + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![user2_vesting_schedule]); // Account 2 has a vesting schedule + assert_eq!(VestingStorage::::get(&12).unwrap(), vec![user12_vesting_schedule]); // Account 12 has a vesting schedule // Account 1 has only 128 units vested from their illiquid ED * 5 units at block 1 assert_eq!(Vesting::vesting_balance(&1), Some(128 * 9)); @@ -110,7 +110,7 @@ fn check_vesting_status_for_multi_schedule_account() { 10, ); // Account 2 already has a vesting schedule. - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0]); // Account 2's free balance is from sched0. let free_balance = Balances::free_balance(&2); @@ -128,7 +128,7 @@ fn check_vesting_status_for_multi_schedule_account() { let free_balance = Balances::free_balance(&2); assert_eq!(free_balance, ED * (10 + 20)); // The most recently added schedule exists. - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0, sched1]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0, sched1]); // sched1 has free funds at block #1, but nothing else. assert_eq!(Vesting::vesting_balance(&2), Some(free_balance - sched1.per_block())); @@ -171,7 +171,7 @@ fn check_vesting_status_for_multi_schedule_account() { assert_eq!(Vesting::vesting_balance(&2), Some(0)); // Since we have not called any extrinsics that would unlock funds the schedules // are still in storage, - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0, sched1, sched2]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0, sched1, sched2]); // but once we unlock the funds, they are removed from storage. vest_and_assert_no_vesting::(2); }); @@ -207,7 +207,7 @@ fn vested_balance_should_transfer_with_multi_sched() { let sched0 = VestingInfo::new(5 * ED, 128, 0); assert_ok!(Vesting::vested_transfer(Some(13).into(), 1, sched0)); // Total 10*ED locked for all the schedules. - assert_eq!(Vesting::vesting(&1).unwrap(), vec![sched0, sched0]); + assert_eq!(VestingStorage::::get(&1).unwrap(), vec![sched0, sched0]); let user1_free_balance = Balances::free_balance(&1); assert_eq!(user1_free_balance, 3840); // Account 1 has free balance @@ -245,7 +245,7 @@ fn vested_balance_should_transfer_using_vest_other_with_multi_sched() { let sched0 = VestingInfo::new(5 * ED, 128, 0); assert_ok!(Vesting::vested_transfer(Some(13).into(), 1, sched0)); // Total of 10*ED of locked for all the schedules. - assert_eq!(Vesting::vesting(&1).unwrap(), vec![sched0, sched0]); + assert_eq!(VestingStorage::::get(&1).unwrap(), vec![sched0, sched0]); let user1_free_balance = Balances::free_balance(&1); assert_eq!(user1_free_balance, 3840); // Account 1 has free balance @@ -305,7 +305,7 @@ fn liquid_funds_should_transfer_with_delayed_vesting() { 64, // Vesting over 20 blocks 10, ); - assert_eq!(Vesting::vesting(&12).unwrap(), vec![user12_vesting_schedule]); + assert_eq!(VestingStorage::::get(&12).unwrap(), vec![user12_vesting_schedule]); // Account 12 can still send liquid funds assert_ok!(Balances::transfer_allow_death(Some(12).into(), 3, 256 * 5)); @@ -320,7 +320,7 @@ fn vested_transfer_works() { assert_eq!(user3_free_balance, 256 * 30); assert_eq!(user4_free_balance, 256 * 40); // Account 4 should not have any vesting yet. - assert_eq!(Vesting::vesting(&4), None); + assert_eq!(VestingStorage::::get(&4), None); // Make the schedule for the new transfer. let new_vesting_schedule = VestingInfo::new( 256 * 5, @@ -329,7 +329,7 @@ fn vested_transfer_works() { ); assert_ok!(Vesting::vested_transfer(Some(3).into(), 4, new_vesting_schedule)); // Now account 4 should have vesting. - assert_eq!(Vesting::vesting(&4).unwrap(), vec![new_vesting_schedule]); + assert_eq!(VestingStorage::::get(&4).unwrap(), vec![new_vesting_schedule]); // Ensure the transfer happened correctly. let user3_free_balance_updated = Balances::free_balance(&3); assert_eq!(user3_free_balance_updated, 256 * 25); @@ -368,7 +368,7 @@ fn vested_transfer_correctly_fails() { ED, // Vesting over 20 blocks 10, ); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![user2_vesting_schedule]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![user2_vesting_schedule]); // Fails due to too low transfer amount. let new_vesting_schedule_too_low = @@ -450,7 +450,7 @@ fn force_vested_transfer_works() { assert_eq!(user3_free_balance, ED * 30); assert_eq!(user4_free_balance, ED * 40); // Account 4 should not have any vesting yet. - assert_eq!(Vesting::vesting(&4), None); + assert_eq!(VestingStorage::::get(&4), None); // Make the schedule for the new transfer. let new_vesting_schedule = VestingInfo::new( ED * 5, @@ -469,8 +469,8 @@ fn force_vested_transfer_works() { new_vesting_schedule )); // Now account 4 should have vesting. - assert_eq!(Vesting::vesting(&4).unwrap()[0], new_vesting_schedule); - assert_eq!(Vesting::vesting(&4).unwrap().len(), 1); + assert_eq!(VestingStorage::::get(&4).unwrap()[0], new_vesting_schedule); + assert_eq!(VestingStorage::::get(&4).unwrap().len(), 1); // Ensure the transfer happened correctly. let user3_free_balance_updated = Balances::free_balance(&3); assert_eq!(user3_free_balance_updated, ED * 25); @@ -508,7 +508,7 @@ fn force_vested_transfer_correctly_fails() { ED, // Vesting over 20 blocks 10, ); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![user2_vesting_schedule]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![user2_vesting_schedule]); // Too low transfer amount. let new_vesting_schedule_too_low = @@ -594,12 +594,12 @@ fn merge_schedules_that_have_not_started() { ED, // Vest over 20 blocks. 10, ); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0]); assert_eq!(Balances::usable_balance(&2), 0); // Add a schedule that is identical to the one that already exists. assert_ok!(Vesting::vested_transfer(Some(3).into(), 2, sched0)); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0, sched0]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0, sched0]); assert_eq!(Balances::usable_balance(&2), 0); assert_ok!(Vesting::merge_schedules(Some(2).into(), 0, 1)); @@ -610,7 +610,7 @@ fn merge_schedules_that_have_not_started() { sched0.per_block() * 2, 10, // Starts at the block the schedules are merged/ ); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched1]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched1]); assert_eq!(Balances::usable_balance(&2), 0); }); @@ -626,7 +626,7 @@ fn merge_ongoing_schedules() { ED, // Vest over 20 blocks. 10, ); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0]); let sched1 = VestingInfo::new( ED * 10, @@ -634,7 +634,7 @@ fn merge_ongoing_schedules() { sched0.starting_block() + 5, // Start at block 15. ); assert_ok!(Vesting::vested_transfer(Some(4).into(), 2, sched1)); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0, sched1]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0, sched1]); // Got to half way through the second schedule where both schedules are actively vesting. let cur_block = 20; @@ -666,7 +666,7 @@ fn merge_ongoing_schedules() { let sched2_per_block = sched2_locked / sched2_duration; let sched2 = VestingInfo::new(sched2_locked, sched2_per_block, cur_block); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched2]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched2]); // And just to double check, we assert the new merged schedule we be cleaned up as expected. System::set_block_number(30); @@ -696,7 +696,7 @@ fn merging_shifts_other_schedules_index() { ); // Account 3 starts out with no schedules, - assert_eq!(Vesting::vesting(&3), None); + assert_eq!(VestingStorage::::get(&3), None); // and some usable balance. let usable_balance = Balances::usable_balance(&3); assert_eq!(usable_balance, 30 * ED); @@ -710,7 +710,7 @@ fn merging_shifts_other_schedules_index() { assert_ok!(Vesting::vested_transfer(Some(4).into(), 3, sched2)); // With no schedules vested or merged they are in the order they are created - assert_eq!(Vesting::vesting(&3).unwrap(), vec![sched0, sched1, sched2]); + assert_eq!(VestingStorage::::get(&3).unwrap(), vec![sched0, sched1, sched2]); // and the usable balance has not changed. assert_eq!(usable_balance, Balances::usable_balance(&3)); @@ -731,7 +731,7 @@ fn merging_shifts_other_schedules_index() { let sched3 = VestingInfo::new(sched3_locked, sched3_per_block, sched3_start); // The not touched schedule moves left and the new merged schedule is appended. - assert_eq!(Vesting::vesting(&3).unwrap(), vec![sched1, sched3]); + assert_eq!(VestingStorage::::get(&3).unwrap(), vec![sched1, sched3]); // The usable balance hasn't changed since none of the schedules have started. assert_eq!(Balances::usable_balance(&3), usable_balance); }); @@ -748,7 +748,7 @@ fn merge_ongoing_and_yet_to_be_started_schedules() { ED, // Vesting over 20 blocks 10, ); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0]); // Fast forward to half way through the life of sched1. let mut cur_block = @@ -800,7 +800,7 @@ fn merge_ongoing_and_yet_to_be_started_schedules() { let sched2_per_block = sched2_locked / sched2_duration; let sched2 = VestingInfo::new(sched2_locked, sched2_per_block, sched2_start); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched2]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched2]); }); } @@ -815,7 +815,7 @@ fn merge_finished_and_ongoing_schedules() { ED, // Vesting over 20 blocks. 10, ); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0]); let sched1 = VestingInfo::new( ED * 40, @@ -834,7 +834,7 @@ fn merge_finished_and_ongoing_schedules() { assert_ok!(Vesting::vested_transfer(Some(3).into(), 2, sched2)); // The schedules are in expected order prior to merging. - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0, sched1, sched2]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0, sched1, sched2]); // Fast forward to sched0's end block. let cur_block = sched0.ending_block_as_balance::(); @@ -849,7 +849,7 @@ fn merge_finished_and_ongoing_schedules() { // sched2 is now the first, since sched0 & sched1 get filtered out while "merging". // sched1 gets treated like the new merged schedule by getting pushed onto back // of the vesting schedules vec. Note: sched0 finished at the current block. - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched2, sched1]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched2, sched1]); // sched0 has finished, so its funds are fully unlocked. let sched0_unlocked_now = sched0.locked(); @@ -877,7 +877,7 @@ fn merge_finishing_schedules_does_not_create_a_new_one() { ED, // 20 block duration. 10, ); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0]); // Create sched1 and transfer it to account 2. let sched1 = VestingInfo::new( @@ -886,7 +886,7 @@ fn merge_finishing_schedules_does_not_create_a_new_one() { 10, ); assert_ok!(Vesting::vested_transfer(Some(3).into(), 2, sched1)); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0, sched1]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0, sched1]); let all_scheds_end = sched0 .ending_block_as_balance::() @@ -919,7 +919,7 @@ fn merge_finished_and_yet_to_be_started_schedules() { ED, // 20 block duration. 10, // Ends at block 30 ); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0]); let sched1 = VestingInfo::new( ED * 30, @@ -927,7 +927,7 @@ fn merge_finished_and_yet_to_be_started_schedules() { 35, ); assert_ok!(Vesting::vested_transfer(Some(13).into(), 2, sched1)); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0, sched1]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0, sched1]); let sched2 = VestingInfo::new( ED * 40, @@ -936,7 +936,7 @@ fn merge_finished_and_yet_to_be_started_schedules() { ); // Add a 3rd schedule to demonstrate how sched1 shifts. assert_ok!(Vesting::vested_transfer(Some(13).into(), 2, sched2)); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0, sched1, sched2]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0, sched1, sched2]); System::set_block_number(30); @@ -951,7 +951,7 @@ fn merge_finished_and_yet_to_be_started_schedules() { // sched0 is removed since it finished, and sched1 is removed and then pushed on the back // because it is treated as the merged schedule - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched2, sched1]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched2, sched1]); // The usable balance is updated because merging fully unlocked sched0. assert_eq!(Balances::usable_balance(&2), sched0.locked()); @@ -967,7 +967,7 @@ fn merge_schedules_throws_proper_errors() { ED, // 20 block duration. 10, ); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0]); // Account 2 only has 1 vesting schedule. assert_noop!( @@ -976,12 +976,12 @@ fn merge_schedules_throws_proper_errors() { ); // Account 4 has 0 vesting schedules. - assert_eq!(Vesting::vesting(&4), None); + assert_eq!(VestingStorage::::get(&4), None); assert_noop!(Vesting::merge_schedules(Some(4).into(), 0, 1), Error::::NotVesting); // There are enough schedules to merge but an index is non-existent. Vesting::vested_transfer(Some(3).into(), 2, sched0).unwrap(); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![sched0, sched0]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![sched0, sched0]); assert_noop!( Vesting::merge_schedules(Some(2).into(), 0, 2), Error::::ScheduleIndexOutOfBounds @@ -1014,17 +1014,17 @@ fn generates_multiple_schedules_from_genesis_config() { .build() .execute_with(|| { let user1_sched1 = VestingInfo::new(5 * ED, 128, 0u64); - assert_eq!(Vesting::vesting(&1).unwrap(), vec![user1_sched1]); + assert_eq!(VestingStorage::::get(&1).unwrap(), vec![user1_sched1]); let user2_sched1 = VestingInfo::new(1 * ED, 12, 10u64); let user2_sched2 = VestingInfo::new(2 * ED, 25, 10u64); - assert_eq!(Vesting::vesting(&2).unwrap(), vec![user2_sched1, user2_sched2]); + assert_eq!(VestingStorage::::get(&2).unwrap(), vec![user2_sched1, user2_sched2]); let user12_sched1 = VestingInfo::new(1 * ED, 12, 10u64); let user12_sched2 = VestingInfo::new(2 * ED, 25, 10u64); let user12_sched3 = VestingInfo::new(3 * ED, 38, 10u64); assert_eq!( - Vesting::vesting(&12).unwrap(), + VestingStorage::::get(&12).unwrap(), vec![user12_sched1, user12_sched2, user12_sched3] ); }); @@ -1162,7 +1162,7 @@ fn remove_vesting_schedule() { assert_eq!(Balances::free_balance(&3), 256 * 30); assert_eq!(Balances::free_balance(&4), 256 * 40); // Account 4 should not have any vesting yet. - assert_eq!(Vesting::vesting(&4), None); + assert_eq!(VestingStorage::::get(&4), None); // Make the schedule for the new transfer. let new_vesting_schedule = VestingInfo::new( ED * 5, @@ -1171,7 +1171,7 @@ fn remove_vesting_schedule() { ); assert_ok!(Vesting::vested_transfer(Some(3).into(), 4, new_vesting_schedule)); // Now account 4 should have vesting. - assert_eq!(Vesting::vesting(&4).unwrap(), vec![new_vesting_schedule]); + assert_eq!(VestingStorage::::get(&4).unwrap(), vec![new_vesting_schedule]); // Account 4 has 5 * 256 locked. assert_eq!(Vesting::vesting_balance(&4), Some(256 * 5)); // Verify only root can call. @@ -1183,7 +1183,7 @@ fn remove_vesting_schedule() { // Appropriate storage is cleaned up. assert!(!>::contains_key(4)); // Check the vesting balance is zero. - assert_eq!(Vesting::vesting(&4), None); + assert_eq!(VestingStorage::::get(&4), None); // Verifies that trying to remove a schedule when it doesnt exist throws error. assert_noop!( Vesting::force_remove_vesting_schedule(RawOrigin::Root.into(), 4, 0), -- GitLab From 221eddc90cd1efc4fc3c822ce5ccf289272fb41d Mon Sep 17 00:00:00 2001 From: Nazar Mokrynskyi Date: Fri, 5 Jul 2024 22:02:18 +0300 Subject: [PATCH 093/130] Optimize finalization performance (#4922) This PR largely fixes https://github.com/paritytech/polkadot-sdk/issues/4903 by addressing it from a few different directions. The high-level observation is that complexity of finalization was unfortunately roughly `O(n^3)`. Not only `displaced_leaves_after_finalizing` was extremely inefficient on its own, especially when large ranges of blocks were involved, it was called once upfront and then on every single block that was finalized over and over again. The first commit refactores code adjacent to `displaced_leaves_after_finalizing` to optimize memory allocations. For example things like `BTreeMap<_, Vec<_>>` were very bad in terms of number of allocations and after analyzing code paths was completely unnecessary and replaced with `Vec<(_, _)>`. In other places allocations of known size were not done upfront and some APIs required unnecessary cloning of vectors. I checked invariants and didn't find anything that was violated after refactoring. Second commit completely replaces `displaced_leaves_after_finalizing` implementation with a much more efficient one. In my case with ~82k blocks and ~13k leaves it takes ~5.4s to finish `client.apply_finality()` now. The idea is to avoid querying the same blocks over and over again as well as introducing temporary local cache for blocks related to leaves above block that is being finalized as well as local cache of the finalized branch of the chain. I left some comments in the code and wrote tests that I belive should check all code invariants for correctness. `lowest_common_ancestor_multiblock` was removed as unnecessary and not great in terms of performance API, domain-specific code should be written instead like done in `displaced_leaves_after_finalizing`. After these changes I noticed finalization is still horribly slow, turned out that even though `displaced_leaves_after_finalizing` was way faster that before (probably order of magnitude), it was called for every single of those 82k blocks :facepalm: The quick hack I came up with in the third commit to handle this edge case was to not call it when finalizing multiple blocks at once until the very last moment. It works and allows to finish the whole finalization in just 14 seconds (5.4+5.4 of which are two calls to `displaced_leaves_after_finalizing`). I'm really not happy with the fact that `displaced_leaves_after_finalizing` is called twice, but much heavier refactoring would be necessary to get rid of second call. --- Next steps: * assuming the changes are acceptable I'll write prdoc * https://github.com/paritytech/polkadot-sdk/pull/4920 or something similar in spirit should be implemented to unleash efficient parallelsm with rayon in `displaced_leaves_after_finalizing`, which will allow to further (and significant!) scale its performance rather that being CPU-bound on a single core, also reading database sequentially should ideally be avoided * someone should look into removal of the second `displaced_leaves_after_finalizing` call * further cleanups are possible if `undo_finalization` can be removed --- Polkadot Address: 1vSxzbyz2cJREAuVWjhXUT1ds8vBzoxn2w4asNpusQKwjJd --------- Co-authored-by: Sebastian Kunert --- Cargo.lock | 1 + prdoc/pr_4922.prdoc | 15 + substrate/client/api/src/backend.rs | 3 +- substrate/client/api/src/leaves.rs | 81 +++-- substrate/client/db/src/lib.rs | 279 +++++++++--------- substrate/primitives/blockchain/Cargo.toml | 1 + .../primitives/blockchain/src/backend.rs | 174 +++++++---- .../blockchain/src/header_metadata.rs | 42 +-- 8 files changed, 328 insertions(+), 268 deletions(-) create mode 100644 prdoc/pr_4922.prdoc diff --git a/Cargo.lock b/Cargo.lock index f3808b7eaa5..ff6e3c06313 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20018,6 +20018,7 @@ dependencies = [ "schnellru", "sp-api", "sp-consensus", + "sp-core", "sp-database", "sp-runtime", "sp-state-machine", diff --git a/prdoc/pr_4922.prdoc b/prdoc/pr_4922.prdoc new file mode 100644 index 00000000000..2e2dd26947c --- /dev/null +++ b/prdoc/pr_4922.prdoc @@ -0,0 +1,15 @@ +title: Optimize finalization performance + +doc: + - audience: Node Dev + description: | + Finalization algorithm was replaced with a more efficient version, data structures refactored to be faster and do + fewer memory allocations. As the result some APIs have changed in a minor, but incompatible way. + +crates: +- name: sc-client-api + bump: major +- name: sc-client-db + bump: major +- name: sp-blockchain + bump: major diff --git a/substrate/client/api/src/backend.rs b/substrate/client/api/src/backend.rs index 31b100433c7..0b2a3495240 100644 --- a/substrate/client/api/src/backend.rs +++ b/substrate/client/api/src/backend.rs @@ -217,7 +217,8 @@ pub trait BlockImportOperation { where I: IntoIterator, Option>)>; - /// Mark a block as finalized. + /// Mark a block as finalized, if multiple blocks are finalized in the same operation then they + /// must be marked in ascending order. fn mark_finalized( &mut self, hash: Block::Hash, diff --git a/substrate/client/api/src/leaves.rs b/substrate/client/api/src/leaves.rs index e129de8bf3f..70efe8b19c6 100644 --- a/substrate/client/api/src/leaves.rs +++ b/substrate/client/api/src/leaves.rs @@ -45,33 +45,20 @@ pub struct RemoveOutcome { } /// Removed leaves after a finalization action. -pub struct FinalizationOutcome { - removed: BTreeMap, Vec>, +pub struct FinalizationOutcome +where + I: Iterator, +{ + removed: I, } -impl FinalizationOutcome { - /// Merge with another. This should only be used for displaced items that - /// are produced within one transaction of each other. - pub fn merge(&mut self, mut other: Self) { - // this will ignore keys that are in duplicate, however - // if these are actually produced correctly via the leaf-set within - // one transaction, then there will be no overlap in the keys. - self.removed.append(&mut other.removed); - } - - /// Iterate over all displaced leaves. - pub fn leaves(&self) -> impl Iterator { - self.removed.values().flatten() - } - +impl FinalizationOutcome +where + I: Iterator, +{ /// Constructor - pub fn new(new_displaced: impl Iterator) -> Self { - let mut removed = BTreeMap::, Vec>::new(); - for (hash, number) in new_displaced { - removed.entry(Reverse(number)).or_default().push(hash); - } - - FinalizationOutcome { removed } + pub fn new(new_displaced: I) -> Self { + FinalizationOutcome { removed: new_displaced } } } @@ -86,7 +73,7 @@ pub struct LeafSet { impl LeafSet where H: Clone + PartialEq + Decode + Encode, - N: std::fmt::Debug + Clone + AtLeast32Bit + Decode + Encode, + N: std::fmt::Debug + Copy + AtLeast32Bit + Decode + Encode, { /// Construct a new, blank leaf set. pub fn new() -> Self { @@ -117,13 +104,13 @@ where let number = Reverse(number); let removed = if number.0 != N::zero() { - let parent_number = Reverse(number.0.clone() - N::one()); + let parent_number = Reverse(number.0 - N::one()); self.remove_leaf(&parent_number, &parent_hash).then(|| parent_hash) } else { None }; - self.insert_leaf(number.clone(), hash.clone()); + self.insert_leaf(number, hash.clone()); ImportOutcome { inserted: LeafSetItem { hash, number }, removed } } @@ -150,7 +137,7 @@ where let inserted = parent_hash.and_then(|parent_hash| { if number.0 != N::zero() { - let parent_number = Reverse(number.0.clone() - N::one()); + let parent_number = Reverse(number.0 - N::one()); self.insert_leaf(parent_number, parent_hash.clone()); Some(parent_hash) } else { @@ -162,11 +149,12 @@ where } /// Remove all leaves displaced by the last block finalization. - pub fn remove_displaced_leaves(&mut self, displaced_leaves: &FinalizationOutcome) { - for (number, hashes) in &displaced_leaves.removed { - for hash in hashes.iter() { - self.remove_leaf(number, hash); - } + pub fn remove_displaced_leaves(&mut self, displaced_leaves: FinalizationOutcome) + where + I: Iterator, + { + for (number, hash) in displaced_leaves.removed { + self.remove_leaf(&Reverse(number), &hash); } } @@ -186,13 +174,13 @@ where let items = self .storage .iter() - .flat_map(|(number, hashes)| hashes.iter().map(move |h| (h.clone(), number.clone()))) + .flat_map(|(number, hashes)| hashes.iter().map(move |h| (h.clone(), *number))) .collect::>(); - for (hash, number) in &items { + for (hash, number) in items { if number.0 > best_number { assert!( - self.remove_leaf(number, hash), + self.remove_leaf(&number, &hash), "item comes from an iterator over storage; qed", ); } @@ -207,7 +195,7 @@ where // we need to make sure that the best block exists in the leaf set as // this is an invariant of regular block import. if !leaves_contains_best { - self.insert_leaf(best_number.clone(), best_hash.clone()); + self.insert_leaf(best_number, best_hash.clone()); } } @@ -229,7 +217,7 @@ where column: u32, prefix: &[u8], ) { - let leaves: Vec<_> = self.storage.iter().map(|(n, h)| (n.0.clone(), h.clone())).collect(); + let leaves: Vec<_> = self.storage.iter().map(|(n, h)| (n.0, h.clone())).collect(); tx.set_from_vec(column, prefix, leaves.encode()); } @@ -274,7 +262,7 @@ where /// Returns the highest leaf and all hashes associated to it. pub fn highest_leaf(&self) -> Option<(N, &[H])> { - self.storage.iter().next().map(|(k, v)| (k.0.clone(), &v[..])) + self.storage.iter().next().map(|(k, v)| (k.0, &v[..])) } } @@ -286,13 +274,13 @@ pub struct Undo<'a, H: 'a, N: 'a> { impl<'a, H: 'a, N: 'a> Undo<'a, H, N> where H: Clone + PartialEq + Decode + Encode, - N: std::fmt::Debug + Clone + AtLeast32Bit + Decode + Encode, + N: std::fmt::Debug + Copy + AtLeast32Bit + Decode + Encode, { /// Undo an imported block by providing the import operation outcome. /// No additional operations should be performed between import and undo. pub fn undo_import(&mut self, outcome: ImportOutcome) { if let Some(removed_hash) = outcome.removed { - let removed_number = Reverse(outcome.inserted.number.0.clone() - N::one()); + let removed_number = Reverse(outcome.inserted.number.0 - N::one()); self.inner.insert_leaf(removed_number, removed_hash); } self.inner.remove_leaf(&outcome.inserted.number, &outcome.inserted.hash); @@ -302,7 +290,7 @@ where /// No additional operations should be performed between remove and undo. pub fn undo_remove(&mut self, outcome: RemoveOutcome) { if let Some(inserted_hash) = outcome.inserted { - let inserted_number = Reverse(outcome.removed.number.0.clone() - N::one()); + let inserted_number = Reverse(outcome.removed.number.0 - N::one()); self.inner.remove_leaf(&inserted_number, &inserted_hash); } self.inner.insert_leaf(outcome.removed.number, outcome.removed.hash); @@ -310,8 +298,13 @@ where /// Undo a finalization operation by providing the displaced leaves. /// No additional operations should be performed between finalization and undo. - pub fn undo_finalization(&mut self, mut outcome: FinalizationOutcome) { - self.inner.storage.append(&mut outcome.removed); + pub fn undo_finalization(&mut self, outcome: FinalizationOutcome) + where + I: Iterator, + { + for (number, hash) in outcome.removed { + self.inner.storage.entry(Reverse(number)).or_default().push(hash); + } } } diff --git a/substrate/client/db/src/lib.rs b/substrate/client/db/src/lib.rs index 8d8b7a2aff8..e95cd9e4ad5 100644 --- a/substrate/client/db/src/lib.rs +++ b/substrate/client/db/src/lib.rs @@ -1357,6 +1357,8 @@ impl Backend { Ok(()) } + /// `remove_displaced` can be set to `false` if this is not the last of many subsequent calls + /// for performance reasons. fn finalize_block_with_transaction( &self, transaction: &mut Transaction, @@ -1365,6 +1367,7 @@ impl Backend { last_finalized: Option, justification: Option, current_transaction_justifications: &mut HashMap, + remove_displaced: bool, ) -> ClientResult> { // TODO: ensure best chain contains this block. let number = *header.number(); @@ -1377,6 +1380,7 @@ impl Backend { hash, with_state, current_transaction_justifications, + remove_displaced, )?; if let Some(justification) = justification { @@ -1454,7 +1458,8 @@ impl Backend { let mut current_transaction_justifications: HashMap = HashMap::new(); - for (block_hash, justification) in operation.finalized_blocks { + let mut finalized_blocks = operation.finalized_blocks.into_iter().peekable(); + while let Some((block_hash, justification)) = finalized_blocks.next() { let block_header = self.blockchain.expect_header(block_hash)?; meta_updates.push(self.finalize_block_with_transaction( &mut transaction, @@ -1463,6 +1468,7 @@ impl Backend { Some(last_finalized_hash), justification, &mut current_transaction_justifications, + finalized_blocks.peek().is_none(), )?); last_finalized_hash = block_hash; last_finalized_num = *block_header.number(); @@ -1642,6 +1648,7 @@ impl Backend { hash, operation.commit_state, &mut current_transaction_justifications, + true, )?; } else { // canonicalize blocks which are old enough, regardless of finality. @@ -1766,9 +1773,10 @@ impl Backend { Ok(()) } - // write stuff to a transaction after a new block is finalized. - // this canonicalizes finalized blocks. Fails if called with a block which - // was not a child of the last finalized block. + // Write stuff to a transaction after a new block is finalized. This canonicalizes finalized + // blocks. Fails if called with a block which was not a child of the last finalized block. + /// `remove_displaced` can be set to `false` if this is not the last of many subsequent calls + /// for performance reasons. fn note_finalized( &self, transaction: &mut Transaction, @@ -1776,6 +1784,7 @@ impl Backend { f_hash: Block::Hash, with_state: bool, current_transaction_justifications: &mut HashMap, + remove_displaced: bool, ) -> ClientResult<()> { let f_num = *f_header.number(); @@ -1800,13 +1809,19 @@ impl Backend { apply_state_commit(transaction, commit); } - let new_displaced = self.blockchain.displaced_leaves_after_finalizing(f_hash, f_num)?; - let finalization_outcome = - FinalizationOutcome::new(new_displaced.displaced_leaves.clone().into_iter()); + if remove_displaced { + let new_displaced = self.blockchain.displaced_leaves_after_finalizing(f_hash, f_num)?; - self.blockchain.leaves.write().remove_displaced_leaves(&finalization_outcome); + self.blockchain.leaves.write().remove_displaced_leaves(FinalizationOutcome::new( + new_displaced.displaced_leaves.iter().copied(), + )); - self.prune_blocks(transaction, f_num, &new_displaced, current_transaction_justifications)?; + if !matches!(self.blocks_pruning, BlocksPruning::KeepAll) { + self.prune_displaced_branches(transaction, &new_displaced)?; + } + } + + self.prune_blocks(transaction, f_num, current_transaction_justifications)?; Ok(()) } @@ -1815,39 +1830,29 @@ impl Backend { &self, transaction: &mut Transaction, finalized_number: NumberFor, - displaced: &DisplacedLeavesAfterFinalization, current_transaction_justifications: &mut HashMap, ) -> ClientResult<()> { - match self.blocks_pruning { - BlocksPruning::KeepAll => {}, - BlocksPruning::Some(blocks_pruning) => { - // Always keep the last finalized block - let keep = std::cmp::max(blocks_pruning, 1); - if finalized_number >= keep.into() { - let number = finalized_number.saturating_sub(keep.into()); - - // Before we prune a block, check if it is pinned - if let Some(hash) = self.blockchain.hash(number)? { - self.blockchain.insert_persisted_body_if_pinned(hash)?; - - // If the block was finalized in this transaction, it will not be in the db - // yet. - if let Some(justification) = - current_transaction_justifications.remove(&hash) - { - self.blockchain.insert_justifications_if_pinned(hash, justification); - } else { - self.blockchain.insert_persisted_justifications_if_pinned(hash)?; - } - }; + if let BlocksPruning::Some(blocks_pruning) = self.blocks_pruning { + // Always keep the last finalized block + let keep = std::cmp::max(blocks_pruning, 1); + if finalized_number >= keep.into() { + let number = finalized_number.saturating_sub(keep.into()); + + // Before we prune a block, check if it is pinned + if let Some(hash) = self.blockchain.hash(number)? { + self.blockchain.insert_persisted_body_if_pinned(hash)?; + + // If the block was finalized in this transaction, it will not be in the db + // yet. + if let Some(justification) = current_transaction_justifications.remove(&hash) { + self.blockchain.insert_justifications_if_pinned(hash, justification); + } else { + self.blockchain.insert_persisted_justifications_if_pinned(hash)?; + } + }; - self.prune_block(transaction, BlockId::::number(number))?; - } - self.prune_displaced_branches(transaction, displaced)?; - }, - BlocksPruning::KeepFinalized => { - self.prune_displaced_branches(transaction, displaced)?; - }, + self.prune_block(transaction, BlockId::::number(number))?; + } } Ok(()) } @@ -1858,11 +1863,9 @@ impl Backend { displaced: &DisplacedLeavesAfterFinalization, ) -> ClientResult<()> { // Discard all blocks from displaced branches - for (_, tree_route) in displaced.tree_routes.iter() { - for r in tree_route.retracted() { - self.blockchain.insert_persisted_body_if_pinned(r.hash)?; - self.prune_block(transaction, BlockId::::hash(r.hash))?; - } + for &hash in displaced.displaced_blocks.iter() { + self.blockchain.insert_persisted_body_if_pinned(hash)?; + self.prune_block(transaction, BlockId::::hash(hash))?; } Ok(()) } @@ -2110,6 +2113,7 @@ impl sc_client_api::backend::Backend for Backend { None, justification, &mut current_transaction_justifications, + true, )?; self.storage.db.commit(transaction)?; @@ -2547,7 +2551,7 @@ pub(crate) mod tests { backend::{Backend as BTrait, BlockImportOperation as Op}, blockchain::Backend as BLBTrait, }; - use sp_blockchain::{lowest_common_ancestor, lowest_common_ancestor_multiblock, tree_route}; + use sp_blockchain::{lowest_common_ancestor, tree_route}; use sp_core::H256; use sp_runtime::{ testing::{Block as RawBlock, ExtrinsicWrapper, Header}, @@ -3109,121 +3113,118 @@ pub(crate) mod tests { } #[test] - fn lowest_common_ancestors_multiblock_works() { + fn displaced_leaves_after_finalizing_works() { let backend = Backend::::new_test(1000, 100); let blockchain = backend.blockchain(); - let block0 = insert_header(&backend, 0, Default::default(), None, Default::default()); + let genesis_number = 0; + let genesis_hash = + insert_header(&backend, genesis_number, Default::default(), None, Default::default()); // fork from genesis: 3 prong. // block 0 -> a1 -> a2 -> a3 - // | - // -> b1 -> b2 -> c1 -> c2 - // | - // -> d1 -> d2 - let a1 = insert_header(&backend, 1, block0, None, Default::default()); - let a2 = insert_header(&backend, 2, a1, None, Default::default()); - let a3 = insert_header(&backend, 3, a2, None, Default::default()); - - // fork from genesis: 2 prong. - let b1 = insert_header(&backend, 1, block0, None, H256::from([1; 32])); - let b2 = insert_header(&backend, 2, b1, None, Default::default()); - - // fork from b2. - let c1 = insert_header(&backend, 3, b2, None, H256::from([2; 32])); - let c2 = insert_header(&backend, 4, c1, None, Default::default()); - - // fork from b1. - let d1 = insert_header(&backend, 2, b1, None, H256::from([3; 32])); - let d2 = insert_header(&backend, 3, d1, None, Default::default()); - { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![a3, b2]).unwrap().unwrap(); - - assert_eq!(lca.hash, block0); - assert_eq!(lca.number, 0); - } - - { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![a1, a3]).unwrap().unwrap(); - - assert_eq!(lca.hash, a1); - assert_eq!(lca.number, 1); - } - - { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![a3, a1]).unwrap().unwrap(); - - assert_eq!(lca.hash, a1); - assert_eq!(lca.number, 1); - } - - { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![a2, a3]).unwrap().unwrap(); - - assert_eq!(lca.hash, a2); - assert_eq!(lca.number, 2); - } + // \ + // -> b1 -> b2 -> c1 -> c2 + // \ + // -> d1 -> d2 + let a1_number = 1; + let a1_hash = insert_header(&backend, a1_number, genesis_hash, None, Default::default()); + let a2_number = 2; + let a2_hash = insert_header(&backend, a2_number, a1_hash, None, Default::default()); + let a3_number = 3; + let a3_hash = insert_header(&backend, a3_number, a2_hash, None, Default::default()); { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![a2, a1]).unwrap().unwrap(); - - assert_eq!(lca.hash, a1); - assert_eq!(lca.number, 1); + let displaced = blockchain + .displaced_leaves_after_finalizing(genesis_hash, genesis_number) + .unwrap(); + assert_eq!(displaced.displaced_leaves, vec![]); + assert_eq!(displaced.displaced_blocks, vec![]); } - { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![a2, a2]).unwrap().unwrap(); - - assert_eq!(lca.hash, a2); - assert_eq!(lca.number, 2); + let displaced_a1 = + blockchain.displaced_leaves_after_finalizing(a1_hash, a1_number).unwrap(); + assert_eq!(displaced_a1.displaced_leaves, vec![]); + assert_eq!(displaced_a1.displaced_blocks, vec![]); + + let displaced_a2 = + blockchain.displaced_leaves_after_finalizing(a2_hash, a3_number).unwrap(); + assert_eq!(displaced_a2.displaced_leaves, vec![]); + assert_eq!(displaced_a2.displaced_blocks, vec![]); + + let displaced_a3 = + blockchain.displaced_leaves_after_finalizing(a3_hash, a3_number).unwrap(); + assert_eq!(displaced_a3.displaced_leaves, vec![]); + assert_eq!(displaced_a3.displaced_blocks, vec![]); } - { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![a3, d2, c2]) - .unwrap() - .unwrap(); - - assert_eq!(lca.hash, block0); - assert_eq!(lca.number, 0); - } + // fork from genesis: 2 prong. + let b1_number = 1; + let b1_hash = insert_header(&backend, b1_number, genesis_hash, None, H256::from([1; 32])); + let b2_number = 2; + let b2_hash = insert_header(&backend, b2_number, b1_hash, None, Default::default()); - { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![c2, d2, b2]) - .unwrap() - .unwrap(); + // fork from b2. + let c1_number = 3; + let c1_hash = insert_header(&backend, c1_number, b2_hash, None, H256::from([2; 32])); + let c2_number = 4; + let c2_hash = insert_header(&backend, c2_number, c1_hash, None, Default::default()); - assert_eq!(lca.hash, b1); - assert_eq!(lca.number, 1); - } + // fork from b1. + let d1_number = 2; + let d1_hash = insert_header(&backend, d1_number, b1_hash, None, H256::from([3; 32])); + let d2_number = 3; + let d2_hash = insert_header(&backend, d2_number, d1_hash, None, Default::default()); { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![a1, a2, a3]) - .unwrap() - .unwrap(); - - assert_eq!(lca.hash, a1); - assert_eq!(lca.number, 1); + let displaced_a1 = + blockchain.displaced_leaves_after_finalizing(a1_hash, a1_number).unwrap(); + assert_eq!( + displaced_a1.displaced_leaves, + vec![(c2_number, c2_hash), (d2_number, d2_hash)] + ); + let mut displaced_blocks = vec![b1_hash, b2_hash, c1_hash, c2_hash, d1_hash, d2_hash]; + displaced_blocks.sort(); + assert_eq!(displaced_a1.displaced_blocks, displaced_blocks); + + let displaced_a2 = + blockchain.displaced_leaves_after_finalizing(a2_hash, a2_number).unwrap(); + assert_eq!(displaced_a1.displaced_leaves, displaced_a2.displaced_leaves); + assert_eq!(displaced_a1.displaced_blocks, displaced_a2.displaced_blocks); + + let displaced_a3 = + blockchain.displaced_leaves_after_finalizing(a3_hash, a3_number).unwrap(); + assert_eq!(displaced_a1.displaced_leaves, displaced_a3.displaced_leaves); + assert_eq!(displaced_a1.displaced_blocks, displaced_a3.displaced_blocks); } - { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![b1, b2, d1]) - .unwrap() - .unwrap(); - - assert_eq!(lca.hash, b1); - assert_eq!(lca.number, 1); + let displaced = + blockchain.displaced_leaves_after_finalizing(b1_hash, b1_number).unwrap(); + assert_eq!(displaced.displaced_leaves, vec![(a3_number, a3_hash)]); + let mut displaced_blocks = vec![a1_hash, a2_hash, a3_hash]; + displaced_blocks.sort(); + assert_eq!(displaced.displaced_blocks, displaced_blocks); } - { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![]); - - assert_eq!(true, matches!(lca, Ok(None))); + let displaced = + blockchain.displaced_leaves_after_finalizing(b2_hash, b2_number).unwrap(); + assert_eq!( + displaced.displaced_leaves, + vec![(a3_number, a3_hash), (d2_number, d2_hash)] + ); + let mut displaced_blocks = vec![a1_hash, a2_hash, a3_hash, d1_hash, d2_hash]; + displaced_blocks.sort(); + assert_eq!(displaced.displaced_blocks, displaced_blocks); } - { - let lca = lowest_common_ancestor_multiblock(blockchain, vec![a1]).unwrap().unwrap(); - - assert_eq!(lca.hash, a1); - assert_eq!(lca.number, 1); + let displaced = + blockchain.displaced_leaves_after_finalizing(c2_hash, c2_number).unwrap(); + assert_eq!( + displaced.displaced_leaves, + vec![(a3_number, a3_hash), (d2_number, d2_hash)] + ); + let mut displaced_blocks = vec![a1_hash, a2_hash, a3_hash, d1_hash, d2_hash]; + displaced_blocks.sort(); + assert_eq!(displaced.displaced_blocks, displaced_blocks); } } diff --git a/substrate/primitives/blockchain/Cargo.toml b/substrate/primitives/blockchain/Cargo.toml index 67126d4d19e..aedd720612c 100644 --- a/substrate/primitives/blockchain/Cargo.toml +++ b/substrate/primitives/blockchain/Cargo.toml @@ -24,6 +24,7 @@ parking_lot = { workspace = true, default-features = true } schnellru = { workspace = true } thiserror = { workspace = true } sp-api = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } sp-consensus = { workspace = true, default-features = true } sp-database = { workspace = true, default-features = true } sp-runtime = { workspace = true, default-features = true } diff --git a/substrate/primitives/blockchain/src/backend.rs b/substrate/primitives/blockchain/src/backend.rs index 76393420da7..a928217d588 100644 --- a/substrate/primitives/blockchain/src/backend.rs +++ b/substrate/primitives/blockchain/src/backend.rs @@ -21,15 +21,15 @@ use log::warn; use parking_lot::RwLock; use sp_runtime::{ generic::BlockId, - traits::{Block as BlockT, CheckedSub, Header as HeaderT, NumberFor, Zero}, + traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}, Justifications, }; -use std::collections::{btree_map::BTreeMap, btree_set::BTreeSet}; +use std::collections::{btree_set::BTreeSet, HashMap, VecDeque}; use crate::{ error::{Error, Result}, - header_metadata::{self, HeaderMetadata}, - lowest_common_ancestor_multiblock, tree_route, TreeRoute, + header_metadata::HeaderMetadata, + tree_route, CachedHeaderMetadata, }; /// Blockchain database header backend. Does not perform any validation. @@ -128,6 +128,32 @@ where { } +struct MinimalBlockMetadata { + number: NumberFor, + hash: Block::Hash, + parent: Block::Hash, +} + +impl Clone for MinimalBlockMetadata +where + Block: BlockT, +{ + fn clone(&self) -> Self { + Self { number: self.number, hash: self.hash, parent: self.parent } + } +} + +impl Copy for MinimalBlockMetadata where Block: BlockT {} + +impl From<&CachedHeaderMetadata> for MinimalBlockMetadata +where + Block: BlockT, +{ + fn from(value: &CachedHeaderMetadata) -> Self { + Self { number: value.number, hash: value.hash, parent: value.parent } + } +} + /// Blockchain database backend. Does not perform any validation. pub trait Backend: HeaderBackend + HeaderMetadata @@ -226,88 +252,128 @@ pub trait Backend: finalized_block_hash: Block::Hash, finalized_block_number: NumberFor, ) -> std::result::Result, Error> { - let mut result = DisplacedLeavesAfterFinalization::default(); - let leaves = self.leaves()?; // If we have only one leaf there are no forks, and we can return early. if finalized_block_number == Zero::zero() || leaves.len() == 1 { - return Ok(result) + return Ok(DisplacedLeavesAfterFinalization::default()) } - let first_leaf = leaves.first().ok_or(Error::Backend( - "Unable to find any leaves. This should not happen.".to_string(), - ))?; - let leaf_block_header = self.expect_header(*first_leaf)?; - - // If the distance between the leafs and the finalized block is large, calculating - // tree routes can be very expensive. In that case, we will try to find the - // lowest common ancestor between all the leaves. The assumption here is that the forks are - // close to the tip and not long. So the LCA can be computed from the header cache. If the - // LCA is above the finalized block, we know that there are no displaced leaves by the - // finalization. - if leaf_block_header - .number() - .checked_sub(&finalized_block_number) - .unwrap_or(0u32.into()) > - header_metadata::LRU_CACHE_SIZE.into() - { - if let Some(lca) = lowest_common_ancestor_multiblock(self, leaves.clone())? { - if lca.number > finalized_block_number { - return Ok(result) - } else { - log::warn!("The distance between leafs and finalized block is large. Finalization can take a long time."); - } - }; - } + // Store hashes of finalized blocks for quick checking later, the last block if the + // finalized one + let mut finalized_chain = VecDeque::new(); + finalized_chain + .push_front(MinimalBlockMetadata::from(&self.header_metadata(finalized_block_hash)?)); + + // Local cache is a performance optimization in case of finalized block deep below the + // tip of the chain with a lot of leaves above finalized block + let mut local_cache = HashMap::>::new(); + + let mut result = DisplacedLeavesAfterFinalization { + displaced_leaves: Vec::with_capacity(leaves.len()), + displaced_blocks: Vec::with_capacity(leaves.len()), + }; + let mut displaced_blocks_candidates = Vec::new(); - // For each leaf determine whether it belongs to a non-canonical branch. for leaf_hash in leaves { - let leaf_block_header = self.expect_header(leaf_hash)?; - let leaf_number = *leaf_block_header.number(); + let mut current_header_metadata = + MinimalBlockMetadata::from(&self.header_metadata(leaf_hash)?); + let leaf_number = current_header_metadata.number; + + // Collect all block hashes until the height of the finalized block + displaced_blocks_candidates.clear(); + while current_header_metadata.number > finalized_block_number { + displaced_blocks_candidates.push(current_header_metadata.hash); + + let parent_hash = current_header_metadata.parent; + match local_cache.get(&parent_hash) { + Some(metadata_header) => { + current_header_metadata = *metadata_header; + }, + None => { + current_header_metadata = + MinimalBlockMetadata::from(&self.header_metadata(parent_hash)?); + // Cache locally in case more branches above finalized block reference + // the same block hash + local_cache.insert(parent_hash, current_header_metadata); + }, + } + } + + // If points back to the finalized header then nothing left to do, this leaf will be + // checked again later + if current_header_metadata.hash == finalized_block_hash { + continue; + } - let leaf_tree_route = match tree_route(self, leaf_hash, finalized_block_hash) { - Ok(tree_route) => tree_route, - Err(Error::UnknownBlock(_)) => { - // Sometimes routes can't be calculated. E.g. after warp sync. + // Otherwise the whole leaf branch needs to be pruned, track it all the way to the + // point of branching from the finalized chain + result.displaced_leaves.push((leaf_number, leaf_hash)); + result.displaced_blocks.extend(displaced_blocks_candidates.drain(..)); + result.displaced_blocks.push(current_header_metadata.hash); + // Collect the rest of the displaced blocks of leaf branch + for distance_from_finalized in 1_u32.. { + // Find block at `distance_from_finalized` from finalized block + let (finalized_chain_block_number, finalized_chain_block_hash) = + match finalized_chain.iter().rev().nth(distance_from_finalized as usize) { + Some(header) => (header.number, header.hash), + None => { + let metadata = MinimalBlockMetadata::from(&self.header_metadata( + finalized_chain.front().expect("Not empty; qed").parent, + )?); + let result = (metadata.number, metadata.hash); + finalized_chain.push_front(metadata); + result + }, + }; + + if current_header_metadata.number <= finalized_chain_block_number { + // Skip more blocks until we get all blocks on finalized chain until the height + // of the parent block continue; - }, - Err(e) => Err(e)?, - }; + } - // Is it a stale fork? - let needs_pruning = leaf_tree_route.common_block().hash != finalized_block_hash; + let parent_hash = current_header_metadata.parent; + if finalized_chain_block_hash == parent_hash { + // Reached finalized chain, nothing left to do + break; + } - if needs_pruning { - result.displaced_leaves.insert(leaf_hash, leaf_number); - result.tree_routes.insert(leaf_hash, leaf_tree_route); + // Store displaced block and look deeper for block on finalized chain + result.displaced_blocks.push(parent_hash); + current_header_metadata = + MinimalBlockMetadata::from(&self.header_metadata(parent_hash)?); } } - Ok(result) + // There could be duplicates shared by multiple branches, clean them up + result.displaced_blocks.sort_unstable(); + result.displaced_blocks.dedup(); + + return Ok(result); } } /// Result of [`Backend::displaced_leaves_after_finalizing`]. #[derive(Clone, Debug)] pub struct DisplacedLeavesAfterFinalization { - /// A collection of hashes and block numbers for displaced leaves. - pub displaced_leaves: BTreeMap>, + /// A list of hashes and block numbers of displaced leaves. + pub displaced_leaves: Vec<(NumberFor, Block::Hash)>, - /// A collection of tree routes from the leaves to finalized block. - pub tree_routes: BTreeMap>, + /// A list of hashes displaced blocks from all displaced leaves. + pub displaced_blocks: Vec, } impl Default for DisplacedLeavesAfterFinalization { fn default() -> Self { - Self { displaced_leaves: Default::default(), tree_routes: Default::default() } + Self { displaced_leaves: Vec::new(), displaced_blocks: Vec::new() } } } impl DisplacedLeavesAfterFinalization { /// Returns a collection of hashes for the displaced leaves. pub fn hashes(&self) -> impl Iterator + '_ { - self.displaced_leaves.keys().cloned() + self.displaced_leaves.iter().map(|(_, hash)| *hash) } } diff --git a/substrate/primitives/blockchain/src/header_metadata.rs b/substrate/primitives/blockchain/src/header_metadata.rs index c2054445b06..30024765add 100644 --- a/substrate/primitives/blockchain/src/header_metadata.rs +++ b/substrate/primitives/blockchain/src/header_metadata.rs @@ -20,12 +20,16 @@ use parking_lot::RwLock; use schnellru::{ByLength, LruMap}; -use sp_runtime::traits::{Block as BlockT, Header, NumberFor, One}; +use sp_core::U256; +use sp_runtime::{ + traits::{Block as BlockT, Header, NumberFor, One}, + Saturating, +}; /// Set to the expected max difference between `best` and `finalized` blocks at sync. pub(crate) const LRU_CACHE_SIZE: u32 = 5_000; -/// Get lowest common ancestor between two blocks in the tree. +/// Get the lowest common ancestor between two blocks in the tree. /// /// This implementation is efficient because our trees have very few and /// small branches, and because of our current query pattern: @@ -96,30 +100,6 @@ pub fn lowest_common_ancestor + ?Sized>( Ok(HashAndNumber { hash: header_one.hash, number: header_one.number }) } -/// Get lowest common ancestor between multiple blocks. -pub fn lowest_common_ancestor_multiblock + ?Sized>( - backend: &T, - hashes: Vec, -) -> Result>, T::Error> { - // Ensure the list of hashes is not empty - let mut hashes_iter = hashes.into_iter(); - - let first_hash = match hashes_iter.next() { - Some(hash) => hash, - None => return Ok(None), - }; - - // Start with the first hash as the initial LCA - let first_cached = backend.header_metadata(first_hash)?; - let mut lca = HashAndNumber { number: first_cached.number, hash: first_cached.hash }; - for hash in hashes_iter { - // Calculate the LCA of the current LCA and the next hash - lca = lowest_common_ancestor(backend, lca.hash, hash)?; - } - - Ok(Some(lca)) -} - /// Compute a tree-route between two blocks. See tree-route docs for more details. pub fn tree_route + ?Sized>( backend: &T, @@ -129,15 +109,16 @@ pub fn tree_route + ?Sized>( let mut from = backend.header_metadata(from)?; let mut to = backend.header_metadata(to)?; - let mut from_branch = Vec::new(); - let mut to_branch = Vec::new(); - + let mut to_branch = + Vec::with_capacity(Into::::into(to.number.saturating_sub(from.number)).as_usize()); while to.number > from.number { to_branch.push(HashAndNumber { number: to.number, hash: to.hash }); to = backend.header_metadata(to.parent)?; } + let mut from_branch = + Vec::with_capacity(Into::::into(to.number.saturating_sub(from.number)).as_usize()); while from.number > to.number { from_branch.push(HashAndNumber { number: from.number, hash: from.hash }); from = backend.header_metadata(from.parent)?; @@ -156,6 +137,7 @@ pub fn tree_route + ?Sized>( // add the pivot block. and append the reversed to-branch // (note that it's reverse order originals) let pivot = from_branch.len(); + from_branch.reserve_exact(to_branch.len() + 1); from_branch.push(HashAndNumber { number: to.number, hash: to.hash }); from_branch.extend(to_branch.into_iter().rev()); @@ -173,7 +155,7 @@ pub struct HashAndNumber { /// A tree-route from one block to another in the chain. /// -/// All blocks prior to the pivot in the deque is the reverse-order unique ancestry +/// All blocks prior to the pivot in the vector is the reverse-order unique ancestry /// of the first block, the block at the pivot index is the common ancestor, /// and all blocks after the pivot is the ancestry of the second block, in /// order. -- GitLab From 706d2f3e90178c91d8d2e7f7531374da9a8034e5 Mon Sep 17 00:00:00 2001 From: Sam Johnson Date: Sat, 6 Jul 2024 15:53:20 -0400 Subject: [PATCH 094/130] upgrade to macro_magic 0.5.1 (#4945) Release notes here: https://github.com/sam0x17/macro_magic/releases/tag/v0.5.1 Some performance improvements + upgrades to `derive-syn-parse` 2.0 which means polkadot-sdk now fully upgrades this crate within the workspace --- Cargo.lock | 33 +++++++++++---------------------- Cargo.toml | 2 +- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ff6e3c06313..046f9a15bbd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4786,17 +4786,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive-syn-parse" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" -dependencies = [ - "proc-macro2 1.0.82", - "quote 1.0.35", - "syn 1.0.109", -] - [[package]] name = "derive-syn-parse" version = "0.2.0" @@ -4980,7 +4969,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" dependencies = [ "common-path", - "derive-syn-parse 0.2.0", + "derive-syn-parse", "once_cell", "proc-macro2 1.0.82", "quote 1.0.35", @@ -6005,7 +5994,7 @@ version = "23.0.0" dependencies = [ "Inflector", "cfg-expr", - "derive-syn-parse 0.2.0", + "derive-syn-parse", "expander", "frame-support-procedural-tools", "itertools 0.11.0", @@ -8431,9 +8420,9 @@ dependencies = [ [[package]] name = "macro_magic" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e03844fc635e92f3a0067e25fa4bf3e3dbf3f2927bf3aa01bb7bc8f1c428949d" +checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" dependencies = [ "macro_magic_core", "macro_magic_macros", @@ -8443,12 +8432,12 @@ dependencies = [ [[package]] name = "macro_magic_core" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d" +checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" dependencies = [ "const-random", - "derive-syn-parse 0.1.5", + "derive-syn-parse", "macro_magic_core_macros", "proc-macro2 1.0.82", "quote 1.0.35", @@ -8457,9 +8446,9 @@ dependencies = [ [[package]] name = "macro_magic_core_macros" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" +checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ "proc-macro2 1.0.82", "quote 1.0.35", @@ -8468,9 +8457,9 @@ dependencies = [ [[package]] name = "macro_magic_macros" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" +checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ "macro_magic_core", "quote 1.0.35", diff --git a/Cargo.toml b/Cargo.toml index db9a2bd7227..5c2677fffeb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -819,7 +819,7 @@ linregress = { version = "0.5.1" } lite-json = { version = "0.2.0", default-features = false } litep2p = { version = "0.6.2" } log = { version = "0.4.21", default-features = false } -macro_magic = { version = "0.5.0" } +macro_magic = { version = "0.5.1" } maplit = { version = "1.0.2" } memmap2 = { version = "0.9.3" } memory-db = { version = "0.32.0", default-features = false } -- GitLab From 515a9f7ad90e664c80214931d85da3d53c807573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Senovilla=20Polo?= <117524919+tsenovilla@users.noreply.github.com> Date: Sat, 6 Jul 2024 22:27:14 +0200 Subject: [PATCH 095/130] Fix small typo in fungible token freeze docs (#4943) Hi! In the course of a talk with @shawntabrizi in Singapore, we realized the documentation related to freeze balances' a little bit confusing. It stated that a frozen amount is released at some specified block number, which isn't true in general. This PR fixes that typo and further specifies that the frozen balance may exceed the available balance, according to what we learned at the PBA. This feature was not specified in the documentation AFAIK. This is the first time I submit something to the polkadot SDK repo, so please feel free to rephrase the docs I added in case I messed up! --------- Co-authored-by: Shawn Tabrizi Co-authored-by: command-bot <> --- prdoc/pr_4943.prdoc | 13 +++++++++++++ .../frame/support/src/traits/tokens/fungible/mod.rs | 9 +++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 prdoc/pr_4943.prdoc diff --git a/prdoc/pr_4943.prdoc b/prdoc/pr_4943.prdoc new file mode 100644 index 00000000000..70532512606 --- /dev/null +++ b/prdoc/pr_4943.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Update definition of frozen balance (docs PR) + +doc: + - audience: Runtime Dev + description: | + This PR fixes a bug in the docs located in the definition of frozen balances. In addition, it extends that definition for completeness. + +crates: +- name: frame-support + bump: patch \ No newline at end of file diff --git a/substrate/frame/support/src/traits/tokens/fungible/mod.rs b/substrate/frame/support/src/traits/tokens/fungible/mod.rs index b8e98564898..a113cb01c98 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/mod.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/mod.rs @@ -58,13 +58,18 @@ //! 3 holds for 100 units, the account can spend its funds for any reason down to 300 units, at //! which point the holds will start to come into play. //! -//! - **Frozen Balance**: A freeze on a specified amount of an account's free balance until a -//! specified block number. +//! - **Frozen Balance**: A freeze on a specified amount of an account's balance. Tokens that are +//! frozen cannot be transferred. //! //! Multiple freezes always operate over the same funds, so they "overlay" rather than //! "stack". This means that if an account has 3 freezes for 100 units, the account can spend its //! funds for any reason down to 100 units, at which point the freezes will start to come into //! play. +//! +//! It's important to note that the frozen balance can exceed the total balance of the account. +//! This is useful, eg, in cases where you want to prevent a user from transferring any fund. In +//! such a case, setting the frozen balance to `Balance::MAX` would serve that purpose +//! effectively. //! //! - **Minimum Balance (a.k.a. Existential Deposit, a.k.a. ED)**: The minimum balance required to //! create or keep an account open. This is to prevent "dust accounts" from filling storage. When -- GitLab From d3a679d312173d3f2eabd0b259f22b68d2c83238 Mon Sep 17 00:00:00 2001 From: Deepak Chaudhary <54492415+Aideepakchaudhary@users.noreply.github.com> Date: Sun, 7 Jul 2024 04:32:05 +0800 Subject: [PATCH 096/130] remove getter from transaction storage pallet (#4885) ### ISSUE Link to the issue: https://github.com/paritytech/polkadot-sdk/issues/3326 cc @muraca Deliverables - [Deprecation] remove pallet::getter usage from pallet-transaction-storage ### Test Outcomes ___ cargo test -p pallet-transaction-storage --features runtime-benchmarks running 9 tests test mock::test_genesis_config_builds ... ok test tests::burns_fee ... ok test mock::__construct_runtime_integrity_test::runtime_integrity_tests ... ok test tests::discards_data ... ok test tests::renews_data ... ok test benchmarking::bench_renew ... ok test benchmarking::bench_store ... ok test tests::checks_proof ... ok test benchmarking::bench_check_proof_max has been running for over 60 seconds test benchmarking::bench_check_proof_max ... ok test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 72.57s Doc-tests pallet-transaction-storage running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s --- Polkadot Address: 16htXkeVhfroBhL6nuqiwknfXKcT6WadJPZqEi2jRf9z4XPY --- prdoc/pr_4885.prdoc | 14 ++++ .../frame/transaction-storage/src/lib.rs | 78 +++++++++++-------- .../frame/transaction-storage/src/tests.rs | 12 +-- 3 files changed, 65 insertions(+), 39 deletions(-) create mode 100644 prdoc/pr_4885.prdoc diff --git a/prdoc/pr_4885.prdoc b/prdoc/pr_4885.prdoc new file mode 100644 index 00000000000..50dc31bc1b8 --- /dev/null +++ b/prdoc/pr_4885.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from the pallet-transaction-storage + +doc: + - audience: Runtime Dev + description: | + This PR removed `pallet::getter`s from `pallet-transaction-storage`s storage items. + When accessed inside the pallet, use the syntax `StorageItem::::get()`. + +crates: + - name: pallet-transaction-storage + bump: minor diff --git a/substrate/frame/transaction-storage/src/lib.rs b/substrate/frame/transaction-storage/src/lib.rs index 398cb350c50..6e58ee3e585 100644 --- a/substrate/frame/transaction-storage/src/lib.rs +++ b/substrate/frame/transaction-storage/src/lib.rs @@ -159,11 +159,11 @@ pub mod pallet { fn on_initialize(n: BlockNumberFor) -> Weight { // Drop obsolete roots. The proof for `obsolete` will be checked later // in this block, so we drop `obsolete` - 1. - let period = >::get(); + let period = StoragePeriod::::get(); let obsolete = n.saturating_sub(period.saturating_add(One::one())); if obsolete > Zero::zero() { - >::remove(obsolete); - >::remove(obsolete); + Transactions::::remove(obsolete); + ChunkCount::::remove(obsolete); } // 2 writes in `on_initialize` and 2 writes + 2 reads in `on_finalize` T::DbWeight::get().reads_writes(2, 4) @@ -171,21 +171,21 @@ pub mod pallet { fn on_finalize(n: BlockNumberFor) { assert!( - >::take() || { + ProofChecked::::take() || { // Proof is not required for early or empty blocks. - let number = >::block_number(); - let period = >::get(); + let number = frame_system::Pallet::::block_number(); + let period = StoragePeriod::::get(); let target_number = number.saturating_sub(period); - target_number.is_zero() || >::get(target_number) == 0 + target_number.is_zero() || ChunkCount::::get(target_number) == 0 }, "Storage proof must be checked once in the block" ); // Insert new transactions - let transactions = >::take(); + let transactions = BlockTransactions::::take(); let total_chunks = transactions.last().map_or(0, |t| t.block_chunks); if total_chunks != 0 { - >::insert(n, total_chunks); - >::insert(n, transactions); + ChunkCount::::insert(n, total_chunks); + Transactions::::insert(n, transactions); } } } @@ -215,11 +215,11 @@ pub mod pallet { let content_hash = sp_io::hashing::blake2_256(&data); let extrinsic_index = - >::extrinsic_index().ok_or(Error::::BadContext)?; + frame_system::Pallet::::extrinsic_index().ok_or(Error::::BadContext)?; sp_io::transaction_index::index(extrinsic_index, data.len() as u32, content_hash); let mut index = 0; - >::mutate(|transactions| { + BlockTransactions::::mutate(|transactions| { if transactions.len() + 1 > T::MaxBlockTransactions::get() as usize { return Err(Error::::TooManyTransactions) } @@ -253,17 +253,17 @@ pub mod pallet { index: u32, ) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; - let transactions = >::get(block).ok_or(Error::::RenewedNotFound)?; + let transactions = Transactions::::get(block).ok_or(Error::::RenewedNotFound)?; let info = transactions.get(index as usize).ok_or(Error::::RenewedNotFound)?; let extrinsic_index = - >::extrinsic_index().ok_or(Error::::BadContext)?; + frame_system::Pallet::::extrinsic_index().ok_or(Error::::BadContext)?; Self::apply_fee(sender, info.size)?; sp_io::transaction_index::renew(extrinsic_index, info.content_hash.into()); let mut index = 0; - >::mutate(|transactions| { + BlockTransactions::::mutate(|transactions| { if transactions.len() + 1 > T::MaxBlockTransactions::get() as usize { return Err(Error::::TooManyTransactions) } @@ -297,15 +297,15 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { ensure_none(origin)?; ensure!(!ProofChecked::::get(), Error::::DoubleCheck); - let number = >::block_number(); - let period = >::get(); + let number = frame_system::Pallet::::block_number(); + let period = StoragePeriod::::get(); let target_number = number.saturating_sub(period); ensure!(!target_number.is_zero(), Error::::UnexpectedProof); - let total_chunks = >::get(target_number); + let total_chunks = ChunkCount::::get(target_number); ensure!(total_chunks != 0, Error::::UnexpectedProof); - let parent_hash = >::parent_hash(); + let parent_hash = frame_system::Pallet::::parent_hash(); let selected_chunk_index = random_chunk(parent_hash.as_ref(), total_chunks); - let (info, chunk_index) = match >::get(target_number) { + let (info, chunk_index) = match Transactions::::get(target_number) { Some(infos) => { let index = match infos .binary_search_by_key(&selected_chunk_index, |info| info.block_chunks) @@ -349,8 +349,7 @@ pub mod pallet { /// Collection of transaction metadata by block number. #[pallet::storage] - #[pallet::getter(fn transaction_roots)] - pub(super) type Transactions = StorageMap< + pub type Transactions = StorageMap< _, Blake2_128Concat, BlockNumberFor, @@ -360,32 +359,30 @@ pub mod pallet { /// Count indexed chunks for each block. #[pallet::storage] - pub(super) type ChunkCount = + pub type ChunkCount = StorageMap<_, Blake2_128Concat, BlockNumberFor, u32, ValueQuery>; #[pallet::storage] - #[pallet::getter(fn byte_fee)] /// Storage fee per byte. - pub(super) type ByteFee = StorageValue<_, BalanceOf>; + pub type ByteFee = StorageValue<_, BalanceOf>; #[pallet::storage] - #[pallet::getter(fn entry_fee)] /// Storage fee per transaction. - pub(super) type EntryFee = StorageValue<_, BalanceOf>; + pub type EntryFee = StorageValue<_, BalanceOf>; /// Storage period for data in blocks. Should match `sp_storage_proof::DEFAULT_STORAGE_PERIOD` /// for block authoring. #[pallet::storage] - pub(super) type StoragePeriod = StorageValue<_, BlockNumberFor, ValueQuery>; + pub type StoragePeriod = StorageValue<_, BlockNumberFor, ValueQuery>; // Intermediates #[pallet::storage] - pub(super) type BlockTransactions = + pub type BlockTransactions = StorageValue<_, BoundedVec, ValueQuery>; /// Was the proof checked in this block? #[pallet::storage] - pub(super) type ProofChecked = StorageValue<_, bool, ValueQuery>; + pub type ProofChecked = StorageValue<_, bool, ValueQuery>; #[pallet::genesis_config] pub struct GenesisConfig { @@ -407,9 +404,9 @@ pub mod pallet { #[pallet::genesis_build] impl BuildGenesisConfig for GenesisConfig { fn build(&self) { - >::put(&self.byte_fee); - >::put(&self.entry_fee); - >::put(&self.storage_period); + ByteFee::::put(&self.byte_fee); + EntryFee::::put(&self.entry_fee); + StoragePeriod::::put(&self.storage_period); } } @@ -439,6 +436,21 @@ pub mod pallet { } impl Pallet { + /// Get transaction storage information from outside of this pallet. + pub fn transaction_roots( + block: BlockNumberFor, + ) -> Option> { + Transactions::::get(block) + } + /// Get ByteFee storage information from outside of this pallet. + pub fn byte_fee() -> Option> { + ByteFee::::get() + } + /// Get EntryFee storage information from outside of this pallet. + pub fn entry_fee() -> Option> { + EntryFee::::get() + } + fn apply_fee(sender: T::AccountId, size: u32) -> DispatchResult { let byte_fee = ByteFee::::get().ok_or(Error::::NotConfigured)?; let entry_fee = EntryFee::::get().ok_or(Error::::NotConfigured)?; diff --git a/substrate/frame/transaction-storage/src/tests.rs b/substrate/frame/transaction-storage/src/tests.rs index 621f74804ec..b725990e6e1 100644 --- a/substrate/frame/transaction-storage/src/tests.rs +++ b/substrate/frame/transaction-storage/src/tests.rs @@ -40,9 +40,9 @@ fn discards_data() { vec![0u8; 2000 as usize] )); let proof_provider = || { - let block_num = >::block_number(); + let block_num = frame_system::Pallet::::block_number(); if block_num == 11 { - let parent_hash = >::parent_hash(); + let parent_hash = frame_system::Pallet::::parent_hash(); Some( build_proof(parent_hash.as_ref(), vec![vec![0u8; 2000], vec![0u8; 2000]]) .unwrap(), @@ -92,7 +92,7 @@ fn checks_proof() { vec![0u8; MAX_DATA_SIZE as usize] )); run_to_block(10, || None); - let parent_hash = >::parent_hash(); + let parent_hash = frame_system::Pallet::::parent_hash(); let proof = build_proof(parent_hash.as_ref(), vec![vec![0u8; MAX_DATA_SIZE as usize]]).unwrap(); assert_noop!( @@ -100,7 +100,7 @@ fn checks_proof() { Error::::UnexpectedProof, ); run_to_block(11, || None); - let parent_hash = >::parent_hash(); + let parent_hash = frame_system::Pallet::::parent_hash(); let invalid_proof = build_proof(parent_hash.as_ref(), vec![vec![0u8; 1000]]).unwrap(); assert_noop!( @@ -132,9 +132,9 @@ fn renews_data() { )); assert_eq!(Balances::free_balance(1), 1_000_000_000 - 4000 * 2 - 200 * 2); let proof_provider = || { - let block_num = >::block_number(); + let block_num = frame_system::Pallet::::block_number(); if block_num == 11 || block_num == 16 { - let parent_hash = >::parent_hash(); + let parent_hash = frame_system::Pallet::::parent_hash(); Some(build_proof(parent_hash.as_ref(), vec![vec![0u8; 2000]]).unwrap()) } else { None -- GitLab From d3cdfc4469ca9884403d52c94f2cb14bc62e6697 Mon Sep 17 00:00:00 2001 From: Deepak Chaudhary <54492415+Aideepakchaudhary@users.noreply.github.com> Date: Sun, 7 Jul 2024 05:29:19 +0800 Subject: [PATCH 097/130] remove getter from babe pallet (#4912) ### ISSUE Link to the issue: https://github.com/paritytech/polkadot-sdk/issues/3326 cc @muraca Deliverables - [Deprecation] remove pallet::getter usage from all pallet-babe ### Test Outcomes ___ Successful tests by running `cargo test -p pallet-babe --features runtime-benchmarks` running 32 tests test mock::__pallet_staking_reward_curve_test_module::reward_curve_piece_count ... ok test mock::__construct_runtime_integrity_test::runtime_integrity_tests ... ok test mock::test_genesis_config_builds ... ok 2024-06-28T17:02:11.158812Z ERROR runtime::storage: Corrupted state at `0x1cb6f36e027abb2091cfb5110ab5087f9aab0a5b63b359512deee557c9f4cf63`: Error { cause: Some(Error { cause: None, desc: "Could not decode `NextConfigDescriptor`, variant doesn't exist" }), desc: "Could not decode `Option::Some(T)`" } 2024-06-28T17:02:11.159752Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::add_epoch_configurations_migration_works ... ok test tests::author_vrf_output_for_secondary_vrf ... ok test benchmarking::bench_check_equivocation_proof ... ok 2024-06-28T17:02:11.160537Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::can_estimate_current_epoch_progress ... ok test tests::author_vrf_output_for_primary ... ok test tests::authority_index ... ok 2024-06-28T17:02:11.162327Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::empty_randomness_is_correct ... ok test tests::check_module ... ok 2024-06-28T17:02:11.163492Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::current_slot_is_processed_on_initialization ... ok test tests::can_enact_next_config ... ok 2024-06-28T17:02:11.164987Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.165007Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::can_predict_next_epoch_change ... ok test tests::first_block_epoch_zero_start ... ok test tests::initial_values ... ok 2024-06-28T17:02:11.168430Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.168685Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.170982Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.171220Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::only_root_can_enact_config_change ... ok test tests::no_author_vrf_output_for_secondary_plain ... ok test tests::can_fetch_current_and_next_epoch_data ... ok 2024-06-28T17:02:11.172960Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::report_equivocation_has_valid_weight ... ok 2024-06-28T17:02:11.173873Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.177084Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::report_equivocation_after_skipped_epochs_works ... 2024-06-28T17:02:11.177694Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.177703Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.177925Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.177927Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 ok 2024-06-28T17:02:11.179678Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.181446Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.183665Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.183874Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.185732Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.185951Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.189332Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.189559Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.189587Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::generate_equivocation_report_blob ... ok test tests::disabled_validators_cannot_author_blocks - should panic ... ok 2024-06-28T17:02:11.190552Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.192279Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.194735Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.196136Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.197240Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::skipping_over_epochs_works ... ok 2024-06-28T17:02:11.202783Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.202846Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.203029Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.205242Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::tracks_block_numbers_when_current_and_previous_epoch_started ... ok 2024-06-28T17:02:11.208965Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::report_equivocation_current_session_works ... ok test tests::report_equivocation_invalid_key_owner_proof ... ok 2024-06-28T17:02:11.216431Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 2024-06-28T17:02:11.216855Z ERROR runtime::timestamp: `pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0 test tests::report_equivocation_validate_unsigned_prevents_duplicates ... ok test tests::report_equivocation_invalid_equivocation_proof ... ok test tests::valid_equivocation_reports_dont_pay_fees ... ok test tests::report_equivocation_old_session_works ... ok test mock::__pallet_staking_reward_curve_test_module::reward_curve_precision ... ok test result: ok. 32 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.20s Doc-tests pallet-babe running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s --- Polkadot Address: 16htXkeVhfroBhL6nuqiwknfXKcT6WadJPZqEi2jRf9z4XPY --- prdoc/pr_4912.prdoc | 15 +++++ substrate/frame/babe/src/lib.rs | 99 ++++++++++++++++++++----------- substrate/frame/babe/src/mock.rs | 5 +- substrate/frame/babe/src/tests.rs | 72 +++++++++++----------- 4 files changed, 119 insertions(+), 72 deletions(-) create mode 100644 prdoc/pr_4912.prdoc diff --git a/prdoc/pr_4912.prdoc b/prdoc/pr_4912.prdoc new file mode 100644 index 00000000000..dd96054b81f --- /dev/null +++ b/prdoc/pr_4912.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from the pallet-babe + +doc: + - audience: Runtime Dev + description: | + This PR removed `pallet::getter`s from `pallet-babe`s storage items. + When accessed inside the pallet, use the syntax `StorageItem::::get()`. + When accessed outside the pallet, use the public functions of storage. + +crates: + - name: pallet-babe + bump: minor diff --git a/substrate/frame/babe/src/lib.rs b/substrate/frame/babe/src/lib.rs index 686ba6ec2d6..9e16f1d0951 100644 --- a/substrate/frame/babe/src/lib.rs +++ b/substrate/frame/babe/src/lib.rs @@ -96,11 +96,11 @@ pub struct SameAuthoritiesForever; impl EpochChangeTrigger for SameAuthoritiesForever { fn trigger(now: BlockNumberFor) { - if >::should_epoch_change(now) { - let authorities = >::authorities(); + if Pallet::::should_epoch_change(now) { + let authorities = Authorities::::get(); let next_authorities = authorities.clone(); - >::enact_epoch_change(authorities, next_authorities, None); + Pallet::::enact_epoch_change(authorities, next_authorities, None); } } } @@ -185,12 +185,10 @@ pub mod pallet { /// Current epoch index. #[pallet::storage] - #[pallet::getter(fn epoch_index)] pub type EpochIndex = StorageValue<_, u64, ValueQuery>; /// Current epoch authorities. #[pallet::storage] - #[pallet::getter(fn authorities)] pub type Authorities = StorageValue< _, WeakBoundedVec<(AuthorityId, BabeAuthorityWeight), T::MaxAuthorities>, @@ -200,12 +198,10 @@ pub mod pallet { /// The slot at which the first epoch actually started. This is 0 /// until the first block of the chain. #[pallet::storage] - #[pallet::getter(fn genesis_slot)] pub type GenesisSlot = StorageValue<_, Slot, ValueQuery>; /// Current slot number. #[pallet::storage] - #[pallet::getter(fn current_slot)] pub type CurrentSlot = StorageValue<_, Slot, ValueQuery>; /// The epoch randomness for the *current* epoch. @@ -222,20 +218,19 @@ pub mod pallet { // array size because the metadata API currently doesn't resolve the // variable to its underlying value. #[pallet::storage] - #[pallet::getter(fn randomness)] pub type Randomness = StorageValue<_, BabeRandomness, ValueQuery>; /// Pending epoch configuration change that will be applied when the next epoch is enacted. #[pallet::storage] - pub(super) type PendingEpochConfigChange = StorageValue<_, NextConfigDescriptor>; + pub type PendingEpochConfigChange = StorageValue<_, NextConfigDescriptor>; /// Next epoch randomness. #[pallet::storage] - pub(super) type NextRandomness = StorageValue<_, BabeRandomness, ValueQuery>; + pub type NextRandomness = StorageValue<_, BabeRandomness, ValueQuery>; /// Next epoch authorities. #[pallet::storage] - pub(super) type NextAuthorities = StorageValue< + pub type NextAuthorities = StorageValue< _, WeakBoundedVec<(AuthorityId, BabeAuthorityWeight), T::MaxAuthorities>, ValueQuery, @@ -251,11 +246,11 @@ pub mod pallet { /// We reset all segments and return to `0` at the beginning of every /// epoch. #[pallet::storage] - pub(super) type SegmentIndex = StorageValue<_, u32, ValueQuery>; + pub type SegmentIndex = StorageValue<_, u32, ValueQuery>; /// TWOX-NOTE: `SegmentIndex` is an increasing integer, so this is okay. #[pallet::storage] - pub(super) type UnderConstruction = StorageMap< + pub type UnderConstruction = StorageMap< _, Twox64Concat, u32, @@ -266,16 +261,14 @@ pub mod pallet { /// Temporary value (cleared at block finalization) which is `Some` /// if per-block initialization has already been called for current block. #[pallet::storage] - #[pallet::getter(fn initialized)] - pub(super) type Initialized = StorageValue<_, Option>; + pub type Initialized = StorageValue<_, Option>; /// This field should always be populated during block processing unless /// secondary plain slots are enabled (which don't contain a VRF output). /// /// It is set in `on_finalize`, before it will contain the value from the last block. #[pallet::storage] - #[pallet::getter(fn author_vrf_randomness)] - pub(super) type AuthorVrfRandomness = StorageValue<_, Option, ValueQuery>; + pub type AuthorVrfRandomness = StorageValue<_, Option, ValueQuery>; /// The block numbers when the last and current epoch have started, respectively `N-1` and /// `N`. @@ -292,19 +285,17 @@ pub mod pallet { /// on block finalization. Querying this storage entry outside of block /// execution context should always yield zero. #[pallet::storage] - #[pallet::getter(fn lateness)] - pub(super) type Lateness = StorageValue<_, BlockNumberFor, ValueQuery>; + pub type Lateness = StorageValue<_, BlockNumberFor, ValueQuery>; /// The configuration for the current epoch. Should never be `None` as it is initialized in /// genesis. #[pallet::storage] - #[pallet::getter(fn epoch_config)] - pub(super) type EpochConfig = StorageValue<_, BabeEpochConfiguration>; + pub type EpochConfig = StorageValue<_, BabeEpochConfiguration>; /// The configuration for the next epoch, `None` if the config will not change /// (you can fallback to `EpochConfig` instead in that case). #[pallet::storage] - pub(super) type NextEpochConfig = StorageValue<_, BabeEpochConfiguration>; + pub type NextEpochConfig = StorageValue<_, BabeEpochConfiguration>; /// A list of the last 100 skipped epochs and the corresponding session index /// when the epoch was skipped. @@ -315,8 +306,7 @@ pub mod pallet { /// a validator was the owner of a given key on a given session, and what the /// active epoch index was during that session. #[pallet::storage] - #[pallet::getter(fn skipped_epochs)] - pub(super) type SkippedEpochs = + pub type SkippedEpochs = StorageValue<_, BoundedVec<(u64, SessionIndex), ConstU32<100>>, ValueQuery>; #[derive(frame_support::DefaultNoBound)] @@ -368,7 +358,7 @@ pub mod pallet { .and_then(|(authority, _)| { let public = authority.as_inner_ref(); let transcript = sp_consensus_babe::make_vrf_transcript( - &Self::randomness(), + &Randomness::::get(), CurrentSlot::::get(), EpochIndex::::get(), ); @@ -510,7 +500,7 @@ impl FindAuthor for Pallet { impl IsMember for Pallet { fn is_member(authority_id: &AuthorityId) -> bool { - >::authorities().iter().any(|id| &id.0 == authority_id) + Authorities::::get().iter().any(|id| &id.0 == authority_id) } } @@ -526,6 +516,47 @@ impl pallet_session::ShouldEndSession> for Pallet Pallet { + /// Public function to access epoch_index storage. + pub fn epoch_index() -> u64 { + EpochIndex::::get() + } + /// Public function to access authorities storage. + pub fn authorities() -> WeakBoundedVec<(AuthorityId, BabeAuthorityWeight), T::MaxAuthorities> { + Authorities::::get() + } + /// Public function to access genesis_slot storage. + pub fn genesis_slot() -> Slot { + GenesisSlot::::get() + } + /// Public function to access current_slot storage. + pub fn current_slot() -> Slot { + CurrentSlot::::get() + } + /// Public function to access randomness storage. + pub fn randomness() -> BabeRandomness { + Randomness::::get() + } + /// Public function to access initialized storage. + pub fn initialized() -> Option> { + Initialized::::get() + } + /// Public function to access author_vrf_randomness storage. + pub fn author_vrf_randomness() -> Option { + AuthorVrfRandomness::::get() + } + /// Public function to access lateness storage. + pub fn lateness() -> BlockNumberFor { + Lateness::::get() + } + /// Public function to access epoch_config storage. + pub fn epoch_config() -> Option { + EpochConfig::::get() + } + /// Public function to access skipped_epochs storage. + pub fn skipped_epochs() -> BoundedVec<(u64, SessionIndex), ConstU32<100>> { + SkippedEpochs::::get() + } + /// Determine the BABE slot duration based on the Timestamp module configuration. pub fn slot_duration() -> T::Moment { // we double the minimum block-period so each author can always propose within @@ -588,7 +619,7 @@ impl Pallet { ) { // PRECONDITION: caller has done initialization and is guaranteed // by the session module to be called before this. - debug_assert!(Self::initialized().is_some()); + debug_assert!(Initialized::::get().is_some()); if authorities.is_empty() { log::warn!(target: LOG_TARGET, "Ignoring empty epoch change."); @@ -655,7 +686,7 @@ impl Pallet { NextAuthorities::::put(&next_authorities); // Update the start blocks of the previous and new current epoch. - >::mutate(|(previous_epoch_start_block, current_epoch_start_block)| { + EpochStart::::mutate(|(previous_epoch_start_block, current_epoch_start_block)| { *previous_epoch_start_block = sp_std::mem::take(current_epoch_start_block); *current_epoch_start_block = >::block_number(); }); @@ -701,8 +732,8 @@ impl Pallet { epoch_index: EpochIndex::::get(), start_slot: Self::current_epoch_start(), duration: T::EpochDuration::get(), - authorities: Self::authorities().into_inner(), - randomness: Self::randomness(), + authorities: Authorities::::get().into_inner(), + randomness: Randomness::::get(), config: EpochConfig::::get() .expect("EpochConfig is initialized in genesis; we never `take` or `kill` it; qed"), } @@ -779,8 +810,8 @@ impl Pallet { // we use the same values as genesis because we haven't collected any // randomness yet. let next = NextEpochDescriptor { - authorities: Self::authorities().into_inner(), - randomness: Self::randomness(), + authorities: Authorities::::get().into_inner(), + randomness: Randomness::::get(), }; Self::deposit_consensus(ConsensusLog::NextEpochData(next)); @@ -789,7 +820,7 @@ impl Pallet { fn initialize(now: BlockNumberFor) { // since `initialize` can be called twice (e.g. if session module is present) // let's ensure that we only do the initialization once per block - let initialized = Self::initialized().is_some(); + let initialized = Initialized::::get().is_some(); if initialized { return } @@ -940,7 +971,7 @@ impl frame_support::traits::EstimateNextSessionRotation frame_support::traits::Lateness> for Pallet { fn lateness(&self) -> BlockNumberFor { - Self::lateness() + Lateness::::get() } } diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs index be38e3e7e5d..e193a2e3b64 100644 --- a/substrate/frame/babe/src/mock.rs +++ b/substrate/frame/babe/src/mock.rs @@ -213,7 +213,7 @@ pub fn go_to_block(n: u64, s: u64) { /// Slots will grow accordingly to blocks pub fn progress_to_block(n: u64) { - let mut slot = u64::from(Babe::current_slot()) + 1; + let mut slot = u64::from(CurrentSlot::::get()) + 1; for i in System::block_number() + 1..=n { go_to_block(i, slot); slot += 1; @@ -272,7 +272,8 @@ pub fn make_vrf_signature_and_randomness( slot: Slot, pair: &sp_consensus_babe::AuthorityPair, ) -> (VrfSignature, Randomness) { - let transcript = sp_consensus_babe::make_vrf_transcript(&Babe::randomness(), slot, 0); + let transcript = + sp_consensus_babe::make_vrf_transcript(&pallet_babe::Randomness::::get(), slot, 0); let randomness = pair.as_ref().make_bytes(sp_consensus_babe::RANDOMNESS_VRF_CONTEXT, &transcript); diff --git a/substrate/frame/babe/src/tests.rs b/substrate/frame/babe/src/tests.rs index e65f1844f88..b9a214ca105 100644 --- a/substrate/frame/babe/src/tests.rs +++ b/substrate/frame/babe/src/tests.rs @@ -43,7 +43,7 @@ fn empty_randomness_is_correct() { #[test] fn initial_values() { - new_test_ext(4).execute_with(|| assert_eq!(Babe::authorities().len(), 4)) + new_test_ext(4).execute_with(|| assert_eq!(Authorities::::get().len(), 4)) } #[test] @@ -68,25 +68,25 @@ fn first_block_epoch_zero_start() { let pre_digest = make_primary_pre_digest(0, genesis_slot, vrf_signature); - assert_eq!(Babe::genesis_slot(), Slot::from(0)); + assert_eq!(GenesisSlot::::get(), Slot::from(0)); System::reset_events(); System::initialize(&1, &Default::default(), &pre_digest); // see implementation of the function for details why: we issue an // epoch-change digest but don't do it via the normal session mechanism. assert!(!Babe::should_end_session(1)); - assert_eq!(Babe::genesis_slot(), genesis_slot); - assert_eq!(Babe::current_slot(), genesis_slot); - assert_eq!(Babe::epoch_index(), 0); + assert_eq!(GenesisSlot::::get(), genesis_slot); + assert_eq!(CurrentSlot::::get(), genesis_slot); + assert_eq!(EpochIndex::::get(), 0); Babe::on_finalize(1); let header = System::finalize(); - assert_eq!(Babe::author_vrf_randomness(), Some(vrf_randomness)); + assert_eq!(AuthorVrfRandomness::::get(), Some(vrf_randomness)); assert_eq!(SegmentIndex::::get(), 0); assert_eq!(UnderConstruction::::get(0), vec![vrf_randomness]); - assert_eq!(Babe::randomness(), [0; 32]); - assert_eq!(Babe::author_vrf_randomness(), Some(vrf_randomness)); + assert_eq!(Randomness::::get(), [0; 32]); + assert_eq!(AuthorVrfRandomness::::get(), Some(vrf_randomness)); assert_eq!(NextRandomness::::get(), [0; 32]); assert_eq!(header.digest.logs.len(), 2); @@ -95,8 +95,8 @@ fn first_block_epoch_zero_start() { let consensus_log = sp_consensus_babe::ConsensusLog::NextEpochData( sp_consensus_babe::digests::NextEpochDescriptor { - authorities: Babe::authorities().into_inner(), - randomness: Babe::randomness(), + authorities: Authorities::::get().into_inner(), + randomness: Randomness::::get(), }, ); let consensus_digest = DigestItem::Consensus(BABE_ENGINE_ID, consensus_log.encode()); @@ -118,19 +118,19 @@ fn current_slot_is_processed_on_initialization() { System::reset_events(); System::initialize(&1, &Default::default(), &pre_digest); - assert_eq!(Babe::current_slot(), Slot::from(0)); - assert!(Babe::initialized().is_none()); + assert_eq!(CurrentSlot::::get(), Slot::from(0)); + assert!(Initialized::::get().is_none()); // current slot is updated on initialization Babe::initialize(1); - assert_eq!(Babe::current_slot(), genesis_slot); - assert!(Babe::initialized().is_some()); + assert_eq!(CurrentSlot::::get(), genesis_slot); + assert!(Initialized::::get().is_some()); // but author vrf randomness isn't - assert_eq!(Babe::author_vrf_randomness(), None); + assert_eq!(AuthorVrfRandomness::::get(), None); // instead it is updated on block finalization Babe::on_finalize(1); - assert_eq!(Babe::author_vrf_randomness(), Some(vrf_randomness)); + assert_eq!(AuthorVrfRandomness::::get(), Some(vrf_randomness)); }) } @@ -151,16 +151,16 @@ where // author vrf randomness is not updated on initialization Babe::initialize(1); - assert_eq!(Babe::author_vrf_randomness(), None); + assert_eq!(AuthorVrfRandomness::::get(), None); // instead it is updated on block finalization to account for any // epoch changes that might happen during the block Babe::on_finalize(1); - assert_eq!(Babe::author_vrf_randomness(), Some(vrf_randomness)); + assert_eq!(AuthorVrfRandomness::::get(), Some(vrf_randomness)); // and it is kept after finalizing the block System::finalize(); - assert_eq!(Babe::author_vrf_randomness(), Some(vrf_randomness)); + assert_eq!(AuthorVrfRandomness::::get(), Some(vrf_randomness)); }) } @@ -182,14 +182,14 @@ fn no_author_vrf_output_for_secondary_plain() { System::reset_events(); System::initialize(&1, &Default::default(), &secondary_plain_pre_digest); - assert_eq!(Babe::author_vrf_randomness(), None); + assert_eq!(AuthorVrfRandomness::::get(), None); Babe::initialize(1); - assert_eq!(Babe::author_vrf_randomness(), None); + assert_eq!(AuthorVrfRandomness::::get(), None); Babe::on_finalize(1); System::finalize(); - assert_eq!(Babe::author_vrf_randomness(), None); + assert_eq!(AuthorVrfRandomness::::get(), None); }) } @@ -210,14 +210,14 @@ fn can_predict_next_epoch_change() { assert_eq!(::EpochDuration::get(), 3); // this sets the genesis slot to 6; go_to_block(1, 6); - assert_eq!(*Babe::genesis_slot(), 6); - assert_eq!(*Babe::current_slot(), 6); - assert_eq!(Babe::epoch_index(), 0); + assert_eq!(*GenesisSlot::::get(), 6); + assert_eq!(*CurrentSlot::::get(), 6); + assert_eq!(EpochIndex::::get(), 0); progress_to_block(5); - assert_eq!(Babe::epoch_index(), 5 / 3); - assert_eq!(*Babe::current_slot(), 10); + assert_eq!(EpochIndex::::get(), 5 / 3); + assert_eq!(*CurrentSlot::::get(), 10); // next epoch change will be at assert_eq!(*Babe::current_epoch_start(), 9); // next change will be 12, 2 slots from now @@ -266,9 +266,9 @@ fn can_enact_next_config() { assert_eq!(::EpochDuration::get(), 3); // this sets the genesis slot to 6; go_to_block(1, 6); - assert_eq!(*Babe::genesis_slot(), 6); - assert_eq!(*Babe::current_slot(), 6); - assert_eq!(Babe::epoch_index(), 0); + assert_eq!(*GenesisSlot::::get(), 6); + assert_eq!(*CurrentSlot::::get(), 6); + assert_eq!(EpochIndex::::get(), 0); go_to_block(2, 7); let current_config = BabeEpochConfiguration { @@ -431,7 +431,7 @@ fn report_equivocation_current_session_works() { ext.execute_with(|| { start_era(1); - let authorities = Babe::authorities(); + let authorities = Authorities::::get(); let validators = Session::validators(); // make sure that all authorities have the same balance @@ -508,7 +508,7 @@ fn report_equivocation_old_session_works() { ext.execute_with(|| { start_era(1); - let authorities = Babe::authorities(); + let authorities = Authorities::::get(); // we will use the validator at index 0 as the offending authority let offending_validator_index = 1; @@ -566,7 +566,7 @@ fn report_equivocation_invalid_key_owner_proof() { ext.execute_with(|| { start_era(1); - let authorities = Babe::authorities(); + let authorities = Authorities::::get(); // we will use the validator at index 0 as the offending authority let offending_validator_index = 0; @@ -629,7 +629,7 @@ fn report_equivocation_invalid_equivocation_proof() { ext.execute_with(|| { start_era(1); - let authorities = Babe::authorities(); + let authorities = Authorities::::get(); // we will use the validator at index 0 as the offending authority let offending_validator_index = 0; @@ -734,7 +734,7 @@ fn report_equivocation_validate_unsigned_prevents_duplicates() { ext.execute_with(|| { start_era(1); - let authorities = Babe::authorities(); + let authorities = Authorities::::get(); // generate and report an equivocation for the validator at index 0 let offending_validator_index = 0; @@ -848,7 +848,7 @@ fn report_equivocation_after_skipped_epochs_works() { assert_eq!(SkippedEpochs::::get(), vec![(10, 1)]); // generate an equivocation proof for validator at index 1 - let authorities = Babe::authorities(); + let authorities = Authorities::::get(); let offending_validator_index = 1; let offending_authority_pair = pairs .into_iter() -- GitLab From f7dd85d053dc44ee0a6851e7e507083f31b01bd3 Mon Sep 17 00:00:00 2001 From: Muharem Date: Sun, 7 Jul 2024 13:45:16 +0200 Subject: [PATCH 098/130] Assets: can_decrease/increase for destroying asset is not successful (#3286) Functions `can_decrease` and `can_increase` do not return successful consequence results for assets undergoing destruction; instead, they return the `UnknownAsset` consequence variant. This update aligns their behavior with similar functions, such as `reducible_balance`, `increase_balance`, `decrease_balance`, and `burn`, which return an `AssetNotLive` error for assets in the process of being destroyed. --- prdoc/pr_3286.prdoc | 16 +++++++++++ substrate/frame/assets/src/functions.rs | 6 +++++ substrate/frame/assets/src/tests.rs | 35 ++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 prdoc/pr_3286.prdoc diff --git a/prdoc/pr_3286.prdoc b/prdoc/pr_3286.prdoc new file mode 100644 index 00000000000..6ec3f6552a4 --- /dev/null +++ b/prdoc/pr_3286.prdoc @@ -0,0 +1,16 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Assets: can_decrease/increase for destroying asset is not successful" + +doc: + - audience: Runtime Dev + description: | + Functions `can_decrease` and `can_increase` do not return successful consequence results + for assets undergoing destruction; instead, they return the `UnknownAsset` consequence variant. + This update aligns their behavior with similar functions, such as `reducible_balance`, + `increase_balance`, `decrease_balance`, and `burn`, which return an `AssetNotLive` error + for assets in the process of being destroyed. + +crates: + - name: pallet-assets diff --git a/substrate/frame/assets/src/functions.rs b/substrate/frame/assets/src/functions.rs index 2fb8aee1a97..1e4a9522759 100644 --- a/substrate/frame/assets/src/functions.rs +++ b/substrate/frame/assets/src/functions.rs @@ -132,6 +132,9 @@ impl, I: 'static> Pallet { Some(details) => details, None => return DepositConsequence::UnknownAsset, }; + if details.status == AssetStatus::Destroying { + return DepositConsequence::UnknownAsset + } if increase_supply && details.supply.checked_add(&amount).is_none() { return DepositConsequence::Overflow } @@ -175,6 +178,9 @@ impl, I: 'static> Pallet { if details.status == AssetStatus::Frozen { return Frozen } + if details.status == AssetStatus::Destroying { + return UnknownAsset + } if amount.is_zero() { return Success } diff --git a/substrate/frame/assets/src/tests.rs b/substrate/frame/assets/src/tests.rs index 62106d47a15..c751fbdcaf1 100644 --- a/substrate/frame/assets/src/tests.rs +++ b/substrate/frame/assets/src/tests.rs @@ -22,7 +22,11 @@ use crate::{mock::*, Error}; use frame_support::{ assert_noop, assert_ok, dispatch::GetDispatchInfo, - traits::{fungibles::InspectEnumerable, tokens::Preservation::Protect, Currency}, + traits::{ + fungibles::InspectEnumerable, + tokens::{Preservation::Protect, Provenance}, + Currency, + }, }; use pallet_balances::Error as BalancesError; use sp_io::storage; @@ -1778,6 +1782,35 @@ fn asset_destroy_refund_existence_deposit() { }); } +#[test] +fn increasing_or_decreasing_destroying_asset_should_not_work() { + new_test_ext().execute_with(|| { + use frame_support::traits::fungibles::Inspect; + + let admin = 1; + let admin_origin = RuntimeOrigin::signed(admin); + + assert_ok!(Assets::force_create(RuntimeOrigin::root(), 0, admin, true, 1)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(1), 0, 1, 100)); + assert_eq!(Assets::balance(0, 1), 100); + + assert_eq!(Assets::can_deposit(0, &1, 10, Provenance::Extant), DepositConsequence::Success); + assert_eq!(Assets::can_withdraw(0, &1, 10), WithdrawConsequence::<_>::Success); + assert_eq!(Assets::can_increase(0, &1, 10, false), DepositConsequence::Success); + assert_eq!(Assets::can_decrease(0, &1, 10, false), WithdrawConsequence::<_>::Success); + + assert_ok!(Assets::start_destroy(admin_origin, 0)); + + assert_eq!( + Assets::can_deposit(0, &1, 10, Provenance::Extant), + DepositConsequence::UnknownAsset + ); + assert_eq!(Assets::can_withdraw(0, &1, 10), WithdrawConsequence::<_>::UnknownAsset); + assert_eq!(Assets::can_increase(0, &1, 10, false), DepositConsequence::UnknownAsset); + assert_eq!(Assets::can_decrease(0, &1, 10, false), WithdrawConsequence::<_>::UnknownAsset); + }); +} + #[test] fn asset_id_cannot_be_reused() { new_test_ext().execute_with(|| { -- GitLab From e1460b5ee5f4490b428035aa4a72c1c99a262459 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Mon, 8 Jul 2024 09:40:58 +0200 Subject: [PATCH 099/130] [Backport] Version bumps and prdocs reordering from 1.14.0 (#4955) This PR backports regular version bumps and prdocs reordering from the 1.14.0 release branch to master --- cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs | 2 +- cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs | 2 +- .../runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs | 2 +- .../runtimes/collectives/collectives-westend/src/lib.rs | 2 +- .../parachains/runtimes/contracts/contracts-rococo/src/lib.rs | 2 +- cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs | 2 +- .../parachains/runtimes/coretime/coretime-westend/src/lib.rs | 2 +- cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs | 2 +- cumulus/parachains/runtimes/people/people-rococo/src/lib.rs | 2 +- cumulus/parachains/runtimes/people/people-westend/src/lib.rs | 2 +- cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs | 2 +- polkadot/node/primitives/src/lib.rs | 2 +- polkadot/runtime/rococo/src/lib.rs | 2 +- polkadot/runtime/westend/src/lib.rs | 2 +- prdoc/{ => 1.14.0}/pr_1631.prdoc | 0 prdoc/{ => 1.14.0}/pr_3374.prdoc | 0 prdoc/{ => 1.14.0}/pr_3679.prdoc | 0 prdoc/{ => 1.14.0}/pr_3820.prdoc | 0 prdoc/{ => 1.14.0}/pr_3828.prdoc | 0 prdoc/{ => 1.14.0}/pr_3843.prdoc | 0 prdoc/{ => 1.14.0}/pr_3940.prdoc | 0 prdoc/{ => 1.14.0}/pr_3951.prdoc | 0 prdoc/{ => 1.14.0}/pr_4513.prdoc | 0 prdoc/{ => 1.14.0}/pr_4596.prdoc | 0 prdoc/{ => 1.14.0}/pr_4618.prdoc | 0 prdoc/{ => 1.14.0}/pr_4662.prdoc | 0 prdoc/{ => 1.14.0}/pr_4684.prdoc | 0 prdoc/{ => 1.14.0}/pr_4685.prdoc | 0 prdoc/{ => 1.14.0}/pr_4691.prdoc | 0 prdoc/{ => 1.14.0}/pr_4710.prdoc | 0 prdoc/{ => 1.14.0}/pr_4724.prdoc | 0 prdoc/{ => 1.14.0}/pr_4728.prdoc | 0 prdoc/{ => 1.14.0}/pr_4730.prdoc | 0 prdoc/{ => 1.14.0}/pr_4733.prdoc | 0 prdoc/{ => 1.14.0}/pr_4756.prdoc | 0 prdoc/{ => 1.14.0}/pr_4757.prdoc | 0 prdoc/{ => 1.14.0}/pr_4765.prdoc | 0 prdoc/{ => 1.14.0}/pr_4769.prdoc | 0 prdoc/{ => 1.14.0}/pr_4799.prdoc | 0 prdoc/{ => 1.14.0}/pr_4802.prdoc | 0 prdoc/{ => 1.14.0}/pr_4807.prdoc | 0 prdoc/{ => 1.14.0}/pr_4823.prdoc | 0 prdoc/{ => 1.14.0}/pr_4831.prdoc | 0 prdoc/{ => 1.14.0}/pr_4833.prdoc | 0 prdoc/{ => 1.14.0}/pr_4844.prdoc | 0 prdoc/{ => 1.14.0}/pr_4857.prdoc | 0 prdoc/{ => 1.14.0}/pr_4865.prdoc | 0 prdoc/{ => 1.14.0}/pr_4877.prdoc | 0 49 files changed, 15 insertions(+), 15 deletions(-) rename prdoc/{ => 1.14.0}/pr_1631.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_3374.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_3679.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_3820.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_3828.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_3843.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_3940.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_3951.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4513.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4596.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4618.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4662.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4684.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4685.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4691.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4710.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4724.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4728.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4730.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4733.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4756.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4757.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4765.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4769.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4799.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4802.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4807.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4823.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4831.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4833.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4844.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4857.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4865.prdoc (100%) rename prdoc/{ => 1.14.0}/pr_4877.prdoc (100%) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 836939f1af4..e8772c0b483 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -118,7 +118,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 16, diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 14cae3b5396..55c8a9f0b26 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -117,7 +117,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 16, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 9aa1eeb1a4b..57ed5ec258d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -214,7 +214,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-rococo"), impl_name: create_runtime_str!("bridge-hub-rococo"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index 5d4e41bd706..05d6cdfd691 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -189,7 +189,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-westend"), impl_name: create_runtime_str!("bridge-hub-westend"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index 909d5dc6094..f37af88c284 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -122,7 +122,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("collectives-westend"), impl_name: create_runtime_str!("collectives-westend"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index ab779b31c72..d2fe0689f51 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -142,7 +142,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("contracts-rococo"), impl_name: create_runtime_str!("contracts-rococo"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 7, diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 17030da51ec..6e36539c7bf 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -144,7 +144,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-rococo"), impl_name: create_runtime_str!("coretime-rococo"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 2, diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs index 1bd7e143c1b..74fdd971f5c 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -143,7 +143,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-westend"), impl_name: create_runtime_str!("coretime-westend"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 2, diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs index b8a328c3db6..a204bb7276c 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs @@ -100,7 +100,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("glutton-westend"), impl_name: create_runtime_str!("glutton-westend"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs index 63dd863a861..ff31aba8a27 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -132,7 +132,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-rococo"), impl_name: create_runtime_str!("people-rococo"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs index 84655972b0c..6adaa4b4e50 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs @@ -132,7 +132,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-westend"), impl_name: create_runtime_str!("people-westend"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index bf45b437f8b..40f2b78ffd6 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -107,7 +107,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("test-parachain"), impl_name: create_runtime_str!("test-parachain"), authoring_version: 1, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/polkadot/node/primitives/src/lib.rs b/polkadot/node/primitives/src/lib.rs index ecf79eac288..660b504e97f 100644 --- a/polkadot/node/primitives/src/lib.rs +++ b/polkadot/node/primitives/src/lib.rs @@ -59,7 +59,7 @@ pub use disputes::{ /// relatively rare. /// /// The associated worker binaries should use the same version as the node that spawns them. -pub const NODE_VERSION: &'static str = "1.13.0"; +pub const NODE_VERSION: &'static str = "1.14.0"; // For a 16-ary Merkle Prefix Trie, we can expect at most 16 32-byte hashes per node // plus some overhead: diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 015e433382c..ef629c7dad1 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -163,7 +163,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("rococo"), impl_name: create_runtime_str!("parity-rococo-v2.0"), authoring_version: 0, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 26, diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index ca58a639010..0d7a8a6a4ac 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -159,7 +159,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 1_013_000, + spec_version: 1_014_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 26, diff --git a/prdoc/pr_1631.prdoc b/prdoc/1.14.0/pr_1631.prdoc similarity index 100% rename from prdoc/pr_1631.prdoc rename to prdoc/1.14.0/pr_1631.prdoc diff --git a/prdoc/pr_3374.prdoc b/prdoc/1.14.0/pr_3374.prdoc similarity index 100% rename from prdoc/pr_3374.prdoc rename to prdoc/1.14.0/pr_3374.prdoc diff --git a/prdoc/pr_3679.prdoc b/prdoc/1.14.0/pr_3679.prdoc similarity index 100% rename from prdoc/pr_3679.prdoc rename to prdoc/1.14.0/pr_3679.prdoc diff --git a/prdoc/pr_3820.prdoc b/prdoc/1.14.0/pr_3820.prdoc similarity index 100% rename from prdoc/pr_3820.prdoc rename to prdoc/1.14.0/pr_3820.prdoc diff --git a/prdoc/pr_3828.prdoc b/prdoc/1.14.0/pr_3828.prdoc similarity index 100% rename from prdoc/pr_3828.prdoc rename to prdoc/1.14.0/pr_3828.prdoc diff --git a/prdoc/pr_3843.prdoc b/prdoc/1.14.0/pr_3843.prdoc similarity index 100% rename from prdoc/pr_3843.prdoc rename to prdoc/1.14.0/pr_3843.prdoc diff --git a/prdoc/pr_3940.prdoc b/prdoc/1.14.0/pr_3940.prdoc similarity index 100% rename from prdoc/pr_3940.prdoc rename to prdoc/1.14.0/pr_3940.prdoc diff --git a/prdoc/pr_3951.prdoc b/prdoc/1.14.0/pr_3951.prdoc similarity index 100% rename from prdoc/pr_3951.prdoc rename to prdoc/1.14.0/pr_3951.prdoc diff --git a/prdoc/pr_4513.prdoc b/prdoc/1.14.0/pr_4513.prdoc similarity index 100% rename from prdoc/pr_4513.prdoc rename to prdoc/1.14.0/pr_4513.prdoc diff --git a/prdoc/pr_4596.prdoc b/prdoc/1.14.0/pr_4596.prdoc similarity index 100% rename from prdoc/pr_4596.prdoc rename to prdoc/1.14.0/pr_4596.prdoc diff --git a/prdoc/pr_4618.prdoc b/prdoc/1.14.0/pr_4618.prdoc similarity index 100% rename from prdoc/pr_4618.prdoc rename to prdoc/1.14.0/pr_4618.prdoc diff --git a/prdoc/pr_4662.prdoc b/prdoc/1.14.0/pr_4662.prdoc similarity index 100% rename from prdoc/pr_4662.prdoc rename to prdoc/1.14.0/pr_4662.prdoc diff --git a/prdoc/pr_4684.prdoc b/prdoc/1.14.0/pr_4684.prdoc similarity index 100% rename from prdoc/pr_4684.prdoc rename to prdoc/1.14.0/pr_4684.prdoc diff --git a/prdoc/pr_4685.prdoc b/prdoc/1.14.0/pr_4685.prdoc similarity index 100% rename from prdoc/pr_4685.prdoc rename to prdoc/1.14.0/pr_4685.prdoc diff --git a/prdoc/pr_4691.prdoc b/prdoc/1.14.0/pr_4691.prdoc similarity index 100% rename from prdoc/pr_4691.prdoc rename to prdoc/1.14.0/pr_4691.prdoc diff --git a/prdoc/pr_4710.prdoc b/prdoc/1.14.0/pr_4710.prdoc similarity index 100% rename from prdoc/pr_4710.prdoc rename to prdoc/1.14.0/pr_4710.prdoc diff --git a/prdoc/pr_4724.prdoc b/prdoc/1.14.0/pr_4724.prdoc similarity index 100% rename from prdoc/pr_4724.prdoc rename to prdoc/1.14.0/pr_4724.prdoc diff --git a/prdoc/pr_4728.prdoc b/prdoc/1.14.0/pr_4728.prdoc similarity index 100% rename from prdoc/pr_4728.prdoc rename to prdoc/1.14.0/pr_4728.prdoc diff --git a/prdoc/pr_4730.prdoc b/prdoc/1.14.0/pr_4730.prdoc similarity index 100% rename from prdoc/pr_4730.prdoc rename to prdoc/1.14.0/pr_4730.prdoc diff --git a/prdoc/pr_4733.prdoc b/prdoc/1.14.0/pr_4733.prdoc similarity index 100% rename from prdoc/pr_4733.prdoc rename to prdoc/1.14.0/pr_4733.prdoc diff --git a/prdoc/pr_4756.prdoc b/prdoc/1.14.0/pr_4756.prdoc similarity index 100% rename from prdoc/pr_4756.prdoc rename to prdoc/1.14.0/pr_4756.prdoc diff --git a/prdoc/pr_4757.prdoc b/prdoc/1.14.0/pr_4757.prdoc similarity index 100% rename from prdoc/pr_4757.prdoc rename to prdoc/1.14.0/pr_4757.prdoc diff --git a/prdoc/pr_4765.prdoc b/prdoc/1.14.0/pr_4765.prdoc similarity index 100% rename from prdoc/pr_4765.prdoc rename to prdoc/1.14.0/pr_4765.prdoc diff --git a/prdoc/pr_4769.prdoc b/prdoc/1.14.0/pr_4769.prdoc similarity index 100% rename from prdoc/pr_4769.prdoc rename to prdoc/1.14.0/pr_4769.prdoc diff --git a/prdoc/pr_4799.prdoc b/prdoc/1.14.0/pr_4799.prdoc similarity index 100% rename from prdoc/pr_4799.prdoc rename to prdoc/1.14.0/pr_4799.prdoc diff --git a/prdoc/pr_4802.prdoc b/prdoc/1.14.0/pr_4802.prdoc similarity index 100% rename from prdoc/pr_4802.prdoc rename to prdoc/1.14.0/pr_4802.prdoc diff --git a/prdoc/pr_4807.prdoc b/prdoc/1.14.0/pr_4807.prdoc similarity index 100% rename from prdoc/pr_4807.prdoc rename to prdoc/1.14.0/pr_4807.prdoc diff --git a/prdoc/pr_4823.prdoc b/prdoc/1.14.0/pr_4823.prdoc similarity index 100% rename from prdoc/pr_4823.prdoc rename to prdoc/1.14.0/pr_4823.prdoc diff --git a/prdoc/pr_4831.prdoc b/prdoc/1.14.0/pr_4831.prdoc similarity index 100% rename from prdoc/pr_4831.prdoc rename to prdoc/1.14.0/pr_4831.prdoc diff --git a/prdoc/pr_4833.prdoc b/prdoc/1.14.0/pr_4833.prdoc similarity index 100% rename from prdoc/pr_4833.prdoc rename to prdoc/1.14.0/pr_4833.prdoc diff --git a/prdoc/pr_4844.prdoc b/prdoc/1.14.0/pr_4844.prdoc similarity index 100% rename from prdoc/pr_4844.prdoc rename to prdoc/1.14.0/pr_4844.prdoc diff --git a/prdoc/pr_4857.prdoc b/prdoc/1.14.0/pr_4857.prdoc similarity index 100% rename from prdoc/pr_4857.prdoc rename to prdoc/1.14.0/pr_4857.prdoc diff --git a/prdoc/pr_4865.prdoc b/prdoc/1.14.0/pr_4865.prdoc similarity index 100% rename from prdoc/pr_4865.prdoc rename to prdoc/1.14.0/pr_4865.prdoc diff --git a/prdoc/pr_4877.prdoc b/prdoc/1.14.0/pr_4877.prdoc similarity index 100% rename from prdoc/pr_4877.prdoc rename to prdoc/1.14.0/pr_4877.prdoc -- GitLab From 8af45d24ce10af123f59e66c0c235c698ac67d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 8 Jul 2024 16:02:48 +0200 Subject: [PATCH 100/130] sp-core: Improve docs generated by `generate_feature_enabled_macro` (#4968) Now: ![image](https://github.com/paritytech/polkadot-sdk/assets/5718007/01545872-e21b-48b9-9913-4b940ff3f361) Before: ![image](https://github.com/paritytech/polkadot-sdk/assets/5718007/09ae9fa4-eca8-43f7-a083-a4555e392610) We sadly can not remove the `_macro_name`, but this way we at least show the correct macro plus docs. --- substrate/primitives/core/src/lib.rs | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/substrate/primitives/core/src/lib.rs b/substrate/primitives/core/src/lib.rs index 098bd135bfe..78ec92e4be9 100644 --- a/substrate/primitives/core/src/lib.rs +++ b/substrate/primitives/core/src/lib.rs @@ -430,16 +430,7 @@ pub const MAX_POSSIBLE_ALLOCATION: u32 = 33554432; // 2^25 bytes, 32 MiB macro_rules! generate_feature_enabled_macro { ( $macro_name:ident, $feature_name:meta, $d:tt ) => { $crate::paste::paste!{ - /// Enable/disable the given code depending on - #[doc = concat!("`", stringify!($feature_name), "`")] - /// being enabled for the crate or not. - /// - /// # Example /// - /// ```nocompile - /// // Will add the code depending on the feature being enabled or not. - #[doc = concat!(stringify!($macro_name), "!( println!(\"Hello\") )")] - /// ``` #[cfg($feature_name)] #[macro_export] macro_rules! [<_ $macro_name>] { @@ -448,6 +439,13 @@ macro_rules! generate_feature_enabled_macro { } } + /// + #[cfg(not($feature_name))] + #[macro_export] + macro_rules! [<_ $macro_name>] { + ( $d ( $d input:tt )* ) => {}; + } + /// Enable/disable the given code depending on #[doc = concat!("`", stringify!($feature_name), "`")] /// being enabled for the crate or not. @@ -458,15 +456,8 @@ macro_rules! generate_feature_enabled_macro { /// // Will add the code depending on the feature being enabled or not. #[doc = concat!(stringify!($macro_name), "!( println!(\"Hello\") )")] /// ``` - #[cfg(not($feature_name))] - #[macro_export] - macro_rules! [<_ $macro_name>] { - ( $d ( $d input:tt )* ) => {}; - } - - // Work around for: - #[doc(hidden)] - pub use [<_ $macro_name>] as $macro_name; + // https://github.com/rust-lang/rust/pull/52234 + pub use [<_ $macro_name>] as $macro_name; } }; } -- GitLab From 7290042ad4975e9d42633f228e331f286397025e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 8 Jul 2024 16:19:25 +0200 Subject: [PATCH 101/130] Make `tracing::log` work in the runtime (#4863) Co-authored-by: command-bot <> --- Cargo.lock | 3 ++- prdoc/pr_4863.prdoc | 10 ++++++++++ substrate/primitives/runtime/Cargo.toml | 2 ++ substrate/primitives/runtime/src/runtime_logger.rs | 11 ++++++----- substrate/test-utils/runtime/Cargo.toml | 3 ++- substrate/test-utils/runtime/src/lib.rs | 6 +++++- 6 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 prdoc/pr_4863.prdoc diff --git a/Cargo.lock b/Cargo.lock index 046f9a15bbd..df96a2140ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20511,6 +20511,7 @@ dependencies = [ "sp-tracing 16.0.0", "sp-weights", "substrate-test-runtime-client", + "tracing", "zstd 0.12.4", ] @@ -21487,7 +21488,6 @@ dependencies = [ "frame-system", "frame-system-rpc-runtime-api", "futures", - "hex-literal", "log", "pallet-babe", "pallet-balances", @@ -21525,6 +21525,7 @@ dependencies = [ "sp-version", "substrate-test-runtime-client", "substrate-wasm-builder", + "tracing", "trie-db", ] diff --git a/prdoc/pr_4863.prdoc b/prdoc/pr_4863.prdoc new file mode 100644 index 00000000000..eb43b67a45c --- /dev/null +++ b/prdoc/pr_4863.prdoc @@ -0,0 +1,10 @@ +title: "Make `tracing::log` work in the runtime" + +doc: + - audience: Runtime Dev + description: | + Make `tracing::log` work in the runtime as `log` works in the runtime. + +crates: + - name: sp-runtime + bump: patch diff --git a/substrate/primitives/runtime/Cargo.toml b/substrate/primitives/runtime/Cargo.toml index 4fafe45ff28..83b9422ca1d 100644 --- a/substrate/primitives/runtime/Cargo.toml +++ b/substrate/primitives/runtime/Cargo.toml @@ -34,6 +34,7 @@ sp-io = { workspace = true } sp-std = { workspace = true } sp-weights = { workspace = true } docify = { workspace = true } +tracing = { workspace = true, features = ["log"], default-features = false } simple-mermaid = { version = "0.1.1", optional = true } @@ -69,6 +70,7 @@ std = [ "sp-std/std", "sp-tracing/std", "sp-weights/std", + "tracing/std", ] # Serde support without relying on std features. diff --git a/substrate/primitives/runtime/src/runtime_logger.rs b/substrate/primitives/runtime/src/runtime_logger.rs index b7374b8b6f6..6f1e738eb0e 100644 --- a/substrate/primitives/runtime/src/runtime_logger.rs +++ b/substrate/primitives/runtime/src/runtime_logger.rs @@ -66,16 +66,15 @@ impl log::Log for RuntimeLogger { #[cfg(test)] mod tests { use sp_api::ProvideRuntimeApi; - use std::{env, str::FromStr}; + use std::env; use substrate_test_runtime_client::{ runtime::TestAPI, DefaultTestClientBuilderExt, TestClientBuilder, TestClientBuilderExt, }; #[test] - fn ensure_runtime_logger_respects_host_max_log_level() { + fn ensure_runtime_logger_works() { if env::var("RUN_TEST").is_ok() { sp_tracing::try_init_simple(); - log::set_max_level(log::LevelFilter::from_str(&env::var("RUST_LOG").unwrap()).unwrap()); let client = TestClientBuilder::new().build(); let runtime_api = client.runtime_api(); @@ -83,17 +82,19 @@ mod tests { .do_trace_log(client.chain_info().genesis_hash) .expect("Logging should not fail"); } else { - for (level, should_print) in &[("trace", true), ("info", false)] { + for (level, should_print) in &[("test=trace", true), ("info", false)] { let executable = std::env::current_exe().unwrap(); let output = std::process::Command::new(executable) .env("RUN_TEST", "1") .env("RUST_LOG", level) - .args(&["--nocapture", "ensure_runtime_logger_respects_host_max_log_level"]) + .args(&["--nocapture", "ensure_runtime_logger_works"]) .output() .unwrap(); let output = String::from_utf8(output.stderr).unwrap(); assert!(output.contains("Hey I'm runtime") == *should_print); + assert!(output.contains("THIS IS TRACING") == *should_print); + assert!(output.contains("Hey, I'm tracing") == *should_print); } } } diff --git a/substrate/test-utils/runtime/Cargo.toml b/substrate/test-utils/runtime/Cargo.toml index e3282f8e598..5c8f49a6db8 100644 --- a/substrate/test-utils/runtime/Cargo.toml +++ b/substrate/test-utils/runtime/Cargo.toml @@ -53,7 +53,7 @@ sp-externalities = { workspace = true } array-bytes = { optional = true, workspace = true, default-features = true } serde_json = { workspace = true, features = ["alloc"] } log = { workspace = true } -hex-literal = { workspace = true, default-features = true } +tracing = { workspace = true, default-features = false } [dev-dependencies] futures = { workspace = true } @@ -112,6 +112,7 @@ std = [ "sp-trie/std", "sp-version/std", "substrate-wasm-builder", + "tracing/std", "trie-db/std", ] diff --git a/substrate/test-utils/runtime/src/lib.rs b/substrate/test-utils/runtime/src/lib.rs index a5769b56dd5..a13441302e4 100644 --- a/substrate/test-utils/runtime/src/lib.rs +++ b/substrate/test-utils/runtime/src/lib.rs @@ -596,7 +596,11 @@ impl_runtime_apis! { } fn do_trace_log() { - log::trace!("Hey I'm runtime"); + log::trace!(target: "test", "Hey I'm runtime"); + + let data = "THIS IS TRACING"; + + tracing::trace!(target: "test", %data, "Hey, I'm tracing"); } fn verify_ed25519(sig: ed25519::Signature, public: ed25519::Public, message: Vec) -> bool { -- GitLab From d4657f86208a13d8fcc7933018d4558c3a96f634 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Mon, 8 Jul 2024 18:40:07 +0300 Subject: [PATCH 102/130] litep2p/peerstore: Fix bump last updated time (#4971) This PR bumps the last time of a reputation update of a peer. Doing so ensures the peer remains in the peerstore for longer than 1 hour. Libp2p updates the `last_updated` field as well. Small summary for the peerstore: - A: when peers are reported the `last_updated` time is set to current time (not done before this PR) - B: peers that were not updated for 1 hour are removed from the peerstore - the reputation of the peers is decaying to zero over time - peers are reported with a reputation change (positive or negative depending on the behavior) Because, (A) was not updating the `last_updated` time, we might lose the reputation of peers that are constantly updated after 1hour because of (B). cc @paritytech/networking Signed-off-by: Alexandru Vasile --- substrate/client/network/src/litep2p/peerstore.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/substrate/client/network/src/litep2p/peerstore.rs b/substrate/client/network/src/litep2p/peerstore.rs index 3f7155edbc9..347aa0b90ee 100644 --- a/substrate/client/network/src/litep2p/peerstore.rs +++ b/substrate/client/network/src/litep2p/peerstore.rs @@ -85,6 +85,11 @@ impl PeerInfo { self.reputation < BANNED_THRESHOLD } + fn add_reputation(&mut self, increment: i32) { + self.reputation = self.reputation.saturating_add(increment); + self.bump_last_updated(); + } + fn decay_reputation(&mut self, seconds_passed: u64) { // Note that decaying the reputation value happens "on its own", // so we don't do `bump_last_updated()`. @@ -103,6 +108,10 @@ impl PeerInfo { } } } + + fn bump_last_updated(&mut self) { + self.last_updated = Instant::now(); + } } #[derive(Debug, Default)] @@ -169,7 +178,7 @@ impl PeerStoreProvider for PeerstoreHandle { match lock.peers.get_mut(&peer) { Some(info) => { - info.reputation = info.reputation.saturating_add(reputation_change.value); + info.add_reputation(reputation_change.value); }, None => { lock.peers.insert( -- GitLab From 72dab6d897d9519881b619d466ef5be3c7df9a34 Mon Sep 17 00:00:00 2001 From: Or Grinberg Date: Tue, 9 Jul 2024 04:40:39 +0100 Subject: [PATCH 103/130] allow clear_origin in safe xcm builder (#4777) Fixes #3770 Added `clear_origin` as an allowed command after commands that load the holdings register, in the safe xcm builder. Checklist - [x] My PR includes a detailed description as outlined in the "Description" section above - [x] My PR follows the [labeling requirements](https://github.com/paritytech/polkadot-sdk/blob/master/docs/contributor/CONTRIBUTING.md#Process) of this project (at minimum one label for T required) - [x] I have made corresponding changes to the documentation (if applicable) - [x] I have added tests that prove my fix is effective or that my feature works (if applicable) --------- Co-authored-by: Francisco Aguirre Co-authored-by: gupnik --- .../xcm/procedural/src/builder_pattern.rs | 27 +++++++++++++++++++ .../xcm/procedural/tests/builder_pattern.rs | 21 +++++++++++++++ prdoc/pr_4777.prdoc | 27 +++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 prdoc/pr_4777.prdoc diff --git a/polkadot/xcm/procedural/src/builder_pattern.rs b/polkadot/xcm/procedural/src/builder_pattern.rs index 0a33d52580f..09ead1389d1 100644 --- a/polkadot/xcm/procedural/src/builder_pattern.rs +++ b/polkadot/xcm/procedural/src/builder_pattern.rs @@ -233,6 +233,32 @@ fn generate_builder_impl(name: &Ident, data_enum: &DataEnum) -> Result = data_enum + .variants + .iter() + .filter(|variant| variant.ident == "ClearOrigin") + .map(|variant| { + let variant_name = &variant.ident; + let method_name_string = &variant_name.to_string().to_snake_case(); + let method_name = syn::Ident::new(method_name_string, variant_name.span()); + let docs = get_doc_comments(variant); + let method = match &variant.fields { + Fields::Unit => { + quote! { + #(#docs)* + pub fn #method_name(mut self) -> XcmBuilder { + self.instructions.push(#name::::#variant_name); + self + } + } + }, + _ => return Err(Error::new_spanned(variant, "ClearOrigin should have no fields")), + }; + Ok(method) + }) + .collect::, _>>()?; + // Then we require fees to be paid let buy_execution_method = data_enum .variants @@ -276,6 +302,7 @@ fn generate_builder_impl(name: &Ident, data_enum: &DataEnum) -> Result XcmBuilder { + #(#allowed_after_load_holding_methods)* #buy_execution_method } }; diff --git a/polkadot/xcm/procedural/tests/builder_pattern.rs b/polkadot/xcm/procedural/tests/builder_pattern.rs index 96b16fb7e45..4202309bf3f 100644 --- a/polkadot/xcm/procedural/tests/builder_pattern.rs +++ b/polkadot/xcm/procedural/tests/builder_pattern.rs @@ -79,3 +79,24 @@ fn default_builder_requires_buy_execution() { ]) ); } + +#[test] +fn default_builder_allows_clear_origin_before_buy_execution() { + let asset: Asset = (Here, 100u128).into(); + let beneficiary: Location = [0u8; 32].into(); + let message: Xcm<()> = Xcm::builder() + .receive_teleported_asset(asset.clone()) + .clear_origin() + .buy_execution(asset.clone(), Unlimited) + .deposit_asset(asset.clone(), beneficiary.clone()) + .build(); + assert_eq!( + message, + Xcm(vec![ + ReceiveTeleportedAsset(asset.clone().into()), + ClearOrigin, + BuyExecution { fees: asset.clone(), weight_limit: Unlimited }, + DepositAsset { assets: asset.into(), beneficiary }, + ]) + ); +} diff --git a/prdoc/pr_4777.prdoc b/prdoc/pr_4777.prdoc new file mode 100644 index 00000000000..07fa8decebe --- /dev/null +++ b/prdoc/pr_4777.prdoc @@ -0,0 +1,27 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: XCM builder pattern allows clear_origin before buy_execution. + +doc: + - audience: Runtime Dev + description: | + Added clear_origin as an allowed command after commands that load the holdings register, in the safe xcm builder. + Previously, although it's logically allowed, an XCM could not be built like this: + ```rust + let xcm = Xcm::builder() + .withdraw_asset((Parent, 100u128)) + .clear_origin() + .buy_execution((Parent, 1u128)) + .deposit_asset(All, [0u8; 32]) + .build(); + ``` + You had to use the unsafe_builder. + Now, it's allowed using the default builder. + +crates: +- name: "xcm-procedural" + bump: minor +- name: "staging-xcm" + bump: minor + -- GitLab From 1e1fd74541de6ab97b1f33c9a0204a2bedfbb38c Mon Sep 17 00:00:00 2001 From: Radha <86818441+DrW3RK@users.noreply.github.com> Date: Tue, 9 Jul 2024 10:11:37 +0200 Subject: [PATCH 104/130] Update Templates README docs (#4980) Some of the commands needed update for seamless "newbie" Polkadot SDK templates experience --- templates/minimal/README.md | 6 +++--- templates/parachain/README.md | 6 +++--- templates/parachain/node/README.md | 2 +- templates/solochain/README.md | 16 ++++++++-------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/templates/minimal/README.md b/templates/minimal/README.md index 9d27bcc9944..eaa21a05ee8 100644 --- a/templates/minimal/README.md +++ b/templates/minimal/README.md @@ -14,7 +14,7 @@ * 🤏 This template is a minimal (in terms of complexity and the number of components) template for building a blockchain node. -* 🔧 Its runtime is configured of a single custom pallet as a starting point, and a handful of ready-made pallets +* 🔧 Its runtime is configured with a single custom pallet as a starting point, and a handful of ready-made pallets such as a [Balances pallet](https://paritytech.github.io/polkadot-sdk/master/pallet_balances/index.html). * 👤 The template has no consensus configured - it is best for experimenting with a single node network. @@ -57,7 +57,7 @@ and don't forget to also customize the corresponding comments. 🔨 Use the following command to build the node without launching it: ```sh -cargo build --release +cargo build --package minimal-template-node --release ``` 🐳 Alternatively, build the docker image: @@ -80,7 +80,7 @@ docker run --rm polkadot-sdk-minimal-template --dev Development chains: * 🧹 Do not persist the state. -* 💰 Are preconfigured with a genesis state that includes several prefunded development accounts. +* 💰 Are preconfigured with a genesis state that includes several pre-funded development accounts. * 🧑‍⚖️ Development accounts are used as `sudo` accounts. ### Connect with the Polkadot-JS Apps Front-End diff --git a/templates/parachain/README.md b/templates/parachain/README.md index a6ac91799b7..802d8586b39 100644 --- a/templates/parachain/README.md +++ b/templates/parachain/README.md @@ -16,7 +16,7 @@ * ☁️ It is based on the [Cumulus](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/cumulus/index.html) framework. -* 🔧 Its runtime is configured of a single custom pallet as a starting point, and a handful of ready-made pallets +* 🔧 Its runtime is configured with a single custom pallet as a starting point, and a handful of ready-made pallets such as a [Balances pallet](https://paritytech.github.io/polkadot-sdk/master/pallet_balances/index.html). * 👉 Learn more about parachains [here](https://wiki.polkadot.network/docs/learn-parachains) @@ -44,7 +44,7 @@ packages required to compile this template - please take note of the Rust compil 🔨 Use the following command to build the node without launching it: ```sh -cargo build --release +cargo build --package parachain-template-node --release ``` 🐳 Alternatively, build the docker image: @@ -70,7 +70,7 @@ and `zombienet` - into `PATH` like so: export PATH="./target/release/:$PATH" ``` -This way, we can conveniently use them un the following steps. +This way, we can conveniently use them in the following steps. 👥 The following command starts a local development chain, with a single relay chain node and a single parachain collator: diff --git a/templates/parachain/node/README.md b/templates/parachain/node/README.md index 350272c7b6e..ad309d4015a 100644 --- a/templates/parachain/node/README.md +++ b/templates/parachain/node/README.md @@ -7,7 +7,7 @@ ⚙️ It acts as a remote procedure call (RPC) server, allowing interaction with the blockchain. -👉 Learn more about the architecture, and a difference between a node and a runtime +👉 Learn more about the architecture, and the difference between a node and a runtime [here](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/wasm_meta_protocol/index.html). 👇 Here are the most important files in this node template: diff --git a/templates/solochain/README.md b/templates/solochain/README.md index 2e3b1146a8f..c5dc5db7f3b 100644 --- a/templates/solochain/README.md +++ b/templates/solochain/README.md @@ -28,7 +28,7 @@ installation](#alternatives-installations) options. Use the following command to build the node without launching it: ```sh -cargo build --release +cargo build --package solochain-template-node --release ``` ### Embedded Docs @@ -37,7 +37,7 @@ After you build the project, you can use the following command to explore its parameters and subcommands: ```sh -./target/release/node-template -h +./target/release/solochain-template-node -h ``` You can generate and view the [Rust @@ -54,19 +54,19 @@ The following command starts a single-node development chain that doesn't persist state: ```sh -./target/release/node-template --dev +./target/release/solochain-template-node --dev ``` To purge the development chain's state, run the following command: ```sh -./target/release/node-template purge-chain --dev +./target/release/solochain-template-node purge-chain --dev ``` To start the development chain with detailed logging, run the following command: ```sh -RUST_BACKTRACE=1 ./target/release/node-template -ldebug --dev +RUST_BACKTRACE=1 ./target/release/solochain-template-node -ldebug --dev ``` Development chains: @@ -75,7 +75,7 @@ Development chains: - Use the **Alice** and **Bob** accounts as default validator authorities. - Use the **Alice** account as the default `sudo` account. - Are preconfigured with a genesis state (`/node/src/chain_spec.rs`) that - includes several prefunded development accounts. + includes several pre-funded development accounts. To persist chain state between runs, specify a base path by running a command @@ -86,7 +86,7 @@ similar to the following: $ mkdir my-chain-state // Use of that folder to store the chain state -$ ./target/release/node-template --dev --base-path ./my-chain-state/ +$ ./target/release/solochain-template-node --dev --base-path ./my-chain-state/ // Check the folder structure created inside the base path after running the chain $ ls ./my-chain-state @@ -142,7 +142,7 @@ following: file that defines a Substrate chain's initial (genesis) state. Chain specifications are useful for development and testing, and critical when architecting the launch of a production chain. Take note of the - `development_config` and `testnet_genesis` functions,. These functions are + `development_config` and `testnet_genesis` functions. These functions are used to define the genesis state for the local development chain configuration. These functions identify some [well-known accounts](https://docs.substrate.io/reference/command-line-tools/subkey/) and -- GitLab From 01e0fc23d8844461adcd4501815dac64f3a4986f Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Tue, 9 Jul 2024 11:30:48 +0300 Subject: [PATCH 105/130] `polkadot-parachain` simplifications and deduplications (#4916) `polkadot-parachain` simplifications and deduplications Details in the commit messages. Just copy-pasting the last commit description since it introduces the biggest changes: ``` Implement a more structured way to define a node spec - use traits instead of bounds for `rpc_ext_builder()`, `build_import_queue()`, `start_consensus()` - add a `NodeSpec` trait for defining the specifications of a node - deduplicate the code related to building a node's components / starting a node ``` The other changes are much smaller, most of them trivial and are isolated in separate commits. --- cumulus/polkadot-parachain/src/cli.rs | 7 + cumulus/polkadot-parachain/src/command.rs | 488 ++---- cumulus/polkadot-parachain/src/common/mod.rs | 5 + cumulus/polkadot-parachain/src/rpc.rs | 139 +- cumulus/polkadot-parachain/src/service.rs | 1550 +++++++++--------- polkadot/cli/src/command.rs | 2 +- substrate/client/cli/src/lib.rs | 25 +- substrate/client/service/src/lib.rs | 2 +- 8 files changed, 978 insertions(+), 1240 deletions(-) diff --git a/cumulus/polkadot-parachain/src/cli.rs b/cumulus/polkadot-parachain/src/cli.rs index 7c01e34f9a0..d06354dda22 100644 --- a/cumulus/polkadot-parachain/src/cli.rs +++ b/cumulus/polkadot-parachain/src/cli.rs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . +use crate::common::NodeExtraArgs; use clap::{Command, CommandFactory, FromArgMatches}; use sc_cli::SubstrateCli; use std::path::PathBuf; @@ -94,6 +95,12 @@ pub struct Cli { pub relay_chain_args: Vec, } +impl Cli { + pub(crate) fn node_extra_args(&self) -> NodeExtraArgs { + NodeExtraArgs { use_slot_based_consensus: self.experimental_use_slot_based } + } +} + #[derive(Debug)] pub struct RelayChainCli { /// The actual relay chain cli object. diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index 323216f300d..fcf6c06f422 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -14,15 +14,20 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . +#[cfg(feature = "runtime-benchmarks")] +use crate::service::Block; use crate::{ chain_spec, chain_spec::GenericChainSpec, cli::{Cli, RelayChainCli, Subcommand}, + common::NodeExtraArgs, fake_runtime_api::{ - asset_hub_polkadot_aura::RuntimeApi as AssetHubPolkadotRuntimeApi, aura::RuntimeApi, + asset_hub_polkadot_aura::RuntimeApi as AssetHubPolkadotRuntimeApi, + aura::RuntimeApi as AuraRuntimeApi, }, - service::{new_partial, Block, Hash}, + service::{new_aura_node_spec, DynNodeSpec, ShellNode}, }; +#[cfg(feature = "runtime-benchmarks")] use cumulus_client_service::storage_proof_size::HostFunctions as ReclaimHostFunctions; use cumulus_primitives_core::ParaId; use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE}; @@ -34,6 +39,8 @@ use sc_cli::{ }; use sc_service::config::{BasePath, PrometheusConfig}; use sp_runtime::traits::AccountIdConversion; +#[cfg(feature = "runtime-benchmarks")] +use sp_runtime::traits::HashingFor; use std::{net::SocketAddr, path::PathBuf}; /// The choice of consensus for the parachain omni-node. @@ -110,6 +117,7 @@ fn runtime(id: &str) -> Runtime { } else if id.starts_with("asset-hub-kusama") | id.starts_with("statemine") | id.starts_with("asset-hub-rococo") | + id.starts_with("rockmine") | id.starts_with("asset-hub-westend") | id.starts_with("westmint") { @@ -378,146 +386,27 @@ impl SubstrateCli for RelayChainCli { } } -/// Creates partial components for the runtimes that are supported by the benchmarks. -macro_rules! construct_partials { - ($config:expr, |$partials:ident| $code:expr) => { - match $config.chain_spec.runtime()? { - Runtime::AssetHubPolkadot => { - let $partials = new_partial::( - &$config, - crate::service::build_relay_to_aura_import_queue::<_, AssetHubPolkadotAuraId>, - )?; - $code - }, - Runtime::AssetHub | - Runtime::BridgeHub(_) | - Runtime::Collectives | - Runtime::Coretime(_) | - Runtime::People(_) => { - let $partials = new_partial::( - &$config, - crate::service::build_relay_to_aura_import_queue::<_, AuraId>, - )?; - $code - }, - Runtime::Glutton | Runtime::Shell | Runtime::Seedling => { - let $partials = new_partial::( - &$config, - crate::service::build_shell_import_queue, - )?; - $code - }, - Runtime::ContractsRococo | Runtime::Penpal(_) => { - let $partials = new_partial::( - &$config, - crate::service::build_aura_import_queue, - )?; - $code - }, - Runtime::Omni(consensus) => match consensus { - Consensus::Aura => { - let $partials = new_partial::( - &$config, - crate::service::build_aura_import_queue, - )?; - $code - }, - Consensus::Relay => { - let $partials = new_partial::( - &$config, - crate::service::build_shell_import_queue, - )?; - $code - }, - }, - } - }; -} - -macro_rules! construct_async_run { - (|$components:ident, $cli:ident, $cmd:ident, $config:ident| $( $code:tt )* ) => {{ - let runner = $cli.create_runner($cmd)?; - match runner.config().chain_spec.runtime()? { - Runtime::AssetHubPolkadot => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::build_relay_to_aura_import_queue::<_, AssetHubPolkadotAuraId>, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::AssetHub | - Runtime::BridgeHub(_) | - Runtime::Collectives | - Runtime::Coretime(_) | - Runtime::People(_) => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::build_relay_to_aura_import_queue::<_, AuraId>, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::Shell | - Runtime::Seedling | - Runtime::Glutton => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::build_shell_import_queue, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - } - Runtime::ContractsRococo | Runtime::Penpal(_) => { - runner.async_run(|$config| { - let $components = new_partial::< - RuntimeApi, - _, - >( - &$config, - crate::service::build_aura_import_queue, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::Omni(consensus) => match consensus { - Consensus::Aura => { - runner.async_run(|$config| { - let $components = new_partial::< - RuntimeApi, - _, - >( - &$config, - crate::service::build_aura_import_queue, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Consensus::Relay - => { - runner.async_run(|$config| { - let $components = new_partial::< - RuntimeApi, - _, - >( - &$config, - crate::service::build_shell_import_queue, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - } - } - }} +fn new_node_spec( + config: &sc_service::Configuration, + extra_args: NodeExtraArgs, +) -> std::result::Result, sc_cli::Error> { + Ok(match config.chain_spec.runtime()? { + Runtime::AssetHubPolkadot => + new_aura_node_spec::(extra_args), + Runtime::AssetHub | + Runtime::BridgeHub(_) | + Runtime::Collectives | + Runtime::Coretime(_) | + Runtime::People(_) | + Runtime::ContractsRococo | + Runtime::Glutton | + Runtime::Penpal(_) => new_aura_node_spec::(extra_args), + Runtime::Shell | Runtime::Seedling => Box::new(ShellNode), + Runtime::Omni(consensus) => match consensus { + Consensus::Aura => new_aura_node_spec::(extra_args), + Consensus::Relay => Box::new(ShellNode), + }, + }) } /// Parse command line arguments into service configuration. @@ -530,28 +419,40 @@ pub fn run() -> Result<()> { runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) }, Some(Subcommand::CheckBlock(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, components.import_queue)) + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + let node = new_node_spec(&config, cli.node_extra_args())?; + node.prepare_check_block_cmd(config, cmd) }) }, Some(Subcommand::ExportBlocks(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, config.database)) + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + let node = new_node_spec(&config, cli.node_extra_args())?; + node.prepare_export_blocks_cmd(config, cmd) }) }, Some(Subcommand::ExportState(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, config.chain_spec)) + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + let node = new_node_spec(&config, cli.node_extra_args())?; + node.prepare_export_state_cmd(config, cmd) }) }, Some(Subcommand::ImportBlocks(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, components.import_queue)) + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + let node = new_node_spec(&config, cli.node_extra_args())?; + node.prepare_import_blocks_cmd(config, cmd) + }) + }, + Some(Subcommand::Revert(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + let node = new_node_spec(&config, cli.node_extra_args())?; + node.prepare_revert_cmd(config, cmd) }) }, - Some(Subcommand::Revert(cmd)) => construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, components.backend, None)) - }), Some(Subcommand::PurgeChain(cmd)) => { let runner = cli.create_runner(cmd)?; let polkadot_cli = RelayChainCli::new(runner.config(), cli.relay_chain_args.iter()); @@ -569,8 +470,10 @@ pub fn run() -> Result<()> { }, Some(Subcommand::ExportGenesisHead(cmd)) => { let runner = cli.create_runner(cmd)?; - runner - .sync_run(|config| construct_partials!(config, |partials| cmd.run(partials.client))) + runner.sync_run(|config| { + let node = new_node_spec(&config, cli.node_extra_args())?; + node.run_export_genesis_head_cmd(config, cmd) + }) }, Some(Subcommand::ExportGenesisWasm(cmd)) => { let runner = cli.create_runner(cmd)?; @@ -584,40 +487,28 @@ pub fn run() -> Result<()> { // Switch on the concrete benchmark sub-command- match cmd { - BenchmarkCmd::Pallet(cmd) => - if cfg!(feature = "runtime-benchmarks") { - runner.sync_run(|config| cmd.run_with_spec::, ReclaimHostFunctions>(Some(config.chain_spec))) - } else { - Err("Benchmarking wasn't enabled when building the node. \ - You can enable it with `--features runtime-benchmarks`." - .into()) - }, + #[cfg(feature = "runtime-benchmarks")] + BenchmarkCmd::Pallet(cmd) => runner.sync_run(|config| { + cmd.run_with_spec::, ReclaimHostFunctions>(Some( + config.chain_spec, + )) + }), BenchmarkCmd::Block(cmd) => runner.sync_run(|config| { - construct_partials!(config, |partials| cmd.run(partials.client)) + let node = new_node_spec(&config, cli.node_extra_args())?; + node.run_benchmark_block_cmd(config, cmd) }), - #[cfg(not(feature = "runtime-benchmarks"))] - BenchmarkCmd::Storage(_) => - return Err(sc_cli::Error::Input( - "Compile with --features=runtime-benchmarks \ - to enable storage benchmarks." - .into(), - ) - .into()), #[cfg(feature = "runtime-benchmarks")] BenchmarkCmd::Storage(cmd) => runner.sync_run(|config| { - construct_partials!(config, |partials| { - let db = partials.backend.expose_db(); - let storage = partials.backend.expose_storage(); - - cmd.run(config, partials.client.clone(), db, storage) - }) + let node = new_node_spec(&config, cli.node_extra_args())?; + node.run_benchmark_storage_cmd(config, cmd) }), BenchmarkCmd::Machine(cmd) => runner.sync_run(|config| cmd.run(&config, SUBSTRATE_REFERENCE_HARDWARE.clone())), - // NOTE: this allows the Client to leniently implement - // new benchmark commands without requiring a companion MR. #[allow(unreachable_patterns)] - _ => Err("Benchmarking sub-command unsupported".into()), + _ => Err("Benchmarking sub-command unsupported or compilation feature missing. \ + Make sure to compile with --features=runtime-benchmarks \ + to enable all supported benchmarks." + .into()), } }, Some(Subcommand::Key(cmd)) => Ok(cmd.run(&cli)?), @@ -645,25 +536,33 @@ pub fn run() -> Result<()> { if old_path.exists() && new_path.exists() { return Err(format!( - "Found legacy {} path {} and new asset-hub path {}. Delete one path such that only one exists.", - old_name, old_path.display(), new_path.display() - ).into()) + "Found legacy {} path {} and new Asset Hub path {}. \ + Delete one path such that only one exists.", + old_name, + old_path.display(), + new_path.display() + ) + .into()) } if old_path.exists() { std::fs::rename(old_path.clone(), new_path.clone())?; info!( - "Statemint renamed to Asset Hub. The filepath with associated data on disk has been renamed from {} to {}.", - old_path.display(), new_path.display() + "{} was renamed to Asset Hub. The filepath with associated data on disk \ + has been renamed from {} to {}.", + old_name, + old_path.display(), + new_path.display() ); } } - let hwbench = (!cli.no_hardware_benchmarks).then_some( - config.database.path().map(|database_path| { + let hwbench = (!cli.no_hardware_benchmarks) + .then_some(config.database.path().map(|database_path| { let _ = std::fs::create_dir_all(database_path); sc_sysinfo::gather_hwbench(Some(database_path)) - })).flatten(); + })) + .flatten(); let para_id = chain_spec::Extensions::try_get(&*config.chain_spec) .map(|e| e.para_id) @@ -672,7 +571,9 @@ pub fn run() -> Result<()> { let id = ParaId::from(para_id); let parachain_account = - AccountIdConversion::::into_account_truncating(&id); + AccountIdConversion::::into_account_truncating( + &id, + ); let tokio_handle = config.tokio_handle.clone(); let polkadot_config = @@ -683,209 +584,34 @@ pub fn run() -> Result<()> { info!("🧾 Parachain Account: {}", parachain_account); info!("✍️ Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); - match config.network.network_backend { - sc_network::config::NetworkBackendType::Libp2p => - start_node::>( - config, - polkadot_config, - collator_options, - id, - cli.experimental_use_slot_based, - hwbench, - ) - .await, - sc_network::config::NetworkBackendType::Litep2p => - start_node::( - config, - polkadot_config, - collator_options, - id, - cli.experimental_use_slot_based, - hwbench, - ) - .await, - } + start_node( + config, + polkadot_config, + collator_options, + id, + cli.node_extra_args(), + hwbench, + ) + .await }) }, } } -async fn start_node>( +#[sc_tracing::logging::prefix_logs_with("Parachain")] +async fn start_node( config: sc_service::Configuration, polkadot_config: sc_service::Configuration, collator_options: cumulus_client_cli::CollatorOptions, id: ParaId, - use_experimental_slot_based: bool, + extra_args: NodeExtraArgs, hwbench: Option, ) -> Result { - match config.chain_spec.runtime()? { - Runtime::AssetHubPolkadot => - crate::service::start_asset_hub_async_backing_node::< - AssetHubPolkadotRuntimeApi, - AssetHubPolkadotAuraId, - Network, - >(config, polkadot_config, collator_options, id, use_experimental_slot_based, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - - Runtime::AssetHub | Runtime::Collectives => - crate::service::start_generic_aura_async_backing_node::( - config, - polkadot_config, - collator_options, - id, - use_experimental_slot_based, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - - Runtime::Seedling | Runtime::Shell => crate::service::start_shell_node::( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) + let node_spec = new_node_spec(&config, extra_args)?; + node_spec + .start_node(config, polkadot_config, collator_options, id, hwbench) .await - .map(|r| r.0) - .map_err(Into::into), - - Runtime::ContractsRococo => crate::service::start_contracts_rococo_node::( - config, - polkadot_config, - collator_options, - id, - use_experimental_slot_based, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - - Runtime::BridgeHub(bridge_hub_runtime_type) => match bridge_hub_runtime_type { - chain_spec::bridge_hubs::BridgeHubRuntimeType::Polkadot | - chain_spec::bridge_hubs::BridgeHubRuntimeType::PolkadotLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::Kusama | - chain_spec::bridge_hubs::BridgeHubRuntimeType::KusamaLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::Westend | - chain_spec::bridge_hubs::BridgeHubRuntimeType::WestendLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::WestendDevelopment | - chain_spec::bridge_hubs::BridgeHubRuntimeType::Rococo | - chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoDevelopment => - crate::service::start_generic_aura_async_backing_node::( - config, - polkadot_config, - collator_options, - id, - use_experimental_slot_based, - hwbench, - ) - .await - .map(|r| r.0), - } - .map_err(Into::into), - - Runtime::Coretime(coretime_runtime_type) => match coretime_runtime_type { - chain_spec::coretime::CoretimeRuntimeType::Kusama | - chain_spec::coretime::CoretimeRuntimeType::KusamaLocal | - chain_spec::coretime::CoretimeRuntimeType::Polkadot | - chain_spec::coretime::CoretimeRuntimeType::PolkadotLocal | - chain_spec::coretime::CoretimeRuntimeType::Rococo | - chain_spec::coretime::CoretimeRuntimeType::RococoLocal | - chain_spec::coretime::CoretimeRuntimeType::RococoDevelopment | - chain_spec::coretime::CoretimeRuntimeType::Westend | - chain_spec::coretime::CoretimeRuntimeType::WestendLocal | - chain_spec::coretime::CoretimeRuntimeType::WestendDevelopment => - crate::service::start_generic_aura_async_backing_node::( - config, - polkadot_config, - collator_options, - id, - use_experimental_slot_based, - hwbench, - ) - .await - .map(|r| r.0), - } - .map_err(Into::into), - - Runtime::Penpal(_) => crate::service::start_rococo_parachain_node::( - config, - polkadot_config, - collator_options, - id, - use_experimental_slot_based, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - - Runtime::Glutton => crate::service::start_basic_async_backing_node::( - config, - polkadot_config, - collator_options, - id, - use_experimental_slot_based, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - - Runtime::People(people_runtime_type) => match people_runtime_type { - chain_spec::people::PeopleRuntimeType::Kusama | - chain_spec::people::PeopleRuntimeType::KusamaLocal | - chain_spec::people::PeopleRuntimeType::Polkadot | - chain_spec::people::PeopleRuntimeType::PolkadotLocal | - chain_spec::people::PeopleRuntimeType::Rococo | - chain_spec::people::PeopleRuntimeType::RococoLocal | - chain_spec::people::PeopleRuntimeType::RococoDevelopment | - chain_spec::people::PeopleRuntimeType::Westend | - chain_spec::people::PeopleRuntimeType::WestendLocal | - chain_spec::people::PeopleRuntimeType::WestendDevelopment => - crate::service::start_generic_aura_async_backing_node::( - config, - polkadot_config, - collator_options, - id, - use_experimental_slot_based, - hwbench, - ) - .await - .map(|r| r.0), - } - .map_err(Into::into), - Runtime::Omni(consensus) => match consensus { - // rococo actually uses aura import and consensus, unlike most system chains that use - // relay to aura. - Consensus::Aura => crate::service::start_rococo_parachain_node::( - config, - polkadot_config, - collator_options, - id, - use_experimental_slot_based, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - Consensus::Relay => crate::service::start_shell_node::( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - }, - } + .map_err(Into::into) } impl DefaultConfigurationValues for RelayChainCli { diff --git a/cumulus/polkadot-parachain/src/common/mod.rs b/cumulus/polkadot-parachain/src/common/mod.rs index 5adbb4137cd..9f5febafe30 100644 --- a/cumulus/polkadot-parachain/src/common/mod.rs +++ b/cumulus/polkadot-parachain/src/common/mod.rs @@ -65,3 +65,8 @@ where { type BoundedRuntimeApi = T::RuntimeApi; } + +/// Extra args that are passed when creating a new node spec. +pub struct NodeExtraArgs { + pub use_slot_based_consensus: bool, +} diff --git a/cumulus/polkadot-parachain/src/rpc.rs b/cumulus/polkadot-parachain/src/rpc.rs index 7437bb1f4b9..283a73d931d 100644 --- a/cumulus/polkadot-parachain/src/rpc.rs +++ b/cumulus/polkadot-parachain/src/rpc.rs @@ -18,91 +18,82 @@ #![warn(missing_docs)] -use std::sync::Arc; - +use crate::{ + common::ConstructNodeRuntimeApi, + service::{ParachainBackend, ParachainClient}, +}; +use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; use parachains_common::{AccountId, Balance, Block, Nonce}; -use sc_client_api::AuxStore; -pub use sc_rpc::DenyUnsafe; -use sc_transaction_pool_api::TransactionPool; -use sp_api::ProvideRuntimeApi; -use sp_block_builder::BlockBuilder; -use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; +use sc_rpc::{ + dev::{Dev, DevApiServer}, + DenyUnsafe, +}; +use std::{marker::PhantomData, sync::Arc}; +use substrate_frame_rpc_system::{System, SystemApiServer}; +use substrate_state_trie_migration_rpc::{StateMigration, StateMigrationApiServer}; /// A type representing all RPC extensions. pub type RpcExtension = jsonrpsee::RpcModule<()>; -/// Full client dependencies -pub struct FullDeps { - /// The client instance to use. - pub client: Arc, - /// Transaction pool instance. - pub pool: Arc

    , - /// Whether to deny unsafe calls - pub deny_unsafe: DenyUnsafe, +pub(crate) trait BuildRpcExtensions { + fn build_rpc_extensions( + deny_unsafe: DenyUnsafe, + client: Arc, + backend: Arc, + pool: Arc, + ) -> sc_service::error::Result; } -/// Instantiate all RPC extensions. -pub fn create_full( - deps: FullDeps, - backend: Arc, -) -> Result> +pub(crate) struct BuildEmptyRpcExtensions(PhantomData); + +impl + BuildRpcExtensions< + ParachainClient, + ParachainBackend, + sc_transaction_pool::FullPool>, + > for BuildEmptyRpcExtensions where - C: ProvideRuntimeApi - + HeaderBackend - + AuxStore - + HeaderMetadata - + Send - + Sync - + 'static, - C::Api: substrate_frame_rpc_system::AccountNonceApi, - C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, - C::Api: BlockBuilder, - P: TransactionPool + Sync + Send + 'static, - B: sc_client_api::Backend + Send + Sync + 'static, - B::State: sc_client_api::backend::StateBackend>, + RuntimeApi: ConstructNodeRuntimeApi> + Send + Sync + 'static, { - use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; - use substrate_frame_rpc_system::{System, SystemApiServer}; - use substrate_state_trie_migration_rpc::{StateMigration, StateMigrationApiServer}; - - let mut module = RpcExtension::new(()); - let FullDeps { client, pool, deny_unsafe } = deps; - - module.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; - module.merge(TransactionPayment::new(client.clone()).into_rpc())?; - module.merge(StateMigration::new(client, backend, deny_unsafe).into_rpc())?; - - Ok(module) + fn build_rpc_extensions( + _deny_unsafe: DenyUnsafe, + _client: Arc>, + _backend: Arc, + _pool: Arc>>, + ) -> sc_service::error::Result { + Ok(RpcExtension::new(())) + } } -/// Instantiate all RPCs we want at the contracts-rococo chain. -pub fn create_contracts_rococo( - deps: FullDeps, -) -> Result> +pub(crate) struct BuildParachainRpcExtensions(PhantomData); + +impl + BuildRpcExtensions< + ParachainClient, + ParachainBackend, + sc_transaction_pool::FullPool>, + > for BuildParachainRpcExtensions where - C: ProvideRuntimeApi - + sc_client_api::BlockBackend - + HeaderBackend - + AuxStore - + HeaderMetadata - + Send - + Sync - + 'static, - C::Api: substrate_frame_rpc_system::AccountNonceApi, - C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, - C::Api: BlockBuilder, - P: TransactionPool + Sync + Send + 'static, + RuntimeApi: ConstructNodeRuntimeApi> + Send + Sync + 'static, + RuntimeApi::RuntimeApi: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi + + substrate_frame_rpc_system::AccountNonceApi, { - use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; - use sc_rpc::dev::{Dev, DevApiServer}; - use substrate_frame_rpc_system::{System, SystemApiServer}; - - let mut module = RpcExtension::new(()); - let FullDeps { client, pool, deny_unsafe } = deps; - - module.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; - module.merge(TransactionPayment::new(client.clone()).into_rpc())?; - module.merge(Dev::new(client, deny_unsafe).into_rpc())?; - - Ok(module) + fn build_rpc_extensions( + deny_unsafe: DenyUnsafe, + client: Arc>, + backend: Arc, + pool: Arc>>, + ) -> sc_service::error::Result { + let build = || -> Result> { + let mut module = RpcExtension::new(()); + + module.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; + module.merge(TransactionPayment::new(client.clone()).into_rpc())?; + module.merge(StateMigration::new(client.clone(), backend, deny_unsafe).into_rpc())?; + module.merge(Dev::new(client, deny_unsafe).into_rpc())?; + + Ok(module) + }; + build().map_err(Into::into) + } } diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index 0f2aed8ee4d..f5f6189d1f0 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use cumulus_client_cli::CollatorOptions; +use cumulus_client_cli::{CollatorOptions, ExportGenesisHeadCommand}; use cumulus_client_collator::service::CollatorService; use cumulus_client_consensus_aura::collators::{ lookahead::{self as aura, Params as AuraParams}, @@ -22,6 +22,7 @@ use cumulus_client_consensus_aura::collators::{ }; use cumulus_client_consensus_common::ParachainBlockImport as TParachainBlockImport; use cumulus_client_consensus_proposer::Proposer; +use cumulus_client_consensus_relay_chain::Verifier as RelayChainVerifier; #[allow(deprecated)] use cumulus_client_service::old_consensus; use cumulus_client_service::{ @@ -30,39 +31,40 @@ use cumulus_client_service::{ }; use cumulus_primitives_core::{relay_chain::ValidationCode, ParaId}; use cumulus_relay_chain_interface::{OverseerHandle, RelayChainInterface}; -use sc_rpc::DenyUnsafe; - -use jsonrpsee::RpcModule; use crate::{ common::{ aura::{AuraIdT, AuraRuntimeApi}, - ConstructNodeRuntimeApi, + ConstructNodeRuntimeApi, NodeExtraArgs, }, fake_runtime_api::aura::RuntimeApi as FakeRuntimeApi, - rpc, + rpc::BuildRpcExtensions, }; -pub use parachains_common::{AccountId, AuraId, Balance, Block, Hash, Nonce}; +pub use parachains_common::{AccountId, Balance, Block, Hash, Nonce}; -use cumulus_client_consensus_relay_chain::Verifier as RelayChainVerifier; +use crate::rpc::{BuildEmptyRpcExtensions, BuildParachainRpcExtensions}; +use frame_benchmarking_cli::BlockCmd; +#[cfg(any(feature = "runtime-benchmarks"))] +use frame_benchmarking_cli::StorageCmd; use futures::prelude::*; +use polkadot_primitives::CollatorPair; use prometheus_endpoint::Registry; +use sc_cli::{CheckBlockCmd, ExportBlocksCmd, ExportStateCmd, ImportBlocksCmd, RevertCmd}; use sc_client_api::BlockchainEvents; use sc_consensus::{ import_queue::{BasicQueue, Verifier as VerifierT}, - BlockImportParams, ImportQueue, + BlockImportParams, DefaultImportQueue, ImportQueue, }; use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; use sc_network::{config::FullNetworkConfiguration, service::traits::NetworkBackend, NetworkBlock}; -use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; +use sc_service::{Configuration, Error, PartialComponents, TFullBackend, TFullClient, TaskManager}; +use sc_sysinfo::HwBench; use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; -use sp_api::{ApiExt, ConstructRuntimeApi, ProvideRuntimeApi}; -use sp_consensus_aura::AuraApi; +use sc_transaction_pool::FullPool; +use sp_api::ProvideRuntimeApi; use sp_keystore::KeystorePtr; use sp_runtime::{app_crypto::AppCrypto, traits::Header as HeaderT}; -use std::{marker::PhantomData, sync::Arc, time::Duration}; - -use polkadot_primitives::CollatorPair; +use std::{marker::PhantomData, pin::Pin, sync::Arc, time::Duration}; #[cfg(not(feature = "runtime-benchmarks"))] type HostFunctions = cumulus_client_service::ParachainHostFunctions; @@ -73,9 +75,9 @@ type HostFunctions = ( frame_benchmarking::benchmarking::HostFunctions, ); -type ParachainClient = TFullClient>; +pub type ParachainClient = TFullClient>; -type ParachainBackend = TFullBackend; +pub type ParachainBackend = TFullBackend; type ParachainBlockImport = TParachainBlockImport>, ParachainBackend>; @@ -90,413 +92,312 @@ pub type Service = PartialComponents< (ParachainBlockImport, Option, Option), >; -/// Starts a `ServiceBuilder` for a full service. -/// -/// Use this macro if you don't actually need the full service, but just the builder in order to -/// be able to perform chain operations. -pub fn new_partial( - config: &Configuration, - build_import_queue: BIQ, -) -> Result, sc_service::Error> -where - RuntimeApi: ConstructNodeRuntimeApi>, - BIQ: FnOnce( - Arc>, - ParachainBlockImport, - &Configuration, - Option, - &TaskManager, - ) -> Result, sc_service::Error>, -{ - let telemetry = config - .telemetry_endpoints - .clone() - .filter(|x| !x.is_empty()) - .map(|endpoints| -> Result<_, sc_telemetry::Error> { - let worker = TelemetryWorker::new(16)?; - let telemetry = worker.handle().new_telemetry(endpoints); - Ok((worker, telemetry)) - }) - .transpose()?; - - let heap_pages = config - .default_heap_pages - .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| HeapAllocStrategy::Static { extra_pages: h as _ }); - - let executor = sc_executor::WasmExecutor::::builder() - .with_execution_method(config.wasm_method) - .with_max_runtime_instances(config.max_runtime_instances) - .with_runtime_cache_size(config.runtime_cache_size) - .with_onchain_heap_alloc_strategy(heap_pages) - .with_offchain_heap_alloc_strategy(heap_pages) - .build(); - - let (client, backend, keystore_container, task_manager) = - sc_service::new_full_parts_record_import::( - config, - telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), - executor, - true, - )?; - let client = Arc::new(client); - - let telemetry_worker_handle = telemetry.as_ref().map(|(worker, _)| worker.handle()); - - let telemetry = telemetry.map(|(worker, telemetry)| { - task_manager.spawn_handle().spawn("telemetry", None, worker.run()); - telemetry - }); - - let transaction_pool = sc_transaction_pool::BasicPool::new_full( - config.transaction_pool.clone(), - config.role.is_authority().into(), - config.prometheus_registry(), - task_manager.spawn_essential_handle(), - client.clone(), - ); - - let block_import = ParachainBlockImport::new(client.clone(), backend.clone()); - - let import_queue = build_import_queue( - client.clone(), - block_import.clone(), - config, - telemetry.as_ref().map(|telemetry| telemetry.handle()), - &task_manager, - )?; - - Ok(PartialComponents { - backend, - client, - import_queue, - keystore_container, - task_manager, - transaction_pool, - select_chain: (), - other: (block_import, telemetry, telemetry_worker_handle), - }) +pub(crate) trait BuildImportQueue { + fn build_import_queue( + client: Arc>, + block_import: ParachainBlockImport, + config: &Configuration, + telemetry_handle: Option, + task_manager: &TaskManager, + ) -> sc_service::error::Result>; } -/// Start a node with the given parachain `Configuration` and relay chain `Configuration`. -/// -/// This is the actual implementation that is abstract over the executor and the runtime api. -#[sc_tracing::logging::prefix_logs_with("Parachain")] -async fn start_node_impl( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - sybil_resistance_level: CollatorSybilResistance, - para_id: ParaId, - rpc_ext_builder: RB, - build_import_queue: BIQ, - start_consensus: SC, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> +pub(crate) trait StartConsensus where RuntimeApi: ConstructNodeRuntimeApi>, - RB: Fn( - DenyUnsafe, - Arc>, - Arc, - Arc>>, - ) -> Result, sc_service::Error> - + 'static, - BIQ: FnOnce( - Arc>, - ParachainBlockImport, - &Configuration, - Option, - &TaskManager, - ) -> Result, sc_service::Error>, - SC: FnOnce( - Arc>, - ParachainBlockImport, - Option<&Registry>, - Option, - &TaskManager, - Arc, - Arc>>, - KeystorePtr, - Duration, - ParaId, - CollatorPair, - OverseerHandle, - Arc>) + Send + Sync>, - Arc, - ) -> Result<(), sc_service::Error>, - Net: NetworkBackend, { - let parachain_config = prepare_node_config(parachain_config); - - let params = new_partial::(¶chain_config, build_import_queue)?; - let (block_import, mut telemetry, telemetry_worker_handle) = params.other; - - let client = params.client.clone(); - let backend = params.backend.clone(); - - let mut task_manager = params.task_manager; - let (relay_chain_interface, collator_key) = build_relay_chain_interface( - polkadot_config, - ¶chain_config, - telemetry_worker_handle, - &mut task_manager, - collator_options.clone(), - hwbench.clone(), - ) - .await - .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; - - let validator = parachain_config.role.is_authority(); - let prometheus_registry = parachain_config.prometheus_registry().cloned(); - let transaction_pool = params.transaction_pool.clone(); - let import_queue_service = params.import_queue.service(); - let net_config = FullNetworkConfiguration::<_, _, Net>::new(¶chain_config.network); - - let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = - build_network(BuildNetworkParams { - parachain_config: ¶chain_config, - net_config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - para_id, - spawn_handle: task_manager.spawn_handle(), - relay_chain_interface: relay_chain_interface.clone(), - import_queue: params.import_queue, - sybil_resistance_level, - }) - .await?; - - let rpc_builder = { - let client = client.clone(); - let transaction_pool = transaction_pool.clone(); - let backend_for_rpc = backend.clone(); - - Box::new(move |deny_unsafe, _| { - rpc_ext_builder( - deny_unsafe, - client.clone(), - backend_for_rpc.clone(), - transaction_pool.clone(), - ) - }) - }; - - sc_service::spawn_tasks(sc_service::SpawnTasksParams { - rpc_builder, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - config: parachain_config, - keystore: params.keystore_container.keystore(), - backend: backend.clone(), - network: network.clone(), - sync_service: sync_service.clone(), - system_rpc_tx, - tx_handler_controller, - telemetry: telemetry.as_mut(), - })?; - - if let Some(hwbench) = hwbench { - sc_sysinfo::print_hwbench(&hwbench); - if validator { - warn_if_slow_hardware(&hwbench); - } - - if let Some(ref mut telemetry) = telemetry { - let telemetry_handle = telemetry.handle(); - task_manager.spawn_handle().spawn( - "telemetry_hwbench", - None, - sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), - ); - } - } - - let announce_block = { - let sync_service = sync_service.clone(); - Arc::new(move |hash, data| sync_service.announce_block(hash, data)) - }; + fn start_consensus( + client: Arc>, + block_import: ParachainBlockImport, + prometheus_registry: Option<&Registry>, + telemetry: Option, + task_manager: &TaskManager, + relay_chain_interface: Arc, + transaction_pool: Arc>>, + keystore: KeystorePtr, + relay_chain_slot_duration: Duration, + para_id: ParaId, + collator_key: CollatorPair, + overseer_handle: OverseerHandle, + announce_block: Arc>) + Send + Sync>, + backend: Arc, + ) -> Result<(), sc_service::Error>; +} - let relay_chain_slot_duration = Duration::from_secs(6); +pub(crate) trait NodeSpec { + type RuntimeApi: ConstructNodeRuntimeApi>; + + type BuildImportQueue: BuildImportQueue + 'static; + + type BuildRpcExtensions: BuildRpcExtensions< + ParachainClient, + ParachainBackend, + sc_transaction_pool::FullPool>, + > + 'static; + + type StartConsensus: StartConsensus + 'static; + + const SYBIL_RESISTANCE: CollatorSybilResistance; + + /// Starts a `ServiceBuilder` for a full service. + /// + /// Use this macro if you don't actually need the full service, but just the builder in order to + /// be able to perform chain operations. + fn new_partial(config: &Configuration) -> sc_service::error::Result> { + let telemetry = config + .telemetry_endpoints + .clone() + .filter(|x| !x.is_empty()) + .map(|endpoints| -> Result<_, sc_telemetry::Error> { + let worker = TelemetryWorker::new(16)?; + let telemetry = worker.handle().new_telemetry(endpoints); + Ok((worker, telemetry)) + }) + .transpose()?; + + let heap_pages = config.default_heap_pages.map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| { + HeapAllocStrategy::Static { extra_pages: h as _ } + }); + + let executor = sc_executor::WasmExecutor::::builder() + .with_execution_method(config.wasm_method) + .with_max_runtime_instances(config.max_runtime_instances) + .with_runtime_cache_size(config.runtime_cache_size) + .with_onchain_heap_alloc_strategy(heap_pages) + .with_offchain_heap_alloc_strategy(heap_pages) + .build(); + + let (client, backend, keystore_container, task_manager) = + sc_service::new_full_parts_record_import::( + config, + telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), + executor, + true, + )?; + let client = Arc::new(client); + + let telemetry_worker_handle = telemetry.as_ref().map(|(worker, _)| worker.handle()); + + let telemetry = telemetry.map(|(worker, telemetry)| { + task_manager.spawn_handle().spawn("telemetry", None, worker.run()); + telemetry + }); + + let transaction_pool = sc_transaction_pool::BasicPool::new_full( + config.transaction_pool.clone(), + config.role.is_authority().into(), + config.prometheus_registry(), + task_manager.spawn_essential_handle(), + client.clone(), + ); - let overseer_handle = relay_chain_interface - .overseer_handle() - .map_err(|e| sc_service::Error::Application(Box::new(e)))?; + let block_import = ParachainBlockImport::new(client.clone(), backend.clone()); - start_relay_chain_tasks(StartRelayChainTasksParams { - client: client.clone(), - announce_block: announce_block.clone(), - para_id, - relay_chain_interface: relay_chain_interface.clone(), - task_manager: &mut task_manager, - da_recovery_profile: if validator { - DARecoveryProfile::Collator - } else { - DARecoveryProfile::FullNode - }, - import_queue: import_queue_service, - relay_chain_slot_duration, - recovery_handle: Box::new(overseer_handle.clone()), - sync_service: sync_service.clone(), - })?; - - if validator { - start_consensus( + let import_queue = Self::BuildImportQueue::build_import_queue( client.clone(), - block_import, - prometheus_registry.as_ref(), - telemetry.as_ref().map(|t| t.handle()), + block_import.clone(), + config, + telemetry.as_ref().map(|telemetry| telemetry.handle()), &task_manager, - relay_chain_interface.clone(), - transaction_pool, - params.keystore_container.keystore(), - relay_chain_slot_duration, - para_id, - collator_key.expect("Command line arguments do not allow this. qed"), - overseer_handle, - announce_block, - backend.clone(), )?; + + Ok(PartialComponents { + backend, + client, + import_queue, + keystore_container, + task_manager, + transaction_pool, + select_chain: (), + other: (block_import, telemetry, telemetry_worker_handle), + }) } - start_network.start_network(); + /// Start a node with the given parachain spec. + /// + /// This is the actual implementation that is abstract over the executor and the runtime api. + fn start_node( + parachain_config: Configuration, + polkadot_config: Configuration, + collator_options: CollatorOptions, + para_id: ParaId, + hwbench: Option, + ) -> Pin>>> + where + Net: NetworkBackend, + { + Box::pin(async move { + let parachain_config = prepare_node_config(parachain_config); + + let params = Self::new_partial(¶chain_config)?; + let (block_import, mut telemetry, telemetry_worker_handle) = params.other; + + let client = params.client.clone(); + let backend = params.backend.clone(); + + let mut task_manager = params.task_manager; + let (relay_chain_interface, collator_key) = build_relay_chain_interface( + polkadot_config, + ¶chain_config, + telemetry_worker_handle, + &mut task_manager, + collator_options.clone(), + hwbench.clone(), + ) + .await + .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; + + let validator = parachain_config.role.is_authority(); + let prometheus_registry = parachain_config.prometheus_registry().cloned(); + let transaction_pool = params.transaction_pool.clone(); + let import_queue_service = params.import_queue.service(); + let net_config = FullNetworkConfiguration::<_, _, Net>::new(¶chain_config.network); + + let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = + build_network(BuildNetworkParams { + parachain_config: ¶chain_config, + net_config, + client: client.clone(), + transaction_pool: transaction_pool.clone(), + para_id, + spawn_handle: task_manager.spawn_handle(), + relay_chain_interface: relay_chain_interface.clone(), + import_queue: params.import_queue, + sybil_resistance_level: Self::SYBIL_RESISTANCE, + }) + .await?; + + let rpc_builder = { + let client = client.clone(); + let transaction_pool = transaction_pool.clone(); + let backend_for_rpc = backend.clone(); + + Box::new(move |deny_unsafe, _| { + Self::BuildRpcExtensions::build_rpc_extensions( + deny_unsafe, + client.clone(), + backend_for_rpc.clone(), + transaction_pool.clone(), + ) + }) + }; + + sc_service::spawn_tasks(sc_service::SpawnTasksParams { + rpc_builder, + client: client.clone(), + transaction_pool: transaction_pool.clone(), + task_manager: &mut task_manager, + config: parachain_config, + keystore: params.keystore_container.keystore(), + backend: backend.clone(), + network: network.clone(), + sync_service: sync_service.clone(), + system_rpc_tx, + tx_handler_controller, + telemetry: telemetry.as_mut(), + })?; + + if let Some(hwbench) = hwbench { + sc_sysinfo::print_hwbench(&hwbench); + if validator { + warn_if_slow_hardware(&hwbench); + } - Ok((task_manager, client)) -} + if let Some(ref mut telemetry) = telemetry { + let telemetry_handle = telemetry.handle(); + task_manager.spawn_handle().spawn( + "telemetry_hwbench", + None, + sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), + ); + } + } -/// Build the import queue for Aura-based runtimes. -pub fn build_aura_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - telemetry: Option, - task_manager: &TaskManager, -) -> Result, sc_service::Error> { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - cumulus_client_consensus_aura::import_queue::< - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - _, - >(cumulus_client_consensus_aura::ImportQueueParams { - block_import, - client, - create_inherent_data_providers: move |_, _| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - Ok((slot, timestamp)) - }, - registry: config.prometheus_registry(), - spawner: &task_manager.spawn_essential_handle(), - telemetry, - }) - .map_err(Into::into) -} + let announce_block = { + let sync_service = sync_service.clone(); + Arc::new(move |hash, data| sync_service.announce_block(hash, data)) + }; + + let relay_chain_slot_duration = Duration::from_secs(6); + + let overseer_handle = relay_chain_interface + .overseer_handle() + .map_err(|e| sc_service::Error::Application(Box::new(e)))?; + + start_relay_chain_tasks(StartRelayChainTasksParams { + client: client.clone(), + announce_block: announce_block.clone(), + para_id, + relay_chain_interface: relay_chain_interface.clone(), + task_manager: &mut task_manager, + da_recovery_profile: if validator { + DARecoveryProfile::Collator + } else { + DARecoveryProfile::FullNode + }, + import_queue: import_queue_service, + relay_chain_slot_duration, + recovery_handle: Box::new(overseer_handle.clone()), + sync_service, + })?; + + if validator { + Self::StartConsensus::start_consensus( + client.clone(), + block_import, + prometheus_registry.as_ref(), + telemetry.as_ref().map(|t| t.handle()), + &task_manager, + relay_chain_interface.clone(), + transaction_pool, + params.keystore_container.keystore(), + relay_chain_slot_duration, + para_id, + collator_key.expect("Command line arguments do not allow this. qed"), + overseer_handle, + announce_block, + backend.clone(), + )?; + } -/// Start a rococo parachain node. -pub async fn start_rococo_parachain_node>( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - use_experimental_slot_based: bool, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> { - let consensus_starter = if use_experimental_slot_based { - start_slot_based_aura_consensus::<_, AuraId> - } else { - start_lookahead_aura_consensus::<_, AuraId> - }; - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - build_parachain_rpc_extensions::, - build_aura_import_queue, - consensus_starter, - hwbench, - ) - .await -} + start_network.start_network(); -/// Build the import queue for the shell runtime. -pub fn build_shell_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - _: Option, - task_manager: &TaskManager, -) -> Result, sc_service::Error> { - cumulus_client_consensus_relay_chain::import_queue( - client, - block_import, - |_, _| async { Ok(()) }, - &task_manager.spawn_essential_handle(), - config.prometheus_registry(), - ) - .map_err(Into::into) + Ok(task_manager) + }) + } } -fn build_parachain_rpc_extensions( - deny_unsafe: sc_rpc::DenyUnsafe, - client: Arc>, - backend: Arc, - pool: Arc>>, -) -> Result, sc_service::Error> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_block_builder::BlockBuilder - + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + substrate_frame_rpc_system::AccountNonceApi, -{ - let deps = rpc::FullDeps { client, pool, deny_unsafe }; - - rpc::create_full(deps, backend).map_err(Into::into) +/// Build the import queue for the shell runtime. +pub(crate) struct BuildShellImportQueue(PhantomData); + +impl BuildImportQueue for BuildShellImportQueue { + fn build_import_queue( + client: Arc>, + block_import: ParachainBlockImport, + config: &Configuration, + _telemetry_handle: Option, + task_manager: &TaskManager, + ) -> sc_service::error::Result> { + cumulus_client_consensus_relay_chain::import_queue( + client, + block_import, + |_, _| async { Ok(()) }, + &task_manager.spawn_essential_handle(), + config.prometheus_registry(), + ) + .map_err(Into::into) + } } -fn build_contracts_rpc_extensions( - deny_unsafe: sc_rpc::DenyUnsafe, - client: Arc>, - _backend: Arc, - pool: Arc>>, -) -> Result, sc_service::Error> { - let deps = crate::rpc::FullDeps { client: client.clone(), pool: pool.clone(), deny_unsafe }; +pub(crate) struct ShellNode; - crate::rpc::create_contracts_rococo(deps).map_err(Into::into) -} +impl NodeSpec for ShellNode { + type RuntimeApi = FakeRuntimeApi; + type BuildImportQueue = BuildShellImportQueue; + type BuildRpcExtensions = BuildEmptyRpcExtensions; + type StartConsensus = StartRelayChainConsensus; -/// Start a polkadot-shell parachain node. -pub async fn start_shell_node>( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> { - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Unresistant, // free-for-all consensus - para_id, - |_, _, _, _| Ok(RpcModule::new(())), - build_shell_import_queue, - start_relay_chain_consensus, - hwbench, - ) - .await + const SYBIL_RESISTANCE: CollatorSybilResistance = CollatorSybilResistance::Unresistant; } struct Verifier { @@ -527,435 +428,374 @@ where /// Build the import queue for parachain runtimes that started with relay chain consensus and /// switched to aura. -pub fn build_relay_to_aura_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - telemetry_handle: Option, - task_manager: &TaskManager, -) -> Result, sc_service::Error> +pub(crate) struct BuildRelayToAuraImportQueue( + PhantomData<(RuntimeApi, AuraId)>, +); + +impl BuildImportQueue + for BuildRelayToAuraImportQueue where RuntimeApi: ConstructNodeRuntimeApi>, RuntimeApi::RuntimeApi: AuraRuntimeApi, AuraId: AuraIdT + Sync, { - let verifier_client = client.clone(); - - let aura_verifier = cumulus_client_consensus_aura::build_verifier::< - ::Pair, - _, - _, - _, - >(cumulus_client_consensus_aura::BuildVerifierParams { - client: verifier_client.clone(), - create_inherent_data_providers: move |parent_hash, _| { - let cidp_client = verifier_client.clone(); - async move { - let slot_duration = - cumulus_client_consensus_aura::slot_duration_at(&*cidp_client, parent_hash)?; - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); + fn build_import_queue( + client: Arc>, + block_import: ParachainBlockImport, + config: &Configuration, + telemetry_handle: Option, + task_manager: &TaskManager, + ) -> sc_service::error::Result> { + let verifier_client = client.clone(); + + let aura_verifier = + cumulus_client_consensus_aura::build_verifier::<::Pair, _, _, _>( + cumulus_client_consensus_aura::BuildVerifierParams { + client: verifier_client.clone(), + create_inherent_data_providers: move |parent_hash, _| { + let cidp_client = verifier_client.clone(); + async move { + let slot_duration = cumulus_client_consensus_aura::slot_duration_at( + &*cidp_client, + parent_hash, + )?; + let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); + + let slot = + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); + + Ok((slot, timestamp)) + } + }, + telemetry: telemetry_handle, + }, + ); - Ok((slot, timestamp)) - } - }, - telemetry: telemetry_handle, - }); - - let relay_chain_verifier = - Box::new(RelayChainVerifier::new(client.clone(), |_, _| async { Ok(()) })) as Box<_>; - - let verifier = Verifier { - client, - relay_chain_verifier, - aura_verifier: Box::new(aura_verifier), - _phantom: PhantomData, - }; + let relay_chain_verifier = + Box::new(RelayChainVerifier::new(client.clone(), |_, _| async { Ok(()) })); + + let verifier = Verifier { + client, + relay_chain_verifier, + aura_verifier: Box::new(aura_verifier), + _phantom: PhantomData, + }; - let registry = config.prometheus_registry(); - let spawner = task_manager.spawn_essential_handle(); + let registry = config.prometheus_registry(); + let spawner = task_manager.spawn_essential_handle(); - Ok(BasicQueue::new(verifier, Box::new(block_import), None, &spawner, registry)) + Ok(BasicQueue::new(verifier, Box::new(block_import), None, &spawner, registry)) + } } /// Uses the lookahead collator to support async backing. /// /// Start an aura powered parachain node. Some system chains use this. -pub async fn start_generic_aura_async_backing_node>( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - use_experimental_slot_based: bool, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> { - let consensus_starter = if use_experimental_slot_based { - start_slot_based_aura_consensus::<_, AuraId> - } else { - start_lookahead_aura_consensus::<_, AuraId> - }; - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - build_parachain_rpc_extensions::, - build_relay_to_aura_import_queue::<_, AuraId>, - consensus_starter, - hwbench, - ) - .await +pub(crate) struct AuraNode( + pub PhantomData<(RuntimeApi, AuraId, StartConsensus)>, +); + +impl Default for AuraNode { + fn default() -> Self { + Self(Default::default()) + } } -/// Start a shell node which should later transition into an Aura powered parachain node. Asset Hub -/// uses this because at genesis, Asset Hub was on the `shell` runtime which didn't have Aura and -/// needs to sync and upgrade before it can run `AuraApi` functions. -/// -/// Uses the lookahead collator to support async backing. -#[sc_tracing::logging::prefix_logs_with("Parachain")] -pub async fn start_asset_hub_async_backing_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - use_experimental_slot_based: bool, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> +impl NodeSpec for AuraNode where RuntimeApi: ConstructNodeRuntimeApi>, RuntimeApi::RuntimeApi: AuraRuntimeApi + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi + substrate_frame_rpc_system::AccountNonceApi, AuraId: AuraIdT + Sync, - Net: NetworkBackend, + StartConsensus: self::StartConsensus + 'static, { - let consensus_starter = if use_experimental_slot_based { - start_slot_based_aura_consensus::<_, AuraId> - } else { - start_lookahead_aura_consensus::<_, AuraId> - }; - - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - build_parachain_rpc_extensions, - build_relay_to_aura_import_queue::<_, AuraId>, - consensus_starter, - hwbench, - ) - .await + type RuntimeApi = RuntimeApi; + type BuildImportQueue = BuildRelayToAuraImportQueue; + type BuildRpcExtensions = BuildParachainRpcExtensions; + type StartConsensus = StartConsensus; + const SYBIL_RESISTANCE: CollatorSybilResistance = CollatorSybilResistance::Resistant; } -/// Wait for the Aura runtime API to appear on chain. -/// This is useful for chains that started out without Aura. Components that -/// are depending on Aura functionality will wait until Aura appears in the runtime. -async fn wait_for_aura(client: Arc>) +pub fn new_aura_node_spec(extra_args: NodeExtraArgs) -> Box where RuntimeApi: ConstructNodeRuntimeApi>, - RuntimeApi::RuntimeApi: AuraRuntimeApi, + RuntimeApi::RuntimeApi: AuraRuntimeApi + + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi + + substrate_frame_rpc_system::AccountNonceApi, AuraId: AuraIdT + Sync, { - let finalized_hash = client.chain_info().finalized_hash; - if client - .runtime_api() - .has_api::>(finalized_hash) - .unwrap_or(false) - { - return; - }; - - let mut stream = client.finality_notification_stream(); - while let Some(notification) = stream.next().await { - let has_aura_api = client - .runtime_api() - .has_api::>(notification.hash) - .unwrap_or(false); - if has_aura_api { - return; - } + if extra_args.use_slot_based_consensus { + Box::new(AuraNode::< + RuntimeApi, + AuraId, + StartSlotBasedAuraConsensus, + >::default()) + } else { + Box::new(AuraNode::< + RuntimeApi, + AuraId, + StartLookaheadAuraConsensus, + >::default()) } } /// Start relay-chain consensus that is free for all. Everyone can submit a block, the relay-chain /// decides what is backed and included. -fn start_relay_chain_consensus( - client: Arc>, - block_import: ParachainBlockImport, - prometheus_registry: Option<&Registry>, - telemetry: Option, - task_manager: &TaskManager, - relay_chain_interface: Arc, - transaction_pool: Arc>>, - _keystore: KeystorePtr, - _relay_chain_slot_duration: Duration, - para_id: ParaId, - collator_key: CollatorPair, - overseer_handle: OverseerHandle, - announce_block: Arc>) + Send + Sync>, - _backend: Arc, -) -> Result<(), sc_service::Error> { - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry, - ); - - let free_for_all = cumulus_client_consensus_relay_chain::build_relay_chain_consensus( - cumulus_client_consensus_relay_chain::BuildRelayChainConsensusParams { - para_id, - proposer_factory, - block_import, - relay_chain_interface: relay_chain_interface.clone(), - create_inherent_data_providers: move |_, (relay_parent, validation_data)| { - let relay_chain_interface = relay_chain_interface.clone(); - async move { - let parachain_inherent = +pub(crate) struct StartRelayChainConsensus; + +impl StartConsensus for StartRelayChainConsensus { + fn start_consensus( + client: Arc>, + block_import: ParachainBlockImport, + prometheus_registry: Option<&Registry>, + telemetry: Option, + task_manager: &TaskManager, + relay_chain_interface: Arc, + transaction_pool: Arc>>, + _keystore: KeystorePtr, + _relay_chain_slot_duration: Duration, + para_id: ParaId, + collator_key: CollatorPair, + overseer_handle: OverseerHandle, + announce_block: Arc>) + Send + Sync>, + _backend: Arc, + ) -> Result<(), Error> { + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( + task_manager.spawn_handle(), + client.clone(), + transaction_pool, + prometheus_registry, + telemetry, + ); + + let free_for_all = cumulus_client_consensus_relay_chain::build_relay_chain_consensus( + cumulus_client_consensus_relay_chain::BuildRelayChainConsensusParams { + para_id, + proposer_factory, + block_import, + relay_chain_interface: relay_chain_interface.clone(), + create_inherent_data_providers: move |_, (relay_parent, validation_data)| { + let relay_chain_interface = relay_chain_interface.clone(); + async move { + let parachain_inherent = cumulus_client_parachain_inherent::ParachainInherentDataProvider::create_at( relay_parent, &relay_chain_interface, &validation_data, para_id, ).await; - let parachain_inherent = parachain_inherent.ok_or_else(|| { - Box::::from( - "Failed to create parachain inherent", - ) - })?; - Ok(parachain_inherent) - } + let parachain_inherent = parachain_inherent.ok_or_else(|| { + Box::::from( + "Failed to create parachain inherent", + ) + })?; + Ok(parachain_inherent) + } + }, }, - }, - ); - - let spawner = task_manager.spawn_handle(); - - // Required for free-for-all consensus - #[allow(deprecated)] - old_consensus::start_collator_sync(old_consensus::StartCollatorParams { - para_id, - block_status: client.clone(), - announce_block, - overseer_handle, - spawner, - key: collator_key, - parachain_consensus: free_for_all, - runtime_api: client.clone(), - }); - - Ok(()) + ); + + let spawner = task_manager.spawn_handle(); + + // Required for free-for-all consensus + #[allow(deprecated)] + old_consensus::start_collator_sync(old_consensus::StartCollatorParams { + para_id, + block_status: client.clone(), + announce_block, + overseer_handle, + spawner, + key: collator_key, + parachain_consensus: free_for_all, + runtime_api: client.clone(), + }); + + Ok(()) + } } /// Start consensus using the lookahead aura collator. -fn start_lookahead_aura_consensus( - client: Arc>, - block_import: ParachainBlockImport, - prometheus_registry: Option<&Registry>, - telemetry: Option, - task_manager: &TaskManager, - relay_chain_interface: Arc, - transaction_pool: Arc>>, - keystore: KeystorePtr, - relay_chain_slot_duration: Duration, - para_id: ParaId, - collator_key: CollatorPair, - overseer_handle: OverseerHandle, - announce_block: Arc>) + Send + Sync>, - backend: Arc, -) -> Result<(), sc_service::Error> +pub(crate) struct StartSlotBasedAuraConsensus( + PhantomData<(RuntimeApi, AuraId)>, +); + +impl StartConsensus + for StartSlotBasedAuraConsensus where RuntimeApi: ConstructNodeRuntimeApi>, RuntimeApi::RuntimeApi: AuraRuntimeApi, AuraId: AuraIdT + Sync, { - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); - - let params = AuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client.clone(), - para_backend: backend, - relay_client: relay_chain_interface, - code_hash_provider: { - let client = client.clone(); - move |block_hash| { - client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) - } - }, - keystore, - collator_key, - para_id, - overseer_handle, - relay_chain_slot_duration, - proposer: Proposer::new(proposer_factory), - collator_service, - authoring_duration: Duration::from_millis(1500), - reinitialize: false, - }; + fn start_consensus( + client: Arc>, + block_import: ParachainBlockImport, + prometheus_registry: Option<&Registry>, + telemetry: Option, + task_manager: &TaskManager, + relay_chain_interface: Arc, + transaction_pool: Arc>>, + keystore: KeystorePtr, + relay_chain_slot_duration: Duration, + para_id: ParaId, + collator_key: CollatorPair, + _overseer_handle: OverseerHandle, + announce_block: Arc>) + Send + Sync>, + backend: Arc, + ) -> Result<(), Error> { + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( + task_manager.spawn_handle(), + client.clone(), + transaction_pool, + prometheus_registry, + telemetry.clone(), + ); - let fut = async move { - wait_for_aura(client).await; - aura::run::::Pair, _, _, _, _, _, _, _, _>(params).await; - }; - task_manager.spawn_essential_handle().spawn("aura", None, fut); + let proposer = Proposer::new(proposer_factory); + let collator_service = CollatorService::new( + client.clone(), + Arc::new(task_manager.spawn_handle()), + announce_block, + client.clone(), + ); - Ok(()) + let client_for_aura = client.clone(); + let params = SlotBasedParams { + create_inherent_data_providers: move |_, ()| async move { Ok(()) }, + block_import, + para_client: client.clone(), + para_backend: backend.clone(), + relay_client: relay_chain_interface, + code_hash_provider: move |block_hash| { + client_for_aura.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) + }, + keystore, + collator_key, + para_id, + relay_chain_slot_duration, + proposer, + collator_service, + authoring_duration: Duration::from_millis(2000), + reinitialize: false, + slot_drift: Duration::from_secs(1), + }; + + let (collation_future, block_builder_future) = + slot_based::run::::Pair, _, _, _, _, _, _, _, _>(params); + + task_manager.spawn_essential_handle().spawn( + "collation-task", + Some("parachain-block-authoring"), + collation_future, + ); + task_manager.spawn_essential_handle().spawn( + "block-builder-task", + Some("parachain-block-authoring"), + block_builder_future, + ); + Ok(()) + } } -/// Start consensus using the lookahead aura collator. -fn start_slot_based_aura_consensus( - client: Arc>, - block_import: ParachainBlockImport, - prometheus_registry: Option<&Registry>, - telemetry: Option, - task_manager: &TaskManager, - relay_chain_interface: Arc, - transaction_pool: Arc>>, - keystore: KeystorePtr, - relay_chain_slot_duration: Duration, - para_id: ParaId, - collator_key: CollatorPair, - _overseer_handle: OverseerHandle, - announce_block: Arc>) + Send + Sync>, - backend: Arc, -) -> Result<(), sc_service::Error> +/// Wait for the Aura runtime API to appear on chain. +/// This is useful for chains that started out without Aura. Components that +/// are depending on Aura functionality will wait until Aura appears in the runtime. +async fn wait_for_aura(client: Arc>) where RuntimeApi: ConstructNodeRuntimeApi>, RuntimeApi::RuntimeApi: AuraRuntimeApi, AuraId: AuraIdT + Sync, { - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - - let proposer = Proposer::new(proposer_factory); - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); - - let client_for_aura = client.clone(); - let params = SlotBasedParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client.clone(), - para_backend: backend.clone(), - relay_client: relay_chain_interface, - code_hash_provider: move |block_hash| { - client_for_aura.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) - }, - keystore, - collator_key, - para_id, - relay_chain_slot_duration, - proposer, - collator_service, - authoring_duration: Duration::from_millis(2000), - reinitialize: false, - slot_drift: Duration::from_secs(1), + let finalized_hash = client.chain_info().finalized_hash; + if client.runtime_api().has_aura_api(finalized_hash) { + return; }; - let (collation_future, block_builder_future) = - slot_based::run::::Pair, _, _, _, _, _, _, _, _>(params); - - task_manager.spawn_essential_handle().spawn( - "collation-task", - Some("parachain-block-authoring"), - collation_future, - ); - task_manager.spawn_essential_handle().spawn( - "block-builder-task", - Some("parachain-block-authoring"), - block_builder_future, - ); - Ok(()) + let mut stream = client.finality_notification_stream(); + while let Some(notification) = stream.next().await { + if client.runtime_api().has_aura_api(notification.hash) { + return; + } + } } -/// Start an aura powered parachain node which uses the lookahead collator to support async backing. -/// This node is basic in the sense that its runtime api doesn't include common contents such as -/// transaction payment. Used for aura glutton. -pub async fn start_basic_async_backing_node>( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - use_experimental_slot_based: bool, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> { - let consensus_starter = if use_experimental_slot_based { - start_slot_based_aura_consensus::<_, AuraId> - } else { - start_lookahead_aura_consensus::<_, AuraId> - }; - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - |_, _, _, _| Ok(RpcModule::new(())), - build_relay_to_aura_import_queue::<_, AuraId>, - consensus_starter, - hwbench, - ) - .await -} +/// Start consensus using the lookahead aura collator. +pub(crate) struct StartLookaheadAuraConsensus( + PhantomData<(RuntimeApi, AuraId)>, +); -/// Start a parachain node for Rococo Contracts. -pub async fn start_contracts_rococo_node>( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - use_experimental_slot_based: bool, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> { - let consensus_starter = if use_experimental_slot_based { - start_slot_based_aura_consensus::<_, AuraId> - } else { - start_lookahead_aura_consensus::<_, AuraId> - }; - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - build_contracts_rpc_extensions, - build_aura_import_queue, - consensus_starter, - hwbench, - ) - .await +impl StartConsensus + for StartLookaheadAuraConsensus +where + RuntimeApi: ConstructNodeRuntimeApi>, + RuntimeApi::RuntimeApi: AuraRuntimeApi, + AuraId: AuraIdT + Sync, +{ + fn start_consensus( + client: Arc>, + block_import: ParachainBlockImport, + prometheus_registry: Option<&Registry>, + telemetry: Option, + task_manager: &TaskManager, + relay_chain_interface: Arc, + transaction_pool: Arc>>, + keystore: KeystorePtr, + relay_chain_slot_duration: Duration, + para_id: ParaId, + collator_key: CollatorPair, + overseer_handle: OverseerHandle, + announce_block: Arc>) + Send + Sync>, + backend: Arc, + ) -> Result<(), Error> { + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( + task_manager.spawn_handle(), + client.clone(), + transaction_pool, + prometheus_registry, + telemetry.clone(), + ); + + let collator_service = CollatorService::new( + client.clone(), + Arc::new(task_manager.spawn_handle()), + announce_block, + client.clone(), + ); + + let params = AuraParams { + create_inherent_data_providers: move |_, ()| async move { Ok(()) }, + block_import, + para_client: client.clone(), + para_backend: backend, + relay_client: relay_chain_interface, + code_hash_provider: { + let client = client.clone(); + move |block_hash| { + client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) + } + }, + keystore, + collator_key, + para_id, + overseer_handle, + relay_chain_slot_duration, + proposer: Proposer::new(proposer_factory), + collator_service, + authoring_duration: Duration::from_millis(1500), + reinitialize: false, + }; + + let fut = async move { + wait_for_aura(client).await; + aura::run::::Pair, _, _, _, _, _, _, _, _>(params).await; + }; + task_manager.spawn_essential_handle().spawn("aura", None, fut); + + Ok(()) + } } /// Checks that the hardware meets the requirements and print a warning otherwise. @@ -970,3 +810,177 @@ fn warn_if_slow_hardware(hwbench: &sc_sysinfo::HwBench) { ); } } + +type SyncCmdResult = sc_cli::Result<()>; + +type AsyncCmdResult<'a> = + sc_cli::Result<(Pin + 'a>>, TaskManager)>; + +pub(crate) trait DynNodeSpec { + fn prepare_check_block_cmd( + self: Box, + config: Configuration, + cmd: &CheckBlockCmd, + ) -> AsyncCmdResult<'_>; + + fn prepare_export_blocks_cmd( + self: Box, + config: Configuration, + cmd: &ExportBlocksCmd, + ) -> AsyncCmdResult<'_>; + + fn prepare_export_state_cmd( + self: Box, + config: Configuration, + cmd: &ExportStateCmd, + ) -> AsyncCmdResult<'_>; + + fn prepare_import_blocks_cmd( + self: Box, + config: Configuration, + cmd: &ImportBlocksCmd, + ) -> AsyncCmdResult<'_>; + + fn prepare_revert_cmd( + self: Box, + config: Configuration, + cmd: &RevertCmd, + ) -> AsyncCmdResult<'_>; + + fn run_export_genesis_head_cmd( + self: Box, + config: Configuration, + cmd: &ExportGenesisHeadCommand, + ) -> SyncCmdResult; + + fn run_benchmark_block_cmd( + self: Box, + config: Configuration, + cmd: &BlockCmd, + ) -> SyncCmdResult; + + #[cfg(any(feature = "runtime-benchmarks"))] + fn run_benchmark_storage_cmd( + self: Box, + config: Configuration, + cmd: &StorageCmd, + ) -> SyncCmdResult; + + fn start_node( + self: Box, + parachain_config: Configuration, + polkadot_config: Configuration, + collator_options: CollatorOptions, + para_id: ParaId, + hwbench: Option, + ) -> Pin>>>; +} + +impl DynNodeSpec for T +where + T: NodeSpec, +{ + fn prepare_check_block_cmd( + self: Box, + config: Configuration, + cmd: &CheckBlockCmd, + ) -> AsyncCmdResult<'_> { + let partial = Self::new_partial(&config).map_err(sc_cli::Error::Service)?; + Ok((Box::pin(cmd.run(partial.client, partial.import_queue)), partial.task_manager)) + } + + fn prepare_export_blocks_cmd( + self: Box, + config: Configuration, + cmd: &ExportBlocksCmd, + ) -> AsyncCmdResult<'_> { + let partial = Self::new_partial(&config).map_err(sc_cli::Error::Service)?; + Ok((Box::pin(cmd.run(partial.client, config.database)), partial.task_manager)) + } + + fn prepare_export_state_cmd( + self: Box, + config: Configuration, + cmd: &ExportStateCmd, + ) -> AsyncCmdResult<'_> { + let partial = Self::new_partial(&config).map_err(sc_cli::Error::Service)?; + Ok((Box::pin(cmd.run(partial.client, config.chain_spec)), partial.task_manager)) + } + + fn prepare_import_blocks_cmd( + self: Box, + config: Configuration, + cmd: &ImportBlocksCmd, + ) -> AsyncCmdResult<'_> { + let partial = Self::new_partial(&config).map_err(sc_cli::Error::Service)?; + Ok((Box::pin(cmd.run(partial.client, partial.import_queue)), partial.task_manager)) + } + + fn prepare_revert_cmd( + self: Box, + config: Configuration, + cmd: &RevertCmd, + ) -> AsyncCmdResult<'_> { + let partial = Self::new_partial(&config).map_err(sc_cli::Error::Service)?; + Ok((Box::pin(cmd.run(partial.client, partial.backend, None)), partial.task_manager)) + } + + fn run_export_genesis_head_cmd( + self: Box, + config: Configuration, + cmd: &ExportGenesisHeadCommand, + ) -> SyncCmdResult { + let partial = Self::new_partial(&config).map_err(sc_cli::Error::Service)?; + cmd.run(partial.client) + } + + fn run_benchmark_block_cmd( + self: Box, + config: Configuration, + cmd: &BlockCmd, + ) -> SyncCmdResult { + let partial = Self::new_partial(&config).map_err(sc_cli::Error::Service)?; + cmd.run(partial.client) + } + + #[cfg(any(feature = "runtime-benchmarks"))] + fn run_benchmark_storage_cmd( + self: Box, + config: Configuration, + cmd: &StorageCmd, + ) -> SyncCmdResult { + let partial = Self::new_partial(&config).map_err(sc_cli::Error::Service)?; + let db = partial.backend.expose_db(); + let storage = partial.backend.expose_storage(); + + cmd.run(config, partial.client, db, storage) + } + + fn start_node( + self: Box, + parachain_config: Configuration, + polkadot_config: Configuration, + collator_options: CollatorOptions, + para_id: ParaId, + hwbench: Option, + ) -> Pin>>> { + match parachain_config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => + ::start_node::>( + parachain_config, + polkadot_config, + collator_options, + para_id, + hwbench, + ), + sc_network::config::NetworkBackendType::Litep2p => + ::start_node::( + parachain_config, + polkadot_config, + collator_options, + para_id, + hwbench, + ), + } + } +} diff --git a/polkadot/cli/src/command.rs b/polkadot/cli/src/command.rs index b89054b4dc3..62d99122c30 100644 --- a/polkadot/cli/src/command.rs +++ b/polkadot/cli/src/command.rs @@ -192,7 +192,7 @@ where F: FnOnce(&mut sc_cli::LoggerBuilder, &sc_service::Configuration), { let runner = cli - .create_runner_with_logger_hook::(&cli.run.base, logger_hook) + .create_runner_with_logger_hook::<_, _, F>(&cli.run.base, logger_hook) .map_err(Error::from)?; let chain_spec = &runner.config().chain_spec; diff --git a/substrate/client/cli/src/lib.rs b/substrate/client/cli/src/lib.rs index 104e8ec8b79..1bb9fec0e27 100644 --- a/substrate/client/cli/src/lib.rs +++ b/substrate/client/cli/src/lib.rs @@ -58,11 +58,11 @@ pub trait SubstrateCli: Sized { /// Implementation version. /// - /// By default this will look like this: + /// By default, it will look like this: /// /// `2.0.0-b950f731c` /// - /// Where the hash is the short commit hash of the commit of in the Git repository. + /// Where the hash is the short hash of the commit in the Git repository. fn impl_version() -> String; /// Executable file name. @@ -199,17 +199,8 @@ pub trait SubstrateCli: Sized { fn create_runner, DVC: DefaultConfigurationValues>( &self, command: &T, - ) -> error::Result> { - let tokio_runtime = build_runtime()?; - - // `capture` needs to be called in a tokio context. - // Also capture them as early as possible. - let signals = tokio_runtime.block_on(async { Signals::capture() })?; - - let config = command.create_configuration(self, tokio_runtime.handle().clone())?; - - command.init(&Self::support_url(), &Self::impl_version(), |_, _| {}, &config)?; - Runner::new(config, tokio_runtime, signals) + ) -> Result> { + self.create_runner_with_logger_hook(command, |_, _| {}) } /// Create a runner for the command provided in argument. The `logger_hook` can be used to setup @@ -231,11 +222,15 @@ pub trait SubstrateCli: Sized { /// } /// } /// ``` - fn create_runner_with_logger_hook( + fn create_runner_with_logger_hook< + T: CliConfiguration, + DVC: DefaultConfigurationValues, + F, + >( &self, command: &T, logger_hook: F, - ) -> error::Result> + ) -> Result> where F: FnOnce(&mut LoggerBuilder, &Configuration), { diff --git a/substrate/client/service/src/lib.rs b/substrate/client/service/src/lib.rs index a51bb4012d5..63be296d1b2 100644 --- a/substrate/client/service/src/lib.rs +++ b/substrate/client/service/src/lib.rs @@ -137,7 +137,7 @@ pub struct PartialComponents, /// The chain task manager. pub task_manager: TaskManager, - /// A keystore container instance.. + /// A keystore container instance. pub keystore_container: KeystoreContainer, /// A chain selection algorithm instance. pub select_chain: SelectChain, -- GitLab From 2f0e5a61b7739ff0f41ba124653b45ce269dee7e Mon Sep 17 00:00:00 2001 From: Alin Dima Date: Tue, 9 Jul 2024 14:36:07 +0300 Subject: [PATCH 106/130] add notices to the implementer's guide docs that changed for elastic scaling (#4983) The update is tracked by: https://github.com/paritytech/polkadot-sdk/issues/3699 However, this is not worth doing at this point since it will change in the future for phase 2 of the implementation. Still, it's useful to let people know that the information is not the most up to date. --- .../implementers-guide/src/node/backing/candidate-backing.md | 4 ++++ .../src/node/backing/prospective-parachains.md | 4 ++++ .../src/node/collators/collator-protocol.md | 4 ++++ .../implementers-guide/src/node/utility/provisioner.md | 4 ++++ polkadot/roadmap/implementers-guide/src/runtime/inclusion.md | 4 ++++ .../roadmap/implementers-guide/src/runtime/parainherent.md | 4 ++++ 6 files changed, 24 insertions(+) diff --git a/polkadot/roadmap/implementers-guide/src/node/backing/candidate-backing.md b/polkadot/roadmap/implementers-guide/src/node/backing/candidate-backing.md index 31f8423fe27..0e483f02ec3 100644 --- a/polkadot/roadmap/implementers-guide/src/node/backing/candidate-backing.md +++ b/polkadot/roadmap/implementers-guide/src/node/backing/candidate-backing.md @@ -1,5 +1,9 @@ # Candidate Backing +> NOTE: This module has suffered changes for the elastic scaling implementation. As a result, parts of this document may +be out of date and will be updated at a later time. Issue tracking the update: +https://github.com/paritytech/polkadot-sdk/issues/3699 + The Candidate Backing subsystem ensures every parablock considered for relay block inclusion has been seconded by at least one validator, and approved by a quorum. Parablocks for which not enough validators will assert correctness are discarded. If the block later proves invalid, the initial backers are slashable; this gives Polkadot a rational threat diff --git a/polkadot/roadmap/implementers-guide/src/node/backing/prospective-parachains.md b/polkadot/roadmap/implementers-guide/src/node/backing/prospective-parachains.md index 701f6c87caf..61278621cf5 100644 --- a/polkadot/roadmap/implementers-guide/src/node/backing/prospective-parachains.md +++ b/polkadot/roadmap/implementers-guide/src/node/backing/prospective-parachains.md @@ -1,5 +1,9 @@ # Prospective Parachains +> NOTE: This module has suffered changes for the elastic scaling implementation. As a result, parts of this document may +be out of date and will be updated at a later time. Issue tracking the update: +https://github.com/paritytech/polkadot-sdk/issues/3699 + ## Overview **Purpose:** Tracks and handles prospective parachain fragments and informs diff --git a/polkadot/roadmap/implementers-guide/src/node/collators/collator-protocol.md b/polkadot/roadmap/implementers-guide/src/node/collators/collator-protocol.md index 1fed671170c..432d9ab69ba 100644 --- a/polkadot/roadmap/implementers-guide/src/node/collators/collator-protocol.md +++ b/polkadot/roadmap/implementers-guide/src/node/collators/collator-protocol.md @@ -1,5 +1,9 @@ # Collator Protocol +> NOTE: This module has suffered changes for the elastic scaling implementation. As a result, parts of this document may +be out of date and will be updated at a later time. Issue tracking the update: +https://github.com/paritytech/polkadot-sdk/issues/3699 + The Collator Protocol implements the network protocol by which collators and validators communicate. It is used by collators to distribute collations to validators and used by validators to accept collations by collators. diff --git a/polkadot/roadmap/implementers-guide/src/node/utility/provisioner.md b/polkadot/roadmap/implementers-guide/src/node/utility/provisioner.md index b017259da8c..64727d39fab 100644 --- a/polkadot/roadmap/implementers-guide/src/node/utility/provisioner.md +++ b/polkadot/roadmap/implementers-guide/src/node/utility/provisioner.md @@ -1,5 +1,9 @@ # Provisioner +> NOTE: This module has suffered changes for the elastic scaling implementation. As a result, parts of this document may +be out of date and will be updated at a later time. Issue tracking the update: +https://github.com/paritytech/polkadot-sdk/issues/3699 + Relay chain block authorship authority is governed by BABE and is beyond the scope of the Overseer and the rest of the subsystems. That said, ultimately the block author needs to select a set of backable parachain candidates and other consensus data, and assemble a block from them. This subsystem is responsible for providing the necessary data to all diff --git a/polkadot/roadmap/implementers-guide/src/runtime/inclusion.md b/polkadot/roadmap/implementers-guide/src/runtime/inclusion.md index 0700a781d42..5031433cf5a 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/inclusion.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/inclusion.md @@ -1,5 +1,9 @@ # Inclusion Pallet +> NOTE: This module has suffered changes for the elastic scaling implementation. As a result, parts of this document may +be out of date and will be updated at a later time. Issue tracking the update: +https://github.com/paritytech/polkadot-sdk/issues/3699 + The inclusion module is responsible for inclusion and availability of scheduled parachains. It also manages the UMP dispatch queue of each parachain. diff --git a/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md b/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md index 7972c706b9e..f21e1a59c1a 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md @@ -1,5 +1,9 @@ # `ParaInherent` +> NOTE: This module has suffered changes for the elastic scaling implementation. As a result, parts of this document may +be out of date and will be updated at a later time. Issue tracking the update: +https://github.com/paritytech/polkadot-sdk/issues/3699 + This module is responsible for providing all data given to the runtime by the block author to the various parachains modules. The entry-point is mandatory, in that it must be invoked exactly once within every block, and it is also "inherent", in that it is provided with no origin by the block author. The data within it carries its own -- GitLab From 9403a5d40214b0d223c87c8d7b13139672edfe95 Mon Sep 17 00:00:00 2001 From: Francisco Aguirre Date: Tue, 9 Jul 2024 15:49:01 +0200 Subject: [PATCH 107/130] Add `MAX_INSTRUCTIONS_TO_DECODE` to XCMv2 (#4978) It was added to v4 and v3 but was missing from v2 --- polkadot/xcm/src/v2/mod.rs | 67 ++++++++++++++++++++++++++++++++++++-- prdoc/pr_4978.prdoc | 18 ++++++++++ 2 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 prdoc/pr_4978.prdoc diff --git a/polkadot/xcm/src/v2/mod.rs b/polkadot/xcm/src/v2/mod.rs index fe7f05dd887..1afc120f500 100644 --- a/polkadot/xcm/src/v2/mod.rs +++ b/polkadot/xcm/src/v2/mod.rs @@ -62,7 +62,10 @@ use super::{ }; use alloc::{vec, vec::Vec}; use bounded_collections::{ConstU32, WeakBoundedVec}; -use codec::{self, Decode, Encode, MaxEncodedLen}; +use codec::{ + self, decode_vec_with_len, Compact, Decode, Encode, Error as CodecError, Input as CodecInput, + MaxEncodedLen, +}; use core::{fmt::Debug, result}; use derivative::Derivative; use scale_info::TypeInfo; @@ -278,7 +281,7 @@ pub const VERSION: super::Version = 2; pub type QueryId = u64; /// DEPRECATED. Please use XCMv3 or XCMv4 instead. -#[derive(Derivative, Default, Encode, Decode, TypeInfo)] +#[derive(Derivative, Default, Encode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] #[codec(encode_bound())] #[codec(decode_bound())] @@ -286,6 +289,31 @@ pub type QueryId = u64; #[scale_info(replace_segment("staging_xcm", "xcm"))] pub struct Xcm(pub Vec>); +environmental::environmental!(instructions_count: u8); + +impl Decode for Xcm { + fn decode(input: &mut I) -> core::result::Result { + instructions_count::using_once(&mut 0, || { + let number_of_instructions: u32 = >::decode(input)?.into(); + instructions_count::with(|count| { + *count = count.saturating_add(number_of_instructions as u8); + if *count > MAX_INSTRUCTIONS_TO_DECODE { + return Err(CodecError::from("Max instructions exceeded")) + } + Ok(()) + }) + .unwrap_or(Ok(()))?; + let decoded_instructions = decode_vec_with_len(input, number_of_instructions as usize)?; + Ok(Self(decoded_instructions)) + }) + } +} + +/// The maximal number of instructions in an XCM before decoding fails. +/// +/// This is a deliberate limit - not a technical one. +pub const MAX_INSTRUCTIONS_TO_DECODE: u8 = 100; + impl Xcm { /// Create an empty instance. pub fn new() -> Self { @@ -1157,3 +1185,38 @@ impl TryFrom> for Instruction(vec![ClearOrigin; MAX_INSTRUCTIONS_TO_DECODE as usize]); + let encoded = max_xcm.encode(); + assert!(Xcm::<()>::decode(&mut &encoded[..]).is_ok()); + + let big_xcm = Xcm::<()>(vec![ClearOrigin; MAX_INSTRUCTIONS_TO_DECODE as usize + 1]); + let encoded = big_xcm.encode(); + assert!(Xcm::<()>::decode(&mut &encoded[..]).is_err()); + + let nested_xcm = Xcm::<()>(vec![ + DepositReserveAsset { + assets: All.into(), + dest: Here.into(), + xcm: max_xcm, + max_assets: 1, + }; + (MAX_INSTRUCTIONS_TO_DECODE / 2) as usize + ]); + let encoded = nested_xcm.encode(); + assert!(Xcm::<()>::decode(&mut &encoded[..]).is_err()); + + let even_more_nested_xcm = Xcm::<()>(vec![SetAppendix(nested_xcm); 64]); + let encoded = even_more_nested_xcm.encode(); + assert_eq!(encoded.len(), 345730); + // This should not decode since the limit is 100 + assert_eq!(MAX_INSTRUCTIONS_TO_DECODE, 100, "precondition"); + assert!(Xcm::<()>::decode(&mut &encoded[..]).is_err()); + } +} diff --git a/prdoc/pr_4978.prdoc b/prdoc/pr_4978.prdoc new file mode 100644 index 00000000000..1f86d512f2c --- /dev/null +++ b/prdoc/pr_4978.prdoc @@ -0,0 +1,18 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Add MAX_INSTRUCTIONS_TO_DECODE to XCMv2 + +doc: + - audience: Runtime User + description: | + Added a max number of instructions to XCMv2. If using XCMv2, you'll have to take this limit into account. + It was set to 100. + - audience: Runtime Dev + description: | + Added a max number of instructions to XCMv2. If using XCMv2, you'll have to take this limit into account. + It was set to 100. + +crates: + - name: staging-xcm + bump: minor -- GitLab From 9fd7b432fc201f05cb7a14d58771b2aa7f65bde1 Mon Sep 17 00:00:00 2001 From: James Wilson Date: Wed, 10 Jul 2024 17:42:07 +0100 Subject: [PATCH 108/130] Expose metadata-hash feature from polkadot crate (#4886) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enabling this feature when building the `polkadot ` crate will lead it to being enabled for the builtin westend and rococo runtimes. The result of that is that a merkleized metadata hash will be computed (at some time cost) in those runtimes, which will allow transactions which include a hash via the `CheckMetadataHash` extension to work. The idea is that this is useful for being able to test/experiment with the `CheckMetadataHash` extension against local nodes. --------- Co-authored-by: command-bot <> Co-authored-by: Bastian Köcher --- Cargo.lock | 4 ++-- polkadot/Cargo.toml | 5 +++++ polkadot/cli/Cargo.toml | 1 + polkadot/node/service/Cargo.toml | 7 +++++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index df96a2140ab..ab38930b1b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18528,9 +18528,9 @@ dependencies = [ [[package]] name = "scale-decode" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b12ebca36cec2a3f983c46295b282b35e5f8496346fb859a8776dad5389e5389" +checksum = "e98f3262c250d90e700bb802eb704e1f841e03331c2eb815e46516c4edbf5b27" dependencies = [ "derive_more", "parity-scale-codec", diff --git a/polkadot/Cargo.toml b/polkadot/Cargo.toml index 512783de948..3a939464868 100644 --- a/polkadot/Cargo.toml +++ b/polkadot/Cargo.toml @@ -68,6 +68,11 @@ jemalloc-allocator = [ "polkadot-overseer/jemalloc-allocator", ] +# Generate the metadata hash needed for CheckMetadataHash +# in the builtin test runtimes (westend and rococo). +metadata-hash = [ + "polkadot-cli/metadata-hash", +] # Enables timeout-based tests supposed to be run only in CI environment as they may be flaky # when run locally depending on system load diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index 9dcdb44ab64..da37f6062c5 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -49,6 +49,7 @@ substrate-build-script-utils = { workspace = true, default-features = true } [features] default = ["cli", "db", "full-node"] db = ["polkadot-service/db"] +metadata-hash = ["polkadot-service/metadata-hash"] service = ["dep:polkadot-service"] cli = [ "clap", diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml index 23cd51d8a04..c0ddbf7dcfc 100644 --- a/polkadot/node/service/Cargo.toml +++ b/polkadot/node/service/Cargo.toml @@ -201,6 +201,13 @@ rococo-native = [ "rococo-runtime-constants", ] +# Generate the metadata hash needed for CheckMetadataHash +# in the test runtimes. +metadata-hash = [ + "rococo-runtime?/metadata-hash", + "westend-runtime?/metadata-hash", +] + runtime-benchmarks = [ "frame-benchmarking-cli/runtime-benchmarks", "frame-benchmarking/runtime-benchmarks", -- GitLab From 02e50adf7ba6cc65a9ef5c332b3e2974c8d23f48 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:46:08 +0100 Subject: [PATCH 109/130] Explain usage of `` in FRAME storage + Update parachain pallet template (#4941) Explains one of the annoying parts of FRAME storage that we have seen multiple times in PBA everyone gets stuck on. I have not updated the other two templates for now, and only reflected it in the parachain template. That can happen in a follow-up. - [x] Update possible answers in SE about the same topic. --------- Co-authored-by: Serban Iorga Co-authored-by: command-bot <> --- Cargo.lock | 1 + docs/sdk/src/polkadot_sdk/frame_runtime.rs | 4 +- .../reference_docs/frame_storage_derives.rs | 199 ++++++++++++++++++ docs/sdk/src/reference_docs/mod.rs | 4 + substrate/frame/bags-list/src/list/tests.rs | 3 +- substrate/frame/nis/src/lib.rs | 8 +- substrate/frame/nomination-pools/src/lib.rs | 1 - substrate/frame/src/lib.rs | 42 +++- .../frame/state-trie-migration/src/lib.rs | 2 - substrate/frame/support/src/lib.rs | 12 ++ templates/minimal/README.md | 19 +- templates/minimal/pallets/template/src/lib.rs | 3 + .../parachain/pallets/template/Cargo.toml | 12 +- .../pallets/template/src/benchmarking.rs | 17 +- .../parachain/pallets/template/src/lib.rs | 91 +++++++- .../parachain/pallets/template/src/tests.rs | 2 +- 16 files changed, 365 insertions(+), 55 deletions(-) create mode 100644 docs/sdk/src/reference_docs/frame_storage_derives.rs diff --git a/Cargo.lock b/Cargo.lock index ab38930b1b0..3b46a2680e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11270,6 +11270,7 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", + "sp-std 14.0.0", ] [[package]] diff --git a/docs/sdk/src/polkadot_sdk/frame_runtime.rs b/docs/sdk/src/polkadot_sdk/frame_runtime.rs index f9b8a381365..39255c8f51a 100644 --- a/docs/sdk/src/polkadot_sdk/frame_runtime.rs +++ b/docs/sdk/src/polkadot_sdk/frame_runtime.rs @@ -87,8 +87,6 @@ //! * writing a runtime in pure Rust, as done in [this template](https://github.com/JoshOrndorff/frameless-node-template). //! * writing a runtime in AssemblyScript,as explored in [this project](https://github.com/LimeChain/subsembly). -use frame::prelude::*; - /// A FRAME based pallet. This `mod` is the entry point for everything else. All /// `#[pallet::xxx]` macros must be defined in this `mod`. Although, frame also provides an /// experimental feature to break these parts into different `mod`s. See [`pallet_examples`] for @@ -96,7 +94,7 @@ use frame::prelude::*; #[docify::export] #[frame::pallet(dev_mode)] pub mod pallet { - use super::*; + use frame::prelude::*; /// The configuration trait of a pallet. Mandatory. Allows a pallet to receive types at a /// later point from the runtime that wishes to contain it. It allows the pallet to be diff --git a/docs/sdk/src/reference_docs/frame_storage_derives.rs b/docs/sdk/src/reference_docs/frame_storage_derives.rs new file mode 100644 index 00000000000..3d9edef398a --- /dev/null +++ b/docs/sdk/src/reference_docs/frame_storage_derives.rs @@ -0,0 +1,199 @@ +//!

    +//! In all examples, a few lines of boilerplate have been hidden from each snippet for conciseness. +//!
    +//! +//! Let's begin by starting to store a `NewType` in a storage item: +//! +//! ```compile_fail +//! #[frame::pallet] +//! pub mod pallet { +//! # use frame::prelude::*; +//! # #[pallet::config] +//! # pub trait Config: frame_system::Config {} +//! # #[pallet::pallet] +//! # pub struct Pallet(_); +//! pub struct NewType(u32); +// +//! #[pallet::storage] +//! pub type Something = StorageValue<_, NewType>; +//! } +//! ``` +//! +//! This raises a number of compiler errors, like: +//! ```text +//! the trait `MaxEncodedLen` is not implemented for `NewType`, which is required by +//! `frame::prelude::StorageValue<_GeneratedPrefixForStorageSomething, NewType>: +//! StorageInfoTrait` +//! ``` +//! +//! This implies the following set of traits that need to be derived for a type to be stored in +//! `frame` storage: +//! ```rust +//! #[frame::pallet] +//! pub mod pallet { +//! # use frame::prelude::*; +//! # #[pallet::config] +//! # pub trait Config: frame_system::Config {} +//! # #[pallet::pallet] +//! # pub struct Pallet(_); +//! #[derive(codec::Encode, codec::Decode, codec::MaxEncodedLen, scale_info::TypeInfo)] +//! pub struct NewType(u32); +//! +//! #[pallet::storage] +//! pub type Something = StorageValue<_, NewType>; +//! } +//! ``` +//! +//! Next, let's look at how this will differ if we are to store a type that is derived from `T` in +//! storage, such as [`frame::prelude::BlockNumberFor`]: +//! ```compile_fail +//! #[frame::pallet] +//! pub mod pallet { +//! # use frame::prelude::*; +//! # #[pallet::config] +//! # pub trait Config: frame_system::Config {} +//! # #[pallet::pallet] +//! # pub struct Pallet(_); +//! #[derive(codec::Encode, codec::Decode, codec::MaxEncodedLen, scale_info::TypeInfo)] +//! pub struct NewType(BlockNumberFor); +//! +//! #[pallet::storage] +//! pub type Something = StorageValue<_, NewType>; +//! } +//! ``` +//! +//! Surprisingly, this will also raise a number of errors, like: +//! ```text +//! the trait `TypeInfo` is not implemented for `T`, which is required +//! by`frame_support::pallet_prelude::StorageValue, +//! pallet_2::NewType>:StorageEntryMetadataBuilder +//! ``` +//! +//! Why is that? The underlying reason is that the `TypeInfo` `derive` macro will only work for +//! `NewType` if all of `NewType`'s generics also implement `TypeInfo`. This is not the case for `T` +//! in the example above. +//! +//! If you expand an instance of the derive, you will find something along the lines of: +//! `impl TypeInfo for NewType where T: TypeInfo { ... }`. This is the reason why the +//! `TypeInfo` trait is required for `T`. +//! +//! To fix this, we need to add a `#[scale_info(skip_type_params(T))]` +//! attribute to `NewType`. This additional macro will instruct the `derive` to skip the bound on +//! `T`. +//! ```rust +//! #[frame::pallet] +//! pub mod pallet { +//! # use frame::prelude::*; +//! # #[pallet::config] +//! # pub trait Config: frame_system::Config {} +//! # #[pallet::pallet] +//! # pub struct Pallet(_); +//! #[derive(codec::Encode, codec::Decode, codec::MaxEncodedLen, scale_info::TypeInfo)] +//! #[scale_info(skip_type_params(T))] +//! pub struct NewType(BlockNumberFor); +//! +//! #[pallet::storage] +//! pub type Something = StorageValue<_, NewType>; +//! } +//! ``` +//! +//! Next, let's say we wish to store `NewType` as [`frame::prelude::ValueQuery`], which means it +//! must also implement `Default`. This should be as simple as adding `derive(Default)` to it, +//! right? +//! ```compile_fail +//! #[frame::pallet] +//! pub mod pallet { +//! # use frame::prelude::*; +//! # #[pallet::config] +//! # pub trait Config: frame_system::Config {} +//! # #[pallet::pallet] +//! # pub struct Pallet(_); +//! #[derive(codec::Encode, codec::Decode, codec::MaxEncodedLen, scale_info::TypeInfo, Default)] +//! #[scale_info(skip_type_params(T))] +//! pub struct NewType(BlockNumberFor); +//! +//! #[pallet::storage] +//! pub type Something = StorageValue<_, NewType, ValueQuery>; +//! } +//! ``` +//! +//! Under the hood, the expansion of the `derive(Default)` will suffer from the same restriction as +//! before: it will only work if `T: Default`, and `T` is not `Default`. Note that this is an +//! expected issue: `T` is merely a wrapper of many other types, such as `BlockNumberFor`. +//! `BlockNumberFor` should indeed implement `Default`, but `T` implementing `Default` is rather +//! meaningless. +//! +//! To fix this, frame provides a set of macros that are analogous to normal rust derive macros, but +//! work nicely on top of structs that are generic over `T: Config`. These macros are: +//! +//! - [`frame::prelude::DefaultNoBound`] +//! - [`frame::prelude::DebugNoBound`] +//! - [`frame::prelude::PartialEqNoBound`] +//! - [`frame::prelude::EqNoBound`] +//! - [`frame::prelude::CloneNoBound`] +//! - [`frame::prelude::PartialOrdNoBound`] +//! - [`frame::prelude::OrdNoBound`] +//! +//! The above traits are almost certainly needed for your tests: To print your type, assert equality +//! or clone it. +//! +//! We can fix the following example by using [`frame::prelude::DefaultNoBound`]. +//! ```rust +//! #[frame::pallet] +//! pub mod pallet { +//! # use frame::prelude::*; +//! # #[pallet::config] +//! # pub trait Config: frame_system::Config {} +//! # #[pallet::pallet] +//! # pub struct Pallet(_); +//! #[derive( +//! codec::Encode, +//! codec::Decode, +//! codec::MaxEncodedLen, +//! scale_info::TypeInfo, +//! DefaultNoBound +//! )] +//! #[scale_info(skip_type_params(T))] +//! pub struct NewType(BlockNumberFor); +//! +//! #[pallet::storage] +//! pub type Something = StorageValue<_, NewType, ValueQuery>; +//! } +//! ``` +//! +//! Finally, if a custom type that is provided through `Config` is to be stored in the storage, it +//! is subject to the same trait requirements. The following does not work: +//! ```compile_fail +//! #[frame::pallet] +//! pub mod pallet { +//! use frame::prelude::*; +//! #[pallet::config] +//! pub trait Config: frame_system::Config { +//! type CustomType; +//! } +//! #[pallet::pallet] +//! pub struct Pallet(_); +//! #[pallet::storage] +//! pub type Something = StorageValue<_, T::CustomType>; +//! } +//! ``` +//! +//! But adding the right trait bounds will fix it. +//! ```rust +//! #[frame::pallet] +//! pub mod pallet { +//! use frame::prelude::*; +//! #[pallet::config] +//! pub trait Config: frame_system::Config { +//! type CustomType: codec::FullCodec +//! + codec::MaxEncodedLen +//! + scale_info::TypeInfo +//! + Debug +//! + Default; +//! } +//! #[pallet::pallet] +//! pub struct Pallet(_); +//! #[pallet::storage] +//! pub type Something = StorageValue<_, T::CustomType>; +//! } +//! ``` diff --git a/docs/sdk/src/reference_docs/mod.rs b/docs/sdk/src/reference_docs/mod.rs index 688339b7e38..c69c7936542 100644 --- a/docs/sdk/src/reference_docs/mod.rs +++ b/docs/sdk/src/reference_docs/mod.rs @@ -45,6 +45,10 @@ pub mod signed_extensions; /// Learn about *Origins*, a topic in FRAME that enables complex account abstractions to be built. pub mod frame_origin; +/// Learn about the details of what derives are needed for a type to be store-able in `frame` +/// storage. +pub mod frame_storage_derives; + /// Learn about how to write safe and defensive code in your FRAME runtime. pub mod defensive_programming; diff --git a/substrate/frame/bags-list/src/list/tests.rs b/substrate/frame/bags-list/src/list/tests.rs index cd39b083172..e5fff76d75c 100644 --- a/substrate/frame/bags-list/src/list/tests.rs +++ b/substrate/frame/bags-list/src/list/tests.rs @@ -777,7 +777,8 @@ mod bags { assert_eq!(bag_1000.tail, Some(4)); assert_eq!(bag_1000.iter().count(), 3); bag_1000.insert_node_unchecked(node(4, None, None, bag_1000.bag_upper)); // panics in debug - assert_eq!(bag_1000.iter().count(), 3); // in release we expect it to silently ignore the request. + assert_eq!(bag_1000.iter().count(), 3); // in release we expect it to silently ignore the + // request. }); } diff --git a/substrate/frame/nis/src/lib.rs b/substrate/frame/nis/src/lib.rs index f38755836fb..d815ea6ac11 100644 --- a/substrate/frame/nis/src/lib.rs +++ b/substrate/frame/nis/src/lib.rs @@ -755,7 +755,13 @@ pub mod pallet { // We ignore this error as it just means the amount we're trying to deposit is // dust and the beneficiary account doesn't exist. .or_else( - |e| if e == TokenError::CannotCreate.into() { Ok(()) } else { Err(e) }, + |e| { + if e == TokenError::CannotCreate.into() { + Ok(()) + } else { + Err(e) + } + }, )?; summary.receipts_on_hold.saturating_reduce(on_hold); } diff --git a/substrate/frame/nomination-pools/src/lib.rs b/substrate/frame/nomination-pools/src/lib.rs index 2aaea044636..2b5fe8b6041 100644 --- a/substrate/frame/nomination-pools/src/lib.rs +++ b/substrate/frame/nomination-pools/src/lib.rs @@ -494,7 +494,6 @@ impl ClaimPermission { frame_support::PartialEqNoBound, )] #[cfg_attr(feature = "std", derive(DefaultNoBound))] -#[codec(mel_bound(T: Config))] #[scale_info(skip_type_params(T))] pub struct PoolMember { /// The identifier of the pool to which `who` belongs. diff --git a/substrate/frame/src/lib.rs b/substrate/frame/src/lib.rs index e41f7f1c0ef..e09d8fc4fa1 100644 --- a/substrate/frame/src/lib.rs +++ b/substrate/frame/src/lib.rs @@ -30,13 +30,43 @@ //! > **F**ramework for **R**untime **A**ggregation of **M**odularized **E**ntities: Substrate's //! > State Transition Function (Runtime) Framework. //! -//! ## Documentation +//! //! ## Usage //! -//! See [`polkadot_sdk::frame`](../polkadot_sdk_docs/polkadot_sdk/frame_runtime/index.html). +//! The main intended use of this crate is for it to be imported with its preludes: //! -//! ## WARNING: Experimental +//! ``` +//! # use polkadot_sdk_frame as frame; +//! #[frame::pallet] +//! pub mod pallet { +//! # use polkadot_sdk_frame as frame; +//! use frame::prelude::*; +//! // ^^ using the prelude! //! -//! **This crate and all of its content is experimental, and should not yet be used in production.** +//! #[pallet::config] +//! pub trait Config: frame_system::Config {} +//! +//! #[pallet::pallet] +//! pub struct Pallet(_); +//! } +//! +//! pub mod tests { +//! # use polkadot_sdk_frame as frame; +//! use frame::testing_prelude::*; +//! } +//! +//! pub mod runtime { +//! # use polkadot_sdk_frame as frame; +//! use frame::runtime::prelude::*; +//! } +//! ``` +//! +//! See: [`prelude`], [`testing_prelude`] and [`runtime::prelude`]. +//! +//! Please note that this crate can only be imported as `polkadot-sdk-frame` or `frame`. +//! +//! ## Documentation +//! +//! See [`polkadot_sdk::frame`](../polkadot_sdk_docs/polkadot_sdk/frame_runtime/index.html). //! //! ## Underlying dependencies //! @@ -46,9 +76,9 @@ //! In short, this crate only re-exports types and traits from multiple sources. All of these //! sources are listed (and re-exported again) in [`deps`]. //! -//! ## Usage +//! ## WARNING: Experimental //! -//! Please note that this crate can only be imported as `polkadot-sdk-frame` or `frame`. +//! **This crate and all of its content is experimental, and should not yet be used in production.** #![cfg_attr(not(feature = "std"), no_std)] #![cfg(feature = "experimental")] diff --git a/substrate/frame/state-trie-migration/src/lib.rs b/substrate/frame/state-trie-migration/src/lib.rs index 4ec649f9080..22ad640d3bd 100644 --- a/substrate/frame/state-trie-migration/src/lib.rs +++ b/substrate/frame/state-trie-migration/src/lib.rs @@ -109,7 +109,6 @@ pub mod pallet { MaxEncodedLen, )] #[scale_info(skip_type_params(MaxKeyLen))] - #[codec(mel_bound())] pub enum Progress> { /// Yet to begin. ToStart, @@ -126,7 +125,6 @@ pub mod pallet { /// /// It tracks the last top and child keys read. #[derive(Clone, Encode, Decode, scale_info::TypeInfo, PartialEq, Eq, MaxEncodedLen)] - #[codec(mel_bound(T: Config))] #[scale_info(skip_type_params(T))] pub struct MigrationTask { /// The current top trie migration progress. diff --git a/substrate/frame/support/src/lib.rs b/substrate/frame/support/src/lib.rs index 138091689a5..94f4b9dd4bd 100644 --- a/substrate/frame/support/src/lib.rs +++ b/substrate/frame/support/src/lib.rs @@ -2297,6 +2297,18 @@ pub mod pallet_macros { /// } /// ``` /// + /// ### Value Trait Bounds + /// + /// To use a type as the value of a storage type, be it `StorageValue`, `StorageMap` or + /// anything else, you need to meet a number of trait bound constraints. + /// + /// See: . + /// + /// Notably, all value types need to implement `Encode`, `Decode`, `MaxEncodedLen` and + /// `TypeInfo`, and possibly `Default`, if + /// [`ValueQuery`](frame_support::storage::types::ValueQuery) is used, explained in the + /// next section. + /// /// ### QueryKind /// /// Every storage type mentioned above has a generic type called diff --git a/templates/minimal/README.md b/templates/minimal/README.md index eaa21a05ee8..b556a453608 100644 --- a/templates/minimal/README.md +++ b/templates/minimal/README.md @@ -37,21 +37,6 @@ A Polkadot SDK based project such as this one consists of: * 🛠️ Depending on your operating system and Rust version, there might be additional packages required to compile this template - please take note of the Rust compiler output. -## Customization - -In case you would like to change the pallet's name from `pallet-minimal-template` to `pallet-test`, -you would need to implement the following changes: -* Change the pallet folder name from `template` to `test` for consistency -* Also for consistency, in `/runtime/src/lib.rs`, change from `pub type Template` to `pub type Test`, -and don't forget to also customize the corresponding comments. -* Change `pallet-minimal-template` to `pallet-test` in the following files: - * `/runtime/Cargo.toml` - * `/runtime/src/lib.rs` - * `/pallets/test/Cargo.toml` - * `/src/lib.rs` -* Change `pallet_minimal_template` to `pallet_test` in the following files: - * `/runtime/src/lib.rs` - ### Build 🔨 Use the following command to build the node without launching it: @@ -80,8 +65,8 @@ docker run --rm polkadot-sdk-minimal-template --dev Development chains: * 🧹 Do not persist the state. -* 💰 Are preconfigured with a genesis state that includes several pre-funded development accounts. -* 🧑‍⚖️ Development accounts are used as `sudo` accounts. +* 💰 Are pre-configured with a genesis state that includes several pre-funded development accounts. +* 🧑‍⚖️ One development account (`ALICE`) is used as `sudo` accounts. ### Connect with the Polkadot-JS Apps Front-End diff --git a/templates/minimal/pallets/template/src/lib.rs b/templates/minimal/pallets/template/src/lib.rs index 713f014bbe6..92b90ad4412 100644 --- a/templates/minimal/pallets/template/src/lib.rs +++ b/templates/minimal/pallets/template/src/lib.rs @@ -1,4 +1,7 @@ //! A shell pallet built with [`frame`]. +//! +//! To get started with this pallet, try implementing the guide in +//! #![cfg_attr(not(feature = "std"), no_std)] diff --git a/templates/parachain/pallets/template/Cargo.toml b/templates/parachain/pallets/template/Cargo.toml index 250895843e4..3b651ce427f 100644 --- a/templates/parachain/pallets/template/Cargo.toml +++ b/templates/parachain/pallets/template/Cargo.toml @@ -25,10 +25,13 @@ frame-benchmarking = { optional = true, workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } +# primitive deps +sp-runtime = { workspace = true } +sp-std = { workspace = true } + [dev-dependencies] sp-core = { workspace = true, default-features = true } sp-io = { workspace = true, default-features = true } -sp-runtime = { workspace = true, default-features = true } [features] default = ["std"] @@ -40,13 +43,14 @@ runtime-benchmarks = [ ] std = [ "codec/std", + "scale-info/std", + "frame-benchmarking?/std", "frame-support/std", "frame-system/std", - "scale-info/std", - "sp-core/std", - "sp-io/std", + "sp-runtime/std", + "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/templates/parachain/pallets/template/src/benchmarking.rs b/templates/parachain/pallets/template/src/benchmarking.rs index d1a9554aed6..5acad6e60de 100644 --- a/templates/parachain/pallets/template/src/benchmarking.rs +++ b/templates/parachain/pallets/template/src/benchmarking.rs @@ -1,34 +1,33 @@ //! Benchmarking setup for pallet-template #![cfg(feature = "runtime-benchmarks")] -use super::*; -#[allow(unused)] -use crate::Pallet as Template; +use super::*; use frame_benchmarking::v2::*; -use frame_system::RawOrigin; #[benchmarks] mod benchmarks { use super::*; + #[cfg(test)] + use crate::pallet::Pallet as Template; + use frame_system::RawOrigin; #[benchmark] fn do_something() { - let value = 100u32; let caller: T::AccountId = whitelisted_caller(); #[extrinsic_call] - do_something(RawOrigin::Signed(caller), value); + do_something(RawOrigin::Signed(caller), 100); - assert_eq!(Something::::get(), Some(value)); + assert_eq!(Something::::get().map(|v| v.block_number), Some(100u32.into())); } #[benchmark] fn cause_error() { - Something::::put(100u32); + Something::::put(CompositeStruct { block_number: 100u32.into() }); let caller: T::AccountId = whitelisted_caller(); #[extrinsic_call] cause_error(RawOrigin::Signed(caller)); - assert_eq!(Something::::get(), Some(101u32)); + assert_eq!(Something::::get().map(|v| v.block_number), Some(101u32.into())); } impl_benchmark_test_suite!(Template, crate::mock::new_test_ext(), crate::mock::Test); diff --git a/templates/parachain/pallets/template/src/lib.rs b/templates/parachain/pallets/template/src/lib.rs index 0420e2b9082..6bfb98972ae 100644 --- a/templates/parachain/pallets/template/src/lib.rs +++ b/templates/parachain/pallets/template/src/lib.rs @@ -1,3 +1,50 @@ +//! # Template Pallet +//! +//! A pallet with minimal functionality to help developers understand the essential components of +//! writing a FRAME pallet. It is typically used in beginner tutorials or in Polkadot SDK template +//! as a starting point for creating a new pallet and **not meant to be used in production**. +//! +//! ## Overview +//! +//! This template pallet contains basic examples of: +//! - declaring a storage item that stores a single block-number +//! - declaring and using events +//! - declaring and using errors +//! - a dispatchable function that allows a user to set a new value to storage and emits an event +//! upon success +//! - another dispatchable function that causes a custom error to be thrown +//! +//! Each pallet section is annotated with an attribute using the `#[pallet::...]` procedural macro. +//! This macro generates the necessary code for a pallet to be aggregated into a FRAME runtime. +//! +//! To get started with pallet development, consider using this tutorial: +//! +//! +//! +//! And reading the main documentation of the `frame` crate: +//! +//! +//! +//! And looking at the frame [`kitchen-sink`](https://paritytech.github.io/polkadot-sdk/master/pallet_example_kitchensink/index.html) +//! pallet, a showcase of all pallet macros. +//! +//! ### Pallet Sections +//! +//! The pallet sections in this template are: +//! +//! - A **configuration trait** that defines the types and parameters which the pallet depends on +//! (denoted by the `#[pallet::config]` attribute). See: [`Config`]. +//! - A **means to store pallet-specific data** (denoted by the `#[pallet::storage]` attribute). +//! See: [`storage_types`]. +//! - A **declaration of the events** this pallet emits (denoted by the `#[pallet::event]` +//! attribute). See: [`Event`]. +//! - A **declaration of the errors** that this pallet can throw (denoted by the `#[pallet::error]` +//! attribute). See: [`Error`]. +//! - A **set of dispatchable functions** that define the pallet's functionality (denoted by the +//! `#[pallet::call]` attribute). See: [`dispatchables`]. +//! +//! Run `cargo doc --package pallet-template --open` to view this pallet's documentation. + #![cfg_attr(not(feature = "std"), no_std)] pub use pallet::*; @@ -21,8 +68,9 @@ mod benchmarking; // #[frame_support::pallet] pub mod pallet { - use frame_support::{dispatch::DispatchResultWithPostInfo, pallet_prelude::*}; + use frame_support::{dispatch::DispatchResultWithPostInfo, pallet_prelude::*, DefaultNoBound}; use frame_system::pallet_prelude::*; + use sp_runtime::traits::{CheckedAdd, One}; /// Configure the pallet by specifying the parameters and types on which it depends. #[pallet::config] @@ -38,11 +86,22 @@ pub mod pallet { #[pallet::pallet] pub struct Pallet(_); + /// A struct to store a single block-number. Has all the right derives to store it in storage. + /// + #[derive( + Encode, Decode, MaxEncodedLen, TypeInfo, CloneNoBound, PartialEqNoBound, DefaultNoBound, + )] + #[scale_info(skip_type_params(T))] + pub struct CompositeStruct { + /// A block number. + pub(crate) block_number: BlockNumberFor, + } + /// The pallet's storage items. /// /// #[pallet::storage] - pub type Something = StorageValue<_, u32>; + pub type Something = StorageValue<_, CompositeStruct>; /// Pallets use events to inform users when important changes are made. /// @@ -50,7 +109,7 @@ pub mod pallet { #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { /// We usually use passive tense for events. - SomethingStored { something: u32, who: T::AccountId }, + SomethingStored { block_number: BlockNumberFor, who: T::AccountId }, } /// Errors inform users that something went wrong. @@ -76,19 +135,23 @@ pub mod pallet { /// storage and emits an event. This function must be dispatched by a signed extrinsic. #[pallet::call_index(0)] #[pallet::weight(Weight::from_parts(10_000, 0) + T::DbWeight::get().writes(1))] - pub fn do_something(origin: OriginFor, something: u32) -> DispatchResultWithPostInfo { + pub fn do_something(origin: OriginFor, bn: u32) -> DispatchResultWithPostInfo { // Check that the extrinsic was signed and get the signer. // This function will return an error if the extrinsic is not signed. // let who = ensure_signed(origin)?; + // Convert the u32 into a block number. This is possible because the set of trait bounds + // defined in [`frame_system::Config::BlockNumber`]. + let block_number: BlockNumberFor = bn.into(); + // Update storage. - >::put(something); + >::put(CompositeStruct { block_number }); // Emit an event. - Self::deposit_event(Event::SomethingStored { something, who }); + Self::deposit_event(Event::SomethingStored { block_number, who }); - // Return a successful DispatchResultWithPostInfo + // Return a successful [`DispatchResultWithPostInfo`] or [`DispatchResult`]. Ok(().into()) } @@ -102,11 +165,19 @@ pub mod pallet { match >::get() { // Return an error if the value has not been set. None => Err(Error::::NoneValue)?, - Some(old) => { + Some(mut old) => { // Increment the value read from storage; will error in the event of overflow. - let new = old.checked_add(1).ok_or(Error::::StorageOverflow)?; + old.block_number = old + .block_number + .checked_add(&One::one()) + // ^^ equivalent is to: + // .checked_add(&1u32.into()) + // both of which build a `One` instance for the type `BlockNumber`. + .ok_or(Error::::StorageOverflow)?; // Update the value in storage with the incremented result. - >::put(new); + >::put(old); + // Explore how you can rewrite this using + // [`frame_support::storage::StorageValue::mutate`]. Ok(().into()) }, } diff --git a/templates/parachain/pallets/template/src/tests.rs b/templates/parachain/pallets/template/src/tests.rs index 9ad3076be2c..a4a41af63c2 100644 --- a/templates/parachain/pallets/template/src/tests.rs +++ b/templates/parachain/pallets/template/src/tests.rs @@ -7,7 +7,7 @@ fn it_works_for_default_value() { // Dispatch a signed extrinsic. assert_ok!(TemplateModule::do_something(RuntimeOrigin::signed(1), 42)); // Read pallet storage and assert an expected result. - assert_eq!(Something::::get(), Some(42)); + assert_eq!(Something::::get().map(|v| v.block_number), Some(42)); }); } -- GitLab From 6dd777ffe62cff936e04a76134ccf07de9dee429 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Thu, 11 Jul 2024 15:02:14 +0200 Subject: [PATCH 110/130] fixed cmd bot commenting not working (#5000) Fixed the mentioned issue: https://github.com/paritytech/command-bot/issues/113#issuecomment-2222277552 Now it will properly comment when the old bot gets triggered. --- .github/workflows/command-inform.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/command-inform.yml b/.github/workflows/command-inform.yml index 1c7323c998d..2825f4a6046 100644 --- a/.github/workflows/command-inform.yml +++ b/.github/workflows/command-inform.yml @@ -7,9 +7,15 @@ on: jobs: comment: runs-on: ubuntu-latest + if: github.event.issue.pull_request && startsWith(github.event.comment.body, 'bot ') steps: - name: Inform that the new command exist - if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, 'bot ') }} - run: gh pr comment ${{ github.event.issue.number }} --body 'We are migrating this bot to be a GitHub Action

    Please, see the
    documentation on how to use it' - env: - GH_TOKEN: ${{ github.token }} + uses: actions/github-script@v7 + with: + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'We are migrating the command bot to be a GitHub Action

    Please, see the documentation on how to use it' + }) -- GitLab From 53598b8ef5c17d4328dab47f1540bfa80649b1a0 Mon Sep 17 00:00:00 2001 From: Jun Jiang Date: Fri, 12 Jul 2024 07:35:46 +0800 Subject: [PATCH 111/130] Remove usage of `sp-std` on templates (#5001) Following PR for https://github.com/paritytech/polkadot-sdk/pull/4941 that removes usage of `sp-std` on templates `sp-std` crate was proposed to deprecate on https://github.com/paritytech/polkadot-sdk/issues/2101 @kianenigma --------- Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --- Cargo.lock | 3 --- templates/parachain/pallets/template/Cargo.toml | 2 -- templates/parachain/runtime/Cargo.toml | 2 -- templates/parachain/runtime/src/apis.rs | 6 +++--- templates/parachain/runtime/src/lib.rs | 3 ++- templates/solochain/runtime/Cargo.toml | 2 -- templates/solochain/runtime/src/lib.rs | 5 +++-- 7 files changed, 8 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3b46a2680e8..33475d9b619 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11270,7 +11270,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -12152,7 +12151,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-transaction-pool", "sp-version", "staging-parachain-info", @@ -19840,7 +19838,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", diff --git a/templates/parachain/pallets/template/Cargo.toml b/templates/parachain/pallets/template/Cargo.toml index 3b651ce427f..dde86310137 100644 --- a/templates/parachain/pallets/template/Cargo.toml +++ b/templates/parachain/pallets/template/Cargo.toml @@ -27,7 +27,6 @@ frame-system = { workspace = true } # primitive deps sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-core = { workspace = true, default-features = true } @@ -50,7 +49,6 @@ std = [ "frame-system/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/templates/parachain/runtime/Cargo.toml b/templates/parachain/runtime/Cargo.toml index de0ecad9b06..939fa245d2a 100644 --- a/templates/parachain/runtime/Cargo.toml +++ b/templates/parachain/runtime/Cargo.toml @@ -62,7 +62,6 @@ sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -136,7 +135,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-transaction-pool/std", "sp-version/std", "substrate-wasm-builder", diff --git a/templates/parachain/runtime/src/apis.rs b/templates/parachain/runtime/src/apis.rs index bc3c3808fb7..f5d5d3e6302 100644 --- a/templates/parachain/runtime/src/apis.rs +++ b/templates/parachain/runtime/src/apis.rs @@ -24,6 +24,7 @@ // For more information, please refer to // External crates imports +use alloc::vec::Vec; use frame_support::{ genesis_builder_helper::{build_state, get_preset}, weights::Weight, @@ -37,7 +38,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, }; -use sp_std::prelude::Vec; use sp_version::RuntimeVersion; // Local module imports @@ -106,7 +106,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> Vec { Runtime::metadata_versions() } } @@ -264,7 +264,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } diff --git a/templates/parachain/runtime/src/lib.rs b/templates/parachain/runtime/src/lib.rs index 3a9fee38f24..012ad1d097b 100644 --- a/templates/parachain/runtime/src/lib.rs +++ b/templates/parachain/runtime/src/lib.rs @@ -12,6 +12,8 @@ mod benchmarks; mod configs; mod weights; +extern crate alloc; +use alloc::{boxed::Box, vec::Vec}; use smallvec::smallvec; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, @@ -19,7 +21,6 @@ use sp_runtime::{ MultiSignature, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; diff --git a/templates/solochain/runtime/Cargo.toml b/templates/solochain/runtime/Cargo.toml index af1cd466ea0..f06c80b9a03 100644 --- a/templates/solochain/runtime/Cargo.toml +++ b/templates/solochain/runtime/Cargo.toml @@ -53,7 +53,6 @@ sp-runtime = { features = [ "serde", ], workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { features = [ @@ -109,7 +108,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/templates/solochain/runtime/src/lib.rs b/templates/solochain/runtime/src/lib.rs index c147845fe2f..936ecd1bd38 100644 --- a/templates/solochain/runtime/src/lib.rs +++ b/templates/solochain/runtime/src/lib.rs @@ -3,6 +3,8 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +extern crate alloc; +use alloc::{boxed::Box, vec, vec::Vec}; use pallet_grandpa::AuthorityId as GrandpaId; use sp_api::impl_runtime_apis; use sp_consensus_aura::sr25519::AuthorityId as AuraId; @@ -13,7 +15,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, MultiSignature, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -370,7 +371,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> Vec { Runtime::metadata_versions() } } -- GitLab From 2a555c333f6f4aabe685e401652d86f230759b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 12 Jul 2024 10:18:00 +0200 Subject: [PATCH 112/130] xcm-executor: Improve logging (#4996) This improves logging in the xcm-executor to have better debugability when executing a XCM message. --- Cargo.lock | 2 +- polkadot/xcm/xcm-executor/Cargo.toml | 4 +- polkadot/xcm/xcm-executor/src/lib.rs | 148 +++++++++++------- .../xcm/xcm-executor/src/traits/conversion.rs | 40 ++++- .../xcm-executor/src/traits/should_execute.rs | 38 +++-- .../xcm-executor/src/traits/token_matching.rs | 8 +- .../xcm-executor/src/traits/transact_asset.rs | 52 +++--- .../xcm/xcm-executor/src/traits/weight.rs | 30 +++- .../frame/support/src/traits/messages.rs | 2 +- 9 files changed, 208 insertions(+), 116 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 33475d9b619..43601b85ca2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21097,7 +21097,6 @@ dependencies = [ "frame-benchmarking", "frame-support", "impl-trait-for-tuples", - "log", "parity-scale-codec", "scale-info", "sp-arithmetic", @@ -21107,6 +21106,7 @@ dependencies = [ "sp-std 14.0.0", "sp-weights", "staging-xcm", + "tracing", ] [[package]] diff --git a/polkadot/xcm/xcm-executor/Cargo.toml b/polkadot/xcm/xcm-executor/Cargo.toml index 8f7b94612b5..7d1fc48692f 100644 --- a/polkadot/xcm/xcm-executor/Cargo.toml +++ b/polkadot/xcm/xcm-executor/Cargo.toml @@ -22,7 +22,7 @@ sp-core = { workspace = true } sp-runtime = { workspace = true } sp-weights = { workspace = true } frame-support = { workspace = true } -log = { workspace = true } +tracing = { workspace = true } frame-benchmarking = { optional = true, workspace = true } [features] @@ -37,7 +37,6 @@ std = [ "environmental/std", "frame-benchmarking/std", "frame-support/std", - "log/std", "scale-info/std", "sp-arithmetic/std", "sp-core/std", @@ -45,5 +44,6 @@ std = [ "sp-runtime/std", "sp-std/std", "sp-weights/std", + "tracing/std", "xcm/std", ] diff --git a/polkadot/xcm/xcm-executor/src/lib.rs b/polkadot/xcm/xcm-executor/src/lib.rs index da9de93ca0f..aeeb24dcf81 100644 --- a/polkadot/xcm/xcm-executor/src/lib.rs +++ b/polkadot/xcm/xcm-executor/src/lib.rs @@ -208,9 +208,12 @@ impl ExecuteXcm for XcmExecutor Outcome { let origin = origin.into(); - log::trace!( + tracing::trace!( target: "xcm::execute", - "origin: {origin:?}, message: {message:?}, weight_credit: {weight_credit:?}", + ?origin, + ?message, + ?weight_credit, + "Executing message", ); let mut properties = Properties { weight_credit, message_id: None }; @@ -226,10 +229,13 @@ impl ExecuteXcm for XcmExecutor ExecuteXcm for XcmExecutor for frame_benchmarking::BenchmarkError { fn from(error: ExecutorError) -> Self { - log::error!( - "XCM ERROR >> Index: {:?}, Error: {:?}, Weight: {:?}", - error.index, - error.xcm_error, - error.weight + tracing::error!( + index = ?error.index, + xcm_error = ?error.xcm_error, + weight = ?error.weight, + "XCM ERROR", ); Self::Stop("xcm executor error: see error logs") } @@ -326,10 +332,12 @@ impl XcmExecutor { let mut weight_used = xcm_weight.saturating_sub(self.total_surplus); if !self.holding.is_empty() { - log::trace!( + tracing::trace!( target: "xcm::post_process", - "Trapping assets in holding register: {:?}, context: {:?} (original_origin: {:?})", - self.holding, self.context, self.original_origin, + holding_register = ?self.holding, + context = ?self.context, + original_origin = ?self.original_origin, + "Trapping assets in holding register", ); let effective_origin = self.context.origin.as_ref().unwrap_or(&self.original_origin); let trap_weight = @@ -342,7 +350,13 @@ impl XcmExecutor { // TODO: #2841 #REALWEIGHT We should deduct the cost of any instructions following // the error which didn't end up being executed. Some((_i, e)) => { - log::trace!(target: "xcm::post_process", "Execution errored at {:?}: {:?} (original_origin: {:?})", _i, e, self.original_origin); + tracing::trace!( + target: "xcm::post_process", + instruction = ?_i, + error = ?e, + original_origin = ?self.original_origin, + "Execution failed", + ); Outcome::Incomplete { used: weight_used, error: e } }, } @@ -363,8 +377,12 @@ impl XcmExecutor { msg: Xcm<()>, reason: FeeReason, ) -> Result { - log::trace!( - target: "xcm::send", "Sending msg: {msg:?}, to destination: {dest:?}, (reason: {reason:?})" + tracing::trace!( + target: "xcm::send", + ?msg, + destination = ?dest, + reason = ?reason, + "Sending msg", ); let (ticket, fee) = validate_send::(dest, msg)?; self.take_fee(fee, reason)?; @@ -400,7 +418,12 @@ impl XcmExecutor { // `holding_limit` items (which has a best case outcome of holding.len() == holding_limit), // then the operation is guaranteed to succeed. let worst_case_holding_len = self.holding.len() + assets_length; - log::trace!(target: "xcm::ensure_can_subsume_assets", "worst_case_holding_len: {:?}, holding_limit: {:?}", worst_case_holding_len, self.holding_limit); + tracing::trace!( + target: "xcm::ensure_can_subsume_assets", + ?worst_case_holding_len, + holding_limit = ?self.holding_limit, + "Ensuring subsume assets work", + ); ensure!(worst_case_holding_len <= self.holding_limit * 2, XcmError::HoldingWouldOverflow); Ok(()) } @@ -408,12 +431,12 @@ impl XcmExecutor { /// Refund any unused weight. fn refund_surplus(&mut self) -> Result<(), XcmError> { let current_surplus = self.total_surplus.saturating_sub(self.total_refunded); - log::trace!( + tracing::trace!( target: "xcm::refund_surplus", - "total_surplus: {:?}, total_refunded: {:?}, current_surplus: {:?}", - self.total_surplus, - self.total_refunded, - current_surplus, + total_surplus = ?self.total_surplus, + total_refunded = ?self.total_refunded, + ?current_surplus, + "Refunding surplus", ); if current_surplus.any_gt(Weight::zero()) { if let Some(w) = self.trader.refund_weight(current_surplus, &self.context) { @@ -426,7 +449,7 @@ impl XcmExecutor { .defensive_proof( "refund_weight returned an asset capable of buying weight; qed", ); - log::error!( + tracing::error!( target: "xcm::refund_surplus", "error: HoldingWouldOverflow", ); @@ -436,10 +459,9 @@ impl XcmExecutor { self.holding.subsume_assets(w.into()); } } - log::trace!( + tracing::trace!( target: "xcm::refund_surplus", - "total_refunded: {:?}", - self.total_refunded, + total_refunded = ?self.total_refunded, ); Ok(()) } @@ -448,13 +470,13 @@ impl XcmExecutor { if Config::FeeManager::is_waived(self.origin_ref(), reason.clone()) { return Ok(()) } - log::trace!( + tracing::trace!( target: "xcm::fees", - "taking fee: {:?} from origin_ref: {:?} in fees_mode: {:?} for a reason: {:?}", - fee, - self.origin_ref(), - self.fees_mode, - reason, + ?fee, + origin_ref = ?self.origin_ref(), + fees_mode = ?self.fees_mode, + ?reason, + "Taking fees", ); let paid = if self.fees_mode.jit_withdraw { let origin = self.origin_ref().ok_or(XcmError::BadOrigin)?; @@ -507,7 +529,7 @@ impl XcmExecutor { let reanchor_context = Config::UniversalLocation::get(); let reanchored = reanchorable.reanchored(&destination, &reanchor_context).map_err(|error| { - log::error!(target: "xcm::reanchor", "Failed reanchoring with error {error:?}"); + tracing::error!(target: "xcm::reanchor", ?error, "Failed reanchoring with error"); XcmError::ReanchorFailed })?; Ok((reanchored, reanchor_context)) @@ -530,13 +552,12 @@ impl XcmExecutor { } fn process(&mut self, xcm: Xcm) -> Result<(), ExecutorError> { - log::trace!( + tracing::trace!( target: "xcm::process", - "origin: {:?}, total_surplus/refunded: {:?}/{:?}, error_handler_weight: {:?}", - self.origin_ref(), - self.total_surplus, - self.total_refunded, - self.error_handler_weight, + origin = ?self.origin_ref(), + total_surplus = ?self.total_surplus, + total_refunded = ?self.total_refunded, + error_handler_weight = ?self.error_handler_weight, ); let mut result = Ok(()); for (i, instr) in xcm.0.into_iter().enumerate() { @@ -566,7 +587,7 @@ impl XcmExecutor { self.process_instruction(instr) }); if let Err(e) = inst_res { - log::trace!(target: "xcm::execute", "!!! ERROR: {:?}", e); + tracing::trace!(target: "xcm::execute", "!!! ERROR: {:?}", e); *r = Err(ExecutorError { index: i as u32, xcm_error: e, @@ -588,11 +609,12 @@ impl XcmExecutor { &mut self, instr: Instruction, ) -> Result<(), XcmError> { - log::trace!( + tracing::trace!( target: "xcm::process_instruction", - "=== {:?}", - instr + instruction = ?instr, + "Processing instruction", ); + match instr { WithdrawAsset(assets) => { let origin = self.origin_ref().ok_or(XcmError::BadOrigin)?; @@ -694,7 +716,7 @@ impl XcmExecutor { Transact { origin_kind, require_weight_at_most, mut call } => { // We assume that the Relay-chain is allowed to use transact on this parachain. let origin = self.cloned_origin().ok_or_else(|| { - log::trace!( + tracing::trace!( target: "xcm::process_instruction::transact", "No origin provided", ); @@ -704,7 +726,7 @@ impl XcmExecutor { // TODO: #2841 #TRANSACTFILTER allow the trait to issue filters for the relay-chain let message_call = call.take_decoded().map_err(|_| { - log::trace!( + tracing::trace!( target: "xcm::process_instruction::transact", "Failed to decode call", ); @@ -712,13 +734,14 @@ impl XcmExecutor { XcmError::FailedToDecode })?; - log::trace!( + tracing::trace!( target: "xcm::process_instruction::transact", - "Processing call: {message_call:?}", + ?call, + "Processing call", ); if !Config::SafeCallFilter::contains(&message_call) { - log::trace!( + tracing::trace!( target: "xcm::process_instruction::transact", "Call filtered by `SafeCallFilter`", ); @@ -729,26 +752,31 @@ impl XcmExecutor { let dispatch_origin = Config::OriginConverter::convert_origin(origin.clone(), origin_kind).map_err( |_| { - log::trace!( + tracing::trace!( target: "xcm::process_instruction::transact", - "Failed to convert origin {origin:?} and origin kind {origin_kind:?} to a local origin." + ?origin, + ?origin_kind, + "Failed to convert origin to a local origin." ); XcmError::BadOrigin }, )?; - log::trace!( + tracing::trace!( target: "xcm::process_instruction::transact", - "Dispatching with origin: {dispatch_origin:?}", + origin = ?dispatch_origin, + "Dispatching with origin", ); let weight = message_call.get_dispatch_info().weight; if !weight.all_lte(require_weight_at_most) { - log::trace!( + tracing::trace!( target: "xcm::process_instruction::transact", - "Max {weight} bigger than require at most {require_weight_at_most}", + %weight, + %require_weight_at_most, + "Max weight bigger than require at most", ); return Err(XcmError::MaxWeightInvalid) @@ -757,17 +785,19 @@ impl XcmExecutor { let maybe_actual_weight = match Config::CallDispatcher::dispatch(message_call, dispatch_origin) { Ok(post_info) => { - log::trace!( + tracing::trace!( target: "xcm::process_instruction::transact", - "Dispatch successful: {post_info:?}" + ?post_info, + "Dispatch successful" ); self.transact_status = MaybeErrorCode::Success; post_info.actual_weight }, Err(error_and_info) => { - log::trace!( + tracing::trace!( target: "xcm::process_instruction::transact", - "Dispatch failed {error_and_info:?}" + ?error_and_info, + "Dispatch failed" ); self.transact_status = error_and_info.error.encode().into(); diff --git a/polkadot/xcm/xcm-executor/src/traits/conversion.rs b/polkadot/xcm/xcm-executor/src/traits/conversion.rs index 9e2f4c83997..1efe138b8c2 100644 --- a/polkadot/xcm/xcm-executor/src/traits/conversion.rs +++ b/polkadot/xcm/xcm-executor/src/traits/conversion.rs @@ -88,19 +88,45 @@ pub trait ConvertOrigin { #[impl_trait_for_tuples::impl_for_tuples(30)] impl ConvertOrigin for Tuple { fn convert_origin(origin: impl Into, kind: OriginKind) -> Result { + let origin = origin.into(); + + tracing::trace!( + target: "xcm::convert_origin", + ?origin, + ?kind, + "Converting origin", + ); + for_tuples!( #( + let convert_origin = core::any::type_name::(); + let origin = match Tuple::convert_origin(origin, kind) { - Err(o) => o, - r => return r + Err(o) => { + tracing::trace!( + target: "xcm::convert_origin", + %convert_origin, + "Convert origin step failed", + ); + + o + }, + Ok(o) => { + tracing::trace!( + target: "xcm::convert_origin", + %convert_origin, + "Convert origin step succeeded", + ); + + return Ok(o) + } }; )* ); - let origin = origin.into(); - log::trace!( + + tracing::trace!( target: "xcm::convert_origin", - "could not convert: origin: {:?}, kind: {:?}", - origin, - kind, + "Converting origin failed", ); + Err(origin) } } diff --git a/polkadot/xcm/xcm-executor/src/traits/should_execute.rs b/polkadot/xcm/xcm-executor/src/traits/should_execute.rs index e76d56bfe61..2e3acf5960e 100644 --- a/polkadot/xcm/xcm-executor/src/traits/should_execute.rs +++ b/polkadot/xcm/xcm-executor/src/traits/should_execute.rs @@ -59,19 +59,35 @@ impl ShouldExecute for Tuple { properties: &mut Properties, ) -> Result<(), ProcessMessageError> { for_tuples!( #( - match Tuple::should_execute(origin, instructions, max_weight, properties) { - Ok(()) => return Ok(()), - _ => (), + let barrier = core::any::type_name::(); + match Tuple::should_execute(origin, instructions, max_weight, properties) { + Ok(()) => { + tracing::trace!( + target: "xcm::should_execute", + ?origin, + ?instructions, + ?max_weight, + ?properties, + %barrier, + "pass barrier", + ); + return Ok(()) + }, + Err(error) => { + tracing::trace!( + target: "xcm::should_execute", + ?origin, + ?instructions, + ?max_weight, + ?properties, + ?error, + %barrier, + "did not pass barrier", + ); + }, } )* ); - log::trace!( - target: "xcm::should_execute", - "did not pass barrier: origin: {:?}, instructions: {:?}, max_weight: {:?}, properties: {:?}", - origin, - instructions, - max_weight, - properties, - ); + Err(ProcessMessageError::Unsupported) } } diff --git a/polkadot/xcm/xcm-executor/src/traits/token_matching.rs b/polkadot/xcm/xcm-executor/src/traits/token_matching.rs index e9a7e3ad845..45f3dc062a6 100644 --- a/polkadot/xcm/xcm-executor/src/traits/token_matching.rs +++ b/polkadot/xcm/xcm-executor/src/traits/token_matching.rs @@ -27,7 +27,7 @@ impl MatchesFungible for Tuple { for_tuples!( #( match Tuple::matches_fungible(a) { o @ Some(_) => return o, _ => () } )* ); - log::trace!(target: "xcm::matches_fungible", "did not match fungible asset: {:?}", &a); + tracing::trace!(target: "xcm::matches_fungible", asset = ?a, "did not match fungible asset"); None } } @@ -42,7 +42,7 @@ impl MatchesNonFungible for Tuple { for_tuples!( #( match Tuple::matches_nonfungible(a) { o @ Some(_) => return o, _ => () } )* ); - log::trace!(target: "xcm::matches_non_fungible", "did not match non-fungible asset: {:?}", &a); + tracing::trace!(target: "xcm::matches_non_fungible", asset = ?a, "did not match non-fungible asset"); None } } @@ -86,7 +86,7 @@ impl MatchesFungibles for Tuple { for_tuples!( #( match Tuple::matches_fungibles(a) { o @ Ok(_) => return o, _ => () } )* ); - log::trace!(target: "xcm::matches_fungibles", "did not match fungibles asset: {:?}", &a); + tracing::trace!(target: "xcm::matches_fungibles", asset = ?a, "did not match fungibles asset"); Err(Error::AssetNotHandled) } } @@ -101,7 +101,7 @@ impl MatchesNonFungibles for Tuple { for_tuples!( #( match Tuple::matches_nonfungibles(a) { o @ Ok(_) => return o, _ => () } )* ); - log::trace!(target: "xcm::matches_non_fungibles", "did not match fungibles asset: {:?}", &a); + tracing::trace!(target: "xcm::matches_non_fungibles", asset = ?a, "did not match fungibles asset"); Err(Error::AssetNotHandled) } } diff --git a/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs b/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs index e8a52d82568..eb85af0b80f 100644 --- a/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs +++ b/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs @@ -148,12 +148,12 @@ impl TransactAsset for Tuple { r => return r, } )* ); - log::trace!( + tracing::trace!( target: "xcm::TransactAsset::can_check_in", - "asset not found: what: {:?}, origin: {:?}, context: {:?}", - what, - origin, - context, + ?what, + ?origin, + ?context, + "asset not found", ); Err(XcmError::AssetNotFound) } @@ -171,12 +171,12 @@ impl TransactAsset for Tuple { r => return r, } )* ); - log::trace!( + tracing::trace!( target: "xcm::TransactAsset::can_check_out", - "asset not found: what: {:?}, dest: {:?}, context: {:?}", - what, - dest, - context, + ?what, + ?dest, + ?context, + "asset not found", ); Err(XcmError::AssetNotFound) } @@ -194,12 +194,12 @@ impl TransactAsset for Tuple { r => return r, } )* ); - log::trace!( + tracing::trace!( target: "xcm::TransactAsset::deposit_asset", - "did not deposit asset: what: {:?}, who: {:?}, context: {:?}", - what, - who, - context, + ?what, + ?who, + ?context, + "did not deposit asset", ); Err(XcmError::AssetNotFound) } @@ -215,12 +215,12 @@ impl TransactAsset for Tuple { r => return r, } )* ); - log::trace!( + tracing::trace!( target: "xcm::TransactAsset::withdraw_asset", - "did not withdraw asset: what: {:?}, who: {:?}, maybe_context: {:?}", - what, - who, - maybe_context, + ?what, + ?who, + ?maybe_context, + "did not withdraw asset", ); Err(XcmError::AssetNotFound) } @@ -237,13 +237,13 @@ impl TransactAsset for Tuple { r => return r, } )* ); - log::trace!( + tracing::trace!( target: "xcm::TransactAsset::internal_transfer_asset", - "did not transfer asset: what: {:?}, from: {:?}, to: {:?}, context: {:?}", - what, - from, - to, - context, + ?what, + ?from, + ?to, + ?context, + "did not transfer asset", ); Err(XcmError::AssetNotFound) } diff --git a/polkadot/xcm/xcm-executor/src/traits/weight.rs b/polkadot/xcm/xcm-executor/src/traits/weight.rs index efb9a2dfb6e..985dfcd0cf2 100644 --- a/polkadot/xcm/xcm-executor/src/traits/weight.rs +++ b/polkadot/xcm/xcm-executor/src/traits/weight.rs @@ -80,18 +80,38 @@ impl WeightTrader for Tuple { let mut too_expensive_error_found = false; let mut last_error = None; for_tuples!( #( + let weight_trader = core::any::type_name::(); + match Tuple.buy_weight(weight, payment.clone(), context) { - Ok(assets) => return Ok(assets), - Err(e) => { - if let XcmError::TooExpensive = e { + Ok(assets) => { + tracing::trace!( + target: "xcm::buy_weight", + %weight_trader, + "Buy weight succeeded", + ); + + return Ok(assets) + }, + Err(error) => { + if let XcmError::TooExpensive = error { too_expensive_error_found = true; } - last_error = Some(e) + last_error = Some(error); + + tracing::trace!( + target: "xcm::buy_weight", + ?error, + %weight_trader, + "Weight trader failed", + ); } } )* ); - log::trace!(target: "xcm::buy_weight", "last_error: {:?}, too_expensive_error_found: {}", last_error, too_expensive_error_found); + tracing::trace!( + target: "xcm::buy_weight", + "Buy weight failed", + ); // if we have multiple traders, and first one returns `TooExpensive` and others fail e.g. // `AssetNotFound` then it is more accurate to return `TooExpensive` then `AssetNotFound` diff --git a/substrate/frame/support/src/traits/messages.rs b/substrate/frame/support/src/traits/messages.rs index 2eec606b6d1..3f8d80f5c6b 100644 --- a/substrate/frame/support/src/traits/messages.rs +++ b/substrate/frame/support/src/traits/messages.rs @@ -27,7 +27,7 @@ use sp_weights::{Weight, WeightMeter}; /// Errors that can happen when attempting to process a message with /// [`ProcessMessage::process_message()`]. -#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, TypeInfo, RuntimeDebug)] +#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, TypeInfo, Debug)] pub enum ProcessMessageError { /// The message data format is unknown (e.g. unrecognised header) BadFormat, -- GitLab From 1f8e44831d0a743b116dfb5948ea9f4756955962 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 12 Jul 2024 10:20:56 +0200 Subject: [PATCH 113/130] Bridges V2 refactoring backport and `pallet_bridge_messages` simplifications (#4935) ## Summary This PR contains migrated code from the Bridges V2 [branch](https://github.com/paritytech/polkadot-sdk/pull/4427) from the old `parity-bridges-common` [repo](https://github.com/paritytech/parity-bridges-common/tree/bridges-v2). Even though the PR looks large, it does not (or should not) contain any significant changes (also not relevant for audit). This PR is a requirement for permissionless lanes, as they were implemented on top of these changes. ## TODO - [x] generate fresh weights for BridgeHubs - [x] run `polkadot-fellows` bridges zombienet tests with actual runtime 1.2.5. or 1.2.6 to check compatibility - :ballot_box_with_check: working, checked with 1.2.8 fellows BridgeHubs - [x] run `polkadot-sdk` bridges zombienet tests - :ballot_box_with_check: with old relayer in CI (1.6.5) - [x] run `polkadot-sdk` bridges zombienet tests (locally) - with the relayer based on this branch - https://github.com/paritytech/parity-bridges-common/pull/3022 - [x] check/fix relayer companion in bridges repo - https://github.com/paritytech/parity-bridges-common/pull/3022 - [x] extract pruning stuff to separate PR https://github.com/paritytech/polkadot-sdk/pull/4944 Relates to: https://github.com/paritytech/parity-bridges-common/issues/2976 Relates to: https://github.com/paritytech/parity-bridges-common/issues/2451 --------- Signed-off-by: Branislav Kontur Co-authored-by: Serban Iorga Co-authored-by: Svyatoslav Nikolsky Co-authored-by: command-bot <> --- Cargo.lock | 19 +- bridges/bin/runtime-common/Cargo.toml | 24 +- .../src/extensions/priority_calculator.rs | 3 +- .../extensions/refund_relayer_extension.rs | 77 +- bridges/bin/runtime-common/src/integrity.rs | 165 +- bridges/bin/runtime-common/src/lib.rs | 3 +- bridges/bin/runtime-common/src/messages.rs | 704 --------- .../src/messages_benchmarking.rs | 141 +- .../runtime-common/src/messages_call_ext.rs | 68 +- bridges/bin/runtime-common/src/mock.rs | 135 +- .../src/parachains_benchmarking.rs | 13 +- .../chains/chain-bridge-hub-kusama/src/lib.rs | 4 +- .../chain-bridge-hub-polkadot/src/lib.rs | 4 +- .../chains/chain-bridge-hub-rococo/src/lib.rs | 12 +- .../chain-bridge-hub-westend/src/lib.rs | 4 +- bridges/chains/chain-kusama/src/lib.rs | 4 +- .../chains/chain-polkadot-bulletin/src/lib.rs | 6 +- bridges/chains/chain-polkadot/src/lib.rs | 4 +- bridges/chains/chain-rococo/src/lib.rs | 4 +- bridges/chains/chain-westend/src/lib.rs | 4 +- bridges/modules/beefy/src/mock.rs | 3 + bridges/modules/grandpa/Cargo.toml | 5 +- bridges/modules/grandpa/src/lib.rs | 13 +- bridges/modules/grandpa/src/mock.rs | 5 +- bridges/modules/messages/Cargo.toml | 29 +- bridges/modules/messages/README.md | 105 +- bridges/modules/messages/src/benchmarking.rs | 426 ++--- bridges/modules/messages/src/inbound_lane.rs | 35 +- bridges/modules/messages/src/lib.rs | 1383 +---------------- bridges/modules/messages/src/outbound_lane.rs | 71 +- bridges/modules/messages/src/proofs.rs | 562 +++++++ .../src/tests}/messages_generation.rs | 95 +- .../modules/messages/src/{ => tests}/mock.rs | 322 ++-- bridges/modules/messages/src/tests/mod.rs | 26 + .../messages/src/tests/pallet_tests.rs | 1100 +++++++++++++ bridges/modules/messages/src/weights.rs | 311 ++-- bridges/modules/messages/src/weights_ext.rs | 64 +- bridges/modules/parachains/Cargo.toml | 2 - .../modules/parachains/src/benchmarking.rs | 10 +- bridges/modules/parachains/src/call_ext.rs | 4 +- bridges/modules/parachains/src/lib.rs | 39 +- bridges/modules/parachains/src/mock.rs | 47 +- bridges/modules/parachains/src/proofs.rs | 81 + bridges/modules/parachains/src/weights.rs | 60 +- .../modules/relayers/src/payment_adapter.rs | 3 +- bridges/modules/xcm-bridge-hub/src/mock.rs | 108 +- bridges/primitives/header-chain/src/lib.rs | 11 +- bridges/primitives/messages/src/lib.rs | 79 +- .../primitives/messages/src/source_chain.rs | 88 +- .../primitives/messages/src/target_chain.rs | 95 +- .../polkadot-core/src/parachains.rs | 10 +- bridges/primitives/runtime/Cargo.toml | 1 + bridges/primitives/runtime/src/chain.rs | 8 +- bridges/primitives/runtime/src/lib.rs | 45 +- .../primitives/runtime/src/storage_proof.rs | 276 +++- bridges/primitives/test-utils/Cargo.toml | 2 +- bridges/primitives/test-utils/src/lib.rs | 4 +- bridges/relays/client-substrate/Cargo.toml | 3 - .../client-substrate/src/client/caching.rs | 6 +- .../relays/client-substrate/src/client/rpc.rs | 32 +- .../client-substrate/src/client/traits.rs | 8 +- bridges/relays/client-substrate/src/error.rs | 3 - .../relays/client-substrate/src/test_chain.rs | 6 +- bridges/relays/finality/src/base.rs | 4 - bridges/relays/lib-substrate-relay/Cargo.toml | 6 +- .../lib-substrate-relay/src/cli/bridge.rs | 2 +- .../src/cli/relay_headers_and_messages/mod.rs | 10 +- .../src/cli/relay_messages.rs | 8 +- bridges/relays/lib-substrate-relay/src/lib.rs | 19 +- .../metrics.rs} | 0 .../src/{messages_lane.rs => messages/mod.rs} | 421 ++++- .../source.rs} | 26 +- .../target.rs} | 32 +- .../src/on_demand/parachains.rs | 4 +- .../src/parachains/source.rs | 22 +- bridges/relays/messages/Cargo.toml | 1 - .../relays/parachains/src/parachains_loop.rs | 4 +- .../weights/pallet_xcm_bridge_hub_router.rs | 50 +- .../weights/pallet_xcm_bridge_hub_router.rs | 60 +- .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../src/bridge_common_config.rs | 19 +- .../src/bridge_to_bulletin_config.rs | 67 +- .../src/bridge_to_westend_config.rs | 100 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 12 +- .../src/weights/pallet_bridge_grandpa.rs | 20 +- ...idge_messages_rococo_to_rococo_bulletin.rs | 78 +- ...allet_bridge_messages_rococo_to_westend.rs | 80 +- .../src/weights/pallet_bridge_parachains.rs | 18 +- .../src/weights/pallet_bridge_relayers.rs | 22 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 128 +- .../bridge-hub-rococo/tests/tests.rs | 49 +- .../bridge-hubs/bridge-hub-westend/Cargo.toml | 2 +- .../src/bridge_to_rococo_config.rs | 107 +- .../bridge-hubs/bridge-hub-westend/src/lib.rs | 8 +- .../src/weights/pallet_bridge_grandpa.rs | 20 +- .../src/weights/pallet_bridge_messages.rs | 76 +- .../src/weights/pallet_bridge_parachains.rs | 18 +- .../src/weights/pallet_bridge_relayers.rs | 22 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 128 +- .../bridge-hub-westend/tests/tests.rs | 5 +- .../bridge-hubs/test-utils/Cargo.toml | 2 +- .../src/test_cases/from_grandpa_chain.rs | 128 +- .../src/test_cases/from_parachain.rs | 135 +- .../test-utils/src/test_cases/helpers.rs | 9 +- .../src/test_data/from_grandpa_chain.rs | 182 +-- .../src/test_data/from_parachain.rs | 180 ++- ...ridges_zombienet_tests_injected.Dockerfile | 2 +- prdoc/pr_4935.prdoc | 75 + 108 files changed, 4708 insertions(+), 4639 deletions(-) delete mode 100644 bridges/bin/runtime-common/src/messages.rs create mode 100644 bridges/modules/messages/src/proofs.rs rename bridges/{bin/runtime-common/src => modules/messages/src/tests}/messages_generation.rs (62%) rename bridges/modules/messages/src/{ => tests}/mock.rs (62%) create mode 100644 bridges/modules/messages/src/tests/mod.rs create mode 100644 bridges/modules/messages/src/tests/pallet_tests.rs create mode 100644 bridges/modules/parachains/src/proofs.rs rename bridges/relays/lib-substrate-relay/src/{messages_metrics.rs => messages/metrics.rs} (100%) rename bridges/relays/lib-substrate-relay/src/{messages_lane.rs => messages/mod.rs} (63%) rename bridges/relays/lib-substrate-relay/src/{messages_source.rs => messages/source.rs} (97%) rename bridges/relays/lib-substrate-relay/src/{messages_target.rs => messages/target.rs} (94%) create mode 100644 prdoc/pr_4935.prdoc diff --git a/Cargo.lock b/Cargo.lock index 43601b85ca2..4a7d47eb0f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2359,7 +2359,6 @@ dependencies = [ "bp-xcm-bridge-hub-router", "frame-support", "frame-system", - "hash-db", "log", "pallet-balances", "pallet-bridge-grandpa", @@ -2370,8 +2369,6 @@ dependencies = [ "pallet-utility", "parity-scale-codec", "scale-info", - "sp-api", - "sp-core", "sp-io", "sp-runtime", "sp-std 14.0.0", @@ -8605,7 +8602,6 @@ dependencies = [ "async-std", "async-trait", "bp-messages", - "env_logger 0.11.3", "finality-relay", "futures", "hex", @@ -10069,7 +10065,6 @@ dependencies = [ "bp-header-chain", "bp-runtime", "bp-test-utils", - "finality-grandpa", "frame-benchmarking", "frame-support", "frame-system", @@ -10081,13 +10076,13 @@ dependencies = [ "sp-io", "sp-runtime", "sp-std 14.0.0", - "sp-trie", ] [[package]] name = "pallet-bridge-messages" version = "0.7.0" dependencies = [ + "bp-header-chain", "bp-messages", "bp-runtime", "bp-test-utils", @@ -10095,13 +10090,15 @@ dependencies = [ "frame-support", "frame-system", "log", - "num-traits", "pallet-balances", + "pallet-bridge-grandpa", "parity-scale-codec", "scale-info", + "sp-core", "sp-io", "sp-runtime", "sp-std 14.0.0", + "sp-trie", ] [[package]] @@ -10124,7 +10121,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-std 14.0.0", - "sp-trie", ] [[package]] @@ -16205,13 +16201,10 @@ dependencies = [ "bp-runtime", "finality-relay", "frame-support", - "frame-system", "futures", "jsonrpsee", "log", "num-traits", - "pallet-balances", - "pallet-bridge-messages", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", "pallet-utility", @@ -21388,9 +21381,7 @@ dependencies = [ "bp-polkadot-core", "bp-relayers", "bp-runtime", - "bridge-runtime-common", "equivocation-detector", - "finality-grandpa", "finality-relay", "frame-support", "frame-system", @@ -21410,9 +21401,11 @@ dependencies = [ "rbtag", "relay-substrate-client", "relay-utils", + "scale-info", "sp-consensus-grandpa", "sp-core", "sp-runtime", + "sp-trie", "structopt", "strum 0.26.2", "thiserror", diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml index d69a064aab8..36f27b6aa03 100644 --- a/bridges/bin/runtime-common/Cargo.toml +++ b/bridges/bin/runtime-common/Cargo.toml @@ -12,14 +12,12 @@ workspace = true [dependencies] codec = { features = ["derive"], workspace = true } -hash-db = { workspace = true } log = { workspace = true } scale-info = { features = ["derive"], workspace = true } static_assertions = { optional = true, workspace = true, default-features = true } tuplex = { workspace = true } # Bridge dependencies - bp-header-chain = { workspace = true } bp-messages = { workspace = true } bp-parachains = { workspace = true } @@ -34,25 +32,23 @@ pallet-bridge-parachains = { workspace = true } pallet-bridge-relayers = { workspace = true } # Substrate dependencies - frame-support = { workspace = true } frame-system = { workspace = true } pallet-transaction-payment = { workspace = true } pallet-utility = { workspace = true } -sp-api = { workspace = true } -sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } sp-std = { workspace = true } -sp-trie = { workspace = true } +sp-trie = { optional = true, workspace = true } # Polkadot dependencies xcm = { workspace = true } xcm-builder = { workspace = true } [dev-dependencies] -bp-test-utils = { workspace = true, default-features = true } -pallet-balances = { workspace = true, default-features = true } +bp-test-utils = { workspace = true } +pallet-balances = { workspace = true } +pallet-bridge-messages = { features = ["std", "test-helpers"], workspace = true } [features] default = ["std"] @@ -63,13 +59,14 @@ std = [ "bp-polkadot-core/std", "bp-relayers/std", "bp-runtime/std", + "bp-test-utils/std", "bp-xcm-bridge-hub-router/std", "bp-xcm-bridge-hub/std", "codec/std", "frame-support/std", "frame-system/std", - "hash-db/std", "log/std", + "pallet-balances/std", "pallet-bridge-grandpa/std", "pallet-bridge-messages/std", "pallet-bridge-parachains/std", @@ -77,8 +74,6 @@ std = [ "pallet-transaction-payment/std", "pallet-utility/std", "scale-info/std", - "sp-api/std", - "sp-core/std", "sp-io/std", "sp-runtime/std", "sp-std/std", @@ -88,15 +83,22 @@ std = [ "xcm/std", ] runtime-benchmarks = [ + "bp-runtime/test-helpers", "frame-support/runtime-benchmarks", "frame-system/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-bridge-grandpa/runtime-benchmarks", "pallet-bridge-messages/runtime-benchmarks", + "pallet-bridge-messages/test-helpers", "pallet-bridge-parachains/runtime-benchmarks", "pallet-bridge-relayers/runtime-benchmarks", "pallet-utility/runtime-benchmarks", "sp-runtime/runtime-benchmarks", + "sp-trie", "xcm-builder/runtime-benchmarks", ] integrity-test = ["static_assertions"] +test-helpers = [ + "bp-runtime/test-helpers", + "sp-trie", +] diff --git a/bridges/bin/runtime-common/src/extensions/priority_calculator.rs b/bridges/bin/runtime-common/src/extensions/priority_calculator.rs index 92810290f95..9f559dc13b6 100644 --- a/bridges/bin/runtime-common/src/extensions/priority_calculator.rs +++ b/bridges/bin/runtime-common/src/extensions/priority_calculator.rs @@ -319,6 +319,7 @@ mod integrity_tests { pub mod per_message { use super::*; + use bp_messages::ChainWithMessages; use pallet_bridge_messages::WeightInfoExt; /// Ensures that the value of `PriorityBoostPerMessage` matches the value of @@ -339,7 +340,7 @@ mod integrity_tests { BalanceOf: Send + Sync + FixedPointOperand, { let maximal_messages_in_delivery_transaction = - Runtime::MaxUnconfirmedMessagesAtInboundLane::get(); + Runtime::BridgedChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; super::ensure_priority_boost_is_sane::>( "PriorityBoostPerMessage", maximal_messages_in_delivery_transaction, diff --git a/bridges/bin/runtime-common/src/extensions/refund_relayer_extension.rs b/bridges/bin/runtime-common/src/extensions/refund_relayer_extension.rs index 5aa7f1c095d..6ba3506377d 100644 --- a/bridges/bin/runtime-common/src/extensions/refund_relayer_extension.rs +++ b/bridges/bin/runtime-common/src/extensions/refund_relayer_extension.rs @@ -22,9 +22,9 @@ use crate::messages_call_ext::{ CallHelper as MessagesCallHelper, CallInfo as MessagesCallInfo, MessagesCallSubType, }; -use bp_messages::{LaneId, MessageNonce}; +use bp_messages::{ChainWithMessages, LaneId, MessageNonce}; use bp_relayers::{ExplicitOrAccountParams, RewardsAccountOwner, RewardsAccountParams}; -use bp_runtime::{Parachain, RangeInclusiveExt, StaticStrProvider}; +use bp_runtime::{Chain, Parachain, RangeInclusiveExt, StaticStrProvider}; use codec::{Codec, Decode, Encode}; use frame_support::{ dispatch::{CallableCallFor, DispatchInfo, PostDispatchInfo}, @@ -293,7 +293,7 @@ pub trait RefundSignedExtension: ::Id::get(), ::Instance, - >>::BridgedChainId::get(), + >>::BridgedChain::ID, if call_info.is_receive_messages_proof_call() { RewardsAccountOwner::ThisChain } else { @@ -406,8 +406,7 @@ pub trait RefundSignedExtension: // a quick check to avoid invalid high-priority transactions let max_unconfirmed_messages_in_confirmation_tx = ::Instance, - >>::MaxUnconfirmedMessagesAtInboundLane::get( - ); + >>::BridgedChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; if bundled_messages > max_unconfirmed_messages_in_confirmation_tx { return None } @@ -935,9 +934,6 @@ where pub(crate) mod tests { use super::*; use crate::{ - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - }, messages_call_ext::{ BaseMessagesProofInfo, ReceiveMessagesDeliveryProofInfo, ReceiveMessagesProofInfo, UnrewardedRelayerOccupation, @@ -946,8 +942,10 @@ pub(crate) mod tests { }; use bp_header_chain::StoredHeaderDataBuilder; use bp_messages::{ - DeliveredMessages, InboundLaneData, MessageNonce, MessagesOperatingMode, OutboundLaneData, - UnrewardedRelayer, UnrewardedRelayersState, + source_chain::FromBridgedChainMessagesDeliveryProof, + target_chain::FromBridgedChainMessagesProof, DeliveredMessages, InboundLaneData, + MessageNonce, MessagesOperatingMode, OutboundLaneData, UnrewardedRelayer, + UnrewardedRelayersState, }; use bp_parachains::{BestParaHeadHash, ParaInfo}; use bp_polkadot_core::parachains::{ParaHeadsProof, ParaId}; @@ -1123,7 +1121,7 @@ pub(crate) mod tests { ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), [parachain_head_at_relay_header_number as u8; 32].into(), )], - parachain_heads_proof: ParaHeadsProof { storage_proof: vec![] }, + parachain_heads_proof: ParaHeadsProof { storage_proof: Default::default() }, }) } @@ -1136,7 +1134,7 @@ pub(crate) mod tests { ParaId(BridgedUnderlyingParachain::PARACHAIN_ID), [parachain_head_at_relay_header_number as u8; 32].into(), )], - parachain_heads_proof: ParaHeadsProof { storage_proof: vec![] }, + parachain_heads_proof: ParaHeadsProof { storage_proof: Default::default() }, is_free_execution_expected: false, }) } @@ -1144,9 +1142,9 @@ pub(crate) mod tests { fn message_delivery_call(best_message: MessageNonce) -> RuntimeCall { RuntimeCall::BridgeMessages(MessagesCall::receive_messages_proof { relayer_id_at_bridged_chain: relayer_account_at_bridged_chain(), - proof: FromBridgedChainMessagesProof { + proof: Box::new(FromBridgedChainMessagesProof { bridged_header_hash: Default::default(), - storage_proof: vec![], + storage_proof: Default::default(), lane: TestLaneId::get(), nonces_start: pallet_bridge_messages::InboundLanes::::get( TEST_LANE_ID, @@ -1154,7 +1152,7 @@ pub(crate) mod tests { .last_delivered_nonce() + 1, nonces_end: best_message, - }, + }), messages_count: 1, dispatch_weight: Weight::zero(), }) @@ -1164,7 +1162,7 @@ pub(crate) mod tests { RuntimeCall::BridgeMessages(MessagesCall::receive_messages_delivery_proof { proof: FromBridgedChainMessagesDeliveryProof { bridged_header_hash: Default::default(), - storage_proof: vec![], + storage_proof: Default::default(), lane: TestLaneId::get(), }, relayers_state: UnrewardedRelayersState { @@ -1327,8 +1325,10 @@ pub(crate) mod tests { best_stored_nonce: 100, }, unrewarded_relayers: UnrewardedRelayerOccupation { - free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), - free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + free_relayer_slots: + BridgedUnderlyingChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + free_message_slots: + BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, }, }), ), @@ -1397,8 +1397,10 @@ pub(crate) mod tests { best_stored_nonce: 100, }, unrewarded_relayers: UnrewardedRelayerOccupation { - free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), - free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + free_relayer_slots: + BridgedUnderlyingChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + free_message_slots: + BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, }, }), ), @@ -1459,8 +1461,10 @@ pub(crate) mod tests { best_stored_nonce: 100, }, unrewarded_relayers: UnrewardedRelayerOccupation { - free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), - free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + free_relayer_slots: + BridgedUnderlyingChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + free_message_slots: + BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, }, }), ), @@ -1499,8 +1503,10 @@ pub(crate) mod tests { best_stored_nonce: 100, }, unrewarded_relayers: UnrewardedRelayerOccupation { - free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), - free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + free_relayer_slots: + BridgedUnderlyingChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + free_message_slots: + BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, }, }, )), @@ -1735,14 +1741,16 @@ pub(crate) mod tests { let fns = [run_validate, run_grandpa_validate, run_messages_validate]; for f in fns { - let priority_of_max_messages_delivery = - f(message_delivery_call(100 + MaxUnconfirmedMessagesAtInboundLane::get())) - .unwrap() - .priority; - let priority_of_more_than_max_messages_delivery = - f(message_delivery_call(100 + MaxUnconfirmedMessagesAtInboundLane::get() + 1)) - .unwrap() - .priority; + let priority_of_max_messages_delivery = f(message_delivery_call( + 100 + BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + )) + .unwrap() + .priority; + let priority_of_more_than_max_messages_delivery = f(message_delivery_call( + 100 + BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX + 1, + )) + .unwrap() + .priority; assert!( priority_of_max_messages_delivery > priority_of_more_than_max_messages_delivery, @@ -2103,7 +2111,7 @@ pub(crate) mod tests { [1u8; 32].into(), ), ], - parachain_heads_proof: ParaHeadsProof { storage_proof: vec![] }, + parachain_heads_proof: ParaHeadsProof { storage_proof: Default::default() }, }), message_delivery_call(200), ], @@ -2865,7 +2873,8 @@ pub(crate) mod tests { #[test] fn does_not_panic_on_boosting_priority_of_empty_message_delivery_transaction() { run_test(|| { - let best_delivered_message = MaxUnconfirmedMessagesAtInboundLane::get(); + let best_delivered_message = + BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; initialize_environment(100, 100, best_delivered_message); // register relayer so it gets priority boost diff --git a/bridges/bin/runtime-common/src/integrity.rs b/bridges/bin/runtime-common/src/integrity.rs index d3827a14dd6..f661db8a220 100644 --- a/bridges/bin/runtime-common/src/integrity.rs +++ b/bridges/bin/runtime-common/src/integrity.rs @@ -19,10 +19,9 @@ //! Most of the tests in this module assume that the bridge is using standard (see `crate::messages` //! module for details) configuration. -use crate::{messages, messages::MessageBridge}; - -use bp_messages::{InboundLaneData, MessageNonce}; -use bp_runtime::{Chain, ChainId}; +use bp_header_chain::ChainWithGrandpa; +use bp_messages::{ChainWithMessages, InboundLaneData, MessageNonce}; +use bp_runtime::Chain; use codec::Encode; use frame_support::{storage::generator::StorageValue, traits::Get, weights::Weight}; use frame_system::limits; @@ -50,23 +49,6 @@ macro_rules! assert_chain_types( } ); -/// Macro that ensures that the bridge GRANDPA pallet is configured properly to bridge with given -/// chain. -#[macro_export] -macro_rules! assert_bridge_grandpa_pallet_types( - ( runtime: $r:path, with_bridged_chain_grandpa_instance: $i:path, bridged_chain: $bridged:path ) => { - { - // if one of asserts fail, then either bridge isn't configured properly (or alternatively - non-standard - // configuration is used), or something has broke existing configuration (meaning that all bridged chains - // and relays will stop functioning) - use pallet_bridge_grandpa::Config as GrandpaConfig; - use static_assertions::assert_type_eq_all; - - assert_type_eq_all!(<$r as GrandpaConfig<$i>>::BridgedChain, $bridged); - } - } -); - /// Macro that ensures that the bridge messages pallet is configured properly to bridge using given /// configuration. #[macro_export] @@ -74,32 +56,30 @@ macro_rules! assert_bridge_messages_pallet_types( ( runtime: $r:path, with_bridged_chain_messages_instance: $i:path, - bridge: $bridge:path + this_chain: $this:path, + bridged_chain: $bridged:path, ) => { { // if one of asserts fail, then either bridge isn't configured properly (or alternatively - non-standard // configuration is used), or something has broke existing configuration (meaning that all bridged chains // and relays will stop functioning) - use $crate::messages::{ - source::{FromThisChainMessagePayload, TargetHeaderChainAdapter}, - target::{FromBridgedChainMessagePayload, SourceHeaderChainAdapter}, - AccountIdOf, BalanceOf, BridgedChain, ThisChain, - }; + use $crate::messages_xcm_extension::XcmAsPlainPayload; + use bp_messages::ChainWithMessages; + use bp_runtime::Chain; use pallet_bridge_messages::Config as MessagesConfig; use static_assertions::assert_type_eq_all; - assert_type_eq_all!(<$r as MessagesConfig<$i>>::OutboundPayload, FromThisChainMessagePayload); + assert_type_eq_all!(<$r as MessagesConfig<$i>>::ThisChain, $this); + assert_type_eq_all!(<$r as MessagesConfig<$i>>::BridgedChain, $bridged); - assert_type_eq_all!(<$r as MessagesConfig<$i>>::InboundRelayer, AccountIdOf>); - - assert_type_eq_all!(<$r as MessagesConfig<$i>>::TargetHeaderChain, TargetHeaderChainAdapter<$bridge>); - assert_type_eq_all!(<$r as MessagesConfig<$i>>::SourceHeaderChain, SourceHeaderChainAdapter<$bridge>); + assert_type_eq_all!(<$r as MessagesConfig<$i>>::OutboundPayload, XcmAsPlainPayload); + assert_type_eq_all!(<$r as MessagesConfig<$i>>::InboundPayload, XcmAsPlainPayload); } } ); /// Macro that combines four other macro calls - `assert_chain_types`, `assert_bridge_types`, -/// `assert_bridge_grandpa_pallet_types` and `assert_bridge_messages_pallet_types`. It may be used +/// and `assert_bridge_messages_pallet_types`. It may be used /// at the chain that is implementing complete standard messages bridge (i.e. with bridge GRANDPA /// and messages pallets deployed). #[macro_export] @@ -108,20 +88,15 @@ macro_rules! assert_complete_bridge_types( runtime: $r:path, with_bridged_chain_grandpa_instance: $gi:path, with_bridged_chain_messages_instance: $mi:path, - bridge: $bridge:path, this_chain: $this:path, bridged_chain: $bridged:path, ) => { $crate::assert_chain_types!(runtime: $r, this_chain: $this); - $crate::assert_bridge_grandpa_pallet_types!( - runtime: $r, - with_bridged_chain_grandpa_instance: $gi, - bridged_chain: $bridged - ); $crate::assert_bridge_messages_pallet_types!( runtime: $r, with_bridged_chain_messages_instance: $mi, - bridge: $bridge + this_chain: $this, + bridged_chain: $bridged, ); } ); @@ -184,20 +159,8 @@ where ); } -/// Parameters for asserting messages pallet constants. -#[derive(Debug)] -pub struct AssertBridgeMessagesPalletConstants { - /// Maximal number of unrewarded relayer entries in a confirmation transaction at the bridged - /// chain. - pub max_unrewarded_relayers_in_bridged_confirmation_tx: MessageNonce, - /// Maximal number of unconfirmed messages in a confirmation transaction at the bridged chain. - pub max_unconfirmed_messages_in_bridged_confirmation_tx: MessageNonce, - /// Identifier of the bridged chain. - pub bridged_chain_id: ChainId, -} - /// Test that the constants, used in messages pallet configuration are valid. -pub fn assert_bridge_messages_pallet_constants(params: AssertBridgeMessagesPalletConstants) +pub fn assert_bridge_messages_pallet_constants() where R: pallet_bridge_messages::Config, MI: 'static, @@ -207,27 +170,22 @@ where "ActiveOutboundLanes ({:?}) must not be empty", R::ActiveOutboundLanes::get(), ); + assert!( - R::MaxUnrewardedRelayerEntriesAtInboundLane::get() <= params.max_unrewarded_relayers_in_bridged_confirmation_tx, - "MaxUnrewardedRelayerEntriesAtInboundLane ({}) must be <= than the hardcoded value for bridged chain: {}", - R::MaxUnrewardedRelayerEntriesAtInboundLane::get(), - params.max_unrewarded_relayers_in_bridged_confirmation_tx, - ); - assert!( - R::MaxUnconfirmedMessagesAtInboundLane::get() <= params.max_unconfirmed_messages_in_bridged_confirmation_tx, - "MaxUnrewardedRelayerEntriesAtInboundLane ({}) must be <= than the hardcoded value for bridged chain: {}", - R::MaxUnconfirmedMessagesAtInboundLane::get(), - params.max_unconfirmed_messages_in_bridged_confirmation_tx, + pallet_bridge_messages::BridgedChainOf::::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX + <= pallet_bridge_messages::BridgedChainOf::::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + "MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX ({}) of {:?} is larger than \ + its MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX ({}). This makes \ + no sense", + pallet_bridge_messages::BridgedChainOf::::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + pallet_bridge_messages::BridgedChainOf::::ID, + pallet_bridge_messages::BridgedChainOf::::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, ); - assert_eq!(R::BridgedChainId::get(), params.bridged_chain_id); } /// Parameters for asserting bridge pallet names. #[derive(Debug)] pub struct AssertBridgePalletNames<'a> { - /// Name of the messages pallet, deployed at the bridged chain and used to bridge with this - /// chain. - pub with_this_chain_messages_pallet_name: &'a str, /// Name of the GRANDPA pallet, deployed at this chain and used to bridge with the bridged /// chain. pub with_bridged_chain_grandpa_pallet_name: &'a str, @@ -238,18 +196,22 @@ pub struct AssertBridgePalletNames<'a> { /// Tests that bridge pallet names used in `construct_runtime!()` macro call are matching constants /// from chain primitives crates. -pub fn assert_bridge_pallet_names(params: AssertBridgePalletNames) +fn assert_bridge_pallet_names(params: AssertBridgePalletNames) where - B: MessageBridge, R: pallet_bridge_grandpa::Config + pallet_bridge_messages::Config, GI: 'static, MI: 'static, { - assert_eq!(B::BRIDGED_MESSAGES_PALLET_NAME, params.with_this_chain_messages_pallet_name); + // check that the bridge GRANDPA pallet has required name assert_eq!( pallet_bridge_grandpa::PalletOwner::::storage_value_final_key().to_vec(), - bp_runtime::storage_value_key(params.with_bridged_chain_grandpa_pallet_name, "PalletOwner",).0, + bp_runtime::storage_value_key( + params.with_bridged_chain_grandpa_pallet_name, + "PalletOwner", + ).0, ); + + // check that the bridge messages pallet has required name assert_eq!( pallet_bridge_messages::PalletOwner::::storage_value_final_key().to_vec(), bp_runtime::storage_value_key( @@ -262,35 +224,58 @@ where /// Parameters for asserting complete standard messages bridge. #[derive(Debug)] -pub struct AssertCompleteBridgeConstants<'a> { +pub struct AssertCompleteBridgeConstants { /// Parameters to assert this chain constants. pub this_chain_constants: AssertChainConstants, - /// Parameters to assert messages pallet constants. - pub messages_pallet_constants: AssertBridgeMessagesPalletConstants, - /// Parameters to assert pallet names constants. - pub pallet_names: AssertBridgePalletNames<'a>, } -/// All bridge-related constants tests for the complete standard messages bridge (i.e. with bridge -/// GRANDPA and messages pallets deployed). -pub fn assert_complete_bridge_constants(params: AssertCompleteBridgeConstants) -where +/// All bridge-related constants tests for the complete standard relay-chain messages bridge +/// (i.e. with bridge GRANDPA and messages pallets deployed). +pub fn assert_complete_with_relay_chain_bridge_constants( + params: AssertCompleteBridgeConstants, +) where + R: frame_system::Config + + pallet_bridge_grandpa::Config + + pallet_bridge_messages::Config, + GI: 'static, + MI: 'static, +{ + assert_chain_constants::(params.this_chain_constants); + assert_bridge_grandpa_pallet_constants::(); + assert_bridge_messages_pallet_constants::(); + assert_bridge_pallet_names::(AssertBridgePalletNames { + with_bridged_chain_grandpa_pallet_name: + >::BridgedChain::WITH_CHAIN_GRANDPA_PALLET_NAME, + with_bridged_chain_messages_pallet_name: + >::BridgedChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + }); +} + +/// All bridge-related constants tests for the complete standard parachain messages bridge +/// (i.e. with bridge GRANDPA, parachains and messages pallets deployed). +pub fn assert_complete_with_parachain_bridge_constants( + params: AssertCompleteBridgeConstants, +) where R: frame_system::Config + pallet_bridge_grandpa::Config + pallet_bridge_messages::Config, GI: 'static, MI: 'static, - B: MessageBridge, + RelayChain: ChainWithGrandpa, { assert_chain_constants::(params.this_chain_constants); assert_bridge_grandpa_pallet_constants::(); - assert_bridge_messages_pallet_constants::(params.messages_pallet_constants); - assert_bridge_pallet_names::(params.pallet_names); + assert_bridge_messages_pallet_constants::(); + assert_bridge_pallet_names::(AssertBridgePalletNames { + with_bridged_chain_grandpa_pallet_name: RelayChain::WITH_CHAIN_GRANDPA_PALLET_NAME, + with_bridged_chain_messages_pallet_name: + >::BridgedChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + }); } /// Check that the message lane weights are correct. pub fn check_message_lane_weights< - C: Chain, + C: ChainWithMessages, T: frame_system::Config + pallet_bridge_messages::Config, MessagesPalletInstance: 'static, >( @@ -308,14 +293,20 @@ pub fn check_message_lane_weights< // check basic weight assumptions pallet_bridge_messages::ensure_weights_are_correct::>(); + // check that the maximal message dispatch weight is below hardcoded limit + pallet_bridge_messages::ensure_maximal_message_dispatch::>( + C::maximal_incoming_message_size(), + C::maximal_incoming_message_dispatch_weight(), + ); + // check that weights allow us to receive messages - let max_incoming_message_proof_size = bridged_chain_extra_storage_proof_size - .saturating_add(messages::target::maximal_incoming_message_size(C::max_extrinsic_size())); + let max_incoming_message_proof_size = + bridged_chain_extra_storage_proof_size.saturating_add(C::maximal_incoming_message_size()); pallet_bridge_messages::ensure_able_to_receive_message::>( C::max_extrinsic_size(), C::max_extrinsic_weight(), max_incoming_message_proof_size, - messages::target::maximal_incoming_message_dispatch_weight(C::max_extrinsic_weight()), + C::maximal_incoming_message_dispatch_weight(), ); // check that weights allow us to receive delivery confirmations diff --git a/bridges/bin/runtime-common/src/lib.rs b/bridges/bin/runtime-common/src/lib.rs index 5679acd6006..b65bb6041d5 100644 --- a/bridges/bin/runtime-common/src/lib.rs +++ b/bridges/bin/runtime-common/src/lib.rs @@ -20,11 +20,10 @@ #![cfg_attr(not(feature = "std"), no_std)] pub mod extensions; -pub mod messages; + pub mod messages_api; pub mod messages_benchmarking; pub mod messages_call_ext; -pub mod messages_generation; pub mod messages_xcm_extension; pub mod parachains_benchmarking; diff --git a/bridges/bin/runtime-common/src/messages.rs b/bridges/bin/runtime-common/src/messages.rs deleted file mode 100644 index 03801d5279d..00000000000 --- a/bridges/bin/runtime-common/src/messages.rs +++ /dev/null @@ -1,704 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Types that allow runtime to act as a source/target endpoint of message lanes. -//! -//! Messages are assumed to be encoded `Call`s of the target chain. Call-dispatch -//! pallet is used to dispatch incoming messages. Message identified by a tuple -//! of to elements - message lane id and message nonce. - -pub use bp_runtime::{RangeInclusiveExt, UnderlyingChainOf, UnderlyingChainProvider}; - -use bp_header_chain::HeaderChain; -use bp_messages::{ - source_chain::TargetHeaderChain, - target_chain::{ProvedLaneMessages, ProvedMessages, SourceHeaderChain}, - InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData, - VerificationError, -}; -use bp_runtime::{Chain, RawStorageProof, Size, StorageProofChecker}; -use codec::{Decode, Encode}; -use frame_support::{traits::Get, weights::Weight}; -use hash_db::Hasher; -use scale_info::TypeInfo; -use sp_runtime::RuntimeDebug; -use sp_std::{marker::PhantomData, vec::Vec}; - -/// Bidirectional message bridge. -pub trait MessageBridge { - /// Name of the paired messages pallet instance at the Bridged chain. - /// - /// Should be the name that is used in the `construct_runtime!()` macro. - const BRIDGED_MESSAGES_PALLET_NAME: &'static str; - - /// This chain in context of message bridge. - type ThisChain: ThisChainWithMessages; - /// Bridged chain in context of message bridge. - type BridgedChain: BridgedChainWithMessages; - /// Bridged header chain. - type BridgedHeaderChain: HeaderChain>; -} - -/// This chain that has `pallet-bridge-messages` module. -pub trait ThisChainWithMessages: UnderlyingChainProvider { - /// Call origin on the chain. - type RuntimeOrigin; -} - -/// Bridged chain that has `pallet-bridge-messages` module. -pub trait BridgedChainWithMessages: UnderlyingChainProvider {} - -/// This chain in context of message bridge. -pub type ThisChain = ::ThisChain; -/// Bridged chain in context of message bridge. -pub type BridgedChain = ::BridgedChain; -/// Hash used on the chain. -pub type HashOf = bp_runtime::HashOf<::Chain>; -/// Hasher used on the chain. -pub type HasherOf = bp_runtime::HasherOf>; -/// Account id used on the chain. -pub type AccountIdOf = bp_runtime::AccountIdOf>; -/// Type of balances that is used on the chain. -pub type BalanceOf = bp_runtime::BalanceOf>; - -/// Sub-module that is declaring types required for processing This -> Bridged chain messages. -pub mod source { - use super::*; - - /// Message payload for This -> Bridged chain messages. - pub type FromThisChainMessagePayload = crate::messages_xcm_extension::XcmAsPlainPayload; - - /// Maximal size of outbound message payload. - pub struct FromThisChainMaximalOutboundPayloadSize(PhantomData); - - impl Get for FromThisChainMaximalOutboundPayloadSize { - fn get() -> u32 { - maximal_message_size::() - } - } - - /// Messages delivery proof from bridged chain: - /// - /// - hash of finalized header; - /// - storage proof of inbound lane state; - /// - lane id. - #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] - pub struct FromBridgedChainMessagesDeliveryProof { - /// Hash of the bridge header the proof is for. - pub bridged_header_hash: BridgedHeaderHash, - /// Storage trie proof generated for [`Self::bridged_header_hash`]. - pub storage_proof: RawStorageProof, - /// Lane id of which messages were delivered and the proof is for. - pub lane: LaneId, - } - - impl Size for FromBridgedChainMessagesDeliveryProof { - fn size(&self) -> u32 { - u32::try_from( - self.storage_proof - .iter() - .fold(0usize, |sum, node| sum.saturating_add(node.len())), - ) - .unwrap_or(u32::MAX) - } - } - - /// 'Parsed' message delivery proof - inbound lane id and its state. - pub type ParsedMessagesDeliveryProofFromBridgedChain = - (LaneId, InboundLaneData>>); - - /// Return maximal message size of This -> Bridged chain message. - pub fn maximal_message_size() -> u32 { - super::target::maximal_incoming_message_size( - UnderlyingChainOf::>::max_extrinsic_size(), - ) - } - - /// `TargetHeaderChain` implementation that is using default types and perform default checks. - pub struct TargetHeaderChainAdapter(PhantomData); - - impl TargetHeaderChain>> - for TargetHeaderChainAdapter - { - type MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof>>; - - fn verify_message(payload: &FromThisChainMessagePayload) -> Result<(), VerificationError> { - verify_chain_message::(payload) - } - - fn verify_messages_delivery_proof( - proof: Self::MessagesDeliveryProof, - ) -> Result<(LaneId, InboundLaneData>>), VerificationError> { - verify_messages_delivery_proof::(proof) - } - } - - /// Do basic Bridged-chain specific verification of This -> Bridged chain message. - /// - /// Ok result from this function means that the delivery transaction with this message - /// may be 'mined' by the target chain. - pub fn verify_chain_message( - payload: &FromThisChainMessagePayload, - ) -> Result<(), VerificationError> { - // IMPORTANT: any error that is returned here is fatal for the bridge, because - // this code is executed at the bridge hub and message sender actually lives - // at some sibling parachain. So we are failing **after** the message has been - // sent and we can't report it back to sender (unless error report mechanism is - // embedded into message and its dispatcher). - - // apart from maximal message size check (see below), we should also check the message - // dispatch weight here. But we assume that the bridged chain will just push the message - // to some queue (XCMP, UMP, DMP), so the weight is constant and fits the block. - - // The maximal size of extrinsic at Substrate-based chain depends on the - // `frame_system::Config::MaximumBlockLength` and - // `frame_system::Config::AvailableBlockRatio` constants. This check is here to be sure that - // the lane won't stuck because message is too large to fit into delivery transaction. - // - // **IMPORTANT NOTE**: the delivery transaction contains storage proof of the message, not - // the message itself. The proof is always larger than the message. But unless chain state - // is enormously large, it should be several dozens/hundreds of bytes. The delivery - // transaction also contains signatures and signed extensions. Because of this, we reserve - // 1/3 of the the maximal extrinsic size for this data. - if payload.len() > maximal_message_size::() as usize { - return Err(VerificationError::MessageTooLarge) - } - - Ok(()) - } - - /// Verify proof of This -> Bridged chain messages delivery. - /// - /// This function is used when Bridged chain is directly using GRANDPA finality. For Bridged - /// parachains, please use the `verify_messages_delivery_proof_from_parachain`. - pub fn verify_messages_delivery_proof( - proof: FromBridgedChainMessagesDeliveryProof>>, - ) -> Result, VerificationError> { - let FromBridgedChainMessagesDeliveryProof { bridged_header_hash, storage_proof, lane } = - proof; - let mut storage = - B::BridgedHeaderChain::storage_proof_checker(bridged_header_hash, storage_proof) - .map_err(VerificationError::HeaderChain)?; - // Messages delivery proof is just proof of single storage key read => any error - // is fatal. - let storage_inbound_lane_data_key = bp_messages::storage_keys::inbound_lane_data_key( - B::BRIDGED_MESSAGES_PALLET_NAME, - &lane, - ); - let inbound_lane_data = storage - .read_and_decode_mandatory_value(storage_inbound_lane_data_key.0.as_ref()) - .map_err(VerificationError::InboundLaneStorage)?; - - // check that the storage proof doesn't have any untouched trie nodes - storage.ensure_no_unused_nodes().map_err(VerificationError::StorageProof)?; - - Ok((lane, inbound_lane_data)) - } -} - -/// Sub-module that is declaring types required for processing Bridged -> This chain messages. -pub mod target { - use super::*; - - /// Decoded Bridged -> This message payload. - pub type FromBridgedChainMessagePayload = crate::messages_xcm_extension::XcmAsPlainPayload; - - /// Messages proof from bridged chain: - /// - /// - hash of finalized header; - /// - storage proof of messages and (optionally) outbound lane state; - /// - lane id; - /// - nonces (inclusive range) of messages which are included in this proof. - #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] - pub struct FromBridgedChainMessagesProof { - /// Hash of the finalized bridged header the proof is for. - pub bridged_header_hash: BridgedHeaderHash, - /// A storage trie proof of messages being delivered. - pub storage_proof: RawStorageProof, - /// Messages in this proof are sent over this lane. - pub lane: LaneId, - /// Nonce of the first message being delivered. - pub nonces_start: MessageNonce, - /// Nonce of the last message being delivered. - pub nonces_end: MessageNonce, - } - - impl Size for FromBridgedChainMessagesProof { - fn size(&self) -> u32 { - u32::try_from( - self.storage_proof - .iter() - .fold(0usize, |sum, node| sum.saturating_add(node.len())), - ) - .unwrap_or(u32::MAX) - } - } - - /// Return maximal dispatch weight of the message we're able to receive. - pub fn maximal_incoming_message_dispatch_weight(maximal_extrinsic_weight: Weight) -> Weight { - maximal_extrinsic_weight / 2 - } - - /// Return maximal message size given maximal extrinsic size. - pub fn maximal_incoming_message_size(maximal_extrinsic_size: u32) -> u32 { - maximal_extrinsic_size / 3 * 2 - } - - /// `SourceHeaderChain` implementation that is using default types and perform default checks. - pub struct SourceHeaderChainAdapter(PhantomData); - - impl SourceHeaderChain for SourceHeaderChainAdapter { - type MessagesProof = FromBridgedChainMessagesProof>>; - - fn verify_messages_proof( - proof: Self::MessagesProof, - messages_count: u32, - ) -> Result, VerificationError> { - verify_messages_proof::(proof, messages_count) - } - } - - /// Verify proof of Bridged -> This chain messages. - /// - /// This function is used when Bridged chain is directly using GRANDPA finality. For Bridged - /// parachains, please use the `verify_messages_proof_from_parachain`. - /// - /// The `messages_count` argument verification (sane limits) is supposed to be made - /// outside of this function. This function only verifies that the proof declares exactly - /// `messages_count` messages. - pub fn verify_messages_proof( - proof: FromBridgedChainMessagesProof>>, - messages_count: u32, - ) -> Result, VerificationError> { - let FromBridgedChainMessagesProof { - bridged_header_hash, - storage_proof, - lane, - nonces_start, - nonces_end, - } = proof; - let storage = - B::BridgedHeaderChain::storage_proof_checker(bridged_header_hash, storage_proof) - .map_err(VerificationError::HeaderChain)?; - let mut parser = StorageProofCheckerAdapter::<_, B> { storage, _dummy: Default::default() }; - let nonces_range = nonces_start..=nonces_end; - - // receiving proofs where end < begin is ok (if proof includes outbound lane state) - let messages_in_the_proof = nonces_range.checked_len().unwrap_or(0); - if messages_in_the_proof != MessageNonce::from(messages_count) { - return Err(VerificationError::MessagesCountMismatch) - } - - // Read messages first. All messages that are claimed to be in the proof must - // be in the proof. So any error in `read_value`, or even missing value is fatal. - // - // Mind that we allow proofs with no messages if outbound lane state is proved. - let mut messages = Vec::with_capacity(messages_in_the_proof as _); - for nonce in nonces_range { - let message_key = MessageKey { lane_id: lane, nonce }; - let message_payload = parser.read_and_decode_message_payload(&message_key)?; - messages.push(Message { key: message_key, payload: message_payload }); - } - - // Now let's check if proof contains outbound lane state proof. It is optional, so - // we simply ignore `read_value` errors and missing value. - let proved_lane_messages = ProvedLaneMessages { - lane_state: parser.read_and_decode_outbound_lane_data(&lane)?, - messages, - }; - - // Now we may actually check if the proof is empty or not. - if proved_lane_messages.lane_state.is_none() && proved_lane_messages.messages.is_empty() { - return Err(VerificationError::EmptyMessageProof) - } - - // check that the storage proof doesn't have any untouched trie nodes - parser - .storage - .ensure_no_unused_nodes() - .map_err(VerificationError::StorageProof)?; - - // We only support single lane messages in this generated_schema - let mut proved_messages = ProvedMessages::new(); - proved_messages.insert(lane, proved_lane_messages); - - Ok(proved_messages) - } - - struct StorageProofCheckerAdapter { - storage: StorageProofChecker, - _dummy: sp_std::marker::PhantomData, - } - - impl StorageProofCheckerAdapter { - fn read_and_decode_outbound_lane_data( - &mut self, - lane_id: &LaneId, - ) -> Result, VerificationError> { - let storage_outbound_lane_data_key = bp_messages::storage_keys::outbound_lane_data_key( - B::BRIDGED_MESSAGES_PALLET_NAME, - lane_id, - ); - - self.storage - .read_and_decode_opt_value(storage_outbound_lane_data_key.0.as_ref()) - .map_err(VerificationError::OutboundLaneStorage) - } - - fn read_and_decode_message_payload( - &mut self, - message_key: &MessageKey, - ) -> Result { - let storage_message_key = bp_messages::storage_keys::message_key( - B::BRIDGED_MESSAGES_PALLET_NAME, - &message_key.lane_id, - message_key.nonce, - ); - self.storage - .read_and_decode_mandatory_value(storage_message_key.0.as_ref()) - .map_err(VerificationError::MessageStorage) - } - } -} - -/// The `BridgeMessagesCall` used by a chain. -pub type BridgeMessagesCallOf = bp_messages::BridgeMessagesCall< - bp_runtime::AccountIdOf, - target::FromBridgedChainMessagesProof>, - source::FromBridgedChainMessagesDeliveryProof>, ->; - -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - messages_generation::{ - encode_all_messages, encode_lane_data, prepare_messages_storage_proof, - }, - mock::*, - }; - use bp_header_chain::{HeaderChainError, StoredHeaderDataBuilder}; - use bp_runtime::{HeaderId, StorageProofError}; - use codec::Encode; - use sp_core::H256; - use sp_runtime::traits::Header as _; - use sp_trie::accessed_nodes_tracker::Error as AccessedNodesTrackerError; - - #[test] - fn verify_chain_message_rejects_message_with_too_large_declared_weight() { - assert!(source::verify_chain_message::(&vec![ - 42; - BRIDGED_CHAIN_MAX_EXTRINSIC_WEIGHT - - 1 - ]) - .is_err()); - } - - #[test] - fn verify_chain_message_rejects_message_too_large_message() { - assert!(source::verify_chain_message::(&vec![ - 0; - source::maximal_message_size::() - as usize + 1 - ],) - .is_err()); - } - - #[test] - fn verify_chain_message_accepts_maximal_message() { - assert_eq!( - source::verify_chain_message::(&vec![ - 0; - source::maximal_message_size::() - as _ - ],), - Ok(()), - ); - } - - fn using_messages_proof( - nonces_end: MessageNonce, - outbound_lane_data: Option, - encode_message: impl Fn(MessageNonce, &MessagePayload) -> Option>, - encode_outbound_lane_data: impl Fn(&OutboundLaneData) -> Vec, - test: impl Fn(target::FromBridgedChainMessagesProof) -> R, - ) -> R { - let (state_root, storage_proof) = prepare_messages_storage_proof::( - TEST_LANE_ID, - 1..=nonces_end, - outbound_lane_data, - bp_runtime::StorageProofSize::Minimal(0), - vec![42], - encode_message, - encode_outbound_lane_data, - ); - - sp_io::TestExternalities::new(Default::default()).execute_with(move || { - let bridged_header = BridgedChainHeader::new( - 0, - Default::default(), - state_root, - Default::default(), - Default::default(), - ); - let bridged_header_hash = bridged_header.hash(); - - pallet_bridge_grandpa::BestFinalized::::put(HeaderId( - 0, - bridged_header_hash, - )); - pallet_bridge_grandpa::ImportedHeaders::::insert( - bridged_header_hash, - bridged_header.build(), - ); - test(target::FromBridgedChainMessagesProof { - bridged_header_hash, - storage_proof, - lane: TEST_LANE_ID, - nonces_start: 1, - nonces_end, - }) - }) - } - - #[test] - fn messages_proof_is_rejected_if_declared_less_than_actual_number_of_messages() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { - target::verify_messages_proof::(proof, 5) - }), - Err(VerificationError::MessagesCountMismatch), - ); - } - - #[test] - fn messages_proof_is_rejected_if_declared_more_than_actual_number_of_messages() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { - target::verify_messages_proof::(proof, 15) - }), - Err(VerificationError::MessagesCountMismatch), - ); - } - - #[test] - fn message_proof_is_rejected_if_header_is_missing_from_the_chain() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { - let bridged_header_hash = - pallet_bridge_grandpa::BestFinalized::::get().unwrap().1; - pallet_bridge_grandpa::ImportedHeaders::::remove(bridged_header_hash); - target::verify_messages_proof::(proof, 10) - }), - Err(VerificationError::HeaderChain(HeaderChainError::UnknownHeader)), - ); - } - - #[test] - fn message_proof_is_rejected_if_header_state_root_mismatches() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { - let bridged_header_hash = - pallet_bridge_grandpa::BestFinalized::::get().unwrap().1; - pallet_bridge_grandpa::ImportedHeaders::::insert( - bridged_header_hash, - BridgedChainHeader::new( - 0, - Default::default(), - Default::default(), - Default::default(), - Default::default(), - ) - .build(), - ); - target::verify_messages_proof::(proof, 10) - }), - Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( - StorageProofError::StorageRootMismatch - ))), - ); - } - - #[test] - fn message_proof_is_rejected_if_it_has_duplicate_trie_nodes() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |mut proof| { - let node = proof.storage_proof.pop().unwrap(); - proof.storage_proof.push(node.clone()); - proof.storage_proof.push(node); - target::verify_messages_proof::(proof, 10) - },), - Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( - StorageProofError::StorageProof(sp_trie::StorageProofError::DuplicateNodes.into()) - ))), - ); - } - - #[test] - fn message_proof_is_rejected_if_it_has_unused_trie_nodes() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |mut proof| { - proof.storage_proof.push(vec![42]); - target::verify_messages_proof::(proof, 10) - },), - Err(VerificationError::StorageProof(StorageProofError::AccessedNodesTracker( - AccessedNodesTrackerError::UnusedNodes.into() - ))), - ); - } - - #[test] - fn message_proof_is_rejected_if_required_message_is_missing() { - matches!( - using_messages_proof( - 10, - None, - |n, m| if n != 5 { Some(m.encode()) } else { None }, - encode_lane_data, - |proof| target::verify_messages_proof::(proof, 10) - ), - Err(VerificationError::MessageStorage(StorageProofError::StorageValueEmpty)), - ); - } - - #[test] - fn message_proof_is_rejected_if_message_decode_fails() { - matches!( - using_messages_proof( - 10, - None, - |n, m| { - let mut m = m.encode(); - if n == 5 { - m = vec![42] - } - Some(m) - }, - encode_lane_data, - |proof| target::verify_messages_proof::(proof, 10), - ), - Err(VerificationError::MessageStorage(StorageProofError::StorageValueDecodeFailed(_))), - ); - } - - #[test] - fn message_proof_is_rejected_if_outbound_lane_state_decode_fails() { - matches!( - using_messages_proof( - 10, - Some(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 1, - latest_generated_nonce: 1, - }), - encode_all_messages, - |d| { - let mut d = d.encode(); - d.truncate(1); - d - }, - |proof| target::verify_messages_proof::(proof, 10), - ), - Err(VerificationError::OutboundLaneStorage( - StorageProofError::StorageValueDecodeFailed(_) - )), - ); - } - - #[test] - fn message_proof_is_rejected_if_it_is_empty() { - assert_eq!( - using_messages_proof(0, None, encode_all_messages, encode_lane_data, |proof| { - target::verify_messages_proof::(proof, 0) - },), - Err(VerificationError::EmptyMessageProof), - ); - } - - #[test] - fn non_empty_message_proof_without_messages_is_accepted() { - assert_eq!( - using_messages_proof( - 0, - Some(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 1, - latest_generated_nonce: 1, - }), - encode_all_messages, - encode_lane_data, - |proof| target::verify_messages_proof::(proof, 0), - ), - Ok(vec![( - TEST_LANE_ID, - ProvedLaneMessages { - lane_state: Some(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 1, - latest_generated_nonce: 1, - }), - messages: Vec::new(), - }, - )] - .into_iter() - .collect()), - ); - } - - #[test] - fn non_empty_message_proof_is_accepted() { - assert_eq!( - using_messages_proof( - 1, - Some(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 1, - latest_generated_nonce: 1, - }), - encode_all_messages, - encode_lane_data, - |proof| target::verify_messages_proof::(proof, 1), - ), - Ok(vec![( - TEST_LANE_ID, - ProvedLaneMessages { - lane_state: Some(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 1, - latest_generated_nonce: 1, - }), - messages: vec![Message { - key: MessageKey { lane_id: TEST_LANE_ID, nonce: 1 }, - payload: vec![42], - }], - }, - )] - .into_iter() - .collect()), - ); - } - - #[test] - fn verify_messages_proof_does_not_panic_if_messages_count_mismatches() { - assert_eq!( - using_messages_proof(1, None, encode_all_messages, encode_lane_data, |mut proof| { - proof.nonces_end = u64::MAX; - target::verify_messages_proof::(proof, u32::MAX) - },), - Err(VerificationError::MessagesCountMismatch), - ); - } -} diff --git a/bridges/bin/runtime-common/src/messages_benchmarking.rs b/bridges/bin/runtime-common/src/messages_benchmarking.rs index 74494f79080..1880e65547f 100644 --- a/bridges/bin/runtime-common/src/messages_benchmarking.rs +++ b/bridges/bin/runtime-common/src/messages_benchmarking.rs @@ -19,23 +19,22 @@ #![cfg(feature = "runtime-benchmarks")] -use crate::{ - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - AccountIdOf, BridgedChain, HashOf, MessageBridge, ThisChain, - }, +use bp_messages::{ + source_chain::FromBridgedChainMessagesDeliveryProof, + target_chain::FromBridgedChainMessagesProof, MessagePayload, +}; +use bp_polkadot_core::parachains::ParaHash; +use bp_runtime::{AccountIdOf, Chain, HashOf, Parachain}; +use codec::Encode; +use frame_support::weights::Weight; +use pallet_bridge_messages::{ + benchmarking::{MessageDeliveryProofParams, MessageProofParams}, messages_generation::{ encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, prepare_messages_storage_proof, }, + BridgedChainOf, ThisChainOf, }; - -use bp_messages::MessagePayload; -use bp_polkadot_core::parachains::ParaHash; -use bp_runtime::{Chain, Parachain, StorageProofSize, UnderlyingChainOf}; -use codec::Encode; -use frame_support::weights::Weight; -use pallet_bridge_messages::benchmarking::{MessageDeliveryProofParams, MessageProofParams}; use sp_runtime::traits::{Header, Zero}; use sp_std::prelude::*; use xcm::latest::prelude::*; @@ -45,11 +44,7 @@ fn prepare_inbound_message( params: &MessageProofParams, successful_dispatch_message_generator: impl Fn(usize) -> MessagePayload, ) -> MessagePayload { - // we only care about **this** message size when message proof needs to be `Minimal` - let expected_size = match params.size { - StorageProofSize::Minimal(size) => size as usize, - _ => 0, - }; + let expected_size = params.proof_params.db_size.unwrap_or(0) as usize; // if we don't need a correct message, then we may just return some random blob if !params.is_successful_dispatch_expected { @@ -75,25 +70,32 @@ fn prepare_inbound_message( /// This method is intended to be used when benchmarking pallet, linked to the chain that /// uses GRANDPA finality. For parachains, please use the `prepare_message_proof_from_parachain` /// function. -pub fn prepare_message_proof_from_grandpa_chain( +pub fn prepare_message_proof_from_grandpa_chain( params: MessageProofParams, message_generator: impl Fn(usize) -> MessagePayload, -) -> (FromBridgedChainMessagesProof>>, Weight) +) -> (FromBridgedChainMessagesProof>>, Weight) where - R: pallet_bridge_grandpa::Config>>, + R: pallet_bridge_grandpa::Config> + + pallet_bridge_messages::Config< + MI, + BridgedHeaderChain = pallet_bridge_grandpa::Pallet, + >, FI: 'static, - B: MessageBridge, + MI: 'static, { // prepare storage proof - let (state_root, storage_proof) = prepare_messages_storage_proof::( - params.lane, - params.message_nonces.clone(), - params.outbound_lane_data.clone(), - params.size, - prepare_inbound_message(¶ms, message_generator), - encode_all_messages, - encode_lane_data, - ); + let (state_root, storage_proof) = + prepare_messages_storage_proof::, ThisChainOf>( + params.lane, + params.message_nonces.clone(), + params.outbound_lane_data.clone(), + params.proof_params, + |_| prepare_inbound_message(¶ms, &message_generator), + encode_all_messages, + encode_lane_data, + false, + false, + ); // update runtime storage let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::(state_root); @@ -118,30 +120,33 @@ where /// This method is intended to be used when benchmarking pallet, linked to the chain that /// uses parachain finality. For GRANDPA chains, please use the /// `prepare_message_proof_from_grandpa_chain` function. -pub fn prepare_message_proof_from_parachain( +pub fn prepare_message_proof_from_parachain( params: MessageProofParams, message_generator: impl Fn(usize) -> MessagePayload, -) -> (FromBridgedChainMessagesProof>>, Weight) +) -> (FromBridgedChainMessagesProof>>, Weight) where - R: pallet_bridge_parachains::Config, + R: pallet_bridge_parachains::Config + pallet_bridge_messages::Config, PI: 'static, - B: MessageBridge, - UnderlyingChainOf>: Chain + Parachain, + MI: 'static, + BridgedChainOf: Chain + Parachain, { // prepare storage proof - let (state_root, storage_proof) = prepare_messages_storage_proof::( - params.lane, - params.message_nonces.clone(), - params.outbound_lane_data.clone(), - params.size, - prepare_inbound_message(¶ms, message_generator), - encode_all_messages, - encode_lane_data, - ); + let (state_root, storage_proof) = + prepare_messages_storage_proof::, ThisChainOf>( + params.lane, + params.message_nonces.clone(), + params.outbound_lane_data.clone(), + params.proof_params, + |_| prepare_inbound_message(¶ms, &message_generator), + encode_all_messages, + encode_lane_data, + false, + false, + ); // update runtime storage let (_, bridged_header_hash) = - insert_header_to_parachains_pallet::>>(state_root); + insert_header_to_parachains_pallet::>(state_root); ( FromBridgedChainMessagesProof { @@ -160,21 +165,24 @@ where /// This method is intended to be used when benchmarking pallet, linked to the chain that /// uses GRANDPA finality. For parachains, please use the /// `prepare_message_delivery_proof_from_parachain` function. -pub fn prepare_message_delivery_proof_from_grandpa_chain( - params: MessageDeliveryProofParams>>, -) -> FromBridgedChainMessagesDeliveryProof>> +pub fn prepare_message_delivery_proof_from_grandpa_chain( + params: MessageDeliveryProofParams>>, +) -> FromBridgedChainMessagesDeliveryProof>> where - R: pallet_bridge_grandpa::Config>>, + R: pallet_bridge_grandpa::Config> + + pallet_bridge_messages::Config< + MI, + BridgedHeaderChain = pallet_bridge_grandpa::Pallet, + >, FI: 'static, - B: MessageBridge, + MI: 'static, { // prepare storage proof let lane = params.lane; - let (state_root, storage_proof) = prepare_message_delivery_storage_proof::( - params.lane, - params.inbound_lane_data, - params.size, - ); + let (state_root, storage_proof) = prepare_message_delivery_storage_proof::< + BridgedChainOf, + ThisChainOf, + >(params.lane, params.inbound_lane_data, params.proof_params); // update runtime storage let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::(state_root); @@ -191,26 +199,25 @@ where /// This method is intended to be used when benchmarking pallet, linked to the chain that /// uses parachain finality. For GRANDPA chains, please use the /// `prepare_message_delivery_proof_from_grandpa_chain` function. -pub fn prepare_message_delivery_proof_from_parachain( - params: MessageDeliveryProofParams>>, -) -> FromBridgedChainMessagesDeliveryProof>> +pub fn prepare_message_delivery_proof_from_parachain( + params: MessageDeliveryProofParams>>, +) -> FromBridgedChainMessagesDeliveryProof>> where - R: pallet_bridge_parachains::Config, + R: pallet_bridge_parachains::Config + pallet_bridge_messages::Config, PI: 'static, - B: MessageBridge, - UnderlyingChainOf>: Chain + Parachain, + MI: 'static, + BridgedChainOf: Chain + Parachain, { // prepare storage proof let lane = params.lane; - let (state_root, storage_proof) = prepare_message_delivery_storage_proof::( - params.lane, - params.inbound_lane_data, - params.size, - ); + let (state_root, storage_proof) = prepare_message_delivery_storage_proof::< + BridgedChainOf, + ThisChainOf, + >(params.lane, params.inbound_lane_data, params.proof_params); // update runtime storage let (_, bridged_header_hash) = - insert_header_to_parachains_pallet::>>(state_root); + insert_header_to_parachains_pallet::>(state_root); FromBridgedChainMessagesDeliveryProof { bridged_header_hash: bridged_header_hash.into(), diff --git a/bridges/bin/runtime-common/src/messages_call_ext.rs b/bridges/bin/runtime-common/src/messages_call_ext.rs index fb07f7b6dd6..a9ee1969ae0 100644 --- a/bridges/bin/runtime-common/src/messages_call_ext.rs +++ b/bridges/bin/runtime-common/src/messages_call_ext.rs @@ -14,19 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Parity Bridges Common. If not, see . -//! Signed extension for the `pallet-bridge-messages` that is able to reject obsolete -//! (and some other invalid) transactions. +//! Helpers for easier manipulation of call processing with signed extensions. -use crate::messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, +use bp_messages::{ + target_chain::MessageDispatch, ChainWithMessages, InboundLaneData, LaneId, MessageNonce, }; -use bp_messages::{target_chain::MessageDispatch, InboundLaneData, LaneId, MessageNonce}; -use bp_runtime::OwnedBridgeModule; -use frame_support::{ - dispatch::CallableCallFor, - traits::{Get, IsSubType}, -}; -use pallet_bridge_messages::{Config, Pallet}; +use bp_runtime::{AccountIdOf, OwnedBridgeModule}; +use frame_support::{dispatch::CallableCallFor, traits::IsSubType}; +use pallet_bridge_messages::{BridgedChainOf, Config, Pallet}; use sp_runtime::{transaction_validity::TransactionValidity, RuntimeDebug}; use sp_std::ops::RangeInclusive; @@ -213,18 +208,8 @@ pub trait MessagesCallSubType, I: 'static>: } impl< - BridgedHeaderHash, - SourceHeaderChain: bp_messages::target_chain::SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof, - >, - TargetHeaderChain: bp_messages::source_chain::TargetHeaderChain< - >::OutboundPayload, - ::AccountId, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof, - >, Call: IsSubType, T>>, - T: frame_system::Config - + Config, + T: frame_system::Config + Config, I: 'static, > MessagesCallSubType for T::RuntimeCall { @@ -340,16 +325,17 @@ impl< /// Returns occupation state of unrewarded relayers vector. fn unrewarded_relayers_occupation, I: 'static>( - inbound_lane_data: &InboundLaneData, + inbound_lane_data: &InboundLaneData>>, ) -> UnrewardedRelayerOccupation { UnrewardedRelayerOccupation { - free_relayer_slots: T::MaxUnrewardedRelayerEntriesAtInboundLane::get() + free_relayer_slots: T::BridgedChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX .saturating_sub(inbound_lane_data.relayers.len() as MessageNonce), free_message_slots: { let unconfirmed_messages = inbound_lane_data .last_delivered_nonce() .saturating_sub(inbound_lane_data.last_confirmed_nonce); - T::MaxUnconfirmedMessagesAtInboundLane::get().saturating_sub(unconfirmed_messages) + T::BridgedChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX + .saturating_sub(unconfirmed_messages) }, } } @@ -358,22 +344,20 @@ fn unrewarded_relayers_occupation, I: 'static>( mod tests { use super::*; use crate::{ - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - }, messages_call_ext::MessagesCallSubType, - mock::{ - DummyMessageDispatch, MaxUnconfirmedMessagesAtInboundLane, - MaxUnrewardedRelayerEntriesAtInboundLane, TestRuntime, ThisChainRuntimeCall, - }, + mock::{BridgedUnderlyingChain, DummyMessageDispatch, TestRuntime, ThisChainRuntimeCall}, + }; + use bp_messages::{ + source_chain::FromBridgedChainMessagesDeliveryProof, + target_chain::FromBridgedChainMessagesProof, DeliveredMessages, UnrewardedRelayer, + UnrewardedRelayersState, }; - use bp_messages::{DeliveredMessages, UnrewardedRelayer, UnrewardedRelayersState}; use sp_std::ops::RangeInclusive; fn fill_unrewarded_relayers() { let mut inbound_lane_state = pallet_bridge_messages::InboundLanes::::get(LaneId([0, 0, 0, 0])); - for n in 0..MaxUnrewardedRelayerEntriesAtInboundLane::get() { + for n in 0..BridgedUnderlyingChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX { inbound_lane_state.relayers.push_back(UnrewardedRelayer { relayer: Default::default(), messages: DeliveredMessages { begin: n + 1, end: n + 1 }, @@ -392,7 +376,7 @@ mod tests { relayer: Default::default(), messages: DeliveredMessages { begin: 1, - end: MaxUnconfirmedMessagesAtInboundLane::get(), + end: BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, }, }); pallet_bridge_messages::InboundLanes::::insert( @@ -418,13 +402,13 @@ mod tests { messages_count: nonces_end.checked_sub(nonces_start).map(|x| x + 1).unwrap_or(0) as u32, dispatch_weight: frame_support::weights::Weight::zero(), - proof: FromBridgedChainMessagesProof { + proof: Box::new(FromBridgedChainMessagesProof { bridged_header_hash: Default::default(), - storage_proof: vec![], + storage_proof: Default::default(), lane: LaneId([0, 0, 0, 0]), nonces_start, nonces_end, - }, + }), }, ) .check_obsolete_call() @@ -508,8 +492,8 @@ mod tests { sp_io::TestExternalities::new(Default::default()).execute_with(|| { fill_unrewarded_messages(); assert!(validate_message_delivery( - MaxUnconfirmedMessagesAtInboundLane::get(), - MaxUnconfirmedMessagesAtInboundLane::get() - 1 + BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX - 1 )); }); } @@ -540,7 +524,7 @@ mod tests { pallet_bridge_messages::Call::::receive_messages_delivery_proof { proof: FromBridgedChainMessagesDeliveryProof { bridged_header_hash: Default::default(), - storage_proof: Vec::new(), + storage_proof: Default::default(), lane: LaneId([0, 0, 0, 0]), }, relayers_state: UnrewardedRelayersState { @@ -608,7 +592,7 @@ mod tests { free_message_slots: if is_empty { 0 } else { - MaxUnconfirmedMessagesAtInboundLane::get() + BridgedUnderlyingChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX }, }, }, diff --git a/bridges/bin/runtime-common/src/mock.rs b/bridges/bin/runtime-common/src/mock.rs index f4947466789..2f248a7162a 100644 --- a/bridges/bin/runtime-common/src/mock.rs +++ b/bridges/bin/runtime-common/src/mock.rs @@ -18,26 +18,16 @@ #![cfg(test)] -use crate::messages::{ - source::{ - FromThisChainMaximalOutboundPayloadSize, FromThisChainMessagePayload, - TargetHeaderChainAdapter, - }, - target::{FromBridgedChainMessagePayload, SourceHeaderChainAdapter}, - BridgedChainWithMessages, HashOf, MessageBridge, ThisChainWithMessages, -}; +use crate::messages_xcm_extension::XcmAsPlainPayload; -use bp_header_chain::{ChainWithGrandpa, HeaderChain}; +use bp_header_chain::ChainWithGrandpa; use bp_messages::{ target_chain::{DispatchMessage, MessageDispatch}, - LaneId, MessageNonce, + ChainWithMessages, LaneId, MessageNonce, }; use bp_parachains::SingleParaStoredHeaderDataBuilder; use bp_relayers::PayRewardFromAccount; -use bp_runtime::{ - messages::MessageDispatchResult, Chain, ChainId, Parachain, UnderlyingChainProvider, -}; -use codec::{Decode, Encode}; +use bp_runtime::{messages::MessageDispatchResult, Chain, ChainId, Parachain}; use frame_support::{ derive_impl, parameter_types, weights::{ConstantMultiplier, IdentityFee, RuntimeDbWeight, Weight}, @@ -46,7 +36,7 @@ use pallet_transaction_payment::Multiplier; use sp_runtime::{ testing::H256, traits::{BlakeTwo256, ConstU32, ConstU64, ConstU8}, - FixedPointNumber, Perquintill, + FixedPointNumber, Perquintill, StateVersion, }; /// Account identifier at `ThisChain`. @@ -61,8 +51,6 @@ pub type ThisChainHash = H256; pub type ThisChainHasher = BlakeTwo256; /// Runtime call at `ThisChain`. pub type ThisChainRuntimeCall = RuntimeCall; -/// Runtime call origin at `ThisChain`. -pub type ThisChainCallOrigin = RuntimeOrigin; /// Header of `ThisChain`. pub type ThisChainHeader = sp_runtime::generic::Header; /// Block of `ThisChain`. @@ -100,8 +88,6 @@ pub type TestStakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed< pub const TEST_LANE_ID: LaneId = LaneId([0, 0, 0, 0]); /// Bridged chain id used in tests. pub const TEST_BRIDGED_CHAIN_ID: ChainId = *b"brdg"; -/// Maximal extrinsic weight at the `BridgedChain`. -pub const BRIDGED_CHAIN_MAX_EXTRINSIC_WEIGHT: usize = 2048; /// Maximal extrinsic size at the `BridgedChain`. pub const BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE: u32 = 1024; @@ -126,7 +112,6 @@ crate::generate_bridge_reject_obsolete_headers_and_messages! { parameter_types! { pub const ActiveOutboundLanes: &'static [LaneId] = &[TEST_LANE_ID]; - pub const BridgedChainId: ChainId = TEST_BRIDGED_CHAIN_ID; pub const BridgedParasPalletName: &'static str = "Paras"; pub const ExistentialDeposit: ThisChainBalance = 500; pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { read: 1, write: 2 }; @@ -136,8 +121,6 @@ parameter_types! { pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(3, 100_000); pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000u128); pub MaximumMultiplier: Multiplier = sp_runtime::traits::Bounded::max_value(); - pub const MaxUnrewardedRelayerEntriesAtInboundLane: MessageNonce = 16; - pub const MaxUnconfirmedMessagesAtInboundLane: MessageNonce = 1_000; pub const ReserveId: [u8; 8] = *b"brdgrlrs"; } @@ -203,17 +186,12 @@ impl pallet_bridge_messages::Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type WeightInfo = pallet_bridge_messages::weights::BridgeWeight; type ActiveOutboundLanes = ActiveOutboundLanes; - type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; - type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; - type MaximalOutboundPayloadSize = FromThisChainMaximalOutboundPayloadSize; - type OutboundPayload = FromThisChainMessagePayload; + type OutboundPayload = XcmAsPlainPayload; - type InboundPayload = FromBridgedChainMessagePayload; - type InboundRelayer = BridgedChainAccountId; + type InboundPayload = Vec; type DeliveryPayments = (); - type TargetHeaderChain = TargetHeaderChainAdapter; type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter< TestRuntime, (), @@ -221,9 +199,11 @@ impl pallet_bridge_messages::Config for TestRuntime { >; type OnMessagesDelivered = (); - type SourceHeaderChain = SourceHeaderChainAdapter; type MessageDispatch = DummyMessageDispatch; - type BridgedChainId = BridgedChainId; + + type ThisChain = ThisUnderlyingChain; + type BridgedChain = BridgedUnderlyingChain; + type BridgedHeaderChain = BridgeGrandpa; } impl pallet_bridge_relayers::Config for TestRuntime { @@ -262,55 +242,6 @@ impl MessageDispatch for DummyMessageDispatch { } } -/// Bridge that is deployed on `ThisChain` and allows sending/receiving messages to/from -/// `BridgedChain`. -#[derive(Debug, PartialEq, Eq)] -pub struct OnThisChainBridge; - -impl MessageBridge for OnThisChainBridge { - const BRIDGED_MESSAGES_PALLET_NAME: &'static str = ""; - - type ThisChain = ThisChain; - type BridgedChain = BridgedChain; - type BridgedHeaderChain = pallet_bridge_grandpa::GrandpaChainHeaders; -} - -/// Bridge that is deployed on `BridgedChain` and allows sending/receiving messages to/from -/// `ThisChain`. -#[derive(Debug, PartialEq, Eq)] -pub struct OnBridgedChainBridge; - -impl MessageBridge for OnBridgedChainBridge { - const BRIDGED_MESSAGES_PALLET_NAME: &'static str = ""; - - type ThisChain = BridgedChain; - type BridgedChain = ThisChain; - type BridgedHeaderChain = ThisHeaderChain; -} - -/// Dummy implementation of `HeaderChain` for `ThisChain` at the `BridgedChain`. -pub struct ThisHeaderChain; - -impl HeaderChain for ThisHeaderChain { - fn finalized_header_state_root(_hash: HashOf) -> Option> { - unreachable!() - } -} - -/// Call origin at `BridgedChain`. -#[derive(Clone, Debug)] -pub struct BridgedChainOrigin; - -impl From - for Result, BridgedChainOrigin> -{ - fn from( - _origin: BridgedChainOrigin, - ) -> Result, BridgedChainOrigin> { - unreachable!() - } -} - /// Underlying chain of `ThisChain`. pub struct ThisUnderlyingChain; @@ -326,6 +257,8 @@ impl Chain for ThisUnderlyingChain { type Nonce = u32; type Signature = sp_runtime::MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE } @@ -335,29 +268,20 @@ impl Chain for ThisUnderlyingChain { } } -/// The chain where we are in tests. -pub struct ThisChain; - -impl UnderlyingChainProvider for ThisChain { - type Chain = ThisUnderlyingChain; -} +impl ChainWithMessages for ThisUnderlyingChain { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = ""; -impl ThisChainWithMessages for ThisChain { - type RuntimeOrigin = ThisChainCallOrigin; + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 16; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 1000; } -impl BridgedChainWithMessages for ThisChain {} - /// Underlying chain of `BridgedChain`. pub struct BridgedUnderlyingChain; /// Some parachain under `BridgedChain` consensus. pub struct BridgedUnderlyingParachain; -/// Runtime call of the `BridgedChain`. -#[derive(Decode, Encode)] -pub struct BridgedChainCall; impl Chain for BridgedUnderlyingChain { - const ID: ChainId = *b"buch"; + const ID: ChainId = TEST_BRIDGED_CHAIN_ID; type BlockNumber = BridgedChainBlockNumber; type Hash = BridgedChainHash; @@ -368,6 +292,8 @@ impl Chain for BridgedUnderlyingChain { type Nonce = u32; type Signature = sp_runtime::MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE } @@ -384,6 +310,12 @@ impl ChainWithGrandpa for BridgedUnderlyingChain { const AVERAGE_HEADER_SIZE: u32 = 64; } +impl ChainWithMessages for BridgedUnderlyingChain { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = ""; + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 16; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 1000; +} + impl Chain for BridgedUnderlyingParachain { const ID: ChainId = *b"bupc"; @@ -396,6 +328,8 @@ impl Chain for BridgedUnderlyingParachain { type Nonce = u32; type Signature = sp_runtime::MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE } @@ -409,19 +343,6 @@ impl Parachain for BridgedUnderlyingParachain { const MAX_HEADER_SIZE: u32 = 1_024; } -/// The other, bridged chain, used in tests. -pub struct BridgedChain; - -impl UnderlyingChainProvider for BridgedChain { - type Chain = BridgedUnderlyingChain; -} - -impl ThisChainWithMessages for BridgedChain { - type RuntimeOrigin = BridgedChainOrigin; -} - -impl BridgedChainWithMessages for BridgedChain {} - /// Run test within test externalities. pub fn run_test(test: impl FnOnce()) { sp_io::TestExternalities::new(Default::default()).execute_with(test) diff --git a/bridges/bin/runtime-common/src/parachains_benchmarking.rs b/bridges/bin/runtime-common/src/parachains_benchmarking.rs index b3050b9ac0f..bcbd779b44d 100644 --- a/bridges/bin/runtime-common/src/parachains_benchmarking.rs +++ b/bridges/bin/runtime-common/src/parachains_benchmarking.rs @@ -18,14 +18,11 @@ #![cfg(feature = "runtime-benchmarks")] -use crate::{ - messages_benchmarking::insert_header_to_grandpa_pallet, - messages_generation::grow_trie_leaf_value, -}; +use crate::messages_benchmarking::insert_header_to_grandpa_pallet; use bp_parachains::parachain_head_storage_key_at_source; use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; -use bp_runtime::{record_all_trie_keys, StorageProofSize}; +use bp_runtime::{grow_storage_value, record_all_trie_keys, Chain, UnverifiedStorageProofParams}; use codec::Encode; use frame_support::traits::Get; use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; @@ -39,14 +36,14 @@ use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; pub fn prepare_parachain_heads_proof( parachains: &[ParaId], parachain_head_size: u32, - size: StorageProofSize, + proof_params: UnverifiedStorageProofParams, ) -> (RelayBlockNumber, RelayBlockHash, ParaHeadsProof, Vec<(ParaId, ParaHash)>) where R: pallet_bridge_parachains::Config + pallet_bridge_grandpa::Config, PI: 'static, >::BridgedChain: - bp_runtime::Chain, + Chain, { let parachain_head = ParaHead(vec![0u8; parachain_head_size as usize]); @@ -64,7 +61,7 @@ where let storage_key = parachain_head_storage_key_at_source(R::ParasPalletName::get(), *parachain); let leaf_data = if i == 0 { - grow_trie_leaf_value(parachain_head.encode(), size) + grow_storage_value(parachain_head.encode(), &proof_params) } else { parachain_head.encode() }; diff --git a/bridges/chains/chain-bridge-hub-kusama/src/lib.rs b/bridges/chains/chain-bridge-hub-kusama/src/lib.rs index ef3ef4ab7b7..c990e8a12f3 100644 --- a/bridges/chains/chain-bridge-hub-kusama/src/lib.rs +++ b/bridges/chains/chain-bridge-hub-kusama/src/lib.rs @@ -29,7 +29,7 @@ use frame_support::{ dispatch::DispatchClass, sp_runtime::{MultiAddress, MultiSigner}, }; -use sp_runtime::RuntimeDebug; +use sp_runtime::{RuntimeDebug, StateVersion}; /// BridgeHubKusama parachain. #[derive(RuntimeDebug)] @@ -48,6 +48,8 @@ impl Chain for BridgeHubKusama { type Nonce = Nonce; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { *BlockLength::get().max.get(DispatchClass::Normal) } diff --git a/bridges/chains/chain-bridge-hub-polkadot/src/lib.rs b/bridges/chains/chain-bridge-hub-polkadot/src/lib.rs index 9db71af928e..7379b8863b1 100644 --- a/bridges/chains/chain-bridge-hub-polkadot/src/lib.rs +++ b/bridges/chains/chain-bridge-hub-polkadot/src/lib.rs @@ -26,7 +26,7 @@ use bp_runtime::{ decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, ChainId, Parachain, }; use frame_support::dispatch::DispatchClass; -use sp_runtime::RuntimeDebug; +use sp_runtime::{RuntimeDebug, StateVersion}; /// BridgeHubPolkadot parachain. #[derive(RuntimeDebug)] @@ -45,6 +45,8 @@ impl Chain for BridgeHubPolkadot { type Nonce = Nonce; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { *BlockLength::get().max.get(DispatchClass::Normal) } diff --git a/bridges/chains/chain-bridge-hub-rococo/src/lib.rs b/bridges/chains/chain-bridge-hub-rococo/src/lib.rs index d7097f01c53..73af997b995 100644 --- a/bridges/chains/chain-bridge-hub-rococo/src/lib.rs +++ b/bridges/chains/chain-bridge-hub-rococo/src/lib.rs @@ -25,8 +25,10 @@ use bp_messages::*; use bp_runtime::{ decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, ChainId, Parachain, }; -use frame_support::dispatch::DispatchClass; -use sp_runtime::{MultiAddress, MultiSigner, RuntimeDebug}; +use frame_support::{ + dispatch::DispatchClass, + sp_runtime::{MultiAddress, MultiSigner, RuntimeDebug, StateVersion}, +}; /// BridgeHubRococo parachain. #[derive(RuntimeDebug)] @@ -45,6 +47,8 @@ impl Chain for BridgeHubRococo { type Nonce = Nonce; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { *BlockLength::get().max.get(DispatchClass::Normal) } @@ -103,10 +107,10 @@ frame_support::parameter_types! { pub const BridgeHubRococoBaseXcmFeeInRocs: u128 = 59_034_266; /// Transaction fee that is paid at the Rococo BridgeHub for delivering single inbound message. - /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_complex_message_delivery_transaction` + `33%`) + /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_standalone_message_delivery_transaction` + `33%`) pub const BridgeHubRococoBaseDeliveryFeeInRocs: u128 = 314_037_860; /// Transaction fee that is paid at the Rococo BridgeHub for delivering single outbound message confirmation. - /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_complex_message_confirmation_transaction` + `33%`) + /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_standalone_message_confirmation_transaction` + `33%`) pub const BridgeHubRococoBaseConfirmationFeeInRocs: u128 = 57_414_813; } diff --git a/bridges/chains/chain-bridge-hub-westend/src/lib.rs b/bridges/chains/chain-bridge-hub-westend/src/lib.rs index 800f290d7bf..17ff2c858a1 100644 --- a/bridges/chains/chain-bridge-hub-westend/src/lib.rs +++ b/bridges/chains/chain-bridge-hub-westend/src/lib.rs @@ -25,7 +25,7 @@ use bp_runtime::{ decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, ChainId, Parachain, }; use frame_support::dispatch::DispatchClass; -use sp_runtime::RuntimeDebug; +use sp_runtime::{RuntimeDebug, StateVersion}; /// BridgeHubWestend parachain. #[derive(RuntimeDebug)] @@ -44,6 +44,8 @@ impl Chain for BridgeHubWestend { type Nonce = Nonce; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { *BlockLength::get().max.get(DispatchClass::Normal) } diff --git a/bridges/chains/chain-kusama/src/lib.rs b/bridges/chains/chain-kusama/src/lib.rs index fd7172c5869..dcd0b23abbb 100644 --- a/bridges/chains/chain-kusama/src/lib.rs +++ b/bridges/chains/chain-kusama/src/lib.rs @@ -23,7 +23,7 @@ pub use bp_polkadot_core::*; use bp_header_chain::ChainWithGrandpa; use bp_runtime::{decl_bridge_finality_runtime_apis, Chain, ChainId}; -use frame_support::weights::Weight; +use frame_support::{sp_runtime::StateVersion, weights::Weight}; /// Kusama Chain pub struct Kusama; @@ -41,6 +41,8 @@ impl Chain for Kusama { type Nonce = Nonce; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V0; + fn max_extrinsic_size() -> u32 { max_extrinsic_size() } diff --git a/bridges/chains/chain-polkadot-bulletin/src/lib.rs b/bridges/chains/chain-polkadot-bulletin/src/lib.rs index f3d300567f2..88980a95750 100644 --- a/bridges/chains/chain-polkadot-bulletin/src/lib.rs +++ b/bridges/chains/chain-polkadot-bulletin/src/lib.rs @@ -37,7 +37,9 @@ use frame_support::{ }; use frame_system::limits; use scale_info::TypeInfo; -use sp_runtime::{traits::DispatchInfoOf, transaction_validity::TransactionValidityError, Perbill}; +use sp_runtime::{ + traits::DispatchInfoOf, transaction_validity::TransactionValidityError, Perbill, StateVersion, +}; // This chain reuses most of Polkadot primitives. pub use bp_polkadot_core::{ @@ -192,6 +194,8 @@ impl Chain for PolkadotBulletin { type Nonce = Nonce; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { *BlockLength::get().max.get(DispatchClass::Normal) } diff --git a/bridges/chains/chain-polkadot/src/lib.rs b/bridges/chains/chain-polkadot/src/lib.rs index a8cac0467d5..f4b262d4073 100644 --- a/bridges/chains/chain-polkadot/src/lib.rs +++ b/bridges/chains/chain-polkadot/src/lib.rs @@ -25,7 +25,7 @@ use bp_header_chain::ChainWithGrandpa; use bp_runtime::{ decl_bridge_finality_runtime_apis, extensions::PrevalidateAttests, Chain, ChainId, }; -use frame_support::weights::Weight; +use frame_support::{sp_runtime::StateVersion, weights::Weight}; /// Polkadot Chain pub struct Polkadot; @@ -43,6 +43,8 @@ impl Chain for Polkadot { type Nonce = Nonce; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V0; + fn max_extrinsic_size() -> u32 { max_extrinsic_size() } diff --git a/bridges/chains/chain-rococo/src/lib.rs b/bridges/chains/chain-rococo/src/lib.rs index b290fe71c82..bfcafdf41ea 100644 --- a/bridges/chains/chain-rococo/src/lib.rs +++ b/bridges/chains/chain-rococo/src/lib.rs @@ -23,7 +23,7 @@ pub use bp_polkadot_core::*; use bp_header_chain::ChainWithGrandpa; use bp_runtime::{decl_bridge_finality_runtime_apis, Chain, ChainId}; -use frame_support::weights::Weight; +use frame_support::{sp_runtime::StateVersion, weights::Weight}; /// Rococo Chain pub struct Rococo; @@ -41,6 +41,8 @@ impl Chain for Rococo { type Nonce = Nonce; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { max_extrinsic_size() } diff --git a/bridges/chains/chain-westend/src/lib.rs b/bridges/chains/chain-westend/src/lib.rs index ef451f7de0a..2a247e03e59 100644 --- a/bridges/chains/chain-westend/src/lib.rs +++ b/bridges/chains/chain-westend/src/lib.rs @@ -23,7 +23,7 @@ pub use bp_polkadot_core::*; use bp_header_chain::ChainWithGrandpa; use bp_runtime::{decl_bridge_finality_runtime_apis, Chain, ChainId}; -use frame_support::weights::Weight; +use frame_support::{sp_runtime::StateVersion, weights::Weight}; /// Westend Chain pub struct Westend; @@ -41,6 +41,8 @@ impl Chain for Westend { type Nonce = Nonce; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { max_extrinsic_size() } diff --git a/bridges/modules/beefy/src/mock.rs b/bridges/modules/beefy/src/mock.rs index 53efd57c29a..3b751ddf066 100644 --- a/bridges/modules/beefy/src/mock.rs +++ b/bridges/modules/beefy/src/mock.rs @@ -29,6 +29,7 @@ use sp_core::{sr25519::Signature, Pair}; use sp_runtime::{ testing::{Header, H256}, traits::{BlakeTwo256, Hash}, + StateVersion, }; pub use sp_consensus_beefy::ecdsa_crypto::{AuthorityId as BeefyId, Pair as BeefyPair}; @@ -93,6 +94,8 @@ impl Chain for TestBridgedChain { type Nonce = u64; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { unreachable!() } diff --git a/bridges/modules/grandpa/Cargo.toml b/bridges/modules/grandpa/Cargo.toml index 307c7ddaaff..6d1419ae5b0 100644 --- a/bridges/modules/grandpa/Cargo.toml +++ b/bridges/modules/grandpa/Cargo.toml @@ -14,7 +14,6 @@ workspace = true [dependencies] codec = { workspace = true } -finality-grandpa = { workspace = true } log = { workspace = true } scale-info = { features = ["derive"], workspace = true } @@ -30,13 +29,13 @@ frame-system = { workspace = true } sp-consensus-grandpa = { features = ["serde"], workspace = true } sp-runtime = { features = ["serde"], workspace = true } sp-std = { workspace = true } -sp-trie = { workspace = true } # Optional Benchmarking Dependencies bp-test-utils = { optional = true, workspace = true } frame-benchmarking = { optional = true, workspace = true } [dev-dependencies] +bp-runtime = { features = ["test-helpers"], workspace = true } sp-core = { workspace = true, default-features = true } sp-io = { workspace = true, default-features = true } @@ -47,7 +46,6 @@ std = [ "bp-runtime/std", "bp-test-utils/std", "codec/std", - "finality-grandpa/std", "frame-benchmarking/std", "frame-support/std", "frame-system/std", @@ -56,7 +54,6 @@ std = [ "sp-consensus-grandpa/std", "sp-runtime/std", "sp-std/std", - "sp-trie/std", ] runtime-benchmarks = [ "bp-test-utils", diff --git a/bridges/modules/grandpa/src/lib.rs b/bridges/modules/grandpa/src/lib.rs index 3b77f676870..c62951b7465 100644 --- a/bridges/modules/grandpa/src/lib.rs +++ b/bridges/modules/grandpa/src/lib.rs @@ -1443,11 +1443,14 @@ mod tests { } #[test] - fn parse_finalized_storage_proof_rejects_proof_on_unknown_header() { + fn verify_storage_proof_rejects_unknown_header() { run_test(|| { assert_noop!( - Pallet::::storage_proof_checker(Default::default(), vec![],) - .map(|_| ()), + Pallet::::verify_storage_proof( + Default::default(), + Default::default(), + ) + .map(|_| ()), bp_header_chain::HeaderChainError::UnknownHeader, ); }); @@ -1465,9 +1468,7 @@ mod tests { >::put(HeaderId(2, hash)); >::insert(hash, header.build()); - assert_ok!( - Pallet::::storage_proof_checker(hash, storage_proof).map(|_| ()) - ); + assert_ok!(Pallet::::verify_storage_proof(hash, storage_proof).map(|_| ())); }); } diff --git a/bridges/modules/grandpa/src/mock.rs b/bridges/modules/grandpa/src/mock.rs index 27df9d9c78f..71af6182e05 100644 --- a/bridges/modules/grandpa/src/mock.rs +++ b/bridges/modules/grandpa/src/mock.rs @@ -20,7 +20,8 @@ use bp_header_chain::ChainWithGrandpa; use bp_runtime::{Chain, ChainId}; use frame_support::{ - construct_runtime, derive_impl, parameter_types, traits::Hooks, weights::Weight, + construct_runtime, derive_impl, parameter_types, sp_runtime::StateVersion, traits::Hooks, + weights::Weight, }; use sp_core::sr25519::Signature; @@ -78,6 +79,8 @@ impl Chain for TestBridgedChain { type Nonce = u64; type Signature = Signature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { unreachable!() } diff --git a/bridges/modules/messages/Cargo.toml b/bridges/modules/messages/Cargo.toml index 573d0ba4766..33f524030d2 100644 --- a/bridges/modules/messages/Cargo.toml +++ b/bridges/modules/messages/Cargo.toml @@ -13,52 +13,67 @@ workspace = true [dependencies] codec = { workspace = true } log = { workspace = true } -num-traits = { workspace = true } scale-info = { features = ["derive"], workspace = true } # Bridge dependencies - +bp-header-chain = { workspace = true } bp-messages = { workspace = true } bp-runtime = { workspace = true } # Substrate Dependencies - frame-benchmarking = { optional = true, workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } sp-std = { workspace = true } +sp-trie = { optional = true, workspace = true } [dev-dependencies] -bp-test-utils = { workspace = true, default-features = true } -pallet-balances = { workspace = true, default-features = true } -sp-io = { workspace = true, default-features = true } +bp-runtime = { features = ["test-helpers"], workspace = true } +bp-test-utils = { workspace = true } +pallet-balances = { workspace = true } +pallet-bridge-grandpa = { workspace = true } +sp-io = { workspace = true } +sp-core = { workspace = true } [features] default = ["std"] std = [ + "bp-header-chain/std", "bp-messages/std", "bp-runtime/std", + "bp-test-utils/std", "codec/std", "frame-benchmarking/std", "frame-support/std", "frame-system/std", "log/std", - "num-traits/std", + "pallet-balances/std", + "pallet-bridge-grandpa/std", "scale-info/std", + "sp-core/std", + "sp-io/std", "sp-runtime/std", "sp-std/std", + "sp-trie/std", ] runtime-benchmarks = [ + "bp-runtime/test-helpers", "frame-benchmarking/runtime-benchmarks", "frame-support/runtime-benchmarks", "frame-system/runtime-benchmarks", "pallet-balances/runtime-benchmarks", + "pallet-bridge-grandpa/runtime-benchmarks", "sp-runtime/runtime-benchmarks", ] try-runtime = [ "frame-support/try-runtime", "frame-system/try-runtime", "pallet-balances/try-runtime", + "pallet-bridge-grandpa/try-runtime", "sp-runtime/try-runtime", ] +test-helpers = [ + "bp-runtime/test-helpers", + "sp-trie", +] diff --git a/bridges/modules/messages/README.md b/bridges/modules/messages/README.md index c06b96b857d..80fd92eb0e5 100644 --- a/bridges/modules/messages/README.md +++ b/bridges/modules/messages/README.md @@ -104,17 +104,22 @@ the message. When a message is delivered to the target chain, the `MessagesDeliv `receive_messages_delivery_proof()` transaction. The `MessagesDelivered` contains the message lane identifier and inclusive range of delivered message nonces. -The pallet provides no means to get the result of message dispatch at the target chain. If that is required, it must be -done outside of the pallet. For example, XCM messages, when dispatched, have special instructions to send some data back -to the sender. Other dispatchers may use similar mechanism for that. -### How to plug-in Messages Module to Send Messages to the Bridged Chain? - -The `pallet_bridge_messages::Config` trait has 3 main associated types that are used to work with outbound messages. The -`pallet_bridge_messages::Config::TargetHeaderChain` defines how we see the bridged chain as the target for our outbound -messages. It must be able to check that the bridged chain may accept our message - like that the message has size below -maximal possible transaction size of the chain and so on. And when the relayer sends us a confirmation transaction, this -implementation must be able to parse and verify the proof of messages delivery. Normally, you would reuse the same -(configurable) type on all chains that are sending messages to the same bridged chain. +The pallet provides no means to get the result of message dispatch at the target chain. If that is +required, it must be done outside of the pallet. For example, XCM messages, when dispatched, have +special instructions to send some data back to the sender. Other dispatchers may use similar +mechanism for that. + +### How to plug-in Messages Module to Send and Receive Messages from the Bridged Chain? + +The `pallet_bridge_messages::Config` trait has 2 main associated types that are used to work with +inbound messages. The `pallet_bridge_messages::BridgedChain` defines basic primitives of the bridged +chain. The `pallet_bridge_messages::BridgedHeaderChain` defines the way we access the bridged chain +headers in our runtime. You may use `pallet_bridge_grandpa` if you're bridging with chain that uses +GRANDPA finality or `pallet_bridge_parachains::ParachainHeaders` if you're bridging with parachain. + +The `pallet_bridge_messages::Config::MessageDispatch` defines a way on how to dispatch delivered +messages. Apart from actually dispatching the message, the implementation must return the correct +dispatch weight of the message before dispatch is called. The last type is the `pallet_bridge_messages::Config::DeliveryConfirmationPayments`. When confirmation transaction is received, we call the `pay_reward()` method, passing the range of delivered messages. @@ -129,18 +134,6 @@ You should be looking at the `bp_messages::source_chain::ForbidOutboundMessages` [`bp_messages::source_chain`](../../primitives/messages/src/source_chain.rs). It implements all required traits and will simply reject all transactions, related to outbound messages. -### How to plug-in Messages Module to Receive Messages from the Bridged Chain? - -The `pallet_bridge_messages::Config` trait has 2 main associated types that are used to work with inbound messages. The -`pallet_bridge_messages::Config::SourceHeaderChain` defines how we see the bridged chain as the source of our inbound -messages. When relayer sends us a delivery transaction, this implementation must be able to parse and verify the proof -of messages wrapped in this transaction. Normally, you would reuse the same (configurable) type on all chains that are -sending messages to the same bridged chain. - -The `pallet_bridge_messages::Config::MessageDispatch` defines a way on how to dispatch delivered messages. Apart from -actually dispatching the message, the implementation must return the correct dispatch weight of the message before -dispatch is called. - ### I have a Messages Module in my Runtime, but I Want to Reject all Inbound Messages. What shall I do? You should be looking at the `bp_messages::target_chain::ForbidInboundMessages` structure from the @@ -150,36 +143,42 @@ and will simply reject all transactions, related to inbound messages. ### What about other Constants in the Messages Module Configuration Trait? Two settings that are used to check messages in the `send_message()` function. The -`pallet_bridge_messages::Config::ActiveOutboundLanes` is an array of all message lanes, that may be used to send -messages. All messages sent using other lanes are rejected. All messages that have size above -`pallet_bridge_messages::Config::MaximalOutboundPayloadSize` will also be rejected. - -To be able to reward the relayer for delivering messages, we store a map of message nonces range => identifier of the -relayer that has delivered this range at the target chain runtime storage. If a relayer delivers multiple consequent -ranges, they're merged into single entry. So there may be more than one entry for the same relayer. Eventually, this -whole map must be delivered back to the source chain to confirm delivery and pay rewards. So to make sure we are able to -craft this confirmation transaction, we need to: (1) keep the size of this map below a certain limit and (2) make sure -that the weight of processing this map is below a certain limit. Both size and processing weight mostly depend on the -number of entries. The number of entries is limited with the -`pallet_bridge_messages::ConfigMaxUnrewardedRelayerEntriesAtInboundLane` parameter. Processing weight also depends on -the total number of messages that are being confirmed, because every confirmed message needs to be read. So there's -another `pallet_bridge_messages::Config::MaxUnconfirmedMessagesAtInboundLane` parameter for that. - -When choosing values for these parameters, you must also keep in mind that if proof in your scheme is based on finality -of headers (and it is the most obvious option for Substrate-based chains with finality notion), then choosing too small -values for these parameters may cause significant delays in message delivery. That's because there are too many actors -involved in this scheme: 1) authorities that are finalizing headers of the target chain need to finalize header with -non-empty map; 2) the headers relayer then needs to submit this header and its finality proof to the source chain; 3) -the messages relayer must then send confirmation transaction (storage proof of this map) to the source chain; 4) when -the confirmation transaction will be mined at some header, source chain authorities must finalize this header; 5) the -headers relay then needs to submit this header and its finality proof to the target chain; 6) only now the messages -relayer may submit new messages from the source to target chain and prune the entry from the map. - -Delivery transaction requires the relayer to provide both number of entries and total number of messages in the map. -This means that the module never charges an extra cost for delivering a map - the relayer would need to pay exactly for -the number of entries+messages it has delivered. So the best guess for values of these parameters would be the pair that -would occupy `N` percent of the maximal transaction size and weight of the source chain. The `N` should be large enough -to process large maps, at the same time keeping reserve for future source chain upgrades. +`pallet_bridge_messages::Config::ActiveOutboundLanes` is an array of all message lanes, that +may be used to send messages. All messages sent using other lanes are rejected. All messages that have +size above `pallet_bridge_messages::Config::MaximalOutboundPayloadSize` will also be rejected. + +To be able to reward the relayer for delivering messages, we store a map of message nonces range => +identifier of the relayer that has delivered this range at the target chain runtime storage. If a +relayer delivers multiple consequent ranges, they're merged into single entry. So there may be more +than one entry for the same relayer. Eventually, this whole map must be delivered back to the source +chain to confirm delivery and pay rewards. So to make sure we are able to craft this confirmation +transaction, we need to: (1) keep the size of this map below a certain limit and (2) make sure that +the weight of processing this map is below a certain limit. Both size and processing weight mostly +depend on the number of entries. The number of entries is limited with the +`pallet_bridge_messages::Config::BridgedChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX` parameter. +Processing weight also depends on the total number of messages that are being confirmed, because every +confirmed message needs to be read. So there's another +`pallet_bridge_messages::Config::BridgedChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX` parameter +for that. + +When choosing values for these parameters, you must also keep in mind that if proof in your scheme +is based on finality of headers (and it is the most obvious option for Substrate-based chains with +finality notion), then choosing too small values for these parameters may cause significant delays +in message delivery. That's because there are too many actors involved in this scheme: 1) authorities +that are finalizing headers of the target chain need to finalize header with non-empty map; 2) the +headers relayer then needs to submit this header and its finality proof to the source chain; 3) the +messages relayer must then send confirmation transaction (storage proof of this map) to the source +chain; 4) when the confirmation transaction will be mined at some header, source chain authorities +must finalize this header; 5) the headers relay then needs to submit this header and its finality +proof to the target chain; 6) only now the messages relayer may submit new messages from the source +to target chain and prune the entry from the map. + +Delivery transaction requires the relayer to provide both number of entries and total number of +messages in the map. This means that the module never charges an extra cost for delivering a map - +the relayer would need to pay exactly for the number of entries+messages it has delivered. So the +best guess for values of these parameters would be the pair that would occupy `N` percent of the +maximal transaction size and weight of the source chain. The `N` should be large enough to process +large maps, at the same time keeping reserve for future source chain upgrades. ## Non-Essential Functionality diff --git a/bridges/modules/messages/src/benchmarking.rs b/bridges/modules/messages/src/benchmarking.rs index 4f13c440967..d38aaf32dc9 100644 --- a/bridges/modules/messages/src/benchmarking.rs +++ b/bridges/modules/messages/src/benchmarking.rs @@ -16,19 +16,22 @@ //! Messages pallet benchmarking. +#![cfg(feature = "runtime-benchmarks")] + use crate::{ inbound_lane::InboundLaneStorage, outbound_lane, weights_ext::EXPECTED_DEFAULT_MESSAGE_LENGTH, - Call, OutboundLanes, RuntimeInboundLaneStorage, + BridgedChainOf, Call, OutboundLanes, RuntimeInboundLaneStorage, }; use bp_messages::{ - source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, DeliveredMessages, + source_chain::FromBridgedChainMessagesDeliveryProof, + target_chain::FromBridgedChainMessagesProof, ChainWithMessages, DeliveredMessages, InboundLaneData, LaneId, MessageNonce, OutboundLaneData, UnrewardedRelayer, UnrewardedRelayersState, }; -use bp_runtime::StorageProofSize; +use bp_runtime::{AccountIdOf, HashOf, UnverifiedStorageProofParams}; use codec::Decode; -use frame_benchmarking::{account, benchmarks_instance_pallet}; +use frame_benchmarking::{account, v2::*}; use frame_support::weights::Weight; use frame_system::RawOrigin; use sp_runtime::{traits::TrailingZeroInput, BoundedVec}; @@ -54,7 +57,7 @@ pub struct MessageProofParams { /// return `true` from the `is_message_successfully_dispatched`. pub is_successful_dispatch_expected: bool, /// Proof size requirements. - pub size: StorageProofSize, + pub proof_params: UnverifiedStorageProofParams, } /// Benchmark-specific message delivery proof parameters. @@ -65,7 +68,7 @@ pub struct MessageDeliveryProofParams { /// The proof needs to include this inbound lane data. pub inbound_lane_data: InboundLaneData, /// Proof size requirements. - pub size: StorageProofSize, + pub proof_params: UnverifiedStorageProofParams, } /// Trait that must be implemented by runtime. @@ -80,8 +83,8 @@ pub trait Config: crate::Config { /// Return id of relayer account at the bridged chain. /// /// By default, zero account is returned. - fn bridged_relayer_id() -> Self::InboundRelayer { - Self::InboundRelayer::decode(&mut TrailingZeroInput::zeroes()).unwrap() + fn bridged_relayer_id() -> AccountIdOf> { + Decode::decode(&mut TrailingZeroInput::zeroes()).unwrap() } /// Create given account and give it enough balance for test purposes. Used to create @@ -94,11 +97,11 @@ pub trait Config: crate::Config { /// Prepare messages proof to receive by the module. fn prepare_message_proof( params: MessageProofParams, - ) -> (::MessagesProof, Weight); + ) -> (FromBridgedChainMessagesProof>>, Weight); /// Prepare messages delivery proof to receive by the module. fn prepare_message_delivery_proof( params: MessageDeliveryProofParams, - ) -> >::MessagesDeliveryProof; + ) -> FromBridgedChainMessagesDeliveryProof>>; /// Returns true if message has been successfully dispatched or not. fn is_message_successfully_dispatched(_nonce: MessageNonce) -> bool { @@ -109,174 +112,227 @@ pub trait Config: crate::Config { fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool; } -benchmarks_instance_pallet! { +fn send_regular_message, I: 'static>() { + let mut outbound_lane = outbound_lane::(T::bench_lane_id()); + outbound_lane.send_message(BoundedVec::try_from(vec![]).expect("We craft valid messages")); +} + +fn receive_messages, I: 'static>(nonce: MessageNonce) { + let mut inbound_lane_storage = + RuntimeInboundLaneStorage::::from_lane_id(T::bench_lane_id()); + inbound_lane_storage.set_data(InboundLaneData { + relayers: vec![UnrewardedRelayer { + relayer: T::bridged_relayer_id(), + messages: DeliveredMessages::new(nonce), + }] + .into_iter() + .collect(), + last_confirmed_nonce: 0, + }); +} + +struct ReceiveMessagesProofSetup, I: 'static> { + relayer_id_on_src: AccountIdOf>, + relayer_id_on_tgt: T::AccountId, + msgs_count: u32, + _phantom_data: sp_std::marker::PhantomData, +} + +impl, I: 'static> ReceiveMessagesProofSetup { + const LATEST_RECEIVED_NONCE: MessageNonce = 20; + + fn new(msgs_count: u32) -> Self { + let setup = Self { + relayer_id_on_src: T::bridged_relayer_id(), + relayer_id_on_tgt: account("relayer", 0, SEED), + msgs_count, + _phantom_data: Default::default(), + }; + T::endow_account(&setup.relayer_id_on_tgt); + // mark messages 1..=latest_recvd_nonce as delivered + receive_messages::(Self::LATEST_RECEIVED_NONCE); + + setup + } + + fn relayer_id_on_src(&self) -> AccountIdOf> { + self.relayer_id_on_src.clone() + } + + fn relayer_id_on_tgt(&self) -> T::AccountId { + self.relayer_id_on_tgt.clone() + } + + fn last_nonce(&self) -> MessageNonce { + Self::LATEST_RECEIVED_NONCE + self.msgs_count as u64 + } + + fn nonces(&self) -> RangeInclusive { + (Self::LATEST_RECEIVED_NONCE + 1)..=self.last_nonce() + } + + fn check_last_nonce(&self) { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + self.last_nonce(), + ); + } +} + +#[instance_benchmarks] +mod benchmarks { + use super::*; + // // Benchmarks that are used directly by the runtime calls weight formulae. // - // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: + fn max_msgs, I: 'static>() -> u32 { + T::BridgedChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX as u32 - + ReceiveMessagesProofSetup::::LATEST_RECEIVED_NONCE as u32 + } + + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following + // conditions: // * proof does not include outbound lane state proof; // * inbound lane already has state, so it needs to be read and decoded; // * message is dispatched (reminder: dispatch weight should be minimal); // * message requires all heavy checks done by dispatcher. - // - // This is base benchmark for all other message delivery benchmarks. - receive_single_message_proof { - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - + #[benchmark] + fn receive_single_message_proof() { + // setup code + let setup = ReceiveMessagesProofSetup::::new(1); let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { lane: T::bench_lane_id(), - message_nonces: 21..=21, + message_nonces: setup.nonces(), outbound_lane_data: None, is_successful_dispatch_expected: false, - size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), + proof_params: UnverifiedStorageProofParams::from_db_size( + EXPECTED_DEFAULT_MESSAGE_LENGTH, + ), }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) - verify { - assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), - 21, + + #[extrinsic_call] + receive_messages_proof( + RawOrigin::Signed(setup.relayer_id_on_tgt()), + setup.relayer_id_on_src(), + Box::new(proof), + setup.msgs_count, + dispatch_weight, ); + + // verification code + setup.check_last_nonce(); } - // Benchmark `receive_messages_proof` extrinsic with two minimal-weight messages and following conditions: + // Benchmark `receive_messages_proof` extrinsic with `n` minimal-weight messages and following + // conditions: // * proof does not include outbound lane state proof; // * inbound lane already has state, so it needs to be read and decoded; // * message is dispatched (reminder: dispatch weight should be minimal); // * message requires all heavy checks done by dispatcher. - // - // The weight of single message delivery could be approximated as - // `weight(receive_two_messages_proof) - weight(receive_single_message_proof)`. - // This won't be super-accurate if message has non-zero dispatch weight, but estimation should - // be close enough to real weight. - receive_two_messages_proof { - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - + #[benchmark] + fn receive_n_messages_proof(n: Linear<1, { max_msgs::() }>) { + // setup code + let setup = ReceiveMessagesProofSetup::::new(n); let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { lane: T::bench_lane_id(), - message_nonces: 21..=22, + message_nonces: setup.nonces(), outbound_lane_data: None, is_successful_dispatch_expected: false, - size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), + proof_params: UnverifiedStorageProofParams::from_db_size( + EXPECTED_DEFAULT_MESSAGE_LENGTH, + ), }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 2, dispatch_weight) - verify { - assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), - 22, + + #[extrinsic_call] + receive_messages_proof( + RawOrigin::Signed(setup.relayer_id_on_tgt()), + setup.relayer_id_on_src(), + Box::new(proof), + setup.msgs_count, + dispatch_weight, ); + + // verification code + setup.check_last_nonce(); } - // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following + // conditions: // * proof includes outbound lane state proof; // * inbound lane already has state, so it needs to be read and decoded; // * message is successfully dispatched (reminder: dispatch weight should be minimal); // * message requires all heavy checks done by dispatcher. // // The weight of outbound lane state delivery would be - // `weight(receive_single_message_proof_with_outbound_lane_state) - weight(receive_single_message_proof)`. - // This won't be super-accurate if message has non-zero dispatch weight, but estimation should - // be close enough to real weight. - receive_single_message_proof_with_outbound_lane_state { - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - + // `weight(receive_single_message_proof_with_outbound_lane_state) - + // weight(receive_single_message_proof)`. This won't be super-accurate if message has non-zero + // dispatch weight, but estimation should be close enough to real weight. + #[benchmark] + fn receive_single_message_proof_with_outbound_lane_state() { + // setup code + let setup = ReceiveMessagesProofSetup::::new(1); let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { lane: T::bench_lane_id(), - message_nonces: 21..=21, + message_nonces: setup.nonces(), outbound_lane_data: Some(OutboundLaneData { - oldest_unpruned_nonce: 21, - latest_received_nonce: 20, - latest_generated_nonce: 21, + oldest_unpruned_nonce: setup.last_nonce(), + latest_received_nonce: ReceiveMessagesProofSetup::::LATEST_RECEIVED_NONCE, + latest_generated_nonce: setup.last_nonce(), }), is_successful_dispatch_expected: false, - size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), + proof_params: UnverifiedStorageProofParams::from_db_size( + EXPECTED_DEFAULT_MESSAGE_LENGTH, + ), }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) - verify { - let lane_state = crate::InboundLanes::::get(&T::bench_lane_id()); - assert_eq!(lane_state.last_delivered_nonce(), 21); - assert_eq!(lane_state.last_confirmed_nonce, 20); - } - - // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: - // * the proof has large leaf with total size of approximately 1KB; - // * proof does not include outbound lane state proof; - // * inbound lane already has state, so it needs to be read and decoded; - // * message is dispatched (reminder: dispatch weight should be minimal); - // * message requires all heavy checks done by dispatcher. - // - // With single KB of messages proof, the weight of the call is increased (roughly) by - // `(receive_single_message_proof_16KB - receive_single_message_proof_1_kb) / 15`. - receive_single_message_proof_1_kb { - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { - lane: T::bench_lane_id(), - message_nonces: 21..=21, - outbound_lane_data: None, - is_successful_dispatch_expected: false, - size: StorageProofSize::HasLargeLeaf(1024), - }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) - verify { - assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), - 21, + #[extrinsic_call] + receive_messages_proof( + RawOrigin::Signed(setup.relayer_id_on_tgt()), + setup.relayer_id_on_src(), + Box::new(proof), + setup.msgs_count, + dispatch_weight, ); + + // verification code + setup.check_last_nonce(); } - // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: - // * the proof has large leaf with total size of approximately 16KB; + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following + // conditions: + // * the proof has large leaf with total size ranging between 1KB and 16KB; // * proof does not include outbound lane state proof; // * inbound lane already has state, so it needs to be read and decoded; // * message is dispatched (reminder: dispatch weight should be minimal); // * message requires all heavy checks done by dispatcher. - // - // Size of proof grows because it contains extra trie nodes in it. - // - // With single KB of messages proof, the weight of the call is increased (roughly) by - // `(receive_single_message_proof_16KB - receive_single_message_proof) / 15`. - receive_single_message_proof_16_kb { - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - + #[benchmark] + fn receive_single_n_bytes_message_proof( + /// Proof size in KB + n: Linear<1, { 16 * 1024 }>, + ) { + // setup code + let setup = ReceiveMessagesProofSetup::::new(1); let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { lane: T::bench_lane_id(), - message_nonces: 21..=21, + message_nonces: setup.nonces(), outbound_lane_data: None, is_successful_dispatch_expected: false, - size: StorageProofSize::HasLargeLeaf(16 * 1024), + proof_params: UnverifiedStorageProofParams::from_db_size(n), }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) - verify { - assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), - 21, + + #[extrinsic_call] + receive_messages_proof( + RawOrigin::Signed(setup.relayer_id_on_tgt()), + setup.relayer_id_on_src(), + Box::new(proof), + setup.msgs_count, + dispatch_weight, ); + + // verification code + setup.check_last_nonce(); } // Benchmark `receive_messages_delivery_proof` extrinsic with following conditions: @@ -284,7 +340,8 @@ benchmarks_instance_pallet! { // * relayer account does not exist (in practice it needs to exist in production environment). // // This is base benchmark for all other confirmations delivery benchmarks. - receive_delivery_proof_for_single_message { + #[benchmark] + fn receive_delivery_proof_for_single_message() { let relayer_id: T::AccountId = account("relayer", 0, SEED); // send message that we're going to confirm @@ -302,13 +359,21 @@ benchmarks_instance_pallet! { relayers: vec![UnrewardedRelayer { relayer: relayer_id.clone(), messages: DeliveredMessages::new(1), - }].into_iter().collect(), + }] + .into_iter() + .collect(), last_confirmed_nonce: 0, }, - size: StorageProofSize::Minimal(0), + proof_params: UnverifiedStorageProofParams::default(), }); - }: receive_messages_delivery_proof(RawOrigin::Signed(relayer_id.clone()), proof, relayers_state) - verify { + + #[extrinsic_call] + receive_messages_delivery_proof( + RawOrigin::Signed(relayer_id.clone()), + proof, + relayers_state, + ); + assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 1); assert!(T::is_relayer_rewarded(&relayer_id)); } @@ -320,7 +385,8 @@ benchmarks_instance_pallet! { // Additional weight for paying single-message reward to the same relayer could be computed // as `weight(receive_delivery_proof_for_two_messages_by_single_relayer) // - weight(receive_delivery_proof_for_single_message)`. - receive_delivery_proof_for_two_messages_by_single_relayer { + #[benchmark] + fn receive_delivery_proof_for_two_messages_by_single_relayer() { let relayer_id: T::AccountId = account("relayer", 0, SEED); // send message that we're going to confirm @@ -341,13 +407,21 @@ benchmarks_instance_pallet! { relayers: vec![UnrewardedRelayer { relayer: relayer_id.clone(), messages: delivered_messages, - }].into_iter().collect(), + }] + .into_iter() + .collect(), last_confirmed_nonce: 0, }, - size: StorageProofSize::Minimal(0), + proof_params: UnverifiedStorageProofParams::default(), }); - }: receive_messages_delivery_proof(RawOrigin::Signed(relayer_id.clone()), proof, relayers_state) - verify { + + #[extrinsic_call] + receive_messages_delivery_proof( + RawOrigin::Signed(relayer_id.clone()), + proof, + relayers_state, + ); + assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 2); assert!(T::is_relayer_rewarded(&relayer_id)); } @@ -359,7 +433,8 @@ benchmarks_instance_pallet! { // Additional weight for paying reward to the next relayer could be computed // as `weight(receive_delivery_proof_for_two_messages_by_two_relayers) // - weight(receive_delivery_proof_for_two_messages_by_single_relayer)`. - receive_delivery_proof_for_two_messages_by_two_relayers { + #[benchmark] + fn receive_delivery_proof_for_two_messages_by_two_relayers() { let relayer1_id: T::AccountId = account("relayer1", 1, SEED); let relayer2_id: T::AccountId = account("relayer2", 2, SEED); @@ -385,13 +460,21 @@ benchmarks_instance_pallet! { relayer: relayer2_id.clone(), messages: DeliveredMessages::new(2), }, - ].into_iter().collect(), + ] + .into_iter() + .collect(), last_confirmed_nonce: 0, }, - size: StorageProofSize::Minimal(0), + proof_params: UnverifiedStorageProofParams::default(), }); - }: receive_messages_delivery_proof(RawOrigin::Signed(relayer1_id.clone()), proof, relayers_state) - verify { + + #[extrinsic_call] + receive_messages_delivery_proof( + RawOrigin::Signed(relayer1_id.clone()), + proof, + relayers_state, + ); + assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 2); assert!(T::is_relayer_rewarded(&relayer1_id)); assert!(T::is_relayer_rewarded(&relayer2_id)); @@ -411,51 +494,38 @@ benchmarks_instance_pallet! { // * inbound lane already has state, so it needs to be read and decoded; // * message is **SUCCESSFULLY** dispatched; // * message requires all heavy checks done by dispatcher. - receive_single_message_proof_with_dispatch { - // maybe dispatch weight relies on the message size too? - let i in EXPECTED_DEFAULT_MESSAGE_LENGTH .. EXPECTED_DEFAULT_MESSAGE_LENGTH * 16; - - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - + #[benchmark] + fn receive_single_n_bytes_message_proof_with_dispatch( + /// Proof size in KB + n: Linear<1, { 16 * 1024 }>, + ) { + // setup code + let setup = ReceiveMessagesProofSetup::::new(1); let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { lane: T::bench_lane_id(), - message_nonces: 21..=21, + message_nonces: setup.nonces(), outbound_lane_data: None, is_successful_dispatch_expected: true, - size: StorageProofSize::Minimal(i), + proof_params: UnverifiedStorageProofParams::from_db_size(n), }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) - verify { - assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), - 21, - ); - assert!(T::is_message_successfully_dispatched(21)); - } - impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) -} + #[extrinsic_call] + receive_messages_proof( + RawOrigin::Signed(setup.relayer_id_on_tgt()), + setup.relayer_id_on_src(), + Box::new(proof), + setup.msgs_count, + dispatch_weight, + ); -fn send_regular_message, I: 'static>() { - let mut outbound_lane = outbound_lane::(T::bench_lane_id()); - outbound_lane.send_message(BoundedVec::try_from(vec![]).expect("We craft valid messages")); -} + // verification code + setup.check_last_nonce(); + assert!(T::is_message_successfully_dispatched(setup.last_nonce())); + } -fn receive_messages, I: 'static>(nonce: MessageNonce) { - let mut inbound_lane_storage = - RuntimeInboundLaneStorage::::from_lane_id(T::bench_lane_id()); - inbound_lane_storage.set_data(InboundLaneData { - relayers: vec![UnrewardedRelayer { - relayer: T::bridged_relayer_id(), - messages: DeliveredMessages::new(nonce), - }] - .into_iter() - .collect(), - last_confirmed_nonce: 0, - }); + impl_benchmark_test_suite!( + Pallet, + crate::tests::mock::new_test_ext(), + crate::tests::mock::TestRuntime + ); } diff --git a/bridges/modules/messages/src/inbound_lane.rs b/bridges/modules/messages/src/inbound_lane.rs index da1698e6e03..7ef4599a93c 100644 --- a/bridges/modules/messages/src/inbound_lane.rs +++ b/bridges/modules/messages/src/inbound_lane.rs @@ -16,15 +16,15 @@ //! Everything about incoming messages receival. -use crate::Config; +use crate::{BridgedChainOf, Config}; use bp_messages::{ target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch}, - DeliveredMessages, InboundLaneData, LaneId, MessageKey, MessageNonce, OutboundLaneData, - ReceptionResult, UnrewardedRelayer, + ChainWithMessages, DeliveredMessages, InboundLaneData, LaneId, MessageKey, MessageNonce, + OutboundLaneData, ReceptionResult, UnrewardedRelayer, }; +use bp_runtime::AccountIdOf; use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; -use frame_support::traits::Get; use scale_info::{Type, TypeInfo}; use sp_runtime::RuntimeDebug; use sp_std::prelude::PartialEq; @@ -55,10 +55,12 @@ pub trait InboundLaneStorage { /// /// The encoding of this type matches encoding of the corresponding `MessageData`. #[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq)] -pub struct StoredInboundLaneData, I: 'static>(pub InboundLaneData); +pub struct StoredInboundLaneData, I: 'static>( + pub InboundLaneData>>, +); impl, I: 'static> sp_std::ops::Deref for StoredInboundLaneData { - type Target = InboundLaneData; + type Target = InboundLaneData>>; fn deref(&self) -> &Self::Target { &self.0 @@ -78,7 +80,7 @@ impl, I: 'static> Default for StoredInboundLaneData { } impl, I: 'static> From> - for InboundLaneData + for InboundLaneData>> { fn from(data: StoredInboundLaneData) -> Self { data.0 @@ -86,7 +88,7 @@ impl, I: 'static> From> } impl, I: 'static> EncodeLike> - for InboundLaneData + for InboundLaneData>> { } @@ -94,14 +96,14 @@ impl, I: 'static> TypeInfo for StoredInboundLaneData { type Identity = Self; fn type_info() -> Type { - InboundLaneData::::type_info() + InboundLaneData::>>::type_info() } } impl, I: 'static> MaxEncodedLen for StoredInboundLaneData { fn max_encoded_len() -> usize { - InboundLaneData::::encoded_size_hint( - T::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize, + InboundLaneData::>>::encoded_size_hint( + BridgedChainOf::::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX as usize, ) .unwrap_or(usize::MAX) } @@ -216,10 +218,10 @@ mod tests { use super::*; use crate::{ inbound_lane, - mock::{ + tests::mock::{ dispatch_result, inbound_message_data, inbound_unrewarded_relayers_state, run_test, - unrewarded_relayer, TestMessageDispatch, TestRuntime, REGULAR_PAYLOAD, TEST_LANE_ID, - TEST_RELAYER_A, TEST_RELAYER_B, TEST_RELAYER_C, + unrewarded_relayer, BridgedChain, TestMessageDispatch, TestRuntime, REGULAR_PAYLOAD, + TEST_LANE_ID, TEST_RELAYER_A, TEST_RELAYER_B, TEST_RELAYER_C, }, RuntimeInboundLaneStorage, }; @@ -372,8 +374,7 @@ mod tests { fn fails_to_receive_messages_above_unrewarded_relayer_entries_limit_per_lane() { run_test(|| { let mut lane = inbound_lane::(TEST_LANE_ID); - let max_nonce = - ::MaxUnrewardedRelayerEntriesAtInboundLane::get(); + let max_nonce = BridgedChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; for current_nonce in 1..max_nonce + 1 { assert_eq!( lane.receive_message::( @@ -409,7 +410,7 @@ mod tests { fn fails_to_receive_messages_above_unconfirmed_messages_limit_per_lane() { run_test(|| { let mut lane = inbound_lane::(TEST_LANE_ID); - let max_nonce = ::MaxUnconfirmedMessagesAtInboundLane::get(); + let max_nonce = BridgedChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; for current_nonce in 1..=max_nonce { assert_eq!( lane.receive_message::( diff --git a/bridges/modules/messages/src/lib.rs b/bridges/modules/messages/src/lib.rs index e31a4542056..bf105b14040 100644 --- a/bridges/modules/messages/src/lib.rs +++ b/bridges/modules/messages/src/lib.rs @@ -41,8 +41,8 @@ pub use outbound_lane::StoredMessagePayload; pub use weights::WeightInfo; pub use weights_ext::{ ensure_able_to_receive_confirmation, ensure_able_to_receive_message, - ensure_weights_are_correct, WeightInfoExt, EXPECTED_DEFAULT_MESSAGE_LENGTH, - EXTRA_STORAGE_PROOF_SIZE, + ensure_maximal_message_dispatch, ensure_weights_are_correct, WeightInfoExt, + EXPECTED_DEFAULT_MESSAGE_LENGTH, EXTRA_STORAGE_PROOF_SIZE, }; use crate::{ @@ -50,20 +50,23 @@ use crate::{ outbound_lane::{OutboundLane, OutboundLaneStorage, ReceptionConfirmationError}, }; +use bp_header_chain::HeaderChain; use bp_messages::{ source_chain::{ - DeliveryConfirmationPayments, OnMessagesDelivered, SendMessageArtifacts, TargetHeaderChain, + DeliveryConfirmationPayments, FromBridgedChainMessagesDeliveryProof, OnMessagesDelivered, + SendMessageArtifacts, }, target_chain::{ - DeliveryPayments, DispatchMessage, MessageDispatch, ProvedLaneMessages, ProvedMessages, - SourceHeaderChain, + DeliveryPayments, DispatchMessage, FromBridgedChainMessagesProof, MessageDispatch, + ProvedLaneMessages, ProvedMessages, }, - DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId, MessageKey, MessageNonce, - MessagePayload, MessagesOperatingMode, OutboundLaneData, OutboundMessageDetails, - UnrewardedRelayersState, VerificationError, + ChainWithMessages, DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId, + MessageKey, MessageNonce, MessagePayload, MessagesOperatingMode, OutboundLaneData, + OutboundMessageDetails, UnrewardedRelayersState, VerificationError, }; use bp_runtime::{ - BasicOperatingMode, ChainId, OwnedBridgeModule, PreComputedSize, RangeInclusiveExt, Size, + AccountIdOf, BasicOperatingMode, HashOf, OwnedBridgeModule, PreComputedSize, RangeInclusiveExt, + Size, }; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{dispatch::PostDispatchInfo, ensure, fail, traits::Get, DefaultNoBound}; @@ -72,6 +75,8 @@ use sp_std::{marker::PhantomData, prelude::*}; mod inbound_lane; mod outbound_lane; +mod proofs; +mod tests; mod weights_ext; pub mod weights; @@ -79,10 +84,9 @@ pub mod weights; #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; -#[cfg(test)] -mod mock; - pub use pallet::*; +#[cfg(feature = "test-helpers")] +pub use tests::*; /// The target that will be used when publishing logs related to this pallet. pub const LOG_TARGET: &str = "runtime::bridge-messages"; @@ -105,76 +109,39 @@ pub mod pallet { /// Benchmarks results from runtime we're plugged into. type WeightInfo: WeightInfoExt; - /// Gets the chain id value from the instance. - #[pallet::constant] - type BridgedChainId: Get; + /// This chain type. + type ThisChain: ChainWithMessages; + /// Bridged chain type. + type BridgedChain: ChainWithMessages; + /// Bridged chain headers provider. + type BridgedHeaderChain: HeaderChain; /// Get all active outbound lanes that the message pallet is serving. type ActiveOutboundLanes: Get<&'static [LaneId]>; - /// Maximal number of unrewarded relayer entries at inbound lane. Unrewarded means that the - /// relayer has delivered messages, but either confirmations haven't been delivered back to - /// the source chain, or we haven't received reward confirmations yet. - /// - /// This constant limits maximal number of entries in the `InboundLaneData::relayers`. Keep - /// in mind that the same relayer account may take several (non-consecutive) entries in this - /// set. - type MaxUnrewardedRelayerEntriesAtInboundLane: Get; - /// Maximal number of unconfirmed messages at inbound lane. Unconfirmed means that the - /// message has been delivered, but either confirmations haven't been delivered back to the - /// source chain, or we haven't received reward confirmations for these messages yet. - /// - /// This constant limits difference between last message from last entry of the - /// `InboundLaneData::relayers` and first message at the first entry. - /// - /// There is no point of making this parameter lesser than - /// MaxUnrewardedRelayerEntriesAtInboundLane, because then maximal number of relayer entries - /// will be limited by maximal number of messages. - /// - /// This value also represents maximal number of messages in single delivery transaction. - /// Transaction that is declaring more messages than this value, will be rejected. Even if - /// these messages are from different lanes. - type MaxUnconfirmedMessagesAtInboundLane: Get; - - /// Maximal encoded size of the outbound payload. - #[pallet::constant] - type MaximalOutboundPayloadSize: Get; + /// Payload type of outbound messages. This payload is dispatched on the bridged chain. type OutboundPayload: Parameter + Size; - /// Payload type of inbound messages. This payload is dispatched on this chain. type InboundPayload: Decode; - /// Identifier of relayer that deliver messages to this chain. Relayer reward is paid on the - /// bridged chain. - type InboundRelayer: Parameter + MaxEncodedLen; - /// Delivery payments. - type DeliveryPayments: DeliveryPayments; - - // Types that are used by outbound_lane (on source chain). - /// Target header chain. - type TargetHeaderChain: TargetHeaderChain; - /// Delivery confirmation payments. + /// Handler for relayer payments that happen during message delivery transaction. + type DeliveryPayments: DeliveryPayments; + /// Handler for relayer payments that happen during message delivery confirmation + /// transaction. type DeliveryConfirmationPayments: DeliveryConfirmationPayments; /// Delivery confirmation callback. type OnMessagesDelivered: OnMessagesDelivered; - // Types that are used by inbound_lane (on target chain). - - /// Source header chain, as it is represented on target chain. - type SourceHeaderChain: SourceHeaderChain; - /// Message dispatch. + /// Message dispatch handler. type MessageDispatch: MessageDispatch; } - /// Shortcut to messages proof type for Config. - pub type MessagesProofOf = - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof; - /// Shortcut to messages delivery proof type for Config. - pub type MessagesDeliveryProofOf = - <>::TargetHeaderChain as TargetHeaderChain< - >::OutboundPayload, - ::AccountId, - >>::MessagesDeliveryProof; + /// Shortcut to this chain type for Config. + pub type ThisChainOf = >::ThisChain; + /// Shortcut to bridged chain type for Config. + pub type BridgedChainOf = >::BridgedChain; + /// Shortcut to bridged header chain type for Config. + pub type BridgedHeaderChainOf = >::BridgedHeaderChain; #[pallet::pallet] pub struct Pallet(PhantomData<(T, I)>); @@ -265,11 +232,11 @@ pub mod pallet { /// The call may succeed, but some messages may not be delivered e.g. if they are not fit /// into the unrewarded relayers vector. #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::receive_messages_proof_weight(proof, *messages_count, *dispatch_weight))] + #[pallet::weight(T::WeightInfo::receive_messages_proof_weight(&**proof, *messages_count, *dispatch_weight))] pub fn receive_messages_proof( origin: OriginFor, - relayer_id_at_bridged_chain: T::InboundRelayer, - proof: MessagesProofOf, + relayer_id_at_bridged_chain: AccountIdOf>, + proof: Box>>>, messages_count: u32, dispatch_weight: Weight, ) -> DispatchResultWithPostInfo { @@ -278,7 +245,8 @@ pub mod pallet { // reject transactions that are declaring too many messages ensure!( - MessageNonce::from(messages_count) <= T::MaxUnconfirmedMessagesAtInboundLane::get(), + MessageNonce::from(messages_count) <= + BridgedChainOf::::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, Error::::TooManyMessagesInTheProof ); @@ -296,22 +264,19 @@ pub mod pallet { // The DeclaredWeight is exactly what's computed here. Unfortunately it is impossible // to get pre-computed value (and it has been already computed by the executive). let declared_weight = T::WeightInfo::receive_messages_proof_weight( - &proof, + &*proof, messages_count, dispatch_weight, ); let mut actual_weight = declared_weight; // verify messages proof && convert proof into messages - let messages = verify_and_decode_messages_proof::< - T::SourceHeaderChain, - T::InboundPayload, - >(proof, messages_count) - .map_err(|err| { - log::trace!(target: LOG_TARGET, "Rejecting invalid messages proof: {:?}", err,); + let messages = verify_and_decode_messages_proof::(*proof, messages_count) + .map_err(|err| { + log::trace!(target: LOG_TARGET, "Rejecting invalid messages proof: {:?}", err,); - Error::::InvalidMessagesProof - })?; + Error::::InvalidMessagesProof + })?; // dispatch messages and (optionally) update lane(s) state(s) let mut total_messages = 0; @@ -424,14 +389,14 @@ pub mod pallet { ))] pub fn receive_messages_delivery_proof( origin: OriginFor, - proof: MessagesDeliveryProofOf, + proof: FromBridgedChainMessagesDeliveryProof>>, mut relayers_state: UnrewardedRelayersState, ) -> DispatchResultWithPostInfo { Self::ensure_not_halted().map_err(Error::::BridgeModule)?; let proof_size = proof.size(); let confirmation_relayer = ensure_signed(origin)?; - let (lane_id, lane_data) = T::TargetHeaderChain::verify_messages_delivery_proof(proof) + let (lane_id, lane_data) = proofs::verify_messages_delivery_proof::(proof) .map_err(|err| { log::trace!( target: LOG_TARGET, @@ -542,8 +507,6 @@ pub mod pallet { InactiveOutboundLane, /// The inbound message dispatcher is inactive. MessageDispatchInactive, - /// Message has been treated as invalid by chain verifier. - MessageRejectedByChainVerifier(VerificationError), /// Message has been treated as invalid by the pallet logic. MessageRejectedByPallet(VerificationError), /// Submitter has failed to pay fee for delivering and dispatching messages. @@ -674,7 +637,9 @@ pub mod pallet { } /// Return inbound lane data. - pub fn inbound_lane_data(lane: LaneId) -> InboundLaneData { + pub fn inbound_lane_data( + lane: LaneId, + ) -> InboundLaneData>> { InboundLanes::::get(lane).0 } } @@ -714,18 +679,6 @@ where // let's check if outbound lane is active ensure!(T::ActiveOutboundLanes::get().contains(&lane), Error::::InactiveOutboundLane); - // let's first check if message can be delivered to target chain - T::TargetHeaderChain::verify_message(message).map_err(|err| { - log::trace!( - target: LOG_TARGET, - "Message to lane {:?} is rejected by target chain: {:?}", - lane, - err, - ); - - Error::::MessageRejectedByChainVerifier(err) - })?; - Ok(SendMessageArgs { lane_id: lane, payload: StoredMessagePayload::::try_from(message.encode()).map_err(|_| { @@ -785,7 +738,7 @@ fn outbound_lane, I: 'static>( /// Runtime inbound lane storage. struct RuntimeInboundLaneStorage, I: 'static = ()> { lane_id: LaneId, - cached_data: Option>, + cached_data: Option>>>, _phantom: PhantomData, } @@ -802,39 +755,39 @@ impl, I: 'static> RuntimeInboundLaneStorage { /// maximal configured. /// /// Maximal inbound lane state set size is configured by the - /// `MaxUnrewardedRelayerEntriesAtInboundLane` constant from the pallet configuration. The PoV + /// `MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX` constant from the pallet configuration. The PoV /// of the call includes the maximal size of inbound lane state. If the actual size is smaller, /// we may subtract extra bytes from this component. pub fn extra_proof_size_bytes(&mut self) -> u64 { let max_encoded_len = StoredInboundLaneData::::max_encoded_len(); let relayers_count = self.get_or_init_data().relayers.len(); let actual_encoded_len = - InboundLaneData::::encoded_size_hint(relayers_count) + InboundLaneData::>>::encoded_size_hint(relayers_count) .unwrap_or(usize::MAX); max_encoded_len.saturating_sub(actual_encoded_len) as _ } } impl, I: 'static> InboundLaneStorage for RuntimeInboundLaneStorage { - type Relayer = T::InboundRelayer; + type Relayer = AccountIdOf>; fn id(&self) -> LaneId { self.lane_id } fn max_unrewarded_relayer_entries(&self) -> MessageNonce { - T::MaxUnrewardedRelayerEntriesAtInboundLane::get() + BridgedChainOf::::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX } fn max_unconfirmed_messages(&self) -> MessageNonce { - T::MaxUnconfirmedMessagesAtInboundLane::get() + BridgedChainOf::::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX } - fn get_or_init_data(&mut self) -> InboundLaneData { + fn get_or_init_data(&mut self) -> InboundLaneData>> { match self.cached_data { Some(ref data) => data.clone(), None => { - let data: InboundLaneData = + let data: InboundLaneData>> = InboundLanes::::get(self.lane_id).into(); self.cached_data = Some(data.clone()); data @@ -842,7 +795,7 @@ impl, I: 'static> InboundLaneStorage for RuntimeInboundLaneStorage< } } - fn set_data(&mut self, data: InboundLaneData) { + fn set_data(&mut self, data: InboundLaneData>>) { self.cached_data = Some(data.clone()); InboundLanes::::insert(self.lane_id, StoredInboundLaneData::(data)) } @@ -887,14 +840,14 @@ impl, I: 'static> OutboundLaneStorage for RuntimeOutboundLaneStorag } /// Verify messages proof and return proved messages with decoded payload. -fn verify_and_decode_messages_proof( - proof: Chain::MessagesProof, +fn verify_and_decode_messages_proof, I: 'static>( + proof: FromBridgedChainMessagesProof>>, messages_count: u32, -) -> Result>, VerificationError> { - // `receive_messages_proof` weight formula and `MaxUnconfirmedMessagesAtInboundLane` check - // guarantees that the `message_count` is sane and Vec may be allocated. +) -> Result>, VerificationError> { + // `receive_messages_proof` weight formula and `MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX` + // check guarantees that the `message_count` is sane and Vec may be allocated. // (tx with too many messages will either be rejected from the pool, or will fail earlier) - Chain::verify_messages_proof(proof, messages_count).map(|messages_by_lane| { + proofs::verify_messages_proof::(proof, messages_count).map(|messages_by_lane| { messages_by_lane .into_iter() .map(|(lane, lane_data)| { @@ -909,1209 +862,3 @@ fn verify_and_decode_messages_proof::set_block_number(1); - System::::reset_events(); - } - - fn send_regular_message(lane_id: LaneId) { - get_ready_for_events(); - - let outbound_lane = outbound_lane::(lane_id); - let message_nonce = outbound_lane.data().latest_generated_nonce + 1; - let prev_enqueued_messages = outbound_lane.data().queued_messages().saturating_len(); - let valid_message = Pallet::::validate_message(lane_id, ®ULAR_PAYLOAD) - .expect("validate_message has failed"); - let artifacts = Pallet::::send_message(valid_message); - assert_eq!(artifacts.enqueued_messages, prev_enqueued_messages + 1); - - // check event with assigned nonce - assert_eq!( - System::::events(), - vec![EventRecord { - phase: Phase::Initialization, - event: TestEvent::Messages(Event::MessageAccepted { - lane_id, - nonce: message_nonce - }), - topics: vec![], - }], - ); - } - - fn receive_messages_delivery_proof() { - System::::set_block_number(1); - System::::reset_events(); - - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 1, - relayers: vec![UnrewardedRelayer { - relayer: 0, - messages: DeliveredMessages::new(1), - }] - .into_iter() - .collect(), - }, - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }, - )); - - assert_eq!( - System::::events(), - vec![EventRecord { - phase: Phase::Initialization, - event: TestEvent::Messages(Event::MessagesDelivered { - lane_id: TEST_LANE_ID, - messages: DeliveredMessages::new(1), - }), - topics: vec![], - }], - ); - } - - #[test] - fn pallet_rejects_transactions_if_halted() { - run_test(|| { - // send message first to be able to check that delivery_proof fails later - send_regular_message(TEST_LANE_ID); - - PalletOperatingMode::::put(MessagesOperatingMode::Basic( - BasicOperatingMode::Halted, - )); - - assert_noop!( - Pallet::::validate_message(TEST_LANE_ID, ®ULAR_PAYLOAD), - Error::::NotOperatingNormally, - ); - - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(2, REGULAR_PAYLOAD)]).into(), - 1, - REGULAR_PAYLOAD.declared_weight, - ), - Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted), - ); - - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 1, - relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] - .into_iter() - .collect(), - }, - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }, - ), - Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted), - ); - }); - } - - #[test] - fn pallet_rejects_new_messages_in_rejecting_outbound_messages_operating_mode() { - run_test(|| { - // send message first to be able to check that delivery_proof fails later - send_regular_message(TEST_LANE_ID); - - PalletOperatingMode::::put( - MessagesOperatingMode::RejectingOutboundMessages, - ); - - assert_noop!( - Pallet::::validate_message(TEST_LANE_ID, ®ULAR_PAYLOAD), - Error::::NotOperatingNormally, - ); - - assert_ok!(Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), - 1, - REGULAR_PAYLOAD.declared_weight, - ),); - - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 1, - relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] - .into_iter() - .collect(), - }, - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }, - )); - }); - } - - #[test] - fn send_message_works() { - run_test(|| { - send_regular_message(TEST_LANE_ID); - }); - } - - #[test] - fn send_message_rejects_too_large_message() { - run_test(|| { - let mut message_payload = message_payload(1, 0); - // the payload isn't simply extra, so it'll definitely overflow - // `MAX_OUTBOUND_PAYLOAD_SIZE` if we add `MAX_OUTBOUND_PAYLOAD_SIZE` bytes to extra - message_payload - .extra - .extend_from_slice(&[0u8; MAX_OUTBOUND_PAYLOAD_SIZE as usize]); - assert_noop!( - Pallet::::validate_message(TEST_LANE_ID, &message_payload.clone(),), - Error::::MessageRejectedByPallet( - VerificationError::MessageTooLarge - ), - ); - - // let's check that we're able to send `MAX_OUTBOUND_PAYLOAD_SIZE` messages - while message_payload.encoded_size() as u32 > MAX_OUTBOUND_PAYLOAD_SIZE { - message_payload.extra.pop(); - } - assert_eq!(message_payload.encoded_size() as u32, MAX_OUTBOUND_PAYLOAD_SIZE); - - let valid_message = - Pallet::::validate_message(TEST_LANE_ID, &message_payload) - .expect("validate_message has failed"); - Pallet::::send_message(valid_message); - }) - } - - #[test] - fn chain_verifier_rejects_invalid_message_in_send_message() { - run_test(|| { - // messages with this payload are rejected by target chain verifier - assert_noop!( - Pallet::::validate_message( - TEST_LANE_ID, - &PAYLOAD_REJECTED_BY_TARGET_CHAIN, - ), - Error::::MessageRejectedByChainVerifier(VerificationError::Other( - mock::TEST_ERROR - )), - ); - }); - } - - #[test] - fn receive_messages_proof_works() { - run_test(|| { - assert_ok!(Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), - 1, - REGULAR_PAYLOAD.declared_weight, - )); - - assert_eq!(InboundLanes::::get(TEST_LANE_ID).0.last_delivered_nonce(), 1); - - assert!(TestDeliveryPayments::is_reward_paid(1)); - }); - } - - #[test] - fn receive_messages_proof_updates_confirmed_message_nonce() { - run_test(|| { - // say we have received 10 messages && last confirmed message is 8 - InboundLanes::::insert( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 8, - relayers: vec![ - unrewarded_relayer(9, 9, TEST_RELAYER_A), - unrewarded_relayer(10, 10, TEST_RELAYER_B), - ] - .into_iter() - .collect(), - }, - ); - assert_eq!( - inbound_unrewarded_relayers_state(TEST_LANE_ID), - UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - messages_in_oldest_entry: 1, - total_messages: 2, - last_delivered_nonce: 10, - }, - ); - - // message proof includes outbound lane state with latest confirmed message updated to 9 - let mut message_proof: TestMessagesProof = - Ok(vec![message(11, REGULAR_PAYLOAD)]).into(); - message_proof.result.as_mut().unwrap()[0].1.lane_state = - Some(OutboundLaneData { latest_received_nonce: 9, ..Default::default() }); - - assert_ok!(Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - message_proof, - 1, - REGULAR_PAYLOAD.declared_weight, - )); - - assert_eq!( - InboundLanes::::get(TEST_LANE_ID).0, - InboundLaneData { - last_confirmed_nonce: 9, - relayers: vec![ - unrewarded_relayer(10, 10, TEST_RELAYER_B), - unrewarded_relayer(11, 11, TEST_RELAYER_A) - ] - .into_iter() - .collect(), - }, - ); - assert_eq!( - inbound_unrewarded_relayers_state(TEST_LANE_ID), - UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - messages_in_oldest_entry: 1, - total_messages: 2, - last_delivered_nonce: 11, - }, - ); - }); - } - - #[test] - fn receive_messages_fails_if_dispatcher_is_inactive() { - run_test(|| { - TestMessageDispatch::deactivate(); - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), - 1, - REGULAR_PAYLOAD.declared_weight, - ), - Error::::MessageDispatchInactive, - ); - }); - } - - #[test] - fn receive_messages_proof_does_not_accept_message_if_dispatch_weight_is_not_enough() { - run_test(|| { - let mut declared_weight = REGULAR_PAYLOAD.declared_weight; - *declared_weight.ref_time_mut() -= 1; - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), - 1, - declared_weight, - ), - Error::::InsufficientDispatchWeight - ); - assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 0); - }); - } - - #[test] - fn receive_messages_proof_rejects_invalid_proof() { - run_test(|| { - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Err(()).into(), - 1, - Weight::zero(), - ), - Error::::InvalidMessagesProof, - ); - }); - } - - #[test] - fn receive_messages_proof_rejects_proof_with_too_many_messages() { - run_test(|| { - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), - u32::MAX, - Weight::zero(), - ), - Error::::TooManyMessagesInTheProof, - ); - }); - } - - #[test] - fn receive_messages_delivery_proof_works() { - run_test(|| { - send_regular_message(TEST_LANE_ID); - receive_messages_delivery_proof(); - - assert_eq!( - OutboundLanes::::get(TEST_LANE_ID).latest_received_nonce, - 1, - ); - }); - } - - #[test] - fn receive_messages_delivery_proof_rewards_relayers() { - run_test(|| { - send_regular_message(TEST_LANE_ID); - send_regular_message(TEST_LANE_ID); - - // this reports delivery of message 1 => reward is paid to TEST_RELAYER_A - let single_message_delivery_proof = TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)].into_iter().collect(), - ..Default::default() - }, - ))); - let single_message_delivery_proof_size = single_message_delivery_proof.size(); - let result = Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - single_message_delivery_proof, - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }, - ); - assert_ok!(result); - assert_eq!( - result.unwrap().actual_weight.unwrap(), - TestWeightInfo::receive_messages_delivery_proof_weight( - &PreComputedSize(single_message_delivery_proof_size as _), - &UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - total_messages: 1, - ..Default::default() - }, - ) - ); - assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1)); - assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1)); - assert_eq!(TestOnMessagesDelivered::call_arguments(), Some((TEST_LANE_ID, 1))); - - // this reports delivery of both message 1 and message 2 => reward is paid only to - // TEST_RELAYER_B - let two_messages_delivery_proof = TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - relayers: vec![ - unrewarded_relayer(1, 1, TEST_RELAYER_A), - unrewarded_relayer(2, 2, TEST_RELAYER_B), - ] - .into_iter() - .collect(), - ..Default::default() - }, - ))); - let two_messages_delivery_proof_size = two_messages_delivery_proof.size(); - let result = Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - two_messages_delivery_proof, - UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - messages_in_oldest_entry: 1, - total_messages: 2, - last_delivered_nonce: 2, - }, - ); - assert_ok!(result); - // even though the pre-dispatch weight was for two messages, the actual weight is - // for single message only - assert_eq!( - result.unwrap().actual_weight.unwrap(), - TestWeightInfo::receive_messages_delivery_proof_weight( - &PreComputedSize(two_messages_delivery_proof_size as _), - &UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - total_messages: 1, - ..Default::default() - }, - ) - ); - assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1)); - assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1)); - assert_eq!(TestOnMessagesDelivered::call_arguments(), Some((TEST_LANE_ID, 0))); - }); - } - - #[test] - fn receive_messages_delivery_proof_rejects_invalid_proof() { - run_test(|| { - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Err(())), - Default::default(), - ), - Error::::InvalidMessagesDeliveryProof, - ); - }); - } - - #[test] - fn receive_messages_delivery_proof_rejects_proof_if_declared_relayers_state_is_invalid() { - run_test(|| { - // when number of relayers entries is invalid - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - relayers: vec![ - unrewarded_relayer(1, 1, TEST_RELAYER_A), - unrewarded_relayer(2, 2, TEST_RELAYER_B) - ] - .into_iter() - .collect(), - ..Default::default() - } - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - total_messages: 2, - last_delivered_nonce: 2, - ..Default::default() - }, - ), - Error::::InvalidUnrewardedRelayersState, - ); - - // when number of messages is invalid - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - relayers: vec![ - unrewarded_relayer(1, 1, TEST_RELAYER_A), - unrewarded_relayer(2, 2, TEST_RELAYER_B) - ] - .into_iter() - .collect(), - ..Default::default() - } - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - total_messages: 1, - last_delivered_nonce: 2, - ..Default::default() - }, - ), - Error::::InvalidUnrewardedRelayersState, - ); - - // when last delivered nonce is invalid - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - relayers: vec![ - unrewarded_relayer(1, 1, TEST_RELAYER_A), - unrewarded_relayer(2, 2, TEST_RELAYER_B) - ] - .into_iter() - .collect(), - ..Default::default() - } - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - total_messages: 2, - last_delivered_nonce: 8, - ..Default::default() - }, - ), - Error::::InvalidUnrewardedRelayersState, - ); - }); - } - - #[test] - fn receive_messages_accepts_single_message_with_invalid_payload() { - run_test(|| { - let mut invalid_message = message(1, REGULAR_PAYLOAD); - invalid_message.payload = Vec::new(); - - assert_ok!(Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![invalid_message]).into(), - 1, - Weight::zero(), /* weight may be zero in this case (all messages are - * improperly encoded) */ - ),); - - assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 1,); - }); - } - - #[test] - fn receive_messages_accepts_batch_with_message_with_invalid_payload() { - run_test(|| { - let mut invalid_message = message(2, REGULAR_PAYLOAD); - invalid_message.payload = Vec::new(); - - assert_ok!(Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok( - vec![message(1, REGULAR_PAYLOAD), invalid_message, message(3, REGULAR_PAYLOAD),] - ) - .into(), - 3, - REGULAR_PAYLOAD.declared_weight + REGULAR_PAYLOAD.declared_weight, - ),); - - assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 3,); - }); - } - - #[test] - fn actual_dispatch_weight_does_not_overflow() { - run_test(|| { - let message1 = message(1, message_payload(0, u64::MAX / 2)); - let message2 = message(2, message_payload(0, u64::MAX / 2)); - let message3 = message(3, message_payload(0, u64::MAX / 2)); - - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - // this may cause overflow if source chain storage is invalid - Ok(vec![message1, message2, message3]).into(), - 3, - Weight::MAX, - ), - Error::::InsufficientDispatchWeight - ); - assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 0); - }); - } - - #[test] - fn ref_time_refund_from_receive_messages_proof_works() { - run_test(|| { - fn submit_with_unspent_weight( - nonce: MessageNonce, - unspent_weight: u64, - ) -> (Weight, Weight) { - let mut payload = REGULAR_PAYLOAD; - *payload.dispatch_result.unspent_weight.ref_time_mut() = unspent_weight; - let proof = Ok(vec![message(nonce, payload)]).into(); - let messages_count = 1; - let pre_dispatch_weight = - ::WeightInfo::receive_messages_proof_weight( - &proof, - messages_count, - REGULAR_PAYLOAD.declared_weight, - ); - let result = Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - proof, - messages_count, - REGULAR_PAYLOAD.declared_weight, - ) - .expect("delivery has failed"); - let post_dispatch_weight = - result.actual_weight.expect("receive_messages_proof always returns Some"); - - // message delivery transactions are never free - assert_eq!(result.pays_fee, Pays::Yes); - - (pre_dispatch_weight, post_dispatch_weight) - } - - // when dispatch is returning `unspent_weight < declared_weight` - let (pre, post) = submit_with_unspent_weight(1, 1); - assert_eq!(post.ref_time(), pre.ref_time() - 1); - - // when dispatch is returning `unspent_weight = declared_weight` - let (pre, post) = - submit_with_unspent_weight(2, REGULAR_PAYLOAD.declared_weight.ref_time()); - assert_eq!( - post.ref_time(), - pre.ref_time() - REGULAR_PAYLOAD.declared_weight.ref_time() - ); - - // when dispatch is returning `unspent_weight > declared_weight` - let (pre, post) = - submit_with_unspent_weight(3, REGULAR_PAYLOAD.declared_weight.ref_time() + 1); - assert_eq!( - post.ref_time(), - pre.ref_time() - REGULAR_PAYLOAD.declared_weight.ref_time() - ); - - // when there's no unspent weight - let (pre, post) = submit_with_unspent_weight(4, 0); - assert_eq!(post.ref_time(), pre.ref_time()); - - // when dispatch is returning `unspent_weight < declared_weight` - let (pre, post) = submit_with_unspent_weight(5, 1); - assert_eq!(post.ref_time(), pre.ref_time() - 1); - }); - } - - #[test] - fn proof_size_refund_from_receive_messages_proof_works() { - run_test(|| { - let max_entries = crate::mock::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize; - - // if there's maximal number of unrewarded relayer entries at the inbound lane, then - // `proof_size` is unchanged in post-dispatch weight - let proof: TestMessagesProof = Ok(vec![message(101, REGULAR_PAYLOAD)]).into(); - let messages_count = 1; - let pre_dispatch_weight = - ::WeightInfo::receive_messages_proof_weight( - &proof, - messages_count, - REGULAR_PAYLOAD.declared_weight, - ); - InboundLanes::::insert( - TEST_LANE_ID, - StoredInboundLaneData(InboundLaneData { - relayers: vec![ - UnrewardedRelayer { - relayer: 42, - messages: DeliveredMessages { begin: 0, end: 100 } - }; - max_entries - ] - .into_iter() - .collect(), - last_confirmed_nonce: 0, - }), - ); - let post_dispatch_weight = Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - proof.clone(), - messages_count, - REGULAR_PAYLOAD.declared_weight, - ) - .unwrap() - .actual_weight - .unwrap(); - assert_eq!(post_dispatch_weight.proof_size(), pre_dispatch_weight.proof_size()); - - // if count of unrewarded relayer entries is less than maximal, then some `proof_size` - // must be refunded - InboundLanes::::insert( - TEST_LANE_ID, - StoredInboundLaneData(InboundLaneData { - relayers: vec![ - UnrewardedRelayer { - relayer: 42, - messages: DeliveredMessages { begin: 0, end: 100 } - }; - max_entries - 1 - ] - .into_iter() - .collect(), - last_confirmed_nonce: 0, - }), - ); - let post_dispatch_weight = Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - proof, - messages_count, - REGULAR_PAYLOAD.declared_weight, - ) - .unwrap() - .actual_weight - .unwrap(); - assert!( - post_dispatch_weight.proof_size() < pre_dispatch_weight.proof_size(), - "Expected post-dispatch PoV {} to be less than pre-dispatch PoV {}", - post_dispatch_weight.proof_size(), - pre_dispatch_weight.proof_size(), - ); - }); - } - - #[test] - fn messages_delivered_callbacks_are_called() { - run_test(|| { - send_regular_message(TEST_LANE_ID); - send_regular_message(TEST_LANE_ID); - send_regular_message(TEST_LANE_ID); - - // messages 1+2 are confirmed in 1 tx, message 3 in a separate tx - // dispatch of message 2 has failed - let mut delivered_messages_1_and_2 = DeliveredMessages::new(1); - delivered_messages_1_and_2.note_dispatched_message(); - let messages_1_and_2_proof = Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 0, - relayers: vec![UnrewardedRelayer { - relayer: 0, - messages: delivered_messages_1_and_2.clone(), - }] - .into_iter() - .collect(), - }, - )); - let delivered_message_3 = DeliveredMessages::new(3); - let messages_3_proof = Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 0, - relayers: vec![UnrewardedRelayer { relayer: 0, messages: delivered_message_3 }] - .into_iter() - .collect(), - }, - )); - - // first tx with messages 1+2 - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(messages_1_and_2_proof), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 2, - total_messages: 2, - last_delivered_nonce: 2, - }, - )); - // second tx with message 3 - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(messages_3_proof), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 3, - }, - )); - }); - } - - #[test] - fn receive_messages_delivery_proof_rejects_proof_if_trying_to_confirm_more_messages_than_expected( - ) { - run_test(|| { - // send message first to be able to check that delivery_proof fails later - send_regular_message(TEST_LANE_ID); - - // 1) InboundLaneData declares that the `last_confirmed_nonce` is 1; - // 2) InboundLaneData has no entries => `InboundLaneData::last_delivered_nonce()` - // returns `last_confirmed_nonce`; - // 3) it means that we're going to confirm delivery of messages 1..=1; - // 4) so the number of declared messages (see `UnrewardedRelayersState`) is `0` and - // number of actually confirmed messages is `1`. - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { last_confirmed_nonce: 1, relayers: Default::default() }, - ))), - UnrewardedRelayersState { last_delivered_nonce: 1, ..Default::default() }, - ), - Error::::ReceptionConfirmation( - ReceptionConfirmationError::TryingToConfirmMoreMessagesThanExpected - ), - ); - }); - } - - #[test] - fn storage_keys_computed_properly() { - assert_eq!( - PalletOperatingMode::::storage_value_final_key().to_vec(), - bp_messages::storage_keys::operating_mode_key("Messages").0, - ); - - assert_eq!( - OutboundMessages::::storage_map_final_key(MessageKey { - lane_id: TEST_LANE_ID, - nonce: 42 - }), - bp_messages::storage_keys::message_key("Messages", &TEST_LANE_ID, 42).0, - ); - - assert_eq!( - OutboundLanes::::storage_map_final_key(TEST_LANE_ID), - bp_messages::storage_keys::outbound_lane_data_key("Messages", &TEST_LANE_ID).0, - ); - - assert_eq!( - InboundLanes::::storage_map_final_key(TEST_LANE_ID), - bp_messages::storage_keys::inbound_lane_data_key("Messages", &TEST_LANE_ID).0, - ); - } - - #[test] - fn inbound_message_details_works() { - run_test(|| { - assert_eq!( - Pallet::::inbound_message_data( - TEST_LANE_ID, - REGULAR_PAYLOAD.encode(), - OutboundMessageDetails { nonce: 0, dispatch_weight: Weight::zero(), size: 0 }, - ), - InboundMessageDetails { dispatch_weight: REGULAR_PAYLOAD.declared_weight }, - ); - }); - } - - #[test] - fn on_idle_callback_respects_remaining_weight() { - run_test(|| { - send_regular_message(TEST_LANE_ID); - send_regular_message(TEST_LANE_ID); - send_regular_message(TEST_LANE_ID); - send_regular_message(TEST_LANE_ID); - - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 4, - relayers: vec![unrewarded_relayer(1, 4, TEST_RELAYER_A)] - .into_iter() - .collect(), - }, - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 4, - total_messages: 4, - last_delivered_nonce: 4, - }, - )); - - // all 4 messages may be pruned now - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().latest_received_nonce, - 4 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 1 - ); - System::::set_block_number(2); - - // if passed wight is too low to do anything - let dbw = DbWeight::get(); - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(1, 1)), - Weight::zero(), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 1 - ); - - // if passed wight is enough to prune single message - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(1, 2)), - dbw.reads_writes(1, 2), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 2 - ); - - // if passed wight is enough to prune two more messages - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(1, 3)), - dbw.reads_writes(1, 3), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 4 - ); - - // if passed wight is enough to prune many messages - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(100, 100)), - dbw.reads_writes(1, 2), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 5 - ); - }); - } - - #[test] - fn on_idle_callback_is_rotating_lanes_to_prune() { - run_test(|| { - // send + receive confirmation for lane 1 - send_regular_message(TEST_LANE_ID); - receive_messages_delivery_proof(); - // send + receive confirmation for lane 2 - send_regular_message(TEST_LANE_ID_2); - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID_2, - InboundLaneData { - last_confirmed_nonce: 1, - relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] - .into_iter() - .collect(), - }, - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }, - )); - - // nothing is pruned yet - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().latest_received_nonce, - 1 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 1 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID_2).data().latest_received_nonce, - 1 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, - 1 - ); - - // in block#2.on_idle lane messages of lane 1 are pruned - let dbw = DbWeight::get(); - System::::set_block_number(2); - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(100, 100)), - dbw.reads_writes(1, 2), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 2 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, - 1 - ); - - // in block#3.on_idle lane messages of lane 2 are pruned - System::::set_block_number(3); - - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(100, 100)), - dbw.reads_writes(1, 2), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 2 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, - 2 - ); - }); - } - - #[test] - fn outbound_message_from_unconfigured_lane_is_rejected() { - run_test(|| { - assert_noop!( - Pallet::::validate_message(TEST_LANE_ID_3, ®ULAR_PAYLOAD,), - Error::::InactiveOutboundLane, - ); - }); - } - - #[test] - fn test_bridge_messages_call_is_correctly_defined() { - let account_id = 1; - let message_proof: TestMessagesProof = Ok(vec![message(1, REGULAR_PAYLOAD)]).into(); - let message_delivery_proof = TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 1, - relayers: vec![UnrewardedRelayer { - relayer: 0, - messages: DeliveredMessages::new(1), - }] - .into_iter() - .collect(), - }, - ))); - let unrewarded_relayer_state = UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - total_messages: 1, - last_delivered_nonce: 1, - ..Default::default() - }; - - let direct_receive_messages_proof_call = Call::::receive_messages_proof { - relayer_id_at_bridged_chain: account_id, - proof: message_proof.clone(), - messages_count: 1, - dispatch_weight: REGULAR_PAYLOAD.declared_weight, - }; - let indirect_receive_messages_proof_call = BridgeMessagesCall::< - AccountId, - TestMessagesProof, - TestMessagesDeliveryProof, - >::receive_messages_proof { - relayer_id_at_bridged_chain: account_id, - proof: message_proof, - messages_count: 1, - dispatch_weight: REGULAR_PAYLOAD.declared_weight, - }; - assert_eq!( - direct_receive_messages_proof_call.encode(), - indirect_receive_messages_proof_call.encode() - ); - - let direct_receive_messages_delivery_proof_call = - Call::::receive_messages_delivery_proof { - proof: message_delivery_proof.clone(), - relayers_state: unrewarded_relayer_state.clone(), - }; - let indirect_receive_messages_delivery_proof_call = BridgeMessagesCall::< - AccountId, - TestMessagesProof, - TestMessagesDeliveryProof, - >::receive_messages_delivery_proof { - proof: message_delivery_proof, - relayers_state: unrewarded_relayer_state, - }; - assert_eq!( - direct_receive_messages_delivery_proof_call.encode(), - indirect_receive_messages_delivery_proof_call.encode() - ); - } - - generate_owned_bridge_module_tests!( - MessagesOperatingMode::Basic(BasicOperatingMode::Normal), - MessagesOperatingMode::Basic(BasicOperatingMode::Halted) - ); - - #[test] - fn inbound_storage_extra_proof_size_bytes_works() { - fn relayer_entry() -> UnrewardedRelayer { - UnrewardedRelayer { relayer: 42u64, messages: DeliveredMessages { begin: 0, end: 100 } } - } - - fn storage(relayer_entries: usize) -> RuntimeInboundLaneStorage { - RuntimeInboundLaneStorage { - lane_id: Default::default(), - cached_data: Some(InboundLaneData { - relayers: vec![relayer_entry(); relayer_entries].into_iter().collect(), - last_confirmed_nonce: 0, - }), - _phantom: Default::default(), - } - } - - let max_entries = crate::mock::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize; - - // when we have exactly `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers - assert_eq!(storage(max_entries).extra_proof_size_bytes(), 0); - - // when we have less than `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers - assert_eq!( - storage(max_entries - 1).extra_proof_size_bytes(), - relayer_entry().encode().len() as u64 - ); - assert_eq!( - storage(max_entries - 2).extra_proof_size_bytes(), - 2 * relayer_entry().encode().len() as u64 - ); - - // when we have more than `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers - // (shall not happen in practice) - assert_eq!(storage(max_entries + 1).extra_proof_size_bytes(), 0); - } - - #[test] - fn maybe_outbound_lanes_count_returns_correct_value() { - assert_eq!( - MaybeOutboundLanesCount::::get(), - Some(mock::ActiveOutboundLanes::get().len() as u32) - ); - } -} diff --git a/bridges/modules/messages/src/outbound_lane.rs b/bridges/modules/messages/src/outbound_lane.rs index acef5546d2a..fcdddf199dc 100644 --- a/bridges/modules/messages/src/outbound_lane.rs +++ b/bridges/modules/messages/src/outbound_lane.rs @@ -18,16 +18,18 @@ use crate::{Config, LOG_TARGET}; -use bp_messages::{DeliveredMessages, LaneId, MessageNonce, OutboundLaneData, UnrewardedRelayer}; +use bp_messages::{ + ChainWithMessages, DeliveredMessages, LaneId, MessageNonce, OutboundLaneData, UnrewardedRelayer, +}; use codec::{Decode, Encode}; use frame_support::{ + traits::Get, weights::{RuntimeDbWeight, Weight}, BoundedVec, PalletError, }; -use num_traits::Zero; use scale_info::TypeInfo; -use sp_runtime::RuntimeDebug; -use sp_std::collections::vec_deque::VecDeque; +use sp_runtime::{traits::Zero, RuntimeDebug}; +use sp_std::{collections::vec_deque::VecDeque, marker::PhantomData}; /// Outbound lane storage. pub trait OutboundLaneStorage { @@ -48,8 +50,17 @@ pub trait OutboundLaneStorage { fn remove_message(&mut self, nonce: &MessageNonce); } +/// Limit for the `StoredMessagePayload` vector. +pub struct StoredMessagePayloadLimit(PhantomData<(T, I)>); + +impl, I: 'static> Get for StoredMessagePayloadLimit { + fn get() -> u32 { + T::BridgedChain::maximal_incoming_message_size() + } +} + /// Outbound message data wrapper that implements `MaxEncodedLen`. -pub type StoredMessagePayload = BoundedVec>::MaximalOutboundPayloadSize>; +pub type StoredMessagePayload = BoundedVec>; /// Result of messages receival confirmation. #[derive(Encode, Decode, RuntimeDebug, PartialEq, Eq, PalletError, TypeInfo)] @@ -204,11 +215,11 @@ fn ensure_unrewarded_relayers_are_correct( mod tests { use super::*; use crate::{ - mock::{ + outbound_lane, + tests::mock::{ outbound_message_data, run_test, unrewarded_relayer, TestRelayer, TestRuntime, REGULAR_PAYLOAD, TEST_LANE_ID, }, - outbound_lane, }; use frame_support::weights::constants::RocksDbWeight; use sp_std::ops::RangeInclusive; @@ -263,12 +274,43 @@ mod tests { assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 3); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 0); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); assert_eq!( lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), Ok(Some(delivered_messages(1..=3))), ); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 3); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); + }); + } + + #[test] + fn confirm_partial_delivery_works() { + run_test(|| { + let mut lane = outbound_lane::(TEST_LANE_ID); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 1); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 2); + assert_eq!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)), 3); + assert_eq!(lane.storage.data().latest_generated_nonce, 3); + assert_eq!(lane.storage.data().latest_received_nonce, 0); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); + + assert_eq!( + lane.confirm_delivery(3, 2, &unrewarded_relayers(1..=2)), + Ok(Some(delivered_messages(1..=2))), + ); + assert_eq!(lane.storage.data().latest_generated_nonce, 3); + assert_eq!(lane.storage.data().latest_received_nonce, 2); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); + + assert_eq!( + lane.confirm_delivery(3, 3, &unrewarded_relayers(3..=3)), + Ok(Some(delivered_messages(3..=3))), + ); + assert_eq!(lane.storage.data().latest_generated_nonce, 3); + assert_eq!(lane.storage.data().latest_received_nonce, 3); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); }); } @@ -281,6 +323,7 @@ mod tests { lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 0); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); assert_eq!( lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), Ok(Some(delivered_messages(1..=3))), @@ -288,10 +331,12 @@ mod tests { assert_eq!(lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), Ok(None),); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 3); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); assert_eq!(lane.confirm_delivery(1, 2, &unrewarded_relayers(1..=1)), Ok(None),); assert_eq!(lane.storage.data().latest_generated_nonce, 3); assert_eq!(lane.storage.data().latest_received_nonce, 3); + assert_eq!(lane.storage.data().oldest_unpruned_nonce, 1); }); } @@ -310,8 +355,8 @@ mod tests { 3, &unrewarded_relayers(1..=1) .into_iter() - .chain(unrewarded_relayers(2..=30).into_iter()) - .chain(unrewarded_relayers(3..=3).into_iter()) + .chain(unrewarded_relayers(2..=30)) + .chain(unrewarded_relayers(3..=3)) .collect(), ), Err(ReceptionConfirmationError::FailedToConfirmFutureMessages), @@ -326,8 +371,8 @@ mod tests { 3, &unrewarded_relayers(1..=1) .into_iter() - .chain(unrewarded_relayers(2..=1).into_iter()) - .chain(unrewarded_relayers(2..=3).into_iter()) + .chain(unrewarded_relayers(2..=1)) + .chain(unrewarded_relayers(2..=3)) .collect(), ), Err(ReceptionConfirmationError::EmptyUnrewardedRelayerEntry), @@ -341,8 +386,8 @@ mod tests { 3, &unrewarded_relayers(1..=1) .into_iter() - .chain(unrewarded_relayers(3..=3).into_iter()) - .chain(unrewarded_relayers(2..=2).into_iter()) + .chain(unrewarded_relayers(3..=3)) + .chain(unrewarded_relayers(2..=2)) .collect(), ), Err(ReceptionConfirmationError::NonConsecutiveUnrewardedRelayerEntries), diff --git a/bridges/modules/messages/src/proofs.rs b/bridges/modules/messages/src/proofs.rs new file mode 100644 index 00000000000..18367029d72 --- /dev/null +++ b/bridges/modules/messages/src/proofs.rs @@ -0,0 +1,562 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tools for messages and delivery proof verification. + +use crate::{BridgedChainOf, BridgedHeaderChainOf, Config}; + +use bp_header_chain::{HeaderChain, HeaderChainError}; +use bp_messages::{ + source_chain::FromBridgedChainMessagesDeliveryProof, + target_chain::{FromBridgedChainMessagesProof, ProvedLaneMessages, ProvedMessages}, + ChainWithMessages, InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload, + OutboundLaneData, VerificationError, +}; +use bp_runtime::{ + HashOf, HasherOf, RangeInclusiveExt, RawStorageProof, StorageProofChecker, StorageProofError, +}; +use codec::Decode; +use sp_std::vec::Vec; + +/// 'Parsed' message delivery proof - inbound lane id and its state. +pub(crate) type ParsedMessagesDeliveryProofFromBridgedChain = + (LaneId, InboundLaneData<::AccountId>); + +/// Verify proof of Bridged -> This chain messages. +/// +/// This function is used when Bridged chain is directly using GRANDPA finality. For Bridged +/// parachains, please use the `verify_messages_proof_from_parachain`. +/// +/// The `messages_count` argument verification (sane limits) is supposed to be made +/// outside of this function. This function only verifies that the proof declares exactly +/// `messages_count` messages. +pub fn verify_messages_proof, I: 'static>( + proof: FromBridgedChainMessagesProof>>, + messages_count: u32, +) -> Result, VerificationError> { + let FromBridgedChainMessagesProof { + bridged_header_hash, + storage_proof, + lane, + nonces_start, + nonces_end, + } = proof; + let mut parser: MessagesStorageProofAdapter = + MessagesStorageProofAdapter::try_new_with_verified_storage_proof( + bridged_header_hash, + storage_proof, + ) + .map_err(VerificationError::HeaderChain)?; + let nonces_range = nonces_start..=nonces_end; + + // receiving proofs where end < begin is ok (if proof includes outbound lane state) + let messages_in_the_proof = nonces_range.checked_len().unwrap_or(0); + if messages_in_the_proof != MessageNonce::from(messages_count) { + return Err(VerificationError::MessagesCountMismatch) + } + + // Read messages first. All messages that are claimed to be in the proof must + // be in the proof. So any error in `read_value`, or even missing value is fatal. + // + // Mind that we allow proofs with no messages if outbound lane state is proved. + let mut messages = Vec::with_capacity(messages_in_the_proof as _); + for nonce in nonces_range { + let message_key = MessageKey { lane_id: lane, nonce }; + let message_payload = parser + .read_and_decode_message_payload(&message_key) + .map_err(VerificationError::MessageStorage)?; + messages.push(Message { key: message_key, payload: message_payload }); + } + + // Now let's check if proof contains outbound lane state proof. It is optional, so + // we simply ignore `read_value` errors and missing value. + let proved_lane_messages = ProvedLaneMessages { + lane_state: parser + .read_and_decode_outbound_lane_data(&lane) + .map_err(VerificationError::OutboundLaneStorage)?, + messages, + }; + + // Now we may actually check if the proof is empty or not. + if proved_lane_messages.lane_state.is_none() && proved_lane_messages.messages.is_empty() { + return Err(VerificationError::EmptyMessageProof) + } + + // Check that the storage proof doesn't have any untouched keys. + parser.ensure_no_unused_keys().map_err(VerificationError::StorageProof)?; + + // We only support single lane messages in this generated_schema + let mut proved_messages = ProvedMessages::new(); + proved_messages.insert(lane, proved_lane_messages); + + Ok(proved_messages) +} + +/// Verify proof of This -> Bridged chain messages delivery. +pub fn verify_messages_delivery_proof, I: 'static>( + proof: FromBridgedChainMessagesDeliveryProof>>, +) -> Result, VerificationError> { + let FromBridgedChainMessagesDeliveryProof { bridged_header_hash, storage_proof, lane } = proof; + let mut parser: MessagesStorageProofAdapter = + MessagesStorageProofAdapter::try_new_with_verified_storage_proof( + bridged_header_hash, + storage_proof, + ) + .map_err(VerificationError::HeaderChain)?; + // Messages delivery proof is just proof of single storage key read => any error + // is fatal. + let storage_inbound_lane_data_key = bp_messages::storage_keys::inbound_lane_data_key( + T::ThisChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &lane, + ); + let inbound_lane_data = parser + .read_and_decode_mandatory_value(&storage_inbound_lane_data_key) + .map_err(VerificationError::InboundLaneStorage)?; + + // check that the storage proof doesn't have any untouched trie nodes + parser.ensure_no_unused_keys().map_err(VerificationError::StorageProof)?; + + Ok((lane, inbound_lane_data)) +} + +/// Abstraction over storage proof manipulation, hiding implementation details of actual storage +/// proofs. +trait StorageProofAdapter, I: 'static> { + fn read_and_decode_mandatory_value( + &mut self, + key: &impl AsRef<[u8]>, + ) -> Result; + fn read_and_decode_optional_value( + &mut self, + key: &impl AsRef<[u8]>, + ) -> Result, StorageProofError>; + fn ensure_no_unused_keys(self) -> Result<(), StorageProofError>; + + fn read_and_decode_outbound_lane_data( + &mut self, + lane_id: &LaneId, + ) -> Result, StorageProofError> { + let storage_outbound_lane_data_key = bp_messages::storage_keys::outbound_lane_data_key( + T::ThisChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + lane_id, + ); + self.read_and_decode_optional_value(&storage_outbound_lane_data_key) + } + + fn read_and_decode_message_payload( + &mut self, + message_key: &MessageKey, + ) -> Result { + let storage_message_key = bp_messages::storage_keys::message_key( + T::ThisChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &message_key.lane_id, + message_key.nonce, + ); + self.read_and_decode_mandatory_value(&storage_message_key) + } +} + +/// Actual storage proof adapter for messages proofs. +type MessagesStorageProofAdapter = StorageProofCheckerAdapter; + +/// A `StorageProofAdapter` implementation for raw storage proofs. +struct StorageProofCheckerAdapter, I: 'static> { + storage: StorageProofChecker>>, + _dummy: sp_std::marker::PhantomData<(T, I)>, +} + +impl, I: 'static> StorageProofCheckerAdapter { + fn try_new_with_verified_storage_proof( + bridged_header_hash: HashOf>, + storage_proof: RawStorageProof, + ) -> Result { + BridgedHeaderChainOf::::verify_storage_proof(bridged_header_hash, storage_proof).map( + |storage| StorageProofCheckerAdapter:: { storage, _dummy: Default::default() }, + ) + } +} + +impl, I: 'static> StorageProofAdapter for StorageProofCheckerAdapter { + fn read_and_decode_optional_value( + &mut self, + key: &impl AsRef<[u8]>, + ) -> Result, StorageProofError> { + self.storage.read_and_decode_opt_value(key.as_ref()) + } + + fn read_and_decode_mandatory_value( + &mut self, + key: &impl AsRef<[u8]>, + ) -> Result { + self.storage.read_and_decode_mandatory_value(key.as_ref()) + } + + fn ensure_no_unused_keys(self) -> Result<(), StorageProofError> { + self.storage.ensure_no_unused_nodes() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::tests::{ + messages_generation::{ + encode_all_messages, encode_lane_data, generate_dummy_message, + prepare_messages_storage_proof, + }, + mock::*, + }; + + use bp_header_chain::StoredHeaderDataBuilder; + use bp_runtime::{HeaderId, StorageProofError}; + use codec::Encode; + use sp_runtime::traits::Header; + + fn using_messages_proof( + nonces_end: MessageNonce, + outbound_lane_data: Option, + encode_message: impl Fn(MessageNonce, &MessagePayload) -> Option>, + encode_outbound_lane_data: impl Fn(&OutboundLaneData) -> Vec, + add_duplicate_key: bool, + add_unused_key: bool, + test: impl Fn(FromBridgedChainMessagesProof) -> R, + ) -> R { + let (state_root, storage_proof) = prepare_messages_storage_proof::( + TEST_LANE_ID, + 1..=nonces_end, + outbound_lane_data, + bp_runtime::UnverifiedStorageProofParams::default(), + generate_dummy_message, + encode_message, + encode_outbound_lane_data, + add_duplicate_key, + add_unused_key, + ); + + sp_io::TestExternalities::new(Default::default()).execute_with(move || { + let bridged_header = BridgedChainHeader::new( + 0, + Default::default(), + state_root, + Default::default(), + Default::default(), + ); + let bridged_header_hash = bridged_header.hash(); + + pallet_bridge_grandpa::BestFinalized::::put(HeaderId( + 0, + bridged_header_hash, + )); + pallet_bridge_grandpa::ImportedHeaders::::insert( + bridged_header_hash, + bridged_header.build(), + ); + test(FromBridgedChainMessagesProof { + bridged_header_hash, + storage_proof, + lane: TEST_LANE_ID, + nonces_start: 1, + nonces_end, + }) + }) + } + + #[test] + fn messages_proof_is_rejected_if_declared_less_than_actual_number_of_messages() { + assert_eq!( + using_messages_proof( + 10, + None, + encode_all_messages, + encode_lane_data, + false, + false, + |proof| { verify_messages_proof::(proof, 5) } + ), + Err(VerificationError::MessagesCountMismatch), + ); + } + + #[test] + fn messages_proof_is_rejected_if_declared_more_than_actual_number_of_messages() { + assert_eq!( + using_messages_proof( + 10, + None, + encode_all_messages, + encode_lane_data, + false, + false, + |proof| { verify_messages_proof::(proof, 15) } + ), + Err(VerificationError::MessagesCountMismatch), + ); + } + + #[test] + fn message_proof_is_rejected_if_header_is_missing_from_the_chain() { + assert_eq!( + using_messages_proof( + 10, + None, + encode_all_messages, + encode_lane_data, + false, + false, + |proof| { + let bridged_header_hash = + pallet_bridge_grandpa::BestFinalized::::get().unwrap().1; + pallet_bridge_grandpa::ImportedHeaders::::remove( + bridged_header_hash, + ); + verify_messages_proof::(proof, 10) + } + ), + Err(VerificationError::HeaderChain(HeaderChainError::UnknownHeader)), + ); + } + + #[test] + fn message_proof_is_rejected_if_header_state_root_mismatches() { + assert_eq!( + using_messages_proof( + 10, + None, + encode_all_messages, + encode_lane_data, + false, + false, + |proof| { + let bridged_header_hash = + pallet_bridge_grandpa::BestFinalized::::get().unwrap().1; + pallet_bridge_grandpa::ImportedHeaders::::insert( + bridged_header_hash, + BridgedChainHeader::new( + 0, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ) + .build(), + ); + verify_messages_proof::(proof, 10) + } + ), + Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( + StorageProofError::StorageRootMismatch + ))), + ); + } + + #[test] + fn message_proof_is_rejected_if_it_has_duplicate_trie_nodes() { + assert_eq!( + using_messages_proof( + 10, + None, + encode_all_messages, + encode_lane_data, + true, + false, + |proof| { verify_messages_proof::(proof, 10) }, + ), + Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( + StorageProofError::DuplicateNodes + ))), + ); + } + + #[test] + fn message_proof_is_rejected_if_it_has_unused_trie_nodes() { + assert_eq!( + using_messages_proof( + 10, + None, + encode_all_messages, + encode_lane_data, + false, + true, + |proof| { verify_messages_proof::(proof, 10) }, + ), + Err(VerificationError::StorageProof(StorageProofError::UnusedKey)), + ); + } + + #[test] + fn message_proof_is_rejected_if_required_message_is_missing() { + matches!( + using_messages_proof( + 10, + None, + |n, m| if n != 5 { Some(m.encode()) } else { None }, + encode_lane_data, + false, + false, + |proof| verify_messages_proof::(proof, 10) + ), + Err(VerificationError::MessageStorage(StorageProofError::EmptyVal)), + ); + } + + #[test] + fn message_proof_is_rejected_if_message_decode_fails() { + matches!( + using_messages_proof( + 10, + None, + |n, m| { + let mut m = m.encode(); + if n == 5 { + m = vec![42] + } + Some(m) + }, + encode_lane_data, + false, + false, + |proof| verify_messages_proof::(proof, 10), + ), + Err(VerificationError::MessageStorage(StorageProofError::DecodeError)), + ); + } + + #[test] + fn message_proof_is_rejected_if_outbound_lane_state_decode_fails() { + matches!( + using_messages_proof( + 10, + Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + encode_all_messages, + |d| { + let mut d = d.encode(); + d.truncate(1); + d + }, + false, + false, + |proof| verify_messages_proof::(proof, 10), + ), + Err(VerificationError::OutboundLaneStorage(StorageProofError::DecodeError)), + ); + } + + #[test] + fn message_proof_is_rejected_if_it_is_empty() { + assert_eq!( + using_messages_proof( + 0, + None, + encode_all_messages, + encode_lane_data, + false, + false, + |proof| { verify_messages_proof::(proof, 0) }, + ), + Err(VerificationError::EmptyMessageProof), + ); + } + + #[test] + fn non_empty_message_proof_without_messages_is_accepted() { + assert_eq!( + using_messages_proof( + 0, + Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + encode_all_messages, + encode_lane_data, + false, + false, + |proof| verify_messages_proof::(proof, 0), + ), + Ok(vec![( + TEST_LANE_ID, + ProvedLaneMessages { + lane_state: Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + messages: Vec::new(), + }, + )] + .into_iter() + .collect()), + ); + } + + #[test] + fn non_empty_message_proof_is_accepted() { + assert_eq!( + using_messages_proof( + 1, + Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + encode_all_messages, + encode_lane_data, + false, + false, + |proof| verify_messages_proof::(proof, 1), + ), + Ok(vec![( + TEST_LANE_ID, + ProvedLaneMessages { + lane_state: Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + messages: vec![Message { + key: MessageKey { lane_id: TEST_LANE_ID, nonce: 1 }, + payload: vec![42], + }], + }, + )] + .into_iter() + .collect()), + ); + } + + #[test] + fn verify_messages_proof_does_not_panic_if_messages_count_mismatches() { + assert_eq!( + using_messages_proof( + 1, + None, + encode_all_messages, + encode_lane_data, + false, + false, + |mut proof| { + proof.nonces_end = u64::MAX; + verify_messages_proof::(proof, u32::MAX) + }, + ), + Err(VerificationError::MessagesCountMismatch), + ); + } +} diff --git a/bridges/bin/runtime-common/src/messages_generation.rs b/bridges/modules/messages/src/tests/messages_generation.rs similarity index 62% rename from bridges/bin/runtime-common/src/messages_generation.rs rename to bridges/modules/messages/src/tests/messages_generation.rs index c37aaa5d4d5..6c4867fa6de 100644 --- a/bridges/bin/runtime-common/src/messages_generation.rs +++ b/bridges/modules/messages/src/tests/messages_generation.rs @@ -16,17 +16,23 @@ //! Helpers for generating message storage proofs, that are used by tests and by benchmarks. -use crate::messages::{AccountIdOf, BridgedChain, HashOf, HasherOf, MessageBridge, ThisChain}; - use bp_messages::{ - storage_keys, InboundLaneData, LaneId, MessageKey, MessageNonce, MessagePayload, - OutboundLaneData, + storage_keys, ChainWithMessages, InboundLaneData, LaneId, MessageKey, MessageNonce, + MessagePayload, OutboundLaneData, +}; +use bp_runtime::{ + grow_storage_value, record_all_trie_keys, AccountIdOf, Chain, HashOf, HasherOf, + RawStorageProof, UnverifiedStorageProofParams, }; -use bp_runtime::{record_all_trie_keys, RawStorageProof, StorageProofSize}; use codec::Encode; use sp_std::{ops::RangeInclusive, prelude::*}; use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; +/// Dummy message generation function. +pub fn generate_dummy_message(_: MessageNonce) -> MessagePayload { + vec![42] +} + /// Simple and correct message data encode function. pub fn encode_all_messages(_: MessageNonce, m: &MessagePayload) -> Option> { Some(m.encode()) @@ -40,18 +46,20 @@ pub fn encode_lane_data(d: &OutboundLaneData) -> Vec { /// Prepare storage proof of given messages. /// /// Returns state trie root and nodes with prepared messages. -pub fn prepare_messages_storage_proof( +#[allow(clippy::too_many_arguments)] +pub fn prepare_messages_storage_proof( lane: LaneId, message_nonces: RangeInclusive, outbound_lane_data: Option, - size: StorageProofSize, - message_payload: MessagePayload, + proof_params: UnverifiedStorageProofParams, + generate_message: impl Fn(MessageNonce) -> MessagePayload, encode_message: impl Fn(MessageNonce, &MessagePayload) -> Option>, encode_outbound_lane_data: impl Fn(&OutboundLaneData) -> Vec, -) -> (HashOf>, RawStorageProof) + add_duplicate_key: bool, + add_unused_key: bool, +) -> (HashOf, RawStorageProof) where - B: MessageBridge, - HashOf>: Copy + Default, + HashOf: Copy + Default, { // prepare Bridged chain storage with messages and (optionally) outbound lane state let message_count = message_nonces.end().saturating_sub(*message_nonces.start()) + 1; @@ -60,22 +68,22 @@ where let mut mdb = MemoryDB::default(); { let mut trie = - TrieDBMutBuilderV1::>>::new(&mut mdb, &mut root).build(); + TrieDBMutBuilderV1::>::new(&mut mdb, &mut root).build(); // insert messages for (i, nonce) in message_nonces.into_iter().enumerate() { let message_key = MessageKey { lane_id: lane, nonce }; - let message_payload = match encode_message(nonce, &message_payload) { + let message_payload = match encode_message(nonce, &generate_message(nonce)) { Some(message_payload) => if i == 0 { - grow_trie_leaf_value(message_payload, size) + grow_storage_value(message_payload, &proof_params) } else { message_payload }, None => continue, }; let storage_key = storage_keys::message_key( - B::BRIDGED_MESSAGES_PALLET_NAME, + ThisChain::WITH_CHAIN_MESSAGES_PALLET_NAME, &message_key.lane_id, message_key.nonce, ) @@ -89,8 +97,11 @@ where // insert outbound lane state if let Some(outbound_lane_data) = outbound_lane_data.as_ref().map(encode_outbound_lane_data) { - let storage_key = - storage_keys::outbound_lane_data_key(B::BRIDGED_MESSAGES_PALLET_NAME, &lane).0; + let storage_key = storage_keys::outbound_lane_data_key( + ThisChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &lane, + ) + .0; trie.insert(&storage_key, &outbound_lane_data) .map_err(|_| "TrieMut::insert has failed") .expect("TrieMut::insert should not fail in benchmarks"); @@ -99,52 +110,54 @@ where } // generate storage proof to be delivered to This chain - let storage_proof = record_all_trie_keys::>>, _>(&mdb, &root) - .map_err(|_| "record_all_trie_keys has failed") - .expect("record_all_trie_keys should not fail in benchmarks"); + let mut storage_proof = + record_all_trie_keys::>, _>(&mdb, &root) + .map_err(|_| "record_all_trie_keys has failed") + .expect("record_all_trie_keys should not fail in benchmarks"); + + if add_duplicate_key { + assert!(!storage_proof.is_empty()); + let node = storage_proof.pop().unwrap(); + storage_proof.push(node.clone()); + storage_proof.push(node); + } + + if add_unused_key { + storage_proof.push(b"unused_value".to_vec()); + } + (root, storage_proof) } /// Prepare storage proof of given messages delivery. /// /// Returns state trie root and nodes with prepared messages. -pub fn prepare_message_delivery_storage_proof( +pub fn prepare_message_delivery_storage_proof( lane: LaneId, - inbound_lane_data: InboundLaneData>>, - size: StorageProofSize, -) -> (HashOf>, RawStorageProof) + inbound_lane_data: InboundLaneData>, + proof_params: UnverifiedStorageProofParams, +) -> (HashOf, RawStorageProof) where - B: MessageBridge, + HashOf: Copy + Default, { // prepare Bridged chain storage with inbound lane state - let storage_key = storage_keys::inbound_lane_data_key(B::BRIDGED_MESSAGES_PALLET_NAME, &lane).0; + let storage_key = + storage_keys::inbound_lane_data_key(ThisChain::WITH_CHAIN_MESSAGES_PALLET_NAME, &lane).0; let mut root = Default::default(); let mut mdb = MemoryDB::default(); { let mut trie = - TrieDBMutBuilderV1::>>::new(&mut mdb, &mut root).build(); - let inbound_lane_data = grow_trie_leaf_value(inbound_lane_data.encode(), size); + TrieDBMutBuilderV1::>::new(&mut mdb, &mut root).build(); + let inbound_lane_data = grow_storage_value(inbound_lane_data.encode(), &proof_params); trie.insert(&storage_key, &inbound_lane_data) .map_err(|_| "TrieMut::insert has failed") .expect("TrieMut::insert should not fail in benchmarks"); } // generate storage proof to be delivered to This chain - let storage_proof = record_all_trie_keys::>>, _>(&mdb, &root) + let storage_proof = record_all_trie_keys::>, _>(&mdb, &root) .map_err(|_| "record_all_trie_keys has failed") .expect("record_all_trie_keys should not fail in benchmarks"); (root, storage_proof) } - -/// Add extra data to the trie leaf value so that it'll be of given size. -pub fn grow_trie_leaf_value(mut value: Vec, size: StorageProofSize) -> Vec { - match size { - StorageProofSize::Minimal(_) => (), - StorageProofSize::HasLargeLeaf(size) if size as usize > value.len() => { - value.extend(sp_std::iter::repeat(42u8).take(size as usize - value.len())); - }, - StorageProofSize::HasLargeLeaf(_) => (), - } - value -} diff --git a/bridges/modules/messages/src/mock.rs b/bridges/modules/messages/src/tests/mock.rs similarity index 62% rename from bridges/modules/messages/src/mock.rs rename to bridges/modules/messages/src/tests/mock.rs index 3a1e0063d53..ffdd536830b 100644 --- a/bridges/modules/messages/src/mock.rs +++ b/bridges/modules/messages/src/tests/mock.rs @@ -17,30 +17,43 @@ // From construct_runtime macro #![allow(clippy::from_over_into)] -use crate::{Config, StoredMessagePayload}; +use crate::{ + tests::messages_generation::{ + encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, + prepare_messages_storage_proof, + }, + Config, StoredMessagePayload, +}; +use bp_header_chain::{ChainWithGrandpa, StoredHeaderData}; use bp_messages::{ calc_relayers_rewards, - source_chain::{DeliveryConfirmationPayments, OnMessagesDelivered, TargetHeaderChain}, + source_chain::{ + DeliveryConfirmationPayments, FromBridgedChainMessagesDeliveryProof, OnMessagesDelivered, + }, target_chain::{ - DeliveryPayments, DispatchMessage, DispatchMessageData, MessageDispatch, - ProvedLaneMessages, ProvedMessages, SourceHeaderChain, + DeliveryPayments, DispatchMessage, DispatchMessageData, FromBridgedChainMessagesProof, + MessageDispatch, }, - DeliveredMessages, InboundLaneData, LaneId, Message, MessageKey, MessageNonce, - UnrewardedRelayer, UnrewardedRelayersState, VerificationError, + ChainWithMessages, DeliveredMessages, InboundLaneData, LaneId, Message, MessageKey, + MessageNonce, OutboundLaneData, UnrewardedRelayer, UnrewardedRelayersState, +}; +use bp_runtime::{ + messages::MessageDispatchResult, Chain, ChainId, Size, UnverifiedStorageProofParams, }; -use bp_runtime::{messages::MessageDispatchResult, Size}; use codec::{Decode, Encode}; use frame_support::{ derive_impl, parameter_types, weights::{constants::RocksDbWeight, Weight}, }; use scale_info::TypeInfo; -use sp_runtime::BuildStorage; -use std::{ - collections::{BTreeMap, VecDeque}, - ops::RangeInclusive, +use sp_core::H256; +use sp_runtime::{ + testing::Header as SubstrateHeader, + traits::{BlakeTwo256, ConstU32}, + BuildStorage, StateVersion, }; +use std::{collections::VecDeque, ops::RangeInclusive}; pub type AccountId = u64; pub type Balance = u64; @@ -62,6 +75,77 @@ pub type TestMessageFee = u64; pub type TestRelayer = u64; pub type TestDispatchLevelResult = (); +pub struct ThisChain; + +impl Chain for ThisChain { + const ID: ChainId = *b"ttch"; + + type BlockNumber = u64; + type Hash = H256; + type Hasher = BlakeTwo256; + type Header = SubstrateHeader; + type AccountId = AccountId; + type Balance = Balance; + type Nonce = u64; + type Signature = sp_runtime::MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + + fn max_extrinsic_size() -> u32 { + u32::MAX + } + + fn max_extrinsic_weight() -> Weight { + Weight::MAX + } +} + +impl ChainWithMessages for ThisChain { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = "WithThisChainBridgeMessages"; + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 16; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 128; +} + +pub struct BridgedChain; + +pub type BridgedHeaderHash = H256; +pub type BridgedChainHeader = SubstrateHeader; + +impl Chain for BridgedChain { + const ID: ChainId = *b"tbch"; + + type BlockNumber = u64; + type Hash = BridgedHeaderHash; + type Hasher = BlakeTwo256; + type Header = BridgedChainHeader; + type AccountId = TestRelayer; + type Balance = Balance; + type Nonce = u64; + type Signature = sp_runtime::MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + + fn max_extrinsic_size() -> u32 { + 4096 + } + + fn max_extrinsic_weight() -> Weight { + Weight::MAX + } +} + +impl ChainWithGrandpa for BridgedChain { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = "WithBridgedChainBridgeGrandpa"; + const MAX_AUTHORITIES_COUNT: u32 = 16; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = 4; + const MAX_MANDATORY_HEADER_SIZE: u32 = 4096; + const AVERAGE_HEADER_SIZE: u32 = 4096; +} + +impl ChainWithMessages for BridgedChain { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = "WithBridgedChainBridgeMessages"; + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 16; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 128; +} + type Block = frame_system::mocking::MockBlock; use crate as pallet_bridge_messages; @@ -71,6 +155,7 @@ frame_support::construct_runtime! { { System: frame_system::{Pallet, Call, Config, Storage, Event}, Balances: pallet_balances::{Pallet, Call, Event}, + BridgedChainGrandpa: pallet_bridge_grandpa::{Pallet, Call, Event}, Messages: pallet_bridge_messages::{Pallet, Call, Event}, } } @@ -89,10 +174,17 @@ impl pallet_balances::Config for TestRuntime { type AccountStore = System; } +impl pallet_bridge_grandpa::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = BridgedChain; + type MaxFreeHeadersPerBlock = ConstU32<4>; + type FreeHeadersInterval = ConstU32<1_024>; + type HeadersToKeep = ConstU32<8>; + type WeightInfo = pallet_bridge_grandpa::weights::BridgeWeight; +} + parameter_types! { pub const MaxMessagesToPruneAtOnce: u64 = 10; - pub const MaxUnrewardedRelayerEntriesAtInboundLane: u64 = 16; - pub const MaxUnconfirmedMessagesAtInboundLane: u64 = 128; pub const TestBridgedChainId: bp_runtime::ChainId = *b"test"; pub const ActiveOutboundLanes: &'static [LaneId] = &[TEST_LANE_ID, TEST_LANE_ID_2]; } @@ -103,24 +195,22 @@ pub type TestWeightInfo = (); impl Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type WeightInfo = TestWeightInfo; + + type ThisChain = ThisChain; + type BridgedChain = BridgedChain; + type BridgedHeaderChain = BridgedChainGrandpa; + type ActiveOutboundLanes = ActiveOutboundLanes; - type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; - type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; - type MaximalOutboundPayloadSize = frame_support::traits::ConstU32; type OutboundPayload = TestPayload; type InboundPayload = TestPayload; - type InboundRelayer = TestRelayer; type DeliveryPayments = TestDeliveryPayments; - type TargetHeaderChain = TestTargetHeaderChain; type DeliveryConfirmationPayments = TestDeliveryConfirmationPayments; type OnMessagesDelivered = TestOnMessagesDelivered; - type SourceHeaderChain = TestSourceHeaderChain; type MessageDispatch = TestMessageDispatch; - type BridgedChainId = TestBridgedChainId; } #[cfg(feature = "runtime-benchmarks")] @@ -131,29 +221,26 @@ impl crate::benchmarking::Config<()> for TestRuntime { fn prepare_message_proof( params: crate::benchmarking::MessageProofParams, - ) -> (TestMessagesProof, Weight) { - // in mock run we only care about benchmarks correctness, not the benchmark results - // => ignore size related arguments - let (messages, total_dispatch_weight) = - params.message_nonces.into_iter().map(|n| message(n, REGULAR_PAYLOAD)).fold( - (Vec::new(), Weight::zero()), - |(mut messages, total_dispatch_weight), message| { - let weight = REGULAR_PAYLOAD.declared_weight; - messages.push(message); - (messages, total_dispatch_weight.saturating_add(weight)) - }, - ); - let mut proof: TestMessagesProof = Ok(messages).into(); - proof.result.as_mut().unwrap().get_mut(0).unwrap().1.lane_state = params.outbound_lane_data; - (proof, total_dispatch_weight) + ) -> (FromBridgedChainMessagesProof, Weight) { + use bp_runtime::RangeInclusiveExt; + + let dispatch_weight = + REGULAR_PAYLOAD.declared_weight * params.message_nonces.checked_len().unwrap_or(0); + ( + *prepare_messages_proof( + params.message_nonces.into_iter().map(|n| message(n, REGULAR_PAYLOAD)).collect(), + params.outbound_lane_data, + ), + dispatch_weight, + ) } fn prepare_message_delivery_proof( params: crate::benchmarking::MessageDeliveryProofParams, - ) -> TestMessagesDeliveryProof { + ) -> FromBridgedChainMessagesDeliveryProof { // in mock run we only care about benchmarks correctness, not the benchmark results // => ignore size related arguments - TestMessagesDeliveryProof(Ok((params.lane, params.inbound_lane_data))) + prepare_messages_delivery_proof(params.lane, params.inbound_lane_data) } fn is_relayer_rewarded(_relayer: &AccountId) -> bool { @@ -167,9 +254,6 @@ impl Size for TestPayload { } } -/// Maximal outbound payload size. -pub const MAX_OUTBOUND_PAYLOAD_SIZE: u32 = 4096; - /// Account that has balance to use in tests. pub const ENDOWED_ACCOUNT: AccountId = 0xDEAD; @@ -182,9 +266,6 @@ pub const TEST_RELAYER_B: AccountId = 101; /// Account id of additional test relayer - C. pub const TEST_RELAYER_C: AccountId = 102; -/// Error that is returned by all test implementations. -pub const TEST_ERROR: &str = "Test error"; - /// Lane that we're using in tests. pub const TEST_LANE_ID: LaneId = LaneId([0, 0, 0, 1]); @@ -197,71 +278,6 @@ pub const TEST_LANE_ID_3: LaneId = LaneId([0, 0, 0, 3]); /// Regular message payload. pub const REGULAR_PAYLOAD: TestPayload = message_payload(0, 50); -/// Payload that is rejected by `TestTargetHeaderChain`. -pub const PAYLOAD_REJECTED_BY_TARGET_CHAIN: TestPayload = message_payload(1, 50); - -/// Vec of proved messages, grouped by lane. -pub type MessagesByLaneVec = Vec<(LaneId, ProvedLaneMessages)>; - -/// Test messages proof. -#[derive(Debug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] -pub struct TestMessagesProof { - pub result: Result, -} - -impl Size for TestMessagesProof { - fn size(&self) -> u32 { - 0 - } -} - -impl From, ()>> for TestMessagesProof { - fn from(result: Result, ()>) -> Self { - Self { - result: result.map(|messages| { - let mut messages_by_lane: BTreeMap> = - BTreeMap::new(); - for message in messages { - messages_by_lane.entry(message.key.lane_id).or_default().messages.push(message); - } - messages_by_lane.into_iter().collect() - }), - } - } -} - -/// Messages delivery proof used in tests. -#[derive(Debug, Encode, Decode, Eq, Clone, PartialEq, TypeInfo)] -pub struct TestMessagesDeliveryProof(pub Result<(LaneId, InboundLaneData), ()>); - -impl Size for TestMessagesDeliveryProof { - fn size(&self) -> u32 { - 0 - } -} - -/// Target header chain that is used in tests. -#[derive(Debug, Default)] -pub struct TestTargetHeaderChain; - -impl TargetHeaderChain for TestTargetHeaderChain { - type MessagesDeliveryProof = TestMessagesDeliveryProof; - - fn verify_message(payload: &TestPayload) -> Result<(), VerificationError> { - if *payload == PAYLOAD_REJECTED_BY_TARGET_CHAIN { - Err(VerificationError::Other(TEST_ERROR)) - } else { - Ok(()) - } - } - - fn verify_messages_delivery_proof( - proof: Self::MessagesDeliveryProof, - ) -> Result<(LaneId, InboundLaneData), VerificationError> { - proof.0.map_err(|_| VerificationError::Other(TEST_ERROR)) - } -} - /// Reward payments at the target chain during delivery transaction. #[derive(Debug, Default)] pub struct TestDeliveryPayments; @@ -322,24 +338,6 @@ impl DeliveryConfirmationPayments for TestDeliveryConfirmationPayment } } -/// Source header chain that is used in tests. -#[derive(Debug)] -pub struct TestSourceHeaderChain; - -impl SourceHeaderChain for TestSourceHeaderChain { - type MessagesProof = TestMessagesProof; - - fn verify_messages_proof( - proof: Self::MessagesProof, - _messages_count: u32, - ) -> Result, VerificationError> { - proof - .result - .map(|proof| proof.into_iter().collect()) - .map_err(|_| VerificationError::Other(TEST_ERROR)) - } -} - /// Test message dispatcher. #[derive(Debug)] pub struct TestMessageDispatch; @@ -458,3 +456,75 @@ pub fn new_test_ext() -> sp_io::TestExternalities { pub fn run_test(test: impl FnOnce() -> T) -> T { new_test_ext().execute_with(test) } + +/// Prepare valid storage proof for given messages and insert appropriate header to the +/// bridged header chain. +/// +/// Since this function changes the runtime storage, you can't "inline" it in the +/// `asset_noop` macro calls. +pub fn prepare_messages_proof( + messages: Vec, + outbound_lane_data: Option, +) -> Box> { + // first - let's generate storage proof + let lane = messages.first().unwrap().key.lane_id; + let nonces_start = messages.first().unwrap().key.nonce; + let nonces_end = messages.last().unwrap().key.nonce; + let (storage_root, storage_proof) = prepare_messages_storage_proof::( + TEST_LANE_ID, + nonces_start..=nonces_end, + outbound_lane_data, + UnverifiedStorageProofParams::default(), + |nonce| messages[(nonce - nonces_start) as usize].payload.clone(), + encode_all_messages, + encode_lane_data, + false, + false, + ); + + // let's now insert bridged chain header into the storage + let bridged_header_hash = Default::default(); + pallet_bridge_grandpa::ImportedHeaders::::insert( + bridged_header_hash, + StoredHeaderData { number: 0, state_root: storage_root }, + ); + + Box::new(FromBridgedChainMessagesProof:: { + bridged_header_hash, + storage_proof, + lane, + nonces_start, + nonces_end, + }) +} + +/// Prepare valid storage proof for given messages and insert appropriate header to the +/// bridged header chain. +/// +/// Since this function changes the runtime storage, you can't "inline" it in the +/// `asset_noop` macro calls. +pub fn prepare_messages_delivery_proof( + lane: LaneId, + inbound_lane_data: InboundLaneData, +) -> FromBridgedChainMessagesDeliveryProof { + // first - let's generate storage proof + let (storage_root, storage_proof) = + prepare_message_delivery_storage_proof::( + lane, + inbound_lane_data, + UnverifiedStorageProofParams::default(), + ); + + // let's now insert bridged chain header into the storage + let bridged_header_hash = Default::default(); + pallet_bridge_grandpa::ImportedHeaders::::insert( + bridged_header_hash, + StoredHeaderData { number: 0, state_root: storage_root }, + ); + + FromBridgedChainMessagesDeliveryProof:: { + bridged_header_hash, + storage_proof, + lane, + } +} diff --git a/bridges/modules/messages/src/tests/mod.rs b/bridges/modules/messages/src/tests/mod.rs new file mode 100644 index 00000000000..c3bde5fc275 --- /dev/null +++ b/bridges/modules/messages/src/tests/mod.rs @@ -0,0 +1,26 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tests and test helpers for messages pallet. + +#![cfg(any(feature = "test-helpers", test))] + +#[cfg(test)] +pub(crate) mod mock; +#[cfg(test)] +mod pallet_tests; + +pub mod messages_generation; diff --git a/bridges/modules/messages/src/tests/pallet_tests.rs b/bridges/modules/messages/src/tests/pallet_tests.rs new file mode 100644 index 00000000000..42e1042717d --- /dev/null +++ b/bridges/modules/messages/src/tests/pallet_tests.rs @@ -0,0 +1,1100 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Pallet-level tests. + +use crate::{ + outbound_lane, + outbound_lane::ReceptionConfirmationError, + tests::mock::{self, RuntimeEvent as TestEvent, *}, + weights_ext::WeightInfoExt, + Call, Config, Error, Event, InboundLanes, MaybeOutboundLanesCount, OutboundLanes, + OutboundMessages, Pallet, PalletOperatingMode, PalletOwner, RuntimeInboundLaneStorage, + StoredInboundLaneData, +}; + +use bp_messages::{ + source_chain::{FromBridgedChainMessagesDeliveryProof, MessagesBridge}, + target_chain::FromBridgedChainMessagesProof, + BridgeMessagesCall, ChainWithMessages, DeliveredMessages, InboundLaneData, + InboundMessageDetails, LaneId, MessageKey, MessageNonce, MessagesOperatingMode, + OutboundLaneData, OutboundMessageDetails, UnrewardedRelayer, UnrewardedRelayersState, + VerificationError, +}; +use bp_runtime::{BasicOperatingMode, PreComputedSize, RangeInclusiveExt, Size}; +use bp_test_utils::generate_owned_bridge_module_tests; +use codec::Encode; +use frame_support::{ + assert_noop, assert_ok, + dispatch::Pays, + storage::generator::{StorageMap, StorageValue}, + traits::Hooks, + weights::Weight, +}; +use frame_system::{EventRecord, Pallet as System, Phase}; +use sp_core::Get; +use sp_runtime::DispatchError; + +fn get_ready_for_events() { + System::::set_block_number(1); + System::::reset_events(); +} + +fn send_regular_message(lane_id: LaneId) { + get_ready_for_events(); + + let outbound_lane = outbound_lane::(lane_id); + let message_nonce = outbound_lane.data().latest_generated_nonce + 1; + let prev_enqueued_messages = outbound_lane.data().queued_messages().saturating_len(); + let valid_message = Pallet::::validate_message(lane_id, ®ULAR_PAYLOAD) + .expect("validate_message has failed"); + let artifacts = Pallet::::send_message(valid_message); + assert_eq!(artifacts.enqueued_messages, prev_enqueued_messages + 1); + + // check event with assigned nonce + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Messages(Event::MessageAccepted { lane_id, nonce: message_nonce }), + topics: vec![], + }], + ); +} + +fn receive_messages_delivery_proof() { + System::::set_block_number(1); + System::::reset_events(); + + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![UnrewardedRelayer { + relayer: 0, + messages: DeliveredMessages::new(1), + }] + .into(), + }, + ), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + )); + + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Messages(Event::MessagesDelivered { + lane_id: TEST_LANE_ID, + messages: DeliveredMessages::new(1), + }), + topics: vec![], + }], + ); +} + +#[test] +fn pallet_rejects_transactions_if_halted() { + run_test(|| { + // send message first to be able to check that delivery_proof fails later + send_regular_message(TEST_LANE_ID); + + PalletOperatingMode::::put(MessagesOperatingMode::Basic( + BasicOperatingMode::Halted, + )); + + assert_noop!( + Pallet::::validate_message(TEST_LANE_ID, ®ULAR_PAYLOAD), + Error::::NotOperatingNormally, + ); + + let messages_proof = prepare_messages_proof(vec![message(2, REGULAR_PAYLOAD)], None); + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + messages_proof, + 1, + REGULAR_PAYLOAD.declared_weight, + ), + Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted), + ); + + let delivery_proof = prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)].into(), + }, + ); + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + delivery_proof, + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + ), + Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted), + ); + }); +} + +#[test] +fn receive_messages_fails_if_dispatcher_is_inactive() { + run_test(|| { + TestMessageDispatch::deactivate(); + let proof = prepare_messages_proof(vec![message(1, REGULAR_PAYLOAD)], None); + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof, + 1, + REGULAR_PAYLOAD.declared_weight, + ), + Error::::MessageDispatchInactive, + ); + }); +} + +#[test] +fn pallet_rejects_new_messages_in_rejecting_outbound_messages_operating_mode() { + run_test(|| { + // send message first to be able to check that delivery_proof fails later + send_regular_message(TEST_LANE_ID); + + PalletOperatingMode::::put( + MessagesOperatingMode::RejectingOutboundMessages, + ); + + assert_noop!( + Pallet::::validate_message(TEST_LANE_ID, ®ULAR_PAYLOAD), + Error::::NotOperatingNormally, + ); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + prepare_messages_proof(vec![message(1, REGULAR_PAYLOAD)], None), + 1, + REGULAR_PAYLOAD.declared_weight, + ),); + + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)].into(), + }, + ), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + )); + }); +} + +#[test] +fn send_message_works() { + run_test(|| { + send_regular_message(TEST_LANE_ID); + }); +} + +#[test] +fn send_message_rejects_too_large_message() { + run_test(|| { + let mut message_payload = message_payload(1, 0); + // the payload isn't simply extra, so it'll definitely overflow + // `max_outbound_payload_size` if we add `max_outbound_payload_size` bytes to extra + let max_outbound_payload_size = BridgedChain::maximal_incoming_message_size(); + message_payload + .extra + .extend_from_slice(&vec![0u8; max_outbound_payload_size as usize]); + assert_noop!( + Pallet::::validate_message(TEST_LANE_ID, &message_payload.clone(),), + Error::::MessageRejectedByPallet(VerificationError::MessageTooLarge), + ); + + // let's check that we're able to send `max_outbound_payload_size` messages + while message_payload.encoded_size() as u32 > max_outbound_payload_size { + message_payload.extra.pop(); + } + assert_eq!(message_payload.encoded_size() as u32, max_outbound_payload_size); + + let valid_message = + Pallet::::validate_message(TEST_LANE_ID, &message_payload) + .expect("validate_message has failed"); + Pallet::::send_message(valid_message); + }) +} + +#[test] +fn receive_messages_proof_works() { + run_test(|| { + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + prepare_messages_proof(vec![message(1, REGULAR_PAYLOAD)], None), + 1, + REGULAR_PAYLOAD.declared_weight, + )); + + assert_eq!(InboundLanes::::get(TEST_LANE_ID).0.last_delivered_nonce(), 1); + + assert!(TestDeliveryPayments::is_reward_paid(1)); + }); +} + +#[test] +fn receive_messages_proof_updates_confirmed_message_nonce() { + run_test(|| { + // say we have received 10 messages && last confirmed message is 8 + InboundLanes::::insert( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 8, + relayers: vec![ + unrewarded_relayer(9, 9, TEST_RELAYER_A), + unrewarded_relayer(10, 10, TEST_RELAYER_B), + ] + .into(), + }, + ); + assert_eq!( + inbound_unrewarded_relayers_state(TEST_LANE_ID), + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, + total_messages: 2, + last_delivered_nonce: 10, + }, + ); + + // message proof includes outbound lane state with latest confirmed message updated to 9 + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + prepare_messages_proof( + vec![message(11, REGULAR_PAYLOAD)], + Some(OutboundLaneData { latest_received_nonce: 9, ..Default::default() }), + ), + 1, + REGULAR_PAYLOAD.declared_weight, + )); + + assert_eq!( + InboundLanes::::get(TEST_LANE_ID).0, + InboundLaneData { + last_confirmed_nonce: 9, + relayers: vec![ + unrewarded_relayer(10, 10, TEST_RELAYER_B), + unrewarded_relayer(11, 11, TEST_RELAYER_A) + ] + .into(), + }, + ); + assert_eq!( + inbound_unrewarded_relayers_state(TEST_LANE_ID), + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, + total_messages: 2, + last_delivered_nonce: 11, + }, + ); + }); +} + +#[test] +fn receive_messages_proof_does_not_accept_message_if_dispatch_weight_is_not_enough() { + run_test(|| { + let proof = prepare_messages_proof(vec![message(1, REGULAR_PAYLOAD)], None); + let mut declared_weight = REGULAR_PAYLOAD.declared_weight; + *declared_weight.ref_time_mut() -= 1; + + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof, + 1, + declared_weight, + ), + Error::::InsufficientDispatchWeight + ); + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 0); + }); +} + +#[test] +fn receive_messages_proof_rejects_invalid_proof() { + run_test(|| { + let mut proof = prepare_messages_proof(vec![message(1, REGULAR_PAYLOAD)], None); + proof.nonces_end += 1; + + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof, + 1, + Weight::zero(), + ), + Error::::InvalidMessagesProof, + ); + }); +} + +#[test] +fn receive_messages_proof_rejects_proof_with_too_many_messages() { + run_test(|| { + let proof = prepare_messages_proof(vec![message(1, REGULAR_PAYLOAD)], None); + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof, + u32::MAX, + Weight::zero(), + ), + Error::::TooManyMessagesInTheProof, + ); + }); +} + +#[test] +fn receive_messages_delivery_proof_works() { + run_test(|| { + send_regular_message(TEST_LANE_ID); + receive_messages_delivery_proof(); + + assert_eq!(OutboundLanes::::get(TEST_LANE_ID).latest_received_nonce, 1,); + }); +} + +#[test] +fn receive_messages_delivery_proof_rewards_relayers() { + run_test(|| { + send_regular_message(TEST_LANE_ID); + send_regular_message(TEST_LANE_ID); + + // this reports delivery of message 1 => reward is paid to TEST_RELAYER_A + let single_message_delivery_proof = prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)].into(), + ..Default::default() + }, + ); + let single_message_delivery_proof_size = single_message_delivery_proof.size(); + let result = Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + single_message_delivery_proof, + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + ); + assert_ok!(result); + assert_eq!( + result.unwrap().actual_weight.unwrap(), + TestWeightInfo::receive_messages_delivery_proof_weight( + &PreComputedSize(single_message_delivery_proof_size as _), + &UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + ..Default::default() + }, + ) + ); + assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1)); + assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1)); + + // this reports delivery of both message 1 and message 2 => reward is paid only to + // TEST_RELAYER_B + let two_messages_delivery_proof = prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B), + ] + .into(), + ..Default::default() + }, + ); + let two_messages_delivery_proof_size = two_messages_delivery_proof.size(); + let result = Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + two_messages_delivery_proof, + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, + total_messages: 2, + last_delivered_nonce: 2, + }, + ); + assert_ok!(result); + // even though the pre-dispatch weight was for two messages, the actual weight is + // for single message only + assert_eq!( + result.unwrap().actual_weight.unwrap(), + TestWeightInfo::receive_messages_delivery_proof_weight( + &PreComputedSize(two_messages_delivery_proof_size as _), + &UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + ..Default::default() + }, + ) + ); + assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1)); + assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1)); + assert_eq!(TestOnMessagesDelivered::call_arguments(), Some((TEST_LANE_ID, 0))); + }); +} + +#[test] +fn receive_messages_delivery_proof_rejects_invalid_proof() { + run_test(|| { + let mut proof = prepare_messages_delivery_proof(TEST_LANE_ID, Default::default()); + proof.lane = bp_messages::LaneId([42, 42, 42, 42]); + + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + proof, + Default::default(), + ), + Error::::InvalidMessagesDeliveryProof, + ); + }); +} + +#[test] +fn receive_messages_delivery_proof_rejects_proof_if_declared_relayers_state_is_invalid() { + run_test(|| { + // when number of relayers entries is invalid + let proof = prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B), + ] + .into(), + ..Default::default() + }, + ); + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + proof, + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 2, + last_delivered_nonce: 2, + ..Default::default() + }, + ), + Error::::InvalidUnrewardedRelayersState, + ); + + // when number of messages is invalid + let proof = prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B), + ] + .into(), + ..Default::default() + }, + ); + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + proof, + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + total_messages: 1, + last_delivered_nonce: 2, + ..Default::default() + }, + ), + Error::::InvalidUnrewardedRelayersState, + ); + + // when last delivered nonce is invalid + let proof = prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B), + ] + .into(), + ..Default::default() + }, + ); + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + proof, + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + total_messages: 2, + last_delivered_nonce: 8, + ..Default::default() + }, + ), + Error::::InvalidUnrewardedRelayersState, + ); + }); +} + +#[test] +fn receive_messages_accepts_single_message_with_invalid_payload() { + run_test(|| { + let mut invalid_message = message(1, REGULAR_PAYLOAD); + invalid_message.payload = Vec::new(); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + prepare_messages_proof(vec![invalid_message], None), + 1, + Weight::zero(), /* weight may be zero in this case (all messages are + * improperly encoded) */ + ),); + + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 1,); + }); +} + +#[test] +fn receive_messages_accepts_batch_with_message_with_invalid_payload() { + run_test(|| { + let mut invalid_message = message(2, REGULAR_PAYLOAD); + invalid_message.payload = Vec::new(); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + prepare_messages_proof( + vec![message(1, REGULAR_PAYLOAD), invalid_message, message(3, REGULAR_PAYLOAD),], + None + ), + 3, + REGULAR_PAYLOAD.declared_weight + REGULAR_PAYLOAD.declared_weight, + ),); + + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 3,); + }); +} + +#[test] +fn actual_dispatch_weight_does_not_overflow() { + run_test(|| { + let message1 = message(1, message_payload(0, u64::MAX / 2)); + let message2 = message(2, message_payload(0, u64::MAX / 2)); + let message3 = message(3, message_payload(0, u64::MAX / 2)); + + let proof = prepare_messages_proof(vec![message1, message2, message3], None); + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + // this may cause overflow if source chain storage is invalid + proof, + 3, + Weight::MAX, + ), + Error::::InsufficientDispatchWeight + ); + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 0); + }); +} + +#[test] +fn ref_time_refund_from_receive_messages_proof_works() { + run_test(|| { + fn submit_with_unspent_weight( + nonce: MessageNonce, + unspent_weight: u64, + ) -> (Weight, Weight) { + let mut payload = REGULAR_PAYLOAD; + *payload.dispatch_result.unspent_weight.ref_time_mut() = unspent_weight; + let proof = prepare_messages_proof(vec![message(nonce, payload)], None); + let messages_count = 1; + let pre_dispatch_weight = + ::WeightInfo::receive_messages_proof_weight( + &*proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ); + let result = Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ) + .expect("delivery has failed"); + let post_dispatch_weight = + result.actual_weight.expect("receive_messages_proof always returns Some"); + + // message delivery transactions are never free + assert_eq!(result.pays_fee, Pays::Yes); + + (pre_dispatch_weight, post_dispatch_weight) + } + + // when dispatch is returning `unspent_weight < declared_weight` + let (pre, post) = submit_with_unspent_weight(1, 1); + assert_eq!(post.ref_time(), pre.ref_time() - 1); + + // when dispatch is returning `unspent_weight = declared_weight` + let (pre, post) = submit_with_unspent_weight(2, REGULAR_PAYLOAD.declared_weight.ref_time()); + assert_eq!(post.ref_time(), pre.ref_time() - REGULAR_PAYLOAD.declared_weight.ref_time()); + + // when dispatch is returning `unspent_weight > declared_weight` + let (pre, post) = + submit_with_unspent_weight(3, REGULAR_PAYLOAD.declared_weight.ref_time() + 1); + assert_eq!(post.ref_time(), pre.ref_time() - REGULAR_PAYLOAD.declared_weight.ref_time()); + + // when there's no unspent weight + let (pre, post) = submit_with_unspent_weight(4, 0); + assert_eq!(post.ref_time(), pre.ref_time()); + + // when dispatch is returning `unspent_weight < declared_weight` + let (pre, post) = submit_with_unspent_weight(5, 1); + assert_eq!(post.ref_time(), pre.ref_time() - 1); + }); +} + +#[test] +fn proof_size_refund_from_receive_messages_proof_works() { + run_test(|| { + let max_entries = BridgedChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX as usize; + + // if there's maximal number of unrewarded relayer entries at the inbound lane, then + // `proof_size` is unchanged in post-dispatch weight + let proof = prepare_messages_proof(vec![message(101, REGULAR_PAYLOAD)], None); + let messages_count = 1; + let pre_dispatch_weight = + ::WeightInfo::receive_messages_proof_weight( + &*proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ); + InboundLanes::::insert( + TEST_LANE_ID, + StoredInboundLaneData(InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: 42, + messages: DeliveredMessages { begin: 0, end: 100 } + }; + max_entries + ] + .into(), + last_confirmed_nonce: 0, + }), + ); + let post_dispatch_weight = Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof.clone(), + messages_count, + REGULAR_PAYLOAD.declared_weight, + ) + .unwrap() + .actual_weight + .unwrap(); + assert_eq!(post_dispatch_weight.proof_size(), pre_dispatch_weight.proof_size()); + + // if count of unrewarded relayer entries is less than maximal, then some `proof_size` + // must be refunded + InboundLanes::::insert( + TEST_LANE_ID, + StoredInboundLaneData(InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: 42, + messages: DeliveredMessages { begin: 0, end: 100 } + }; + max_entries - 1 + ] + .into(), + last_confirmed_nonce: 0, + }), + ); + let post_dispatch_weight = Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ) + .unwrap() + .actual_weight + .unwrap(); + assert!( + post_dispatch_weight.proof_size() < pre_dispatch_weight.proof_size(), + "Expected post-dispatch PoV {} to be less than pre-dispatch PoV {}", + post_dispatch_weight.proof_size(), + pre_dispatch_weight.proof_size(), + ); + }); +} + +#[test] +fn receive_messages_delivery_proof_rejects_proof_if_trying_to_confirm_more_messages_than_expected() +{ + run_test(|| { + // send message first to be able to check that delivery_proof fails later + send_regular_message(TEST_LANE_ID); + + // 1) InboundLaneData declares that the `last_confirmed_nonce` is 1; + // 2) InboundLaneData has no entries => `InboundLaneData::last_delivered_nonce()` returns + // `last_confirmed_nonce`; + // 3) it means that we're going to confirm delivery of messages 1..=1; + // 4) so the number of declared messages (see `UnrewardedRelayersState`) is `0` and numer of + // actually confirmed messages is `1`. + let proof = prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { last_confirmed_nonce: 1, relayers: Default::default() }, + ); + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + proof, + UnrewardedRelayersState { last_delivered_nonce: 1, ..Default::default() }, + ), + Error::::ReceptionConfirmation( + ReceptionConfirmationError::TryingToConfirmMoreMessagesThanExpected + ), + ); + }); +} + +#[test] +fn storage_keys_computed_properly() { + assert_eq!( + PalletOperatingMode::::storage_value_final_key().to_vec(), + bp_messages::storage_keys::operating_mode_key("Messages").0, + ); + + assert_eq!( + OutboundMessages::::storage_map_final_key(MessageKey { + lane_id: TEST_LANE_ID, + nonce: 42 + }), + bp_messages::storage_keys::message_key("Messages", &TEST_LANE_ID, 42).0, + ); + + assert_eq!( + OutboundLanes::::storage_map_final_key(TEST_LANE_ID), + bp_messages::storage_keys::outbound_lane_data_key("Messages", &TEST_LANE_ID).0, + ); + + assert_eq!( + InboundLanes::::storage_map_final_key(TEST_LANE_ID), + bp_messages::storage_keys::inbound_lane_data_key("Messages", &TEST_LANE_ID).0, + ); +} + +#[test] +fn inbound_message_details_works() { + run_test(|| { + assert_eq!( + Pallet::::inbound_message_data( + TEST_LANE_ID, + REGULAR_PAYLOAD.encode(), + OutboundMessageDetails { nonce: 0, dispatch_weight: Weight::zero(), size: 0 }, + ), + InboundMessageDetails { dispatch_weight: REGULAR_PAYLOAD.declared_weight }, + ); + }); +} + +#[test] +fn on_idle_callback_respects_remaining_weight() { + run_test(|| { + send_regular_message(TEST_LANE_ID); + send_regular_message(TEST_LANE_ID); + send_regular_message(TEST_LANE_ID); + send_regular_message(TEST_LANE_ID); + + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 4, + relayers: vec![unrewarded_relayer(1, 4, TEST_RELAYER_A)].into(), + }, + ), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 4, + total_messages: 4, + last_delivered_nonce: 4, + }, + )); + + // all 4 messages may be pruned now + assert_eq!(outbound_lane::(TEST_LANE_ID).data().latest_received_nonce, 4); + assert_eq!(outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, 1); + System::::set_block_number(2); + + // if passed wight is too low to do anything + let dbw = DbWeight::get(); + assert_eq!(Pallet::::on_idle(0, dbw.reads_writes(1, 1)), Weight::zero(),); + assert_eq!(outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, 1); + + // if passed wight is enough to prune single message + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(1, 2)), + dbw.reads_writes(1, 2), + ); + assert_eq!(outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, 2); + + // if passed wight is enough to prune two more messages + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(1, 3)), + dbw.reads_writes(1, 3), + ); + assert_eq!(outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, 4); + + // if passed wight is enough to prune many messages + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(100, 100)), + dbw.reads_writes(1, 2), + ); + assert_eq!(outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, 5); + }); +} + +#[test] +fn on_idle_callback_is_rotating_lanes_to_prune() { + run_test(|| { + // send + receive confirmation for lane 1 + send_regular_message(TEST_LANE_ID); + receive_messages_delivery_proof(); + // send + receive confirmation for lane 2 + send_regular_message(TEST_LANE_ID_2); + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + prepare_messages_delivery_proof( + TEST_LANE_ID_2, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)].into(), + }, + ), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + )); + + // nothing is pruned yet + assert_eq!(outbound_lane::(TEST_LANE_ID).data().latest_received_nonce, 1); + assert_eq!(outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, 1); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().latest_received_nonce, + 1 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, + 1 + ); + + // in block#2.on_idle lane messages of lane 1 are pruned + let dbw = DbWeight::get(); + System::::set_block_number(2); + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(100, 100)), + dbw.reads_writes(1, 2), + ); + assert_eq!(outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, 2); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, + 1 + ); + + // in block#3.on_idle lane messages of lane 2 are pruned + System::::set_block_number(3); + + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(100, 100)), + dbw.reads_writes(1, 2), + ); + assert_eq!(outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, 2); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, + 2 + ); + }); +} + +#[test] +fn outbound_message_from_unconfigured_lane_is_rejected() { + run_test(|| { + assert_noop!( + Pallet::::validate_message(TEST_LANE_ID_3, ®ULAR_PAYLOAD,), + Error::::InactiveOutboundLane, + ); + }); +} + +#[test] +fn test_bridge_messages_call_is_correctly_defined() { + run_test(|| { + let account_id = 1; + let message_proof = prepare_messages_proof(vec![message(1, REGULAR_PAYLOAD)], None); + let message_delivery_proof = prepare_messages_delivery_proof( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![UnrewardedRelayer { + relayer: 0, + messages: DeliveredMessages::new(1), + }] + .into(), + }, + ); + let unrewarded_relayer_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + last_delivered_nonce: 1, + ..Default::default() + }; + + let direct_receive_messages_proof_call = Call::::receive_messages_proof { + relayer_id_at_bridged_chain: account_id, + proof: message_proof.clone(), + messages_count: 1, + dispatch_weight: REGULAR_PAYLOAD.declared_weight, + }; + let indirect_receive_messages_proof_call = BridgeMessagesCall::< + AccountId, + FromBridgedChainMessagesProof, + FromBridgedChainMessagesDeliveryProof, + >::receive_messages_proof { + relayer_id_at_bridged_chain: account_id, + proof: *message_proof, + messages_count: 1, + dispatch_weight: REGULAR_PAYLOAD.declared_weight, + }; + assert_eq!( + direct_receive_messages_proof_call.encode(), + indirect_receive_messages_proof_call.encode() + ); + + let direct_receive_messages_delivery_proof_call = + Call::::receive_messages_delivery_proof { + proof: message_delivery_proof.clone(), + relayers_state: unrewarded_relayer_state.clone(), + }; + let indirect_receive_messages_delivery_proof_call = BridgeMessagesCall::< + AccountId, + FromBridgedChainMessagesProof, + FromBridgedChainMessagesDeliveryProof, + >::receive_messages_delivery_proof { + proof: message_delivery_proof, + relayers_state: unrewarded_relayer_state, + }; + assert_eq!( + direct_receive_messages_delivery_proof_call.encode(), + indirect_receive_messages_delivery_proof_call.encode() + ); + }); +} + +generate_owned_bridge_module_tests!( + MessagesOperatingMode::Basic(BasicOperatingMode::Normal), + MessagesOperatingMode::Basic(BasicOperatingMode::Halted) +); + +#[test] +fn inbound_storage_extra_proof_size_bytes_works() { + fn relayer_entry() -> UnrewardedRelayer { + UnrewardedRelayer { relayer: 42u64, messages: DeliveredMessages { begin: 0, end: 100 } } + } + + fn storage(relayer_entries: usize) -> RuntimeInboundLaneStorage { + RuntimeInboundLaneStorage { + lane_id: Default::default(), + cached_data: Some(InboundLaneData { + relayers: vec![relayer_entry(); relayer_entries].into(), + last_confirmed_nonce: 0, + }), + _phantom: Default::default(), + } + } + + let max_entries = BridgedChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX as usize; + + // when we have exactly `MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX` unrewarded relayers + assert_eq!(storage(max_entries).extra_proof_size_bytes(), 0); + + // when we have less than `MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX` unrewarded relayers + assert_eq!( + storage(max_entries - 1).extra_proof_size_bytes(), + relayer_entry().encode().len() as u64 + ); + assert_eq!( + storage(max_entries - 2).extra_proof_size_bytes(), + 2 * relayer_entry().encode().len() as u64 + ); + + // when we have more than `MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX` unrewarded relayers + // (shall not happen in practice) + assert_eq!(storage(max_entries + 1).extra_proof_size_bytes(), 0); +} + +#[test] +fn maybe_outbound_lanes_count_returns_correct_value() { + assert_eq!( + MaybeOutboundLanesCount::::get(), + Some(mock::ActiveOutboundLanes::get().len() as u32) + ); +} diff --git a/bridges/modules/messages/src/weights.rs b/bridges/modules/messages/src/weights.rs index 5bf7d567560..72a06599b16 100644 --- a/bridges/modules/messages/src/weights.rs +++ b/bridges/modules/messages/src/weights.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for pallet_bridge_messages //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! HOSTNAME: `serban-ROG-Zephyrus`, CPU: `12th Gen Intel(R) Core(TM) i7-12700H` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: @@ -51,14 +51,13 @@ use sp_std::marker::PhantomData; /// Weight functions needed for pallet_bridge_messages. pub trait WeightInfo { fn receive_single_message_proof() -> Weight; - fn receive_two_messages_proof() -> Weight; + fn receive_n_messages_proof(n: u32) -> Weight; fn receive_single_message_proof_with_outbound_lane_state() -> Weight; - fn receive_single_message_proof_1_kb() -> Weight; - fn receive_single_message_proof_16_kb() -> Weight; + fn receive_single_n_bytes_message_proof(n: u32) -> Weight; fn receive_delivery_proof_for_single_message() -> Weight; fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight; fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight; - fn receive_single_message_proof_with_dispatch(i: u32) -> Weight; + fn receive_single_n_bytes_message_proof_with_dispatch(n: u32) -> Weight; } /// Weights for `pallet_bridge_messages` that are generated using one of the Bridge testnets. @@ -82,56 +81,39 @@ impl WeightInfo for BridgeWeight { /// 51655, mode: MaxEncodedLen) fn receive_single_message_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 52_321 nanoseconds. - Weight::from_parts(54_478_000, 57170) + // Measured: `653` + // Estimated: `52673` + // Minimum execution time: 38_724 nanoseconds. + Weight::from_parts(40_650_000, 52673) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) /// - /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), /// added: 497, mode: MaxEncodedLen) /// - /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) /// - /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), /// added: 2048, mode: MaxEncodedLen) /// - /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_two_messages_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 64_597 nanoseconds. - Weight::from_parts(69_267_000, 57170) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) /// - /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49208), added: + /// 51683, mode: MaxEncodedLen) /// - /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// The range of component `n` is `[1, 1004]`. /// - /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + /// The range of component `n` is `[1, 1004]`. + fn receive_n_messages_proof(n: u32) -> Weight { // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 64_079 nanoseconds. - Weight::from_parts(65_905_000, 57170) + // Measured: `653` + // Estimated: `52673` + // Minimum execution time: 39_354 nanoseconds. + Weight::from_parts(29_708_543, 52673) + // Standard Error: 1_185 + .saturating_add(Weight::from_parts(7_648_787, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -149,12 +131,12 @@ impl WeightInfo for BridgeWeight { /// /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_1_kb() -> Weight { + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 50_588 nanoseconds. - Weight::from_parts(53_544_000, 57170) + // Measured: `653` + // Estimated: `52673` + // Minimum execution time: 45_578 nanoseconds. + Weight::from_parts(47_161_000, 52673) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -172,12 +154,16 @@ impl WeightInfo for BridgeWeight { /// /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_16_kb() -> Weight { + /// + /// The range of component `n` is `[1, 16384]`. + fn receive_single_n_bytes_message_proof(n: u32) -> Weight { // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 78_269 nanoseconds. - Weight::from_parts(81_748_000, 57170) + // Measured: `653` + // Estimated: `52673` + // Minimum execution time: 38_702 nanoseconds. + Weight::from_parts(41_040_143, 52673) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_174, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -198,16 +184,21 @@ impl WeightInfo for BridgeWeight { /// /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(93), added: 2568, /// mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundMessages (r:0 w:1) + /// + /// Proof: BridgeRialtoMessages OutboundMessages (max_values: None, max_size: Some(65596), + /// added: 68071, mode: MaxEncodedLen) fn receive_delivery_proof_for_single_message() -> Weight { // Proof Size summary in bytes: - // Measured: `579` - // Estimated: `9584` - // Minimum execution time: 45_786 nanoseconds. - Weight::from_parts(47_382_000, 9584) + // Measured: `701` + // Estimated: `3558` + // Minimum execution time: 37_197 nanoseconds. + Weight::from_parts(38_371_000, 3558) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) /// @@ -226,16 +217,21 @@ impl WeightInfo for BridgeWeight { /// /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(93), added: 2568, /// mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundMessages (r:0 w:2) + /// + /// Proof: BridgeRialtoMessages OutboundMessages (max_values: None, max_size: Some(65596), + /// added: 68071, mode: MaxEncodedLen) fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { // Proof Size summary in bytes: - // Measured: `596` - // Estimated: `9584` - // Minimum execution time: 44_544 nanoseconds. - Weight::from_parts(45_451_000, 9584) + // Measured: `701` + // Estimated: `3558` + // Minimum execution time: 38_684 nanoseconds. + Weight::from_parts(39_929_000, 3558) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) /// @@ -254,16 +250,21 @@ impl WeightInfo for BridgeWeight { /// /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(93), added: 2568, /// mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundMessages (r:0 w:2) + /// + /// Proof: BridgeRialtoMessages OutboundMessages (max_values: None, max_size: Some(65596), + /// added: 68071, mode: MaxEncodedLen) fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { // Proof Size summary in bytes: - // Measured: `596` - // Estimated: `12124` - // Minimum execution time: 47_344 nanoseconds. - Weight::from_parts(48_311_000, 12124) + // Measured: `701` + // Estimated: `6126` + // Minimum execution time: 41_363 nanoseconds. + Weight::from_parts(42_621_000, 6126) .saturating_add(T::DbWeight::get().reads(5_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) /// @@ -280,15 +281,15 @@ impl WeightInfo for BridgeWeight { /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: /// 51655, mode: MaxEncodedLen) /// - /// The range of component `i` is `[128, 2048]`. - fn receive_single_message_proof_with_dispatch(i: u32) -> Weight { + /// The range of component `n` is `[1, 16384]`. + fn receive_single_n_bytes_message_proof_with_dispatch(n: u32) -> Weight { // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 52_385 nanoseconds. - Weight::from_parts(54_919_468, 57170) - // Standard Error: 108 - .saturating_add(Weight::from_parts(3_286, 0).saturating_mul(i.into())) + // Measured: `653` + // Estimated: `52673` + // Minimum execution time: 38_925 nanoseconds. + Weight::from_parts(39_617_000, 52673) + // Standard Error: 612 + .saturating_add(Weight::from_parts(372_813, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -312,33 +313,39 @@ impl WeightInfo for () { /// 51655, mode: MaxEncodedLen) fn receive_single_message_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 52_321 nanoseconds. - Weight::from_parts(54_478_000, 57170) + // Measured: `653` + // Estimated: `52673` + // Minimum execution time: 38_724 nanoseconds. + Weight::from_parts(40_650_000, 52673) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) /// - /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), /// added: 497, mode: MaxEncodedLen) /// - /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) /// - /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), /// added: 2048, mode: MaxEncodedLen) /// - /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) /// - /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_two_messages_proof() -> Weight { + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49208), added: + /// 51683, mode: MaxEncodedLen) + /// + /// The range of component `n` is `[1, 1004]`. + /// + /// The range of component `n` is `[1, 1004]`. + fn receive_n_messages_proof(n: u32) -> Weight { // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 64_597 nanoseconds. - Weight::from_parts(69_267_000, 57170) + // Measured: `653` + // Estimated: `52673` + // Minimum execution time: 39_354 nanoseconds. + Weight::from_parts(29_708_543, 52673) + // Standard Error: 1_185 + .saturating_add(Weight::from_parts(7_648_787, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -358,10 +365,10 @@ impl WeightInfo for () { /// 51655, mode: MaxEncodedLen) fn receive_single_message_proof_with_outbound_lane_state() -> Weight { // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 64_079 nanoseconds. - Weight::from_parts(65_905_000, 57170) + // Measured: `653` + // Estimated: `52673` + // Minimum execution time: 45_578 nanoseconds. + Weight::from_parts(47_161_000, 52673) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -377,37 +384,20 @@ impl WeightInfo for () { /// /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) /// - /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_1_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 50_588 nanoseconds. - Weight::from_parts(53_544_000, 57170) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49208), added: + /// 51683, mode: MaxEncodedLen) /// - /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) + /// The range of component `n` is `[1, 16384]`. /// - /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_16_kb() -> Weight { + /// The range of component `n` is `[1, 16384]`. + fn receive_single_n_bytes_message_proof(n: u32) -> Weight { // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 78_269 nanoseconds. - Weight::from_parts(81_748_000, 57170) + // Measured: `653` + // Estimated: `52673` + // Minimum execution time: 38_702 nanoseconds. + Weight::from_parts(41_040_143, 52673) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_174, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -428,16 +418,21 @@ impl WeightInfo for () { /// /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(93), added: 2568, /// mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundMessages (r:0 w:1) + /// + /// Proof: BridgeRialtoMessages OutboundMessages (max_values: None, max_size: Some(65596), + /// added: 68071, mode: MaxEncodedLen) fn receive_delivery_proof_for_single_message() -> Weight { // Proof Size summary in bytes: - // Measured: `579` - // Estimated: `9584` - // Minimum execution time: 45_786 nanoseconds. - Weight::from_parts(47_382_000, 9584) + // Measured: `701` + // Estimated: `3558` + // Minimum execution time: 37_197 nanoseconds. + Weight::from_parts(38_371_000, 3558) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) /// @@ -456,16 +451,21 @@ impl WeightInfo for () { /// /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(93), added: 2568, /// mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundMessages (r:0 w:2) + /// + /// Proof: BridgeRialtoMessages OutboundMessages (max_values: None, max_size: Some(65596), + /// added: 68071, mode: MaxEncodedLen) fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { // Proof Size summary in bytes: - // Measured: `596` - // Estimated: `9584` - // Minimum execution time: 44_544 nanoseconds. - Weight::from_parts(45_451_000, 9584) + // Measured: `701` + // Estimated: `3558` + // Minimum execution time: 38_684 nanoseconds. + Weight::from_parts(39_929_000, 3558) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) /// @@ -484,16 +484,21 @@ impl WeightInfo for () { /// /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(93), added: 2568, /// mode: MaxEncodedLen) + /// + /// Storage: BridgeRialtoMessages OutboundMessages (r:0 w:2) + /// + /// Proof: BridgeRialtoMessages OutboundMessages (max_values: None, max_size: Some(65596), + /// added: 68071, mode: MaxEncodedLen) fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { // Proof Size summary in bytes: - // Measured: `596` - // Estimated: `12124` - // Minimum execution time: 47_344 nanoseconds. - Weight::from_parts(48_311_000, 12124) + // Measured: `701` + // Estimated: `6126` + // Minimum execution time: 41_363 nanoseconds. + Weight::from_parts(42_621_000, 6126) .saturating_add(RocksDbWeight::get().reads(5_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) /// @@ -510,15 +515,15 @@ impl WeightInfo for () { /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: /// 51655, mode: MaxEncodedLen) /// - /// The range of component `i` is `[128, 2048]`. - fn receive_single_message_proof_with_dispatch(i: u32) -> Weight { + /// The range of component `n` is `[1, 16384]`. + fn receive_single_n_bytes_message_proof_with_dispatch(n: u32) -> Weight { // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 52_385 nanoseconds. - Weight::from_parts(54_919_468, 57170) - // Standard Error: 108 - .saturating_add(Weight::from_parts(3_286, 0).saturating_mul(i.into())) + // Measured: `653` + // Estimated: `52673` + // Minimum execution time: 38_925 nanoseconds. + Weight::from_parts(39_617_000, 52673) + // Standard Error: 612 + .saturating_add(Weight::from_parts(372_813, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/bridges/modules/messages/src/weights_ext.rs b/bridges/modules/messages/src/weights_ext.rs index c12e04f692b..7711e212efb 100644 --- a/bridges/modules/messages/src/weights_ext.rs +++ b/bridges/modules/messages/src/weights_ext.rs @@ -40,13 +40,6 @@ pub fn ensure_weights_are_correct() { // benchmarked using `MaxEncodedLen` approach and there are no components that cause additional // db reads - // verify `receive_messages_proof` weight components - assert_ne!(W::receive_messages_proof_overhead().ref_time(), 0); - assert_ne!(W::receive_messages_proof_overhead().proof_size(), 0); - // W::receive_messages_proof_messages_overhead(1).ref_time() may be zero because: - // the message processing code (`InboundLane::receive_message`) is minimal and may not be - // accounted by our benchmarks - assert_eq!(W::receive_messages_proof_messages_overhead(1).proof_size(), 0); // W::receive_messages_proof_outbound_lane_state_overhead().ref_time() may be zero because: // the outbound lane state processing code (`InboundLane::receive_state_update`) is minimal and // may not be accounted by our benchmarks @@ -86,6 +79,19 @@ pub fn ensure_weights_are_correct() { total_messages_in_delivery_proof_does_not_affect_proof_size::(); } +/// Ensure that we are able to dispatch maximal size messages. +pub fn ensure_maximal_message_dispatch( + max_incoming_message_size: u32, + max_incoming_message_dispatch_weight: Weight, +) { + let message_dispatch_weight = W::message_dispatch_weight(max_incoming_message_size); + assert!( + message_dispatch_weight.all_lte(max_incoming_message_dispatch_weight), + "Dispatch weight of maximal message {message_dispatch_weight:?} must be lower \ + than the hardcoded {max_incoming_message_dispatch_weight:?}", + ); +} + /// Ensure that we're able to receive maximal (by-size and by-weight) message from other chain. pub fn ensure_able_to_receive_message( max_extrinsic_size: u32, @@ -98,7 +104,8 @@ pub fn ensure_able_to_receive_message( max_incoming_message_proof_size.saturating_add(SIGNED_EXTENSIONS_SIZE); assert!( max_delivery_transaction_size <= max_extrinsic_size, - "Size of maximal message delivery transaction {max_incoming_message_proof_size} + {SIGNED_EXTENSIONS_SIZE} is larger than maximal possible transaction size {max_extrinsic_size}", + "Size of maximal message delivery transaction {max_incoming_message_proof_size} + \ + {SIGNED_EXTENSIONS_SIZE} is larger than maximal possible transaction size {max_extrinsic_size}", ); // verify that we're able to receive proof of maximal-size message with maximal dispatch weight @@ -297,13 +304,11 @@ pub trait WeightInfoExt: WeightInfo { dispatch_weight: Weight, ) -> Weight { // basic components of extrinsic weight - let transaction_overhead = Self::receive_messages_proof_overhead(); + let base_weight = Self::receive_n_messages_proof(messages_count); let transaction_overhead_from_runtime = Self::receive_messages_proof_overhead_from_runtime(); let outbound_state_delivery_weight = Self::receive_messages_proof_outbound_lane_state_overhead(); - let messages_delivery_weight = - Self::receive_messages_proof_messages_overhead(MessageNonce::from(messages_count)); let messages_dispatch_weight = dispatch_weight; // proof size overhead weight @@ -315,10 +320,9 @@ pub trait WeightInfoExt: WeightInfo { actual_proof_size.saturating_sub(expected_proof_size), ); - transaction_overhead + base_weight .saturating_add(transaction_overhead_from_runtime) .saturating_add(outbound_state_delivery_weight) - .saturating_add(messages_delivery_weight) .saturating_add(messages_dispatch_weight) .saturating_add(proof_size_overhead) } @@ -354,25 +358,6 @@ pub trait WeightInfoExt: WeightInfo { // Functions that are used by extrinsics weights formulas. - /// Returns weight overhead of message delivery transaction (`receive_messages_proof`). - fn receive_messages_proof_overhead() -> Weight { - let weight_of_two_messages_and_two_tx_overheads = - Self::receive_single_message_proof().saturating_mul(2); - let weight_of_two_messages_and_single_tx_overhead = Self::receive_two_messages_proof(); - weight_of_two_messages_and_two_tx_overheads - .saturating_sub(weight_of_two_messages_and_single_tx_overhead) - } - - /// Returns weight that needs to be accounted when receiving given a number of messages with - /// message delivery transaction (`receive_messages_proof`). - fn receive_messages_proof_messages_overhead(messages: MessageNonce) -> Weight { - let weight_of_two_messages_and_single_tx_overhead = Self::receive_two_messages_proof(); - let weight_of_single_message_and_single_tx_overhead = Self::receive_single_message_proof(); - weight_of_two_messages_and_single_tx_overhead - .saturating_sub(weight_of_single_message_and_single_tx_overhead) - .saturating_mul(messages as _) - } - /// Returns weight that needs to be accounted when message delivery transaction /// (`receive_messages_proof`) is carrying outbound lane state proof. fn receive_messages_proof_outbound_lane_state_overhead() -> Weight { @@ -426,9 +411,8 @@ pub trait WeightInfoExt: WeightInfo { /// is less than that cost). fn storage_proof_size_overhead(proof_size: u32) -> Weight { let proof_size_in_bytes = proof_size; - let byte_weight = (Self::receive_single_message_proof_16_kb() - - Self::receive_single_message_proof_1_kb()) / - (15 * 1024); + let byte_weight = Self::receive_single_n_bytes_message_proof(2) - + Self::receive_single_n_bytes_message_proof(1); proof_size_in_bytes * byte_weight } @@ -440,11 +424,9 @@ pub trait WeightInfoExt: WeightInfo { /// `receive_single_message_proof_with_dispatch` benchmark. See its requirements for /// details. fn message_dispatch_weight(message_size: u32) -> Weight { - // There may be a tiny overweight/underweight here, because we don't account how message - // size affects all steps before dispatch. But the effect should be small enough and we - // may ignore it. - Self::receive_single_message_proof_with_dispatch(message_size) - .saturating_sub(Self::receive_single_message_proof()) + let message_size_in_bytes = message_size; + Self::receive_single_n_bytes_message_proof_with_dispatch(message_size_in_bytes) + .saturating_sub(Self::receive_single_n_bytes_message_proof(message_size_in_bytes)) } } @@ -479,7 +461,7 @@ impl WeightInfoExt for crate::weights::BridgeWeight #[cfg(test)] mod tests { use super::*; - use crate::{mock::TestRuntime, weights::BridgeWeight}; + use crate::{tests::mock::TestRuntime, weights::BridgeWeight}; #[test] fn ensure_default_weights_are_correct() { diff --git a/bridges/modules/parachains/Cargo.toml b/bridges/modules/parachains/Cargo.toml index 97bad724a78..cda0ee8106d 100644 --- a/bridges/modules/parachains/Cargo.toml +++ b/bridges/modules/parachains/Cargo.toml @@ -30,7 +30,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } sp-std = { workspace = true } -sp-trie = { workspace = true } [dev-dependencies] bp-header-chain = { workspace = true, default-features = true } @@ -54,7 +53,6 @@ std = [ "scale-info/std", "sp-runtime/std", "sp-std/std", - "sp-trie/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/bridges/modules/parachains/src/benchmarking.rs b/bridges/modules/parachains/src/benchmarking.rs index 27e06a12a1d..92ece6d688c 100644 --- a/bridges/modules/parachains/src/benchmarking.rs +++ b/bridges/modules/parachains/src/benchmarking.rs @@ -22,7 +22,7 @@ use crate::{ }; use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; -use bp_runtime::StorageProofSize; +use bp_runtime::UnverifiedStorageProofParams; use frame_benchmarking::{account, benchmarks_instance_pallet}; use frame_system::RawOrigin; use sp_std::prelude::*; @@ -38,7 +38,7 @@ pub trait Config: crate::Config { fn prepare_parachain_heads_proof( parachains: &[ParaId], parachain_head_size: u32, - proof_size: StorageProofSize, + proof_params: UnverifiedStorageProofParams, ) -> (RelayBlockNumber, RelayBlockHash, ParaHeadsProof, Vec<(ParaId, ParaHash)>); } @@ -68,7 +68,7 @@ benchmarks_instance_pallet! { let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( ¶chains, DEFAULT_PARACHAIN_HEAD_SIZE, - StorageProofSize::Minimal(0), + UnverifiedStorageProofParams::default(), ); let at_relay_block = (relay_block_number, relay_block_hash); }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) @@ -85,7 +85,7 @@ benchmarks_instance_pallet! { let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( ¶chains, DEFAULT_PARACHAIN_HEAD_SIZE, - StorageProofSize::HasLargeLeaf(1024), + UnverifiedStorageProofParams::from_db_size(1024), ); let at_relay_block = (relay_block_number, relay_block_hash); }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) @@ -102,7 +102,7 @@ benchmarks_instance_pallet! { let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( ¶chains, DEFAULT_PARACHAIN_HEAD_SIZE, - StorageProofSize::HasLargeLeaf(16 * 1024), + UnverifiedStorageProofParams::from_db_size(16 * 1024), ); let at_relay_block = (relay_block_number, relay_block_hash); }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) diff --git a/bridges/modules/parachains/src/call_ext.rs b/bridges/modules/parachains/src/call_ext.rs index fe6b319205d..0f77eaf2c5a 100644 --- a/bridges/modules/parachains/src/call_ext.rs +++ b/bridges/modules/parachains/src/call_ext.rs @@ -289,7 +289,7 @@ mod tests { RuntimeCall::Parachains(crate::Call::::submit_parachain_heads_ex { at_relay_block: (num, [num as u8; 32].into()), parachains, - parachain_heads_proof: ParaHeadsProof { storage_proof: Vec::new() }, + parachain_heads_proof: ParaHeadsProof { storage_proof: Default::default() }, is_free_execution_expected: false, }) .check_obsolete_submit_parachain_heads() @@ -303,7 +303,7 @@ mod tests { RuntimeCall::Parachains(crate::Call::::submit_parachain_heads_ex { at_relay_block: (num, [num as u8; 32].into()), parachains, - parachain_heads_proof: ParaHeadsProof { storage_proof: Vec::new() }, + parachain_heads_proof: ParaHeadsProof { storage_proof: Default::default() }, is_free_execution_expected: true, }) .check_obsolete_submit_parachain_heads() diff --git a/bridges/modules/parachains/src/lib.rs b/bridges/modules/parachains/src/lib.rs index d323aef3b22..e2c30ce9aec 100644 --- a/bridges/modules/parachains/src/lib.rs +++ b/bridges/modules/parachains/src/lib.rs @@ -28,11 +28,12 @@ pub use weights::WeightInfo; pub use weights_ext::WeightInfoExt; use bp_header_chain::{HeaderChain, HeaderChainError}; -use bp_parachains::{parachain_head_storage_key_at_source, ParaInfo, ParaStoredHeaderData}; -use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; -use bp_runtime::{Chain, HashOf, HeaderId, HeaderIdOf, Parachain, StorageProofError}; +use bp_parachains::{ParaInfo, ParaStoredHeaderData}; +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use bp_runtime::{Chain, HashOf, HeaderId, HeaderIdOf, Parachain}; use frame_support::{dispatch::PostDispatchInfo, DefaultNoBound}; use pallet_bridge_grandpa::SubmitFinalityProofHelper; +use proofs::{ParachainsStorageProofAdapter, StorageProofAdapter}; use sp_std::{marker::PhantomData, vec::Vec}; #[cfg(feature = "runtime-benchmarks")] @@ -55,6 +56,7 @@ pub mod benchmarking; mod call_ext; #[cfg(test)] mod mock; +mod proofs; /// The target that will be used when publishing logs related to this pallet. pub const LOG_TARGET: &str = "runtime::bridge-parachains"; @@ -448,15 +450,15 @@ pub mod pallet { parachains.len() as _, ); - let mut is_updated_something = false; - let mut storage = GrandpaPalletOf::::storage_proof_checker( - relay_block_hash, - parachain_heads_proof.storage_proof, - ) - .map_err(Error::::HeaderChainStorageProof)?; + let mut storage: ParachainsStorageProofAdapter = + ParachainsStorageProofAdapter::try_new_with_verified_storage_proof( + relay_block_hash, + parachain_heads_proof.storage_proof, + ) + .map_err(Error::::HeaderChainStorageProof)?; for (parachain, parachain_head_hash) in parachains { - let parachain_head = match Self::read_parachain_head(&mut storage, parachain) { + let parachain_head = match storage.read_parachain_head(parachain) { Ok(Some(parachain_head)) => parachain_head, Ok(None) => { log::trace!( @@ -541,7 +543,6 @@ pub mod pallet { parachain_head_hash, )?; - is_updated_something = true; if is_free { free_parachain_heads = free_parachain_heads + 1; } @@ -572,7 +573,7 @@ pub mod pallet { // => treat this as an error // // (we can throw error here, because now all our calls are transactional) - storage.ensure_no_unused_nodes().map_err(|e| { + storage.ensure_no_unused_keys().map_err(|e| { Error::::HeaderChainStorageProof(HeaderChainError::StorageProof(e)) })?; @@ -633,16 +634,6 @@ pub mod pallet { ImportedParaHeads::::get(parachain, hash).map(|h| h.into_inner()) } - /// Read parachain head from storage proof. - fn read_parachain_head( - storage: &mut bp_runtime::StorageProofChecker, - parachain: ParaId, - ) -> Result, StorageProofError> { - let parachain_head_key = - parachain_head_storage_key_at_source(T::ParasPalletName::get(), parachain); - storage.read_and_decode_value(parachain_head_key.0.as_ref()) - } - /// Try to update parachain head. pub(super) fn update_parachain_head( parachain: ParaId, @@ -801,6 +792,7 @@ impl, I: 'static, C: Parachain> HeaderChain pub fn initialize_for_benchmarks, I: 'static, PC: Parachain>( header: HeaderOf, ) { + use bp_polkadot_core::parachains::ParaHead; use bp_runtime::HeaderIdProvider; use sp_runtime::traits::Header; @@ -844,9 +836,10 @@ pub(crate) mod tests { use bp_parachains::{ BestParaHeadHash, BridgeParachainCall, ImportedParaHeadsKeyProvider, ParasInfoKeyProvider, }; + use bp_polkadot_core::parachains::ParaHead; use bp_runtime::{ BasicOperatingMode, OwnedBridgeModuleError, StorageDoubleMapKeyProvider, - StorageMapKeyProvider, + StorageMapKeyProvider, StorageProofError, }; use bp_test_utils::{ authority_list, generate_owned_bridge_module_tests, make_default_justification, diff --git a/bridges/modules/parachains/src/mock.rs b/bridges/modules/parachains/src/mock.rs index dbb62845392..c49b5939093 100644 --- a/bridges/modules/parachains/src/mock.rs +++ b/bridges/modules/parachains/src/mock.rs @@ -23,7 +23,7 @@ use frame_support::{ use sp_runtime::{ testing::H256, traits::{BlakeTwo256, Header as HeaderT}, - MultiSignature, + MultiSignature, StateVersion, }; use crate as pallet_bridge_parachains; @@ -60,6 +60,8 @@ impl Chain for Parachain1 { type Nonce = u64; type Signature = MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { 0 } @@ -87,6 +89,8 @@ impl Chain for Parachain2 { type Nonce = u64; type Signature = MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { 0 } @@ -114,6 +118,8 @@ impl Chain for Parachain3 { type Nonce = u64; type Signature = MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { 0 } @@ -142,6 +148,8 @@ impl Chain for BigParachain { type Nonce = u64; type Signature = MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { 0 } @@ -222,7 +230,7 @@ impl pallet_bridge_parachains::benchmarking::Config<()> for TestRuntime { fn prepare_parachain_heads_proof( parachains: &[ParaId], _parachain_head_size: u32, - _proof_size: bp_runtime::StorageProofSize, + _proof_params: bp_runtime::UnverifiedStorageProofParams, ) -> ( crate::RelayBlockNumber, crate::RelayBlockHash, @@ -256,38 +264,7 @@ impl Chain for TestBridgedChain { type Nonce = u32; type Signature = sp_runtime::testing::TestSignature; - fn max_extrinsic_size() -> u32 { - unreachable!() - } - - fn max_extrinsic_weight() -> Weight { - unreachable!() - } -} - -impl ChainWithGrandpa for TestBridgedChain { - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; - const MAX_AUTHORITIES_COUNT: u32 = 16; - const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = 8; - const MAX_MANDATORY_HEADER_SIZE: u32 = 256; - const AVERAGE_HEADER_SIZE: u32 = 64; -} - -#[derive(Debug)] -pub struct OtherBridgedChain; - -impl Chain for OtherBridgedChain { - const ID: ChainId = *b"obch"; - - type BlockNumber = u64; - type Hash = crate::RelayBlockHash; - type Hasher = crate::RelayBlockHasher; - type Header = sp_runtime::generic::Header; - - type AccountId = AccountId; - type Balance = u32; - type Nonce = u32; - type Signature = sp_runtime::testing::TestSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; fn max_extrinsic_size() -> u32 { unreachable!() @@ -298,7 +275,7 @@ impl Chain for OtherBridgedChain { } } -impl ChainWithGrandpa for OtherBridgedChain { +impl ChainWithGrandpa for TestBridgedChain { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; const MAX_AUTHORITIES_COUNT: u32 = 16; const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = 8; diff --git a/bridges/modules/parachains/src/proofs.rs b/bridges/modules/parachains/src/proofs.rs new file mode 100644 index 00000000000..dcf22229f34 --- /dev/null +++ b/bridges/modules/parachains/src/proofs.rs @@ -0,0 +1,81 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tools for parachain head proof verification. + +use crate::{Config, GrandpaPalletOf, RelayBlockHash, RelayBlockHasher}; +use bp_header_chain::{HeaderChain, HeaderChainError}; +use bp_parachains::parachain_head_storage_key_at_source; +use bp_polkadot_core::parachains::{ParaHead, ParaId}; +use bp_runtime::{RawStorageProof, StorageProofChecker, StorageProofError}; +use codec::Decode; +use frame_support::traits::Get; + +/// Abstraction over storage proof manipulation, hiding implementation details of actual storage +/// proofs. +pub trait StorageProofAdapter, I: 'static> { + /// Read and decode optional value from the proof. + fn read_and_decode_optional_value( + &mut self, + key: &impl AsRef<[u8]>, + ) -> Result, StorageProofError>; + + /// Checks if each key was read. + fn ensure_no_unused_keys(self) -> Result<(), StorageProofError>; + + /// Read parachain head from storage proof. + fn read_parachain_head( + &mut self, + parachain: ParaId, + ) -> Result, StorageProofError> { + let parachain_head_key = + parachain_head_storage_key_at_source(T::ParasPalletName::get(), parachain); + self.read_and_decode_optional_value(¶chain_head_key) + } +} + +/// Actual storage proof adapter for parachain proofs. +pub type ParachainsStorageProofAdapter = RawStorageProofAdapter; + +/// A `StorageProofAdapter` implementation for raw storage proofs. +pub struct RawStorageProofAdapter, I: 'static> { + storage: StorageProofChecker, + _dummy: sp_std::marker::PhantomData<(T, I)>, +} + +impl, I: 'static> RawStorageProofAdapter { + /// Try to create a new instance of `RawStorageProofAdapter`. + pub fn try_new_with_verified_storage_proof( + relay_block_hash: RelayBlockHash, + storage_proof: RawStorageProof, + ) -> Result { + GrandpaPalletOf::::verify_storage_proof(relay_block_hash, storage_proof) + .map(|storage| RawStorageProofAdapter:: { storage, _dummy: Default::default() }) + } +} + +impl, I: 'static> StorageProofAdapter for RawStorageProofAdapter { + fn read_and_decode_optional_value( + &mut self, + key: &impl AsRef<[u8]>, + ) -> Result, StorageProofError> { + self.storage.read_and_decode_opt_value(key.as_ref()) + } + + fn ensure_no_unused_keys(self) -> Result<(), StorageProofError> { + self.storage.ensure_no_unused_nodes() + } +} diff --git a/bridges/modules/parachains/src/weights.rs b/bridges/modules/parachains/src/weights.rs index abddc876894..1f92b7ff763 100644 --- a/bridges/modules/parachains/src/weights.rs +++ b/bridges/modules/parachains/src/weights.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for pallet_bridge_parachains //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-02, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! HOSTNAME: `serban-ROG-Zephyrus`, CPU: `12th Gen Intel(R) Core(TM) i7-12700H` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: @@ -86,14 +86,12 @@ impl WeightInfo for BridgeWeight { /// Some(196), added: 1681, mode: MaxEncodedLen) /// /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight { + fn submit_parachain_heads_with_n_parachains(_p: u32) -> Weight { // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 36_701 nanoseconds. - Weight::from_parts(38_597_828, 4648) - // Standard Error: 190_859 - .saturating_add(Weight::from_parts(60_685, 0).saturating_mul(p.into())) + // Measured: `302` + // Estimated: `3038` + // Minimum execution time: 30_211 nanoseconds. + Weight::from_parts(32_633_893, 3038) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -123,10 +121,10 @@ impl WeightInfo for BridgeWeight { /// Some(196), added: 1681, mode: MaxEncodedLen) fn submit_parachain_heads_with_1kb_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 38_189 nanoseconds. - Weight::from_parts(39_252_000, 4648) + // Measured: `302` + // Estimated: `3038` + // Minimum execution time: 30_830 nanoseconds. + Weight::from_parts(31_801_000, 3038) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -156,10 +154,10 @@ impl WeightInfo for BridgeWeight { /// Some(196), added: 1681, mode: MaxEncodedLen) fn submit_parachain_heads_with_16kb_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 62_868 nanoseconds. - Weight::from_parts(63_581_000, 4648) + // Measured: `302` + // Estimated: `3038` + // Minimum execution time: 44_736 nanoseconds. + Weight::from_parts(45_296_000, 3038) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -193,14 +191,12 @@ impl WeightInfo for () { /// Some(196), added: 1681, mode: MaxEncodedLen) /// /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight { + fn submit_parachain_heads_with_n_parachains(_p: u32) -> Weight { // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 36_701 nanoseconds. - Weight::from_parts(38_597_828, 4648) - // Standard Error: 190_859 - .saturating_add(Weight::from_parts(60_685, 0).saturating_mul(p.into())) + // Measured: `302` + // Estimated: `3038` + // Minimum execution time: 30_211 nanoseconds. + Weight::from_parts(32_633_893, 3038) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -230,10 +226,10 @@ impl WeightInfo for () { /// Some(196), added: 1681, mode: MaxEncodedLen) fn submit_parachain_heads_with_1kb_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 38_189 nanoseconds. - Weight::from_parts(39_252_000, 4648) + // Measured: `302` + // Estimated: `3038` + // Minimum execution time: 30_830 nanoseconds. + Weight::from_parts(31_801_000, 3038) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -263,10 +259,10 @@ impl WeightInfo for () { /// Some(196), added: 1681, mode: MaxEncodedLen) fn submit_parachain_heads_with_16kb_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 62_868 nanoseconds. - Weight::from_parts(63_581_000, 4648) + // Measured: `302` + // Estimated: `3038` + // Minimum execution time: 44_736 nanoseconds. + Weight::from_parts(45_296_000, 3038) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } diff --git a/bridges/modules/relayers/src/payment_adapter.rs b/bridges/modules/relayers/src/payment_adapter.rs index b2d9c676bdd..f75c409aca4 100644 --- a/bridges/modules/relayers/src/payment_adapter.rs +++ b/bridges/modules/relayers/src/payment_adapter.rs @@ -23,6 +23,7 @@ use bp_messages::{ LaneId, MessageNonce, }; use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; +use bp_runtime::Chain; use frame_support::{sp_runtime::SaturatedConversion, traits::Get}; use sp_arithmetic::traits::{Saturating, Zero}; use sp_std::{collections::vec_deque::VecDeque, marker::PhantomData, ops::RangeInclusive}; @@ -57,7 +58,7 @@ where relayers_rewards, RewardsAccountParams::new( lane_id, - T::BridgedChainId::get(), + T::BridgedChain::ID, RewardsAccountOwner::BridgedChain, ), DeliveryReward::get(), diff --git a/bridges/modules/xcm-bridge-hub/src/mock.rs b/bridges/modules/xcm-bridge-hub/src/mock.rs index 4c09bce56d7..df72e7a3c4f 100644 --- a/bridges/modules/xcm-bridge-hub/src/mock.rs +++ b/bridges/modules/xcm-bridge-hub/src/mock.rs @@ -20,23 +20,17 @@ use crate as pallet_xcm_bridge_hub; use bp_messages::{ target_chain::{DispatchMessage, MessageDispatch}, - LaneId, -}; -use bp_runtime::{messages::MessageDispatchResult, Chain, ChainId, UnderlyingChainProvider}; -use bridge_runtime_common::{ - messages::{ - source::TargetHeaderChainAdapter, target::SourceHeaderChainAdapter, - BridgedChainWithMessages, HashOf, MessageBridge, ThisChainWithMessages, - }, - messages_xcm_extension::{SenderAndLane, XcmBlobHauler}, + ChainWithMessages, LaneId, MessageNonce, }; +use bp_runtime::{messages::MessageDispatchResult, Chain, ChainId, HashOf}; +use bridge_runtime_common::messages_xcm_extension::{SenderAndLane, XcmBlobHauler}; use codec::Encode; -use frame_support::{derive_impl, parameter_types, traits::ConstU32, weights::RuntimeDbWeight}; +use frame_support::{derive_impl, parameter_types, weights::RuntimeDbWeight}; use sp_core::H256; use sp_runtime::{ testing::Header as SubstrateHeader, traits::{BlakeTwo256, IdentityLookup}, - AccountId32, BuildStorage, + AccountId32, BuildStorage, StateVersion, }; use xcm::prelude::*; @@ -85,20 +79,17 @@ impl pallet_bridge_messages::Config for TestRuntime { type RuntimeEvent = RuntimeEvent; type WeightInfo = TestMessagesWeights; - type BridgedChainId = (); type ActiveOutboundLanes = ActiveOutboundLanes; - type MaxUnrewardedRelayerEntriesAtInboundLane = (); - type MaxUnconfirmedMessagesAtInboundLane = (); - type MaximalOutboundPayloadSize = ConstU32<2048>; type OutboundPayload = Vec; type InboundPayload = Vec; - type InboundRelayer = (); type DeliveryPayments = (); - type TargetHeaderChain = TargetHeaderChainAdapter; type DeliveryConfirmationPayments = (); type OnMessagesDelivered = (); - type SourceHeaderChain = SourceHeaderChainAdapter; type MessageDispatch = TestMessageDispatch; + + type ThisChain = ThisUnderlyingChain; + type BridgedChain = BridgedUnderlyingChain; + type BridgedHeaderChain = BridgedHeaderChain; } pub struct TestMessagesWeights; @@ -107,34 +98,27 @@ impl pallet_bridge_messages::WeightInfo for TestMessagesWeights { fn receive_single_message_proof() -> Weight { Weight::zero() } - fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + fn receive_n_messages_proof(_: u32) -> Weight { Weight::zero() } - fn receive_delivery_proof_for_single_message() -> Weight { + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { Weight::zero() } - fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { + fn receive_single_n_bytes_message_proof(_: u32) -> Weight { Weight::zero() } - fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { + fn receive_delivery_proof_for_single_message() -> Weight { Weight::zero() } - - fn receive_two_messages_proof() -> Weight { + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { Weight::zero() } - - fn receive_single_message_proof_1_kb() -> Weight { + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { Weight::zero() } - - fn receive_single_message_proof_16_kb() -> Weight { + fn receive_single_n_bytes_message_proof_with_dispatch(_: u32) -> Weight { Weight::zero() } - - fn receive_single_message_proof_with_dispatch(_: u32) -> Weight { - Weight::from_parts(1, 0) - } } impl pallet_bridge_messages::WeightInfoExt for TestMessagesWeights { @@ -198,9 +182,9 @@ impl XcmBlobHauler for TestXcmBlobHauler { type UncongestedMessage = (); } -pub struct ThisChain; +pub struct ThisUnderlyingChain; -impl Chain for ThisChain { +impl Chain for ThisUnderlyingChain { const ID: ChainId = *b"tuch"; type BlockNumber = u64; type Hash = H256; @@ -211,6 +195,8 @@ impl Chain for ThisChain { type Nonce = u64; type Signature = sp_runtime::MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { u32::MAX } @@ -220,12 +206,19 @@ impl Chain for ThisChain { } } -pub struct BridgedChain; +impl ChainWithMessages for ThisUnderlyingChain { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = ""; + + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 16; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 1000; +} + +pub struct BridgedUnderlyingChain; pub type BridgedHeaderHash = H256; pub type BridgedChainHeader = SubstrateHeader; -impl Chain for BridgedChain { - const ID: ChainId = *b"tuch"; +impl Chain for BridgedUnderlyingChain { + const ID: ChainId = *b"bgdc"; type BlockNumber = u64; type Hash = BridgedHeaderHash; type Hasher = BlakeTwo256; @@ -235,6 +228,8 @@ impl Chain for BridgedChain { type Nonce = u64; type Signature = sp_runtime::MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { 4096 } @@ -244,6 +239,12 @@ impl Chain for BridgedChain { } } +impl ChainWithMessages for BridgedUnderlyingChain { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = ""; + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 16; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 1000; +} + /// Test message dispatcher. pub struct TestMessageDispatch; @@ -272,42 +273,15 @@ impl MessageDispatch for TestMessageDispatch { } } -pub struct WrappedThisChain; -impl UnderlyingChainProvider for WrappedThisChain { - type Chain = ThisChain; -} -impl ThisChainWithMessages for WrappedThisChain { - type RuntimeOrigin = RuntimeOrigin; -} - -pub struct WrappedBridgedChain; -impl UnderlyingChainProvider for WrappedBridgedChain { - type Chain = BridgedChain; -} -impl BridgedChainWithMessages for WrappedBridgedChain {} - pub struct BridgedHeaderChain; -impl bp_header_chain::HeaderChain for BridgedHeaderChain { +impl bp_header_chain::HeaderChain for BridgedHeaderChain { fn finalized_header_state_root( - _hash: HashOf, - ) -> Option> { + _hash: HashOf, + ) -> Option> { unreachable!() } } -/// Bridge that is deployed on `ThisChain` and allows sending/receiving messages to/from -/// `BridgedChain`. -#[derive(Debug, PartialEq, Eq)] -pub struct OnThisChainBridge; - -impl MessageBridge for OnThisChainBridge { - const BRIDGED_MESSAGES_PALLET_NAME: &'static str = ""; - - type ThisChain = WrappedThisChain; - type BridgedChain = WrappedBridgedChain; - type BridgedHeaderChain = BridgedHeaderChain; -} - /// Run pallet test. pub fn run_test(test: impl FnOnce() -> T) -> T { sp_io::TestExternalities::new( diff --git a/bridges/primitives/header-chain/src/lib.rs b/bridges/primitives/header-chain/src/lib.rs index af2afb65a26..26295dee180 100644 --- a/bridges/primitives/header-chain/src/lib.rs +++ b/bridges/primitives/header-chain/src/lib.rs @@ -46,7 +46,7 @@ pub mod storage_keys; pub enum HeaderChainError { /// Header with given hash is missing from the chain. UnknownHeader, - /// Storage proof related error. + /// Error generated by the `storage_proof` module. StorageProof(StorageProofError), } @@ -78,8 +78,9 @@ impl StoredHeaderDataBuilder for H { pub trait HeaderChain { /// Returns state (storage) root of given finalized header. fn finalized_header_state_root(header_hash: HashOf) -> Option>; + /// Get storage proof checker using finalized header. - fn storage_proof_checker( + fn verify_storage_proof( header_hash: HashOf, storage_proof: RawStorageProof, ) -> Result>, HeaderChainError> { @@ -409,7 +410,9 @@ mod tests { use super::*; use bp_runtime::ChainId; use frame_support::weights::Weight; - use sp_runtime::{testing::H256, traits::BlakeTwo256, DigestItem, MultiSignature}; + use sp_runtime::{ + testing::H256, traits::BlakeTwo256, DigestItem, MultiSignature, StateVersion, + }; struct TestChain; @@ -425,6 +428,8 @@ mod tests { type Nonce = u64; type Signature = MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { 0 } diff --git a/bridges/primitives/messages/src/lib.rs b/bridges/primitives/messages/src/lib.rs index c3f79b3ee38..9984f8ac322 100644 --- a/bridges/primitives/messages/src/lib.rs +++ b/bridges/primitives/messages/src/lib.rs @@ -38,6 +38,9 @@ pub mod source_chain; pub mod storage_keys; pub mod target_chain; +/// Hard limit on message size that can be sent over the bridge. +pub const HARD_MESSAGE_SIZE_LIMIT: u32 = 64 * 1024; + /// Substrate-based chain with messaging support. pub trait ChainWithMessages: Chain { /// Name of the bridge messages pallet (used in `construct_runtime` macro call) that is @@ -48,11 +51,63 @@ pub trait ChainWithMessages: Chain { const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str; /// Maximal number of unrewarded relayers in a single confirmation transaction at this - /// `ChainWithMessages`. + /// `ChainWithMessages`. Unrewarded means that the relayer has delivered messages, but + /// either confirmations haven't been delivered back to the source chain, or we haven't + /// received reward confirmations yet. + /// + /// This constant limits maximal number of entries in the `InboundLaneData::relayers`. Keep + /// in mind that the same relayer account may take several (non-consecutive) entries in this + /// set. const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce; /// Maximal number of unconfirmed messages in a single confirmation transaction at this - /// `ChainWithMessages`. + /// `ChainWithMessages`. Unconfirmed means that the + /// message has been delivered, but either confirmations haven't been delivered back to the + /// source chain, or we haven't received reward confirmations for these messages yet. + /// + /// This constant limits difference between last message from last entry of the + /// `InboundLaneData::relayers` and first message at the first entry. + /// + /// There is no point of making this parameter lesser than + /// `MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX`, because then maximal number of relayer entries + /// will be limited by maximal number of messages. + /// + /// This value also represents maximal number of messages in single delivery transaction. + /// Transaction that is declaring more messages than this value, will be rejected. Even if + /// these messages are from different lanes. const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce; + + /// Return maximal dispatch weight of the message we're able to receive. + fn maximal_incoming_message_dispatch_weight() -> Weight { + // we leave 1/2 of `max_extrinsic_weight` for the delivery transaction itself + Self::max_extrinsic_weight() / 2 + } + + /// Return maximal size of the message we're able to receive. + fn maximal_incoming_message_size() -> u32 { + maximal_incoming_message_size(Self::max_extrinsic_size()) + } +} + +/// Return maximal size of the message the chain with `max_extrinsic_size` is able to receive. +pub fn maximal_incoming_message_size(max_extrinsic_size: u32) -> u32 { + // The maximal size of extrinsic at Substrate-based chain depends on the + // `frame_system::Config::MaximumBlockLength` and + // `frame_system::Config::AvailableBlockRatio` constants. This check is here to be sure that + // the lane won't stuck because message is too large to fit into delivery transaction. + // + // **IMPORTANT NOTE**: the delivery transaction contains storage proof of the message, not + // the message itself. The proof is always larger than the message. But unless chain state + // is enormously large, it should be several dozens/hundreds of bytes. The delivery + // transaction also contains signatures and signed extensions. Because of this, we reserve + // 1/3 of the the maximal extrinsic size for this data. + // + // **ANOTHER IMPORTANT NOTE**: large message means not only larger proofs and heavier + // proof verification, but also heavier message decoding and dispatch. So we have a hard + // limit of `64Kb`, which in practice limits the message size on all chains. Without this + // limit the **weight** (not the size) of the message will be higher than the + // `Self::maximal_incoming_message_dispatch_weight()`. + + sp_std::cmp::min(max_extrinsic_size / 3 * 2, HARD_MESSAGE_SIZE_LIMIT) } impl ChainWithMessages for T @@ -112,7 +167,19 @@ impl OperatingMode for MessagesOperatingMode { /// Lane id which implements `TypeId`. #[derive( - Clone, Copy, Decode, Default, Encode, Eq, Ord, PartialOrd, PartialEq, TypeInfo, MaxEncodedLen, + Clone, + Copy, + Decode, + Default, + Encode, + Eq, + Ord, + PartialOrd, + PartialEq, + TypeInfo, + MaxEncodedLen, + Serialize, + Deserialize, )] pub struct LaneId(pub [u8; 4]); @@ -435,7 +502,7 @@ where AccountId: sp_std::cmp::Ord, { // remember to reward relayers that have delivered messages - // this loop is bounded by `T::MaxUnrewardedRelayerEntriesAtInboundLane` on the bridged chain + // this loop is bounded by `T::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX` on the bridged chain let mut relayers_rewards = RelayersRewards::new(); for entry in messages_relayers { let nonce_begin = sp_std::cmp::max(entry.messages.begin, *received_range.start()); @@ -486,11 +553,11 @@ pub enum VerificationError { InvalidMessageWeight, /// Declared messages count doesn't match actual value. MessagesCountMismatch, - /// Error returned while reading/decoding message data from the storage proof. + /// Error returned while reading/decoding message data from the `VerifiedStorageProof`. MessageStorage(StorageProofError), /// The message is too large. MessageTooLarge, - /// Error returned while reading/decoding outbound lane data from the storage proof. + /// Error returned while reading/decoding outbound lane data from the `VerifiedStorageProof`. OutboundLaneStorage(StorageProofError), /// Storage proof related error. StorageProof(StorageProofError), diff --git a/bridges/primitives/messages/src/source_chain.rs b/bridges/primitives/messages/src/source_chain.rs index f4aefd97355..64f015bdb82 100644 --- a/bridges/primitives/messages/src/source_chain.rs +++ b/bridges/primitives/messages/src/source_chain.rs @@ -16,11 +16,11 @@ //! Primitives of messages module, that are used on the source chain. -use crate::{InboundLaneData, LaneId, MessageNonce, VerificationError}; +use crate::{LaneId, MessageNonce, UnrewardedRelayer}; -use crate::UnrewardedRelayer; -use bp_runtime::Size; -use frame_support::Parameter; +use bp_runtime::{raw_storage_proof_size, RawStorageProof, Size}; +use codec::{Decode, Encode}; +use scale_info::TypeInfo; use sp_core::RuntimeDebug; use sp_std::{ collections::{btree_map::BTreeMap, vec_deque::VecDeque}, @@ -28,42 +28,36 @@ use sp_std::{ ops::RangeInclusive, }; -/// Number of messages, delivered by relayers. -pub type RelayersRewards = BTreeMap; - -/// Target chain API. Used by source chain to verify target chain proofs. +/// Messages delivery proof from the bridged chain. /// -/// All implementations of this trait should only work with finalized data that -/// can't change. Wrong implementation may lead to invalid lane states (i.e. lane -/// that's stuck) and/or processing messages without paying fees. +/// It contains everything required to prove that our (this chain) messages have been +/// delivered to the bridged (target) chain: /// -/// The `Payload` type here means the payload of the message that is sent from the -/// source chain to the target chain. The `AccountId` type here means the account -/// type used by the source chain. -pub trait TargetHeaderChain { - /// Proof that messages have been received by target chain. - type MessagesDeliveryProof: Parameter + Size; - - /// Verify message payload before we accept it. - /// - /// **CAUTION**: this is very important function. Incorrect implementation may lead - /// to stuck lanes and/or relayers loses. - /// - /// The proper implementation must ensure that the delivery-transaction with this - /// payload would (at least) be accepted into target chain transaction pool AND - /// eventually will be successfully mined. The most obvious incorrect implementation - /// example would be implementation for BTC chain that accepts payloads larger than - /// 1MB. BTC nodes aren't accepting transactions that are larger than 1MB, so relayer - /// will be unable to craft valid transaction => this (and all subsequent) messages will - /// never be delivered. - fn verify_message(payload: &Payload) -> Result<(), VerificationError>; - - /// Verify messages delivery proof and return lane && nonce of the latest received message. - fn verify_messages_delivery_proof( - proof: Self::MessagesDeliveryProof, - ) -> Result<(LaneId, InboundLaneData), VerificationError>; +/// - hash of finalized header; +/// +/// - storage proof of the inbound lane state; +/// +/// - lane id. +#[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] +pub struct FromBridgedChainMessagesDeliveryProof { + /// Hash of the bridge header the proof is for. + pub bridged_header_hash: BridgedHeaderHash, + /// Storage trie proof generated for [`Self::bridged_header_hash`]. + pub storage_proof: RawStorageProof, + /// Lane id of which messages were delivered and the proof is for. + pub lane: LaneId, +} + +impl Size for FromBridgedChainMessagesDeliveryProof { + fn size(&self) -> u32 { + use frame_support::sp_runtime::SaturatedConversion; + raw_storage_proof_size(&self.storage_proof).saturated_into() + } } +/// Number of messages, delivered by relayers. +pub type RelayersRewards = BTreeMap; + /// Manages payments that are happening at the source chain during delivery confirmation /// transaction. pub trait DeliveryConfirmationPayments { @@ -143,28 +137,10 @@ pub trait MessagesBridge { fn send_message(message: Self::SendMessageArgs) -> SendMessageArtifacts; } -/// Structure that may be used in place of `TargetHeaderChain` and -/// `MessageDeliveryAndDispatchPayment` on chains, where outbound messages are forbidden. +/// Structure that may be used in place `MessageDeliveryAndDispatchPayment` on chains, +/// where outbound messages are forbidden. pub struct ForbidOutboundMessages; -/// Error message that is used in `ForbidOutboundMessages` implementation. -const ALL_OUTBOUND_MESSAGES_REJECTED: &str = - "This chain is configured to reject all outbound messages"; - -impl TargetHeaderChain for ForbidOutboundMessages { - type MessagesDeliveryProof = (); - - fn verify_message(_payload: &Payload) -> Result<(), VerificationError> { - Err(VerificationError::Other(ALL_OUTBOUND_MESSAGES_REJECTED)) - } - - fn verify_messages_delivery_proof( - _proof: Self::MessagesDeliveryProof, - ) -> Result<(LaneId, InboundLaneData), VerificationError> { - Err(VerificationError::Other(ALL_OUTBOUND_MESSAGES_REJECTED)) - } -} - impl DeliveryConfirmationPayments for ForbidOutboundMessages { type Error = &'static str; diff --git a/bridges/primitives/messages/src/target_chain.rs b/bridges/primitives/messages/src/target_chain.rs index 388ce16ccdc..74fecb9d9f0 100644 --- a/bridges/primitives/messages/src/target_chain.rs +++ b/bridges/primitives/messages/src/target_chain.rs @@ -16,17 +16,48 @@ //! Primitives of messages module, that are used on the target chain. -use crate::{ - LaneId, Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData, VerificationError, -}; +use crate::{LaneId, Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData}; -use bp_runtime::{messages::MessageDispatchResult, Size}; +use bp_runtime::{messages::MessageDispatchResult, raw_storage_proof_size, RawStorageProof, Size}; use codec::{Decode, Encode, Error as CodecError}; -use frame_support::{weights::Weight, Parameter}; +use frame_support::weights::Weight; use scale_info::TypeInfo; use sp_core::RuntimeDebug; use sp_std::{collections::btree_map::BTreeMap, fmt::Debug, marker::PhantomData, prelude::*}; +/// Messages proof from bridged chain. +/// +/// It contains everything required to prove that bridged (source) chain has +/// sent us some messages: +/// +/// - hash of finalized header; +/// +/// - storage proof of messages and (optionally) outbound lane state; +/// +/// - lane id; +/// +/// - nonces (inclusive range) of messages which are included in this proof. +#[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] +pub struct FromBridgedChainMessagesProof { + /// Hash of the finalized bridged header the proof is for. + pub bridged_header_hash: BridgedHeaderHash, + /// A storage trie proof of messages being delivered. + pub storage_proof: RawStorageProof, + /// Messages in this proof are sent over this lane. + pub lane: LaneId, + /// Nonce of the first message being delivered. + pub nonces_start: MessageNonce, + /// Nonce of the last message being delivered. + pub nonces_end: MessageNonce, +} + +impl Size for FromBridgedChainMessagesProof { + fn size(&self) -> u32 { + use frame_support::sp_runtime::SaturatedConversion; + raw_storage_proof_size(&self.storage_proof).saturated_into() + } +} + /// Proved messages from the source chain. pub type ProvedMessages = BTreeMap>; @@ -55,33 +86,6 @@ pub struct DispatchMessage { pub data: DispatchMessageData, } -/// Source chain API. Used by target chain, to verify source chain proofs. -/// -/// All implementations of this trait should only work with finalized data that -/// can't change. Wrong implementation may lead to invalid lane states (i.e. lane -/// that's stuck) and/or processing messages without paying fees. -pub trait SourceHeaderChain { - /// Proof that messages are sent from source chain. This may also include proof - /// of corresponding outbound lane states. - type MessagesProof: Parameter + Size; - - /// Verify messages proof and return proved messages. - /// - /// Returns error if either proof is incorrect, or the number of messages in the proof - /// is not matching the `messages_count`. - /// - /// Messages vector is required to be sorted by nonce within each lane. Out-of-order - /// messages will be rejected. - /// - /// The `messages_count` argument verification (sane limits) is supposed to be made - /// outside this function. This function only verifies that the proof declares exactly - /// `messages_count` messages. - fn verify_messages_proof( - proof: Self::MessagesProof, - messages_count: u32, - ) -> Result, VerificationError>; -} - /// Called when inbound message is received. pub trait MessageDispatch { /// Decoded message payload type. Valid message may contain invalid payload. In this case @@ -167,32 +171,11 @@ impl DeliveryPayments for () { } } -/// Structure that may be used in place of `SourceHeaderChain` and `MessageDispatch` on chains, +/// Structure that may be used in place of `MessageDispatch` on chains, /// where inbound messages are forbidden. -pub struct ForbidInboundMessages( - PhantomData<(MessagesProof, DispatchPayload)>, -); - -/// Error message that is used in `ForbidInboundMessages` implementation. -const ALL_INBOUND_MESSAGES_REJECTED: &str = - "This chain is configured to reject all inbound messages"; - -impl SourceHeaderChain - for ForbidInboundMessages -{ - type MessagesProof = MessagesProof; - - fn verify_messages_proof( - _proof: Self::MessagesProof, - _messages_count: u32, - ) -> Result, VerificationError> { - Err(VerificationError::Other(ALL_INBOUND_MESSAGES_REJECTED)) - } -} +pub struct ForbidInboundMessages(PhantomData); -impl MessageDispatch - for ForbidInboundMessages -{ +impl MessageDispatch for ForbidInboundMessages { type DispatchPayload = DispatchPayload; type DispatchLevelResult = (); diff --git a/bridges/primitives/polkadot-core/src/parachains.rs b/bridges/primitives/polkadot-core/src/parachains.rs index 433cd2845ab..d54ee108386 100644 --- a/bridges/primitives/polkadot-core/src/parachains.rs +++ b/bridges/primitives/polkadot-core/src/parachains.rs @@ -22,7 +22,7 @@ //! parachains. Having pallets that are referencing polkadot, would mean that there may //! be two versions of polkadot crates included in the runtime. Which is bad. -use bp_runtime::{RawStorageProof, Size}; +use bp_runtime::{raw_storage_proof_size, RawStorageProof, Size}; use codec::{CompactAs, Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; use sp_core::Hasher; @@ -96,11 +96,7 @@ pub struct ParaHeadsProof { impl Size for ParaHeadsProof { fn size(&self) -> u32 { - u32::try_from( - self.storage_proof - .iter() - .fold(0usize, |sum, node| sum.saturating_add(node.len())), - ) - .unwrap_or(u32::MAX) + use frame_support::sp_runtime::SaturatedConversion; + raw_storage_proof_size(&self.storage_proof).saturated_into() } } diff --git a/bridges/primitives/runtime/Cargo.toml b/bridges/primitives/runtime/Cargo.toml index 5fa35e68899..117409b37b9 100644 --- a/bridges/primitives/runtime/Cargo.toml +++ b/bridges/primitives/runtime/Cargo.toml @@ -53,3 +53,4 @@ std = [ "sp-trie/std", "trie-db/std", ] +test-helpers = [] diff --git a/bridges/primitives/runtime/src/chain.rs b/bridges/primitives/runtime/src/chain.rs index 369386e41b0..0db4eac79a7 100644 --- a/bridges/primitives/runtime/src/chain.rs +++ b/bridges/primitives/runtime/src/chain.rs @@ -24,7 +24,7 @@ use sp_runtime::{ AtLeast32Bit, AtLeast32BitUnsigned, Hash as HashT, Header as HeaderT, MaybeDisplay, MaybeSerialize, MaybeSerializeDeserialize, Member, SimpleBitOps, Verify, }, - FixedPointOperand, + FixedPointOperand, StateVersion, }; use sp_std::{fmt::Debug, hash::Hash, str::FromStr, vec, vec::Vec}; @@ -196,6 +196,10 @@ pub trait Chain: Send + Sync + 'static { /// Signature type, used on this chain. type Signature: Parameter + Verify; + /// Version of the state implementation used by this chain. This is directly related with the + /// `TrieLayout` configuration used by the storage. + const STATE_VERSION: StateVersion; + /// Get the maximum size (in bytes) of a Normal extrinsic at this chain. fn max_extrinsic_size() -> u32; /// Get the maximum weight (compute time) that a Normal extrinsic at this chain can use. @@ -223,6 +227,8 @@ where type Nonce = ::Nonce; type Signature = ::Signature; + const STATE_VERSION: StateVersion = ::STATE_VERSION; + fn max_extrinsic_size() -> u32 { ::max_extrinsic_size() } diff --git a/bridges/primitives/runtime/src/lib.rs b/bridges/primitives/runtime/src/lib.rs index d13c9b40efa..8f5040ad9a1 100644 --- a/bridges/primitives/runtime/src/lib.rs +++ b/bridges/primitives/runtime/src/lib.rs @@ -40,15 +40,18 @@ pub use chain::{ }; pub use frame_support::storage::storage_prefix as storage_value_final_key; use num_traits::{CheckedAdd, CheckedSub, One, SaturatingAdd, Zero}; +#[cfg(feature = "std")] +pub use storage_proof::craft_valid_storage_proof; +#[cfg(feature = "test-helpers")] pub use storage_proof::{ - record_all_keys as record_all_trie_keys, Error as StorageProofError, - ProofSize as StorageProofSize, RawStorageProof, StorageProofChecker, + grow_storage_proof, grow_storage_value, record_all_keys as record_all_trie_keys, + UnverifiedStorageProofParams, +}; +pub use storage_proof::{ + raw_storage_proof_size, RawStorageProof, StorageProofChecker, StorageProofError, }; pub use storage_types::BoundedStorageValue; -#[cfg(feature = "std")] -pub use storage_proof::craft_valid_storage_proof; - pub mod extensions; pub mod messages; @@ -461,38 +464,6 @@ macro_rules! generate_static_str_provider { }; } -/// Error message that is only displayable in `std` environment. -#[derive(Encode, Decode, Clone, Eq, PartialEq, PalletError, TypeInfo)] -#[scale_info(skip_type_params(T))] -pub struct StrippableError { - _phantom_data: sp_std::marker::PhantomData, - #[codec(skip)] - #[cfg(feature = "std")] - message: String, -} - -impl From for StrippableError { - fn from(_err: T) -> Self { - Self { - _phantom_data: Default::default(), - #[cfg(feature = "std")] - message: format!("{:?}", _err), - } - } -} - -impl Debug for StrippableError { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { - f.write_str(&self.message) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { - f.write_str("Stripped error") - } -} - /// A trait defining helper methods for `RangeInclusive` (start..=end) pub trait RangeInclusiveExt { /// Computes the length of the `RangeInclusive`, checking for underflow and overflow. diff --git a/bridges/primitives/runtime/src/storage_proof.rs b/bridges/primitives/runtime/src/storage_proof.rs index 251ceec5a9e..7bfa0d6fde0 100644 --- a/bridges/primitives/runtime/src/storage_proof.rs +++ b/bridges/primitives/runtime/src/storage_proof.rs @@ -14,34 +14,91 @@ // You should have received a copy of the GNU General Public License // along with Parity Bridges Common. If not, see . -//! Logic for checking Substrate storage proofs. +//! Logic for working with storage proofs. -use crate::StrippableError; -use codec::{Decode, Encode}; use frame_support::PalletError; -use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; -use scale_info::TypeInfo; -use sp_std::{boxed::Box, vec::Vec}; -pub use sp_trie::RawStorageProof; +use sp_core::RuntimeDebug; +use sp_std::{default::Default, vec::Vec}; use sp_trie::{ - accessed_nodes_tracker::{AccessedNodesTracker, Error as AccessedNodesTrackerError}, - read_trie_value, - recorder_ext::RecorderExt, - LayoutV1, MemoryDB, Recorder, StorageProof, StorageProofError, Trie, TrieConfiguration, - TrieDBBuilder, TrieError, TrieHash, + accessed_nodes_tracker::AccessedNodesTracker, read_trie_value, LayoutV1, MemoryDB, StorageProof, }; -/// Storage proof size requirements. +use codec::{Decode, Encode}; +use hash_db::{HashDB, Hasher, EMPTY_PREFIX}; +use scale_info::TypeInfo; +#[cfg(feature = "test-helpers")] +use sp_trie::{recorder_ext::RecorderExt, Recorder, TrieDBBuilder, TrieError, TrieHash}; +#[cfg(feature = "test-helpers")] +use trie_db::{Trie, TrieConfiguration, TrieDBMut}; + +/// Errors that can occur when interacting with `UnverifiedStorageProof` and `VerifiedStorageProof`. +#[derive(Clone, Encode, Decode, RuntimeDebug, PartialEq, Eq, PalletError, TypeInfo)] +pub enum StorageProofError { + /// Call to `generate_trie_proof()` failed. + UnableToGenerateTrieProof, + /// Call to `verify_trie_proof()` failed. + InvalidProof, + /// The `Vec` entries weren't sorted as expected. + UnsortedEntries, + /// The provided key wasn't found. + UnavailableKey, + /// The value associated to the provided key is `None`. + EmptyVal, + /// Error decoding value associated to a provided key. + DecodeError, + /// At least one key or node wasn't read. + UnusedKey, + + /// Expected storage root is missing from the proof. (for non-compact proofs) + StorageRootMismatch, + /// Unable to reach expected storage value using provided trie nodes. (for non-compact proofs) + StorageValueUnavailable, + /// The proof contains duplicate nodes. (for non-compact proofs) + DuplicateNodes, +} + +impl From for StorageProofError { + fn from(e: sp_trie::StorageProofError) -> Self { + match e { + sp_trie::StorageProofError::DuplicateNodes => StorageProofError::DuplicateNodes, + } + } +} + +impl From for StorageProofError { + fn from(e: sp_trie::accessed_nodes_tracker::Error) -> Self { + match e { + sp_trie::accessed_nodes_tracker::Error::UnusedNodes => StorageProofError::UnusedKey, + } + } +} + +/// Raw storage proof type (just raw trie nodes). +pub type RawStorageProof = sp_trie::RawStorageProof; + +/// Calculates size for `RawStorageProof`. +pub fn raw_storage_proof_size(raw_storage_proof: &RawStorageProof) -> usize { + raw_storage_proof + .iter() + .fold(0usize, |sum, node| sum.saturating_add(node.len())) +} + +/// Storage values size requirements. /// /// This is currently used by benchmarks when generating storage proofs. -#[derive(Clone, Copy, Debug)] -pub enum ProofSize { - /// The proof is expected to be minimal. If value size may be changed, then it is expected to - /// have given size. - Minimal(u32), - /// The proof is expected to have at least given size and grow by increasing value that is - /// stored in the trie. - HasLargeLeaf(u32), +#[cfg(feature = "test-helpers")] +#[derive(Clone, Copy, Debug, Default)] +pub struct UnverifiedStorageProofParams { + /// Expected storage proof size in bytes. + pub db_size: Option, +} + +#[cfg(feature = "test-helpers")] +impl UnverifiedStorageProofParams { + /// Make storage proof parameters that require proof of at least `db_size` bytes. + pub fn from_db_size(db_size: u32) -> Self { + Self { db_size: Some(db_size) } + } } /// This struct is used to read storage values from a subset of a Merklized database. The "proof" @@ -64,15 +121,14 @@ where /// Constructs a new storage proof checker. /// /// This returns an error if the given proof is invalid with respect to the given root. - pub fn new(root: H::Out, proof: RawStorageProof) -> Result { - let proof = StorageProof::new_with_duplicate_nodes_check(proof) - .map_err(|e| Error::StorageProof(e.into()))?; + pub fn new(root: H::Out, proof: RawStorageProof) -> Result { + let proof = StorageProof::new_with_duplicate_nodes_check(proof)?; let recorder = AccessedNodesTracker::new(proof.len()); let db = proof.into_memory_db(); if !db.contains(&root, EMPTY_PREFIX) { - return Err(Error::StorageRootMismatch) + return Err(StorageProofError::StorageRootMismatch) } Ok(StorageProofChecker { root, db, accessed_nodes_tracker: recorder }) @@ -80,15 +136,13 @@ where /// Returns error if the proof has some nodes that are left intact by previous `read_value` /// calls. - pub fn ensure_no_unused_nodes(self) -> Result<(), Error> { - self.accessed_nodes_tracker - .ensure_no_unused_nodes() - .map_err(|e| Error::AccessedNodesTracker(e.into())) + pub fn ensure_no_unused_nodes(self) -> Result<(), StorageProofError> { + self.accessed_nodes_tracker.ensure_no_unused_nodes().map_err(Into::into) } /// Reads a value from the available subset of storage. If the value cannot be read due to an /// incomplete or otherwise invalid proof, this function returns an error. - pub fn read_value(&mut self, key: &[u8]) -> Result>, Error> { + pub fn read_value(&mut self, key: &[u8]) -> Result>, StorageProofError> { // LayoutV1 or LayoutV0 is identical for proof that only read values. read_trie_value::, _>( &self.db, @@ -97,53 +151,131 @@ where Some(&mut self.accessed_nodes_tracker), None, ) - .map_err(|_| Error::StorageValueUnavailable) + .map_err(|_| StorageProofError::StorageValueUnavailable) } /// Reads and decodes a value from the available subset of storage. If the value cannot be read /// due to an incomplete or otherwise invalid proof, this function returns an error. If value is /// read, but decoding fails, this function returns an error. - pub fn read_and_decode_value(&mut self, key: &[u8]) -> Result, Error> { + pub fn read_and_decode_value( + &mut self, + key: &[u8], + ) -> Result, StorageProofError> { self.read_value(key).and_then(|v| { - v.map(|v| T::decode(&mut &v[..]).map_err(|e| Error::StorageValueDecodeFailed(e.into()))) - .transpose() + v.map(|v| { + T::decode(&mut &v[..]).map_err(|e| { + log::warn!(target: "bridge-storage-proofs", "read_and_decode_value error: {e:?}"); + StorageProofError::DecodeError + }) + }) + .transpose() }) } /// Reads and decodes a value from the available subset of storage. If the value cannot be read /// due to an incomplete or otherwise invalid proof, or if the value is `None`, this function /// returns an error. If value is read, but decoding fails, this function returns an error. - pub fn read_and_decode_mandatory_value(&mut self, key: &[u8]) -> Result { - self.read_and_decode_value(key)?.ok_or(Error::StorageValueEmpty) + pub fn read_and_decode_mandatory_value( + &mut self, + key: &[u8], + ) -> Result { + self.read_and_decode_value(key)?.ok_or(StorageProofError::EmptyVal) } /// Reads and decodes a value from the available subset of storage. If the value cannot be read /// due to an incomplete or otherwise invalid proof, this function returns `Ok(None)`. /// If value is read, but decoding fails, this function returns an error. - pub fn read_and_decode_opt_value(&mut self, key: &[u8]) -> Result, Error> { + pub fn read_and_decode_opt_value( + &mut self, + key: &[u8], + ) -> Result, StorageProofError> { match self.read_and_decode_value(key) { Ok(outbound_lane_data) => Ok(outbound_lane_data), - Err(Error::StorageValueUnavailable) => Ok(None), + Err(StorageProofError::StorageValueUnavailable) => Ok(None), Err(e) => Err(e), } } } -/// Storage proof related errors. -#[derive(Encode, Decode, Clone, Eq, PartialEq, PalletError, Debug, TypeInfo)] -pub enum Error { - /// Error generated by the `AccessedNodesTrackerError`. - AccessedNodesTracker(StrippableError), - /// Error originating in the `storage_proof` module. - StorageProof(StrippableError), - /// Expected storage root is missing from the proof. - StorageRootMismatch, - /// Unable to reach expected storage value using provided trie nodes. - StorageValueUnavailable, - /// The storage value is `None`. - StorageValueEmpty, - /// Failed to decode storage value. - StorageValueDecodeFailed(StrippableError), +/// Add extra data to the storage value so that it'll be of given size. +#[cfg(feature = "test-helpers")] +pub fn grow_storage_value(mut value: Vec, params: &UnverifiedStorageProofParams) -> Vec { + if let Some(db_size) = params.db_size { + if db_size as usize > value.len() { + value.extend(sp_std::iter::repeat(42u8).take(db_size as usize - value.len())); + } + } + value +} + +/// Insert values in the provided trie at common-prefix keys in order to inflate the resulting +/// storage proof. +/// +/// This function can add at most 15 common-prefix keys per prefix nibble (4 bits). +/// Each such key adds about 33 bytes (a node) to the proof. +#[cfg(feature = "test-helpers")] +pub fn grow_storage_proof( + trie: &mut TrieDBMut, + prefix: Vec, + num_extra_nodes: usize, +) { + use sp_trie::TrieMut; + + let mut added_nodes = 0; + for i in 0..prefix.len() { + let mut prefix = prefix[0..=i].to_vec(); + // 1 byte has 2 nibbles (4 bits each) + let first_nibble = (prefix[i] & 0xf0) >> 4; + let second_nibble = prefix[i] & 0x0f; + + // create branches at the 1st nibble + for branch in 1..=15 { + if added_nodes >= num_extra_nodes { + return + } + + // create branches at the 1st nibble + prefix[i] = (first_nibble.wrapping_add(branch) % 16) << 4; + trie.insert(&prefix, &[0; 32]) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in benchmarks"); + added_nodes += 1; + } + + // create branches at the 2nd nibble + for branch in 1..=15 { + if added_nodes >= num_extra_nodes { + return + } + + prefix[i] = (first_nibble << 4) | (second_nibble.wrapping_add(branch) % 16); + trie.insert(&prefix, &[0; 32]) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in benchmarks"); + added_nodes += 1; + } + } + + assert_eq!(added_nodes, num_extra_nodes) +} + +/// Record all keys for a given root. +#[cfg(feature = "test-helpers")] +pub fn record_all_keys( + db: &DB, + root: &TrieHash, +) -> Result>> +where + DB: hash_db::HashDBRef, +{ + let mut recorder = Recorder::::new(); + let trie = TrieDBBuilder::::new(db, root).with_recorder(&mut recorder).build(); + for x in trie.iter()? { + let (key, _) = x?; + trie.get(&key)?; + } + + Ok(recorder.into_raw_storage_proof()) } /// Return valid storage proof and state root. @@ -157,7 +289,7 @@ pub fn craft_valid_storage_proof() -> (sp_core::H256, RawStorageProof) { // construct storage proof let backend = >::from(( - vec![ + sp_std::vec![ (None, vec![(b"key1".to_vec(), Some(b"value1".to_vec()))]), (None, vec![(b"key2".to_vec(), Some(b"value2".to_vec()))]), (None, vec![(b"key3".to_vec(), Some(b"value3".to_vec()))]), @@ -167,33 +299,15 @@ pub fn craft_valid_storage_proof() -> (sp_core::H256, RawStorageProof) { ], state_version, )); - let root = backend.storage_root(std::iter::empty(), state_version).0; + let root = backend.storage_root(sp_std::iter::empty(), state_version).0; let proof = prove_read(backend, &[&b"key1"[..], &b"key2"[..], &b"key4"[..], &b"key22"[..]]).unwrap(); (root, proof.into_nodes().into_iter().collect()) } -/// Record all keys for a given root. -pub fn record_all_keys( - db: &DB, - root: &TrieHash, -) -> Result>> -where - DB: hash_db::HashDBRef, -{ - let mut recorder = Recorder::::new(); - let trie = TrieDBBuilder::::new(db, root).with_recorder(&mut recorder).build(); - for x in trie.iter()? { - let (key, _) = x?; - trie.get(&key)?; - } - - Ok(recorder.into_raw_storage_proof()) -} - #[cfg(test)] -pub mod tests { +pub mod tests_for_storage_proof_checker { use super::*; use codec::Encode; @@ -207,18 +321,21 @@ pub mod tests { assert_eq!(checker.read_value(b"key1"), Ok(Some(b"value1".to_vec()))); assert_eq!(checker.read_value(b"key2"), Ok(Some(b"value2".to_vec()))); assert_eq!(checker.read_value(b"key4"), Ok(Some((42u64, 42u32, 42u16, 42u8).encode()))); - assert_eq!(checker.read_value(b"key11111"), Err(Error::StorageValueUnavailable)); + assert_eq!( + checker.read_value(b"key11111"), + Err(StorageProofError::StorageValueUnavailable) + ); assert_eq!(checker.read_value(b"key22"), Ok(None)); assert_eq!(checker.read_and_decode_value(b"key4"), Ok(Some((42u64, 42u32, 42u16, 42u8))),); assert!(matches!( checker.read_and_decode_value::<[u8; 64]>(b"key4"), - Err(Error::StorageValueDecodeFailed(_)), + Err(StorageProofError::DecodeError), )); // checking proof against invalid commitment fails assert_eq!( >::new(sp_core::H256::random(), proof).err(), - Some(Error::StorageRootMismatch) + Some(StorageProofError::StorageRootMismatch) ); } @@ -235,9 +352,6 @@ pub mod tests { assert_eq!(checker.ensure_no_unused_nodes(), Ok(())); let checker = StorageProofChecker::::new(root, proof).unwrap(); - assert_eq!( - checker.ensure_no_unused_nodes(), - Err(Error::AccessedNodesTracker(AccessedNodesTrackerError::UnusedNodes.into())) - ); + assert_eq!(checker.ensure_no_unused_nodes(), Err(StorageProofError::UnusedKey)); } } diff --git a/bridges/primitives/test-utils/Cargo.toml b/bridges/primitives/test-utils/Cargo.toml index 0b7fb3fec07..5e6e3893393 100644 --- a/bridges/primitives/test-utils/Cargo.toml +++ b/bridges/primitives/test-utils/Cargo.toml @@ -14,7 +14,7 @@ workspace = true bp-header-chain = { workspace = true } bp-parachains = { workspace = true } bp-polkadot-core = { workspace = true } -bp-runtime = { workspace = true } +bp-runtime = { features = ["test-helpers"], workspace = true } codec = { workspace = true } ed25519-dalek = { workspace = true } finality-grandpa = { workspace = true } diff --git a/bridges/primitives/test-utils/src/lib.rs b/bridges/primitives/test-utils/src/lib.rs index f4fe4a242e7..9855c32a468 100644 --- a/bridges/primitives/test-utils/src/lib.rs +++ b/bridges/primitives/test-utils/src/lib.rs @@ -177,6 +177,7 @@ pub fn prepare_parachain_heads_proof( let mut parachains = Vec::with_capacity(heads.len()); let mut root = Default::default(); let mut mdb = MemoryDB::default(); + let mut storage_keys = vec![]; { let mut trie = TrieDBMutBuilderV1::::new(&mut mdb, &mut root).build(); for (parachain, head) in heads { @@ -185,11 +186,12 @@ pub fn prepare_parachain_heads_proof( trie.insert(&storage_key.0, &head.encode()) .map_err(|_| "TrieMut::insert has failed") .expect("TrieMut::insert should not fail in tests"); + storage_keys.push(storage_key.0); parachains.push((ParaId(parachain), head.hash())); } } - // generate storage proof to be delivered to This chain + // generate storage proof to be delivered to this chain let storage_proof = record_all_trie_keys::, _>(&mdb, &root) .map_err(|_| "record_all_trie_keys has failed") .expect("record_all_trie_keys should not fail in benchmarks"); diff --git a/bridges/relays/client-substrate/Cargo.toml b/bridges/relays/client-substrate/Cargo.toml index 66501d03691..969cd73d619 100644 --- a/bridges/relays/client-substrate/Cargo.toml +++ b/bridges/relays/client-substrate/Cargo.toml @@ -31,15 +31,12 @@ bp-header-chain = { workspace = true, default-features = true } bp-messages = { workspace = true, default-features = true } bp-polkadot-core = { workspace = true, default-features = true } bp-runtime = { workspace = true, default-features = true } -pallet-bridge-messages = { workspace = true, default-features = true } finality-relay = { workspace = true } relay-utils = { workspace = true } # Substrate Dependencies frame-support = { workspace = true, default-features = true } -frame-system = { workspace = true, default-features = true } -pallet-balances = { workspace = true, default-features = true } pallet-transaction-payment = { workspace = true, default-features = true } pallet-transaction-payment-rpc-runtime-api = { workspace = true, default-features = true } pallet-utility = { workspace = true, default-features = true } diff --git a/bridges/relays/client-substrate/src/client/caching.rs b/bridges/relays/client-substrate/src/client/caching.rs index cb898cf5172..a574e5985bc 100644 --- a/bridges/relays/client-substrate/src/client/caching.rs +++ b/bridges/relays/client-substrate/src/client/caching.rs @@ -462,7 +462,11 @@ impl> Client for CachingClient { .await } - async fn prove_storage(&self, at: HashOf, keys: Vec) -> Result { + async fn prove_storage( + &self, + at: HashOf, + keys: Vec, + ) -> Result<(StorageProof, HashOf)> { self.backend.prove_storage(at, keys).await } } diff --git a/bridges/relays/client-substrate/src/client/rpc.rs b/bridges/relays/client-substrate/src/client/rpc.rs index bf7442a9514..9c7f769462e 100644 --- a/bridges/relays/client-substrate/src/client/rpc.rs +++ b/bridges/relays/client-substrate/src/client/rpc.rs @@ -52,7 +52,10 @@ use sp_core::{ storage::{StorageData, StorageKey}, Bytes, Hasher, Pair, }; -use sp_runtime::transaction_validity::{TransactionSource, TransactionValidity}; +use sp_runtime::{ + traits::Header, + transaction_validity::{TransactionSource, TransactionValidity}, +}; use sp_trie::StorageProof; use sp_version::RuntimeVersion; use std::{cmp::Ordering, future::Future, marker::PhantomData}; @@ -635,16 +638,25 @@ impl Client for RpcClient { .map_err(|e| Error::failed_state_call::(at, method_clone, arguments_clone, e)) } - async fn prove_storage(&self, at: HashOf, keys: Vec) -> Result { + async fn prove_storage( + &self, + at: HashOf, + keys: Vec, + ) -> Result<(StorageProof, HashOf)> { + let state_root = *self.header_by_hash(at).await?.state_root(); + let keys_clone = keys.clone(); - self.jsonrpsee_execute(move |client| async move { - SubstrateStateClient::::prove_storage(&*client, keys, Some(at)) - .await - .map(|proof| StorageProof::new(proof.proof.into_iter().map(|b| b.0))) - .map_err(Into::into) - }) - .await - .map_err(|e| Error::failed_to_prove_storage::(at, keys_clone, e)) + let read_proof = self + .jsonrpsee_execute(move |client| async move { + SubstrateStateClient::::prove_storage(&*client, keys_clone, Some(at)) + .await + .map(|proof| StorageProof::new(proof.proof.into_iter().map(|b| b.0))) + .map_err(Into::into) + }) + .await + .map_err(|e| Error::failed_to_prove_storage::(at, keys.clone(), e))?; + + Ok((read_proof, state_root)) } } diff --git a/bridges/relays/client-substrate/src/client/traits.rs b/bridges/relays/client-substrate/src/client/traits.rs index 49f5c001c3f..6f4ef5aa951 100644 --- a/bridges/relays/client-substrate/src/client/traits.rs +++ b/bridges/relays/client-substrate/src/client/traits.rs @@ -225,6 +225,10 @@ pub trait Client: 'static + Send + Sync + Clone + Debug { }) } - /// Returns storage proof of given storage keys. - async fn prove_storage(&self, at: HashOf, keys: Vec) -> Result; + /// Returns storage proof of given storage keys and state root. + async fn prove_storage( + &self, + at: HashOf, + keys: Vec, + ) -> Result<(StorageProof, HashOf)>; } diff --git a/bridges/relays/client-substrate/src/error.rs b/bridges/relays/client-substrate/src/error.rs index b09e2c7abdc..ee3c73f806e 100644 --- a/bridges/relays/client-substrate/src/error.rs +++ b/bridges/relays/client-substrate/src/error.rs @@ -213,9 +213,6 @@ pub enum Error { /// The bridge pallet is not yet initialized and all transactions will be rejected. #[error("Bridge pallet is not initialized.")] BridgePalletIsNotInitialized, - /// An error has happened when we have tried to parse storage proof. - #[error("Error when parsing storage proof: {0:?}.")] - StorageProofError(bp_runtime::StorageProofError), /// The Substrate transaction is invalid. #[error("Substrate transaction is invalid: {0:?}")] TransactionInvalid(#[from] TransactionValidityError), diff --git a/bridges/relays/client-substrate/src/test_chain.rs b/bridges/relays/client-substrate/src/test_chain.rs index cfd241c022a..991202e9874 100644 --- a/bridges/relays/client-substrate/src/test_chain.rs +++ b/bridges/relays/client-substrate/src/test_chain.rs @@ -24,7 +24,7 @@ use crate::{Chain, ChainWithBalances, ChainWithMessages}; use bp_messages::{ChainWithMessages as ChainWithMessagesBase, MessageNonce}; use bp_runtime::ChainId; -use frame_support::weights::Weight; +use frame_support::{sp_runtime::StateVersion, weights::Weight}; use std::time::Duration; /// Chain that may be used in tests. @@ -44,6 +44,8 @@ impl bp_runtime::Chain for TestChain { type Nonce = u32; type Signature = sp_runtime::testing::TestSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { 100000 } @@ -100,6 +102,8 @@ impl bp_runtime::Chain for TestParachainBase { type Nonce = u32; type Signature = sp_runtime::testing::TestSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { unreachable!() } diff --git a/bridges/relays/finality/src/base.rs b/bridges/relays/finality/src/base.rs index 4253468eaac..8704bff9549 100644 --- a/bridges/relays/finality/src/base.rs +++ b/bridges/relays/finality/src/base.rs @@ -45,7 +45,3 @@ pub trait SourceClientBase: RelayClient { /// Subscribe to new finality proofs. async fn finality_proofs(&self) -> Result; } - -/// Target client used in finality related loops. -#[async_trait] -pub trait TargetClientBase: RelayClient {} diff --git a/bridges/relays/lib-substrate-relay/Cargo.toml b/bridges/relays/lib-substrate-relay/Cargo.toml index 28fee5b167f..b0f93e5b548 100644 --- a/bridges/relays/lib-substrate-relay/Cargo.toml +++ b/bridges/relays/lib-substrate-relay/Cargo.toml @@ -25,15 +25,12 @@ strum = { features = ["derive"], workspace = true, default-features = true } thiserror = { workspace = true } # Bridge dependencies - bp-header-chain = { workspace = true, default-features = true } bp-parachains = { workspace = true, default-features = true } bp-polkadot-core = { workspace = true, default-features = true } bp-relayers = { workspace = true, default-features = true } -bridge-runtime-common = { workspace = true, default-features = true } equivocation-detector = { workspace = true } -finality-grandpa = { workspace = true, default-features = true } finality-relay = { workspace = true } parachains-relay = { workspace = true } relay-utils = { workspace = true } @@ -48,7 +45,6 @@ bp-runtime = { workspace = true, default-features = true } bp-messages = { workspace = true, default-features = true } # Substrate Dependencies - frame-support = { workspace = true, default-features = true } frame-system = { workspace = true, default-features = true } pallet-balances = { workspace = true, default-features = true } @@ -56,7 +52,9 @@ pallet-grandpa = { workspace = true, default-features = true } sp-core = { workspace = true, default-features = true } sp-consensus-grandpa = { workspace = true, default-features = true } sp-runtime = { workspace = true, default-features = true } +sp-trie = { workspace = true } [dev-dependencies] +scale-info = { features = ["derive"], workspace = true } pallet-transaction-payment = { workspace = true, default-features = true } relay-substrate-client = { features = ["test-helpers"], workspace = true } diff --git a/bridges/relays/lib-substrate-relay/src/cli/bridge.rs b/bridges/relays/lib-substrate-relay/src/cli/bridge.rs index 316f59a2b0c..5631285b3c5 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/bridge.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/bridge.rs @@ -19,7 +19,7 @@ use crate::{ equivocation::SubstrateEquivocationDetectionPipeline, finality::SubstrateFinalitySyncPipeline, - messages_lane::{MessagesRelayLimits, SubstrateMessageLane}, + messages::{MessagesRelayLimits, SubstrateMessageLane}, parachains::SubstrateParachainsPipeline, }; use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs index 05a061c2ea6..338dda3c633 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs @@ -38,7 +38,7 @@ use futures::{FutureExt, TryFutureExt}; use crate::{ cli::{bridge::MessagesCliBridge, DefaultClient, HexLaneId, PrometheusParams}, - messages_lane::{MessagesRelayLimits, MessagesRelayParams}, + messages::{MessagesRelayLimits, MessagesRelayParams}, on_demand::OnDemandRelay, HeadersToRelay, TaggedAccount, TransactionParams, }; @@ -298,14 +298,14 @@ where .collect::>(); { let common = self.mut_base().mut_common(); - crate::messages_metrics::add_relay_balances_metrics::<_, Self::Right>( + crate::messages::metrics::add_relay_balances_metrics::<_, Self::Right>( common.left.client.clone(), &common.metrics_params, &common.left.accounts, &lanes, ) .await?; - crate::messages_metrics::add_relay_balances_metrics::<_, Self::Left>( + crate::messages::metrics::add_relay_balances_metrics::<_, Self::Left>( common.right.client.clone(), &common.metrics_params, &common.right.accounts, @@ -318,7 +318,7 @@ where let mut message_relays = Vec::with_capacity(lanes.len() * 2); for lane in lanes { let left_to_right_messages = - crate::messages_lane::run::<::MessagesLane, _, _>( + crate::messages::run::<::MessagesLane, _, _>( self.left_to_right().messages_relay_params( left_to_right_on_demand_headers.clone(), right_to_left_on_demand_headers.clone(), @@ -331,7 +331,7 @@ where message_relays.push(left_to_right_messages); let right_to_left_messages = - crate::messages_lane::run::<::MessagesLane, _, _>( + crate::messages::run::<::MessagesLane, _, _>( self.right_to_left().messages_relay_params( right_to_left_on_demand_headers.clone(), left_to_right_on_demand_headers.clone(), diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs index a17ae7c0c01..68bbe71ae59 100644 --- a/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs @@ -18,7 +18,7 @@ use crate::{ cli::{bridge::*, chain_schema::*, HexLaneId, PrometheusParams}, - messages_lane::MessagesRelayParams, + messages::MessagesRelayParams, TransactionParams, }; @@ -117,7 +117,7 @@ where let target_sign = data.target_sign.to_keypair::()?; let target_transactions_mortality = data.target_sign.transactions_mortality()?; - crate::messages_lane::run::(MessagesRelayParams { + crate::messages::run::(MessagesRelayParams { source_client, source_transaction_params: TransactionParams { signer: source_sign, @@ -161,7 +161,7 @@ where })? .id(); - crate::messages_lane::relay_messages_range::( + crate::messages::relay_messages_range::( source_client, target_client, TransactionParams { signer: source_sign, mortality: source_transactions_mortality }, @@ -197,7 +197,7 @@ where })? .id(); - crate::messages_lane::relay_messages_delivery_confirmation::( + crate::messages::relay_messages_delivery_confirmation::( source_client, target_client, TransactionParams { signer: source_sign, mortality: source_transactions_mortality }, diff --git a/bridges/relays/lib-substrate-relay/src/lib.rs b/bridges/relays/lib-substrate-relay/src/lib.rs index b3e8e7ed9a2..c004540a9f4 100644 --- a/bridges/relays/lib-substrate-relay/src/lib.rs +++ b/bridges/relays/lib-substrate-relay/src/lib.rs @@ -30,10 +30,7 @@ pub mod equivocation; pub mod error; pub mod finality; pub mod finality_base; -pub mod messages_lane; -pub mod messages_metrics; -pub mod messages_source; -pub mod messages_target; +pub mod messages; pub mod on_demand; pub mod parachains; @@ -130,3 +127,17 @@ impl BatchCallBuilder for () { unreachable!("never called, because ()::new_builder() returns None; qed") } } + +/// Module for handling storage proofs compatibility. +pub mod proofs { + use bp_runtime::{HashOf, RawStorageProof}; + use relay_substrate_client::Chain; + use sp_trie::StorageProof; + + /// Converts proof to `RawStorageProof` type. + pub fn to_raw_storage_proof( + proof: (StorageProof, HashOf), + ) -> RawStorageProof { + proof.0.into_iter_nodes().collect() + } +} diff --git a/bridges/relays/lib-substrate-relay/src/messages_metrics.rs b/bridges/relays/lib-substrate-relay/src/messages/metrics.rs similarity index 100% rename from bridges/relays/lib-substrate-relay/src/messages_metrics.rs rename to bridges/relays/lib-substrate-relay/src/messages/metrics.rs diff --git a/bridges/relays/lib-substrate-relay/src/messages_lane.rs b/bridges/relays/lib-substrate-relay/src/messages/mod.rs similarity index 63% rename from bridges/relays/lib-substrate-relay/src/messages_lane.rs rename to bridges/relays/lib-substrate-relay/src/messages/mod.rs index e3786dcdc5e..e52b7020666 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_lane.rs +++ b/bridges/relays/lib-substrate-relay/src/messages/mod.rs @@ -17,20 +17,21 @@ //! Tools for supporting message lanes between two Substrate-based chains. use crate::{ - messages_source::{SubstrateMessagesProof, SubstrateMessagesSource}, - messages_target::{SubstrateMessagesDeliveryProof, SubstrateMessagesTarget}, + messages::{ + source::{SubstrateMessagesProof, SubstrateMessagesSource}, + target::{SubstrateMessagesDeliveryProof, SubstrateMessagesTarget}, + }, on_demand::OnDemandRelay, BatchCallBuilder, BatchCallBuilderConstructor, TransactionParams, }; use async_std::sync::Arc; -use bp_messages::{ChainWithMessages as _, LaneId, MessageNonce}; +use bp_messages::{ + target_chain::FromBridgedChainMessagesProof, ChainWithMessages as _, LaneId, MessageNonce, +}; use bp_runtime::{ AccountIdOf, Chain as _, EncodedOrDecodedCall, HeaderIdOf, TransactionEra, WeightExtraOps, }; -use bridge_runtime_common::messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, -}; use codec::Encode; use frame_support::{dispatch::GetDispatchInfo, weights::Weight}; use messages_relay::{message_lane::MessageLane, message_lane_loop::BatchTransaction}; @@ -48,6 +49,10 @@ use sp_core::Pair; use sp_runtime::traits::Zero; use std::{fmt::Debug, marker::PhantomData, ops::RangeInclusive}; +pub mod metrics; +pub mod source; +pub mod target; + /// Substrate -> Substrate messages synchronization pipeline. pub trait SubstrateMessageLane: 'static + Clone + Debug + Send + Sync { /// Messages of this chain are relayed to the `TargetChain`. @@ -383,11 +388,10 @@ pub struct DirectReceiveMessagesProofCallBuilder { impl ReceiveMessagesProofCallBuilder

    for DirectReceiveMessagesProofCallBuilder where P: SubstrateMessageLane, - R: BridgeMessagesConfig>, + R: BridgeMessagesConfig, I: 'static, - R::SourceHeaderChain: bp_messages::target_chain::SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof>, - >, + R::BridgedChain: + bp_runtime::Chain, Hash = HashOf>, CallOf: From> + GetDispatchInfo, { fn build_receive_messages_proof_call( @@ -399,7 +403,7 @@ where ) -> CallOf { let call: CallOf = BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain: relayer_id_at_source, - proof: proof.1, + proof: proof.1.into(), messages_count, dispatch_weight, } @@ -432,26 +436,26 @@ macro_rules! generate_receive_message_proof_call_builder { ($pipeline:ident, $mocked_builder:ident, $bridge_messages:path, $receive_messages_proof:path) => { pub struct $mocked_builder; - impl $crate::messages_lane::ReceiveMessagesProofCallBuilder<$pipeline> + impl $crate::messages::ReceiveMessagesProofCallBuilder<$pipeline> for $mocked_builder { fn build_receive_messages_proof_call( relayer_id_at_source: relay_substrate_client::AccountIdOf< - <$pipeline as $crate::messages_lane::SubstrateMessageLane>::SourceChain + <$pipeline as $crate::messages::SubstrateMessageLane>::SourceChain >, - proof: $crate::messages_source::SubstrateMessagesProof< - <$pipeline as $crate::messages_lane::SubstrateMessageLane>::SourceChain + proof: $crate::messages::source::SubstrateMessagesProof< + <$pipeline as $crate::messages::SubstrateMessageLane>::SourceChain >, messages_count: u32, dispatch_weight: bp_messages::Weight, _trace_call: bool, ) -> relay_substrate_client::CallOf< - <$pipeline as $crate::messages_lane::SubstrateMessageLane>::TargetChain + <$pipeline as $crate::messages::SubstrateMessageLane>::TargetChain > { bp_runtime::paste::item! { $bridge_messages($receive_messages_proof { relayer_id_at_bridged_chain: relayer_id_at_source, - proof: proof.1, + proof: proof.1.into(), messages_count: messages_count, dispatch_weight: dispatch_weight, }) @@ -483,11 +487,7 @@ where P: SubstrateMessageLane, R: BridgeMessagesConfig, I: 'static, - R::TargetHeaderChain: bp_messages::source_chain::TargetHeaderChain< - R::OutboundPayload, - R::AccountId, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof>, - >, + R::BridgedChain: bp_runtime::Chain>, CallOf: From> + GetDispatchInfo, { fn build_receive_messages_delivery_proof_call( @@ -496,7 +496,7 @@ where ) -> CallOf { let call: CallOf = BridgeMessagesCall::::receive_messages_delivery_proof { - proof: proof.1, + proof: proof.1.into(), relayers_state: proof.0, } .into(); @@ -528,16 +528,16 @@ macro_rules! generate_receive_message_delivery_proof_call_builder { ($pipeline:ident, $mocked_builder:ident, $bridge_messages:path, $receive_messages_delivery_proof:path) => { pub struct $mocked_builder; - impl $crate::messages_lane::ReceiveMessagesDeliveryProofCallBuilder<$pipeline> + impl $crate::messages::ReceiveMessagesDeliveryProofCallBuilder<$pipeline> for $mocked_builder { fn build_receive_messages_delivery_proof_call( - proof: $crate::messages_target::SubstrateMessagesDeliveryProof< - <$pipeline as $crate::messages_lane::SubstrateMessageLane>::TargetChain + proof: $crate::messages::target::SubstrateMessagesDeliveryProof< + <$pipeline as $crate::messages::SubstrateMessageLane>::TargetChain >, _trace_call: bool, ) -> relay_substrate_client::CallOf< - <$pipeline as $crate::messages_lane::SubstrateMessageLane>::SourceChain + <$pipeline as $crate::messages::SubstrateMessageLane>::SourceChain > { bp_runtime::paste::item! { $bridge_messages($receive_messages_delivery_proof { @@ -643,13 +643,7 @@ where Weight::zero(), FromBridgedChainMessagesProof { bridged_header_hash: Default::default(), - // we may use per-chain `EXTRA_STORAGE_PROOF_SIZE`, but since we don't need - // exact values, this global estimation is fine - storage_proof: vec![vec![ - 42u8; - pallet_bridge_messages::EXTRA_STORAGE_PROOF_SIZE - as usize - ]], + storage_proof: Default::default(), lane: Default::default(), nonces_start: 1, nonces_end: messages as u64, @@ -675,3 +669,362 @@ where ) .map_err(Into::into) } + +#[cfg(test)] +mod tests { + use super::*; + use bp_messages::{ + source_chain::FromBridgedChainMessagesDeliveryProof, UnrewardedRelayersState, + }; + use relay_substrate_client::calls::{UtilityCall as MockUtilityCall, UtilityCall}; + + #[derive(codec::Decode, codec::Encode, Clone, Debug, PartialEq)] + pub enum RuntimeCall { + #[codec(index = 53)] + BridgeMessages(CodegenBridgeMessagesCall), + #[codec(index = 123)] + Utility(UtilityCall), + } + pub type CodegenBridgeMessagesCall = bp_messages::BridgeMessagesCall< + u64, + Box>, + FromBridgedChainMessagesDeliveryProof, + >; + + impl From> for RuntimeCall { + fn from(value: MockUtilityCall) -> RuntimeCall { + match value { + MockUtilityCall::batch_all(calls) => + RuntimeCall::Utility(UtilityCall::::batch_all(calls)), + } + } + } + + #[test] + fn ensure_macro_compatibility_for_generate_receive_message_proof_call_builder() { + // data + let receive_messages_proof = FromBridgedChainMessagesProof { + bridged_header_hash: Default::default(), + storage_proof: Default::default(), + lane: LaneId([0, 0, 0, 0]), + nonces_start: 0, + nonces_end: 0, + }; + let account = 1234; + let messages_count = 0; + let dispatch_weight = Default::default(); + + // construct pallet Call directly + let pallet_receive_messages_proof = + pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain: account, + proof: receive_messages_proof.clone().into(), + messages_count, + dispatch_weight, + }; + + // construct mock enum Call + let mock_enum_receive_messages_proof = CodegenBridgeMessagesCall::receive_messages_proof { + relayer_id_at_bridged_chain: account, + proof: receive_messages_proof.clone().into(), + messages_count, + dispatch_weight, + }; + + // now we should be able to use macro `generate_receive_message_proof_call_builder` + let relayer_call_builder_receive_messages_proof = relayer::ThisChainToBridgedChainMessageLaneReceiveMessagesProofCallBuilder::build_receive_messages_proof_call( + account, + (Default::default(), receive_messages_proof), + messages_count, + dispatch_weight, + false, + ); + + // ensure they are all equal + assert_eq!( + pallet_receive_messages_proof.encode(), + mock_enum_receive_messages_proof.encode() + ); + match relayer_call_builder_receive_messages_proof { + RuntimeCall::BridgeMessages(call) => match call { + call @ CodegenBridgeMessagesCall::receive_messages_proof { .. } => + assert_eq!(pallet_receive_messages_proof.encode(), call.encode()), + _ => panic!("Unexpected CodegenBridgeMessagesCall type"), + }, + _ => panic!("Unexpected RuntimeCall type"), + }; + } + + #[test] + fn ensure_macro_compatibility_for_generate_receive_message_delivery_proof_call_builder() { + // data + let receive_messages_delivery_proof = FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: Default::default(), + storage_proof: Default::default(), + lane: LaneId([0, 0, 0, 0]), + }; + let relayers_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 0, + messages_in_oldest_entry: 0, + total_messages: 0, + last_delivered_nonce: 0, + }; + + // construct pallet Call directly + let pallet_receive_messages_delivery_proof = + pallet_bridge_messages::Call::::receive_messages_delivery_proof { + proof: receive_messages_delivery_proof.clone(), + relayers_state: relayers_state.clone(), + }; + + // construct mock enum Call + let mock_enum_receive_messages_delivery_proof = + CodegenBridgeMessagesCall::receive_messages_delivery_proof { + proof: receive_messages_delivery_proof.clone(), + relayers_state: relayers_state.clone(), + }; + + // now we should be able to use macro `generate_receive_message_proof_call_builder` + let relayer_call_builder_receive_messages_delivery_proof = relayer::ThisChainToBridgedChainMessageLaneReceiveMessagesDeliveryProofCallBuilder::build_receive_messages_delivery_proof_call( + (relayers_state, receive_messages_delivery_proof), + false, + ); + + // ensure they are all equal + assert_eq!( + pallet_receive_messages_delivery_proof.encode(), + mock_enum_receive_messages_delivery_proof.encode() + ); + match relayer_call_builder_receive_messages_delivery_proof { + RuntimeCall::BridgeMessages(call) => match call { + call @ CodegenBridgeMessagesCall::receive_messages_delivery_proof { .. } => + assert_eq!(pallet_receive_messages_delivery_proof.encode(), call.encode()), + _ => panic!("Unexpected CodegenBridgeMessagesCall type"), + }, + _ => panic!("Unexpected RuntimeCall type"), + }; + } + + // mock runtime with `pallet_bridge_messages` + mod mock { + use super::super::*; + use bp_messages::target_chain::ForbidInboundMessages; + use bp_runtime::ChainId; + use frame_support::derive_impl; + use sp_core::H256; + use sp_runtime::{ + generic, testing::Header as SubstrateHeader, traits::BlakeTwo256, StateVersion, + }; + + type Block = frame_system::mocking::MockBlock; + pub type SignedBlock = generic::SignedBlock; + + frame_support::construct_runtime! { + pub enum TestRuntime + { + System: frame_system, + Messages: pallet_bridge_messages, + } + } + + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] + impl frame_system::Config for TestRuntime { + type Block = Block; + } + + impl pallet_bridge_messages::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); + type ThisChain = ThisUnderlyingChain; + type BridgedChain = BridgedUnderlyingChain; + type BridgedHeaderChain = BridgedHeaderChain; + type ActiveOutboundLanes = (); + type OutboundPayload = Vec; + type InboundPayload = Vec; + type DeliveryPayments = (); + type DeliveryConfirmationPayments = (); + type OnMessagesDelivered = (); + type MessageDispatch = ForbidInboundMessages>; + } + + pub struct ThisUnderlyingChain; + + impl bp_runtime::Chain for ThisUnderlyingChain { + const ID: ChainId = *b"tuch"; + type BlockNumber = u64; + type Hash = H256; + type Hasher = BlakeTwo256; + type Header = SubstrateHeader; + type AccountId = u64; + type Balance = u64; + type Nonce = u64; + type Signature = sp_runtime::MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { + u32::MAX + } + fn max_extrinsic_weight() -> Weight { + Weight::MAX + } + } + + impl bp_messages::ChainWithMessages for ThisUnderlyingChain { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = ""; + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 16; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 1000; + } + + pub struct BridgedUnderlyingChain; + + pub type BridgedHeaderHash = H256; + pub type BridgedChainHeader = SubstrateHeader; + + impl bp_runtime::Chain for BridgedUnderlyingChain { + const ID: ChainId = *b"bgdc"; + type BlockNumber = u64; + type Hash = BridgedHeaderHash; + type Hasher = BlakeTwo256; + type Header = BridgedChainHeader; + type AccountId = u64; + type Balance = u64; + type Nonce = u64; + type Signature = sp_runtime::MultiSignature; + const STATE_VERSION: StateVersion = StateVersion::V1; + fn max_extrinsic_size() -> u32 { + 4096 + } + fn max_extrinsic_weight() -> Weight { + Weight::MAX + } + } + + impl bp_messages::ChainWithMessages for BridgedUnderlyingChain { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = ""; + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 16; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 1000; + } + + pub struct BridgedHeaderChain; + + impl bp_header_chain::HeaderChain for BridgedHeaderChain { + fn finalized_header_state_root( + _hash: HashOf, + ) -> Option> { + unreachable!() + } + } + } + + // relayer configuration + mod relayer { + use super::*; + use crate::{ + messages::{ + tests::{mock, RuntimeCall}, + SubstrateMessageLane, + }, + UtilityPalletBatchCallBuilder, + }; + use bp_runtime::UnderlyingChainProvider; + use relay_substrate_client::{MockedRuntimeUtilityPallet, SignParam, UnsignedTransaction}; + use std::time::Duration; + + #[derive(Clone)] + pub struct ThisChain; + impl UnderlyingChainProvider for ThisChain { + type Chain = mock::ThisUnderlyingChain; + } + impl relay_substrate_client::Chain for ThisChain { + const NAME: &'static str = ""; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = ""; + const FREE_HEADERS_INTERVAL_METHOD: &'static str = ""; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_millis(0); + type SignedBlock = mock::SignedBlock; + type Call = RuntimeCall; + } + impl relay_substrate_client::ChainWithTransactions for ThisChain { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = (); + + fn sign_transaction( + _: SignParam, + _: UnsignedTransaction, + ) -> Result + where + Self: Sized, + { + todo!() + } + } + impl relay_substrate_client::ChainWithMessages for ThisChain { + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str> = None; + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = ""; + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = ""; + } + impl relay_substrate_client::ChainWithUtilityPallet for ThisChain { + type UtilityPallet = MockedRuntimeUtilityPallet; + } + + #[derive(Clone)] + pub struct BridgedChain; + impl UnderlyingChainProvider for BridgedChain { + type Chain = mock::BridgedUnderlyingChain; + } + impl relay_substrate_client::Chain for BridgedChain { + const NAME: &'static str = ""; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = ""; + const FREE_HEADERS_INTERVAL_METHOD: &'static str = ""; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_millis(0); + type SignedBlock = mock::SignedBlock; + type Call = RuntimeCall; + } + impl relay_substrate_client::ChainWithTransactions for BridgedChain { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = (); + + fn sign_transaction( + _: SignParam, + _: UnsignedTransaction, + ) -> Result + where + Self: Sized, + { + todo!() + } + } + impl relay_substrate_client::ChainWithMessages for BridgedChain { + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str> = None; + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = ""; + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = ""; + } + impl relay_substrate_client::ChainWithUtilityPallet for BridgedChain { + type UtilityPallet = MockedRuntimeUtilityPallet; + } + + #[derive(Clone, Debug)] + pub struct ThisChainToBridgedChainMessageLane; + impl SubstrateMessageLane for ThisChainToBridgedChainMessageLane { + type SourceChain = ThisChain; + type TargetChain = BridgedChain; + type ReceiveMessagesProofCallBuilder = + ThisChainToBridgedChainMessageLaneReceiveMessagesProofCallBuilder; + type ReceiveMessagesDeliveryProofCallBuilder = + ThisChainToBridgedChainMessageLaneReceiveMessagesDeliveryProofCallBuilder; + type SourceBatchCallBuilder = UtilityPalletBatchCallBuilder; + type TargetBatchCallBuilder = UtilityPalletBatchCallBuilder; + } + + generate_receive_message_proof_call_builder!( + ThisChainToBridgedChainMessageLane, + ThisChainToBridgedChainMessageLaneReceiveMessagesProofCallBuilder, + RuntimeCall::BridgeMessages, + CodegenBridgeMessagesCall::receive_messages_proof + ); + generate_receive_message_delivery_proof_call_builder!( + ThisChainToBridgedChainMessageLane, + ThisChainToBridgedChainMessageLaneReceiveMessagesDeliveryProofCallBuilder, + RuntimeCall::BridgeMessages, + CodegenBridgeMessagesCall::receive_messages_delivery_proof + ); + } +} diff --git a/bridges/relays/lib-substrate-relay/src/messages_source.rs b/bridges/relays/lib-substrate-relay/src/messages/source.rs similarity index 97% rename from bridges/relays/lib-substrate-relay/src/messages_source.rs rename to bridges/relays/lib-substrate-relay/src/messages/source.rs index 1f597e278da..b75fc86d5ee 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_source.rs +++ b/bridges/relays/lib-substrate-relay/src/messages/source.rs @@ -20,11 +20,12 @@ use crate::{ finality_base::best_synced_header_id, - messages_lane::{ + messages::{ BatchProofTransaction, MessageLaneAdapter, ReceiveMessagesDeliveryProofCallBuilder, SubstrateMessageLane, }, on_demand::OnDemandRelay, + proofs::to_raw_storage_proof, TransactionParams, }; @@ -32,11 +33,11 @@ use async_std::sync::Arc; use async_trait::async_trait; use bp_messages::{ storage_keys::{operating_mode_key, outbound_lane_data_key}, + target_chain::FromBridgedChainMessagesProof, ChainWithMessages as _, InboundMessageDetails, LaneId, MessageNonce, MessagePayload, MessagesOperatingMode, OutboundLaneData, OutboundMessageDetails, }; -use bp_runtime::{BasicOperatingMode, HeaderIdProvider}; -use bridge_runtime_common::messages::target::FromBridgedChainMessagesProof; +use bp_runtime::{BasicOperatingMode, HeaderIdProvider, RangeInclusiveExt}; use codec::Encode; use frame_support::weights::Weight; use messages_relay::{ @@ -320,34 +321,27 @@ where ), SubstrateError, > { - let mut storage_keys = - Vec::with_capacity(nonces.end().saturating_sub(*nonces.start()) as usize + 1); - let mut message_nonce = *nonces.start(); - while message_nonce <= *nonces.end() { + let mut storage_keys = Vec::with_capacity(nonces.saturating_len() as usize); + for message_nonce in nonces.clone() { let message_key = bp_messages::storage_keys::message_key( P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, &self.lane_id, message_nonce, ); storage_keys.push(message_key); - message_nonce += 1; } if proof_parameters.outbound_state_proof_required { - storage_keys.push(bp_messages::storage_keys::outbound_lane_data_key( + storage_keys.push(outbound_lane_data_key( P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, &self.lane_id, )); } - let proof = self - .source_client - .prove_storage(id.1, storage_keys) - .await? - .into_iter_nodes() - .collect(); + let storage_proof = + self.source_client.prove_storage(id.hash(), storage_keys.clone()).await?; let proof = FromBridgedChainMessagesProof { bridged_header_hash: id.1, - storage_proof: proof, + storage_proof: to_raw_storage_proof::(storage_proof), lane: self.lane_id, nonces_start: *nonces.start(), nonces_end: *nonces.end(), diff --git a/bridges/relays/lib-substrate-relay/src/messages_target.rs b/bridges/relays/lib-substrate-relay/src/messages/target.rs similarity index 94% rename from bridges/relays/lib-substrate-relay/src/messages_target.rs rename to bridges/relays/lib-substrate-relay/src/messages/target.rs index e1c7645eac6..a6bf169cffb 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_target.rs +++ b/bridges/relays/lib-substrate-relay/src/messages/target.rs @@ -19,24 +19,25 @@ //! `` chain. use crate::{ - messages_lane::{ + messages::{ + source::{ + ensure_messages_pallet_active, read_client_state_from_both_chains, + SubstrateMessagesProof, + }, BatchProofTransaction, MessageLaneAdapter, ReceiveMessagesProofCallBuilder, SubstrateMessageLane, }, - messages_source::{ - ensure_messages_pallet_active, read_client_state_from_both_chains, SubstrateMessagesProof, - }, on_demand::OnDemandRelay, + proofs::to_raw_storage_proof, TransactionParams, }; use async_std::sync::Arc; use async_trait::async_trait; use bp_messages::{ - storage_keys::inbound_lane_data_key, ChainWithMessages as _, InboundLaneData, LaneId, - MessageNonce, UnrewardedRelayersState, + source_chain::FromBridgedChainMessagesDeliveryProof, storage_keys::inbound_lane_data_key, + ChainWithMessages as _, InboundLaneData, LaneId, MessageNonce, UnrewardedRelayersState, }; -use bridge_runtime_common::messages::source::FromBridgedChainMessagesDeliveryProof; use messages_relay::{ message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, message_lane_loop::{NoncesSubmitArtifacts, TargetClient, TargetClientState}, @@ -47,7 +48,7 @@ use relay_substrate_client::{ }; use relay_utils::relay_loop::Client as RelayClient; use sp_core::Pair; -use std::ops::RangeInclusive; +use std::{convert::TryFrom, ops::RangeInclusive}; /// Message receiving proof returned by the target Substrate node. pub type SubstrateMessagesDeliveryProof = @@ -231,19 +232,16 @@ where SubstrateError, > { let (id, relayers_state) = self.unrewarded_relayers_state(id).await?; - let inbound_data_key = bp_messages::storage_keys::inbound_lane_data_key( + let storage_keys = vec![inbound_lane_data_key( P::SourceChain::WITH_CHAIN_MESSAGES_PALLET_NAME, &self.lane_id, - ); - let proof = self - .target_client - .prove_storage(id.hash(), vec![inbound_data_key]) - .await? - .into_iter_nodes() - .collect(); + )]; + + let storage_proof = + self.target_client.prove_storage(id.hash(), storage_keys.clone()).await?; let proof = FromBridgedChainMessagesDeliveryProof { bridged_header_hash: id.1, - storage_proof: proof, + storage_proof: to_raw_storage_proof::(storage_proof), lane: self.lane_id, }; Ok((id, (relayers_state, proof))) diff --git a/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs b/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs index 654cb6628d5..4579222a2c6 100644 --- a/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs +++ b/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs @@ -17,7 +17,7 @@ //! On-demand Substrate -> Substrate parachain finality relay. use crate::{ - messages_source::best_finalized_peer_header_at_self, + messages::source::best_finalized_peer_header_at_self, on_demand::OnDemandRelay, parachains::{ source::ParachainsSource, target::ParachainsTarget, ParachainsPipelineAdapter, @@ -681,7 +681,7 @@ impl<'a, P: SubstrateParachainsPipeline, SourceRelayClnt, TargetClnt> async fn best_finalized_relay_block_at_target( &self, ) -> Result, SubstrateError> { - Ok(crate::messages_source::read_client_state::( + Ok(crate::messages::source::read_client_state::( &self.0.target_client, ) .await? diff --git a/bridges/relays/lib-substrate-relay/src/parachains/source.rs b/bridges/relays/lib-substrate-relay/src/parachains/source.rs index 11b9d6dbf5b..1aa12d1c913 100644 --- a/bridges/relays/lib-substrate-relay/src/parachains/source.rs +++ b/bridges/relays/lib-substrate-relay/src/parachains/source.rs @@ -16,8 +16,10 @@ //! Parachain heads source. -use crate::parachains::{ParachainsPipelineAdapter, SubstrateParachainsPipeline}; - +use crate::{ + parachains::{ParachainsPipelineAdapter, SubstrateParachainsPipeline}, + proofs::to_raw_storage_proof, +}; use async_std::sync::{Arc, Mutex}; use async_trait::async_trait; use bp_parachains::parachain_head_storage_key_at_source; @@ -153,12 +155,9 @@ where let parachain = ParaId(P::SourceParachain::PARACHAIN_ID); let storage_key = parachain_head_storage_key_at_source(P::SourceRelayChain::PARAS_PALLET_NAME, parachain); - let parachain_heads_proof = self - .client - .prove_storage(at_block.hash(), vec![storage_key.clone()]) - .await? - .into_iter_nodes() - .collect(); + + let storage_proof = + self.client.prove_storage(at_block.hash(), vec![storage_key.clone()]).await?; // why we're reading parachain head here once again (it has already been read at the // `parachain_head`)? that's because `parachain_head` sometimes returns obsolete parachain @@ -178,6 +177,11 @@ where })?; let parachain_head_hash = parachain_head.hash(); - Ok((ParaHeadsProof { storage_proof: parachain_heads_proof }, parachain_head_hash)) + Ok(( + ParaHeadsProof { + storage_proof: to_raw_storage_proof::(storage_proof), + }, + parachain_head_hash, + )) } } diff --git a/bridges/relays/messages/Cargo.toml b/bridges/relays/messages/Cargo.toml index 96e441fc673..c7a132bb3ba 100644 --- a/bridges/relays/messages/Cargo.toml +++ b/bridges/relays/messages/Cargo.toml @@ -13,7 +13,6 @@ workspace = true [dependencies] async-std = { features = ["attributes"], workspace = true } async-trait = { workspace = true } -env_logger = { workspace = true } futures = { workspace = true } hex = { workspace = true, default-features = true } log = { workspace = true } diff --git a/bridges/relays/parachains/src/parachains_loop.rs b/bridges/relays/parachains/src/parachains_loop.rs index fd73ca2d46c..0fd1d72c707 100644 --- a/bridges/relays/parachains/src/parachains_loop.rs +++ b/bridges/relays/parachains/src/parachains_loop.rs @@ -680,7 +680,6 @@ impl SubmittedHeadsTracker

    { mod tests { use super::*; use async_std::sync::{Arc, Mutex}; - use codec::Encode; use futures::{SinkExt, StreamExt}; use relay_substrate_client::test_chain::{TestChain, TestParachain}; use relay_utils::{HeaderId, MaybeConnectionError}; @@ -821,8 +820,7 @@ mod tests { let head_result = SourceClient::::parachain_head(self, at_block).await?; let head = head_result.as_available().unwrap(); - let storage_proof = vec![head.hash().encode()]; - let proof = (ParaHeadsProof { storage_proof }, head.hash()); + let proof = (ParaHeadsProof { storage_proof: Default::default() }, head.hash()); self.data.lock().await.source_proof.clone().map(|_| proof) } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs index 775bc3bdb80..0a86037391b 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_xcm_bridge_hub_router` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-07-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -49,32 +49,32 @@ use core::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_xcm_bridge_hub_router::WeightInfo for WeightInfo { /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) - /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: Some(4002), added: 4497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `ToWestendXcmRouter::Bridge` (r:1 w:1) /// Proof: `ToWestendXcmRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: 512, mode: `MaxEncodedLen`) fn on_initialize_when_non_congested() -> Weight { // Proof Size summary in bytes: // Measured: `154` - // Estimated: `1639` - // Minimum execution time: 7_853_000 picoseconds. - Weight::from_parts(8_443_000, 0) - .saturating_add(Weight::from_parts(0, 1639)) + // Estimated: `5487` + // Minimum execution time: 8_078_000 picoseconds. + Weight::from_parts(8_455_000, 0) + .saturating_add(Weight::from_parts(0, 5487)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) - /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: Some(4002), added: 4497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) fn on_initialize_when_congested() -> Weight { // Proof Size summary in bytes: // Measured: `144` - // Estimated: `1629` - // Minimum execution time: 4_333_000 picoseconds. - Weight::from_parts(4_501_000, 0) - .saturating_add(Weight::from_parts(0, 1629)) + // Estimated: `5487` + // Minimum execution time: 4_291_000 picoseconds. + Weight::from_parts(4_548_000, 0) + .saturating_add(Weight::from_parts(0, 5487)) .saturating_add(T::DbWeight::get().reads(2)) } /// Storage: `ToWestendXcmRouter::Bridge` (r:1 w:1) @@ -83,14 +83,12 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `150` // Estimated: `1502` - // Minimum execution time: 10_167_000 picoseconds. - Weight::from_parts(10_667_000, 0) + // Minimum execution time: 9_959_000 picoseconds. + Weight::from_parts(10_372_000, 0) .saturating_add(Weight::from_parts(0, 1502)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `PolkadotXcm::SupportedVersion` (r:2 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0x3302afcb67e838a3f960251b417b9a4f` (r:1 w:0) @@ -100,7 +98,9 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh /// Storage: `ToWestendXcmRouter::Bridge` (r:1 w:1) /// Proof: `ToWestendXcmRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: 512, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) - /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:2 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) @@ -108,17 +108,17 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) - /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: Some(4002), added: 4497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) - /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: Some(105506), added: 107981, mode: `MaxEncodedLen`) fn send_message() -> Weight { // Proof Size summary in bytes: // Measured: `448` // Estimated: `6388` - // Minimum execution time: 60_584_000 picoseconds. - Weight::from_parts(62_467_000, 0) + // Minimum execution time: 45_888_000 picoseconds. + Weight::from_parts(47_022_000, 0) .saturating_add(Weight::from_parts(0, 6388)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs index 84d717b0283..21d15c75af5 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_xcm_bridge_hub_router` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-07-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -49,48 +49,46 @@ use core::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_xcm_bridge_hub_router::WeightInfo for WeightInfo { /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) - /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: Some(4002), added: 4497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `ToRococoXcmRouter::Bridge` (r:1 w:1) /// Proof: `ToRococoXcmRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: 512, mode: `MaxEncodedLen`) fn on_initialize_when_non_congested() -> Weight { // Proof Size summary in bytes: - // Measured: `193` - // Estimated: `1678` - // Minimum execution time: 8_095_000 picoseconds. - Weight::from_parts(8_393_000, 0) - .saturating_add(Weight::from_parts(0, 1678)) + // Measured: `226` + // Estimated: `5487` + // Minimum execution time: 8_363_000 picoseconds. + Weight::from_parts(8_620_000, 0) + .saturating_add(Weight::from_parts(0, 5487)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) - /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: Some(4002), added: 4497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) fn on_initialize_when_congested() -> Weight { // Proof Size summary in bytes: // Measured: `111` - // Estimated: `1596` - // Minimum execution time: 3_417_000 picoseconds. - Weight::from_parts(3_583_000, 0) - .saturating_add(Weight::from_parts(0, 1596)) + // Estimated: `5487` + // Minimum execution time: 3_436_000 picoseconds. + Weight::from_parts(3_586_000, 0) + .saturating_add(Weight::from_parts(0, 5487)) .saturating_add(T::DbWeight::get().reads(2)) } /// Storage: `ToRococoXcmRouter::Bridge` (r:1 w:1) /// Proof: `ToRococoXcmRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: 512, mode: `MaxEncodedLen`) fn report_bridge_status() -> Weight { // Proof Size summary in bytes: - // Measured: `117` + // Measured: `150` // Estimated: `1502` - // Minimum execution time: 10_280_000 picoseconds. - Weight::from_parts(10_703_000, 0) + // Minimum execution time: 9_706_000 picoseconds. + Weight::from_parts(10_139_000, 0) .saturating_add(Weight::from_parts(0, 1502)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `PolkadotXcm::SupportedVersion` (r:2 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0x3302afcb67e838a3f960251b417b9a4f` (r:1 w:0) @@ -100,7 +98,9 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh /// Storage: `ToRococoXcmRouter::Bridge` (r:1 w:1) /// Proof: `ToRococoXcmRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: 512, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) - /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:2 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) @@ -108,18 +108,18 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) - /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: Some(4002), added: 4497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) - /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: Some(105506), added: 107981, mode: `MaxEncodedLen`) fn send_message() -> Weight { // Proof Size summary in bytes: - // Measured: `487` - // Estimated: `6427` - // Minimum execution time: 63_624_000 picoseconds. - Weight::from_parts(66_071_000, 0) - .saturating_add(Weight::from_parts(0, 6427)) + // Measured: `520` + // Estimated: `6460` + // Minimum execution time: 46_250_000 picoseconds. + Weight::from_parts(47_801_000, 0) + .saturating_add(Weight::from_parts(0, 6460)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 1ac31efaf91..98737298468 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -96,7 +96,7 @@ bp-parachains = { workspace = true } bp-polkadot-bulletin = { workspace = true } bp-polkadot-core = { workspace = true } bp-relayers = { workspace = true } -bp-runtime = { workspace = true } +bp-runtime = { features = ["test-helpers"], workspace = true } bp-rococo = { workspace = true } bp-westend = { workspace = true } pallet-bridge-grandpa = { workspace = true } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs index 5551b05e202..779cc537ee9 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs @@ -21,14 +21,9 @@ //! For example, the messaging pallet needs to know the sending and receiving chains, but the //! GRANDPA tracking pallet only needs to be aware of one chain. -use super::{ - weights, AccountId, Balance, Balances, BlockNumber, Runtime, RuntimeEvent, RuntimeOrigin, -}; +use super::{weights, AccountId, Balance, Balances, BlockNumber, Runtime, RuntimeEvent}; use bp_parachains::SingleParaStoredHeaderDataBuilder; -use bp_runtime::UnderlyingChainProvider; -use bridge_runtime_common::messages::ThisChainWithMessages; use frame_support::{parameter_types, traits::ConstU32}; -use sp_runtime::RuntimeDebug; parameter_types! { pub const RelayChainHeadersToKeep: u32 = 1024; @@ -103,15 +98,3 @@ impl pallet_bridge_grandpa::Config for Runt // weights are also the same for both bridges. type WeightInfo = weights::pallet_bridge_grandpa::WeightInfo; } - -/// BridgeHubRococo chain from message lane point of view. -#[derive(RuntimeDebug, Clone, Copy)] -pub struct BridgeHubRococo; - -impl UnderlyingChainProvider for BridgeHubRococo { - type Chain = bp_bridge_hub_rococo::BridgeHubRococo; -} - -impl ThisChainWithMessages for BridgeHubRococo { - type RuntimeOrigin = RuntimeOrigin; -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs index 94b936889b7..39ea6369255 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs @@ -20,23 +20,20 @@ //! are reusing Polkadot Bulletin chain primitives everywhere here. use crate::{ - bridge_common_config::BridgeHubRococo, weights, xcm_config::UniversalLocation, AccountId, - BridgeRococoBulletinGrandpa, BridgeRococoBulletinMessages, PolkadotXcm, Runtime, RuntimeEvent, - XcmOverRococoBulletin, XcmRouter, + weights, xcm_config::UniversalLocation, BridgeRococoBulletinGrandpa, + BridgeRococoBulletinMessages, PolkadotXcm, Runtime, RuntimeEvent, XcmOverRococoBulletin, + XcmRouter, +}; +use bp_messages::{ + source_chain::FromBridgedChainMessagesDeliveryProof, + target_chain::FromBridgedChainMessagesProof, LaneId, }; -use bp_messages::LaneId; use bp_runtime::Chain; use bridge_runtime_common::{ extensions::refund_relayer_extension::{ ActualFeeRefund, RefundBridgedMessages, RefundSignedExtensionAdapter, RefundableMessagesLane, }, - messages, - messages::{ - source::{FromBridgedChainMessagesDeliveryProof, TargetHeaderChainAdapter}, - target::{FromBridgedChainMessagesProof, SourceHeaderChainAdapter}, - MessageBridge, UnderlyingChainProvider, - }, messages_xcm_extension::{ SenderAndLane, XcmAsPlainPayload, XcmBlobHauler, XcmBlobHaulerAdapter, XcmBlobMessageDispatch, XcmVersionOfDestAndRemoteBridge, @@ -44,7 +41,6 @@ use bridge_runtime_common::{ }; use frame_support::{parameter_types, traits::PalletInfoAccess}; -use sp_runtime::RuntimeDebug; use xcm::{ latest::prelude::*, prelude::{InteriorLocation, NetworkId}, @@ -52,15 +48,6 @@ use xcm::{ use xcm_builder::BridgeBlobDispatcher; parameter_types! { - /// Maximal number of entries in the unrewarded relayers vector at the Rococo Bridge Hub. It matches the - /// maximal number of unrewarded relayers that the single confirmation transaction at Rococo Bulletin Chain - /// may process. - pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce = - bp_polkadot_bulletin::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; - /// Maximal number of unconfirmed messages at the Rococo Bridge Hub. It matches the maximal number of - /// unconfirmed messages that the single confirmation transaction at Rococo Bulletin Chain may process. - pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = - bp_polkadot_bulletin::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; /// Bridge specific chain (network) identifier of the Rococo Bulletin Chain. pub const RococoBulletinChainId: bp_runtime::ChainId = bp_polkadot_bulletin::PolkadotBulletin::ID; /// Interior location (relative to this runtime) of the with-RococoBulletin messages pallet. @@ -142,31 +129,6 @@ impl XcmBlobHauler for ToRococoBulletinXcmBlobHauler { type OnMessagesDeliveredFromRococoBulletin = XcmBlobHaulerAdapter; -/// Messaging Bridge configuration for BridgeHubRococo -> Rococo Bulletin. -pub struct WithRococoBulletinMessageBridge; -impl MessageBridge for WithRococoBulletinMessageBridge { - // Bulletin chain assumes it is bridged with Polkadot Bridge Hub - const BRIDGED_MESSAGES_PALLET_NAME: &'static str = - bp_bridge_hub_polkadot::WITH_BRIDGE_HUB_POLKADOT_MESSAGES_PALLET_NAME; - type ThisChain = BridgeHubRococo; - type BridgedChain = RococoBulletin; - type BridgedHeaderChain = BridgeRococoBulletinGrandpa; -} - -/// Maximal outbound payload size of BridgeHubRococo -> RococoBulletin messages. -pub type ToRococoBulletinMaximalOutboundPayloadSize = - messages::source::FromThisChainMaximalOutboundPayloadSize; - -/// RococoBulletin chain from message lane point of view. -#[derive(RuntimeDebug, Clone, Copy)] -pub struct RococoBulletin; - -impl UnderlyingChainProvider for RococoBulletin { - type Chain = bp_polkadot_bulletin::PolkadotBulletin; -} - -impl messages::BridgedChainWithMessages for RococoBulletin {} - /// Signed extension that refunds relayers that are delivering messages from the Rococo Bulletin /// chain. pub type OnBridgeHubRococoRefundRococoBulletinMessages = RefundSignedExtensionAdapter< @@ -189,22 +151,20 @@ impl pallet_bridge_messages::Config for Runt type RuntimeEvent = RuntimeEvent; type WeightInfo = weights::pallet_bridge_messages_rococo_to_rococo_bulletin::WeightInfo; - type BridgedChainId = RococoBulletinChainId; + + type ThisChain = bp_bridge_hub_rococo::BridgeHubRococo; + type BridgedChain = bp_polkadot_bulletin::PolkadotBulletin; + type BridgedHeaderChain = BridgeRococoBulletinGrandpa; + type ActiveOutboundLanes = ActiveOutboundLanesToRococoBulletin; - type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; - type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; - type MaximalOutboundPayloadSize = ToRococoBulletinMaximalOutboundPayloadSize; type OutboundPayload = XcmAsPlainPayload; type InboundPayload = XcmAsPlainPayload; - type InboundRelayer = AccountId; type DeliveryPayments = (); - type TargetHeaderChain = TargetHeaderChainAdapter; type DeliveryConfirmationPayments = (); - type SourceHeaderChain = SourceHeaderChainAdapter; type MessageDispatch = XcmBlobMessageDispatch; type OnMessagesDelivered = OnMessagesDeliveredFromRococoBulletin; @@ -267,8 +227,7 @@ mod tests { runtime: Runtime, with_bridged_chain_grandpa_instance: BridgeGrandpaRococoBulletinInstance, with_bridged_chain_messages_instance: WithRococoBulletinMessagesInstance, - bridge: WithRococoBulletinMessageBridge, - this_chain: bp_rococo::Rococo, + this_chain: bp_bridge_hub_rococo::BridgeHubRococo, bridged_chain: bp_polkadot_bulletin::PolkadotBulletin, ); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs index 1681ac7f468..07bb718bd13 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs @@ -17,27 +17,21 @@ //! Bridge definitions used on BridgeHubRococo for bridging to BridgeHubWestend. use crate::{ - bridge_common_config::{ - BridgeHubRococo, BridgeParachainWestendInstance, DeliveryRewardInBalance, - }, + bridge_common_config::{BridgeParachainWestendInstance, DeliveryRewardInBalance}, weights, xcm_config::UniversalLocation, - AccountId, BridgeWestendMessages, PolkadotXcm, Runtime, RuntimeEvent, XcmOverBridgeHubWestend, - XcmRouter, + BridgeWestendMessages, PolkadotXcm, Runtime, RuntimeEvent, XcmOverBridgeHubWestend, XcmRouter, +}; +use bp_messages::{ + source_chain::FromBridgedChainMessagesDeliveryProof, + target_chain::FromBridgedChainMessagesProof, LaneId, }; -use bp_messages::LaneId; use bp_runtime::Chain; use bridge_runtime_common::{ extensions::refund_relayer_extension::{ ActualFeeRefund, RefundBridgedMessages, RefundSignedExtensionAdapter, RefundableMessagesLane, }, - messages, - messages::{ - source::{FromBridgedChainMessagesDeliveryProof, TargetHeaderChainAdapter}, - target::{FromBridgedChainMessagesProof, SourceHeaderChainAdapter}, - MessageBridge, UnderlyingChainProvider, - }, messages_xcm_extension::{ SenderAndLane, XcmAsPlainPayload, XcmBlobHauler, XcmBlobHaulerAdapter, XcmBlobMessageDispatch, XcmVersionOfDestAndRemoteBridge, @@ -46,7 +40,6 @@ use bridge_runtime_common::{ use codec::Encode; use frame_support::{parameter_types, traits::PalletInfoAccess}; -use sp_runtime::RuntimeDebug; use xcm::{ latest::prelude::*, prelude::{InteriorLocation, NetworkId}, @@ -54,11 +47,7 @@ use xcm::{ use xcm_builder::BridgeBlobDispatcher; parameter_types! { - pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce = - bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; - pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = - bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; - pub const BridgeHubWestendChainId: bp_runtime::ChainId = BridgeHubWestend::ID; + pub const BridgeHubWestendChainId: bp_runtime::ChainId = bp_bridge_hub_westend::BridgeHubWestend::ID; pub BridgeRococoToWestendMessagesPalletInstance: InteriorLocation = [PalletInstance(::index() as u8)].into(); pub WestendGlobalConsensusNetwork: NetworkId = NetworkId::Westend; pub WestendGlobalConsensusNetworkLocation: Location = Location::new( @@ -148,34 +137,6 @@ impl XcmBlobHauler for ToBridgeHubWestendXcmBlobHauler { type OnMessagesDeliveredFromWestend = XcmBlobHaulerAdapter; -/// Messaging Bridge configuration for BridgeHubRococo -> BridgeHubWestend -pub struct WithBridgeHubWestendMessageBridge; -impl MessageBridge for WithBridgeHubWestendMessageBridge { - const BRIDGED_MESSAGES_PALLET_NAME: &'static str = - bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME; - type ThisChain = BridgeHubRococo; - type BridgedChain = BridgeHubWestend; - type BridgedHeaderChain = pallet_bridge_parachains::ParachainHeaders< - Runtime, - BridgeParachainWestendInstance, - bp_bridge_hub_westend::BridgeHubWestend, - >; -} - -/// Maximal outbound payload size of BridgeHubRococo -> BridgeHubWestend messages. -pub type ToBridgeHubWestendMaximalOutboundPayloadSize = - messages::source::FromThisChainMaximalOutboundPayloadSize; - -/// BridgeHubWestend chain from message lane point of view. -#[derive(RuntimeDebug, Clone, Copy)] -pub struct BridgeHubWestend; - -impl UnderlyingChainProvider for BridgeHubWestend { - type Chain = bp_bridge_hub_westend::BridgeHubWestend; -} - -impl messages::BridgedChainWithMessages for BridgeHubWestend {} - /// Signed extension that refunds relayers that are delivering messages from the Westend parachain. pub type OnBridgeHubRococoRefundBridgeHubWestendMessages = RefundSignedExtensionAdapter< RefundBridgedMessages< @@ -196,26 +157,28 @@ pub type WithBridgeHubWestendMessagesInstance = pallet_bridge_messages::Instance impl pallet_bridge_messages::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = weights::pallet_bridge_messages_rococo_to_westend::WeightInfo; - type BridgedChainId = BridgeHubWestendChainId; + + type ThisChain = bp_bridge_hub_rococo::BridgeHubRococo; + type BridgedChain = bp_bridge_hub_westend::BridgeHubWestend; + type BridgedHeaderChain = pallet_bridge_parachains::ParachainHeaders< + Runtime, + BridgeParachainWestendInstance, + bp_bridge_hub_westend::BridgeHubWestend, + >; + type ActiveOutboundLanes = ActiveOutboundLanesToBridgeHubWestend; - type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; - type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; - type MaximalOutboundPayloadSize = ToBridgeHubWestendMaximalOutboundPayloadSize; type OutboundPayload = XcmAsPlainPayload; type InboundPayload = XcmAsPlainPayload; - type InboundRelayer = AccountId; type DeliveryPayments = (); - type TargetHeaderChain = TargetHeaderChainAdapter; type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter< Runtime, WithBridgeHubWestendMessagesInstance, DeliveryRewardInBalance, >; - type SourceHeaderChain = SourceHeaderChainAdapter; type MessageDispatch = XcmBlobMessageDispatch< FromWestendMessageBlobDispatcher, Self::WeightInfo, @@ -248,9 +211,8 @@ mod tests { assert_complete_bridge_types, extensions::refund_relayer_extension::RefundableParachain, integrity::{ - assert_complete_bridge_constants, check_message_lane_weights, - AssertBridgeMessagesPalletConstants, AssertBridgePalletNames, AssertChainConstants, - AssertCompleteBridgeConstants, + assert_complete_with_parachain_bridge_constants, check_message_lane_weights, + AssertChainConstants, AssertCompleteBridgeConstants, }, }; use parachains_common::Balance; @@ -292,36 +254,20 @@ mod tests { runtime: Runtime, with_bridged_chain_grandpa_instance: BridgeGrandpaWestendInstance, with_bridged_chain_messages_instance: WithBridgeHubWestendMessagesInstance, - bridge: WithBridgeHubWestendMessageBridge, - this_chain: bp_rococo::Rococo, - bridged_chain: bp_westend::Westend, + this_chain: bp_bridge_hub_rococo::BridgeHubRococo, + bridged_chain: bp_bridge_hub_westend::BridgeHubWestend, ); - assert_complete_bridge_constants::< + assert_complete_with_parachain_bridge_constants::< Runtime, BridgeGrandpaWestendInstance, WithBridgeHubWestendMessagesInstance, - WithBridgeHubWestendMessageBridge, + bp_westend::Westend, >(AssertCompleteBridgeConstants { this_chain_constants: AssertChainConstants { block_length: bp_bridge_hub_rococo::BlockLength::get(), block_weights: bp_bridge_hub_rococo::BlockWeightsForAsyncBacking::get(), }, - messages_pallet_constants: AssertBridgeMessagesPalletConstants { - max_unrewarded_relayers_in_bridged_confirmation_tx: - bp_bridge_hub_westend::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, - max_unconfirmed_messages_in_bridged_confirmation_tx: - bp_bridge_hub_westend::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, - bridged_chain_id: BridgeHubWestend::ID, - }, - pallet_names: AssertBridgePalletNames { - with_this_chain_messages_pallet_name: - bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME, - with_bridged_chain_grandpa_pallet_name: - bp_westend::WITH_WESTEND_GRANDPA_PALLET_NAME, - with_bridged_chain_messages_pallet_name: - bp_bridge_hub_westend::WITH_BRIDGE_HUB_WESTEND_MESSAGES_PALLET_NAME, - }, }); bridge_runtime_common::extensions::priority_calculator::per_relay_header::ensure_priority_boost_is_sane::< @@ -332,7 +278,7 @@ mod tests { bridge_runtime_common::extensions::priority_calculator::per_parachain_header::ensure_priority_boost_is_sane::< Runtime, - RefundableParachain, + RefundableParachain, PriorityBoostPerParachainHeader, >(FEE_BOOST_PER_PARACHAIN_HEADER); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 57ed5ec258d..8ca5898d1a1 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -1432,7 +1432,7 @@ impl_runtime_apis! { prepare_message_proof_from_parachain::< Runtime, bridge_common_config::BridgeGrandpaWestendInstance, - bridge_to_westend_config::WithBridgeHubWestendMessageBridge, + bridge_to_westend_config::WithBridgeHubWestendMessagesInstance, >(params, generate_xcm_builder_bridge_message_sample([GlobalConsensus(Rococo), Parachain(42)].into())) } @@ -1442,7 +1442,7 @@ impl_runtime_apis! { prepare_message_delivery_proof_from_parachain::< Runtime, bridge_common_config::BridgeGrandpaWestendInstance, - bridge_to_westend_config::WithBridgeHubWestendMessageBridge, + bridge_to_westend_config::WithBridgeHubWestendMessagesInstance, >(params) } @@ -1467,7 +1467,7 @@ impl_runtime_apis! { prepare_message_proof_from_grandpa_chain::< Runtime, bridge_common_config::BridgeGrandpaRococoBulletinInstance, - bridge_to_bulletin_config::WithRococoBulletinMessageBridge, + bridge_to_bulletin_config::WithRococoBulletinMessagesInstance, >(params, generate_xcm_builder_bridge_message_sample([GlobalConsensus(Rococo), Parachain(42)].into())) } @@ -1477,7 +1477,7 @@ impl_runtime_apis! { prepare_message_delivery_proof_from_grandpa_chain::< Runtime, bridge_common_config::BridgeGrandpaRococoBulletinInstance, - bridge_to_bulletin_config::WithRococoBulletinMessageBridge, + bridge_to_bulletin_config::WithRococoBulletinMessagesInstance, >(params) } @@ -1503,7 +1503,7 @@ impl_runtime_apis! { fn prepare_parachain_heads_proof( parachains: &[bp_polkadot_core::parachains::ParaId], parachain_head_size: u32, - proof_size: bp_runtime::StorageProofSize, + proof_params: bp_runtime::UnverifiedStorageProofParams, ) -> ( pallet_bridge_parachains::RelayBlockNumber, pallet_bridge_parachains::RelayBlockHash, @@ -1513,7 +1513,7 @@ impl_runtime_apis! { prepare_parachain_heads_proof::( parachains, parachain_head_size, - proof_size, + proof_params, ) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs index bbd27bbb1d7..4ce57b2e501 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_bridge_grandpa` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-07-11, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-yaoqqom-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -68,13 +68,13 @@ impl pallet_bridge_grandpa::WeightInfo for WeightInfo pallet_bridge_grandpa::WeightInfo for WeightInfo pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `654` // Estimated: `52645` - // Minimum execution time: 37_405_000 picoseconds. - Weight::from_parts(38_397_000, 0) + // Minimum execution time: 37_206_000 picoseconds. + Weight::from_parts(38_545_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -74,13 +74,17 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn receive_two_messages_proof() -> Weight { + /// The range of component `n` is `[1, 4076]`. + /// The range of component `n` is `[1, 4076]`. + fn receive_n_messages_proof(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `654` // Estimated: `52645` - // Minimum execution time: 48_076_000 picoseconds. - Weight::from_parts(49_374_000, 0) + // Minimum execution time: 37_075_000 picoseconds. + Weight::from_parts(37_757_000, 0) .saturating_add(Weight::from_parts(0, 52645)) + // Standard Error: 5_776 + .saturating_add(Weight::from_parts(11_586_768, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -96,8 +100,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `654` // Estimated: `52645` - // Minimum execution time: 42_529_000 picoseconds. - Weight::from_parts(44_536_000, 0) + // Minimum execution time: 42_087_000 picoseconds. + Weight::from_parts(42_970_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -108,30 +112,20 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) /// Storage: `BridgePolkadotBulletinMessages::InboundLanes` (r:1 w:1) /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - fn receive_single_message_proof_1_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `622` - // Estimated: `52645` - // Minimum execution time: 36_101_000 picoseconds. - Weight::from_parts(37_356_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgePolkadotBulletinMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (r:1 w:0) - /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// Storage: `BridgePolkadotBulletinMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - fn receive_single_message_proof_16_kb() -> Weight { + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// The range of component `n` is `[1, 16384]`. + /// The range of component `n` is `[1, 16384]`. + fn receive_single_n_bytes_message_proof(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `622` + // Measured: `654` // Estimated: `52645` - // Minimum execution time: 70_370_000 picoseconds. - Weight::from_parts(72_054_000, 0) + // Minimum execution time: 35_055_000 picoseconds. + Weight::from_parts(36_987_740, 0) .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(3)) + // Standard Error: 4 + .saturating_add(Weight::from_parts(2_316, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) @@ -144,8 +138,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `621` // Estimated: `2543` - // Minimum execution time: 25_144_000 picoseconds. - Weight::from_parts(25_876_000, 0) + // Minimum execution time: 24_326_000 picoseconds. + Weight::from_parts(25_169_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -160,8 +154,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `621` // Estimated: `2543` - // Minimum execution time: 25_085_000 picoseconds. - Weight::from_parts(25_872_000, 0) + // Minimum execution time: 24_484_000 picoseconds. + Weight::from_parts(25_130_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -176,8 +170,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `621` // Estimated: `2543` - // Minimum execution time: 25_181_000 picoseconds. - Weight::from_parts(25_920_000, 0) + // Minimum execution time: 24_450_000 picoseconds. + Weight::from_parts(25_164_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -204,17 +198,17 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: Some(105506), added: 107981, mode: `MaxEncodedLen`) - /// The range of component `i` is `[128, 2048]`. - /// The range of component `i` is `[128, 2048]`. - fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { + /// The range of component `n` is `[1, 16384]`. + /// The range of component `n` is `[1, 16384]`. + fn receive_single_n_bytes_message_proof_with_dispatch(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `813` // Estimated: `52645` - // Minimum execution time: 57_941_000 picoseconds. - Weight::from_parts(59_000_115, 0) + // Minimum execution time: 54_317_000 picoseconds. + Weight::from_parts(59_171_547, 0) .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 46 - .saturating_add(Weight::from_parts(8_660, 0).saturating_mul(i.into())) + // Standard Error: 7 + .saturating_add(Weight::from_parts(7_566, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs index e096c40d284..9c05dae979d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_bridge_messages` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-07-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 @@ -62,8 +62,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `658` // Estimated: `52645` - // Minimum execution time: 41_848_000 picoseconds. - Weight::from_parts(43_363_000, 0) + // Minimum execution time: 41_396_000 picoseconds. + Weight::from_parts(43_141_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,13 +78,17 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeWestendMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn receive_two_messages_proof() -> Weight { + /// The range of component `n` is `[1, 4076]`. + /// The range of component `n` is `[1, 4076]`. + fn receive_n_messages_proof(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `658` // Estimated: `52645` - // Minimum execution time: 52_674_000 picoseconds. - Weight::from_parts(55_080_000, 0) + // Minimum execution time: 41_095_000 picoseconds. + Weight::from_parts(42_030_000, 0) .saturating_add(Weight::from_parts(0, 52645)) + // Standard Error: 5_702 + .saturating_add(Weight::from_parts(11_627_951, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,8 +106,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `658` // Estimated: `52645` - // Minimum execution time: 46_892_000 picoseconds. - Weight::from_parts(49_441_000, 0) + // Minimum execution time: 45_912_000 picoseconds. + Weight::from_parts(47_564_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -116,32 +120,20 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeWestendMessages::InboundLanes` (r:1 w:1) /// Proof: `BridgeWestendMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - fn receive_single_message_proof_1_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `626` - // Estimated: `52645` - // Minimum execution time: 41_262_000 picoseconds. - Weight::from_parts(42_734_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeWestendMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWestendMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWestendMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - fn receive_single_message_proof_16_kb() -> Weight { + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// The range of component `n` is `[1, 16384]`. + /// The range of component `n` is `[1, 16384]`. + fn receive_single_n_bytes_message_proof(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `626` + // Measured: `658` // Estimated: `52645` - // Minimum execution time: 75_654_000 picoseconds. - Weight::from_parts(76_866_000, 0) + // Minimum execution time: 39_175_000 picoseconds. + Weight::from_parts(41_674_095, 0) .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) + // Standard Error: 4 + .saturating_add(Weight::from_parts(2_305, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `BridgeWestendMessages::PalletOperatingMode` (r:1 w:0) @@ -158,8 +150,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `501` // Estimated: `3966` - // Minimum execution time: 32_911_000 picoseconds. - Weight::from_parts(33_644_000, 0) + // Minimum execution time: 32_033_000 picoseconds. + Weight::from_parts(33_131_000, 0) .saturating_add(Weight::from_parts(0, 3966)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -178,8 +170,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `501` // Estimated: `3966` - // Minimum execution time: 32_830_000 picoseconds. - Weight::from_parts(33_675_000, 0) + // Minimum execution time: 32_153_000 picoseconds. + Weight::from_parts(33_126_000, 0) .saturating_add(Weight::from_parts(0, 3966)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -198,8 +190,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `501` // Estimated: `6086` - // Minimum execution time: 37_024_000 picoseconds. - Weight::from_parts(38_112_000, 0) + // Minimum execution time: 36_387_000 picoseconds. + Weight::from_parts(37_396_000, 0) .saturating_add(Weight::from_parts(0, 6086)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) @@ -226,17 +218,17 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: Some(105506), added: 107981, mode: `MaxEncodedLen`) - /// The range of component `i` is `[128, 2048]`. - /// The range of component `i` is `[128, 2048]`. - fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { + /// The range of component `n` is `[1, 16384]`. + /// The range of component `n` is `[1, 16384]`. + fn receive_single_n_bytes_message_proof_with_dispatch(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `789` // Estimated: `52645` - // Minimum execution time: 60_653_000 picoseconds. - Weight::from_parts(62_358_212, 0) + // Minimum execution time: 56_562_000 picoseconds. + Weight::from_parts(61_452_871, 0) .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 57 - .saturating_add(Weight::from_parts(8_660, 0).saturating_mul(i.into())) + // Standard Error: 9 + .saturating_add(Weight::from_parts(7_587, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs index af216cd997c..8eb291ea145 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_bridge_parachains` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-07-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 @@ -61,13 +61,15 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:0 w:1) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { + fn submit_parachain_heads_with_n_parachains(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `558` // Estimated: `2543` - // Minimum execution time: 35_711_000 picoseconds. - Weight::from_parts(37_344_514, 0) + // Minimum execution time: 34_889_000 picoseconds. + Weight::from_parts(36_100_759, 0) .saturating_add(Weight::from_parts(0, 2543)) + // Standard Error: 102_466 + .saturating_add(Weight::from_parts(178_820, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -87,8 +89,8 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `558` // Estimated: `2543` - // Minimum execution time: 37_717_000 picoseconds. - Weight::from_parts(38_374_000, 0) + // Minimum execution time: 36_501_000 picoseconds. + Weight::from_parts(37_266_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -109,8 +111,8 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `558` // Estimated: `2543` - // Minimum execution time: 70_203_000 picoseconds. - Weight::from_parts(70_994_000, 0) + // Minimum execution time: 66_059_000 picoseconds. + Weight::from_parts(67_139_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs index a66a7fb08aa..f8bb983e80a 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_bridge_relayers` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-07-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `278` // Estimated: `3593` - // Minimum execution time: 43_669_000 picoseconds. - Weight::from_parts(44_907_000, 0) + // Minimum execution time: 44_224_000 picoseconds. + Weight::from_parts(44_905_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -72,8 +72,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `131` // Estimated: `4714` - // Minimum execution time: 24_024_000 picoseconds. - Weight::from_parts(24_582_000, 0) + // Minimum execution time: 23_902_000 picoseconds. + Weight::from_parts(24_702_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -86,8 +86,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `231` // Estimated: `4714` - // Minimum execution time: 24_522_000 picoseconds. - Weight::from_parts(25_362_000, 0) + // Minimum execution time: 24_469_000 picoseconds. + Weight::from_parts(25_176_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -102,8 +102,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `334` // Estimated: `4714` - // Minimum execution time: 26_963_000 picoseconds. - Weight::from_parts(27_686_000, 0) + // Minimum execution time: 27_518_000 picoseconds. + Weight::from_parts(28_068_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -114,8 +114,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `76` // Estimated: `3538` - // Minimum execution time: 5_401_000 picoseconds. - Weight::from_parts(5_563_000, 0) + // Minimum execution time: 5_484_000 picoseconds. + Weight::from_parts(5_718_000, 0) .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index abd84f8e89b..bafc973bdac 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-07-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -68,8 +68,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 61_813_000 picoseconds. - Weight::from_parts(62_996_000, 6196) + // Minimum execution time: 60_119_000 picoseconds. + Weight::from_parts(61_871_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -77,8 +77,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_044_000 picoseconds. - Weight::from_parts(2_112_000, 0) + // Minimum execution time: 998_000 picoseconds. + Weight::from_parts(1_038_000, 0) } // Storage: `PolkadotXcm::Queries` (r:1 w:0) // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -86,58 +86,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 7_472_000 picoseconds. - Weight::from_parts(7_723_000, 3497) + // Minimum execution time: 6_327_000 picoseconds. + Weight::from_parts(6_520_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_414_000 picoseconds. - Weight::from_parts(8_765_000, 0) + // Minimum execution time: 6_783_000 picoseconds. + Weight::from_parts(7_117_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_192_000 picoseconds. - Weight::from_parts(2_243_000, 0) + // Minimum execution time: 1_589_000 picoseconds. + Weight::from_parts(1_655_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_866_000 picoseconds. - Weight::from_parts(1_931_000, 0) + // Minimum execution time: 1_013_000 picoseconds. + Weight::from_parts(1_045_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_847_000 picoseconds. - Weight::from_parts(1_921_000, 0) + // Minimum execution time: 1_005_000 picoseconds. + Weight::from_parts(1_044_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_797_000 picoseconds. - Weight::from_parts(1_880_000, 0) + // Minimum execution time: 964_000 picoseconds. + Weight::from_parts(1_011_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_458_000 picoseconds. - Weight::from_parts(2_523_000, 0) + // Minimum execution time: 1_005_000 picoseconds. + Weight::from_parts(1_027_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_833_000 picoseconds. - Weight::from_parts(1_906_000, 0) + // Minimum execution time: 980_000 picoseconds. + Weight::from_parts(1_009_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -159,8 +159,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 54_659_000 picoseconds. - Weight::from_parts(56_025_000, 6196) + // Minimum execution time: 56_726_000 picoseconds. + Weight::from_parts(59_300_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -170,8 +170,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 10_953_000 picoseconds. - Weight::from_parts(11_220_000, 3555) + // Minimum execution time: 8_962_000 picoseconds. + Weight::from_parts(9_519_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -179,8 +179,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_834_000 picoseconds. - Weight::from_parts(1_892_000, 0) + // Minimum execution time: 999_000 picoseconds. + Weight::from_parts(1_035_000, 0) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -200,8 +200,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 22_238_000 picoseconds. - Weight::from_parts(22_690_000, 3503) + // Minimum execution time: 20_313_000 picoseconds. + Weight::from_parts(21_000_000, 3503) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -211,44 +211,44 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_798_000 picoseconds. - Weight::from_parts(3_936_000, 0) + // Minimum execution time: 2_820_000 picoseconds. + Weight::from_parts(2_949_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_985_000 picoseconds. - Weight::from_parts(3_099_000, 0) + // Minimum execution time: 1_293_000 picoseconds. + Weight::from_parts(1_354_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_955_000 picoseconds. - Weight::from_parts(2_050_000, 0) + // Minimum execution time: 1_076_000 picoseconds. + Weight::from_parts(1_114_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_939_000 picoseconds. - Weight::from_parts(1_990_000, 0) + // Minimum execution time: 1_014_000 picoseconds. + Weight::from_parts(1_055_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_841_000 picoseconds. - Weight::from_parts(1_900_000, 0) + // Minimum execution time: 979_000 picoseconds. + Weight::from_parts(1_019_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_081_000 picoseconds. - Weight::from_parts(2_145_000, 0) + // Minimum execution time: 1_161_000 picoseconds. + Weight::from_parts(1_208_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -270,8 +270,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 59_600_000 picoseconds. - Weight::from_parts(61_572_000, 6196) + // Minimum execution time: 62_250_000 picoseconds. + Weight::from_parts(64_477_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -279,8 +279,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_390_000 picoseconds. - Weight::from_parts(4_517_000, 0) + // Minimum execution time: 4_286_000 picoseconds. + Weight::from_parts(4_476_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -302,8 +302,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 53_864_000 picoseconds. - Weight::from_parts(55_527_000, 6196) + // Minimum execution time: 58_253_000 picoseconds. + Weight::from_parts(59_360_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -311,22 +311,22 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_879_000 picoseconds. - Weight::from_parts(1_947_000, 0) + // Minimum execution time: 1_026_000 picoseconds. + Weight::from_parts(1_065_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_827_000 picoseconds. - Weight::from_parts(1_900_000, 0) + // Minimum execution time: 993_000 picoseconds. + Weight::from_parts(1_015_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_824_000 picoseconds. - Weight::from_parts(1_898_000, 0) + // Minimum execution time: 966_000 picoseconds. + Weight::from_parts(999_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -339,16 +339,16 @@ impl WeightInfo { // Storage: `BridgeWestendMessages::OutboundLanesCongestedSignals` (r:1 w:0) // Proof: `BridgeWestendMessages::OutboundLanesCongestedSignals` (`max_values`: Some(1), `max_size`: Some(21), added: 516, mode: `MaxEncodedLen`) // Storage: `BridgeWestendMessages::OutboundMessages` (r:0 w:1) - // Proof: `BridgeWestendMessages::OutboundMessages` (`max_values`: None, `max_size`: Some(2621472), added: 2623947, mode: `MaxEncodedLen`) + // Proof: `BridgeWestendMessages::OutboundMessages` (`max_values`: None, `max_size`: Some(65568), added: 68043, mode: `MaxEncodedLen`) /// The range of component `x` is `[1, 1000]`. pub fn export_message(x: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `190` // Estimated: `6130` - // Minimum execution time: 41_598_000 picoseconds. - Weight::from_parts(42_219_173, 6130) - // Standard Error: 426 - .saturating_add(Weight::from_parts(452_460, 0).saturating_mul(x.into())) + // Minimum execution time: 37_014_000 picoseconds. + Weight::from_parts(38_096_655, 6130) + // Standard Error: 61 + .saturating_add(Weight::from_parts(45_146, 0).saturating_mul(x.into())) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -356,14 +356,14 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_812_000 picoseconds. - Weight::from_parts(1_898_000, 0) + // Minimum execution time: 996_000 picoseconds. + Weight::from_parts(1_025_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_915_000 picoseconds. - Weight::from_parts(1_976_000, 0) + // Minimum execution time: 1_001_000 picoseconds. + Weight::from_parts(1_044_000, 0) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index b309232825d..1d3d9e55f7e 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -148,8 +148,7 @@ mod bridge_hub_westend_tests { use bridge_hub_test_utils::test_cases::from_parachain; use bridge_to_westend_config::{ BridgeHubWestendChainId, BridgeHubWestendLocation, WestendGlobalConsensusNetwork, - WithBridgeHubWestendMessageBridge, WithBridgeHubWestendMessagesInstance, - XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, + WithBridgeHubWestendMessagesInstance, XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, }; // Para id of sibling chain used in tests. @@ -162,7 +161,6 @@ mod bridge_hub_westend_tests { BridgeGrandpaWestendInstance, BridgeParachainWestendInstance, WithBridgeHubWestendMessagesInstance, - WithBridgeHubWestendMessageBridge, >; #[test] @@ -457,8 +455,8 @@ mod bridge_hub_bulletin_tests { use bridge_hub_test_utils::test_cases::from_grandpa_chain; use bridge_to_bulletin_config::{ RococoBulletinChainId, RococoBulletinGlobalConsensusNetwork, - RococoBulletinGlobalConsensusNetworkLocation, WithRococoBulletinMessageBridge, - WithRococoBulletinMessagesInstance, XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, + RococoBulletinGlobalConsensusNetworkLocation, WithRococoBulletinMessagesInstance, + XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, }; // Para id of sibling chain used in tests. @@ -470,7 +468,6 @@ mod bridge_hub_bulletin_tests { AllPalletsWithoutSystem, BridgeGrandpaRococoBulletinInstance, WithRococoBulletinMessagesInstance, - WithRococoBulletinMessageBridge, >; #[test] @@ -594,44 +591,4 @@ mod bridge_hub_bulletin_tests { construct_and_apply_extrinsic, ) } - - #[test] - pub fn can_calculate_fee_for_standalone_message_delivery_transaction() { - bridge_hub_test_utils::check_sane_fees_values( - "bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs", - bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs::get(), - || { - from_grandpa_chain::can_calculate_fee_for_standalone_message_delivery_transaction::< - RuntimeTestsAdapter, - >(collator_session_keys(), construct_and_estimate_extrinsic_fee) - }, - Perbill::from_percent(33), - None, /* we don't want lowering according to the Bulletin setup, because - * `from_grandpa_chain` is cheaper then `from_parachain_chain` */ - &format!( - "Estimate fee for `single message delivery` for runtime: {:?}", - ::Version::get() - ), - ) - } - - #[test] - pub fn can_calculate_fee_for_standalone_message_confirmation_transaction() { - bridge_hub_test_utils::check_sane_fees_values( - "bp_bridge_hub_rococo::BridgeHubRococoBaseConfirmationFeeInRocs", - bp_bridge_hub_rococo::BridgeHubRococoBaseConfirmationFeeInRocs::get(), - || { - from_grandpa_chain::can_calculate_fee_for_standalone_message_confirmation_transaction::< - RuntimeTestsAdapter, - >(collator_session_keys(), construct_and_estimate_extrinsic_fee) - }, - Perbill::from_percent(33), - None, /* we don't want lowering according to the Bulletin setup, because - * `from_grandpa_chain` is cheaper then `from_parachain_chain` */ - &format!( - "Estimate fee for `single message confirmation` for runtime: {:?}", - ::Version::get() - ), - ) - } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml index c18d5036e06..e2671d3d606 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml @@ -89,7 +89,7 @@ bp-messages = { workspace = true } bp-parachains = { workspace = true } bp-polkadot-core = { workspace = true } bp-relayers = { workspace = true } -bp-runtime = { workspace = true } +bp-runtime = { features = ["test-helpers"], workspace = true } bp-rococo = { workspace = true } bp-westend = { workspace = true } pallet-bridge-grandpa = { workspace = true } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs index 425b53da30f..09d55f4323a 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs @@ -18,10 +18,12 @@ use crate::{ bridge_common_config::DeliveryRewardInBalance, weights, xcm_config::UniversalLocation, - AccountId, BridgeRococoMessages, PolkadotXcm, Runtime, RuntimeEvent, RuntimeOrigin, - XcmOverBridgeHubRococo, XcmRouter, + BridgeRococoMessages, PolkadotXcm, Runtime, RuntimeEvent, XcmOverBridgeHubRococo, XcmRouter, +}; +use bp_messages::{ + source_chain::FromBridgedChainMessagesDeliveryProof, + target_chain::FromBridgedChainMessagesProof, LaneId, }; -use bp_messages::LaneId; use bp_parachains::SingleParaStoredHeaderDataBuilder; use bp_runtime::Chain; use bridge_runtime_common::{ @@ -29,12 +31,6 @@ use bridge_runtime_common::{ ActualFeeRefund, RefundBridgedMessages, RefundSignedExtensionAdapter, RefundableMessagesLane, }, - messages, - messages::{ - source::{FromBridgedChainMessagesDeliveryProof, TargetHeaderChainAdapter}, - target::{FromBridgedChainMessagesProof, SourceHeaderChainAdapter}, - MessageBridge, ThisChainWithMessages, UnderlyingChainProvider, - }, messages_xcm_extension::{ SenderAndLane, XcmAsPlainPayload, XcmBlobHauler, XcmBlobHaulerAdapter, XcmBlobMessageDispatch, XcmVersionOfDestAndRemoteBridge, @@ -45,7 +41,6 @@ use frame_support::{ parameter_types, traits::{ConstU32, PalletInfoAccess}, }; -use sp_runtime::RuntimeDebug; use xcm::{ latest::prelude::*, prelude::{InteriorLocation, NetworkId}, @@ -59,11 +54,7 @@ parameter_types! { pub const RococoBridgeParachainPalletName: &'static str = "Paras"; pub const MaxRococoParaHeadDataSize: u32 = bp_rococo::MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE; - pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce = - bp_bridge_hub_westend::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; - pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = - bp_bridge_hub_westend::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; - pub const BridgeHubRococoChainId: bp_runtime::ChainId = BridgeHubRococo::ID; + pub const BridgeHubRococoChainId: bp_runtime::ChainId = bp_bridge_hub_rococo::BridgeHubRococo::ID; pub BridgeWestendToRococoMessagesPalletInstance: InteriorLocation = [PalletInstance(::index() as u8)].into(); pub RococoGlobalConsensusNetwork: NetworkId = NetworkId::Rococo; pub RococoGlobalConsensusNetworkLocation: Location = Location::new( @@ -153,46 +144,6 @@ impl XcmBlobHauler for ToBridgeHubRococoXcmBlobHauler { /// On messages delivered callback. type OnMessagesDelivered = XcmBlobHaulerAdapter; -/// Messaging Bridge configuration for BridgeHubWestend -> BridgeHubRococo -pub struct WithBridgeHubRococoMessageBridge; -impl MessageBridge for WithBridgeHubRococoMessageBridge { - const BRIDGED_MESSAGES_PALLET_NAME: &'static str = - bp_bridge_hub_westend::WITH_BRIDGE_HUB_WESTEND_MESSAGES_PALLET_NAME; - type ThisChain = BridgeHubWestend; - type BridgedChain = BridgeHubRococo; - type BridgedHeaderChain = pallet_bridge_parachains::ParachainHeaders< - Runtime, - BridgeParachainRococoInstance, - bp_bridge_hub_rococo::BridgeHubRococo, - >; -} - -/// Maximal outbound payload size of BridgeHubWestend -> BridgeHubRococo messages. -type ToBridgeHubRococoMaximalOutboundPayloadSize = - messages::source::FromThisChainMaximalOutboundPayloadSize; - -/// BridgeHubRococo chain from message lane point of view. -#[derive(RuntimeDebug, Clone, Copy)] -pub struct BridgeHubRococo; - -impl UnderlyingChainProvider for BridgeHubRococo { - type Chain = bp_bridge_hub_rococo::BridgeHubRococo; -} - -impl messages::BridgedChainWithMessages for BridgeHubRococo {} - -/// BridgeHubWestend chain from message lane point of view. -#[derive(RuntimeDebug, Clone, Copy)] -pub struct BridgeHubWestend; - -impl UnderlyingChainProvider for BridgeHubWestend { - type Chain = bp_bridge_hub_westend::BridgeHubWestend; -} - -impl ThisChainWithMessages for BridgeHubWestend { - type RuntimeOrigin = RuntimeOrigin; -} - /// Signed extension that refunds relayers that are delivering messages from the Rococo parachain. pub type OnBridgeHubWestendRefundBridgeHubRococoMessages = RefundSignedExtensionAdapter< RefundBridgedMessages< @@ -237,26 +188,28 @@ pub type WithBridgeHubRococoMessagesInstance = pallet_bridge_messages::Instance1 impl pallet_bridge_messages::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = weights::pallet_bridge_messages::WeightInfo; - type BridgedChainId = BridgeHubRococoChainId; + + type ThisChain = bp_bridge_hub_westend::BridgeHubWestend; + type BridgedChain = bp_bridge_hub_rococo::BridgeHubRococo; + type BridgedHeaderChain = pallet_bridge_parachains::ParachainHeaders< + Runtime, + BridgeParachainRococoInstance, + bp_bridge_hub_rococo::BridgeHubRococo, + >; + type ActiveOutboundLanes = ActiveOutboundLanesToBridgeHubRococo; - type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; - type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; - type MaximalOutboundPayloadSize = ToBridgeHubRococoMaximalOutboundPayloadSize; type OutboundPayload = XcmAsPlainPayload; type InboundPayload = XcmAsPlainPayload; - type InboundRelayer = AccountId; type DeliveryPayments = (); - type TargetHeaderChain = TargetHeaderChainAdapter; type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter< Runtime, WithBridgeHubRococoMessagesInstance, DeliveryRewardInBalance, >; - type SourceHeaderChain = SourceHeaderChainAdapter; type MessageDispatch = XcmBlobMessageDispatch< FromRococoMessageBlobDispatcher, Self::WeightInfo, @@ -287,9 +240,8 @@ mod tests { assert_complete_bridge_types, extensions::refund_relayer_extension::RefundableParachain, integrity::{ - assert_complete_bridge_constants, check_message_lane_weights, - AssertBridgeMessagesPalletConstants, AssertBridgePalletNames, AssertChainConstants, - AssertCompleteBridgeConstants, + assert_complete_with_parachain_bridge_constants, check_message_lane_weights, + AssertChainConstants, AssertCompleteBridgeConstants, }, }; use parachains_common::Balance; @@ -331,35 +283,20 @@ mod tests { runtime: Runtime, with_bridged_chain_grandpa_instance: BridgeGrandpaRococoInstance, with_bridged_chain_messages_instance: WithBridgeHubRococoMessagesInstance, - bridge: WithBridgeHubRococoMessageBridge, - this_chain: bp_westend::Westend, - bridged_chain: bp_rococo::Rococo, + this_chain: bp_bridge_hub_westend::BridgeHubWestend, + bridged_chain: bp_bridge_hub_rococo::BridgeHubRococo, ); - assert_complete_bridge_constants::< + assert_complete_with_parachain_bridge_constants::< Runtime, BridgeGrandpaRococoInstance, WithBridgeHubRococoMessagesInstance, - WithBridgeHubRococoMessageBridge, + bp_rococo::Rococo, >(AssertCompleteBridgeConstants { this_chain_constants: AssertChainConstants { block_length: bp_bridge_hub_westend::BlockLength::get(), block_weights: bp_bridge_hub_westend::BlockWeightsForAsyncBacking::get(), }, - messages_pallet_constants: AssertBridgeMessagesPalletConstants { - max_unrewarded_relayers_in_bridged_confirmation_tx: - bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, - max_unconfirmed_messages_in_bridged_confirmation_tx: - bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, - bridged_chain_id: BridgeHubRococo::ID, - }, - pallet_names: AssertBridgePalletNames { - with_this_chain_messages_pallet_name: - bp_bridge_hub_westend::WITH_BRIDGE_HUB_WESTEND_MESSAGES_PALLET_NAME, - with_bridged_chain_grandpa_pallet_name: bp_rococo::WITH_ROCOCO_GRANDPA_PALLET_NAME, - with_bridged_chain_messages_pallet_name: - bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME, - }, }); bridge_runtime_common::extensions::priority_calculator::per_relay_header::ensure_priority_boost_is_sane::< @@ -370,7 +307,7 @@ mod tests { bridge_runtime_common::extensions::priority_calculator::per_parachain_header::ensure_priority_boost_is_sane::< Runtime, - RefundableParachain, + RefundableParachain, PriorityBoostPerParachainHeader, >(FEE_BOOST_PER_PARACHAIN_HEADER); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index 05d6cdfd691..993f6043245 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -1118,7 +1118,7 @@ impl_runtime_apis! { prepare_message_proof_from_parachain::< Runtime, bridge_to_rococo_config::BridgeGrandpaRococoInstance, - bridge_to_rococo_config::WithBridgeHubRococoMessageBridge, + bridge_to_rococo_config::WithBridgeHubRococoMessagesInstance, >(params, generate_xcm_builder_bridge_message_sample([GlobalConsensus(Westend), Parachain(42)].into())) } @@ -1128,7 +1128,7 @@ impl_runtime_apis! { prepare_message_delivery_proof_from_parachain::< Runtime, bridge_to_rococo_config::BridgeGrandpaRococoInstance, - bridge_to_rococo_config::WithBridgeHubRococoMessageBridge, + bridge_to_rococo_config::WithBridgeHubRococoMessagesInstance, >(params) } @@ -1154,7 +1154,7 @@ impl_runtime_apis! { fn prepare_parachain_heads_proof( parachains: &[bp_polkadot_core::parachains::ParaId], parachain_head_size: u32, - proof_size: bp_runtime::StorageProofSize, + proof_params: bp_runtime::UnverifiedStorageProofParams, ) -> ( pallet_bridge_parachains::RelayBlockNumber, pallet_bridge_parachains::RelayBlockHash, @@ -1164,7 +1164,7 @@ impl_runtime_apis! { prepare_parachain_heads_proof::( parachains, parachain_head_size, - proof_size, + proof_params, ) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs index a9ccb00b1a1..fa7efc26048 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_bridge_grandpa` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-07-11, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-yaoqqom-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -68,13 +68,13 @@ impl pallet_bridge_grandpa::WeightInfo for WeightInfo pallet_bridge_grandpa::WeightInfo for WeightInfo pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `522` // Estimated: `52645` - // Minimum execution time: 41_095_000 picoseconds. - Weight::from_parts(42_438_000, 0) + // Minimum execution time: 40_748_000 picoseconds. + Weight::from_parts(41_836_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,13 +78,16 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn receive_two_messages_proof() -> Weight { + /// The range of component `n` is `[1, 4076]`. + fn receive_n_messages_proof(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `522` // Estimated: `52645` - // Minimum execution time: 51_974_000 picoseconds. - Weight::from_parts(53_444_000, 0) + // Minimum execution time: 40_923_000 picoseconds. + Weight::from_parts(41_287_000, 0) .saturating_add(Weight::from_parts(0, 52645)) + // Standard Error: 9_774 + .saturating_add(Weight::from_parts(11_469_207, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -102,8 +105,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `522` // Estimated: `52645` - // Minimum execution time: 45_949_000 picoseconds. - Weight::from_parts(47_912_000, 0) + // Minimum execution time: 45_946_000 picoseconds. + Weight::from_parts(47_547_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -116,32 +119,19 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - fn receive_single_message_proof_1_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `453` - // Estimated: `52645` - // Minimum execution time: 39_349_000 picoseconds. - Weight::from_parts(40_723_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: Some(1282), added: 1777, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - fn receive_single_message_proof_16_kb() -> Weight { + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// The range of component `n` is `[1, 16384]`. + fn receive_single_n_bytes_message_proof(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `453` + // Measured: `522` // Estimated: `52645` - // Minimum execution time: 70_566_000 picoseconds. - Weight::from_parts(73_240_000, 0) + // Minimum execution time: 39_668_000 picoseconds. + Weight::from_parts(41_908_980, 0) .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) + // Standard Error: 11 + .saturating_add(Weight::from_parts(2_209, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) @@ -158,8 +148,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `357` // Estimated: `3822` - // Minimum execution time: 31_381_000 picoseconds. - Weight::from_parts(31_980_000, 0) + // Minimum execution time: 30_544_000 picoseconds. + Weight::from_parts(31_171_000, 0) .saturating_add(Weight::from_parts(0, 3822)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -178,8 +168,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `357` // Estimated: `3822` - // Minimum execution time: 31_479_000 picoseconds. - Weight::from_parts(32_220_000, 0) + // Minimum execution time: 30_593_000 picoseconds. + Weight::from_parts(31_261_000, 0) .saturating_add(Weight::from_parts(0, 3822)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -198,8 +188,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `357` // Estimated: `6086` - // Minimum execution time: 35_724_000 picoseconds. - Weight::from_parts(36_460_000, 0) + // Minimum execution time: 34_682_000 picoseconds. + Weight::from_parts(35_277_000, 0) .saturating_add(Weight::from_parts(0, 6086)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) @@ -226,16 +216,16 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: Some(105506), added: 107981, mode: `MaxEncodedLen`) - /// The range of component `i` is `[128, 2048]`. - fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { + /// The range of component `n` is `[1, 16384]`. + fn receive_single_n_bytes_message_proof_with_dispatch(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `653` // Estimated: `52645` - // Minimum execution time: 60_476_000 picoseconds. - Weight::from_parts(61_832_928, 0) + // Minimum execution time: 56_465_000 picoseconds. + Weight::from_parts(61_575_775, 0) .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 73 - .saturating_add(Weight::from_parts(7_951, 0).saturating_mul(i.into())) + // Standard Error: 15 + .saturating_add(Weight::from_parts(7_197, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs index 82764a48b48..b4748f14170 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_bridge_parachains` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-07-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 @@ -61,15 +61,13 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:0 w:1) /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(p: u32, ) -> Weight { + fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `315` // Estimated: `2543` - // Minimum execution time: 34_408_000 picoseconds. - Weight::from_parts(35_467_881, 0) + // Minimum execution time: 34_177_000 picoseconds. + Weight::from_parts(35_662_308, 0) .saturating_add(Weight::from_parts(0, 2543)) - // Standard Error: 100_493 - .saturating_add(Weight::from_parts(63_859, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -89,8 +87,8 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `315` // Estimated: `2543` - // Minimum execution time: 36_125_000 picoseconds. - Weight::from_parts(36_703_000, 0) + // Minimum execution time: 35_975_000 picoseconds. + Weight::from_parts(36_510_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -111,8 +109,8 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `315` // Estimated: `2543` - // Minimum execution time: 64_697_000 picoseconds. - Weight::from_parts(68_015_000, 0) + // Minimum execution time: 62_837_000 picoseconds. + Weight::from_parts(63_562_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs index 7e3f3f3d723..60d81dc3082 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_bridge_relayers` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-06-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-07-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 @@ -56,8 +56,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `207` // Estimated: `3593` - // Minimum execution time: 43_291_000 picoseconds. - Weight::from_parts(44_118_000, 0) + // Minimum execution time: 43_132_000 picoseconds. + Weight::from_parts(43_923_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -72,8 +72,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `61` // Estimated: `4714` - // Minimum execution time: 23_286_000 picoseconds. - Weight::from_parts(23_823_000, 0) + // Minimum execution time: 22_765_000 picoseconds. + Weight::from_parts(23_576_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -86,8 +86,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `160` // Estimated: `4714` - // Minimum execution time: 24_145_000 picoseconds. - Weight::from_parts(24_541_000, 0) + // Minimum execution time: 24_013_000 picoseconds. + Weight::from_parts(24_460_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -102,8 +102,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `263` // Estimated: `4714` - // Minimum execution time: 26_707_000 picoseconds. - Weight::from_parts(27_266_000, 0) + // Minimum execution time: 26_946_000 picoseconds. + Weight::from_parts(27_485_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -114,8 +114,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `6` // Estimated: `3538` - // Minimum execution time: 4_850_000 picoseconds. - Weight::from_parts(5_116_000, 0) + // Minimum execution time: 4_658_000 picoseconds. + Weight::from_parts(4_902_000, 0) .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 9281a880c7e..73bea66bf71 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-07-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-7wrmsoux-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-westend-dev"), DB CACHE: 1024 // Executed Command: @@ -68,8 +68,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `208` // Estimated: `6196` - // Minimum execution time: 61_577_000 picoseconds. - Weight::from_parts(63_216_000, 6196) + // Minimum execution time: 58_505_000 picoseconds. + Weight::from_parts(60_437_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -77,8 +77,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_019_000 picoseconds. - Weight::from_parts(2_146_000, 0) + // Minimum execution time: 510_000 picoseconds. + Weight::from_parts(569_000, 0) } // Storage: `PolkadotXcm::Queries` (r:1 w:0) // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -86,58 +86,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 7_473_000 picoseconds. - Weight::from_parts(7_784_000, 3497) + // Minimum execution time: 5_597_000 picoseconds. + Weight::from_parts(5_884_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_385_000 picoseconds. - Weight::from_parts(8_768_000, 0) + // Minimum execution time: 5_320_000 picoseconds. + Weight::from_parts(5_594_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_181_000 picoseconds. - Weight::from_parts(2_304_000, 0) + // Minimum execution time: 1_164_000 picoseconds. + Weight::from_parts(1_227_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_858_000 picoseconds. - Weight::from_parts(1_919_000, 0) + // Minimum execution time: 528_000 picoseconds. + Weight::from_parts(586_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_855_000 picoseconds. - Weight::from_parts(1_979_000, 0) + // Minimum execution time: 509_000 picoseconds. + Weight::from_parts(571_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_823_000 picoseconds. - Weight::from_parts(1_890_000, 0) + // Minimum execution time: 511_000 picoseconds. + Weight::from_parts(546_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_407_000 picoseconds. - Weight::from_parts(2_507_000, 0) + // Minimum execution time: 560_000 picoseconds. + Weight::from_parts(600_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_838_000 picoseconds. - Weight::from_parts(1_894_000, 0) + // Minimum execution time: 514_000 picoseconds. + Weight::from_parts(558_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -159,8 +159,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `208` // Estimated: `6196` - // Minimum execution time: 54_847_000 picoseconds. - Weight::from_parts(55_742_000, 6196) + // Minimum execution time: 55_871_000 picoseconds. + Weight::from_parts(57_172_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -170,8 +170,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 10_614_000 picoseconds. - Weight::from_parts(11_344_000, 3555) + // Minimum execution time: 8_487_000 picoseconds. + Weight::from_parts(8_800_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -179,8 +179,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_826_000 picoseconds. - Weight::from_parts(1_899_000, 0) + // Minimum execution time: 528_000 picoseconds. + Weight::from_parts(569_000, 0) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -200,8 +200,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 22_312_000 picoseconds. - Weight::from_parts(22_607_000, 3503) + // Minimum execution time: 19_803_000 picoseconds. + Weight::from_parts(20_368_000, 3503) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -211,44 +211,44 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_728_000 picoseconds. - Weight::from_parts(3_914_000, 0) + // Minimum execution time: 2_185_000 picoseconds. + Weight::from_parts(2_332_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_054_000 picoseconds. - Weight::from_parts(3_140_000, 0) + // Minimum execution time: 822_000 picoseconds. + Weight::from_parts(928_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_996_000 picoseconds. - Weight::from_parts(2_148_000, 0) + // Minimum execution time: 603_000 picoseconds. + Weight::from_parts(643_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_008_000 picoseconds. - Weight::from_parts(2_077_000, 0) + // Minimum execution time: 503_000 picoseconds. + Weight::from_parts(580_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_837_000 picoseconds. - Weight::from_parts(1_913_000, 0) + // Minimum execution time: 534_000 picoseconds. + Weight::from_parts(577_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_052_000 picoseconds. - Weight::from_parts(2_120_000, 0) + // Minimum execution time: 694_000 picoseconds. + Weight::from_parts(745_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -270,8 +270,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `208` // Estimated: `6196` - // Minimum execution time: 58_725_000 picoseconds. - Weight::from_parts(60_271_000, 6196) + // Minimum execution time: 61_083_000 picoseconds. + Weight::from_parts(62_214_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -279,8 +279,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_570_000 picoseconds. - Weight::from_parts(4_707_000, 0) + // Minimum execution time: 3_261_000 picoseconds. + Weight::from_parts(3_483_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -302,8 +302,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `208` // Estimated: `6196` - // Minimum execution time: 54_903_000 picoseconds. - Weight::from_parts(55_711_000, 6196) + // Minimum execution time: 56_270_000 picoseconds. + Weight::from_parts(57_443_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -311,22 +311,22 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_872_000 picoseconds. - Weight::from_parts(1_938_000, 0) + // Minimum execution time: 565_000 picoseconds. + Weight::from_parts(628_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_836_000 picoseconds. - Weight::from_parts(1_903_000, 0) + // Minimum execution time: 496_000 picoseconds. + Weight::from_parts(563_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_847_000 picoseconds. - Weight::from_parts(1_900_000, 0) + // Minimum execution time: 518_000 picoseconds. + Weight::from_parts(557_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -339,16 +339,16 @@ impl WeightInfo { // Storage: `BridgeRococoMessages::OutboundLanesCongestedSignals` (r:1 w:0) // Proof: `BridgeRococoMessages::OutboundLanesCongestedSignals` (`max_values`: Some(1), `max_size`: Some(21), added: 516, mode: `MaxEncodedLen`) // Storage: `BridgeRococoMessages::OutboundMessages` (r:0 w:1) - // Proof: `BridgeRococoMessages::OutboundMessages` (`max_values`: None, `max_size`: Some(2621472), added: 2623947, mode: `MaxEncodedLen`) + // Proof: `BridgeRococoMessages::OutboundMessages` (`max_values`: None, `max_size`: Some(65568), added: 68043, mode: `MaxEncodedLen`) /// The range of component `x` is `[1, 1000]`. pub fn export_message(x: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `225` // Estimated: `6165` - // Minimum execution time: 41_750_000 picoseconds. - Weight::from_parts(43_496_915, 6165) - // Standard Error: 623 - .saturating_add(Weight::from_parts(457_907, 0).saturating_mul(x.into())) + // Minimum execution time: 36_288_000 picoseconds. + Weight::from_parts(37_707_751, 6165) + // Standard Error: 124 + .saturating_add(Weight::from_parts(51_290, 0).saturating_mul(x.into())) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -356,14 +356,14 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_826_000 picoseconds. - Weight::from_parts(1_911_000, 0) + // Minimum execution time: 485_000 picoseconds. + Weight::from_parts(540_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_967_000 picoseconds. - Weight::from_parts(2_096_000, 0) + // Minimum execution time: 542_000 picoseconds. + Weight::from_parts(586_000, 0) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs index 836594140b2..763271fd7af 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs @@ -28,8 +28,8 @@ use bridge_hub_westend_runtime::{ }; use bridge_to_rococo_config::{ BridgeGrandpaRococoInstance, BridgeHubRococoChainId, BridgeHubRococoLocation, - BridgeParachainRococoInstance, WithBridgeHubRococoMessageBridge, - WithBridgeHubRococoMessagesInstance, XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO, + BridgeParachainRococoInstance, WithBridgeHubRococoMessagesInstance, + XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO, }; use codec::{Decode, Encode}; use frame_support::{dispatch::GetDispatchInfo, parameter_types, traits::ConstU8}; @@ -53,7 +53,6 @@ type RuntimeTestsAdapter = from_parachain::WithRemoteParachainHelperAdapter< BridgeGrandpaRococoInstance, BridgeParachainRococoInstance, WithBridgeHubRococoMessagesInstance, - WithBridgeHubRococoMessageBridge, >; parameter_types! { diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index 90af4dd8f3e..fb96d29a497 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -48,7 +48,7 @@ bp-runtime = { workspace = true } bp-test-utils = { workspace = true } pallet-bridge-grandpa = { workspace = true } pallet-bridge-parachains = { workspace = true } -pallet-bridge-messages = { workspace = true } +pallet-bridge-messages = { features = ["test-helpers"], workspace = true } pallet-bridge-relayers = { workspace = true } bridge-runtime-common = { workspace = true } diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs index bfa2f0f50f9..8f3c7de61f8 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs @@ -23,21 +23,12 @@ use crate::{ }; use bp_header_chain::ChainWithGrandpa; -use bp_messages::{ - source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, LaneId, - UnrewardedRelayersState, -}; +use bp_messages::{LaneId, UnrewardedRelayersState}; use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; -use bp_runtime::{HashOf, UnderlyingChainOf}; -use bridge_runtime_common::{ - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - BridgedChain as MessageBridgedChain, MessageBridge, ThisChain as MessageThisChain, - }, - messages_xcm_extension::XcmAsPlainPayload, -}; +use bridge_runtime_common::messages_xcm_extension::XcmAsPlainPayload; use frame_support::traits::{OnFinalize, OnInitialize}; use frame_system::pallet_prelude::BlockNumberFor; +use pallet_bridge_messages::{BridgedChainOf, ThisChainOf}; use parachains_runtimes_test_utils::{ AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, RuntimeCallOf, SlotDurations, }; @@ -53,13 +44,10 @@ pub trait WithRemoteGrandpaChainHelper { /// This chain runtime. type Runtime: BasicParachainRuntime + cumulus_pallet_xcmp_queue::Config - + BridgeGrandpaConfig< - Self::GPI, - BridgedChain = UnderlyingChainOf>, - > + BridgeMessagesConfig< + + BridgeGrandpaConfig> + + BridgeMessagesConfig< Self::MPI, InboundPayload = XcmAsPlainPayload, - InboundRelayer = bp_runtime::AccountIdOf>, OutboundPayload = XcmAsPlainPayload, > + pallet_bridge_relayers::Config; /// All pallets of this chain, excluding system pallet. @@ -69,38 +57,33 @@ pub trait WithRemoteGrandpaChainHelper { type GPI: 'static; /// Instance of the `pallet-bridge-messages`, used to bridge with remote GRANDPA chain. type MPI: 'static; - /// Messages bridge definition. - type MB: MessageBridge; } /// Adapter struct that implements [`WithRemoteGrandpaChainHelper`]. -pub struct WithRemoteGrandpaChainHelperAdapter( - sp_std::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, MPI, MB)>, +pub struct WithRemoteGrandpaChainHelperAdapter( + sp_std::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, MPI)>, ); -impl WithRemoteGrandpaChainHelper - for WithRemoteGrandpaChainHelperAdapter +impl WithRemoteGrandpaChainHelper + for WithRemoteGrandpaChainHelperAdapter where Runtime: BasicParachainRuntime + cumulus_pallet_xcmp_queue::Config - + BridgeGrandpaConfig>> + + BridgeGrandpaConfig> + BridgeMessagesConfig< MPI, InboundPayload = XcmAsPlainPayload, - InboundRelayer = bp_runtime::AccountIdOf>, OutboundPayload = XcmAsPlainPayload, > + pallet_bridge_relayers::Config, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, GPI: 'static, MPI: 'static, - MB: MessageBridge, { type Runtime = Runtime; type AllPalletsWithoutSystem = AllPalletsWithoutSystem; type GPI = GPI; type MPI = MPI; - type MB = MB; } /// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, @@ -124,13 +107,7 @@ pub fn relayed_incoming_message_works( AccountIdOf: From, RuntimeCallOf: From> + From>, - UnderlyingChainOf>: ChainWithGrandpa, - >::SourceHeaderChain: - SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof< - HashOf>, - >, - >, + BridgedChainOf: ChainWithGrandpa, { helpers::relayed_incoming_message_works::< RuntimeHelper::Runtime, @@ -161,7 +138,8 @@ pub fn relayed_incoming_message_works( // to be submitted by relayer to this chain. let (relay_chain_header, grandpa_justification, message_proof) = test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( lane_id, @@ -186,7 +164,7 @@ pub fn relayed_incoming_message_works( ( BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain, - proof: message_proof, + proof: Box::new(message_proof), messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }.into(), @@ -233,13 +211,7 @@ pub fn free_relay_extrinsic_works( AccountIdOf: From, RuntimeCallOf: From> + From>, - UnderlyingChainOf>: ChainWithGrandpa, - >::SourceHeaderChain: - SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof< - HashOf>, - >, - >, + BridgedChainOf: ChainWithGrandpa, { // ensure that the runtime allows free header submissions let free_headers_interval = ( // to be submitted by relayer to this chain. let (relay_chain_header, grandpa_justification, message_proof) = test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( lane_id, @@ -322,7 +295,7 @@ pub fn free_relay_extrinsic_works( ( BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain, - proof: message_proof, + proof: Box::new(message_proof), messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }.into(), @@ -370,13 +343,7 @@ pub fn complex_relay_extrinsic_works( RuntimeCallOf: From> + From> + From>, - UnderlyingChainOf>: ChainWithGrandpa, - >::SourceHeaderChain: - SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof< - HashOf>, - >, - >, + BridgedChainOf: ChainWithGrandpa, { helpers::relayed_incoming_message_works::< RuntimeHelper::Runtime, @@ -407,7 +374,8 @@ pub fn complex_relay_extrinsic_works( // to be submitted by relayer to this chain. let (relay_chain_header, grandpa_justification, message_proof) = test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( lane_id, @@ -428,7 +396,7 @@ pub fn complex_relay_extrinsic_works( }.into(), BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain, - proof: message_proof, + proof: Box::new(message_proof), messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }.into(), @@ -470,13 +438,7 @@ where pallet_utility::Config>, RuntimeCallOf: From> + From>, - UnderlyingChainOf>: ChainWithGrandpa, - >::SourceHeaderChain: - SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof< - HashOf>, - >, - >, + BridgedChainOf: ChainWithGrandpa, { run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, @@ -487,7 +449,8 @@ where // the message additionally let (relay_chain_header, grandpa_justification, message_proof) = test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( LaneId::default(), @@ -526,19 +489,11 @@ where AccountIdOf: From, RuntimeHelper::Runtime: pallet_utility::Config>, - MessageThisChain: + ThisChainOf: bp_runtime::Chain>, RuntimeCallOf: From> + From>, - UnderlyingChainOf>: ChainWithGrandpa, - >::TargetHeaderChain: - TargetHeaderChain< - XcmAsPlainPayload, - AccountIdOf, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< - HashOf>>, - >, - >, + BridgedChainOf: ChainWithGrandpa, { run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, @@ -550,7 +505,8 @@ where }; let (relay_chain_header, grandpa_justification, message_delivery_proof) = test_data::from_grandpa_chain::make_complex_relayer_confirmation_proofs::< - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( LaneId::default(), @@ -587,13 +543,7 @@ where RuntimeHelper: WithRemoteGrandpaChainHelper, RuntimeCallOf: From>, - UnderlyingChainOf>: ChainWithGrandpa, - >::SourceHeaderChain: - SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof< - HashOf>, - >, - >, + BridgedChainOf: ChainWithGrandpa, { run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, @@ -604,7 +554,8 @@ where // the message additionally let (_, _, message_proof) = test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( LaneId::default(), @@ -639,19 +590,11 @@ pub fn can_calculate_fee_for_standalone_message_confirmation_transaction: From, - MessageThisChain: + ThisChainOf: bp_runtime::Chain>, RuntimeCallOf: From>, - UnderlyingChainOf>: ChainWithGrandpa, - >::TargetHeaderChain: - TargetHeaderChain< - XcmAsPlainPayload, - AccountIdOf, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< - HashOf>>, - >, - >, + BridgedChainOf: ChainWithGrandpa, { run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, @@ -663,7 +606,8 @@ where }; let (_, _, message_delivery_proof) = test_data::from_grandpa_chain::make_complex_relayer_confirmation_proofs::< - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( LaneId::default(), diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs index 12ab382d9e0..6580648e660 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs @@ -23,22 +23,14 @@ use crate::{ }; use bp_header_chain::ChainWithGrandpa; -use bp_messages::{ - source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, LaneId, - UnrewardedRelayersState, -}; +use bp_messages::{LaneId, UnrewardedRelayersState}; use bp_polkadot_core::parachains::ParaHash; use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; -use bp_runtime::{HashOf, Parachain, UnderlyingChainOf}; -use bridge_runtime_common::{ - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - BridgedChain as MessageBridgedChain, MessageBridge, ThisChain as MessageThisChain, - }, - messages_xcm_extension::XcmAsPlainPayload, -}; +use bp_runtime::{Chain, Parachain}; +use bridge_runtime_common::messages_xcm_extension::XcmAsPlainPayload; use frame_support::traits::{OnFinalize, OnInitialize}; use frame_system::pallet_prelude::BlockNumberFor; +use pallet_bridge_messages::{BridgedChainOf, ThisChainOf}; use parachains_runtimes_test_utils::{ AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, RuntimeCallOf, SlotDurations, }; @@ -59,7 +51,6 @@ pub trait WithRemoteParachainHelper { + BridgeMessagesConfig< Self::MPI, InboundPayload = XcmAsPlainPayload, - InboundRelayer = bp_runtime::AccountIdOf>, OutboundPayload = XcmAsPlainPayload, > + pallet_bridge_relayers::Config; /// All pallets of this chain, excluding system pallet. @@ -71,17 +62,15 @@ pub trait WithRemoteParachainHelper { type PPI: 'static; /// Instance of the `pallet-bridge-messages`, used to bridge with remote parachain. type MPI: 'static; - /// Messages bridge definition. - type MB: MessageBridge; } /// Adapter struct that implements `WithRemoteParachainHelper`. -pub struct WithRemoteParachainHelperAdapter( - sp_std::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, PPI, MPI, MB)>, +pub struct WithRemoteParachainHelperAdapter( + sp_std::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, PPI, MPI)>, ); -impl WithRemoteParachainHelper - for WithRemoteParachainHelperAdapter +impl WithRemoteParachainHelper + for WithRemoteParachainHelperAdapter where Runtime: BasicParachainRuntime + cumulus_pallet_xcmp_queue::Config @@ -90,7 +79,6 @@ where + BridgeMessagesConfig< MPI, InboundPayload = XcmAsPlainPayload, - InboundRelayer = bp_runtime::AccountIdOf>, OutboundPayload = XcmAsPlainPayload, > + pallet_bridge_relayers::Config, AllPalletsWithoutSystem: @@ -98,14 +86,13 @@ where GPI: 'static, PPI: 'static, MPI: 'static, - MB: MessageBridge, + // MB: MessageBridge, { type Runtime = Runtime; type AllPalletsWithoutSystem = AllPalletsWithoutSystem; type GPI = GPI; type PPI = PPI; type MPI = MPI; - type MB = MB; } /// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, @@ -131,16 +118,9 @@ pub fn relayed_incoming_message_works( RuntimeCallOf: From> + From> + From>, - UnderlyingChainOf>: - bp_runtime::Chain + Parachain, + BridgedChainOf: Chain + Parachain, >::BridgedChain: bp_runtime::Chain + ChainWithGrandpa, - >::SourceHeaderChain: - SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof< - HashOf>, - >, - >, { helpers::relayed_incoming_message_works::< RuntimeHelper::Runtime, @@ -179,7 +159,8 @@ pub fn relayed_incoming_message_works( message_proof, ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< >::BridgedChain, - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( lane_id, @@ -219,7 +200,7 @@ pub fn relayed_incoming_message_works( ( BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain, - proof: message_proof, + proof: Box::new(message_proof), messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }.into(), @@ -268,16 +249,9 @@ pub fn free_relay_extrinsic_works( RuntimeCallOf: From> + From> + From>, - UnderlyingChainOf>: - bp_runtime::Chain + Parachain, + BridgedChainOf: Chain + Parachain, >::BridgedChain: bp_runtime::Chain + ChainWithGrandpa, - >::SourceHeaderChain: - SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof< - HashOf>, - >, - >, { // ensure that the runtime allows free header submissions let free_headers_interval = ( message_proof, ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< >::BridgedChain, - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( lane_id, @@ -390,7 +365,7 @@ pub fn free_relay_extrinsic_works( ( BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain, - proof: message_proof, + proof: Box::new(message_proof), messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }.into(), @@ -440,16 +415,9 @@ pub fn complex_relay_extrinsic_works( + From> + From> + From>, - UnderlyingChainOf>: - bp_runtime::Chain + Parachain, + BridgedChainOf: Chain + Parachain, >::BridgedChain: bp_runtime::Chain + ChainWithGrandpa, - >::SourceHeaderChain: - SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof< - HashOf>, - >, - >, { helpers::relayed_incoming_message_works::< RuntimeHelper::Runtime, @@ -488,7 +456,8 @@ pub fn complex_relay_extrinsic_works( message_proof, ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< >::BridgedChain, - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( lane_id, @@ -518,7 +487,7 @@ pub fn complex_relay_extrinsic_works( }.into(), BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain, - proof: message_proof, + proof: Box::new(message_proof), messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }.into(), @@ -565,16 +534,9 @@ where RuntimeCallOf: From> + From> + From>, - UnderlyingChainOf>: - bp_runtime::Chain + Parachain, + BridgedChainOf: Chain + Parachain, >::BridgedChain: bp_runtime::Chain + ChainWithGrandpa, - >::SourceHeaderChain: - SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof< - HashOf>, - >, - >, { run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, @@ -592,7 +554,8 @@ where message_proof, ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< >::BridgedChain, - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( LaneId::default(), @@ -612,7 +575,6 @@ where RuntimeHelper::GPI, RuntimeHelper::PPI, RuntimeHelper::MPI, - _, >( relay_chain_header, grandpa_justification, @@ -637,23 +599,14 @@ where AccountIdOf: From, RuntimeHelper::Runtime: pallet_utility::Config>, - MessageThisChain: - bp_runtime::Chain>, + ThisChainOf: + Chain>, RuntimeCallOf: From> + From> + From>, - UnderlyingChainOf>: - bp_runtime::Chain + Parachain, + BridgedChainOf: Chain + Parachain, >::BridgedChain: bp_runtime::Chain + ChainWithGrandpa, - >::TargetHeaderChain: - TargetHeaderChain< - XcmAsPlainPayload, - AccountIdOf, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< - HashOf>>, - >, - >, { run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, @@ -672,7 +625,8 @@ where message_delivery_proof, ) = test_data::from_parachain::make_complex_relayer_confirmation_proofs::< >::BridgedChain, - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( LaneId::default(), @@ -714,16 +668,9 @@ where RuntimeHelper: WithRemoteParachainHelper, RuntimeCallOf: From>, - UnderlyingChainOf>: - bp_runtime::Chain + Parachain, + BridgedChainOf: Chain + Parachain, >::BridgedChain: bp_runtime::Chain + ChainWithGrandpa, - >::SourceHeaderChain: - SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof< - HashOf>, - >, - >, { run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, @@ -741,7 +688,8 @@ where message_proof, ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< >::BridgedChain, - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( LaneId::default(), @@ -757,7 +705,6 @@ where let call = test_data::from_parachain::make_standalone_relayer_delivery_call::< RuntimeHelper::Runtime, RuntimeHelper::MPI, - _, >( message_proof, helpers::relayer_id_at_bridged_chain::(), @@ -778,22 +725,13 @@ pub fn can_calculate_fee_for_standalone_message_confirmation_transaction: From, - MessageThisChain: - bp_runtime::Chain>, + ThisChainOf: + Chain>, RuntimeCallOf: From>, - UnderlyingChainOf>: - bp_runtime::Chain + Parachain, + BridgedChainOf: Chain + Parachain, >::BridgedChain: bp_runtime::Chain + ChainWithGrandpa, - >::TargetHeaderChain: - TargetHeaderChain< - XcmAsPlainPayload, - AccountIdOf, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< - HashOf>>, - >, - >, { run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, @@ -806,7 +744,8 @@ where let (_, _, _, _, _, message_delivery_proof) = test_data::from_parachain::make_complex_relayer_confirmation_proofs::< >::BridgedChain, - RuntimeHelper::MB, + BridgedChainOf, + ThisChainOf, (), >( LaneId::default(), diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs index 0ce049cd1c4..c990c6e5307 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs @@ -29,6 +29,7 @@ use frame_support::{ }; use frame_system::pallet_prelude::BlockNumberFor; use pallet_bridge_grandpa::{BridgedBlockHash, BridgedHeader}; +use pallet_bridge_messages::BridgedChainOf; use parachains_common::AccountId; use parachains_runtimes_test_utils::{ mock_open_hrmp_channel, AccountIdOf, CollatorSessionKeys, RuntimeCallOf, SlotDurations, @@ -240,10 +241,12 @@ pub(crate) fn initialize_bridge_grandpa_pallet( pub type CallsAndVerifiers = Vec<(RuntimeCallOf, Box)>; +pub type InboundRelayerId = bp_runtime::AccountIdOf>; + /// Returns relayer id at the bridged chain. pub fn relayer_id_at_bridged_chain, MPI>( -) -> Runtime::InboundRelayer { - Runtime::InboundRelayer::decode(&mut TrailingZeroInput::zeroes()).unwrap() +) -> InboundRelayerId { + Decode::decode(&mut TrailingZeroInput::zeroes()).unwrap() } /// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, @@ -260,7 +263,7 @@ pub fn relayed_incoming_message_works( ) -> sp_runtime::DispatchOutcome, prepare_message_proof_import: impl FnOnce( Runtime::AccountId, - Runtime::InboundRelayer, + InboundRelayerId, InteriorLocation, MessageNonce, Xcm<()>, diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs index e5d5e7cac96..c61a31e5454 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs @@ -19,30 +19,29 @@ use crate::test_data::prepare_inbound_xcm; use bp_messages::{ - source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, LaneId, MessageNonce, + source_chain::FromBridgedChainMessagesDeliveryProof, + target_chain::FromBridgedChainMessagesProof, ChainWithMessages, LaneId, MessageNonce, UnrewardedRelayersState, }; -use bp_runtime::{AccountIdOf, BlockNumberOf, HeaderOf, StorageProofSize, UnderlyingChainOf}; +use bp_runtime::{AccountIdOf, BlockNumberOf, Chain, HeaderOf, UnverifiedStorageProofParams}; use bp_test_utils::make_default_justification; -use bridge_runtime_common::{ - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - BridgedChain as MessageBridgedChain, MessageBridge, ThisChain as MessageThisChain, - }, - messages_generation::{ - encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, - prepare_messages_storage_proof, - }, - messages_xcm_extension::XcmAsPlainPayload, -}; +use bridge_runtime_common::messages_xcm_extension::XcmAsPlainPayload; use codec::Encode; use pallet_bridge_grandpa::{BridgedChain, BridgedHeader}; use sp_runtime::traits::Header as HeaderT; use xcm::latest::prelude::*; +use crate::test_cases::helpers::InboundRelayerId; use bp_header_chain::{justification::GrandpaJustification, ChainWithGrandpa}; use bp_messages::{DeliveredMessages, InboundLaneData, UnrewardedRelayer}; use bp_runtime::HashOf; +use pallet_bridge_messages::{ + messages_generation::{ + encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, + prepare_messages_storage_proof, + }, + BridgedChainOf, +}; use sp_runtime::DigestItem; /// Prepare a batch call with bridged GRANDPA finality and message proof. @@ -50,22 +49,17 @@ pub fn make_complex_relayer_delivery_batch( bridged_header: BridgedHeader, bridged_justification: GrandpaJustification>, message_proof: FromBridgedChainMessagesProof>>, - relayer_id_at_bridged_chain: AccountIdOf>, + relayer_id_at_bridged_chain: InboundRelayerId, ) -> pallet_utility::Call where Runtime: pallet_bridge_grandpa::Config - + pallet_bridge_messages::Config< - MPI, - InboundPayload = XcmAsPlainPayload, - InboundRelayer = AccountIdOf>, - > + pallet_utility::Config, + + pallet_bridge_messages::Config + + pallet_utility::Config, GPI: 'static, MPI: 'static, - >::SourceHeaderChain: SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof>>, - >, ::RuntimeCall: From> + From>, + BridgedChainOf: Chain>>, { let submit_grandpa = pallet_bridge_grandpa::Call::::submit_finality_proof { finality_target: Box::new(bridged_header), @@ -73,7 +67,7 @@ where }; let submit_message = pallet_bridge_messages::Call::::receive_messages_proof { relayer_id_at_bridged_chain, - proof: message_proof, + proof: Box::new(message_proof), messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }; @@ -97,15 +91,9 @@ where + pallet_utility::Config, GPI: 'static, MPI: 'static, - >::TargetHeaderChain: TargetHeaderChain< - XcmAsPlainPayload, - Runtime::AccountId, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< - HashOf>, - >, - >, ::RuntimeCall: From> + From>, + BridgedChainOf: Chain>>, { let submit_grandpa = pallet_bridge_grandpa::Call::::submit_finality_proof { finality_target: Box::new(bridged_header), @@ -124,24 +112,18 @@ where /// Prepare a call with message proof. pub fn make_standalone_relayer_delivery_call( message_proof: FromBridgedChainMessagesProof>>, - relayer_id_at_bridged_chain: AccountIdOf>, + relayer_id_at_bridged_chain: InboundRelayerId, ) -> Runtime::RuntimeCall where Runtime: pallet_bridge_grandpa::Config - + pallet_bridge_messages::Config< - MPI, - InboundPayload = XcmAsPlainPayload, - InboundRelayer = AccountIdOf>, - >, + + pallet_bridge_messages::Config, MPI: 'static, - >::SourceHeaderChain: SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof>>, - >, Runtime::RuntimeCall: From>, + BridgedChainOf: Chain>>, { pallet_bridge_messages::Call::::receive_messages_proof { relayer_id_at_bridged_chain, - proof: message_proof, + proof: Box::new(message_proof), messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), } @@ -159,14 +141,8 @@ where Runtime: pallet_bridge_grandpa::Config + pallet_bridge_messages::Config, MPI: 'static, - >::TargetHeaderChain: TargetHeaderChain< - XcmAsPlainPayload, - Runtime::AccountId, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< - HashOf>, - >, - >, Runtime::RuntimeCall: From>, + BridgedChainOf: Chain>>, { pallet_bridge_messages::Call::::receive_messages_delivery_proof { proof: message_delivery_proof, @@ -176,39 +152,47 @@ where } /// Prepare storage proofs of messages, stored at the (bridged) source GRANDPA chain. -pub fn make_complex_relayer_delivery_proofs( +pub fn make_complex_relayer_delivery_proofs< + BridgedChain, + ThisChainWithMessages, + InnerXcmRuntimeCall, +>( lane_id: LaneId, xcm_message: Xcm, message_nonce: MessageNonce, message_destination: Junctions, - header_number: BlockNumberOf>, + header_number: BlockNumberOf, is_minimal_call: bool, ) -> ( - HeaderOf>, - GrandpaJustification>>, - FromBridgedChainMessagesProof>>, + HeaderOf, + GrandpaJustification>, + FromBridgedChainMessagesProof>, ) where - MB: MessageBridge, - MessageBridgedChain: Send + Sync + 'static, - UnderlyingChainOf>: ChainWithGrandpa, + BridgedChain: ChainWithGrandpa, + ThisChainWithMessages: ChainWithMessages, { + // prepare message let message_payload = prepare_inbound_xcm(xcm_message, message_destination); - let message_size = StorageProofSize::Minimal(message_payload.len() as u32); - // prepare para storage proof containing message - let (state_root, storage_proof) = prepare_messages_storage_proof::( - lane_id, - message_nonce..=message_nonce, - None, - message_size, - message_payload, - encode_all_messages, - encode_lane_data, - ); + // prepare storage proof containing message + let (state_root, storage_proof) = + prepare_messages_storage_proof::( + lane_id, + message_nonce..=message_nonce, + None, + UnverifiedStorageProofParams::from_db_size(message_payload.len() as u32), + |_| message_payload.clone(), + encode_all_messages, + encode_lane_data, + false, + false, + ); - let (header, justification) = make_complex_bridged_grandpa_header_proof::< - MessageBridgedChain, - >(state_root, header_number, is_minimal_call); + let (header, justification) = make_complex_bridged_grandpa_header_proof::( + state_root, + header_number, + is_minimal_call, + ); let message_proof = FromBridgedChainMessagesProof { bridged_header_hash: header.hash(), @@ -222,44 +206,44 @@ where } /// Prepare storage proofs of message confirmations, stored at the (bridged) target GRANDPA chain. -pub fn make_complex_relayer_confirmation_proofs( +pub fn make_complex_relayer_confirmation_proofs< + BridgedChain, + ThisChainWithMessages, + InnerXcmRuntimeCall, +>( lane_id: LaneId, - header_number: BlockNumberOf>, - relayer_id_at_this_chain: AccountIdOf>, + header_number: BlockNumberOf, + relayer_id_at_this_chain: AccountIdOf, relayers_state: UnrewardedRelayersState, ) -> ( - HeaderOf>, - GrandpaJustification>>, - FromBridgedChainMessagesDeliveryProof>>, + HeaderOf, + GrandpaJustification>, + FromBridgedChainMessagesDeliveryProof>, ) where - MB: MessageBridge, - MessageBridgedChain: Send + Sync + 'static, - MessageThisChain: Send + Sync + 'static, - UnderlyingChainOf>: ChainWithGrandpa, + BridgedChain: ChainWithGrandpa, + ThisChainWithMessages: ChainWithMessages, { // prepare storage proof containing message delivery proof - let (state_root, storage_proof) = prepare_message_delivery_storage_proof::( - lane_id, - InboundLaneData { - relayers: vec![ - UnrewardedRelayer { - relayer: relayer_id_at_this_chain, - messages: DeliveredMessages::new(1) - }; - relayers_state.unrewarded_relayer_entries as usize - ] - .into(), - last_confirmed_nonce: 1, - }, - StorageProofSize::Minimal(0), - ); + let (state_root, storage_proof) = + prepare_message_delivery_storage_proof::( + lane_id, + InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: relayer_id_at_this_chain, + messages: DeliveredMessages::new(1) + }; + relayers_state.unrewarded_relayer_entries as usize + ] + .into(), + last_confirmed_nonce: 1, + }, + UnverifiedStorageProofParams::default(), + ); - let (header, justification) = make_complex_bridged_grandpa_header_proof::( - state_root, - header_number, - false, - ); + let (header, justification) = + make_complex_bridged_grandpa_header_proof::(state_root, header_number, false); let message_delivery_proof = FromBridgedChainMessagesDeliveryProof { bridged_header_hash: header.hash(), diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs index 5d3cba4e53b..897fe0d0b0f 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs @@ -19,61 +19,58 @@ use super::{from_grandpa_chain::make_complex_bridged_grandpa_header_proof, prepare_inbound_xcm}; use bp_messages::{ - source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, LaneId, + source_chain::FromBridgedChainMessagesDeliveryProof, + target_chain::FromBridgedChainMessagesProof, ChainWithMessages, LaneId, UnrewardedRelayersState, Weight, }; use bp_runtime::{ - AccountIdOf, BlockNumberOf, HeaderOf, Parachain, StorageProofSize, UnderlyingChainOf, + AccountIdOf, BlockNumberOf, Chain, HeaderOf, Parachain, UnverifiedStorageProofParams, }; use bp_test_utils::prepare_parachain_heads_proof; -use bridge_runtime_common::{ - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - BridgedChain as MessageBridgedChain, MessageBridge, ThisChain as MessageThisChain, - }, - messages_generation::{ - encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, - prepare_messages_storage_proof, - }, - messages_xcm_extension::XcmAsPlainPayload, -}; +use bridge_runtime_common::messages_xcm_extension::XcmAsPlainPayload; use codec::Encode; use pallet_bridge_grandpa::BridgedHeader; use pallet_bridge_parachains::{RelayBlockHash, RelayBlockNumber}; use sp_runtime::traits::Header as HeaderT; use xcm::latest::prelude::*; +use crate::test_cases::helpers::InboundRelayerId; use bp_header_chain::{justification::GrandpaJustification, ChainWithGrandpa}; use bp_messages::{DeliveredMessages, InboundLaneData, MessageNonce, UnrewardedRelayer}; use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; +use pallet_bridge_messages::{ + messages_generation::{ + encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, + prepare_messages_storage_proof, + }, + BridgedChainOf, +}; use sp_runtime::SaturatedConversion; /// Prepare a batch call with relay finality proof, parachain head proof and message proof. -pub fn make_complex_relayer_delivery_batch( +pub fn make_complex_relayer_delivery_batch( relay_chain_header: BridgedHeader, grandpa_justification: GrandpaJustification>, parachain_heads: Vec<(ParaId, ParaHash)>, para_heads_proof: ParaHeadsProof, message_proof: FromBridgedChainMessagesProof, - relayer_id_at_bridged_chain: InboundRelayer, -) -> pallet_utility::Call where - Runtime:pallet_bridge_grandpa::Config + relayer_id_at_bridged_chain: InboundRelayerId, +) -> pallet_utility::Call +where + Runtime: pallet_bridge_grandpa::Config + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config< - MPI, - InboundPayload = XcmAsPlainPayload, - InboundRelayer = InboundRelayer, - > + + pallet_bridge_messages::Config + pallet_utility::Config, GPI: 'static, PPI: 'static, MPI: 'static, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - <>::BridgedChain as bp_runtime::Chain>::Hash: From, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: - From>, - ::RuntimeCall: - From> + ParaHash: From< + <>::BridgedChain as bp_runtime::Chain>::Hash, + >, + <>::BridgedChain as bp_runtime::Chain>::Hash: + From, + BridgedChainOf: Chain + Parachain, + ::RuntimeCall: From> + From> + From>, { @@ -93,7 +90,7 @@ pub fn make_complex_relayer_delivery_batch::receive_messages_proof { relayer_id_at_bridged_chain: relayer_id_at_bridged_chain.into(), - proof: message_proof.into(), + proof: Box::new(message_proof), messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }; @@ -122,11 +119,7 @@ where MPI: 'static, >::BridgedChain: bp_runtime::Chain + ChainWithGrandpa, - >::TargetHeaderChain: TargetHeaderChain< - XcmAsPlainPayload, - Runtime::AccountId, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof, - >, + BridgedChainOf: Chain + Parachain, ::RuntimeCall: From> + From> + From>, @@ -160,23 +153,19 @@ where } /// Prepare a call with message proof. -pub fn make_standalone_relayer_delivery_call( +pub fn make_standalone_relayer_delivery_call( message_proof: FromBridgedChainMessagesProof, - relayer_id_at_bridged_chain: InboundRelayer, -) -> Runtime::RuntimeCall where - Runtime: pallet_bridge_messages::Config< - MPI, - InboundPayload = XcmAsPlainPayload, - InboundRelayer = InboundRelayer, - >, + relayer_id_at_bridged_chain: InboundRelayerId, +) -> Runtime::RuntimeCall +where + Runtime: pallet_bridge_messages::Config, MPI: 'static, - Runtime::RuntimeCall: From>, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: - From>, + Runtime::RuntimeCall: From>, + BridgedChainOf: Chain + Parachain, { pallet_bridge_messages::Call::::receive_messages_proof { relayer_id_at_bridged_chain: relayer_id_at_bridged_chain.into(), - proof: message_proof.into(), + proof: Box::new(message_proof), messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), } @@ -192,11 +181,7 @@ where Runtime: pallet_bridge_messages::Config, MPI: 'static, Runtime::RuntimeCall: From>, - >::TargetHeaderChain: TargetHeaderChain< - XcmAsPlainPayload, - Runtime::AccountId, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof, - >, + BridgedChainOf: Chain + Parachain, { pallet_bridge_messages::Call::::receive_messages_delivery_proof { proof: message_delivery_proof, @@ -206,7 +191,12 @@ where } /// Prepare storage proofs of messages, stored at the source chain. -pub fn make_complex_relayer_delivery_proofs( +pub fn make_complex_relayer_delivery_proofs< + BridgedRelayChain, + BridgedParachain, + ThisChainWithMessages, + InnerXcmRuntimeCall, +>( lane_id: LaneId, xcm_message: Xcm, message_nonce: MessageNonce, @@ -226,24 +216,27 @@ pub fn make_complex_relayer_delivery_proofs + ChainWithGrandpa, - MB: MessageBridge, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, + BridgedParachain: bp_runtime::Chain + Parachain, + ThisChainWithMessages: ChainWithMessages, { + // prepare message let message_payload = prepare_inbound_xcm(xcm_message, message_destination); - let message_size = StorageProofSize::Minimal(message_payload.len() as u32); // prepare para storage proof containing message - let (para_state_root, para_storage_proof) = prepare_messages_storage_proof::( - lane_id, - message_nonce..=message_nonce, - None, - message_size, - message_payload, - encode_all_messages, - encode_lane_data, - ); + let (para_state_root, para_storage_proof) = + prepare_messages_storage_proof::( + lane_id, + message_nonce..=message_nonce, + None, + UnverifiedStorageProofParams::from_db_size(message_payload.len() as u32), + |_| message_payload.clone(), + encode_all_messages, + encode_lane_data, + false, + false, + ); let (relay_chain_header, justification, bridged_para_head, parachain_heads, para_heads_proof) = - make_complex_bridged_parachain_heads_proof::( + make_complex_bridged_parachain_heads_proof::( para_state_root, para_header_number, relay_header_number, @@ -270,12 +263,17 @@ where } /// Prepare storage proofs of message confirmations, stored at the target parachain. -pub fn make_complex_relayer_confirmation_proofs( +pub fn make_complex_relayer_confirmation_proofs< + BridgedRelayChain, + BridgedParachain, + ThisChainWithMessages, + InnerXcmRuntimeCall, +>( lane_id: LaneId, para_header_number: u32, relay_header_number: u32, bridged_para_id: u32, - relayer_id_at_this_chain: AccountIdOf>, + relayer_id_at_this_chain: AccountIdOf, relayers_state: UnrewardedRelayersState, ) -> ( HeaderOf, @@ -288,28 +286,29 @@ pub fn make_complex_relayer_confirmation_proofs + ChainWithGrandpa, - MB: MessageBridge, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, + BridgedParachain: bp_runtime::Chain + Parachain, + ThisChainWithMessages: ChainWithMessages, { // prepare para storage proof containing message delivery proof - let (para_state_root, para_storage_proof) = prepare_message_delivery_storage_proof::( - lane_id, - InboundLaneData { - relayers: vec![ - UnrewardedRelayer { - relayer: relayer_id_at_this_chain.into(), - messages: DeliveredMessages::new(1) - }; - relayers_state.unrewarded_relayer_entries as usize - ] - .into(), - last_confirmed_nonce: 1, - }, - StorageProofSize::Minimal(0), - ); + let (para_state_root, para_storage_proof) = + prepare_message_delivery_storage_proof::( + lane_id, + InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: relayer_id_at_this_chain.into(), + messages: DeliveredMessages::new(1) + }; + relayers_state.unrewarded_relayer_entries as usize + ] + .into(), + last_confirmed_nonce: 1, + }, + UnverifiedStorageProofParams::default(), + ); let (relay_chain_header, justification, bridged_para_head, parachain_heads, para_heads_proof) = - make_complex_bridged_parachain_heads_proof::( + make_complex_bridged_parachain_heads_proof::( para_state_root, para_header_number, relay_header_number, @@ -334,7 +333,7 @@ where } /// Make bridged parachain header with given state root and relay header that is finalizing it. -pub fn make_complex_bridged_parachain_heads_proof( +pub fn make_complex_bridged_parachain_heads_proof( para_state_root: ParaHash, para_header_number: u32, relay_header_number: BlockNumberOf, @@ -350,20 +349,17 @@ pub fn make_complex_bridged_parachain_heads_proof( where BridgedRelayChain: bp_runtime::Chain + ChainWithGrandpa, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, + BridgedParachain: bp_runtime::Chain + Parachain, { let bridged_para_head = ParaHead( - bp_test_utils::test_header_with_root::>( + bp_test_utils::test_header_with_root::>( para_header_number.into(), para_state_root, ) .encode(), ); let (relay_state_root, para_heads_proof, parachain_heads) = - prepare_parachain_heads_proof::>(vec![( + prepare_parachain_heads_proof::>(vec![( bridged_para_id, bridged_para_head.clone(), )]); diff --git a/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile index e17952ccee8..634b9f18829 100644 --- a/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile +++ b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile @@ -1,7 +1,7 @@ # this image is built on top of existing Zombienet image ARG ZOMBIENET_IMAGE # this image uses substrate-relay image built elsewhere -ARG SUBSTRATE_RELAY_IMAGE=docker.io/paritytech/substrate-relay:v1.6.4 +ARG SUBSTRATE_RELAY_IMAGE=docker.io/paritytech/substrate-relay:v1.6.5 # metadata ARG VCS_REF diff --git a/prdoc/pr_4935.prdoc b/prdoc/pr_4935.prdoc new file mode 100644 index 00000000000..2b06899b633 --- /dev/null +++ b/prdoc/pr_4935.prdoc @@ -0,0 +1,75 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Bridges V2 refactoring backport and `pallet_bridge_messages` simplifications" + +doc: + - audience: Runtime Dev + description: | + This introduces several simplifications to the pallet_bridge_messages::Config configuration. + Types like `BridgedChainId`, `MaxUnrewardedRelayerEntriesAtInboundLane`, `MaxUnconfirmedMessagesAtInboundLane`, `MaximalOutboundPayloadSize`, + `InboundRelayer`, `TargetHeaderChain`, and `SourceHeaderChain` were removed. + Now, you only need to provide specific bridging chain configurations for `ThisChain`, `BridgedChain`, and `BridgedHeaderChain`. + + If you previously specified implementations for the bp_runtime::Chain* traits, those will fit here exactly, for example: + ``` + type ThisChain = bp_bridge_hub_rococo::BridgeHubRococo; + type BridgedChain = bp_bridge_hub_westend::BridgeHubWestend; + type BridgedHeaderChain = pallet_bridge_parachains::ParachainHeaders< + Runtime, + BridgeParachainWestendInstance, + bp_bridge_hub_westend::BridgeHubWestend, + >; + ``` + +crates: + - name: pallet-bridge-messages + bump: major + - name: bridge-runtime-common + bump: major + - name: bp-header-chain + bump: major + - name: bp-runtime + bump: major + - name: bp-messages + bump: major + - name: bp-polkadot-core + bump: patch + - name: bp-bridge-hub-kusama + bump: minor + - name: bp-bridge-hub-polkadot + bump: minor + - name: bp-bridge-hub-rococo + bump: minor + - name: bp-bridge-hub-westend + bump: minor + - name: bp-kusama + bump: minor + - name: bp-polkadot + bump: minor + - name: bp-polkadot-bulletin + bump: minor + - name: bp-rococo + bump: minor + - name: bp-test-utils + bump: patch + - name: bp-westend + bump: minor + - name: bridge-hub-test-utils + bump: major + - name: pallet-bridge-grandpa + bump: patch + - name: pallet-bridge-parachains + bump: patch + - name: pallet-bridge-relayers + bump: patch + - name: pallet-xcm-bridge-hub + bump: patch + - name: asset-hub-rococo-runtime + bump: patch + - name: asset-hub-westend-runtime + bump: patch + - name: bridge-hub-rococo-runtime + bump: major + - name: bridge-hub-westend-runtime + bump: major -- GitLab From ebb1bb60bb86ce7527964437c67e067a212c36b0 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Fri, 12 Jul 2024 12:24:36 +0200 Subject: [PATCH 114/130] added sync command (#4818) Added the command sync. Follow up on #4701 This PR is blocked until a new machine for the sync gets deployed. --- .github/commands-readme.md | 1 + .github/workflows/command-bench-all.yml | 2 +- .github/workflows/command-sync.yml | 68 +++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/command-sync.yml diff --git a/.github/commands-readme.md b/.github/commands-readme.md index bf0e9e5ed20..20644c048c6 100644 --- a/.github/commands-readme.md +++ b/.github/commands-readme.md @@ -10,6 +10,7 @@ The current available command actions are: - [Command FMT](https://github.com/paritytech/polkadot-sdk/actions/workflows/command-fmt.yml) - [Command Update UI](https://github.com/paritytech/polkadot-sdk/actions/workflows/command-update-ui.yml) +- [Command Sync](https://github.com/paritytech/polkadot-sdk/actions/workflows/command-sync.yml) - [Command Bench](https://github.com/paritytech/polkadot-sdk/actions/workflows/command-bench.yml) - [Command Bench All](https://github.com/paritytech/polkadot-sdk/actions/workflows/command-bench-all.yml) - [Command Bench Overhead](https://github.com/paritytech/polkadot-sdk/actions/workflows/command-bench-overhead.yml) diff --git a/.github/workflows/command-bench-all.yml b/.github/workflows/command-bench-all.yml index f1d1589bea2..6aa4f6f7ff0 100644 --- a/.github/workflows/command-bench-all.yml +++ b/.github/workflows/command-bench-all.yml @@ -63,7 +63,7 @@ jobs: run: cat .github/env >> $GITHUB_OUTPUT cmd-bench-all: needs: [set-image] - runs-on: arc-runners-polkadot-sdk-benchmark + runs-on: arc-runners-polkadot-sdk-weights container: image: ${{ needs.set-image.outputs.IMAGE }} steps: diff --git a/.github/workflows/command-sync.yml b/.github/workflows/command-sync.yml new file mode 100644 index 00000000000..fa5bb9eaf91 --- /dev/null +++ b/.github/workflows/command-sync.yml @@ -0,0 +1,68 @@ +name: Command Sync + +on: + workflow_dispatch: + inputs: + pr: + description: Number of the Pull Request + required: true + chain: + description: Chain + type: choice + required: true + options: + - westend + - rococo + sync-type: + description: Sync type + type: choice + required: true + options: + - warp + - full + - fast + - fast-unsafe + +jobs: + set-image: + runs-on: ubuntu-latest + outputs: + IMAGE: ${{ steps.set_image.outputs.IMAGE }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - id: set_image + run: cat .github/env >> $GITHUB_OUTPUT + cmd-sync: + needs: [set-image] + runs-on: arc-runners-polkadot-sdk-warpsync + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: + - name: Download repo + uses: actions/checkout@v4 + - name: Install gh cli + id: gh + uses: ./.github/actions/set-up-gh + with: + pr-number: ${{ inputs.pr }} + GH_TOKEN: ${{ github.token }} + - name: Run sync + run: | + "./scripts/sync.sh" --chain "${{ inputs.chain }}" --type "${{ inputs.sync-type }}" + - name: Report failure + if: ${{ failure() }} + run: gh pr comment ${{ inputs.pr }} --body "

    Command failed ❌

    Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} + - run: git pull --rebase + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: cmd-action - ${{ github.workflow }} + branch: ${{ steps.gh.outputs.branch }} + - name: Report succeed + run: gh pr comment ${{ inputs.pr }} --body "

    Action completed 🎉🎉

    Run by @${{ github.actor }} for ${{ github.workflow }} completed 🎉. See logs here." + env: + RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_TOKEN: ${{ github.token }} -- GitLab From d31285a1562318959a7b21dbfec95c2fd6f06d7a Mon Sep 17 00:00:00 2001 From: Andrei Eres Date: Fri, 12 Jul 2024 12:43:48 +0200 Subject: [PATCH 115/130] [statement-distribution] Add metrics for distributed statements in V2 (#4554) Part of https://github.com/paritytech/polkadot-sdk/issues/4334 --- .../network/statement-distribution/src/lib.rs | 30 +++++- .../statement-distribution/src/metrics.rs | 9 +- .../statement-distribution/src/v2/mod.rs | 102 +++++++++++++----- 3 files changed, 109 insertions(+), 32 deletions(-) diff --git a/polkadot/node/network/statement-distribution/src/lib.rs b/polkadot/node/network/statement-distribution/src/lib.rs index 4d56c795f13..33431eb1edc 100644 --- a/polkadot/node/network/statement-distribution/src/lib.rs +++ b/polkadot/node/network/statement-distribution/src/lib.rs @@ -284,7 +284,14 @@ impl StatementDistributionSubsystem { ); }, MuxedMessage::Response(result) => { - v2::handle_response(&mut ctx, &mut state, result, &mut self.reputation).await; + v2::handle_response( + &mut ctx, + &mut state, + result, + &mut self.reputation, + &self.metrics, + ) + .await; }, MuxedMessage::RetryRequest(()) => { // A pending request is ready to retry. This is only a signal to call @@ -320,7 +327,8 @@ impl StatementDistributionSubsystem { let mode = prospective_parachains_mode(ctx.sender(), activated.hash).await?; if let ProspectiveParachainsMode::Enabled { .. } = mode { let res = - v2::handle_active_leaves_update(ctx, state, activated, mode).await; + v2::handle_active_leaves_update(ctx, state, activated, mode, &metrics) + .await; // Regardless of the result of leaf activation, we always prune before // handling it to avoid leaks. v2::handle_deactivate_leaves(state, &deactivated); @@ -370,6 +378,7 @@ impl StatementDistributionSubsystem { relay_parent, statement, &mut self.reputation, + &self.metrics, ) .await?; } @@ -428,11 +437,24 @@ impl StatementDistributionSubsystem { if target.targets_current() { // pass to v2. - v2::handle_network_update(ctx, state, event, &mut self.reputation).await; + v2::handle_network_update( + ctx, + state, + event, + &mut self.reputation, + &self.metrics, + ) + .await; } }, StatementDistributionMessage::Backed(candidate_hash) => { - crate::v2::handle_backed_candidate_message(ctx, state, candidate_hash).await; + crate::v2::handle_backed_candidate_message( + ctx, + state, + candidate_hash, + &self.metrics, + ) + .await; }, }, } diff --git a/polkadot/node/network/statement-distribution/src/metrics.rs b/polkadot/node/network/statement-distribution/src/metrics.rs index 1bc99417426..e21fff1e642 100644 --- a/polkadot/node/network/statement-distribution/src/metrics.rs +++ b/polkadot/node/network/statement-distribution/src/metrics.rs @@ -25,13 +25,13 @@ const HISTOGRAM_LATENCY_BUCKETS: &[f64] = &[ #[derive(Clone)] struct MetricsInner { // V1 - statements_distributed: prometheus::Counter, sent_requests: prometheus::Counter, received_responses: prometheus::CounterVec, network_bridge_update: prometheus::HistogramVec, statements_unexpected: prometheus::CounterVec, created_message_size: prometheus::Gauge, // V1+ + statements_distributed: prometheus::Counter, active_leaves_update: prometheus::Histogram, share: prometheus::Histogram, // V2+ @@ -51,6 +51,13 @@ impl Metrics { } } + /// Update statements distributed counter by an amount + pub fn on_statements_distributed(&self, n: usize) { + if let Some(metrics) = &self.0 { + metrics.statements_distributed.inc_by(n as u64); + } + } + /// Update sent requests counter /// This counter is updated merely for the statements sent via request/response method, /// meaning that it counts large statements only diff --git a/polkadot/node/network/statement-distribution/src/v2/mod.rs b/polkadot/node/network/statement-distribution/src/v2/mod.rs index 2bb9c82c6a6..47d350849b2 100644 --- a/polkadot/node/network/statement-distribution/src/v2/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/mod.rs @@ -400,6 +400,7 @@ pub(crate) async fn handle_network_update( state: &mut State, update: NetworkBridgeEvent, reputation: &mut ReputationAggregator, + metrics: &Metrics, ) { match update { NetworkBridgeEvent::PeerConnected(peer_id, role, protocol_version, mut authority_ids) => { @@ -483,23 +484,33 @@ pub(crate) async fn handle_network_update( net_protocol::StatementDistributionMessage::V3( protocol_v3::StatementDistributionMessage::Statement(relay_parent, statement), ) => - handle_incoming_statement(ctx, state, peer_id, relay_parent, statement, reputation) - .await, + handle_incoming_statement( + ctx, + state, + peer_id, + relay_parent, + statement, + reputation, + metrics, + ) + .await, net_protocol::StatementDistributionMessage::V2( protocol_v2::StatementDistributionMessage::BackedCandidateManifest(inner), ) | net_protocol::StatementDistributionMessage::V3( protocol_v3::StatementDistributionMessage::BackedCandidateManifest(inner), - ) => handle_incoming_manifest(ctx, state, peer_id, inner, reputation).await, + ) => handle_incoming_manifest(ctx, state, peer_id, inner, reputation, metrics).await, net_protocol::StatementDistributionMessage::V2( protocol_v2::StatementDistributionMessage::BackedCandidateKnown(inner), ) | net_protocol::StatementDistributionMessage::V3( protocol_v3::StatementDistributionMessage::BackedCandidateKnown(inner), - ) => handle_incoming_acknowledgement(ctx, state, peer_id, inner, reputation).await, + ) => + handle_incoming_acknowledgement(ctx, state, peer_id, inner, reputation, metrics) + .await, }, NetworkBridgeEvent::PeerViewChange(peer_id, view) => - handle_peer_view_update(ctx, state, peer_id, view).await, + handle_peer_view_update(ctx, state, peer_id, view, metrics).await, NetworkBridgeEvent::OurViewChange(_view) => { // handled by `handle_activated_leaf` }, @@ -539,6 +550,7 @@ pub(crate) async fn handle_active_leaves_update( state: &mut State, activated: &ActivatedLeaf, leaf_mode: ProspectiveParachainsMode, + metrics: &Metrics, ) -> JfyiErrorResult<()> { let max_candidate_depth = match leaf_mode { ProspectiveParachainsMode::Disabled => return Ok(()), @@ -714,7 +726,8 @@ pub(crate) async fn handle_active_leaves_update( for (peer, fresh) in update_peers { for fresh_relay_parent in fresh { - send_peer_messages_for_relay_parent(ctx, state, peer, fresh_relay_parent).await; + send_peer_messages_for_relay_parent(ctx, state, peer, fresh_relay_parent, metrics) + .await; } } } @@ -815,6 +828,7 @@ async fn handle_peer_view_update( state: &mut State, peer: PeerId, new_view: View, + metrics: &Metrics, ) { let fresh_implicit = { let peer_data = match state.peers.get_mut(&peer) { @@ -826,7 +840,7 @@ async fn handle_peer_view_update( }; for new_relay_parent in fresh_implicit { - send_peer_messages_for_relay_parent(ctx, state, peer, new_relay_parent).await; + send_peer_messages_for_relay_parent(ctx, state, peer, new_relay_parent, metrics).await; } } @@ -857,6 +871,7 @@ async fn send_peer_messages_for_relay_parent( state: &mut State, peer: PeerId, relay_parent: Hash, + metrics: &Metrics, ) { let peer_data = match state.peers.get_mut(&peer) { None => return, @@ -889,6 +904,7 @@ async fn send_peer_messages_for_relay_parent( &mut active.cluster_tracker, &state.candidates, &relay_parent_state.statement_store, + metrics, ) .await; } @@ -901,6 +917,7 @@ async fn send_peer_messages_for_relay_parent( &per_session_state.groups, relay_parent_state, &state.candidates, + metrics, ) .await; } @@ -949,6 +966,7 @@ async fn send_pending_cluster_statements( cluster_tracker: &mut ClusterTracker, candidates: &Candidates, statement_store: &StatementStore, + metrics: &Metrics, ) { let pending_statements = cluster_tracker.pending_statements_for(peer_validator_id); let network_messages = pending_statements @@ -974,12 +992,12 @@ async fn send_pending_cluster_statements( }) .collect::>(); - if network_messages.is_empty() { - return + if !network_messages.is_empty() { + let count = network_messages.len(); + ctx.send_message(NetworkBridgeTxMessage::SendValidationMessages(network_messages)) + .await; + metrics.on_statements_distributed(count); } - - ctx.send_message(NetworkBridgeTxMessage::SendValidationMessages(network_messages)) - .await; } /// Send a peer all pending grid messages / acknowledgements / follow up statements @@ -993,6 +1011,7 @@ async fn send_pending_grid_messages( groups: &Groups, relay_parent_state: &mut PerRelayParentState, candidates: &Candidates, + metrics: &Metrics, ) { let pending_manifests = { let local_validator = match relay_parent_state.local_validator.as_mut() { @@ -1005,6 +1024,7 @@ async fn send_pending_grid_messages( }; let mut messages: Vec<(Vec, net_protocol::VersionedValidationProtocol)> = Vec::new(); + let mut statements_count = 0; for (candidate_hash, kind) in pending_manifests { let confirmed_candidate = match candidates.get_confirmed(&candidate_hash) { None => continue, // sanity @@ -1079,7 +1099,7 @@ async fn send_pending_grid_messages( }; }, grid::ManifestKind::Acknowledgement => { - messages.extend(acknowledgement_and_statement_messages( + let (m, c) = acknowledgement_and_statement_messages( peer_id, peer_validator_id, groups, @@ -1088,7 +1108,9 @@ async fn send_pending_grid_messages( group_index, candidate_hash, local_knowledge, - )); + ); + messages.extend(m); + statements_count += c; }, } } @@ -1107,8 +1129,9 @@ async fn send_pending_grid_messages( let pending_statements = grid_tracker.all_pending_statements_for(peer_validator_id); - let extra_statements = - pending_statements.into_iter().filter_map(|(originator, compact)| { + let extra_statements = pending_statements + .into_iter() + .filter_map(|(originator, compact)| { let res = pending_statement_network_message( &relay_parent_state.statement_store, relay_parent, @@ -1128,15 +1151,17 @@ async fn send_pending_grid_messages( } res - }); + }) + .collect::>(); + statements_count += extra_statements.len(); messages.extend(extra_statements); } - if messages.is_empty() { - return + if !messages.is_empty() { + ctx.send_message(NetworkBridgeTxMessage::SendValidationMessages(messages)).await; + metrics.on_statements_distributed(statements_count); } - ctx.send_message(NetworkBridgeTxMessage::SendValidationMessages(messages)).await; } // Imports a locally originating statement and distributes it to peers. @@ -1147,6 +1172,7 @@ pub(crate) async fn share_local_statement( relay_parent: Hash, statement: SignedFullStatementWithPVD, reputation: &mut ReputationAggregator, + metrics: &Metrics, ) -> JfyiErrorResult<()> { let per_relay_parent = match state.per_relay_parent.get_mut(&relay_parent) { None => return Err(JfyiError::InvalidShare), @@ -1269,11 +1295,12 @@ pub(crate) async fn share_local_statement( &state.authorities, &state.peers, compact_statement, + metrics, ) .await; if let Some(post_confirmation) = post_confirmation { - apply_post_confirmation(ctx, state, post_confirmation, reputation).await; + apply_post_confirmation(ctx, state, post_confirmation, reputation, metrics).await; } Ok(()) @@ -1310,6 +1337,7 @@ async fn circulate_statement( authorities: &HashMap, peers: &HashMap, statement: SignedStatement, + metrics: &Metrics, ) { let session_info = &per_session.session_info; @@ -1446,6 +1474,7 @@ async fn circulate_statement( .into(), )) .await; + metrics.on_statement_distributed(); } if !statement_to_v3_peers.is_empty() { @@ -1465,6 +1494,7 @@ async fn circulate_statement( .into(), )) .await; + metrics.on_statement_distributed(); } } /// Check a statement signature under this parent hash. @@ -1511,6 +1541,7 @@ async fn handle_incoming_statement( relay_parent: Hash, statement: UncheckedSignedStatement, reputation: &mut ReputationAggregator, + metrics: &Metrics, ) { let peer_state = match state.peers.get(&peer) { None => { @@ -1787,6 +1818,7 @@ async fn handle_incoming_statement( &state.authorities, &state.peers, checked_statement, + metrics, ) .await; } else { @@ -1944,6 +1976,7 @@ async fn provide_candidate_to_grid( per_session: &PerSessionState, authorities: &HashMap, peers: &HashMap, + metrics: &Metrics, ) { let local_validator = match relay_parent_state.local_validator { Some(ref mut v) => v, @@ -2131,8 +2164,10 @@ async fn provide_candidate_to_grid( .await; } if !post_statements.is_empty() { + let count = post_statements.len(); ctx.send_message(NetworkBridgeTxMessage::SendValidationMessages(post_statements)) .await; + metrics.on_statements_distributed(count); } } @@ -2532,6 +2567,7 @@ async fn handle_incoming_manifest( peer: PeerId, manifest: net_protocol::v2::BackedCandidateManifest, reputation: &mut ReputationAggregator, + metrics: &Metrics, ) { gum::debug!( target: LOG_TARGET, @@ -2588,7 +2624,7 @@ async fn handle_incoming_manifest( ) }; - let messages = acknowledgement_and_statement_messages( + let (messages, statements_count) = acknowledgement_and_statement_messages( &( peer, state @@ -2609,6 +2645,7 @@ async fn handle_incoming_manifest( if !messages.is_empty() { ctx.send_message(NetworkBridgeTxMessage::SendValidationMessages(messages)).await; + metrics.on_statements_distributed(statements_count); } } else if !state.candidates.is_confirmed(&manifest.candidate_hash) { // 5. if unconfirmed, add request entry @@ -2636,9 +2673,9 @@ fn acknowledgement_and_statement_messages( group_index: GroupIndex, candidate_hash: CandidateHash, local_knowledge: StatementFilter, -) -> Vec<(Vec, net_protocol::VersionedValidationProtocol)> { +) -> (Vec<(Vec, net_protocol::VersionedValidationProtocol)>, usize) { let local_validator = match relay_parent_state.local_validator.as_mut() { - None => return Vec::new(), + None => return (Vec::new(), 0), Some(l) => l, }; @@ -2666,7 +2703,7 @@ fn acknowledgement_and_statement_messages( "Bug ValidationVersion::V1 should not be used in statement-distribution v2, legacy should have handled this" ); - return Vec::new() + return (Vec::new(), 0) }, }; @@ -2687,10 +2724,11 @@ fn acknowledgement_and_statement_messages( candidate_hash, peer, ); + let statements_count = statement_messages.len(); messages.extend(statement_messages.into_iter().map(|m| (vec![peer.0], m))); - messages + (messages, statements_count) } #[overseer::contextbounds(StatementDistribution, prefix=self::overseer)] @@ -2700,6 +2738,7 @@ async fn handle_incoming_acknowledgement( peer: PeerId, acknowledgement: net_protocol::v2::BackedCandidateAcknowledgement, reputation: &mut ReputationAggregator, + metrics: &Metrics, ) { // The key difference between acknowledgments and full manifests is that only // the candidate hash is included alongside the bitfields, so the candidate @@ -2780,10 +2819,12 @@ async fn handle_incoming_acknowledgement( ); if !messages.is_empty() { + let count = messages.len(); ctx.send_message(NetworkBridgeTxMessage::SendValidationMessages( messages.into_iter().map(|m| (vec![peer], m)).collect(), )) .await; + metrics.on_statements_distributed(count); } } @@ -2793,6 +2834,7 @@ pub(crate) async fn handle_backed_candidate_message( ctx: &mut Context, state: &mut State, candidate_hash: CandidateHash, + metrics: &Metrics, ) { // If the candidate is unknown or unconfirmed, it's a race (pruned before receiving message) // or a bug. Ignore if so @@ -2834,6 +2876,7 @@ pub(crate) async fn handle_backed_candidate_message( per_session, &state.authorities, &state.peers, + metrics, ) .await; @@ -2855,6 +2898,7 @@ async fn send_cluster_candidate_statements( state: &mut State, candidate_hash: CandidateHash, relay_parent: Hash, + metrics: &Metrics, ) { let relay_parent_state = match state.per_relay_parent.get_mut(&relay_parent) { None => return, @@ -2897,6 +2941,7 @@ async fn send_cluster_candidate_statements( &state.authorities, &state.peers, statement, + metrics, ) .await; } @@ -2914,6 +2959,7 @@ async fn apply_post_confirmation( state: &mut State, post_confirmation: PostConfirmation, reputation: &mut ReputationAggregator, + metrics: &Metrics, ) { for peer in post_confirmation.reckoning.incorrect { modify_reputation(reputation, ctx.sender(), peer, COST_INACCURATE_ADVERTISEMENT).await; @@ -2927,6 +2973,7 @@ async fn apply_post_confirmation( state, candidate_hash, post_confirmation.hypothetical.relay_parent(), + metrics, ) .await; new_confirmed_candidate_fragment_chain_updates(ctx, state, post_confirmation.hypothetical) @@ -3052,6 +3099,7 @@ pub(crate) async fn handle_response( state: &mut State, response: UnhandledResponse, reputation: &mut ReputationAggregator, + metrics: &Metrics, ) { let &requests::CandidateIdentifier { relay_parent, candidate_hash, group_index } = response.candidate_identifier(); @@ -3151,7 +3199,7 @@ pub(crate) async fn handle_response( }; // Note that this implicitly circulates all statements via the cluster. - apply_post_confirmation(ctx, state, post_confirmation, reputation).await; + apply_post_confirmation(ctx, state, post_confirmation, reputation, metrics).await; let confirmed = state.candidates.get_confirmed(&candidate_hash).expect("just confirmed; qed"); -- GitLab From 4aa29a41cf731b8181f03168240e8dedb2adfa7a Mon Sep 17 00:00:00 2001 From: dharjeezy Date: Fri, 12 Jul 2024 12:51:33 +0100 Subject: [PATCH 116/130] Try State Hook for Bounties (#4563) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part of: https://github.com/paritytech/polkadot-sdk/issues/239 Polkadot address: 12GyGD3QhT4i2JJpNzvMf96sxxBLWymz4RdGCxRH5Rj5agKW --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: Oliver Tale-Yazdi Co-authored-by: Bastian Köcher --- prdoc/pr_4563.prdoc | 12 +++ substrate/frame/bounties/src/benchmarking.rs | 2 +- substrate/frame/bounties/src/lib.rs | 48 ++++++++++ substrate/frame/bounties/src/tests.rs | 92 ++++++++++++-------- 4 files changed, 116 insertions(+), 38 deletions(-) create mode 100644 prdoc/pr_4563.prdoc diff --git a/prdoc/pr_4563.prdoc b/prdoc/pr_4563.prdoc new file mode 100644 index 00000000000..3780eee5898 --- /dev/null +++ b/prdoc/pr_4563.prdoc @@ -0,0 +1,12 @@ +title: Try State Hook for Bounties. + +doc: + - audience: Runtime User + description: | + Invariants for storage items in the bounties pallet. Enforces the following Invariants: + 1.`BountyCount` should be greater or equals to the length of the number of items in `Bounties`. + 2.`BountyCount` should be greater or equals to the length of the number of items in `BountyDescriptions`. + 3. Number of items in `Bounties` should be the same as `BountyDescriptions` length. +crates: +- name: pallet-bounties + bump: minor diff --git a/substrate/frame/bounties/src/benchmarking.rs b/substrate/frame/bounties/src/benchmarking.rs index a009b132f05..f53d95d919d 100644 --- a/substrate/frame/bounties/src/benchmarking.rs +++ b/substrate/frame/bounties/src/benchmarking.rs @@ -231,5 +231,5 @@ benchmarks_instance_pallet! { } } - impl_benchmark_test_suite!(Bounties, crate::tests::new_test_ext(), crate::tests::Test) + impl_benchmark_test_suite!(Bounties, crate::tests::ExtBuilder::default().build(), crate::tests::Test) } diff --git a/substrate/frame/bounties/src/lib.rs b/substrate/frame/bounties/src/lib.rs index e27ecbda3a2..c04bec2d12a 100644 --- a/substrate/frame/bounties/src/lib.rs +++ b/substrate/frame/bounties/src/lib.rs @@ -807,6 +807,54 @@ pub mod pallet { Ok(()) } } + + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet { + #[cfg(feature = "try-runtime")] + fn try_state(_n: BlockNumberFor) -> Result<(), sp_runtime::TryRuntimeError> { + Self::do_try_state() + } + } +} + +#[cfg(any(feature = "try-runtime", test))] +impl, I: 'static> Pallet { + /// Ensure the correctness of the state of this pallet. + /// + /// This should be valid before or after each state transition of this pallet. + pub fn do_try_state() -> Result<(), sp_runtime::TryRuntimeError> { + Self::try_state_bounties_count()?; + + Ok(()) + } + + /// # Invariants + /// + /// * `BountyCount` should be greater or equals to the length of the number of items in + /// `Bounties`. + /// * `BountyCount` should be greater or equals to the length of the number of items in + /// `BountyDescriptions`. + /// * Number of items in `Bounties` should be the same as `BountyDescriptions` length. + fn try_state_bounties_count() -> Result<(), sp_runtime::TryRuntimeError> { + let bounties_length = Bounties::::iter().count() as u32; + + ensure!( + >::get() >= bounties_length, + "`BountyCount` must be grater or equals the number of `Bounties` in storage" + ); + + let bounties_description_length = BountyDescriptions::::iter().count() as u32; + ensure!( + >::get() >= bounties_description_length, + "`BountyCount` must be grater or equals the number of `BountiesDescriptions` in storage." + ); + + ensure!( + bounties_length == bounties_description_length, + "Number of `Bounties` in storage must be the same as the Number of `BountiesDescription` in storage." + ); + Ok(()) + } } impl, I: 'static> Pallet { diff --git a/substrate/frame/bounties/src/tests.rs b/substrate/frame/bounties/src/tests.rs index 9f3a52263ec..7cd47982674 100644 --- a/substrate/frame/bounties/src/tests.rs +++ b/substrate/frame/bounties/src/tests.rs @@ -167,18 +167,36 @@ impl Config for Test { type TreasuryError = pallet_treasury::Error; type TreasuryError1 = pallet_treasury::Error; -pub fn new_test_ext() -> sp_io::TestExternalities { - let mut ext: sp_io::TestExternalities = RuntimeGenesisConfig { - system: frame_system::GenesisConfig::default(), - balances: pallet_balances::GenesisConfig { balances: vec![(0, 100), (1, 98), (2, 1)] }, - treasury: Default::default(), - treasury_1: Default::default(), +pub struct ExtBuilder {} + +impl Default for ExtBuilder { + fn default() -> Self { + Self {} + } +} + +impl ExtBuilder { + pub fn build(self) -> sp_io::TestExternalities { + let mut ext: sp_io::TestExternalities = RuntimeGenesisConfig { + system: frame_system::GenesisConfig::default(), + balances: pallet_balances::GenesisConfig { balances: vec![(0, 100), (1, 98), (2, 1)] }, + treasury: Default::default(), + treasury_1: Default::default(), + } + .build_storage() + .unwrap() + .into(); + ext.execute_with(|| System::set_block_number(1)); + ext + } + + pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + self.build().execute_with(|| { + test(); + Bounties::do_try_state().expect("All invariants must hold after a test"); + Bounties1::do_try_state().expect("All invariants must hold after a test"); + }) } - .build_storage() - .unwrap() - .into(); - ext.execute_with(|| System::set_block_number(1)); - ext } fn last_event() -> BountiesEvent { @@ -192,7 +210,7 @@ fn last_event() -> BountiesEvent { #[test] fn genesis_config_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_eq!(Treasury::pot(), 0); assert_eq!(Treasury::proposal_count(), 0); }); @@ -200,7 +218,7 @@ fn genesis_config_works() { #[test] fn minting_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { // Check that accumulate works when we have Some value in Dummy already. Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_eq!(Treasury::pot(), 100); @@ -209,7 +227,7 @@ fn minting_works() { #[test] fn accepted_spend_proposal_ignored_outside_spend_period() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_ok!({ Treasury::spend_local(RuntimeOrigin::root(), 100, 3) }); @@ -222,7 +240,7 @@ fn accepted_spend_proposal_ignored_outside_spend_period() { #[test] fn unused_pot_should_diminish() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { let init_total_issuance = Balances::total_issuance(); Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_eq!(Balances::total_issuance(), init_total_issuance + 100); @@ -235,7 +253,7 @@ fn unused_pot_should_diminish() { #[test] fn accepted_spend_proposal_enacted_on_spend_period() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_eq!(Treasury::pot(), 100); @@ -249,7 +267,7 @@ fn accepted_spend_proposal_enacted_on_spend_period() { #[test] fn pot_underflow_should_not_diminish() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_eq!(Treasury::pot(), 100); @@ -269,7 +287,7 @@ fn pot_underflow_should_not_diminish() { // i.e. pot should not include existential deposit needed for account survival. #[test] fn treasury_account_doesnt_get_deleted() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_eq!(Treasury::pot(), 100); let treasury_balance = Balances::free_balance(&Treasury::account_id()); @@ -321,7 +339,7 @@ fn inexistent_account_works() { #[test] fn propose_bounty_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); @@ -358,7 +376,7 @@ fn propose_bounty_works() { #[test] fn propose_bounty_validation_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); @@ -387,7 +405,7 @@ fn propose_bounty_validation_works() { #[test] fn close_bounty_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_noop!(Bounties::close_bounty(RuntimeOrigin::root(), 0), Error::::InvalidIndex); @@ -412,7 +430,7 @@ fn close_bounty_works() { #[test] fn approve_bounty_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_noop!( @@ -473,7 +491,7 @@ fn approve_bounty_works() { #[test] fn assign_curator_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); @@ -543,7 +561,7 @@ fn assign_curator_works() { #[test] fn unassign_curator_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_ok!(Bounties::propose_bounty(RuntimeOrigin::signed(0), 50, b"12345".to_vec())); @@ -596,7 +614,7 @@ fn unassign_curator_works() { #[test] fn award_and_claim_bounty_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); Balances::make_free_balance_be(&4, 10); @@ -663,7 +681,7 @@ fn award_and_claim_bounty_works() { #[test] fn claim_handles_high_fee() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); Balances::make_free_balance_be(&4, 30); @@ -704,7 +722,7 @@ fn claim_handles_high_fee() { #[test] fn cancel_and_refund() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); @@ -747,7 +765,7 @@ fn cancel_and_refund() { #[test] fn award_and_cancel() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_ok!(Bounties::propose_bounty(RuntimeOrigin::signed(0), 50, b"12345".to_vec())); @@ -790,7 +808,7 @@ fn award_and_cancel() { #[test] fn expire_and_unassign() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_ok!(Bounties::propose_bounty(RuntimeOrigin::signed(0), 50, b"12345".to_vec())); @@ -838,7 +856,7 @@ fn expire_and_unassign() { #[test] fn extend_expiry() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); Balances::make_free_balance_be(&4, 10); @@ -974,7 +992,7 @@ fn genesis_funding_works() { #[test] fn unassign_curator_self() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); assert_ok!(Bounties::propose_bounty(RuntimeOrigin::signed(0), 50, b"12345".to_vec())); @@ -1015,7 +1033,7 @@ fn unassign_curator_self() { fn accept_curator_handles_different_deposit_calculations() { // This test will verify that a bounty with and without a fee results // in a different curator deposit: one using the value, and one using the fee. - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { // Case 1: With a fee let user = 1; let bounty_index = 0; @@ -1092,7 +1110,7 @@ fn accept_curator_handles_different_deposit_calculations() { #[test] fn approve_bounty_works_second_instance() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { // Set burn to 0 to make tracking funds easier. Burn::set(Permill::from_percent(0)); @@ -1118,7 +1136,7 @@ fn approve_bounty_works_second_instance() { #[test] fn approve_bounty_insufficient_spend_limit_errors() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); @@ -1136,7 +1154,7 @@ fn approve_bounty_insufficient_spend_limit_errors() { #[test] fn approve_bounty_instance1_insufficient_spend_limit_errors() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury1::account_id(), 101); @@ -1154,7 +1172,7 @@ fn approve_bounty_instance1_insufficient_spend_limit_errors() { #[test] fn propose_curator_insufficient_spend_limit_errors() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); @@ -1177,7 +1195,7 @@ fn propose_curator_insufficient_spend_limit_errors() { #[test] fn propose_curator_instance1_insufficient_spend_limit_errors() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { System::set_block_number(1); Balances::make_free_balance_be(&Treasury::account_id(), 101); -- GitLab From d2dff5f1c3f705c5acdad040447822f92bb02891 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:31:06 +0300 Subject: [PATCH 117/130] network/tx: Ban peers with tx that fail to decode (#5002) A malicious peer can submit random bytes on transaction protocol. In this case, the peer is not disconnected or reported back to the peerstore. This PR ensures the peer's reputation is properly reported. Discovered during testing: - https://github.com/paritytech/polkadot-sdk/pull/4977 cc @paritytech/networking Signed-off-by: Alexandru Vasile --- substrate/client/network/transactions/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/substrate/client/network/transactions/src/lib.rs b/substrate/client/network/transactions/src/lib.rs index 3384aab5149..31ad0781035 100644 --- a/substrate/client/network/transactions/src/lib.rs +++ b/substrate/client/network/transactions/src/lib.rs @@ -368,7 +368,8 @@ where { self.on_transactions(peer, m); } else { - warn!(target: "sub-libp2p", "Failed to decode transactions list"); + warn!(target: "sub-libp2p", "Failed to decode transactions list from peer {peer}"); + self.network.report_peer(peer, rep::BAD_TRANSACTION); } }, } -- GitLab From 291210aa0fafa97d9b924fe82d68c023bdb0a340 Mon Sep 17 00:00:00 2001 From: Jun Jiang Date: Mon, 15 Jul 2024 18:45:49 +0800 Subject: [PATCH 118/130] Use sp_runtime::traits::BadOrigin (#5011) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It says `Will be removed after July 2023` but that's not true 😃 --------- Co-authored-by: Oliver Tale-Yazdi Co-authored-by: Bastian Köcher --- .../pallets/collective-content/src/tests.rs | 3 +- .../runtime/common/src/paras_registrar/mod.rs | 6 ++-- .../src/assigner_on_demand/tests.rs | 3 +- polkadot/runtime/parachains/src/hrmp/tests.rs | 3 +- prdoc/pr_5011.prdoc | 29 +++++++++++++++++++ substrate/frame/alliance/src/tests.rs | 3 +- substrate/frame/contracts/src/lib.rs | 3 +- substrate/frame/democracy/src/lib.rs | 3 +- substrate/frame/nomination-pools/src/lib.rs | 2 +- .../frame/ranked-collective/src/tests.rs | 6 ++-- substrate/frame/utility/src/tests.rs | 3 +- 11 files changed, 45 insertions(+), 19 deletions(-) create mode 100644 prdoc/pr_5011.prdoc diff --git a/cumulus/parachains/pallets/collective-content/src/tests.rs b/cumulus/parachains/pallets/collective-content/src/tests.rs index 4910b30b89a..7fee5eea101 100644 --- a/cumulus/parachains/pallets/collective-content/src/tests.rs +++ b/cumulus/parachains/pallets/collective-content/src/tests.rs @@ -16,7 +16,8 @@ //! Tests. use super::{mock::*, *}; -use frame_support::{assert_noop, assert_ok, error::BadOrigin, pallet_prelude::Pays}; +use frame_support::{assert_noop, assert_ok, pallet_prelude::Pays}; +use sp_runtime::traits::BadOrigin; /// returns CID hash of 68 bytes of given `i`. fn create_cid(i: u8) -> OpaqueCid { diff --git a/polkadot/runtime/common/src/paras_registrar/mod.rs b/polkadot/runtime/common/src/paras_registrar/mod.rs index 6b9191f7c6f..606883b7119 100644 --- a/polkadot/runtime/common/src/paras_registrar/mod.rs +++ b/polkadot/runtime/common/src/paras_registrar/mod.rs @@ -718,9 +718,7 @@ mod tests { mock::conclude_pvf_checking, paras_registrar, traits::Registrar as RegistrarTrait, }; use frame_support::{ - assert_noop, assert_ok, derive_impl, - error::BadOrigin, - parameter_types, + assert_noop, assert_ok, derive_impl, parameter_types, traits::{OnFinalize, OnInitialize}, }; use frame_system::limits; @@ -731,7 +729,7 @@ mod tests { use sp_io::TestExternalities; use sp_keyring::Sr25519Keyring; use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, + traits::{BadOrigin, BlakeTwo256, IdentityLookup}, transaction_validity::TransactionPriority, BuildStorage, Perbill, }; diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs b/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs index 3d01ba655d3..a6074b305b4 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs @@ -30,11 +30,12 @@ use crate::{ }, paras::{ParaGenesisArgs, ParaKind}, }; -use frame_support::{assert_noop, assert_ok, error::BadOrigin}; +use frame_support::{assert_noop, assert_ok}; use pallet_balances::Error as BalancesError; use polkadot_primitives::{ BlockNumber, SessionIndex, ValidationCode, ON_DEMAND_MAX_QUEUE_MAX_SIZE, }; +use sp_runtime::traits::BadOrigin; use sp_std::{ cmp::{Ord, Ordering}, collections::btree_map::BTreeMap, diff --git a/polkadot/runtime/parachains/src/hrmp/tests.rs b/polkadot/runtime/parachains/src/hrmp/tests.rs index 4fcbc69e98a..52db932c796 100644 --- a/polkadot/runtime/parachains/src/hrmp/tests.rs +++ b/polkadot/runtime/parachains/src/hrmp/tests.rs @@ -27,8 +27,9 @@ use crate::{ }, shared, }; -use frame_support::{assert_noop, assert_ok, error::BadOrigin}; +use frame_support::{assert_noop, assert_ok}; use polkadot_primitives::{BlockNumber, InboundDownwardMessage}; +use sp_runtime::traits::BadOrigin; use std::collections::BTreeMap; pub(crate) fn run_to_block(to: BlockNumber, new_session: Option>) { diff --git a/prdoc/pr_5011.prdoc b/prdoc/pr_5011.prdoc new file mode 100644 index 00000000000..cb827bae6c5 --- /dev/null +++ b/prdoc/pr_5011.prdoc @@ -0,0 +1,29 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Use `BadOrigin` from `sp_runtime`" + +doc: + - audience: Runtime Dev + description: | + This PR refactor usages of deprecated `frame_support::error::BadOrigin` to `sp_runtime::traits::BadOrigin` + +crates: +- name: pallet-collective-content + bump: patch +- name: polkadot-runtime-common + bump: patch +- name: polkadot-runtime-parachains + bump: patch +- name: pallet-alliance + bump: patch +- name: pallet-contracts + bump: patch +- name: pallet-democracy + bump: patch +- name: pallet-nomination-pools + bump: patch +- name: pallet-ranked-collective + bump: patch +- name: pallet-utility + bump: patch diff --git a/substrate/frame/alliance/src/tests.rs b/substrate/frame/alliance/src/tests.rs index edb515b8115..ec31ebf6a47 100644 --- a/substrate/frame/alliance/src/tests.rs +++ b/substrate/frame/alliance/src/tests.rs @@ -17,8 +17,9 @@ //! Tests for the alliance pallet. -use frame_support::{assert_noop, assert_ok, error::BadOrigin}; +use frame_support::{assert_noop, assert_ok}; use frame_system::{EventRecord, Phase}; +use sp_runtime::traits::BadOrigin; use super::*; use crate::{self as alliance, mock::*}; diff --git a/substrate/frame/contracts/src/lib.rs b/substrate/frame/contracts/src/lib.rs index 47772e0a5a0..33083c7ebe7 100644 --- a/substrate/frame/contracts/src/lib.rs +++ b/substrate/frame/contracts/src/lib.rs @@ -119,7 +119,6 @@ use environmental::*; use frame_support::{ dispatch::{GetDispatchInfo, Pays, PostDispatchInfo, RawOrigin, WithPostDispatchInfo}, ensure, - error::BadOrigin, traits::{ fungible::{Inspect, Mutate, MutateHold}, ConstU32, Contains, Get, Randomness, Time, @@ -135,7 +134,7 @@ use frame_system::{ use scale_info::TypeInfo; use smallvec::Array; use sp_runtime::{ - traits::{Convert, Dispatchable, Saturating, StaticLookup, Zero}, + traits::{BadOrigin, Convert, Dispatchable, Saturating, StaticLookup, Zero}, DispatchError, RuntimeDebug, }; use sp_std::{fmt::Debug, prelude::*}; diff --git a/substrate/frame/democracy/src/lib.rs b/substrate/frame/democracy/src/lib.rs index 19cdc754659..e3b4696f8b2 100644 --- a/substrate/frame/democracy/src/lib.rs +++ b/substrate/frame/democracy/src/lib.rs @@ -155,7 +155,6 @@ use codec::{Decode, Encode}; use frame_support::{ ensure, - error::BadOrigin, traits::{ defensive_prelude::*, schedule::{v3::Named as ScheduleNamed, DispatchTime}, @@ -166,7 +165,7 @@ use frame_support::{ }; use frame_system::pallet_prelude::{BlockNumberFor, OriginFor}; use sp_runtime::{ - traits::{Bounded as ArithBounded, One, Saturating, StaticLookup, Zero}, + traits::{BadOrigin, Bounded as ArithBounded, One, Saturating, StaticLookup, Zero}, ArithmeticError, DispatchError, DispatchResult, }; use sp_std::prelude::*; diff --git a/substrate/frame/nomination-pools/src/lib.rs b/substrate/frame/nomination-pools/src/lib.rs index 2b5fe8b6041..641f2b14577 100644 --- a/substrate/frame/nomination-pools/src/lib.rs +++ b/substrate/frame/nomination-pools/src/lib.rs @@ -2600,7 +2600,7 @@ pub mod pallet { ) -> DispatchResult { let mut bonded_pool = match ensure_root(origin.clone()) { Ok(()) => BondedPool::::get(pool_id).ok_or(Error::::PoolNotFound)?, - Err(frame_support::error::BadOrigin) => { + Err(sp_runtime::traits::BadOrigin) => { let who = ensure_signed(origin)?; let bonded_pool = BondedPool::::get(pool_id).ok_or(Error::::PoolNotFound)?; diff --git a/substrate/frame/ranked-collective/src/tests.rs b/substrate/frame/ranked-collective/src/tests.rs index a7827bcc1aa..3a85928b76d 100644 --- a/substrate/frame/ranked-collective/src/tests.rs +++ b/substrate/frame/ranked-collective/src/tests.rs @@ -20,14 +20,12 @@ use std::collections::BTreeMap; use frame_support::{ - assert_noop, assert_ok, derive_impl, - error::BadOrigin, - parameter_types, + assert_noop, assert_ok, derive_impl, parameter_types, traits::{ConstU16, EitherOf, MapSuccess, Polling}, }; use sp_core::Get; use sp_runtime::{ - traits::{MaybeConvert, ReduceBy, ReplaceWithDefault}, + traits::{BadOrigin, MaybeConvert, ReduceBy, ReplaceWithDefault}, BuildStorage, }; diff --git a/substrate/frame/utility/src/tests.rs b/substrate/frame/utility/src/tests.rs index eb2047aac28..0a58a92b4c9 100644 --- a/substrate/frame/utility/src/tests.rs +++ b/substrate/frame/utility/src/tests.rs @@ -25,14 +25,13 @@ use crate as utility; use frame_support::{ assert_err_ignore_postinfo, assert_noop, assert_ok, derive_impl, dispatch::{DispatchErrorWithPostInfo, Pays}, - error::BadOrigin, parameter_types, storage, traits::{ConstU64, Contains}, weights::Weight, }; use pallet_collective::{EnsureProportionAtLeast, Instance1}; use sp_runtime::{ - traits::{BlakeTwo256, Dispatchable, Hash}, + traits::{BadOrigin, BlakeTwo256, Dispatchable, Hash}, BuildStorage, DispatchError, TokenError, }; -- GitLab From 7ecf3f757a5d6f622309cea7f788e8a547a5dce8 Mon Sep 17 00:00:00 2001 From: Jun Jiang Date: Mon, 15 Jul 2024 21:50:25 +0800 Subject: [PATCH 119/130] Remove most all usage of `sp-std` (#5010) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This should remove nearly all usage of `sp-std` except: - bridge and bridge-hubs - a few of frames re-export `sp-std`, keep them for now - there is a usage of `sp_std::Writer`, I don't have an idea how to move it Please review proc-macro carefully. I'm not sure I'm doing it the right way. Note: need `/bot fmt` --------- Co-authored-by: Bastian Köcher Co-authored-by: command-bot <> --- Cargo.lock | 159 ------------------ cumulus/client/parachain-inherent/Cargo.toml | 1 - .../src/lib.rs | 4 +- .../relay-chain-rpc-interface/src/lib.rs | 3 +- .../src/rpc_client.rs | 3 +- cumulus/pallets/aura-ext/Cargo.toml | 2 - .../pallets/aura-ext/src/consensus_hook.rs | 4 +- cumulus/pallets/aura-ext/src/lib.rs | 4 +- cumulus/pallets/collator-selection/Cargo.toml | 2 - .../collator-selection/src/benchmarking.rs | 3 +- cumulus/pallets/collator-selection/src/lib.rs | 6 +- .../collator-selection/src/migration.rs | 10 +- .../pallets/collator-selection/src/weights.rs | 2 +- cumulus/pallets/dmp-queue/Cargo.toml | 2 - cumulus/pallets/dmp-queue/src/benchmarking.rs | 2 +- cumulus/pallets/dmp-queue/src/lib.rs | 2 + cumulus/pallets/dmp-queue/src/migration.rs | 2 +- .../parachain-system/proc-macro/src/lib.rs | 4 +- .../parachain-system/src/consensus_hook.rs | 4 +- cumulus/pallets/parachain-system/src/lib.rs | 13 +- cumulus/pallets/parachain-system/src/mock.rs | 3 +- .../src/relay_state_snapshot.rs | 2 +- cumulus/pallets/parachain-system/src/tests.rs | 2 +- .../src/unincluded_segment.rs | 4 +- .../src/validate_block/implementation.rs | 8 +- .../src/validate_block/mod.rs | 3 + .../src/validate_block/trie_cache.rs | 6 +- .../src/validate_block/trie_recorder.rs | 4 +- .../pallets/parachain-system/src/weights.rs | 2 +- .../pallets/session-benchmarking/Cargo.toml | 2 - .../pallets/session-benchmarking/src/inner.rs | 2 +- .../pallets/session-benchmarking/src/lib.rs | 2 + cumulus/pallets/solo-to-para/Cargo.toml | 2 - cumulus/pallets/solo-to-para/src/lib.rs | 4 +- cumulus/pallets/xcm/Cargo.toml | 2 - cumulus/pallets/xcm/src/lib.rs | 1 - cumulus/pallets/xcmp-queue/Cargo.toml | 2 - .../pallets/xcmp-queue/src/benchmarking.rs | 1 + cumulus/pallets/xcmp-queue/src/bridging.rs | 4 +- cumulus/pallets/xcmp-queue/src/lib.rs | 4 +- cumulus/pallets/xcmp-queue/src/migration.rs | 1 + .../pallets/xcmp-queue/src/migration/v5.rs | 1 + cumulus/parachains/common/Cargo.toml | 2 - cumulus/parachains/common/src/impls.rs | 3 +- cumulus/parachains/common/src/lib.rs | 2 + .../parachains/common/src/message_queue.rs | 2 +- cumulus/parachains/common/src/xcm_config.rs | 2 +- .../pallets/collective-content/Cargo.toml | 2 - .../pallets/collective-content/src/lib.rs | 1 - .../pallets/parachain-info/Cargo.toml | 2 - .../pallets/parachain-info/src/lib.rs | 2 +- cumulus/parachains/pallets/ping/Cargo.toml | 2 - cumulus/parachains/pallets/ping/src/lib.rs | 4 +- .../assets/asset-hub-rococo/Cargo.toml | 2 - .../assets/asset-hub-rococo/src/lib.rs | 14 +- .../cumulus_pallet_parachain_system.rs | 2 +- .../src/weights/pallet_message_queue.rs | 2 +- .../asset-hub-rococo/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 2 +- .../assets/asset-hub-rococo/src/xcm_config.rs | 22 +-- .../assets/asset-hub-rococo/tests/tests.rs | 14 +- .../assets/asset-hub-westend/Cargo.toml | 2 - .../assets/asset-hub-westend/src/lib.rs | 14 +- .../cumulus_pallet_parachain_system.rs | 2 +- .../src/weights/pallet_message_queue.rs | 2 +- .../asset-hub-westend/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 2 +- .../asset-hub-westend/src/xcm_config.rs | 12 +- .../assets/asset-hub-westend/tests/tests.rs | 12 +- .../runtimes/assets/common/Cargo.toml | 2 - .../runtimes/assets/common/src/benchmarks.rs | 2 +- .../assets/common/src/foreign_creators.rs | 4 +- .../assets/common/src/fungible_conversion.rs | 3 +- .../runtimes/assets/common/src/lib.rs | 2 + .../common/src/local_and_foreign_assets.rs | 2 +- .../runtimes/assets/common/src/matching.rs | 8 +- .../runtimes/assets/common/src/runtime_api.rs | 2 +- .../runtimes/assets/test-utils/Cargo.toml | 2 - .../src/bridge_to_bulletin_config.rs | 2 +- .../src/bridge_to_westend_config.rs | 6 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 10 +- .../cumulus_pallet_parachain_system.rs | 2 +- .../src/weights/pallet_message_queue.rs | 2 +- .../bridge-hub-rococo/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 2 +- .../bridge-hub-rococo/src/xcm_config.rs | 2 +- .../src/bridge_to_rococo_config.rs | 6 +- .../bridge-hubs/bridge-hub-westend/src/lib.rs | 12 +- .../cumulus_pallet_parachain_system.rs | 2 +- .../src/weights/pallet_message_queue.rs | 2 +- .../bridge-hub-westend/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 2 +- .../runtimes/bridge-hubs/common/Cargo.toml | 2 - .../bridge-hubs/common/src/message_queue.rs | 2 +- .../bridge-hubs/test-utils/Cargo.toml | 2 - .../bridge-hubs/test-utils/src/lib.rs | 2 + .../src/test_cases/from_grandpa_chain.rs | 3 +- .../src/test_cases/from_parachain.rs | 3 +- .../test-utils/src/test_cases/helpers.rs | 4 +- .../collectives-westend/Cargo.toml | 2 - .../collectives-westend/src/impls.rs | 3 +- .../collectives-westend/src/lib.rs | 11 +- .../cumulus_pallet_parachain_system.rs | 2 +- .../src/weights/pallet_message_queue.rs | 2 +- .../contracts/contracts-rococo/Cargo.toml | 2 - .../contracts/contracts-rococo/src/lib.rs | 10 +- .../coretime/coretime-rococo/Cargo.toml | 2 - .../coretime/coretime-rococo/src/lib.rs | 8 +- .../coretime-rococo/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 2 +- .../coretime/coretime-westend/Cargo.toml | 2 - .../coretime/coretime-westend/src/lib.rs | 8 +- .../coretime-westend/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 2 +- .../glutton/glutton-westend/Cargo.toml | 2 - .../glutton/glutton-westend/src/lib.rs | 8 +- .../runtimes/people/people-rococo/Cargo.toml | 2 - .../runtimes/people/people-rococo/src/lib.rs | 8 +- .../people/people-rococo/src/people.rs | 7 +- .../cumulus_pallet_parachain_system.rs | 2 +- .../src/weights/pallet_message_queue.rs | 2 +- .../people-rococo/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 2 +- .../runtimes/people/people-westend/Cargo.toml | 2 - .../runtimes/people/people-westend/src/lib.rs | 8 +- .../people/people-westend/src/people.rs | 3 +- .../cumulus_pallet_parachain_system.rs | 2 +- .../src/weights/pallet_message_queue.rs | 2 +- .../people-westend/src/weights/xcm/mod.rs | 2 +- .../xcm/pallet_xcm_benchmarks_fungible.rs | 2 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 2 +- .../runtimes/starters/seedling/Cargo.toml | 2 - .../runtimes/starters/seedling/src/lib.rs | 6 +- .../runtimes/starters/shell/Cargo.toml | 2 - .../runtimes/starters/shell/src/lib.rs | 8 +- .../parachains/runtimes/test-utils/Cargo.toml | 2 - .../parachains/runtimes/test-utils/src/lib.rs | 2 +- .../runtimes/testing/penpal/Cargo.toml | 2 - .../runtimes/testing/penpal/src/lib.rs | 6 +- .../testing/rococo-parachain/Cargo.toml | 2 - .../testing/rococo-parachain/src/lib.rs | 6 +- .../asset_hub_polkadot_aura.rs | 2 +- .../src/fake_runtime_api/aura.rs | 2 +- cumulus/primitives/aura/Cargo.toml | 2 - cumulus/primitives/core/Cargo.toml | 2 - cumulus/primitives/core/src/lib.rs | 10 +- .../primitives/parachain-inherent/Cargo.toml | 2 - .../primitives/parachain-inherent/src/lib.rs | 4 +- .../storage-weight-reclaim/Cargo.toml | 2 - .../storage-weight-reclaim/src/lib.rs | 4 +- cumulus/primitives/timestamp/Cargo.toml | 2 - cumulus/primitives/timestamp/src/lib.rs | 2 +- cumulus/primitives/utility/Cargo.toml | 2 - cumulus/primitives/utility/src/lib.rs | 7 +- cumulus/templates/xcm-bench-template.hbs | 2 +- cumulus/test/relay-sproof-builder/Cargo.toml | 2 - cumulus/test/relay-sproof-builder/src/lib.rs | 4 +- cumulus/test/runtime/Cargo.toml | 2 - cumulus/test/runtime/src/lib.rs | 7 +- cumulus/test/runtime/src/test_pallet.rs | 4 +- cumulus/xcm/xcm-emulator/src/lib.rs | 5 +- .../chain_spec_runtime/Cargo.toml | 2 - .../chain_spec_runtime/src/lib.rs | 2 + .../chain_spec_runtime/src/pallets.rs | 1 + .../chain_spec_runtime/src/presets.rs | 4 +- .../chain_spec_runtime/src/runtime.rs | 1 + polkadot/core-primitives/Cargo.toml | 2 - polkadot/core-primitives/src/lib.rs | 12 +- polkadot/parachain/Cargo.toml | 2 - polkadot/parachain/src/lib.rs | 2 + polkadot/parachain/src/primitives.rs | 20 +-- polkadot/parachain/src/wasm_api.rs | 2 +- .../test-parachains/adder/Cargo.toml | 3 +- .../test-parachains/adder/src/lib.rs | 2 + .../adder/src/wasm_validation.rs | 8 +- .../test-parachains/undying/Cargo.toml | 2 - .../test-parachains/undying/src/lib.rs | 4 +- .../undying/src/wasm_validation.rs | 4 +- polkadot/primitives/Cargo.toml | 2 - polkadot/primitives/src/lib.rs | 2 + polkadot/primitives/src/runtime_api.rs | 8 +- polkadot/primitives/src/v7/async_backing.rs | 1 + polkadot/primitives/src/v7/executor_params.rs | 31 ++-- polkadot/primitives/src/v7/metrics.rs | 6 +- polkadot/primitives/src/v7/mod.rs | 24 +-- polkadot/primitives/src/v7/signed.rs | 12 +- polkadot/primitives/src/v7/slashing.rs | 2 +- polkadot/primitives/src/vstaging/mod.rs | 1 - polkadot/runtime/common/Cargo.toml | 2 - .../common/slot_range_helper/Cargo.toml | 3 +- .../common/slot_range_helper/src/lib.rs | 2 +- .../common/src/assigned_slots/migration.rs | 6 +- .../runtime/common/src/assigned_slots/mod.rs | 2 +- polkadot/runtime/common/src/auctions.rs | 3 +- polkadot/runtime/common/src/claims.rs | 17 +- .../runtime/common/src/crowdloan/migration.rs | 2 +- polkadot/runtime/common/src/crowdloan/mod.rs | 7 +- .../runtime/common/src/identity_migrator.rs | 2 +- polkadot/runtime/common/src/impls.rs | 4 +- .../runtime/common/src/integration_tests.rs | 2 +- polkadot/runtime/common/src/lib.rs | 6 +- polkadot/runtime/common/src/mock.rs | 2 +- .../common/src/paras_registrar/migration.rs | 2 +- .../runtime/common/src/paras_registrar/mod.rs | 7 +- .../runtime/common/src/paras_sudo_wrapper.rs | 2 +- polkadot/runtime/common/src/purchase.rs | 2 +- polkadot/runtime/common/src/slots/mod.rs | 6 +- polkadot/runtime/common/src/traits.rs | 2 +- polkadot/runtime/common/src/try_runtime.rs | 2 +- polkadot/runtime/common/src/xcm_sender.rs | 12 +- polkadot/runtime/metrics/Cargo.toml | 2 - polkadot/runtime/metrics/src/lib.rs | 2 + .../metrics/src/with_runtime_metrics.rs | 3 +- polkadot/runtime/parachains/Cargo.toml | 2 - .../parachains/src/assigner_coretime/mod.rs | 3 +- .../parachains/src/assigner_coretime/tests.rs | 2 +- .../src/assigner_on_demand/benchmarking.rs | 1 + .../src/assigner_on_demand/migration.rs | 8 +- .../parachains/src/assigner_on_demand/mod.rs | 1 - .../src/assigner_on_demand/tests.rs | 6 +- .../src/assigner_on_demand/types.rs | 5 +- .../src/assigner_parachains/tests.rs | 2 +- polkadot/runtime/parachains/src/builder.rs | 14 +- .../runtime/parachains/src/configuration.rs | 6 +- .../src/configuration/migration/v10.rs | 4 +- .../src/configuration/migration/v11.rs | 4 +- .../src/configuration/migration/v12.rs | 4 +- .../src/configuration/migration/v6.rs | 4 +- .../src/configuration/migration/v7.rs | 4 +- .../src/configuration/migration/v8.rs | 4 +- .../src/configuration/migration/v9.rs | 4 +- .../parachains/src/coretime/migration.rs | 7 +- .../runtime/parachains/src/coretime/mod.rs | 3 +- polkadot/runtime/parachains/src/disputes.rs | 3 +- .../parachains/src/disputes/migration.rs | 4 +- .../parachains/src/disputes/slashing.rs | 14 +- polkadot/runtime/parachains/src/dmp.rs | 3 +- polkadot/runtime/parachains/src/hrmp.rs | 13 +- .../parachains/src/inclusion/migration.rs | 4 +- .../runtime/parachains/src/inclusion/mod.rs | 13 +- .../runtime/parachains/src/initializer.rs | 4 +- polkadot/runtime/parachains/src/lib.rs | 2 + polkadot/runtime/parachains/src/mock.rs | 7 +- polkadot/runtime/parachains/src/origin.rs | 2 +- .../parachains/src/paras/benchmarking.rs | 1 + .../src/paras/benchmarking/pvf_check.rs | 1 + polkadot/runtime/parachains/src/paras/mod.rs | 5 +- .../src/paras_inherent/benchmarking.rs | 3 +- .../parachains/src/paras_inherent/misc.rs | 3 +- .../parachains/src/paras_inherent/mod.rs | 14 +- .../parachains/src/paras_inherent/tests.rs | 4 +- .../runtime/parachains/src/reward_points.rs | 4 +- .../parachains/src/runtime_api_impl/v10.rs | 2 +- .../src/runtime_api_impl/vstaging.rs | 6 +- polkadot/runtime/parachains/src/scheduler.rs | 22 ++- .../parachains/src/scheduler/migration.rs | 5 +- .../runtime/parachains/src/scheduler/tests.rs | 2 +- .../runtime/parachains/src/session_info.rs | 2 +- polkadot/runtime/parachains/src/shared.rs | 8 +- polkadot/runtime/parachains/src/ump_tests.rs | 1 - polkadot/runtime/parachains/src/util.rs | 4 +- polkadot/runtime/rococo/Cargo.toml | 2 - .../rococo/src/genesis_config_presets.rs | 8 +- polkadot/runtime/rococo/src/impls.rs | 3 +- polkadot/runtime/rococo/src/lib.rs | 17 +- .../runtime/rococo/src/validator_manager.rs | 2 +- .../rococo/src/weights/pallet_session.rs | 2 +- .../runtime/rococo/src/weights/xcm/mod.rs | 2 +- polkadot/runtime/test-runtime/Cargo.toml | 2 - polkadot/runtime/test-runtime/src/lib.rs | 13 +- .../runtime/test-runtime/src/xcm_config.rs | 2 +- polkadot/runtime/westend/Cargo.toml | 2 - polkadot/runtime/westend/src/impls.rs | 3 +- polkadot/runtime/westend/src/lib.rs | 15 +- .../runtime/westend/src/weights/xcm/mod.rs | 2 +- .../relay_token_transactor/parachain/mod.rs | 2 +- polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml | 2 - .../src/fungible/benchmarking.rs | 4 +- .../src/generic/benchmarking.rs | 2 +- polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs | 4 +- polkadot/xcm/pallet-xcm/Cargo.toml | 2 - polkadot/xcm/pallet-xcm/src/benchmarking.rs | 1 - polkadot/xcm/pallet-xcm/src/lib.rs | 15 +- polkadot/xcm/pallet-xcm/src/migration.rs | 4 +- polkadot/xcm/pallet-xcm/src/mock.rs | 2 +- polkadot/xcm/xcm-builder/Cargo.toml | 2 - .../xcm/xcm-builder/src/asset_conversion.rs | 2 +- polkadot/xcm/xcm-builder/src/barriers.rs | 2 +- polkadot/xcm/xcm-builder/src/controller.rs | 2 +- .../xcm/xcm-builder/src/currency_adapter.rs | 2 +- .../xcm-builder/src/filter_asset_location.rs | 11 +- .../xcm/xcm-builder/src/fungible_adapter.rs | 2 +- .../xcm/xcm-builder/src/fungibles_adapter.rs | 8 +- polkadot/xcm/xcm-builder/src/lib.rs | 2 + .../xcm-builder/src/location_conversion.rs | 5 +- .../xcm/xcm-builder/src/matches_location.rs | 6 +- polkadot/xcm/xcm-builder/src/matches_token.rs | 2 +- .../xcm-builder/src/nonfungible_adapter.rs | 2 +- .../xcm-builder/src/nonfungibles_adapter.rs | 2 +- .../xcm/xcm-builder/src/origin_aliases.rs | 2 +- .../xcm/xcm-builder/src/origin_conversion.rs | 2 +- polkadot/xcm/xcm-builder/src/pay.rs | 5 +- .../xcm-builder/src/process_xcm_message.rs | 3 +- polkadot/xcm/xcm-builder/src/routing.rs | 5 +- polkadot/xcm/xcm-builder/src/test_utils.rs | 2 +- polkadot/xcm/xcm-builder/src/tests/mock.rs | 10 +- polkadot/xcm/xcm-builder/src/tests/mod.rs | 1 + .../xcm/xcm-builder/src/universal_exports.rs | 7 +- polkadot/xcm/xcm-builder/src/weight.rs | 2 +- polkadot/xcm/xcm-builder/tests/mock/mod.rs | 2 +- polkadot/xcm/xcm-executor/Cargo.toml | 2 - polkadot/xcm/xcm-executor/src/assets.rs | 10 +- polkadot/xcm/xcm-executor/src/lib.rs | 9 +- .../xcm/xcm-executor/src/traits/asset_lock.rs | 2 +- .../xcm/xcm-executor/src/traits/conversion.rs | 2 +- .../xcm-executor/src/traits/on_response.rs | 3 +- .../xcm-executor/src/traits/should_execute.rs | 2 +- .../xcm-executor/src/traits/token_matching.rs | 2 +- .../xcm-executor/src/traits/transact_asset.rs | 2 +- .../xcm/xcm-executor/src/traits/weight.rs | 2 +- polkadot/xcm/xcm-runtime-apis/Cargo.toml | 2 - .../xcm/xcm-runtime-apis/src/conversions.rs | 2 +- polkadot/xcm/xcm-runtime-apis/src/dry_run.rs | 2 +- polkadot/xcm/xcm-runtime-apis/src/fees.rs | 2 +- polkadot/xcm/xcm-runtime-apis/src/lib.rs | 2 + polkadot/xcm/xcm-runtime-apis/tests/mock.rs | 2 +- .../example/src/parachain/mod.rs | 3 +- .../xcm/xcm-simulator/fuzzer/src/parachain.rs | 1 - polkadot/xcm/xcm-simulator/src/lib.rs | 5 +- .../xcm-simulator/src/mock_message_queue.rs | 1 - substrate/bin/node/runtime/src/assets_api.rs | 2 +- substrate/bin/node/runtime/src/impls.rs | 5 +- substrate/bin/node/runtime/src/lib.rs | 6 +- .../client/executor/runtime-test/Cargo.toml | 2 - .../client/executor/runtime-test/src/lib.rs | 7 +- substrate/client/sysinfo/src/sysinfo.rs | 4 +- substrate/frame/Cargo.toml | 2 - substrate/frame/alliance/Cargo.toml | 2 - substrate/frame/alliance/src/lib.rs | 4 +- substrate/frame/alliance/src/types.rs | 2 +- substrate/frame/asset-conversion/Cargo.toml | 2 - .../frame/asset-conversion/ops/Cargo.toml | 2 - .../asset-conversion/ops/src/benchmarking.rs | 1 - .../frame/asset-conversion/ops/src/lib.rs | 4 +- .../frame/asset-conversion/ops/src/mock.rs | 1 - .../asset-conversion/src/benchmarking.rs | 3 +- substrate/frame/asset-conversion/src/lib.rs | 4 +- substrate/frame/asset-rate/Cargo.toml | 2 - substrate/frame/asset-rate/src/lib.rs | 4 +- substrate/frame/assets/Cargo.toml | 2 - substrate/frame/assets/src/benchmarking.rs | 4 +- substrate/frame/assets/src/functions.rs | 7 +- substrate/frame/assets/src/impl_fungibles.rs | 1 + substrate/frame/assets/src/lib.rs | 4 +- substrate/frame/atomic-swap/Cargo.toml | 2 - substrate/frame/atomic-swap/src/lib.rs | 4 +- substrate/frame/aura/Cargo.toml | 2 - substrate/frame/aura/src/lib.rs | 10 +- .../frame/authority-discovery/Cargo.toml | 2 - .../frame/authority-discovery/src/lib.rs | 7 +- substrate/frame/authorship/Cargo.toml | 2 - substrate/frame/authorship/src/lib.rs | 1 - substrate/frame/babe/Cargo.toml | 2 - substrate/frame/babe/src/equivocation.rs | 4 +- substrate/frame/babe/src/lib.rs | 12 +- substrate/frame/bags-list/Cargo.toml | 2 - .../frame/bags-list/remote-tests/src/lib.rs | 1 - substrate/frame/bags-list/src/benchmarks.rs | 1 + substrate/frame/bags-list/src/lib.rs | 8 +- substrate/frame/bags-list/src/list/mod.rs | 30 ++-- substrate/frame/bags-list/src/migrations.rs | 6 +- substrate/frame/balances/Cargo.toml | 2 - substrate/frame/balances/src/impl_currency.rs | 2 +- substrate/frame/balances/src/lib.rs | 17 +- substrate/frame/beefy-mmr/Cargo.toml | 2 - substrate/frame/beefy-mmr/src/lib.rs | 6 +- substrate/frame/beefy/Cargo.toml | 2 - substrate/frame/beefy/src/equivocation.rs | 4 +- substrate/frame/beefy/src/lib.rs | 4 +- substrate/frame/benchmarking/Cargo.toml | 2 - substrate/frame/benchmarking/pov/Cargo.toml | 2 - .../benchmarking/pov/src/benchmarking.rs | 22 +-- substrate/frame/benchmarking/pov/src/lib.rs | 4 +- substrate/frame/benchmarking/src/baseline.rs | 2 +- substrate/frame/benchmarking/src/lib.rs | 4 +- substrate/frame/benchmarking/src/tests.rs | 2 - .../frame/benchmarking/src/tests_instance.rs | 2 - substrate/frame/benchmarking/src/utils.rs | 2 +- substrate/frame/benchmarking/src/v1.rs | 4 +- substrate/frame/bounties/Cargo.toml | 2 - substrate/frame/bounties/src/benchmarking.rs | 1 + substrate/frame/bounties/src/lib.rs | 4 +- substrate/frame/broker/Cargo.toml | 2 - substrate/frame/broker/src/benchmarking.rs | 2 +- .../frame/broker/src/coretime_interface.rs | 3 +- substrate/frame/broker/src/lib.rs | 6 +- substrate/frame/broker/src/migration.rs | 4 +- substrate/frame/broker/src/mock.rs | 2 +- .../frame/broker/src/nonfungible_impl.rs | 2 +- substrate/frame/broker/src/test_fungibles.rs | 2 +- substrate/frame/broker/src/tick_impls.rs | 2 +- substrate/frame/child-bounties/Cargo.toml | 2 - .../frame/child-bounties/src/benchmarking.rs | 2 + substrate/frame/child-bounties/src/lib.rs | 4 +- substrate/frame/collective/Cargo.toml | 2 - substrate/frame/collective/src/lib.rs | 7 +- .../frame/contracts/mock-network/Cargo.toml | 2 - .../mock-network/src/mocks/msg_queue.rs | 1 - .../contracts/mock-network/src/parachain.rs | 1 - .../frame/contracts/proc-macro/src/lib.rs | 2 +- .../src/benchmarking/call_builder.rs | 2 +- .../frame/contracts/src/benchmarking/code.rs | 4 +- .../frame/contracts/src/benchmarking/mod.rs | 4 +- .../frame/contracts/src/chain_extension.rs | 5 +- substrate/frame/contracts/src/exec.rs | 7 +- substrate/frame/contracts/src/lib.rs | 3 +- substrate/frame/contracts/src/migration.rs | 7 +- .../frame/contracts/src/migration/v09.rs | 4 +- .../frame/contracts/src/migration/v10.rs | 8 +- .../frame/contracts/src/migration/v11.rs | 4 +- .../frame/contracts/src/migration/v12.rs | 4 +- .../frame/contracts/src/migration/v13.rs | 1 - .../frame/contracts/src/migration/v14.rs | 6 +- .../frame/contracts/src/migration/v15.rs | 4 +- .../frame/contracts/src/migration/v16.rs | 1 - substrate/frame/contracts/src/primitives.rs | 2 +- substrate/frame/contracts/src/storage.rs | 3 +- .../frame/contracts/src/storage/meter.rs | 3 +- substrate/frame/contracts/src/tests.rs | 2 +- substrate/frame/contracts/src/wasm/mod.rs | 2 +- substrate/frame/contracts/src/wasm/prepare.rs | 6 +- substrate/frame/contracts/src/wasm/runtime.rs | 5 +- substrate/frame/conviction-voting/Cargo.toml | 2 - .../conviction-voting/src/benchmarking.rs | 2 +- substrate/frame/conviction-voting/src/lib.rs | 7 +- .../frame/conviction-voting/src/types.rs | 2 +- substrate/frame/conviction-voting/src/vote.rs | 1 - substrate/frame/core-fellowship/Cargo.toml | 2 - .../frame/core-fellowship/src/benchmarking.rs | 1 + substrate/frame/core-fellowship/src/lib.rs | 5 +- .../frame/core-fellowship/src/migration.rs | 2 + substrate/frame/delegated-staking/Cargo.toml | 2 - .../frame/delegated-staking/src/impls.rs | 2 +- substrate/frame/delegated-staking/src/lib.rs | 6 +- substrate/frame/democracy/Cargo.toml | 2 - substrate/frame/democracy/src/benchmarking.rs | 2 +- substrate/frame/democracy/src/lib.rs | 10 +- .../unlock_and_unreserve_all_funds.rs | 6 +- substrate/frame/democracy/src/vote.rs | 1 - .../election-provider-multi-phase/Cargo.toml | 2 - .../src/helpers.rs | 2 +- .../election-provider-multi-phase/src/lib.rs | 8 +- .../src/migrations.rs | 4 +- .../src/signed.rs | 10 +- .../src/unsigned.rs | 11 +- .../test-staking-e2e/src/mock.rs | 1 - .../election-provider-support/Cargo.toml | 2 - .../benchmarking/Cargo.toml | 2 - .../benchmarking/src/inner.rs | 2 +- .../benchmarking/src/lib.rs | 2 + .../solution-type/src/codec.rs | 20 +-- .../solution-type/src/single_page.rs | 16 +- .../election-provider-support/src/lib.rs | 19 ++- .../election-provider-support/src/onchain.rs | 3 +- .../election-provider-support/src/traits.rs | 3 +- substrate/frame/elections-phragmen/Cargo.toml | 2 - substrate/frame/elections-phragmen/src/lib.rs | 5 +- .../unlock_and_unreserve_all_funds.rs | 6 +- .../elections-phragmen/src/migrations/v3.rs | 2 +- .../elections-phragmen/src/migrations/v5.rs | 1 + substrate/frame/examples/basic/Cargo.toml | 2 - substrate/frame/examples/basic/src/lib.rs | 4 +- substrate/frame/examples/basic/src/tests.rs | 2 +- .../frame/examples/default-config/Cargo.toml | 2 - .../frame/examples/default-config/src/lib.rs | 4 +- substrate/frame/examples/dev-mode/Cargo.toml | 2 - substrate/frame/examples/dev-mode/src/lib.rs | 4 +- .../frame/examples/kitchensink/Cargo.toml | 2 - .../frame/examples/kitchensink/src/lib.rs | 2 + .../frame/examples/offchain-worker/Cargo.toml | 2 - .../frame/examples/offchain-worker/src/lib.rs | 6 +- .../examples/offchain-worker/src/tests.rs | 2 +- .../single-block-migrations/Cargo.toml | 2 - .../single-block-migrations/src/lib.rs | 3 + .../src/migrations/v1.rs | 4 +- substrate/frame/examples/split/Cargo.toml | 2 - substrate/frame/examples/tasks/Cargo.toml | 2 - substrate/frame/executive/Cargo.toml | 2 - substrate/frame/executive/src/lib.rs | 6 +- substrate/frame/fast-unstake/Cargo.toml | 2 - .../frame/fast-unstake/src/benchmarking.rs | 2 +- substrate/frame/fast-unstake/src/lib.rs | 4 +- .../frame/fast-unstake/src/migrations.rs | 4 +- substrate/frame/fast-unstake/src/mock.rs | 1 - substrate/frame/fast-unstake/src/types.rs | 3 +- substrate/frame/glutton/Cargo.toml | 2 - substrate/frame/glutton/src/lib.rs | 6 +- substrate/frame/grandpa/Cargo.toml | 2 - substrate/frame/grandpa/src/equivocation.rs | 4 +- substrate/frame/grandpa/src/lib.rs | 6 +- substrate/frame/grandpa/src/migrations/v5.rs | 3 +- substrate/frame/identity/Cargo.toml | 2 - substrate/frame/identity/src/benchmarking.rs | 1 + substrate/frame/identity/src/legacy.rs | 3 +- substrate/frame/identity/src/lib.rs | 4 +- substrate/frame/identity/src/types.rs | 7 +- substrate/frame/im-online/Cargo.toml | 2 - substrate/frame/im-online/src/lib.rs | 8 +- substrate/frame/im-online/src/migration.rs | 1 + substrate/frame/indices/Cargo.toml | 2 - substrate/frame/indices/src/lib.rs | 4 +- .../Cargo.toml | 2 - substrate/frame/lottery/Cargo.toml | 2 - substrate/frame/lottery/src/benchmarking.rs | 1 + substrate/frame/lottery/src/lib.rs | 4 +- substrate/frame/membership/Cargo.toml | 2 - substrate/frame/membership/src/lib.rs | 6 +- .../frame/merkle-mountain-range/Cargo.toml | 2 - .../frame/merkle-mountain-range/src/lib.rs | 12 +- .../merkle-mountain-range/src/mmr/mmr.rs | 2 +- .../merkle-mountain-range/src/mmr/storage.rs | 7 +- substrate/frame/message-queue/Cargo.toml | 2 - .../frame/message-queue/src/benchmarking.rs | 1 - substrate/frame/message-queue/src/lib.rs | 13 +- substrate/frame/message-queue/src/mock.rs | 2 +- .../frame/message-queue/src/mock_helpers.rs | 1 + substrate/frame/migrations/Cargo.toml | 2 - substrate/frame/migrations/src/lib.rs | 14 +- .../frame/migrations/src/mock_helpers.rs | 2 +- substrate/frame/mixnet/Cargo.toml | 2 - substrate/frame/mixnet/src/lib.rs | 5 +- substrate/frame/multisig/Cargo.toml | 2 - substrate/frame/multisig/src/lib.rs | 4 +- .../frame/nft-fractionalization/Cargo.toml | 2 - .../nft-fractionalization/src/benchmarking.rs | 1 - .../frame/nft-fractionalization/src/lib.rs | 2 +- substrate/frame/nfts/Cargo.toml | 2 - substrate/frame/nfts/runtime-api/Cargo.toml | 3 +- substrate/frame/nfts/runtime-api/src/lib.rs | 4 +- substrate/frame/nfts/src/benchmarking.rs | 1 - substrate/frame/nfts/src/common_functions.rs | 1 + substrate/frame/nfts/src/features/metadata.rs | 1 + substrate/frame/nfts/src/features/roles.rs | 2 +- substrate/frame/nfts/src/impl_nonfungibles.rs | 1 - substrate/frame/nfts/src/lib.rs | 4 +- substrate/frame/nfts/src/tests.rs | 1 - substrate/frame/nfts/src/types.rs | 1 + substrate/frame/nis/Cargo.toml | 2 - substrate/frame/nis/src/benchmarking.rs | 1 - substrate/frame/nis/src/lib.rs | 12 +- substrate/frame/node-authorization/Cargo.toml | 2 - substrate/frame/node-authorization/src/lib.rs | 4 +- substrate/frame/nomination-pools/Cargo.toml | 2 - .../nomination-pools/benchmarking/Cargo.toml | 2 - .../benchmarking/src/inner.rs | 2 +- .../nomination-pools/benchmarking/src/lib.rs | 2 + .../nomination-pools/runtime-api/Cargo.toml | 3 +- .../frame/nomination-pools/src/adapter.rs | 2 +- substrate/frame/nomination-pools/src/lib.rs | 9 +- .../frame/nomination-pools/src/migration.rs | 22 +-- substrate/frame/offences/Cargo.toml | 2 - .../frame/offences/benchmarking/Cargo.toml | 2 - .../frame/offences/benchmarking/src/inner.rs | 2 +- .../frame/offences/benchmarking/src/lib.rs | 2 + substrate/frame/offences/src/lib.rs | 5 +- substrate/frame/offences/src/migration.rs | 4 +- substrate/frame/paged-list/Cargo.toml | 2 - substrate/frame/paged-list/src/lib.rs | 4 +- substrate/frame/paged-list/src/paged_list.rs | 6 +- substrate/frame/parameters/Cargo.toml | 2 - substrate/frame/preimage/Cargo.toml | 2 - substrate/frame/preimage/src/benchmarking.rs | 2 +- substrate/frame/preimage/src/lib.rs | 4 +- substrate/frame/preimage/src/migration.rs | 4 +- substrate/frame/proxy/Cargo.toml | 2 - substrate/frame/proxy/src/benchmarking.rs | 1 + substrate/frame/proxy/src/lib.rs | 4 +- substrate/frame/proxy/src/tests.rs | 1 + substrate/frame/ranked-collective/Cargo.toml | 2 - .../ranked-collective/src/benchmarking.rs | 1 + substrate/frame/ranked-collective/src/lib.rs | 4 +- substrate/frame/recovery/Cargo.toml | 2 - substrate/frame/recovery/src/benchmarking.rs | 1 + substrate/frame/recovery/src/lib.rs | 4 +- substrate/frame/referenda/Cargo.toml | 2 - substrate/frame/referenda/src/benchmarking.rs | 5 +- substrate/frame/referenda/src/lib.rs | 7 +- substrate/frame/referenda/src/types.rs | 2 +- substrate/frame/remark/Cargo.toml | 2 - substrate/frame/remark/src/benchmarking.rs | 2 +- substrate/frame/remark/src/lib.rs | 4 +- substrate/frame/root-offences/src/mock.rs | 2 +- substrate/frame/root-testing/Cargo.toml | 2 - substrate/frame/safe-mode/Cargo.toml | 2 - substrate/frame/salary/Cargo.toml | 2 - substrate/frame/sassafras/Cargo.toml | 2 - substrate/frame/sassafras/src/lib.rs | 6 +- substrate/frame/scheduler/Cargo.toml | 2 - substrate/frame/scheduler/src/benchmarking.rs | 2 +- substrate/frame/scheduler/src/lib.rs | 5 +- substrate/frame/scheduler/src/migration.rs | 2 +- substrate/frame/scored-pool/Cargo.toml | 2 - substrate/frame/scored-pool/src/lib.rs | 5 +- substrate/frame/session/Cargo.toml | 2 - .../frame/session/benchmarking/Cargo.toml | 2 - .../frame/session/benchmarking/src/inner.rs | 2 +- .../frame/session/benchmarking/src/lib.rs | 2 + substrate/frame/session/src/historical/mod.rs | 8 +- .../frame/session/src/historical/offchain.rs | 6 +- .../frame/session/src/historical/onchain.rs | 2 +- .../frame/session/src/historical/shared.rs | 2 +- substrate/frame/session/src/lib.rs | 14 +- substrate/frame/society/Cargo.toml | 2 - substrate/frame/society/src/benchmarking.rs | 1 + substrate/frame/society/src/lib.rs | 6 +- substrate/frame/society/src/migrations.rs | 1 + substrate/frame/src/lib.rs | 8 +- substrate/frame/staking/Cargo.toml | 2 - substrate/frame/staking/src/benchmarking.rs | 3 +- substrate/frame/staking/src/ledger.rs | 1 - substrate/frame/staking/src/lib.rs | 16 +- substrate/frame/staking/src/migrations.rs | 8 +- substrate/frame/staking/src/pallet/impls.rs | 12 +- substrate/frame/staking/src/pallet/mod.rs | 4 +- substrate/frame/staking/src/slashing.rs | 12 +- substrate/frame/staking/src/testing_utils.rs | 1 - substrate/frame/staking/src/tests.rs | 1 - .../frame/state-trie-migration/Cargo.toml | 2 - .../frame/state-trie-migration/src/lib.rs | 20 ++- substrate/frame/statement/Cargo.toml | 2 - substrate/frame/statement/src/lib.rs | 2 +- substrate/frame/sudo/Cargo.toml | 2 - substrate/frame/sudo/src/benchmarking.rs | 1 + substrate/frame/sudo/src/extension.rs | 2 +- substrate/frame/sudo/src/lib.rs | 5 +- .../src/construct_runtime/expand/inherent.rs | 6 +- .../src/construct_runtime/expand/metadata.rs | 4 +- .../src/construct_runtime/expand/origin.rs | 34 ++-- .../procedural/src/construct_runtime/mod.rs | 22 +-- .../procedural/src/pallet/expand/constants.rs | 6 +- .../src/pallet/expand/documentation.rs | 4 +- .../procedural/src/pallet/expand/error.rs | 8 +- .../procedural/src/pallet/expand/hooks.rs | 4 +- .../src/pallet/expand/pallet_struct.rs | 14 +- .../procedural/src/pallet/expand/storage.rs | 8 +- .../procedural/src/pallet/expand/tasks.rs | 7 +- .../src/pallet/parse/tests/tasks.rs | 4 +- .../procedural/src/runtime/expand/mod.rs | 2 +- substrate/frame/support/src/dispatch.rs | 8 +- .../frame/support/src/dispatch_context.rs | 6 +- .../support/src/genesis_builder_helper.rs | 2 +- substrate/frame/support/src/hash.rs | 2 +- substrate/frame/support/src/lib.rs | 25 ++- substrate/frame/support/src/migrations.rs | 21 +-- .../support/src/storage/bounded_btree_map.rs | 2 +- .../support/src/storage/bounded_btree_set.rs | 2 +- substrate/frame/support/src/storage/child.rs | 2 +- .../src/storage/generator/double_map.rs | 3 +- .../support/src/storage/generator/map.rs | 6 +- .../support/src/storage/generator/mod.rs | 1 + .../support/src/storage/generator/nmap.rs | 4 +- substrate/frame/support/src/storage/hashed.rs | 2 +- .../frame/support/src/storage/migration.rs | 6 +- substrate/frame/support/src/storage/mod.rs | 3 +- .../support/src/storage/storage_noop_guard.rs | 12 +- .../frame/support/src/storage/stream_iter.rs | 22 +-- .../support/src/storage/types/counted_map.rs | 2 +- .../support/src/storage/types/counted_nmap.rs | 3 +- .../support/src/storage/types/double_map.rs | 2 +- .../frame/support/src/storage/types/key.rs | 10 +- .../frame/support/src/storage/types/map.rs | 2 +- .../frame/support/src/storage/types/mod.rs | 4 +- .../frame/support/src/storage/types/nmap.rs | 3 +- .../frame/support/src/storage/types/value.rs | 2 +- .../frame/support/src/storage/unhashed.rs | 2 +- .../support/src/traits/dynamic_params.rs | 2 +- substrate/frame/support/src/traits/filter.rs | 4 +- substrate/frame/support/src/traits/hooks.rs | 5 +- substrate/frame/support/src/traits/members.rs | 3 +- .../frame/support/src/traits/messages.rs | 2 +- .../frame/support/src/traits/metadata.rs | 13 +- substrate/frame/support/src/traits/misc.rs | 33 ++-- .../frame/support/src/traits/preimages.rs | 8 +- .../frame/support/src/traits/schedule.rs | 9 +- substrate/frame/support/src/traits/storage.rs | 2 +- substrate/frame/support/src/traits/tasks.rs | 6 +- .../src/traits/tokens/currency/reservable.rs | 2 +- .../src/traits/tokens/fungible/imbalance.rs | 14 +- .../src/traits/tokens/fungible/item_of.rs | 4 +- .../support/src/traits/tokens/fungible/mod.rs | 4 +- .../src/traits/tokens/fungible/regular.rs | 2 +- .../src/traits/tokens/fungible/union_of.rs | 6 +- .../src/traits/tokens/fungibles/imbalance.rs | 14 +- .../src/traits/tokens/fungibles/metadata.rs | 2 +- .../src/traits/tokens/fungibles/regular.rs | 2 +- .../src/traits/tokens/fungibles/union_of.rs | 4 +- .../traits/tokens/imbalance/on_unbalanced.rs | 2 +- .../tokens/imbalance/signed_imbalance.rs | 2 +- .../traits/tokens/imbalance/split_two_ways.rs | 2 +- .../frame/support/src/traits/tokens/misc.rs | 4 +- .../support/src/traits/tokens/nonfungible.rs | 4 +- .../src/traits/tokens/nonfungible_v2.rs | 4 +- .../support/src/traits/tokens/nonfungibles.rs | 2 +- .../src/traits/tokens/nonfungibles_v2.rs | 2 +- .../frame/support/src/traits/tokens/pay.rs | 2 +- .../traits/try_runtime/decode_entire_state.rs | 6 +- .../support/src/traits/try_runtime/mod.rs | 16 +- .../frame/support/src/traits/validation.rs | 2 +- substrate/frame/support/src/traits/voting.rs | 4 +- substrate/frame/support/test/Cargo.toml | 2 - substrate/frame/support/test/src/lib.rs | 2 +- .../frame/support/test/tests/issue2219.rs | 2 +- substrate/frame/support/test/tests/origin.rs | 4 +- substrate/frame/support/test/tests/pallet.rs | 2 +- .../support/test/tests/pallet_instance.rs | 4 +- substrate/frame/support/test/tests/runtime.rs | 6 +- .../test/tests/runtime_legacy_ordering.rs | 6 +- .../support/test/tests/versioned_migration.rs | 4 +- .../frame/system/benchmarking/Cargo.toml | 2 - .../frame/system/benchmarking/src/inner.rs | 2 +- .../frame/system/benchmarking/src/lib.rs | 2 + .../system/src/extensions/check_genesis.rs | 10 +- .../system/src/extensions/check_mortality.rs | 10 +- .../src/extensions/check_non_zero_sender.rs | 12 +- .../system/src/extensions/check_nonce.rs | 10 +- .../src/extensions/check_spec_version.rs | 10 +- .../system/src/extensions/check_tx_version.rs | 10 +- .../system/src/extensions/check_weight.rs | 12 +- substrate/frame/system/src/lib.rs | 27 +-- substrate/frame/system/src/migrations/mod.rs | 1 - substrate/frame/system/src/offchain.rs | 6 +- substrate/frame/timestamp/Cargo.toml | 2 - substrate/frame/timestamp/src/lib.rs | 16 +- substrate/frame/tips/Cargo.toml | 2 - substrate/frame/tips/src/lib.rs | 4 +- .../tips/src/migrations/unreserve_deposits.rs | 8 +- .../frame/transaction-payment/Cargo.toml | 2 - .../asset-conversion-tx-payment/Cargo.toml | 2 - .../asset-conversion-tx-payment/src/lib.rs | 10 +- .../src/payment.rs | 3 +- .../asset-tx-payment/Cargo.toml | 2 - .../asset-tx-payment/src/lib.rs | 10 +- .../asset-tx-payment/src/payment.rs | 2 +- .../skip-feeless-payment/Cargo.toml | 2 - .../skip-feeless-payment/src/lib.rs | 10 +- .../skip-feeless-payment/src/mock.rs | 2 +- .../frame/transaction-payment/src/lib.rs | 15 +- .../frame/transaction-payment/src/types.rs | 1 - .../frame/transaction-storage/Cargo.toml | 2 - .../transaction-storage/src/benchmarking.rs | 2 +- .../frame/transaction-storage/src/lib.rs | 5 +- substrate/frame/treasury/Cargo.toml | 2 - substrate/frame/treasury/src/lib.rs | 6 +- substrate/frame/try-runtime/Cargo.toml | 2 - substrate/frame/tx-pause/Cargo.toml | 2 - substrate/frame/tx-pause/src/benchmarking.rs | 1 + substrate/frame/tx-pause/src/lib.rs | 4 +- substrate/frame/uniques/Cargo.toml | 2 - substrate/frame/uniques/src/benchmarking.rs | 2 +- .../frame/uniques/src/impl_nonfungibles.rs | 2 +- substrate/frame/uniques/src/lib.rs | 4 +- substrate/frame/uniques/src/tests.rs | 1 - substrate/frame/utility/Cargo.toml | 2 - substrate/frame/utility/src/benchmarking.rs | 1 + substrate/frame/utility/src/lib.rs | 8 +- substrate/frame/vesting/Cargo.toml | 2 - substrate/frame/vesting/src/lib.rs | 5 +- substrate/frame/vesting/src/migrations.rs | 1 + substrate/frame/whitelist/Cargo.toml | 2 - substrate/frame/whitelist/src/benchmarking.rs | 4 +- substrate/frame/whitelist/src/lib.rs | 4 +- substrate/primitives/api/Cargo.toml | 2 - substrate/primitives/api/src/lib.rs | 7 +- .../primitives/application-crypto/Cargo.toml | 2 - .../application-crypto/src/bandersnatch.rs | 2 +- .../application-crypto/src/bls377.rs | 2 +- .../application-crypto/src/ecdsa.rs | 2 +- .../application-crypto/src/ecdsa_bls377.rs | 2 +- .../application-crypto/src/ed25519.rs | 2 +- .../primitives/application-crypto/src/lib.rs | 10 +- .../application-crypto/src/sr25519.rs | 2 +- .../application-crypto/src/traits.rs | 7 +- substrate/primitives/arithmetic/Cargo.toml | 2 - substrate/primitives/core/src/address_uri.rs | 10 +- substrate/primitives/core/src/bandersnatch.rs | 2 +- substrate/primitives/core/src/bls.rs | 2 +- substrate/primitives/core/src/crypto.rs | 28 ++- substrate/primitives/core/src/crypto_bytes.rs | 12 +- substrate/primitives/core/src/ecdsa.rs | 4 +- substrate/primitives/core/src/ed25519.rs | 2 +- substrate/primitives/core/src/hexdisplay.rs | 10 +- substrate/primitives/core/src/lib.rs | 13 +- substrate/primitives/core/src/offchain/mod.rs | 2 +- .../primitives/core/src/paired_crypto.rs | 2 +- substrate/primitives/core/src/sr25519.rs | 12 +- substrate/primitives/io/Cargo.toml | 2 - substrate/primitives/io/src/lib.rs | 6 +- .../proc-macro/src/pass_by/enum_.rs | 2 +- .../primitives/runtime-interface/src/impls.rs | 8 +- .../primitives/runtime-interface/src/lib.rs | 2 + .../runtime-interface/src/pass_by.rs | 4 +- .../runtime-interface/test-wasm/Cargo.toml | 2 - .../runtime-interface/test-wasm/src/lib.rs | 7 +- .../primitives/runtime/src/generic/block.rs | 2 +- .../primitives/runtime/src/generic/digest.rs | 7 +- .../src/generic/unchecked_extrinsic.rs | 11 +- substrate/primitives/runtime/src/lib.rs | 23 ++- .../primitives/runtime/src/multiaddress.rs | 2 +- .../primitives/runtime/src/offchain/http.rs | 4 +- .../primitives/runtime/src/runtime_logger.rs | 2 +- .../primitives/runtime/src/runtime_string.rs | 4 +- substrate/primitives/runtime/src/traits.rs | 44 ++--- .../runtime/src/transaction_validity.rs | 2 +- substrate/primitives/version/src/lib.rs | 12 +- substrate/test-utils/runtime/src/lib.rs | 1 - templates/minimal/runtime/src/lib.rs | 3 + templates/parachain/runtime/src/lib.rs | 2 +- templates/solochain/runtime/src/lib.rs | 2 +- 825 files changed, 1835 insertions(+), 1938 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4a7d47eb0f7..9972285780f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -896,7 +896,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -1026,7 +1025,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -1062,7 +1060,6 @@ dependencies = [ "parity-scale-codec", "sp-io", "sp-runtime", - "sp-std 14.0.0", "staging-parachain-info", "staging-xcm", "staging-xcm-builder", @@ -1085,7 +1082,6 @@ dependencies = [ "scale-info", "sp-api", "sp-runtime", - "sp-std 14.0.0", "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", @@ -2036,7 +2032,6 @@ dependencies = [ "snowbridge-core", "sp-core", "sp-runtime", - "sp-std 14.0.0", "staging-xcm", ] @@ -2216,7 +2211,6 @@ dependencies = [ "sp-io", "sp-keyring", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", "staging-xcm", "staging-xcm-builder", @@ -2616,7 +2610,6 @@ dependencies = [ "sp-genesis-builder", "sp-keyring", "sp-runtime", - "sp-std 14.0.0", "staging-chain-spec-builder", "substrate-wasm-builder", ] @@ -2966,7 +2959,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -3223,7 +3215,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -3321,7 +3312,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -3386,7 +3376,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -3910,7 +3899,6 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-state-machine", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-trie", "tracing", @@ -4002,7 +3990,6 @@ dependencies = [ "sp-application-crypto", "sp-consensus-aura", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -4019,7 +4006,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", "staging-xcm", ] @@ -4093,7 +4079,6 @@ dependencies = [ "pallet-session", "parity-scale-codec", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -4108,7 +4093,6 @@ dependencies = [ "polkadot-primitives", "scale-info", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -4122,7 +4106,6 @@ dependencies = [ "scale-info", "sp-io", "sp-runtime", - "sp-std 14.0.0", "staging-xcm", ] @@ -4147,7 +4130,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", @@ -4164,7 +4146,6 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-runtime", - "sp-std 14.0.0", "staging-xcm", ] @@ -4178,7 +4159,6 @@ dependencies = [ "sp-api", "sp-consensus-aura", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -4192,7 +4172,6 @@ dependencies = [ "scale-info", "sp-api", "sp-runtime", - "sp-std 14.0.0", "sp-trie", "staging-xcm", ] @@ -4209,7 +4188,6 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-state-machine", - "sp-std 14.0.0", "sp-trie", ] @@ -4240,7 +4218,6 @@ dependencies = [ "scale-info", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-trie", ] @@ -4252,7 +4229,6 @@ dependencies = [ "futures", "parity-scale-codec", "sp-inherents", - "sp-std 14.0.0", "sp-timestamp", ] @@ -4269,7 +4245,6 @@ dependencies = [ "polkadot-runtime-parachains", "sp-io", "sp-runtime", - "sp-std 14.0.0", "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", @@ -4439,7 +4414,6 @@ dependencies = [ "polkadot-primitives", "sp-runtime", "sp-state-machine", - "sp-std 14.0.0", "sp-trie", ] @@ -4478,7 +4452,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-transaction-pool", "sp-version", "staging-parachain-info", @@ -5729,7 +5702,6 @@ dependencies = [ "sp-keystore", "sp-runtime", "sp-runtime-interface 24.0.0", - "sp-std 14.0.0", "sp-storage 19.0.0", "static_assertions", ] @@ -5794,7 +5766,6 @@ dependencies = [ "scale-info", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -5828,7 +5799,6 @@ dependencies = [ "sp-io", "sp-npos-elections", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -5866,7 +5836,6 @@ dependencies = [ "sp-inherents", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", "sp-version", ] @@ -6046,7 +6015,6 @@ dependencies = [ "sp-metadata-ir", "sp-runtime", "sp-state-machine", - "sp-std 14.0.0", "sp-version", "static_assertions", "trybuild", @@ -6121,7 +6089,6 @@ dependencies = [ "sp-externalities 0.25.0", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-version", ] @@ -6142,7 +6109,6 @@ dependencies = [ "parity-scale-codec", "sp-api", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -6480,7 +6446,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -9665,7 +9630,6 @@ dependencies = [ "sp-crypto-hashing", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -9686,7 +9650,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -9707,7 +9670,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -9725,7 +9687,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-storage 19.0.0", ] @@ -9742,7 +9703,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -9763,7 +9723,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-storage 19.0.0", ] @@ -9814,7 +9773,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -9832,7 +9790,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -9849,7 +9806,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -9864,7 +9820,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -9892,7 +9847,6 @@ dependencies = [ "sp-runtime", "sp-session", "sp-staking", - "sp-std 14.0.0", ] [[package]] @@ -9912,7 +9866,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", ] @@ -9960,7 +9913,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -9988,7 +9940,6 @@ dependencies = [ "sp-session", "sp-staking", "sp-state-machine", - "sp-std 14.0.0", ] [[package]] @@ -10013,7 +9964,6 @@ dependencies = [ "sp-runtime", "sp-staking", "sp-state-machine", - "sp-std 14.0.0", ] [[package]] @@ -10031,7 +9981,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10161,7 +10110,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", ] @@ -10181,7 +10129,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10205,7 +10152,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-staking", - "sp-std 14.0.0", "sp-tracing 16.0.0", ] @@ -10222,7 +10168,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10237,7 +10182,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10330,7 +10274,6 @@ dependencies = [ "sp-io", "sp-keystore", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", "staging-xcm", "staging-xcm-builder", @@ -10374,7 +10317,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10392,7 +10334,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10406,7 +10347,6 @@ dependencies = [ "scale-info", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10427,7 +10367,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-staking", - "sp-std 14.0.0", "sp-tracing 16.0.0", "substrate-test-utils", ] @@ -10449,7 +10388,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10465,7 +10403,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10515,7 +10452,6 @@ dependencies = [ "sp-io", "sp-npos-elections", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", "strum 0.26.2", ] @@ -10530,7 +10466,6 @@ dependencies = [ "parity-scale-codec", "sp-npos-elections", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10549,7 +10484,6 @@ dependencies = [ "sp-npos-elections", "sp-runtime", "sp-staking", - "sp-std 14.0.0", "sp-tracing 16.0.0", "substrate-test-utils", ] @@ -10568,7 +10502,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10594,7 +10527,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10625,7 +10557,6 @@ dependencies = [ "sp-io", "sp-keystore", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10644,7 +10575,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-version", ] @@ -10660,7 +10590,6 @@ dependencies = [ "scale-info", "sp-core", "sp-io", - "sp-std 14.0.0", ] [[package]] @@ -10676,7 +10605,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10714,7 +10642,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-staking", - "sp-std 14.0.0", "sp-tracing 16.0.0", "substrate-test-utils", ] @@ -10735,7 +10662,6 @@ dependencies = [ "sp-inherents", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10765,7 +10691,6 @@ dependencies = [ "sp-runtime", "sp-session", "sp-staking", - "sp-std 14.0.0", ] [[package]] @@ -10784,7 +10709,6 @@ dependencies = [ "sp-io", "sp-keystore", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10804,7 +10728,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-staking", - "sp-std 14.0.0", ] [[package]] @@ -10821,7 +10744,6 @@ dependencies = [ "sp-io", "sp-keyring", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10836,7 +10758,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10853,7 +10774,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10869,7 +10789,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10891,7 +10810,6 @@ dependencies = [ "sp-crypto-hashing", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", "sp-weights", ] @@ -10915,7 +10833,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", "sp-version", ] @@ -10945,7 +10862,6 @@ dependencies = [ "sp-io", "sp-mixnet", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10965,7 +10881,6 @@ dependencies = [ "sp-io", "sp-mmr-primitives", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -10981,7 +10896,6 @@ dependencies = [ "scale-info", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11019,7 +10933,6 @@ dependencies = [ "sp-io", "sp-keystore", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11029,7 +10942,6 @@ dependencies = [ "pallet-nfts", "parity-scale-codec", "sp-api", - "sp-std 14.0.0", ] [[package]] @@ -11046,7 +10958,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11061,7 +10972,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11078,7 +10988,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-staking", - "sp-std 14.0.0", "sp-tracing 16.0.0", ] @@ -11104,7 +11013,6 @@ dependencies = [ "sp-runtime", "sp-runtime-interface 24.0.0", "sp-staking", - "sp-std 14.0.0", ] [[package]] @@ -11129,7 +11037,6 @@ dependencies = [ "pallet-nomination-pools", "parity-scale-codec", "sp-api", - "sp-std 14.0.0", ] [[package]] @@ -11196,7 +11103,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-staking", - "sp-std 14.0.0", ] [[package]] @@ -11223,7 +11129,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-staking", - "sp-std 14.0.0", ] [[package]] @@ -11240,7 +11145,6 @@ dependencies = [ "sp-io", "sp-metadata-ir", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11285,7 +11189,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11302,7 +11205,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11319,7 +11221,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11337,7 +11238,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11353,7 +11253,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11375,7 +11274,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11391,7 +11289,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11426,7 +11323,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11446,7 +11342,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11464,7 +11359,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11483,7 +11377,6 @@ dependencies = [ "sp-crypto-hashing", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11501,7 +11394,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-weights", "substrate-test-utils", ] @@ -11518,7 +11410,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11538,7 +11429,6 @@ dependencies = [ "sp-session", "sp-staking", "sp-state-machine", - "sp-std 14.0.0", "sp-trie", ] @@ -11562,7 +11452,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-session", - "sp-std 14.0.0", ] [[package]] @@ -11574,7 +11463,6 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11595,7 +11483,6 @@ dependencies = [ "sp-crypto-hashing", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11623,7 +11510,6 @@ dependencies = [ "sp-npos-elections", "sp-runtime", "sp-staking", - "sp-std 14.0.0", "sp-tracing 16.0.0", "substrate-test-utils", ] @@ -11673,7 +11559,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", "substrate-state-trie-migration-rpc", "thousands", @@ -11696,7 +11581,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-statement-store", - "sp-std 14.0.0", ] [[package]] @@ -11712,7 +11596,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11744,7 +11627,6 @@ dependencies = [ "sp-inherents", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-timestamp", ] @@ -11765,7 +11647,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-storage 19.0.0", ] @@ -11783,7 +11664,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11829,7 +11709,6 @@ dependencies = [ "sp-inherents", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-transaction-storage-proof", ] @@ -11850,7 +11729,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11869,7 +11747,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11905,7 +11782,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11922,7 +11798,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11940,7 +11815,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11962,7 +11836,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", @@ -11986,7 +11859,6 @@ dependencies = [ "scale-info", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", "staging-xcm", "staging-xcm-builder", @@ -12179,7 +12051,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "staging-parachain-info", "staging-xcm", "staging-xcm-executor", @@ -12224,7 +12095,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-tracing 16.0.0", "staging-parachain-info", "staging-xcm", @@ -12498,7 +12368,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -12596,7 +12465,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -12694,7 +12562,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -13075,7 +12942,6 @@ dependencies = [ "scale-info", "sp-core", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -13970,7 +13836,6 @@ dependencies = [ "serde", "sp-core", "sp-runtime", - "sp-std 14.0.0", "sp-weights", ] @@ -13997,7 +13862,6 @@ dependencies = [ "sp-keystore", "sp-runtime", "sp-staking", - "sp-std 14.0.0", ] [[package]] @@ -14095,7 +13959,6 @@ dependencies = [ "sp-runtime", "sp-session", "sp-staking", - "sp-std 14.0.0", "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", @@ -14110,7 +13973,6 @@ dependencies = [ "frame-benchmarking", "parity-scale-codec", "polkadot-primitives", - "sp-std 14.0.0", "sp-tracing 16.0.0", ] @@ -14165,7 +14027,6 @@ dependencies = [ "sp-runtime", "sp-session", "sp-staking", - "sp-std 14.0.0", "sp-tracing 16.0.0", "staging-xcm", "staging-xcm-executor", @@ -14671,7 +14532,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-transaction-pool", "sp-version", @@ -15031,7 +14891,6 @@ dependencies = [ "sp-runtime", "sp-session", "sp-staking", - "sp-std 14.0.0", "sp-transaction-pool", "sp-trie", "sp-version", @@ -16457,7 +16316,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-transaction-pool", "sp-version", "staging-parachain-info", @@ -16559,7 +16417,6 @@ dependencies = [ "sp-runtime", "sp-session", "sp-staking", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-tracing 16.0.0", "sp-transaction-pool", @@ -18198,7 +18055,6 @@ dependencies = [ "sp-io", "sp-runtime", "sp-runtime-interface 24.0.0", - "sp-std 14.0.0", "substrate-wasm-builder", ] @@ -18788,7 +18644,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-transaction-pool", "sp-version", "staging-parachain-info", @@ -19112,7 +18967,6 @@ dependencies = [ "sp-offchain", "sp-runtime", "sp-session", - "sp-std 14.0.0", "sp-transaction-pool", "sp-version", "staging-parachain-info", @@ -19219,7 +19073,6 @@ dependencies = [ "parity-scale-codec", "paste", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -19853,7 +19706,6 @@ dependencies = [ "sp-runtime", "sp-runtime-interface 24.0.0", "sp-state-machine", - "sp-std 14.0.0", "sp-test-primitives", "sp-trie", "sp-version", @@ -19906,7 +19758,6 @@ dependencies = [ "serde", "sp-core", "sp-io", - "sp-std 14.0.0", ] [[package]] @@ -19934,7 +19785,6 @@ dependencies = [ "scale-info", "serde", "sp-crypto-hashing", - "sp-std 14.0.0", "static_assertions", ] @@ -20350,7 +20200,6 @@ dependencies = [ "sp-keystore", "sp-runtime-interface 24.0.0", "sp-state-machine", - "sp-std 14.0.0", "sp-tracing 16.0.0", "sp-trie", "tracing", @@ -20596,7 +20445,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime-interface 24.0.0", - "sp-std 14.0.0", "substrate-wasm-builder", ] @@ -21024,7 +20872,6 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -21076,7 +20923,6 @@ dependencies = [ "sp-arithmetic", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-weights", "staging-xcm", "staging-xcm-executor", @@ -21096,7 +20942,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", "sp-weights", "staging-xcm", "tracing", @@ -21893,7 +21738,6 @@ dependencies = [ "parity-scale-codec", "polkadot-parachain-primitives", "sp-io", - "sp-std 14.0.0", "substrate-wasm-builder", "tiny-keccak", ] @@ -21941,7 +21785,6 @@ dependencies = [ "parity-scale-codec", "polkadot-parachain-primitives", "sp-io", - "sp-std 14.0.0", "substrate-wasm-builder", "tiny-keccak", ] @@ -23640,7 +23483,6 @@ dependencies = [ "sp-runtime", "sp-session", "sp-staking", - "sp-std 14.0.0", "sp-storage 19.0.0", "sp-tracing 16.0.0", "sp-transaction-pool", @@ -24195,7 +24037,6 @@ dependencies = [ "scale-info", "sp-api", "sp-io", - "sp-std 14.0.0", "sp-weights", "staging-xcm", "staging-xcm-builder", diff --git a/cumulus/client/parachain-inherent/Cargo.toml b/cumulus/client/parachain-inherent/Cargo.toml index d81f727b41b..0d82cf64874 100644 --- a/cumulus/client/parachain-inherent/Cargo.toml +++ b/cumulus/client/parachain-inherent/Cargo.toml @@ -18,7 +18,6 @@ sp-crypto-hashing = { workspace = true, default-features = true } sp-inherents = { workspace = true, default-features = true } sp-runtime = { workspace = true, default-features = true } sp-state-machine = { workspace = true, default-features = true } -sp-std = { workspace = true, default-features = true } sp-storage = { workspace = true, default-features = true } sp-trie = { workspace = true, default-features = true } diff --git a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs index 8f8d666bd14..38ba84748c1 100644 --- a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs +++ b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use std::{pin::Pin, sync::Arc, time::Duration}; +use std::{collections::btree_map::BTreeMap, pin::Pin, sync::Arc, time::Duration}; use async_trait::async_trait; use cumulus_primitives_core::{ @@ -38,7 +38,7 @@ use sc_client_api::{ use sc_telemetry::TelemetryWorkerHandle; use sp_api::ProvideRuntimeApi; use sp_consensus::SyncOracle; -use sp_core::{sp_std::collections::btree_map::BTreeMap, Pair}; +use sp_core::Pair; use sp_state_machine::{Backend as StateBackend, StorageValue}; /// The timeout in seconds after that the waiting for a block should be aborted. diff --git a/cumulus/client/relay-chain-rpc-interface/src/lib.rs b/cumulus/client/relay-chain-rpc-interface/src/lib.rs index 692a1fb537a..e32ec6a41a4 100644 --- a/cumulus/client/relay-chain-rpc-interface/src/lib.rs +++ b/cumulus/client/relay-chain-rpc-interface/src/lib.rs @@ -30,11 +30,10 @@ use futures::{FutureExt, Stream, StreamExt}; use polkadot_overseer::Handle; use sc_client_api::StorageProof; -use sp_core::sp_std::collections::btree_map::BTreeMap; use sp_state_machine::StorageValue; use sp_storage::StorageKey; use sp_version::RuntimeVersion; -use std::pin::Pin; +use std::{collections::btree_map::BTreeMap, pin::Pin}; use cumulus_primitives_core::relay_chain::BlockId; pub use url::Url; diff --git a/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs b/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs index a5d7c22a2ec..c7eaa45958b 100644 --- a/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs +++ b/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs @@ -24,7 +24,7 @@ use jsonrpsee::{ }; use serde::de::DeserializeOwned; use serde_json::Value as JsonValue; -use std::collections::VecDeque; +use std::collections::{btree_map::BTreeMap, VecDeque}; use tokio::sync::mpsc::Sender as TokioSender; use codec::{Decode, Encode}; @@ -47,7 +47,6 @@ use sc_client_api::StorageData; use sc_rpc_api::{state::ReadProof, system::Health}; use sc_service::TaskManager; use sp_consensus_babe::Epoch; -use sp_core::sp_std::collections::btree_map::BTreeMap; use sp_storage::StorageKey; use sp_version::RuntimeVersion; diff --git a/cumulus/pallets/aura-ext/Cargo.toml b/cumulus/pallets/aura-ext/Cargo.toml index 1b6ac4cf07d..c08148928b7 100644 --- a/cumulus/pallets/aura-ext/Cargo.toml +++ b/cumulus/pallets/aura-ext/Cargo.toml @@ -21,7 +21,6 @@ pallet-timestamp = { workspace = true } sp-application-crypto = { workspace = true } sp-consensus-aura = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } # Cumulus cumulus-pallet-parachain-system = { workspace = true } @@ -44,7 +43,6 @@ std = [ "sp-application-crypto/std", "sp-consensus-aura/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "cumulus-pallet-parachain-system/try-runtime", diff --git a/cumulus/pallets/aura-ext/src/consensus_hook.rs b/cumulus/pallets/aura-ext/src/consensus_hook.rs index 560d477b2a8..c1a8568bdd8 100644 --- a/cumulus/pallets/aura-ext/src/consensus_hook.rs +++ b/cumulus/pallets/aura-ext/src/consensus_hook.rs @@ -20,6 +20,7 @@ //! The velocity `V` refers to the rate of block processing by the relay chain. use super::{pallet, Aura}; +use core::{marker::PhantomData, num::NonZeroU32}; use cumulus_pallet_parachain_system::{ self as parachain_system, consensus_hook::{ConsensusHook, UnincludedSegmentCapacity}, @@ -27,7 +28,6 @@ use cumulus_pallet_parachain_system::{ }; use frame_support::pallet_prelude::*; use sp_consensus_aura::{Slot, SlotDuration}; -use sp_std::{marker::PhantomData, num::NonZeroU32}; /// A consensus hook for a fixed block processing velocity and unincluded segment capacity. /// @@ -84,7 +84,7 @@ where ( weight, - NonZeroU32::new(sp_std::cmp::max(C, 1)) + NonZeroU32::new(core::cmp::max(C, 1)) .expect("1 is the minimum value and non-zero; qed") .into(), ) diff --git a/cumulus/pallets/aura-ext/src/lib.rs b/cumulus/pallets/aura-ext/src/lib.rs index 4605dd325be..4c9e61458a8 100644 --- a/cumulus/pallets/aura-ext/src/lib.rs +++ b/cumulus/pallets/aura-ext/src/lib.rs @@ -109,7 +109,7 @@ pub mod pallet { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -125,7 +125,7 @@ pub mod pallet { /// /// When executing the block it will verify the block seal to ensure that the correct author created /// the block. -pub struct BlockExecutor(sp_std::marker::PhantomData<(T, I)>); +pub struct BlockExecutor(core::marker::PhantomData<(T, I)>); impl ExecuteBlock for BlockExecutor where diff --git a/cumulus/pallets/collator-selection/Cargo.toml b/cumulus/pallets/collator-selection/Cargo.toml index 206700b7d60..b3512dc2ae6 100644 --- a/cumulus/pallets/collator-selection/Cargo.toml +++ b/cumulus/pallets/collator-selection/Cargo.toml @@ -21,7 +21,6 @@ codec = { features = ["derive"], workspace = true } rand = { features = ["std_rng"], workspace = true } scale-info = { features = ["derive"], workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } sp-staking = { workspace = true } frame-support = { workspace = true } @@ -65,7 +64,6 @@ std = [ "scale-info/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", ] try-runtime = [ diff --git a/cumulus/pallets/collator-selection/src/benchmarking.rs b/cumulus/pallets/collator-selection/src/benchmarking.rs index c6b60044528..24823661383 100644 --- a/cumulus/pallets/collator-selection/src/benchmarking.rs +++ b/cumulus/pallets/collator-selection/src/benchmarking.rs @@ -21,13 +21,14 @@ use super::*; #[allow(unused)] use crate::Pallet as CollatorSelection; +use alloc::vec::Vec; use codec::Decode; +use core::cmp; use frame_benchmarking::{account, v2::*, whitelisted_caller, BenchmarkError}; use frame_support::traits::{Currency, EnsureOrigin, Get, ReservableCurrency}; use frame_system::{pallet_prelude::BlockNumberFor, EventRecord, RawOrigin}; use pallet_authorship::EventHandler; use pallet_session::{self as session, SessionManager}; -use sp_std::{cmp, prelude::*}; pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; diff --git a/cumulus/pallets/collator-selection/src/lib.rs b/cumulus/pallets/collator-selection/src/lib.rs index 2fa38436752..17dc1a552c2 100644 --- a/cumulus/pallets/collator-selection/src/lib.rs +++ b/cumulus/pallets/collator-selection/src/lib.rs @@ -81,6 +81,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use core::marker::PhantomData; use frame_support::traits::TypedGet; pub use pallet::*; @@ -101,6 +103,7 @@ const LOG_TARGET: &str = "runtime::collator-selection"; #[frame_support::pallet] pub mod pallet { pub use crate::weights::WeightInfo; + use alloc::vec::Vec; use core::ops::Div; use frame_support::{ dispatch::{DispatchClass, DispatchResultWithPostInfo}, @@ -118,7 +121,6 @@ pub mod pallet { RuntimeDebug, }; use sp_staking::SessionIndex; - use sp_std::vec::Vec; /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); @@ -244,7 +246,7 @@ pub mod pallet { let duplicate_invulnerables = self .invulnerables .iter() - .collect::>(); + .collect::>(); assert!( duplicate_invulnerables.len() == self.invulnerables.len(), "duplicate invulnerables in genesis." diff --git a/cumulus/pallets/collator-selection/src/migration.rs b/cumulus/pallets/collator-selection/src/migration.rs index 425acdd8bfb..c5201694806 100644 --- a/cumulus/pallets/collator-selection/src/migration.rs +++ b/cumulus/pallets/collator-selection/src/migration.rs @@ -17,6 +17,8 @@ //! A module that is responsible for migration of storage for Collator Selection. use super::*; +#[cfg(feature = "try-runtime")] +use alloc::vec::Vec; use frame_support::traits::{OnRuntimeUpgrade, UncheckedOnRuntimeUpgrade}; use log; @@ -29,8 +31,6 @@ pub mod v2 { traits::{Currency, ReservableCurrency}, }; use sp_runtime::traits::{Saturating, Zero}; - #[cfg(feature = "try-runtime")] - use sp_std::vec::Vec; /// [`UncheckedMigrationToV2`] wrapped in a /// [`VersionedMigration`](frame_support::migrations::VersionedMigration), ensuring the @@ -51,7 +51,7 @@ pub mod v2 { >; /// Migrate to V2. - pub struct UncheckedMigrationToV2(sp_std::marker::PhantomData); + pub struct UncheckedMigrationToV2(PhantomData); impl UncheckedOnRuntimeUpgrade for UncheckedMigrationToV2 { fn on_runtime_upgrade() -> Weight { let mut weight = Weight::zero(); @@ -123,10 +123,8 @@ pub mod v2 { pub mod v1 { use super::*; use frame_support::pallet_prelude::*; - #[cfg(feature = "try-runtime")] - use sp_std::prelude::*; - pub struct MigrateToV1(sp_std::marker::PhantomData); + pub struct MigrateToV1(PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { let on_chain_version = Pallet::::on_chain_storage_version(); diff --git a/cumulus/pallets/collator-selection/src/weights.rs b/cumulus/pallets/collator-selection/src/weights.rs index 1c01ad6cd6f..12e6b755e97 100644 --- a/cumulus/pallets/collator-selection/src/weights.rs +++ b/cumulus/pallets/collator-selection/src/weights.rs @@ -18,11 +18,11 @@ #![allow(unused_parens)] #![allow(unused_imports)] +use core::marker::PhantomData; use frame_support::{ traits::Get, weights::{constants::RocksDbWeight, Weight}, }; -use sp_std::marker::PhantomData; // The weight info trait for `pallet_collator_selection`. pub trait WeightInfo { diff --git a/cumulus/pallets/dmp-queue/Cargo.toml b/cumulus/pallets/dmp-queue/Cargo.toml index 052a2547e78..936526290d9 100644 --- a/cumulus/pallets/dmp-queue/Cargo.toml +++ b/cumulus/pallets/dmp-queue/Cargo.toml @@ -21,7 +21,6 @@ scale-info = { features = ["derive"], workspace = true } frame-benchmarking = { optional = true, workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } sp-io = { workspace = true } @@ -48,7 +47,6 @@ std = [ "scale-info/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "xcm/std", ] diff --git a/cumulus/pallets/dmp-queue/src/benchmarking.rs b/cumulus/pallets/dmp-queue/src/benchmarking.rs index 91d1e0eab7e..432d6f3bc7a 100644 --- a/cumulus/pallets/dmp-queue/src/benchmarking.rs +++ b/cumulus/pallets/dmp-queue/src/benchmarking.rs @@ -19,9 +19,9 @@ use crate::*; +use alloc::vec; use frame_benchmarking::v2::*; use frame_support::{pallet_prelude::*, traits::Hooks}; -use sp_std::vec; #[benchmarks] mod benchmarks { diff --git a/cumulus/pallets/dmp-queue/src/lib.rs b/cumulus/pallets/dmp-queue/src/lib.rs index 9b3ec684feb..cedca6f3fb9 100644 --- a/cumulus/pallets/dmp-queue/src/lib.rs +++ b/cumulus/pallets/dmp-queue/src/lib.rs @@ -23,6 +23,8 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(deprecated)] // The pallet itself is deprecated. +extern crate alloc; + use migration::*; pub use pallet::*; diff --git a/cumulus/pallets/dmp-queue/src/migration.rs b/cumulus/pallets/dmp-queue/src/migration.rs index 349635cce54..b1945e8eb37 100644 --- a/cumulus/pallets/dmp-queue/src/migration.rs +++ b/cumulus/pallets/dmp-queue/src/migration.rs @@ -17,9 +17,9 @@ //! Migrates the storage from the previously deleted DMP pallet. use crate::*; +use alloc::vec::Vec; use cumulus_primitives_core::relay_chain::BlockNumber as RelayBlockNumber; use frame_support::{pallet_prelude::*, storage_alias, traits::HandleMessage}; -use sp_std::vec::Vec; pub(crate) const LOG: &str = "runtime::dmp-queue-export-xcms"; diff --git a/cumulus/pallets/parachain-system/proc-macro/src/lib.rs b/cumulus/pallets/parachain-system/proc-macro/src/lib.rs index 8ab5d81efdc..f284fbdc64c 100644 --- a/cumulus/pallets/parachain-system/proc-macro/src/lib.rs +++ b/cumulus/pallets/parachain-system/proc-macro/src/lib.rs @@ -122,8 +122,8 @@ pub fn register_validate_block(input: proc_macro::TokenStream) -> proc_macro::To #[no_mangle] unsafe fn validate_block(arguments: *mut u8, arguments_len: usize) -> u64 { // We convert the `arguments` into a boxed slice and then into `Bytes`. - let args = #crate_::validate_block::sp_std::boxed::Box::from_raw( - #crate_::validate_block::sp_std::slice::from_raw_parts_mut( + let args = #crate_::validate_block::Box::from_raw( + #crate_::validate_block::slice::from_raw_parts_mut( arguments, arguments_len, ) diff --git a/cumulus/pallets/parachain-system/src/consensus_hook.rs b/cumulus/pallets/parachain-system/src/consensus_hook.rs index 91353fc7bbd..3062396a4e7 100644 --- a/cumulus/pallets/parachain-system/src/consensus_hook.rs +++ b/cumulus/pallets/parachain-system/src/consensus_hook.rs @@ -18,8 +18,8 @@ //! of parachain blocks ready to submit to the relay chain, as well as some basic implementations. use super::relay_state_snapshot::RelayChainStateProof; +use core::num::NonZeroU32; use frame_support::weights::Weight; -use sp_std::num::NonZeroU32; /// The possible capacity of the unincluded segment. #[derive(Clone)] @@ -95,7 +95,7 @@ impl ConsensusHook for FixedCapacityUnincludedSegment { fn on_state_proof(_state_proof: &RelayChainStateProof) -> (Weight, UnincludedSegmentCapacity) { ( Weight::zero(), - NonZeroU32::new(sp_std::cmp::max(N, 1)) + NonZeroU32::new(core::cmp::max(N, 1)) .expect("1 is the minimum value and non-zero; qed") .into(), ) diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs index bbb74a1b053..9e0a68d09a1 100644 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ b/cumulus/pallets/parachain-system/src/lib.rs @@ -27,7 +27,11 @@ //! //! Users must ensure that they register this pallet as an inherent provider. +extern crate alloc; + +use alloc::{collections::btree_map::BTreeMap, vec, vec::Vec}; use codec::{Decode, Encode}; +use core::cmp; use cumulus_primitives_core::{ relay_chain, AbridgedHostConfiguration, ChannelInfo, ChannelStatus, CollationInfo, GetChannelInfo, InboundDownwardMessage, InboundHrmpMessage, ListChannelInfos, MessageSendError, @@ -54,7 +58,6 @@ use sp_runtime::{ }, BoundedSlice, FixedU128, RuntimeDebug, Saturating, }; -use sp_std::{cmp, collections::btree_map::BTreeMap, prelude::*}; use xcm::{latest::XcmHash, VersionedLocation, VersionedXcm}; use xcm_builder::InspectMessageQueues; @@ -938,7 +941,7 @@ pub mod pallet { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -1530,7 +1533,7 @@ impl Pallet { } /// Type that implements `SetCode`. -pub struct ParachainSetCode(sp_std::marker::PhantomData); +pub struct ParachainSetCode(core::marker::PhantomData); impl frame_system::SetCode for ParachainSetCode { fn set_code(code: Vec) -> DispatchResult { Pallet::::schedule_code_upgrade(code) @@ -1645,7 +1648,7 @@ pub trait CheckInherents { /// Struct that always returns `Ok` on inherents check, needed for backwards-compatibility. #[doc(hidden)] -pub struct DummyCheckInherents(sp_std::marker::PhantomData); +pub struct DummyCheckInherents(core::marker::PhantomData); #[allow(deprecated)] impl CheckInherents for DummyCheckInherents { @@ -1718,7 +1721,7 @@ pub type RelaychainBlockNumberProvider = RelaychainDataProvider; /// of [`RelayChainState`]. /// - [`current_block_number`](Self::current_block_number): Will return /// [`Pallet::last_relay_block_number()`]. -pub struct RelaychainDataProvider(sp_std::marker::PhantomData); +pub struct RelaychainDataProvider(core::marker::PhantomData); impl BlockNumberProvider for RelaychainDataProvider { type BlockNumber = relay_chain::BlockNumber; diff --git a/cumulus/pallets/parachain-system/src/mock.rs b/cumulus/pallets/parachain-system/src/mock.rs index da904c0079a..7bea72224b8 100644 --- a/cumulus/pallets/parachain-system/src/mock.rs +++ b/cumulus/pallets/parachain-system/src/mock.rs @@ -20,7 +20,9 @@ use super::*; +use alloc::collections::vec_deque::VecDeque; use codec::Encode; +use core::num::NonZeroU32; use cumulus_primitives_core::{ relay_chain::BlockNumber as RelayBlockNumber, AggregateMessageOrigin, InboundDownwardMessage, InboundHrmpMessage, PersistedValidationData, @@ -37,7 +39,6 @@ use frame_support::{ }; use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; use sp_runtime::{traits::BlakeTwo256, BuildStorage}; -use sp_std::{collections::vec_deque::VecDeque, num::NonZeroU32}; use sp_version::RuntimeVersion; use std::cell::RefCell; diff --git a/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs b/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs index 60eccfb072f..323aaf65038 100644 --- a/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs +++ b/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs @@ -16,6 +16,7 @@ //! Relay chain state proof provides means for accessing part of relay chain storage for reads. +use alloc::vec::Vec; use codec::{Decode, Encode}; use cumulus_primitives_core::{ relay_chain, AbridgedHostConfiguration, AbridgedHrmpChannel, ParaId, @@ -23,7 +24,6 @@ use cumulus_primitives_core::{ use scale_info::TypeInfo; use sp_runtime::traits::HashingFor; use sp_state_machine::{Backend, TrieBackend, TrieBackendBuilder}; -use sp_std::vec::Vec; use sp_trie::{HashDBT, MemoryDB, StorageProof, EMPTY_PREFIX}; /// The capacity of the upward message queue of a parachain on the relay chain. diff --git a/cumulus/pallets/parachain-system/src/tests.rs b/cumulus/pallets/parachain-system/src/tests.rs index 5ff15036fb6..51c6e83c113 100755 --- a/cumulus/pallets/parachain-system/src/tests.rs +++ b/cumulus/pallets/parachain-system/src/tests.rs @@ -19,6 +19,7 @@ use super::*; use crate::mock::*; +use core::num::NonZeroU32; use cumulus_primitives_core::{AbridgedHrmpChannel, InboundDownwardMessage, InboundHrmpMessage}; use frame_support::{assert_ok, parameter_types, weights::Weight}; use frame_system::RawOrigin; @@ -26,7 +27,6 @@ use hex_literal::hex; use rand::Rng; use relay_chain::HrmpChannelId; use sp_core::H256; -use sp_std::num::NonZeroU32; #[test] #[should_panic] diff --git a/cumulus/pallets/parachain-system/src/unincluded_segment.rs b/cumulus/pallets/parachain-system/src/unincluded_segment.rs index 1e83a945c4e..814bb83aa1a 100644 --- a/cumulus/pallets/parachain-system/src/unincluded_segment.rs +++ b/cumulus/pallets/parachain-system/src/unincluded_segment.rs @@ -21,11 +21,12 @@ //! sent to relay chain. use super::relay_state_snapshot::{MessagingStateSnapshot, RelayDispatchQueueRemainingCapacity}; +use alloc::collections::btree_map::BTreeMap; use codec::{Decode, Encode}; +use core::marker::PhantomData; use cumulus_primitives_core::{relay_chain, ParaId}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; -use sp_std::{collections::btree_map::BTreeMap, marker::PhantomData}; /// Constraints on outbound HRMP channel. #[derive(Clone, RuntimeDebug)] @@ -398,6 +399,7 @@ pub(crate) fn size_after_included(included_hash: H, segment: &[Anc #[cfg(test)] mod tests { use super::*; + use alloc::{vec, vec::Vec}; use assert_matches::assert_matches; #[test] diff --git a/cumulus/pallets/parachain-system/src/validate_block/implementation.rs b/cumulus/pallets/parachain-system/src/validate_block/implementation.rs index 956962fce15..42311ca9d83 100644 --- a/cumulus/pallets/parachain-system/src/validate_block/implementation.rs +++ b/cumulus/pallets/parachain-system/src/validate_block/implementation.rs @@ -26,6 +26,7 @@ use polkadot_parachain_primitives::primitives::{ HeadData, RelayChainBlockNumber, ValidationResult, }; +use alloc::vec::Vec; use codec::Encode; use frame_support::traits::{ExecuteBlock, ExtrinsicCall, Get, IsSubType}; @@ -33,7 +34,6 @@ use sp_core::storage::{ChildInfo, StateVersion}; use sp_externalities::{set_and_run_with_externalities, Externalities}; use sp_io::KillStorageResult; use sp_runtime::traits::{Block as BlockT, Extrinsic, HashingFor, Header as HeaderT}; -use sp_std::prelude::*; use sp_trie::{MemoryDB, ProofSizeProvider}; use trie_recorder::SizeOnlyRecorderProvider; @@ -124,7 +124,7 @@ where Err(_) => panic!("Compact proof decoding failure."), }; - sp_std::mem::drop(storage_proof); + core::mem::drop(storage_proof); let mut recorder = SizeOnlyRecorderProvider::new(); let cache_provider = trie_cache::CacheProvider::new(); @@ -294,7 +294,7 @@ fn host_storage_read(key: &[u8], value_out: &mut [u8], value_offset: u32) -> Opt Some(value) => { let value_offset = value_offset as usize; let data = &value[value_offset.min(value.len())..]; - let written = sp_std::cmp::min(data.len(), value_out.len()); + let written = core::cmp::min(data.len(), value_out.len()); value_out[..written].copy_from_slice(&data[..written]); Some(value.len() as u32) }, @@ -368,7 +368,7 @@ fn host_default_child_storage_read( Some(value) => { let value_offset = value_offset as usize; let data = &value[value_offset.min(value.len())..]; - let written = sp_std::cmp::min(data.len(), value_out.len()); + let written = core::cmp::min(data.len(), value_out.len()); value_out[..written].copy_from_slice(&data[..written]); Some(value.len() as u32) }, diff --git a/cumulus/pallets/parachain-system/src/validate_block/mod.rs b/cumulus/pallets/parachain-system/src/validate_block/mod.rs index 763a4cffd77..3a00d4d352a 100644 --- a/cumulus/pallets/parachain-system/src/validate_block/mod.rs +++ b/cumulus/pallets/parachain-system/src/validate_block/mod.rs @@ -30,6 +30,9 @@ mod trie_cache; #[doc(hidden)] mod trie_recorder; +#[cfg(not(feature = "std"))] +#[doc(hidden)] +pub use alloc::{boxed::Box, slice}; #[cfg(not(feature = "std"))] #[doc(hidden)] pub use bytes; diff --git a/cumulus/pallets/parachain-system/src/validate_block/trie_cache.rs b/cumulus/pallets/parachain-system/src/validate_block/trie_cache.rs index 5d785910fbe..5999b3ce87f 100644 --- a/cumulus/pallets/parachain-system/src/validate_block/trie_cache.rs +++ b/cumulus/pallets/parachain-system/src/validate_block/trie_cache.rs @@ -15,12 +15,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -use sp_state_machine::TrieCacheProvider; -use sp_std::{ +use alloc::{ boxed::Box, - cell::{RefCell, RefMut}, collections::btree_map::{BTreeMap, Entry}, }; +use core::cell::{RefCell, RefMut}; +use sp_state_machine::TrieCacheProvider; use sp_trie::NodeCodec; use trie_db::{node::NodeOwned, Hasher}; diff --git a/cumulus/pallets/parachain-system/src/validate_block/trie_recorder.rs b/cumulus/pallets/parachain-system/src/validate_block/trie_recorder.rs index 48310670c07..19801340719 100644 --- a/cumulus/pallets/parachain-system/src/validate_block/trie_recorder.rs +++ b/cumulus/pallets/parachain-system/src/validate_block/trie_recorder.rs @@ -22,11 +22,11 @@ use codec::Encode; -use sp_std::{ - cell::{RefCell, RefMut}, +use alloc::{ collections::{btree_map::BTreeMap, btree_set::BTreeSet}, rc::Rc, }; +use core::cell::{RefCell, RefMut}; use sp_trie::{NodeCodec, ProofSizeProvider, StorageProof}; use trie_db::{Hasher, RecordedForKey, TrieAccess}; diff --git a/cumulus/pallets/parachain-system/src/weights.rs b/cumulus/pallets/parachain-system/src/weights.rs index da7f64237e9..5c61879b4d3 100644 --- a/cumulus/pallets/parachain-system/src/weights.rs +++ b/cumulus/pallets/parachain-system/src/weights.rs @@ -50,7 +50,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions needed for cumulus_pallet_parachain_system. pub trait WeightInfo { diff --git a/cumulus/pallets/session-benchmarking/Cargo.toml b/cumulus/pallets/session-benchmarking/Cargo.toml index df671566cdc..e182ac45ede 100644 --- a/cumulus/pallets/session-benchmarking/Cargo.toml +++ b/cumulus/pallets/session-benchmarking/Cargo.toml @@ -17,7 +17,6 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } @@ -39,5 +38,4 @@ std = [ "frame-system/std", "pallet-session/std", "sp-runtime/std", - "sp-std/std", ] diff --git a/cumulus/pallets/session-benchmarking/src/inner.rs b/cumulus/pallets/session-benchmarking/src/inner.rs index 36411d3d71a..8d595430487 100644 --- a/cumulus/pallets/session-benchmarking/src/inner.rs +++ b/cumulus/pallets/session-benchmarking/src/inner.rs @@ -15,7 +15,7 @@ //! Benchmarking setup for pallet-session. -use sp_std::{prelude::*, vec}; +use alloc::{vec, vec::Vec}; use codec::Decode; use frame_benchmarking::{benchmarks, whitelisted_caller}; diff --git a/cumulus/pallets/session-benchmarking/src/lib.rs b/cumulus/pallets/session-benchmarking/src/lib.rs index a95d6fb7d59..f5bfef00616 100644 --- a/cumulus/pallets/session-benchmarking/src/lib.rs +++ b/cumulus/pallets/session-benchmarking/src/lib.rs @@ -20,6 +20,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "runtime-benchmarks")] pub mod inner; diff --git a/cumulus/pallets/solo-to-para/Cargo.toml b/cumulus/pallets/solo-to-para/Cargo.toml index ced1b24f1d2..5fd1939e93a 100644 --- a/cumulus/pallets/solo-to-para/Cargo.toml +++ b/cumulus/pallets/solo-to-para/Cargo.toml @@ -18,7 +18,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } pallet-sudo = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } # Polkadot polkadot-primitives = { workspace = true } @@ -37,7 +36,6 @@ std = [ "polkadot-primitives/std", "scale-info/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "cumulus-pallet-parachain-system/try-runtime", diff --git a/cumulus/pallets/solo-to-para/src/lib.rs b/cumulus/pallets/solo-to-para/src/lib.rs index da948615d4e..b42cc74f1cf 100644 --- a/cumulus/pallets/solo-to-para/src/lib.rs +++ b/cumulus/pallets/solo-to-para/src/lib.rs @@ -16,12 +16,14 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use cumulus_pallet_parachain_system as parachain_system; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; pub use pallet::*; use polkadot_primitives::PersistedValidationData; -use sp_std::vec::Vec; #[frame_support::pallet] pub mod pallet { diff --git a/cumulus/pallets/xcm/Cargo.toml b/cumulus/pallets/xcm/Cargo.toml index 1f0cef70e3a..35d7a083b06 100644 --- a/cumulus/pallets/xcm/Cargo.toml +++ b/cumulus/pallets/xcm/Cargo.toml @@ -13,7 +13,6 @@ workspace = true codec = { features = ["derive"], workspace = true } scale-info = { features = ["derive"], workspace = true } -sp-std = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } frame-support = { workspace = true } @@ -33,7 +32,6 @@ std = [ "scale-info/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "xcm/std", ] try-runtime = [ diff --git a/cumulus/pallets/xcm/src/lib.rs b/cumulus/pallets/xcm/src/lib.rs index 90a0ec76def..e31df8471c2 100644 --- a/cumulus/pallets/xcm/src/lib.rs +++ b/cumulus/pallets/xcm/src/lib.rs @@ -25,7 +25,6 @@ use cumulus_primitives_core::ParaId; pub use pallet::*; use scale_info::TypeInfo; use sp_runtime::{traits::BadOrigin, RuntimeDebug}; -use sp_std::prelude::*; use xcm::latest::{ExecuteXcm, Outcome}; #[frame_support::pallet] diff --git a/cumulus/pallets/xcmp-queue/Cargo.toml b/cumulus/pallets/xcmp-queue/Cargo.toml index c542fa373b5..9c7470eda6d 100644 --- a/cumulus/pallets/xcmp-queue/Cargo.toml +++ b/cumulus/pallets/xcmp-queue/Cargo.toml @@ -20,7 +20,6 @@ frame-system = { workspace = true } sp-io = { workspace = true } sp-core = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } pallet-message-queue = { workspace = true } # Polkadot @@ -68,7 +67,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "xcm-builder/std", "xcm-executor/std", "xcm/std", diff --git a/cumulus/pallets/xcmp-queue/src/benchmarking.rs b/cumulus/pallets/xcmp-queue/src/benchmarking.rs index 49e2cc83673..9cb1301addf 100644 --- a/cumulus/pallets/xcmp-queue/src/benchmarking.rs +++ b/cumulus/pallets/xcmp-queue/src/benchmarking.rs @@ -17,6 +17,7 @@ use crate::*; +use alloc::vec; use codec::DecodeAll; use frame_benchmarking::v2::*; use frame_support::traits::Hooks; diff --git a/cumulus/pallets/xcmp-queue/src/bridging.rs b/cumulus/pallets/xcmp-queue/src/bridging.rs index 9db4b6e74c3..eff4a37b0ce 100644 --- a/cumulus/pallets/xcmp-queue/src/bridging.rs +++ b/cumulus/pallets/xcmp-queue/src/bridging.rs @@ -21,7 +21,7 @@ use frame_support::pallet_prelude::Get; /// both `OutboundXcmpStatus` and `InboundXcmpStatus` for defined `ParaId` if any of those is /// suspended. pub struct InAndOutXcmpChannelStatusProvider( - sp_std::marker::PhantomData<(SiblingBridgeHubParaId, Runtime)>, + core::marker::PhantomData<(SiblingBridgeHubParaId, Runtime)>, ); impl, Runtime: crate::Config> bp_xcm_bridge_hub_router::XcmChannelStatusProvider @@ -45,7 +45,7 @@ impl, Runtime: crate::Config> /// Adapter implementation for `bp_xcm_bridge_hub_router::XcmChannelStatusProvider` which checks /// only `OutboundXcmpStatus` for defined `SiblingParaId` if is suspended. pub struct OutXcmpChannelStatusProvider( - sp_std::marker::PhantomData<(SiblingBridgeHubParaId, Runtime)>, + core::marker::PhantomData<(SiblingBridgeHubParaId, Runtime)>, ); impl, Runtime: crate::Config> bp_xcm_bridge_hub_router::XcmChannelStatusProvider diff --git a/cumulus/pallets/xcmp-queue/src/lib.rs b/cumulus/pallets/xcmp-queue/src/lib.rs index 45126a9425d..8c4446a925d 100644 --- a/cumulus/pallets/xcmp-queue/src/lib.rs +++ b/cumulus/pallets/xcmp-queue/src/lib.rs @@ -50,6 +50,9 @@ pub mod bridging; pub mod weights; pub use weights::WeightInfo; +extern crate alloc; + +use alloc::vec::Vec; use bounded_collections::BoundedBTreeSet; use codec::{Decode, DecodeLimit, Encode, MaxEncodedLen}; use cumulus_primitives_core::{ @@ -69,7 +72,6 @@ use polkadot_runtime_parachains::FeeTracker; use scale_info::TypeInfo; use sp_core::MAX_POSSIBLE_ALLOCATION; use sp_runtime::{FixedU128, RuntimeDebug, Saturating, WeakBoundedVec}; -use sp_std::prelude::*; use xcm::{latest::prelude::*, VersionedLocation, VersionedXcm, WrapVersion, MAX_XCM_DECODE_DEPTH}; use xcm_builder::InspectMessageQueues; use xcm_executor::traits::ConvertOrigin; diff --git a/cumulus/pallets/xcmp-queue/src/migration.rs b/cumulus/pallets/xcmp-queue/src/migration.rs index b64982a8930..d0657aaea9f 100644 --- a/cumulus/pallets/xcmp-queue/src/migration.rs +++ b/cumulus/pallets/xcmp-queue/src/migration.rs @@ -19,6 +19,7 @@ pub mod v5; use crate::{Config, OverweightIndex, Pallet, QueueConfig, QueueConfigData, DEFAULT_POV_SIZE}; +use alloc::vec::Vec; use cumulus_primitives_core::XcmpMessageFormat; use frame_support::{ pallet_prelude::*, diff --git a/cumulus/pallets/xcmp-queue/src/migration/v5.rs b/cumulus/pallets/xcmp-queue/src/migration/v5.rs index 247adab7108..818365f36f6 100644 --- a/cumulus/pallets/xcmp-queue/src/migration/v5.rs +++ b/cumulus/pallets/xcmp-queue/src/migration/v5.rs @@ -17,6 +17,7 @@ //! Migrates the storage to version 5. use crate::*; +use alloc::vec::Vec; use cumulus_primitives_core::ListChannelInfos; use frame_support::{pallet_prelude::*, traits::UncheckedOnRuntimeUpgrade}; diff --git a/cumulus/parachains/common/Cargo.toml b/cumulus/parachains/common/Cargo.toml index 6eac9a09672..6d436bdf799 100644 --- a/cumulus/parachains/common/Cargo.toml +++ b/cumulus/parachains/common/Cargo.toml @@ -29,7 +29,6 @@ sp-consensus-aura = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } # Polkadot pallet-xcm = { workspace = true } @@ -73,7 +72,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "xcm-executor/std", "xcm/std", ] diff --git a/cumulus/parachains/common/src/impls.rs b/cumulus/parachains/common/src/impls.rs index 16cda1a4ed8..42ea50c75a8 100644 --- a/cumulus/parachains/common/src/impls.rs +++ b/cumulus/parachains/common/src/impls.rs @@ -16,6 +16,8 @@ //! Auxiliary struct/enums for parachain runtimes. //! Taken from polkadot/runtime/common (at a21cd64) and adapted for parachains. +use alloc::boxed::Box; +use core::marker::PhantomData; use frame_support::traits::{ fungible, fungibles, tokens::imbalance::ResolveTo, Contains, ContainsPair, Currency, Defensive, Get, Imbalance, OnUnbalanced, OriginTrait, @@ -23,7 +25,6 @@ use frame_support::traits::{ use pallet_asset_tx_payment::HandleCredit; use pallet_collator_selection::StakingPotAccountId; use sp_runtime::traits::Zero; -use sp_std::{marker::PhantomData, prelude::*}; use xcm::latest::{ Asset, AssetId, Fungibility, Fungibility::Fungible, Junction, Junctions::Here, Location, Parent, WeightLimit, diff --git a/cumulus/parachains/common/src/lib.rs b/cumulus/parachains/common/src/lib.rs index b01d623d2b9..3cffb69daac 100644 --- a/cumulus/parachains/common/src/lib.rs +++ b/cumulus/parachains/common/src/lib.rs @@ -15,6 +15,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub mod impls; pub mod message_queue; pub mod xcm_config; diff --git a/cumulus/parachains/common/src/message_queue.rs b/cumulus/parachains/common/src/message_queue.rs index 0c9f4b840c9..511d6243cb8 100644 --- a/cumulus/parachains/common/src/message_queue.rs +++ b/cumulus/parachains/common/src/message_queue.rs @@ -16,10 +16,10 @@ //! Helpers to deal with configuring the message queue in the runtime. +use core::marker::PhantomData; use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::traits::{QueueFootprint, QueuePausedQuery}; use pallet_message_queue::OnQueueChanged; -use sp_std::marker::PhantomData; /// Narrow the scope of the `Inner` query from `AggregateMessageOrigin` to `ParaId`. /// diff --git a/cumulus/parachains/common/src/xcm_config.rs b/cumulus/parachains/common/src/xcm_config.rs index a9756af7aed..7c58a2b2405 100644 --- a/cumulus/parachains/common/src/xcm_config.rs +++ b/cumulus/parachains/common/src/xcm_config.rs @@ -14,13 +14,13 @@ // limitations under the License. use crate::impls::AccountIdOf; +use core::marker::PhantomData; use cumulus_primitives_core::{IsSystem, ParaId}; use frame_support::{ traits::{fungibles::Inspect, tokens::ConversionToAssetBalance, Contains, ContainsPair}, weights::Weight, }; use sp_runtime::traits::Get; -use sp_std::marker::PhantomData; use xcm::latest::prelude::*; /// A `ChargeFeeInFungibles` implementation that converts the output of diff --git a/cumulus/parachains/pallets/collective-content/Cargo.toml b/cumulus/parachains/pallets/collective-content/Cargo.toml index 61cbe785009..c52021f67e3 100644 --- a/cumulus/parachains/pallets/collective-content/Cargo.toml +++ b/cumulus/parachains/pallets/collective-content/Cargo.toml @@ -19,7 +19,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-io = { workspace = true } @@ -48,5 +47,4 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] diff --git a/cumulus/parachains/pallets/collective-content/src/lib.rs b/cumulus/parachains/pallets/collective-content/src/lib.rs index b1c960ad6a0..7ea3c2d79fa 100644 --- a/cumulus/parachains/pallets/collective-content/src/lib.rs +++ b/cumulus/parachains/pallets/collective-content/src/lib.rs @@ -46,7 +46,6 @@ pub use weights::WeightInfo; use frame_support::{traits::schedule::DispatchTime, BoundedVec}; use sp_core::ConstU32; -use sp_std::prelude::*; /// IPFS compatible CID. // Worst case 2 bytes base and codec, 2 bytes hash type and size, 64 bytes hash digest. diff --git a/cumulus/parachains/pallets/parachain-info/Cargo.toml b/cumulus/parachains/pallets/parachain-info/Cargo.toml index 7369c3a2c15..e0bed23c4f8 100644 --- a/cumulus/parachains/pallets/parachain-info/Cargo.toml +++ b/cumulus/parachains/pallets/parachain-info/Cargo.toml @@ -17,7 +17,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } cumulus-primitives-core = { workspace = true } @@ -30,7 +29,6 @@ std = [ "frame-system/std", "scale-info/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/cumulus/parachains/pallets/parachain-info/src/lib.rs b/cumulus/parachains/pallets/parachain-info/src/lib.rs index a4ef448a6b6..0aaa7adaa51 100644 --- a/cumulus/parachains/pallets/parachain-info/src/lib.rs +++ b/cumulus/parachains/pallets/parachain-info/src/lib.rs @@ -41,7 +41,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, pub parachain_id: ParaId, } diff --git a/cumulus/parachains/pallets/ping/Cargo.toml b/cumulus/parachains/pallets/ping/Cargo.toml index f74328207b8..51fc384a4f1 100644 --- a/cumulus/parachains/pallets/ping/Cargo.toml +++ b/cumulus/parachains/pallets/ping/Cargo.toml @@ -13,7 +13,6 @@ workspace = true codec = { features = ["derive"], workspace = true } scale-info = { features = ["derive"], workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } @@ -33,7 +32,6 @@ std = [ "frame-system/std", "scale-info/std", "sp-runtime/std", - "sp-std/std", "xcm/std", ] diff --git a/cumulus/parachains/pallets/ping/src/lib.rs b/cumulus/parachains/pallets/ping/src/lib.rs index a738c05e036..729494cbd25 100644 --- a/cumulus/parachains/pallets/ping/src/lib.rs +++ b/cumulus/parachains/pallets/ping/src/lib.rs @@ -18,12 +18,14 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{vec, vec::Vec}; use cumulus_pallet_xcm::{ensure_sibling_para, Origin as CumulusOrigin}; use cumulus_primitives_core::ParaId; use frame_support::{parameter_types, BoundedVec}; use frame_system::Config as SystemConfig; use sp_runtime::traits::Saturating; -use sp_std::prelude::*; use xcm::latest::prelude::*; pub use pallet::*; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml index 9ef0aa0072c..98df41090a4 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml @@ -53,7 +53,6 @@ sp-genesis-builder = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -241,7 +240,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index e8772c0b483..f09647854cd 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -27,6 +27,9 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); mod weights; pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use assets_common::{ foreign_creators::ForeignCreators, local_and_foreign_assets::{LocalFromLeft, TargetFromLeft}, @@ -45,7 +48,6 @@ use sp_runtime::{ }; use testnet_parachains_constants::rococo::snowbridge::EthereumNetwork; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -1161,7 +1163,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -1445,7 +1447,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } @@ -1515,7 +1517,7 @@ impl_runtime_apis! { } fn set_up_complex_asset_transfer( - ) -> Option<(XcmAssets, u32, Location, Box)> { + ) -> Option<(XcmAssets, u32, Location, alloc::boxed::Box)> { // Transfer to Relay some local AH asset (local-reserve-transfer) while paying // fees using teleported native token. // (We don't care that Relay doesn't accept incoming unknown AH local asset) @@ -1550,7 +1552,7 @@ impl_runtime_apis! { let fee_index = if assets.get(0).unwrap().eq(&fee_asset) { 0 } else { 1 }; // verify transferred successfully - let verify = Box::new(move || { + let verify = alloc::boxed::Box::new(move || { // verify native balance after transfer, decreased by transferred fee amount // (plus transport fees) assert!(Balances::free_balance(&who) <= balance - fee_amount); @@ -1584,7 +1586,7 @@ impl_runtime_apis! { let bridged_asset_hub = xcm_config::bridging::to_westend::AssetHubWestend::get(); let _ = PolkadotXcm::force_xcm_version( RuntimeOrigin::root(), - Box::new(bridged_asset_hub.clone()), + alloc::boxed::Box::new(bridged_asset_hub.clone()), XCM_VERSION, ).map_err(|e| { log::error!( diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/cumulus_pallet_parachain_system.rs index c1e5c6a7429..fc63a0814d0 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/cumulus_pallet_parachain_system.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/cumulus_pallet_parachain_system.rs @@ -47,7 +47,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_parachain_system`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_message_queue.rs index 45531ccfa79..cd72703104a 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_message_queue.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_message_queue.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_message_queue`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/mod.rs index 8e675ad0cf8..8c52ecd9f1b 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/mod.rs @@ -18,10 +18,10 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use alloc::vec::Vec; use frame_support::weights::Weight; use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; trait WeighAssets { diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 7fab3584250..03d3785dccb 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::fungible`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 4454494badc..bee6bcdf21c 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::generic`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index 03de2c971b7..c736d3ee442 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -511,8 +511,8 @@ impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { /// All configuration related to bridging pub mod bridging { use super::*; + use alloc::collections::btree_set::BTreeSet; use assets_common::matching; - use sp_std::collections::btree_set::BTreeSet; // common/shared parameters parameter_types! { @@ -541,13 +541,13 @@ pub mod bridging { /// (`AssetId` has to be aligned with `BridgeTable`) pub XcmBridgeHubRouterFeeAssetId: AssetId = TokenLocation::get().into(); - pub BridgeTable: sp_std::vec::Vec = - sp_std::vec::Vec::new().into_iter() + pub BridgeTable: alloc::vec::Vec = + alloc::vec::Vec::new().into_iter() .chain(to_westend::BridgeTable::get()) .collect(); - pub EthereumBridgeTable: sp_std::vec::Vec = - sp_std::vec::Vec::new().into_iter() + pub EthereumBridgeTable: alloc::vec::Vec = + alloc::vec::Vec::new().into_iter() .chain(to_ethereum::BridgeTable::get()) .collect(); } @@ -578,10 +578,10 @@ pub mod bridging { /// Set up exporters configuration. /// `Option` represents static "base fee" which is used for total delivery fee calculation. - pub BridgeTable: sp_std::vec::Vec = sp_std::vec![ + pub BridgeTable: alloc::vec::Vec = alloc::vec![ NetworkExportTableItem::new( WestendNetwork::get(), - Some(sp_std::vec![ + Some(alloc::vec![ AssetHubWestend::get().interior.split_global().expect("invalid configuration for AssetHubWestend").1, ]), SiblingBridgeHub::get(), @@ -595,7 +595,7 @@ pub mod bridging { /// Universal aliases pub UniversalAliases: BTreeSet<(Location, Junction)> = BTreeSet::from_iter( - sp_std::vec![ + alloc::vec![ (SiblingBridgeHubWithBridgeHubWestendInstance::get(), GlobalConsensus(WestendNetwork::get())) ] ); @@ -643,10 +643,10 @@ pub mod bridging { /// Set up exporters configuration. /// `Option` represents static "base fee" which is used for total delivery fee calculation. - pub BridgeTable: sp_std::vec::Vec = sp_std::vec![ + pub BridgeTable: alloc::vec::Vec = alloc::vec![ NetworkExportTableItem::new( EthereumNetwork::get(), - Some(sp_std::vec![Junctions::Here]), + Some(alloc::vec![Junctions::Here]), SiblingBridgeHub::get(), Some(( XcmBridgeHubRouterFeeAssetId::get(), @@ -657,7 +657,7 @@ pub mod bridging { /// Universal aliases pub UniversalAliases: BTreeSet<(Location, Junction)> = BTreeSet::from_iter( - sp_std::vec![ + alloc::vec![ (SiblingBridgeHubWithEthereumInboundQueueInstance::get(), GlobalConsensus(EthereumNetwork::get())), ] ); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs index f670c5f424e..ee1461b7f9c 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs @@ -34,6 +34,7 @@ use asset_test_utils::{ ExtBuilder, SlotDurations, }; use codec::{Decode, Encode}; +use core::ops::Mul; use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ assert_noop, assert_ok, @@ -48,7 +49,6 @@ use frame_support::{ use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; use sp_consensus_aura::SlotDuration; use sp_runtime::traits::MaybeEquivalence; -use sp_std::ops::Mul; use std::convert::Into; use testnet_parachains_constants::rococo::{consensus::*, currency::UNITS, fee::WeightToFee}; use xcm::latest::prelude::{Assets as XcmAssets, *}; @@ -1277,7 +1277,7 @@ mod asset_hub_rococo_tests { collator_session_keys(), bridging_to_asset_hub_westend, || { - sp_std::vec![ + vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, Transact { origin_kind: OriginKind::Xcm, @@ -1287,16 +1287,16 @@ mod asset_hub_rococo_tests { bp_asset_hub_rococo::XcmBridgeHubRouterCall::report_bridge_status { bridge_id: Default::default(), is_congested: true, - } + }, ) .encode() .into(), - } + }, ] .into() }, || { - sp_std::vec![ + vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, Transact { origin_kind: OriginKind::Xcm, @@ -1306,11 +1306,11 @@ mod asset_hub_rococo_tests { bp_asset_hub_rococo::XcmBridgeHubRouterCall::report_bridge_status { bridge_id: Default::default(), is_congested: false, - } + }, ) .encode() .into(), - } + }, ] .into() }, diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index 7e618d950b1..6b1bf769ace 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -53,7 +53,6 @@ sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -240,7 +239,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 55c8a9f0b26..178b886fc3e 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -27,6 +27,9 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); mod weights; pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use assets_common::{ local_and_foreign_assets::{LocalFromLeft, TargetFromLeft}, AssetIdForTrustBackedAssetsConvert, @@ -68,7 +71,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, Perbill, Permill, RuntimeDebug, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -1206,7 +1208,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -1536,7 +1538,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } @@ -1601,7 +1603,7 @@ impl_runtime_apis! { } fn set_up_complex_asset_transfer( - ) -> Option<(XcmAssets, u32, Location, Box)> { + ) -> Option<(XcmAssets, u32, Location, alloc::boxed::Box)> { // Transfer to Relay some local AH asset (local-reserve-transfer) while paying // fees using teleported native token. // (We don't care that Relay doesn't accept incoming unknown AH local asset) @@ -1636,7 +1638,7 @@ impl_runtime_apis! { let fee_index = if assets.get(0).unwrap().eq(&fee_asset) { 0 } else { 1 }; // verify transferred successfully - let verify = Box::new(move || { + let verify = alloc::boxed::Box::new(move || { // verify native balance after transfer, decreased by transferred fee amount // (plus transport fees) assert!(Balances::free_balance(&who) <= balance - fee_amount); @@ -1675,7 +1677,7 @@ impl_runtime_apis! { let bridged_asset_hub = xcm_config::bridging::to_rococo::AssetHubRococo::get(); let _ = PolkadotXcm::force_xcm_version( RuntimeOrigin::root(), - Box::new(bridged_asset_hub.clone()), + alloc::boxed::Box::new(bridged_asset_hub.clone()), XCM_VERSION, ).map_err(|e| { log::error!( diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_parachain_system.rs index c1e5c6a7429..fc63a0814d0 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_parachain_system.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_parachain_system.rs @@ -47,7 +47,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_parachain_system`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_message_queue.rs index 45531ccfa79..cd72703104a 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_message_queue.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_message_queue.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_message_queue`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs index 8c77774da2d..d39052c5c03 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs @@ -17,10 +17,10 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use alloc::vec::Vec; use frame_support::weights::Weight; use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; trait WeighAssets { diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index eaf07aac52c..fe8d1861392 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -42,7 +42,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::fungible`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index fc196abea0f..127bc173c10 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -42,7 +42,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::generic`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index fc2e68c599f..2deeb73eb12 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -519,8 +519,8 @@ impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { /// All configuration related to bridging pub mod bridging { use super::*; + use alloc::collections::btree_set::BTreeSet; use assets_common::matching; - use sp_std::collections::btree_set::BTreeSet; parameter_types! { /// Base price of every byte of the Westend -> Rococo message. Can be adjusted via @@ -548,8 +548,8 @@ pub mod bridging { /// (`AssetId` has to be aligned with `BridgeTable`) pub XcmBridgeHubRouterFeeAssetId: AssetId = WestendLocation::get().into(); - pub BridgeTable: sp_std::vec::Vec = - sp_std::vec::Vec::new().into_iter() + pub BridgeTable: alloc::vec::Vec = + alloc::vec::Vec::new().into_iter() .chain(to_rococo::BridgeTable::get()) .collect(); } @@ -580,10 +580,10 @@ pub mod bridging { /// Set up exporters configuration. /// `Option` represents static "base fee" which is used for total delivery fee calculation. - pub BridgeTable: sp_std::vec::Vec = sp_std::vec![ + pub BridgeTable: alloc::vec::Vec = alloc::vec![ NetworkExportTableItem::new( RococoNetwork::get(), - Some(sp_std::vec![ + Some(alloc::vec![ AssetHubRococo::get().interior.split_global().expect("invalid configuration for AssetHubRococo").1, ]), SiblingBridgeHub::get(), @@ -597,7 +597,7 @@ pub mod bridging { /// Universal aliases pub UniversalAliases: BTreeSet<(Location, Junction)> = BTreeSet::from_iter( - sp_std::vec![ + alloc::vec![ (SiblingBridgeHubWithBridgeHubRococoInstance::get(), GlobalConsensus(RococoNetwork::get())) ] ); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index b5957dd5df9..48e6c11d268 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -1258,7 +1258,7 @@ fn report_bridge_status_from_xcm_bridge_router_for_rococo_works() { collator_session_keys(), bridging_to_asset_hub_rococo, || { - sp_std::vec![ + vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, Transact { origin_kind: OriginKind::Xcm, @@ -1268,16 +1268,16 @@ fn report_bridge_status_from_xcm_bridge_router_for_rococo_works() { bp_asset_hub_westend::XcmBridgeHubRouterCall::report_bridge_status { bridge_id: Default::default(), is_congested: true, - } + }, ) .encode() .into(), - } + }, ] .into() }, || { - sp_std::vec![ + vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, Transact { origin_kind: OriginKind::Xcm, @@ -1287,11 +1287,11 @@ fn report_bridge_status_from_xcm_bridge_router_for_rococo_works() { bp_asset_hub_westend::XcmBridgeHubRouterCall::report_bridge_status { bridge_id: Default::default(), is_congested: false, - } + }, ) .encode() .into(), - } + }, ] .into() }, diff --git a/cumulus/parachains/runtimes/assets/common/Cargo.toml b/cumulus/parachains/runtimes/assets/common/Cargo.toml index 94612506f51..c6740269339 100644 --- a/cumulus/parachains/runtimes/assets/common/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/common/Cargo.toml @@ -18,7 +18,6 @@ impl-trait-for-tuples = { workspace = true } # Substrate frame-support = { workspace = true } sp-api = { workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } pallet-asset-conversion = { workspace = true } @@ -48,7 +47,6 @@ std = [ "scale-info/std", "sp-api/std", "sp-runtime/std", - "sp-std/std", "xcm-builder/std", "xcm-executor/std", "xcm/std", diff --git a/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs b/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs index 44bda1eb370..d59fddc4e8f 100644 --- a/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs +++ b/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs @@ -13,9 +13,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +use core::marker::PhantomData; use cumulus_primitives_core::ParaId; use sp_runtime::traits::Get; -use sp_std::marker::PhantomData; use xcm::latest::prelude::*; /// Creates asset pairs for liquidity pools with `Target` always being the first asset. diff --git a/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs b/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs index a9fd79bf939..95edb31da06 100644 --- a/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs +++ b/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs @@ -23,7 +23,7 @@ use xcm_executor::traits::ConvertLocation; /// `EnsureOriginWithArg` impl for `CreateOrigin` that allows only XCM origins that are locations /// containing the class location. pub struct ForeignCreators( - sp_std::marker::PhantomData<(IsForeign, AccountOf, AccountId, L)>, + core::marker::PhantomData<(IsForeign, AccountOf, AccountId, L)>, ); impl< IsForeign: ContainsPair, @@ -41,7 +41,7 @@ where fn try_origin( origin: RuntimeOrigin, asset_location: &L, - ) -> sp_std::result::Result { + ) -> core::result::Result { let origin_location = EnsureXcm::::try_origin(origin.clone())?; if !IsForeign::contains(asset_location, &origin_location) { return Err(origin) diff --git a/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs b/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs index e21203485a7..27ee2d6b565 100644 --- a/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs +++ b/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs @@ -16,9 +16,10 @@ //! Runtime API definition for assets. use crate::runtime_api::FungiblesAccessError; +use alloc::vec::Vec; +use core::borrow::Borrow; use frame_support::traits::Contains; use sp_runtime::traits::MaybeEquivalence; -use sp_std::{borrow::Borrow, vec::Vec}; use xcm::latest::{Asset, Location}; use xcm_builder::{ConvertedConcreteId, MatchedConvertedConcreteId}; use xcm_executor::traits::MatchesFungibles; diff --git a/cumulus/parachains/runtimes/assets/common/src/lib.rs b/cumulus/parachains/runtimes/assets/common/src/lib.rs index 431b5766147..4bb593f9892 100644 --- a/cumulus/parachains/runtimes/assets/common/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/common/src/lib.rs @@ -23,6 +23,8 @@ pub mod local_and_foreign_assets; pub mod matching; pub mod runtime_api; +extern crate alloc; + use crate::matching::{LocalLocationPattern, ParentLocation}; use frame_support::traits::{Equals, EverythingBut}; use parachains_common::{AssetIdForTrustBackedAssets, CollectionId, ItemId}; diff --git a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs index 58f5d2d57a7..8a89089c718 100644 --- a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs +++ b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs @@ -13,13 +13,13 @@ // See the License for the specific language governing permissions and // limitations under the License. +use core::marker::PhantomData; use frame_support::traits::Get; use sp_runtime::{ traits::{Convert, MaybeEquivalence}, Either, Either::{Left, Right}, }; -use sp_std::marker::PhantomData; use xcm::latest::Location; /// Converts a given [`Location`] to [`Either::Left`] when equal to `Target`, or diff --git a/cumulus/parachains/runtimes/assets/common/src/matching.rs b/cumulus/parachains/runtimes/assets/common/src/matching.rs index f356cb54131..9bb35d0c532 100644 --- a/cumulus/parachains/runtimes/assets/common/src/matching.rs +++ b/cumulus/parachains/runtimes/assets/common/src/matching.rs @@ -28,7 +28,7 @@ frame_support::parameter_types! { } /// Accepts an asset if it is from the origin. -pub struct IsForeignConcreteAsset(sp_std::marker::PhantomData); +pub struct IsForeignConcreteAsset(core::marker::PhantomData); impl> ContainsPair for IsForeignConcreteAsset { @@ -41,7 +41,7 @@ impl> ContainsPair /// Checks if `a` is from sibling location `b`. Checks that `Location-a` starts with /// `Location-b`, and that the `ParaId` of `b` is not equal to `a`. pub struct FromSiblingParachain( - sp_std::marker::PhantomData<(SelfParaId, L)>, + core::marker::PhantomData<(SelfParaId, L)>, ); impl, L: TryFrom + TryInto + Clone> ContainsPair for FromSiblingParachain @@ -65,7 +65,7 @@ impl, L: TryFrom + TryInto + Clone> /// Checks if `a` is from the expected global consensus network. Checks that `Location-a` /// starts with `Location-b`, and that network is a foreign consensus system. pub struct FromNetwork( - sp_std::marker::PhantomData<(UniversalLocation, ExpectedNetworkId, L)>, + core::marker::PhantomData<(UniversalLocation, ExpectedNetworkId, L)>, ); impl< UniversalLocation: Get, @@ -100,7 +100,7 @@ impl< /// Accept an asset if it is native to `AssetsAllowedNetworks` and it is coming from /// `OriginLocation`. pub struct RemoteAssetFromLocation( - sp_std::marker::PhantomData<(AssetsAllowedNetworks, OriginLocation)>, + core::marker::PhantomData<(AssetsAllowedNetworks, OriginLocation)>, ); impl, OriginLocation: Get> ContainsPair for RemoteAssetFromLocation diff --git a/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs b/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs index 19977cbedab..799b2f45b4d 100644 --- a/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs +++ b/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs @@ -18,7 +18,7 @@ use codec::{Codec, Decode, Encode}; use sp_runtime::RuntimeDebug; #[cfg(feature = "std")] -use {sp_std::vec::Vec, xcm::latest::Asset}; +use {alloc::vec::Vec, xcm::latest::Asset}; /// The possible errors that can happen querying the storage of assets. #[derive(Eq, PartialEq, Encode, Decode, RuntimeDebug, scale_info::TypeInfo)] diff --git a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml index a7aad361e84..529d6460fc4 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml @@ -21,7 +21,6 @@ pallet-timestamp = { workspace = true } pallet-session = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } # Cumulus cumulus-pallet-parachain-system = { workspace = true } @@ -68,7 +67,6 @@ std = [ "parachains-runtimes-test-utils/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "xcm-builder/std", "xcm-executor/std", "xcm/std", diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs index 39ea6369255..d97e6a1d88e 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs @@ -87,7 +87,7 @@ parameter_types! { XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, ); /// All active routes and their destinations. - pub ActiveLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = sp_std::vec![ + pub ActiveLanes: alloc::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = alloc::vec![ ( FromRococoPeopleToRococoBulletinRoute::get(), (RococoBulletinGlobalConsensusNetwork::get(), Here) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs index 07bb718bd13..fe854e20c24 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs @@ -71,7 +71,7 @@ parameter_types! { ParentThen([Parachain(AssetHubRococoParaId::get().into())].into()).into(), XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, ); - pub ActiveLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = sp_std::vec![ + pub ActiveLanes: alloc::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = alloc::vec![ ( FromAssetHubRococoToAssetHubWestendRoute::get(), (WestendGlobalConsensusNetwork::get(), [Parachain(AssetHubWestendParaId::get().into())].into()) @@ -91,8 +91,8 @@ parameter_types! { } pub const XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND: LaneId = LaneId([0, 0, 0, 2]); -fn build_congestion_message(is_congested: bool) -> sp_std::vec::Vec> { - sp_std::vec![ +fn build_congestion_message(is_congested: bool) -> alloc::vec::Vec> { + alloc::vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, Transact { origin_kind: OriginKind::Xcm, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 8ca5898d1a1..512c1199f43 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -35,6 +35,9 @@ pub mod bridge_to_westend_config; mod weights; pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use bridge_runtime_common::extensions::{ check_obsolete_extension::{ CheckAndBoostBridgeGrandpaTransactions, CheckAndBoostBridgeParachainsTransactions, @@ -58,7 +61,6 @@ use sp_runtime::{ ApplyExtrinsicResult, FixedU128, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -110,6 +112,8 @@ use parachains_common::{ AVERAGE_ON_INITIALIZE_RATIO, NORMAL_DISPATCH_RATIO, }; +#[cfg(feature = "runtime-benchmarks")] +use alloc::boxed::Box; #[cfg(feature = "runtime-benchmarks")] use benchmark_helpers::DoNothingRouter; @@ -862,7 +866,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -1197,7 +1201,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_parachain_system.rs index dc480c39163..8fcd7b10d93 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_parachain_system.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_parachain_system.rs @@ -47,7 +47,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_parachain_system`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_message_queue.rs index 2fcd573ceb2..b6fee47d143 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_message_queue.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_message_queue.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_message_queue`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs index 4f5bae0fe59..b40cbfeeb8f 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs @@ -17,11 +17,11 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use alloc::vec::Vec; use codec::Encode; use frame_support::weights::Weight; use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; trait WeighAssets { diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index d7e8c41ff8a..057dc431351 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::fungible`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index bafc973bdac..9c58072d402 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::generic`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index a0d2e91dffd..5ec545ee059 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -22,6 +22,7 @@ use super::{ use bp_messages::LaneId; use bp_relayers::{PayRewardFromAccount, RewardsAccountOwner, RewardsAccountParams}; use bp_runtime::ChainId; +use core::marker::PhantomData; use frame_support::{ parameter_types, traits::{tokens::imbalance::ResolveTo, ConstU32, Contains, Equals, Everything, Nothing}, @@ -41,7 +42,6 @@ use polkadot_runtime_common::xcm_sender::ExponentialPrice; use snowbridge_runtime_common::XcmExportFeeToSibling; use sp_core::Get; use sp_runtime::traits::AccountIdConversion; -use sp_std::marker::PhantomData; use testnet_parachains_constants::rococo::snowbridge::EthereumNetwork; use xcm::latest::prelude::*; use xcm_builder::{ diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs index 09d55f4323a..42d5ef3eebd 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs @@ -78,7 +78,7 @@ parameter_types! { ParentThen([Parachain(AssetHubWestendParaId::get().into())].into()).into(), XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO, ); - pub ActiveLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = sp_std::vec![ + pub ActiveLanes: alloc::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = alloc::vec![ ( FromAssetHubWestendToAssetHubRococoRoute::get(), (RococoGlobalConsensusNetwork::get(), [Parachain(AssetHubRococoParaId::get().into())].into()) @@ -98,8 +98,8 @@ parameter_types! { } pub const XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO: LaneId = LaneId([0, 0, 0, 2]); -fn build_congestion_message(is_congested: bool) -> sp_std::vec::Vec> { - sp_std::vec![ +fn build_congestion_message(is_congested: bool) -> alloc::vec::Vec> { + alloc::vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, Transact { origin_kind: OriginKind::Xcm, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index 993f6043245..5d4c35d6610 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -32,6 +32,9 @@ pub mod bridge_to_rococo_config; mod weights; pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use bridge_runtime_common::extensions::{ check_obsolete_extension::{ CheckAndBoostBridgeGrandpaTransactions, CheckAndBoostBridgeParachainsTransactions, @@ -49,7 +52,6 @@ use sp_runtime::{ ApplyExtrinsicResult, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -612,7 +614,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -886,7 +888,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } @@ -928,7 +930,7 @@ impl_runtime_apis! { } fn set_up_complex_asset_transfer( - ) -> Option<(Assets, u32, Location, Box)> { + ) -> Option<(Assets, u32, Location, alloc::boxed::Box)> { // BH only supports teleports to system parachain. // Relay/native token can be teleported between BH and Relay. let native_location = Parent.into(); @@ -1051,7 +1053,7 @@ impl_runtime_apis! { // save XCM version for remote bridge hub let _ = PolkadotXcm::force_xcm_version( RuntimeOrigin::root(), - Box::new(bridge_to_rococo_config::BridgeHubRococoLocation::get()), + alloc::boxed::Box::new(bridge_to_rococo_config::BridgeHubRococoLocation::get()), XCM_VERSION, ).map_err(|e| { log::error!( diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/cumulus_pallet_parachain_system.rs index dc480c39163..8fcd7b10d93 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/cumulus_pallet_parachain_system.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/cumulus_pallet_parachain_system.rs @@ -47,7 +47,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_parachain_system`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_message_queue.rs index 2fcd573ceb2..b6fee47d143 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_message_queue.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_message_queue.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_message_queue`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/mod.rs index e8950678b40..3961cc6d5cd 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/mod.rs @@ -18,11 +18,11 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use alloc::vec::Vec; use codec::Encode; use frame_support::weights::Weight; use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; trait WeighAssets { diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 295abd481d7..4310b245647 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::fungible`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 73bea66bf71..ba434ff2962 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::generic`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml index fd0eed1c05a..3ae43075000 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml @@ -10,7 +10,6 @@ license = "Apache-2.0" codec = { features = ["derive"], workspace = true } scale-info = { features = ["derive"], workspace = true } frame-support = { workspace = true } -sp-std = { workspace = true } sp-core = { workspace = true } sp-runtime = { workspace = true } cumulus-primitives-core = { workspace = true } @@ -29,7 +28,6 @@ std = [ "snowbridge-core/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", "xcm/std", ] diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs index c1bba65b0ab..5f91897262f 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs @@ -14,6 +14,7 @@ // limitations under the License. //! Runtime configuration for MessageQueue pallet use codec::{Decode, Encode, MaxEncodedLen}; +use core::marker::PhantomData; use cumulus_primitives_core::{AggregateMessageOrigin as CumulusAggregateMessageOrigin, ParaId}; use frame_support::{ traits::{ProcessMessage, ProcessMessageError, QueueFootprint, QueuePausedQuery}, @@ -22,7 +23,6 @@ use frame_support::{ use pallet_message_queue::OnQueueChanged; use scale_info::TypeInfo; use snowbridge_core::ChannelId; -use sp_std::{marker::PhantomData, prelude::*}; use xcm::v4::{Junction, Location}; /// The aggregate origin of an inbound message. diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index fb96d29a497..44a8646142d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -21,7 +21,6 @@ sp-core = { workspace = true } sp-io = { workspace = true } sp-keyring = { workspace = true, default-features = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-tracing = { workspace = true, default-features = true } pallet-balances = { workspace = true } pallet-utility = { workspace = true } @@ -81,7 +80,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "xcm-builder/std", "xcm-executor/std", "xcm/std", diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs index 1874f38de2d..0b3463f0df9 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs @@ -19,6 +19,8 @@ pub mod test_cases; pub mod test_data; +extern crate alloc; + pub use bp_test_utils::test_header; pub use parachains_runtimes_test_utils::*; use sp_runtime::Perbill; diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs index 8f3c7de61f8..d6dfa93731a 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs @@ -22,6 +22,7 @@ use crate::{ test_data, }; +use alloc::{boxed::Box, vec}; use bp_header_chain::ChainWithGrandpa; use bp_messages::{LaneId, UnrewardedRelayersState}; use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; @@ -61,7 +62,7 @@ pub trait WithRemoteGrandpaChainHelper { /// Adapter struct that implements [`WithRemoteGrandpaChainHelper`]. pub struct WithRemoteGrandpaChainHelperAdapter( - sp_std::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, MPI)>, + core::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, MPI)>, ); impl WithRemoteGrandpaChainHelper diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs index 6580648e660..728b4e76b10 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs @@ -22,6 +22,7 @@ use crate::{ test_data, }; +use alloc::{boxed::Box, vec}; use bp_header_chain::ChainWithGrandpa; use bp_messages::{LaneId, UnrewardedRelayersState}; use bp_polkadot_core::parachains::ParaHash; @@ -66,7 +67,7 @@ pub trait WithRemoteParachainHelper { /// Adapter struct that implements `WithRemoteParachainHelper`. pub struct WithRemoteParachainHelperAdapter( - sp_std::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, PPI, MPI)>, + core::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, PPI, MPI)>, ); impl WithRemoteParachainHelper diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs index c990c6e5307..78b8a170f0d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs @@ -23,6 +23,7 @@ use bp_messages::{LaneId, MessageNonce}; use bp_polkadot_core::parachains::{ParaHash, ParaId}; use bp_relayers::RewardsAccountParams; use codec::Decode; +use core::marker::PhantomData; use frame_support::{ assert_ok, traits::{OnFinalize, OnInitialize, PalletInfoAccess}, @@ -37,7 +38,6 @@ use parachains_runtimes_test_utils::{ use sp_core::Get; use sp_keyring::AccountKeyring::*; use sp_runtime::{traits::TrailingZeroInput, AccountId32}; -use sp_std::marker::PhantomData; use xcm::latest::prelude::*; /// Verify that the transaction has succeeded. @@ -290,7 +290,7 @@ pub fn relayed_incoming_message_works( // value here is tricky - there are several transaction payment pallets and we don't // want to introduce additional bounds and traits here just for that, so let's just // select some presumably large value - sp_std::cmp::max::(Runtime::ExistentialDeposit::get(), 1u32.into()) * + core::cmp::max::(Runtime::ExistentialDeposit::get(), 1u32.into()) * 100_000_000u32.into(), )], || { diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml index 87cf42ba87d..43fc9083937 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml @@ -54,7 +54,6 @@ sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -229,7 +228,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs index e5b176fc778..ed5d4870e4a 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs @@ -14,6 +14,8 @@ // limitations under the License. use crate::OriginCaller; +use alloc::boxed::Box; +use core::{cmp::Ordering, marker::PhantomData}; use frame_support::{ dispatch::DispatchResultWithPostInfo, traits::{Currency, PrivilegeCmp}, @@ -21,7 +23,6 @@ use frame_support::{ }; use pallet_alliance::{ProposalIndex, ProposalProvider}; use sp_runtime::DispatchError; -use sp_std::{cmp::Ordering, marker::PhantomData, prelude::*}; type AccountIdOf = ::AccountId; diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index f37af88c284..d843d6f6f77 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -42,8 +42,12 @@ mod weights; pub mod xcm_config; // Fellowship configurations. pub mod fellowship; + +extern crate alloc; + pub use ambassador::pallet_ambassador_origins; +use alloc::{vec, vec::Vec}; use ambassador::AmbassadorCoreInstance; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use fellowship::{pallet_fellowship_origins, Fellows, FellowshipCoreInstance}; @@ -57,7 +61,6 @@ use sp_runtime::{ ApplyExtrinsicResult, Perbill, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -837,7 +840,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -1047,7 +1050,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } @@ -1096,7 +1099,7 @@ impl_runtime_apis! { } fn set_up_complex_asset_transfer( - ) -> Option<(Assets, u32, Location, Box)> { + ) -> Option<(Assets, u32, Location, alloc::boxed::Box)> { // Collectives only supports teleports to system parachain. // Relay/native token can be teleported between Collectives and Relay. let native_location = Parent.into(); diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/cumulus_pallet_parachain_system.rs index 0b7a2fc21cd..92c8c88b515 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/cumulus_pallet_parachain_system.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/cumulus_pallet_parachain_system.rs @@ -47,7 +47,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_parachain_system`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_message_queue.rs index 4bd71c4e7d4..0bb6d3d0f1c 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_message_queue.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_message_queue.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_message_queue`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index 4fb4bcde023..1fcebb3f16a 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -31,7 +31,6 @@ sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -133,7 +132,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index d2fe0689f51..47ce6f3628e 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -29,6 +29,9 @@ mod contracts; mod weights; mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use cumulus_primitives_core::AggregateMessageOrigin; use sp_api::impl_runtime_apis; @@ -40,7 +43,6 @@ use sp_runtime::{ ApplyExtrinsicResult, Perbill, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -487,7 +489,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -765,7 +767,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } @@ -815,7 +817,7 @@ impl_runtime_apis! { } fn set_up_complex_asset_transfer( - ) -> Option<(Assets, u32, Location, Box)> { + ) -> Option<(Assets, u32, Location, alloc::boxed::Box)> { // Contracts-System-Para only supports teleports to system parachain. // Relay/native token can be teleported between Contracts-System-Para and Relay. let native_location = Parent.into(); diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml index 57a0782b1ef..2920bc428d9 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml @@ -49,7 +49,6 @@ sp-genesis-builder = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -133,7 +132,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 6e36539c7bf..9fd0093840d 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -33,6 +33,9 @@ mod coretime; mod weights; pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ @@ -66,7 +69,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, DispatchError, MultiAddress, Perbill, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -552,7 +554,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -774,7 +776,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs index 9f79cea831a..b8db473f106 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs @@ -18,10 +18,10 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use alloc::vec::Vec; use frame_support::weights::Weight; use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; trait WeighAssets { diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 7ff1cce2e07..73a71980530 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::fungible`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 16412eb49a5..676048f92ad 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::generic`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml index d3bf6b43a7e..07a4332800d 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml @@ -48,7 +48,6 @@ sp-genesis-builder = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -131,7 +130,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs index 74fdd971f5c..7907f252cf8 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -33,6 +33,9 @@ mod coretime; mod weights; pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ @@ -66,7 +69,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, DispatchError, MultiAddress, Perbill, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -543,7 +545,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -765,7 +767,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs index 99af88812da..f35f7bfc188 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs @@ -17,10 +17,10 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use alloc::vec::Vec; use frame_support::weights::Weight; use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; trait WeighAssets { diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 8e1461c4a99..ddfc599fa57 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::fungible`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 9657fa55c1f..7390f35e397 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -43,7 +43,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::generic`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml b/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml index c201c8375be..d20b62a557b 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml @@ -35,7 +35,6 @@ pallet-message-queue = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -109,7 +108,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs index a204bb7276c..1b505ad3acb 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs @@ -47,6 +47,9 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); pub mod weights; pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use sp_api::impl_runtime_apis; pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; @@ -57,7 +60,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -345,7 +347,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -455,7 +457,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } diff --git a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml index 890de672e0b..a732bec2352 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml @@ -45,7 +45,6 @@ sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -128,7 +127,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs index ff31aba8a27..4f007c3fc39 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -22,6 +22,9 @@ pub mod people; mod weights; pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ @@ -59,7 +62,6 @@ use sp_runtime::{ ApplyExtrinsicResult, }; pub use sp_runtime::{MultiAddress, Perbill, Permill}; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -521,7 +523,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -737,7 +739,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/people.rs b/cumulus/parachains/runtimes/people/people-rococo/src/people.rs index 88a89711019..8211447d68c 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/people.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/people.rs @@ -28,7 +28,6 @@ use sp_runtime::{ traits::{AccountIdConversion, Verify}, RuntimeDebug, }; -use sp_std::prelude::*; parameter_types! { // 27 | Min encoded size of `Registration` @@ -94,8 +93,8 @@ pub enum IdentityField { )] #[codec(mel_bound())] pub struct IdentityInfo { - /// A reasonable display name for the controller of the account. This should be whatever the - /// account is typically known as and should not be confusable with other entities, given + /// A reasonable display name for the controller of the account. This should be whatever the + /// account is typically known as and should not be confusable with other entities, given /// reasonable context. /// /// Stored as UTF-8. @@ -151,7 +150,7 @@ impl IdentityInformationProvider for IdentityInfo { #[cfg(feature = "runtime-benchmarks")] fn create_identity_info() -> Self { - let data = Data::Raw(vec![0; 32].try_into().unwrap()); + let data = Data::Raw(alloc::vec![0; 32].try_into().unwrap()); IdentityInfo { display: data.clone(), diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_parachain_system.rs index fcea5fd1bf6..5715d56c218 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_parachain_system.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_parachain_system.rs @@ -20,7 +20,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_parachain_system`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_message_queue.rs index fe1911b77a7..47c67901407 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_message_queue.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_message_queue.rs @@ -20,7 +20,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_message_queue`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs index 4afd65bdcfe..11c1bad9aa1 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs @@ -17,10 +17,10 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use alloc::vec::Vec; use frame_support::weights::Weight; use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; trait WeighAssets { diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index b279399e7a9..2364798596d 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -42,7 +42,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::fungible`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index e2be324ee2d..a50c8860c48 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -42,7 +42,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::generic`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml index 83068e489d2..20c7e691ebc 100644 --- a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml @@ -45,7 +45,6 @@ sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -127,7 +126,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs index 6adaa4b4e50..1378324ce7b 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs @@ -22,6 +22,9 @@ pub mod people; mod weights; pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ @@ -59,7 +62,6 @@ use sp_runtime::{ ApplyExtrinsicResult, }; pub use sp_runtime::{MultiAddress, Perbill, Permill}; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -521,7 +523,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -737,7 +739,7 @@ impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + fn setup_set_code_requirements(code: &alloc::vec::Vec) -> Result<(), BenchmarkError> { ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); Ok(()) } diff --git a/cumulus/parachains/runtimes/people/people-westend/src/people.rs b/cumulus/parachains/runtimes/people/people-westend/src/people.rs index a5c0e66a3f8..0255fd074b1 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/people.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/people.rs @@ -28,7 +28,6 @@ use sp_runtime::{ traits::{AccountIdConversion, Verify}, RuntimeDebug, }; -use sp_std::prelude::*; parameter_types! { // 27 | Min encoded size of `Registration` @@ -151,7 +150,7 @@ impl IdentityInformationProvider for IdentityInfo { #[cfg(feature = "runtime-benchmarks")] fn create_identity_info() -> Self { - let data = Data::Raw(vec![0; 32].try_into().unwrap()); + let data = Data::Raw(alloc::vec![0; 32].try_into().unwrap()); IdentityInfo { display: data.clone(), diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_parachain_system.rs index fcea5fd1bf6..5715d56c218 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_parachain_system.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_parachain_system.rs @@ -20,7 +20,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_parachain_system`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_message_queue.rs index fe1911b77a7..47c67901407 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_message_queue.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_message_queue.rs @@ -20,7 +20,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_message_queue`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs index b2579230c9e..b1fc7ad8ed8 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs @@ -17,10 +17,10 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use alloc::vec::Vec; use frame_support::weights::Weight; use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; trait WeighAssets { diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index efffd318817..92d08a24618 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -42,7 +42,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::fungible`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index d7b10f95c79..861f0381995 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -42,7 +42,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::generic`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml index 8a7c5922362..c76c09a3123 100644 --- a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml +++ b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml @@ -30,7 +30,6 @@ sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -74,7 +73,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-transaction-pool/std", "sp-version/std", "substrate-wasm-builder", diff --git a/cumulus/parachains/runtimes/starters/seedling/src/lib.rs b/cumulus/parachains/runtimes/starters/seedling/src/lib.rs index 461133f6cfc..1fe72604d37 100644 --- a/cumulus/parachains/runtimes/starters/seedling/src/lib.rs +++ b/cumulus/parachains/runtimes/starters/seedling/src/lib.rs @@ -27,6 +27,9 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +extern crate alloc; + +use alloc::{vec, vec::Vec}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use sp_api::impl_runtime_apis; pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; @@ -37,7 +40,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -310,7 +312,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } diff --git a/cumulus/parachains/runtimes/starters/shell/Cargo.toml b/cumulus/parachains/runtimes/starters/shell/Cargo.toml index 4a1271ca658..8f3b2204cfe 100644 --- a/cumulus/parachains/runtimes/starters/shell/Cargo.toml +++ b/cumulus/parachains/runtimes/starters/shell/Cargo.toml @@ -29,7 +29,6 @@ sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } pallet-message-queue = { workspace = true } @@ -77,7 +76,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-transaction-pool/std", "sp-version/std", "substrate-wasm-builder", diff --git a/cumulus/parachains/runtimes/starters/shell/src/lib.rs b/cumulus/parachains/runtimes/starters/shell/src/lib.rs index 7422b580cc3..1dfbe2b6c41 100644 --- a/cumulus/parachains/runtimes/starters/shell/src/lib.rs +++ b/cumulus/parachains/runtimes/starters/shell/src/lib.rs @@ -31,6 +31,9 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use cumulus_primitives_core::AggregateMessageOrigin; @@ -45,7 +48,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -280,7 +282,7 @@ impl sp_runtime::traits::SignedExtension for DisallowSigned { type Pre = (); fn additional_signed( &self, - ) -> sp_std::result::Result<(), sp_runtime::transaction_validity::TransactionValidityError> { + ) -> core::result::Result<(), sp_runtime::transaction_validity::TransactionValidityError> { Ok(()) } fn pre_dispatch( @@ -368,7 +370,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } diff --git a/cumulus/parachains/runtimes/test-utils/Cargo.toml b/cumulus/parachains/runtimes/test-utils/Cargo.toml index 5e895271ab1..01d7fcc2b5c 100644 --- a/cumulus/parachains/runtimes/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/test-utils/Cargo.toml @@ -21,7 +21,6 @@ pallet-timestamp = { workspace = true } sp-consensus-aura = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-tracing = { workspace = true, default-features = true } sp-core = { workspace = true } @@ -68,7 +67,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "xcm-executor/std", "xcm/std", ] diff --git a/cumulus/parachains/runtimes/test-utils/src/lib.rs b/cumulus/parachains/runtimes/test-utils/src/lib.rs index 3c84243306f..3fc3822a63e 100644 --- a/cumulus/parachains/runtimes/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/test-utils/src/lib.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use sp_std::marker::PhantomData; +use core::marker::PhantomData; use codec::{Decode, DecodeLimit}; use cumulus_primitives_core::{ diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml index bdd0dfac606..1a2737f3aa2 100644 --- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml @@ -51,7 +51,6 @@ sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -128,7 +127,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool/std", "sp-version/std", diff --git a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs index 8d03f833276..bf39c02a3f5 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs @@ -32,6 +32,9 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); mod weights; pub mod xcm_config; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use codec::Encode; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; @@ -69,7 +72,6 @@ use sp_runtime::{ ApplyExtrinsicResult, }; pub use sp_runtime::{traits::ConvertInto, MultiAddress, Perbill, Permill}; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -737,7 +739,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml index 7cbb614babe..a0ad248bb70 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml @@ -35,7 +35,6 @@ sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -106,7 +105,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-transaction-pool/std", "sp-version/std", "substrate-wasm-builder", diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 40f2b78ffd6..dff7046f197 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -22,6 +22,9 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +extern crate alloc; + +use alloc::{vec, vec::Vec}; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use polkadot_runtime_common::xcm_sender::NoPriceForMessageDelivery; use sp_api::impl_runtime_apis; @@ -32,7 +35,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -711,7 +713,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } diff --git a/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs b/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs index 0b79d338c16..7d54e9b4be0 100644 --- a/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs +++ b/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs @@ -53,7 +53,7 @@ sp_api::impl_runtime_apis! { unimplemented!() } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> Vec { unimplemented!() } } diff --git a/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs b/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs index 823eb9ab584..ca5fc8bdf11 100644 --- a/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs +++ b/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs @@ -53,7 +53,7 @@ sp_api::impl_runtime_apis! { unimplemented!() } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> Vec { unimplemented!() } } diff --git a/cumulus/primitives/aura/Cargo.toml b/cumulus/primitives/aura/Cargo.toml index f17c2035edd..062b9ce736e 100644 --- a/cumulus/primitives/aura/Cargo.toml +++ b/cumulus/primitives/aura/Cargo.toml @@ -16,7 +16,6 @@ codec = { features = ["derive"], workspace = true } sp-api = { workspace = true } sp-consensus-aura = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } # Polkadot polkadot-core-primitives = { workspace = true } @@ -31,5 +30,4 @@ std = [ "sp-api/std", "sp-consensus-aura/std", "sp-runtime/std", - "sp-std/std", ] diff --git a/cumulus/primitives/core/Cargo.toml b/cumulus/primitives/core/Cargo.toml index f41213e9485..533d368d3b0 100644 --- a/cumulus/primitives/core/Cargo.toml +++ b/cumulus/primitives/core/Cargo.toml @@ -16,7 +16,6 @@ scale-info = { features = ["derive"], workspace = true } # Substrate sp-api = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-trie = { workspace = true } # Polkadot @@ -35,7 +34,6 @@ std = [ "scale-info/std", "sp-api/std", "sp-runtime/std", - "sp-std/std", "sp-trie/std", "xcm/std", ] diff --git a/cumulus/primitives/core/src/lib.rs b/cumulus/primitives/core/src/lib.rs index 29216d51346..6eafecfc3ff 100644 --- a/cumulus/primitives/core/src/lib.rs +++ b/cumulus/primitives/core/src/lib.rs @@ -18,11 +18,13 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use polkadot_parachain_primitives::primitives::HeadData; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; -use sp_std::prelude::*; pub use polkadot_core_primitives::InboundDownwardMessage; pub use polkadot_parachain_primitives::primitives::{ @@ -202,7 +204,7 @@ pub struct ParachainBlockData { /// The header of the parachain block. header: B::Header, /// The extrinsics of the parachain block. - extrinsics: sp_std::vec::Vec, + extrinsics: alloc::vec::Vec, /// The data that is required to emulate the storage accesses executed by all extrinsics. storage_proof: sp_trie::CompactProof, } @@ -211,7 +213,7 @@ impl ParachainBlockData { /// Creates a new instance of `Self`. pub fn new( header: ::Header, - extrinsics: sp_std::vec::Vec<::Extrinsic>, + extrinsics: alloc::vec::Vec<::Extrinsic>, storage_proof: sp_trie::CompactProof, ) -> Self { Self { header, extrinsics, storage_proof } @@ -243,7 +245,7 @@ impl ParachainBlockData { } /// Deconstruct into the inner parts. - pub fn deconstruct(self) -> (B::Header, sp_std::vec::Vec, sp_trie::CompactProof) { + pub fn deconstruct(self) -> (B::Header, alloc::vec::Vec, sp_trie::CompactProof) { (self.header, self.extrinsics, self.storage_proof) } } diff --git a/cumulus/primitives/parachain-inherent/Cargo.toml b/cumulus/primitives/parachain-inherent/Cargo.toml index c07fe075456..172af4b9ec6 100644 --- a/cumulus/primitives/parachain-inherent/Cargo.toml +++ b/cumulus/primitives/parachain-inherent/Cargo.toml @@ -19,7 +19,6 @@ sp-core = { workspace = true } sp-inherents = { workspace = true } sp-runtime = { optional = true, workspace = true } sp-state-machine = { optional = true, workspace = true } -sp-std = { workspace = true } sp-trie = { workspace = true } # Cumulus @@ -36,6 +35,5 @@ std = [ "sp-inherents/std", "sp-runtime?/std", "sp-state-machine?/std", - "sp-std/std", "sp-trie/std", ] diff --git a/cumulus/primitives/parachain-inherent/src/lib.rs b/cumulus/primitives/parachain-inherent/src/lib.rs index 75a56693958..ad4b39b547c 100644 --- a/cumulus/primitives/parachain-inherent/src/lib.rs +++ b/cumulus/primitives/parachain-inherent/src/lib.rs @@ -27,14 +27,16 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use cumulus_primitives_core::{ relay_chain::{BlakeTwo256, Hash as RelayHash, HashT as _}, InboundDownwardMessage, InboundHrmpMessage, ParaId, PersistedValidationData, }; +use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use scale_info::TypeInfo; use sp_inherents::InherentIdentifier; -use sp_std::{collections::btree_map::BTreeMap, vec::Vec}; /// The identifier for the parachain inherent. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"sysi1337"; diff --git a/cumulus/primitives/storage-weight-reclaim/Cargo.toml b/cumulus/primitives/storage-weight-reclaim/Cargo.toml index af32fb68d8b..3a98fdd017a 100644 --- a/cumulus/primitives/storage-weight-reclaim/Cargo.toml +++ b/cumulus/primitives/storage-weight-reclaim/Cargo.toml @@ -18,7 +18,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } cumulus-primitives-core = { workspace = true } cumulus-primitives-proof-size-hostfunction = { workspace = true } @@ -41,6 +40,5 @@ std = [ "scale-info/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-trie/std", ] diff --git a/cumulus/primitives/storage-weight-reclaim/src/lib.rs b/cumulus/primitives/storage-weight-reclaim/src/lib.rs index 35fa334f51c..f48dd927ee9 100644 --- a/cumulus/primitives/storage-weight-reclaim/src/lib.rs +++ b/cumulus/primitives/storage-weight-reclaim/src/lib.rs @@ -18,6 +18,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use codec::{Decode, Encode}; +use core::marker::PhantomData; use cumulus_primitives_core::Weight; use cumulus_primitives_proof_size_hostfunction::{ storage_proof_size::storage_proof_size, PROOF_RECORDING_DISABLED, @@ -33,7 +34,6 @@ use sp_runtime::{ transaction_validity::TransactionValidityError, DispatchResult, }; -use sp_std::marker::PhantomData; const LOG_TARGET: &'static str = "runtime::storage_reclaim"; @@ -199,6 +199,7 @@ where #[cfg(test)] mod tests { use super::*; + use core::marker::PhantomData; use frame_support::{ assert_ok, dispatch::{DispatchClass, PerDispatchClass}, @@ -206,7 +207,6 @@ mod tests { }; use frame_system::{BlockWeight, CheckWeight}; use sp_runtime::{AccountId32, BuildStorage}; - use sp_std::marker::PhantomData; use sp_trie::proof_size_extension::ProofSizeExt; type Test = cumulus_test_runtime::Runtime; diff --git a/cumulus/primitives/timestamp/Cargo.toml b/cumulus/primitives/timestamp/Cargo.toml index f7bf53a9d7d..a50011bc3f0 100644 --- a/cumulus/primitives/timestamp/Cargo.toml +++ b/cumulus/primitives/timestamp/Cargo.toml @@ -15,7 +15,6 @@ futures = { workspace = true } # Substrate sp-inherents = { workspace = true } -sp-std = { workspace = true } sp-timestamp = { workspace = true } # Cumulus @@ -27,6 +26,5 @@ std = [ "codec/std", "cumulus-primitives-core/std", "sp-inherents/std", - "sp-std/std", "sp-timestamp/std", ] diff --git a/cumulus/primitives/timestamp/src/lib.rs b/cumulus/primitives/timestamp/src/lib.rs index e6aba6d0bb7..5365f83efdf 100644 --- a/cumulus/primitives/timestamp/src/lib.rs +++ b/cumulus/primitives/timestamp/src/lib.rs @@ -27,9 +27,9 @@ #![cfg_attr(not(feature = "std"), no_std)] +use core::time::Duration; use cumulus_primitives_core::relay_chain::Slot; use sp_inherents::{Error, InherentData}; -use sp_std::time::Duration; pub use sp_timestamp::{InherentType, INHERENT_IDENTIFIER}; diff --git a/cumulus/primitives/utility/Cargo.toml b/cumulus/primitives/utility/Cargo.toml index a2fa2dd9806..82d18c8c0aa 100644 --- a/cumulus/primitives/utility/Cargo.toml +++ b/cumulus/primitives/utility/Cargo.toml @@ -17,7 +17,6 @@ log = { workspace = true } frame-support = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } pallet-asset-conversion = { workspace = true } # Polkadot @@ -42,7 +41,6 @@ std = [ "polkadot-runtime-parachains/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "xcm-builder/std", "xcm-executor/std", "xcm/std", diff --git a/cumulus/primitives/utility/src/lib.rs b/cumulus/primitives/utility/src/lib.rs index 64784eb36f8..9d5bf4e231e 100644 --- a/cumulus/primitives/utility/src/lib.rs +++ b/cumulus/primitives/utility/src/lib.rs @@ -19,7 +19,11 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{vec, vec::Vec}; use codec::Encode; +use core::marker::PhantomData; use cumulus_primitives_core::{MessageSendError, UpwardMessageSender}; use frame_support::{ defensive, @@ -33,7 +37,6 @@ use sp_runtime::{ traits::{Saturating, Zero}, SaturatedConversion, }; -use sp_std::{marker::PhantomData, prelude::*}; use xcm::{latest::prelude::*, VersionedLocation, VersionedXcm, WrapVersion}; use xcm_builder::{InspectMessageQueues, TakeRevenue}; use xcm_executor::{ @@ -803,7 +806,7 @@ mod test_trader { /// needed. #[cfg(feature = "runtime-benchmarks")] pub struct ToParentDeliveryHelper( - sp_std::marker::PhantomData<(XcmConfig, ExistentialDeposit, PriceForDelivery)>, + core::marker::PhantomData<(XcmConfig, ExistentialDeposit, PriceForDelivery)>, ); #[cfg(feature = "runtime-benchmarks")] diff --git a/cumulus/templates/xcm-bench-template.hbs b/cumulus/templates/xcm-bench-template.hbs index 5d0ded403f6..119924bca2e 100644 --- a/cumulus/templates/xcm-bench-template.hbs +++ b/cumulus/templates/xcm-bench-template.hbs @@ -17,7 +17,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weights for `{{pallet}}`. pub struct WeightInfo(PhantomData); diff --git a/cumulus/test/relay-sproof-builder/Cargo.toml b/cumulus/test/relay-sproof-builder/Cargo.toml index 454266c90ba..e266b580708 100644 --- a/cumulus/test/relay-sproof-builder/Cargo.toml +++ b/cumulus/test/relay-sproof-builder/Cargo.toml @@ -16,7 +16,6 @@ codec = { features = ["derive"], workspace = true } sp-runtime = { workspace = true } sp-state-machine = { workspace = true } sp-trie = { workspace = true } -sp-std = { workspace = true } # Polkadot polkadot-primitives = { workspace = true } @@ -32,6 +31,5 @@ std = [ "polkadot-primitives/std", "sp-runtime/std", "sp-state-machine/std", - "sp-std/std", "sp-trie/std", ] diff --git a/cumulus/test/relay-sproof-builder/src/lib.rs b/cumulus/test/relay-sproof-builder/src/lib.rs index fbd2692a36b..d1016085c80 100644 --- a/cumulus/test/relay-sproof-builder/src/lib.rs +++ b/cumulus/test/relay-sproof-builder/src/lib.rs @@ -14,12 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . +extern crate alloc; + +use alloc::collections::btree_map::BTreeMap; use cumulus_primitives_core::{ relay_chain, AbridgedHostConfiguration, AbridgedHrmpChannel, ParaId, }; use polkadot_primitives::UpgradeGoAhead; use sp_runtime::traits::HashingFor; -use sp_std::collections::btree_map::BTreeMap; use sp_trie::PrefixedMemoryDB; /// Builds a sproof (portmanteau of 'spoof' and 'proof') of the relay chain state. diff --git a/cumulus/test/runtime/Cargo.toml b/cumulus/test/runtime/Cargo.toml index d5582f2d2a2..54b83e2dfed 100644 --- a/cumulus/test/runtime/Cargo.toml +++ b/cumulus/test/runtime/Cargo.toml @@ -36,7 +36,6 @@ sp-offchain = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } sp-consensus-aura = { workspace = true } -sp-std = { workspace = true } sp-transaction-pool = { workspace = true } sp-version = { workspace = true } @@ -87,7 +86,6 @@ std = [ "sp-offchain/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", "sp-transaction-pool/std", "sp-version/std", "substrate-wasm-builder", diff --git a/cumulus/test/runtime/src/lib.rs b/cumulus/test/runtime/src/lib.rs index 97cb02ab779..274f16ab630 100644 --- a/cumulus/test/runtime/src/lib.rs +++ b/cumulus/test/runtime/src/lib.rs @@ -33,6 +33,10 @@ pub mod elastic_scaling { } mod test_pallet; + +extern crate alloc; + +use alloc::{vec, vec::Vec}; use frame_support::{derive_impl, traits::OnRuntimeUpgrade, PalletId}; use sp_api::{decl_runtime_apis, impl_runtime_apis}; pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; @@ -44,7 +48,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, MultiSignature, }; -use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -454,7 +457,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> Vec { Runtime::metadata_versions() } } diff --git a/cumulus/test/runtime/src/test_pallet.rs b/cumulus/test/runtime/src/test_pallet.rs index 7f43f713fad..61195386ae7 100644 --- a/cumulus/test/runtime/src/test_pallet.rs +++ b/cumulus/test/runtime/src/test_pallet.rs @@ -42,7 +42,7 @@ pub mod pallet { #[pallet::weight(0)] pub fn set_custom_validation_head_data( _: OriginFor, - custom_header: sp_std::vec::Vec, + custom_header: alloc::vec::Vec, ) -> DispatchResult { cumulus_pallet_parachain_system::Pallet::::set_custom_validation_head_data( custom_header, @@ -79,7 +79,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] diff --git a/cumulus/xcm/xcm-emulator/src/lib.rs b/cumulus/xcm/xcm-emulator/src/lib.rs index 1a3f3930cb3..8de3660c223 100644 --- a/cumulus/xcm/xcm-emulator/src/lib.rs +++ b/cumulus/xcm/xcm-emulator/src/lib.rs @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +extern crate alloc; + pub use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; pub use lazy_static::lazy_static; pub use log; @@ -24,6 +26,8 @@ pub use std::{ }; // Substrate +pub use alloc::collections::vec_deque::VecDeque; +pub use core::{cell::RefCell, fmt::Debug}; pub use cumulus_primitives_core::AggregateMessageOrigin as CumulusAggregateMessageOrigin; pub use frame_support::{ assert_ok, @@ -44,7 +48,6 @@ pub use sp_core::{parameter_types, sr25519, storage::Storage, Pair}; pub use sp_crypto_hashing::blake2_256; pub use sp_io::TestExternalities; pub use sp_runtime::BoundedSlice; -pub use sp_std::{cell::RefCell, collections::vec_deque::VecDeque, fmt::Debug}; pub use sp_tracing; // Cumulus diff --git a/docs/sdk/src/reference_docs/chain_spec_runtime/Cargo.toml b/docs/sdk/src/reference_docs/chain_spec_runtime/Cargo.toml index 9cf921a492a..02849571203 100644 --- a/docs/sdk/src/reference_docs/chain_spec_runtime/Cargo.toml +++ b/docs/sdk/src/reference_docs/chain_spec_runtime/Cargo.toml @@ -33,7 +33,6 @@ pallet-transaction-payment-rpc-runtime-api = { workspace = true } sp-genesis-builder = { workspace = true } sp-runtime = { features = ["serde"], workspace = true } sp-core = { workspace = true } -sp-std = { workspace = true } sp-keyring = { workspace = true } sp-application-crypto = { features = ["serde"], workspace = true } @@ -63,7 +62,6 @@ std = [ "sp-genesis-builder/std", "sp-keyring/std", "sp-runtime/std", - "sp-std/std", "serde/std", "serde_json/std", diff --git a/docs/sdk/src/reference_docs/chain_spec_runtime/src/lib.rs b/docs/sdk/src/reference_docs/chain_spec_runtime/src/lib.rs index 4606104fb96..e7effce1bd6 100644 --- a/docs/sdk/src/reference_docs/chain_spec_runtime/src/lib.rs +++ b/docs/sdk/src/reference_docs/chain_spec_runtime/src/lib.rs @@ -19,6 +19,8 @@ //! A minimal runtime that shows runtime genesis state. +extern crate alloc; + pub mod pallets; pub mod presets; pub mod runtime; diff --git a/docs/sdk/src/reference_docs/chain_spec_runtime/src/pallets.rs b/docs/sdk/src/reference_docs/chain_spec_runtime/src/pallets.rs index be4455aa219..2ff2d9539e2 100644 --- a/docs/sdk/src/reference_docs/chain_spec_runtime/src/pallets.rs +++ b/docs/sdk/src/reference_docs/chain_spec_runtime/src/pallets.rs @@ -17,6 +17,7 @@ //! Pallets for the chain-spec demo runtime. +use alloc::vec::Vec; use frame::prelude::*; #[docify::export] diff --git a/docs/sdk/src/reference_docs/chain_spec_runtime/src/presets.rs b/docs/sdk/src/reference_docs/chain_spec_runtime/src/presets.rs index c51947f6cc7..02c2d90f7c8 100644 --- a/docs/sdk/src/reference_docs/chain_spec_runtime/src/presets.rs +++ b/docs/sdk/src/reference_docs/chain_spec_runtime/src/presets.rs @@ -18,10 +18,10 @@ //! Presets for the chain-spec demo runtime. use crate::pallets::{FooEnum, SomeFooData1, SomeFooData2}; +use alloc::vec; use serde_json::{json, to_string, Value}; use sp_application_crypto::Ss58Codec; use sp_keyring::AccountKeyring; -use sp_std::vec; /// A demo preset with strings only. pub const PRESET_1: &str = "preset_1"; @@ -122,7 +122,7 @@ fn preset_invalid() -> Value { /// /// If no preset with given `id` exits `None` is returned. #[docify::export] -pub fn get_builtin_preset(id: &sp_genesis_builder::PresetId) -> Option> { +pub fn get_builtin_preset(id: &sp_genesis_builder::PresetId) -> Option> { let preset = match id.try_into() { Ok(PRESET_1) => preset_1(), Ok(PRESET_2) => preset_2(), diff --git a/docs/sdk/src/reference_docs/chain_spec_runtime/src/runtime.rs b/docs/sdk/src/reference_docs/chain_spec_runtime/src/runtime.rs index 6d9bc1260b1..c45f0126337 100644 --- a/docs/sdk/src/reference_docs/chain_spec_runtime/src/runtime.rs +++ b/docs/sdk/src/reference_docs/chain_spec_runtime/src/runtime.rs @@ -25,6 +25,7 @@ use crate::{ pallets::{pallet_bar, pallet_foo}, presets::*, }; +use alloc::{vec, vec::Vec}; use frame::{ deps::frame_support::{ genesis_builder_helper::{build_state, get_preset}, diff --git a/polkadot/core-primitives/Cargo.toml b/polkadot/core-primitives/Cargo.toml index 800434670f8..42ca2795373 100644 --- a/polkadot/core-primitives/Cargo.toml +++ b/polkadot/core-primitives/Cargo.toml @@ -11,7 +11,6 @@ workspace = true [dependencies] sp-core = { workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } scale-info = { features = ["derive"], workspace = true } codec = { features = ["derive"], workspace = true } @@ -23,5 +22,4 @@ std = [ "scale-info/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", ] diff --git a/polkadot/core-primitives/src/lib.rs b/polkadot/core-primitives/src/lib.rs index 072c045a8c7..666636def46 100644 --- a/polkadot/core-primitives/src/lib.rs +++ b/polkadot/core-primitives/src/lib.rs @@ -20,6 +20,8 @@ //! //! These core Polkadot types are used by the relay chain and the Parachains. +extern crate alloc; + use codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_runtime::{ @@ -81,8 +83,8 @@ impl std::fmt::Display for CandidateHash { } } -impl sp_std::fmt::Debug for CandidateHash { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for CandidateHash { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "{:?}", self.0) } } @@ -119,7 +121,7 @@ pub type Remark = [u8; 32]; /// A message sent from the relay-chain down to a parachain. /// /// The size of the message is limited by the `config.max_downward_message_size` parameter. -pub type DownwardMessage = sp_std::vec::Vec; +pub type DownwardMessage = alloc::vec::Vec; /// A wrapped version of `DownwardMessage`. The difference is that it has attached the block number /// when the message was sent. @@ -139,7 +141,7 @@ pub struct InboundHrmpMessage { /// enacted. pub sent_at: BlockNumber, /// The message payload. - pub data: sp_std::vec::Vec, + pub data: alloc::vec::Vec, } /// An HRMP message seen from the perspective of a sender. @@ -148,7 +150,7 @@ pub struct OutboundHrmpMessage { /// The para that will get this message in its downward message queue. pub recipient: Id, /// The message payload. - pub data: sp_std::vec::Vec, + pub data: alloc::vec::Vec, } /// `V2` primitives. diff --git a/polkadot/parachain/Cargo.toml b/polkadot/parachain/Cargo.toml index 1491af0148e..9d0518fd46a 100644 --- a/polkadot/parachain/Cargo.toml +++ b/polkadot/parachain/Cargo.toml @@ -15,7 +15,6 @@ workspace = true # various unnecessary Substrate-specific endpoints. codec = { features = ["derive"], workspace = true } scale-info = { features = ["derive", "serde"], workspace = true } -sp-std = { workspace = true } sp-runtime = { features = ["serde"], workspace = true } sp-core = { features = ["serde"], workspace = true } sp-weights = { workspace = true } @@ -37,7 +36,6 @@ std = [ "serde/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", "sp-weights/std", ] runtime-benchmarks = ["sp-runtime/runtime-benchmarks"] diff --git a/polkadot/parachain/src/lib.rs b/polkadot/parachain/src/lib.rs index bd75296bf83..8941b7fbb91 100644 --- a/polkadot/parachain/src/lib.rs +++ b/polkadot/parachain/src/lib.rs @@ -51,3 +51,5 @@ mod wasm_api; #[cfg(all(not(feature = "std"), feature = "wasm-api"))] pub use wasm_api::*; + +extern crate alloc; diff --git a/polkadot/parachain/src/primitives.rs b/polkadot/parachain/src/primitives.rs index d92bbee8d28..c5757928c3f 100644 --- a/polkadot/parachain/src/primitives.rs +++ b/polkadot/parachain/src/primitives.rs @@ -17,7 +17,7 @@ //! Primitive types which are strictly necessary from a parachain-execution point //! of view. -use sp_std::vec::Vec; +use alloc::vec::Vec; use bounded_collections::{BoundedVec, ConstU32}; use codec::{CompactAs, Decode, Encode, MaxEncodedLen}; @@ -89,14 +89,14 @@ impl ValidationCode { #[derive(Clone, Copy, Encode, Decode, Hash, Eq, PartialEq, PartialOrd, Ord, TypeInfo)] pub struct ValidationCodeHash(Hash); -impl sp_std::fmt::Display for ValidationCodeHash { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Display for ValidationCodeHash { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { self.0.fmt(f) } } -impl sp_std::fmt::Debug for ValidationCodeHash { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for ValidationCodeHash { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "{:?}", self.0) } } @@ -119,9 +119,9 @@ impl From<[u8; 32]> for ValidationCodeHash { } } -impl sp_std::fmt::LowerHex for ValidationCodeHash { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { - sp_std::fmt::LowerHex::fmt(&self.0, f) +impl core::fmt::LowerHex for ValidationCodeHash { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + core::fmt::LowerHex::fmt(&self.0, f) } } @@ -225,7 +225,7 @@ impl IsSystem for Id { } } -impl sp_std::ops::Add for Id { +impl core::ops::Add for Id { type Output = Self; fn add(self, other: u32) -> Self { @@ -233,7 +233,7 @@ impl sp_std::ops::Add for Id { } } -impl sp_std::ops::Sub for Id { +impl core::ops::Sub for Id { type Output = Self; fn sub(self, other: u32) -> Self { diff --git a/polkadot/parachain/src/wasm_api.rs b/polkadot/parachain/src/wasm_api.rs index f0c83266628..1c557c9ae50 100644 --- a/polkadot/parachain/src/wasm_api.rs +++ b/polkadot/parachain/src/wasm_api.rs @@ -22,7 +22,7 @@ /// function's entry point. #[cfg(not(feature = "std"))] pub unsafe fn load_params(params: *const u8, len: usize) -> crate::primitives::ValidationParams { - let mut slice = sp_std::slice::from_raw_parts(params, len); + let mut slice = core::slice::from_raw_parts(params, len); codec::Decode::decode(&mut slice).expect("Invalid input data") } diff --git a/polkadot/parachain/test-parachains/adder/Cargo.toml b/polkadot/parachain/test-parachains/adder/Cargo.toml index 1661112a7b3..7a150b75d5c 100644 --- a/polkadot/parachain/test-parachains/adder/Cargo.toml +++ b/polkadot/parachain/test-parachains/adder/Cargo.toml @@ -14,7 +14,6 @@ workspace = true [dependencies] polkadot-parachain-primitives = { features = ["wasm-api"], workspace = true } codec = { features = ["derive"], workspace = true } -sp-std = { workspace = true } tiny-keccak = { features = ["keccak"], workspace = true } dlmalloc = { features = ["global"], workspace = true } @@ -26,4 +25,4 @@ substrate-wasm-builder = { workspace = true, default-features = true } [features] default = ["std"] -std = ["codec/std", "polkadot-parachain-primitives/std", "sp-io/std", "sp-std/std"] +std = ["codec/std", "polkadot-parachain-primitives/std", "sp-io/std"] diff --git a/polkadot/parachain/test-parachains/adder/src/lib.rs b/polkadot/parachain/test-parachains/adder/src/lib.rs index 28914f02511..7e8d1bb1e13 100644 --- a/polkadot/parachain/test-parachains/adder/src/lib.rs +++ b/polkadot/parachain/test-parachains/adder/src/lib.rs @@ -18,6 +18,8 @@ #![no_std] +extern crate alloc; + use codec::{Decode, Encode}; use tiny_keccak::{Hasher as _, Keccak}; diff --git a/polkadot/parachain/test-parachains/adder/src/wasm_validation.rs b/polkadot/parachain/test-parachains/adder/src/wasm_validation.rs index 7dba7a964d3..9c3c77f7350 100644 --- a/polkadot/parachain/test-parachains/adder/src/wasm_validation.rs +++ b/polkadot/parachain/test-parachains/adder/src/wasm_validation.rs @@ -17,10 +17,10 @@ //! WASM validation for adder parachain. use crate::{BlockData, HeadData}; +use alloc::vec::Vec; use codec::{Decode, Encode}; use core::panic; use polkadot_parachain_primitives::primitives::{HeadData as GenericHeadData, ValidationResult}; -use sp_std::vec::Vec; #[no_mangle] pub extern "C" fn validate_block(params: *const u8, len: usize) -> u64 { @@ -37,10 +37,8 @@ pub extern "C" fn validate_block(params: *const u8, len: usize) -> u64 { polkadot_parachain_primitives::write_result(&ValidationResult { head_data: GenericHeadData(new_head.encode()), new_validation_code: None, - upward_messages: sp_std::vec::Vec::new().try_into().expect("empty vec fits into bounds"), - horizontal_messages: sp_std::vec::Vec::new() - .try_into() - .expect("empty vec fits into bounds"), + upward_messages: alloc::vec::Vec::new().try_into().expect("empty vec fits into bounds"), + horizontal_messages: alloc::vec::Vec::new().try_into().expect("empty vec fits into bounds"), processed_downward_messages: 0, hrmp_watermark: params.relay_parent_number, }) diff --git a/polkadot/parachain/test-parachains/undying/Cargo.toml b/polkadot/parachain/test-parachains/undying/Cargo.toml index 2466c6a0d69..4b2e12ebf43 100644 --- a/polkadot/parachain/test-parachains/undying/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/Cargo.toml @@ -14,7 +14,6 @@ workspace = true [dependencies] polkadot-parachain-primitives = { features = ["wasm-api"], workspace = true } codec = { features = ["derive"], workspace = true } -sp-std = { workspace = true } tiny-keccak = { features = ["keccak"], workspace = true } dlmalloc = { features = ["global"], workspace = true } log = { workspace = true } @@ -32,5 +31,4 @@ std = [ "log/std", "polkadot-parachain-primitives/std", "sp-io/std", - "sp-std/std", ] diff --git a/polkadot/parachain/test-parachains/undying/src/lib.rs b/polkadot/parachain/test-parachains/undying/src/lib.rs index dc056e64fa2..e4ec7e99346 100644 --- a/polkadot/parachain/test-parachains/undying/src/lib.rs +++ b/polkadot/parachain/test-parachains/undying/src/lib.rs @@ -18,8 +18,10 @@ #![no_std] +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode}; -use sp_std::vec::Vec; use tiny_keccak::{Hasher as _, Keccak}; #[cfg(not(feature = "std"))] diff --git a/polkadot/parachain/test-parachains/undying/src/wasm_validation.rs b/polkadot/parachain/test-parachains/undying/src/wasm_validation.rs index 23fac43a3c7..46b66aa518e 100644 --- a/polkadot/parachain/test-parachains/undying/src/wasm_validation.rs +++ b/polkadot/parachain/test-parachains/undying/src/wasm_validation.rs @@ -37,8 +37,8 @@ pub extern "C" fn validate_block(params: *const u8, len: usize) -> u64 { polkadot_parachain_primitives::write_result(&ValidationResult { head_data: GenericHeadData(new_head.encode()), new_validation_code: None, - upward_messages: sp_std::vec::Vec::new().try_into().expect("empty vec fits within bounds"), - horizontal_messages: sp_std::vec::Vec::new() + upward_messages: alloc::vec::Vec::new().try_into().expect("empty vec fits within bounds"), + horizontal_messages: alloc::vec::Vec::new() .try_into() .expect("empty vec fits within bounds"), processed_downward_messages: 0, diff --git a/polkadot/primitives/Cargo.toml b/polkadot/primitives/Cargo.toml index c0b510a8fe9..8f7ec314ecf 100644 --- a/polkadot/primitives/Cargo.toml +++ b/polkadot/primitives/Cargo.toml @@ -28,7 +28,6 @@ sp-consensus-slots = { features = ["serde"], workspace = true } sp-io = { workspace = true } sp-keystore = { optional = true, workspace = true } sp-staking = { features = ["serde"], workspace = true } -sp-std = { workspace = true } polkadot-core-primitives = { workspace = true } polkadot-parachain-primitives = { workspace = true } @@ -55,7 +54,6 @@ std = [ "sp-keystore?/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", ] runtime-benchmarks = [ "polkadot-parachain-primitives/runtime-benchmarks", diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index 061794ca06d..73736fd4a3d 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -31,6 +31,8 @@ pub mod vstaging; // unstable functions. pub mod runtime_api; +extern crate alloc; + // Current primitives not requiring versioning are exported here. // Primitives requiring versioning must not be exported and must be referred by an exact version. pub use v7::{ diff --git a/polkadot/primitives/src/runtime_api.rs b/polkadot/primitives/src/runtime_api.rs index 7bd92be35c1..b4816ad1507 100644 --- a/polkadot/primitives/src/runtime_api.rs +++ b/polkadot/primitives/src/runtime_api.rs @@ -121,12 +121,12 @@ use crate::{ SessionIndex, SessionInfo, ValidatorId, ValidatorIndex, ValidatorSignature, }; -use polkadot_core_primitives as pcp; -use polkadot_parachain_primitives::primitives as ppp; -use sp_std::{ +use alloc::{ collections::{btree_map::BTreeMap, vec_deque::VecDeque}, - prelude::*, + vec::Vec, }; +use polkadot_core_primitives as pcp; +use polkadot_parachain_primitives::primitives as ppp; sp_api::decl_runtime_apis! { /// The API for querying the state of parachains on-chain. diff --git a/polkadot/primitives/src/v7/async_backing.rs b/polkadot/primitives/src/v7/async_backing.rs index a82d843d28b..55d436e30de 100644 --- a/polkadot/primitives/src/v7/async_backing.rs +++ b/polkadot/primitives/src/v7/async_backing.rs @@ -18,6 +18,7 @@ use super::*; +use alloc::vec::Vec; use codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_core::RuntimeDebug; diff --git a/polkadot/primitives/src/v7/executor_params.rs b/polkadot/primitives/src/v7/executor_params.rs index e58cf3e76cc..bfd42ec30bd 100644 --- a/polkadot/primitives/src/v7/executor_params.rs +++ b/polkadot/primitives/src/v7/executor_params.rs @@ -22,11 +22,12 @@ //! done in `polkadot-node-core-pvf`. use crate::{BlakeTwo256, HashT as _, PvfExecKind, PvfPrepKind}; +use alloc::{collections::btree_map::BTreeMap, vec, vec::Vec}; use codec::{Decode, Encode}; +use core::{ops::Deref, time::Duration}; use polkadot_core_primitives::Hash; use scale_info::TypeInfo; use serde::{Deserialize, Serialize}; -use sp_std::{collections::btree_map::BTreeMap, ops::Deref, time::Duration, vec, vec::Vec}; /// Default maximum number of wasm values allowed for the stack during execution of a PVF. pub const DEFAULT_LOGICAL_STACK_MAX: u32 = 65536; @@ -134,21 +135,21 @@ impl ExecutorParamsHash { } } -impl sp_std::fmt::Display for ExecutorParamsHash { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Display for ExecutorParamsHash { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { self.0.fmt(f) } } -impl sp_std::fmt::Debug for ExecutorParamsHash { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for ExecutorParamsHash { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "{:?}", self.0) } } -impl sp_std::fmt::LowerHex for ExecutorParamsHash { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { - sp_std::fmt::LowerHex::fmt(&self.0, f) +impl core::fmt::LowerHex for ExecutorParamsHash { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + core::fmt::LowerHex::fmt(&self.0, f) } } @@ -159,21 +160,21 @@ impl sp_std::fmt::LowerHex for ExecutorParamsHash { #[derive(Clone, Copy, Encode, Decode, Hash, Eq, PartialEq, PartialOrd, Ord, TypeInfo)] pub struct ExecutorParamsPrepHash(Hash); -impl sp_std::fmt::Display for ExecutorParamsPrepHash { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Display for ExecutorParamsPrepHash { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { self.0.fmt(f) } } -impl sp_std::fmt::Debug for ExecutorParamsPrepHash { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for ExecutorParamsPrepHash { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "{:?}", self.0) } } -impl sp_std::fmt::LowerHex for ExecutorParamsPrepHash { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { - sp_std::fmt::LowerHex::fmt(&self.0, f) +impl core::fmt::LowerHex for ExecutorParamsPrepHash { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + core::fmt::LowerHex::fmt(&self.0, f) } } diff --git a/polkadot/primitives/src/v7/metrics.rs b/polkadot/primitives/src/v7/metrics.rs index 1a29471c545..1d66c9848a7 100644 --- a/polkadot/primitives/src/v7/metrics.rs +++ b/polkadot/primitives/src/v7/metrics.rs @@ -16,8 +16,8 @@ //! Runtime metric primitives. +use alloc::vec::Vec; use codec::{Decode, Encode}; -use sp_std::prelude::*; /// Runtime metric operations. #[derive(Encode, Decode)] @@ -42,7 +42,7 @@ pub struct RuntimeMetricUpdate { } fn vec_to_str<'a>(v: &'a Vec, default: &'static str) -> &'a str { - return sp_std::str::from_utf8(v).unwrap_or(default) + return alloc::str::from_utf8(v).unwrap_or(default) } impl RuntimeMetricLabels { @@ -99,7 +99,7 @@ pub trait AsStr { impl AsStr for RuntimeMetricLabel { fn as_str(&self) -> Option<&str> { - sp_std::str::from_utf8(&self.0).ok() + alloc::str::from_utf8(&self.0).ok() } } diff --git a/polkadot/primitives/src/v7/mod.rs b/polkadot/primitives/src/v7/mod.rs index 6b7985847a1..06b70465208 100644 --- a/polkadot/primitives/src/v7/mod.rs +++ b/polkadot/primitives/src/v7/mod.rs @@ -16,15 +16,17 @@ //! `V7` Primitives. +use alloc::{ + vec, + vec::{IntoIter, Vec}, +}; use bitvec::{field::BitField, slice::BitSlice, vec::BitVec}; use codec::{Decode, Encode}; -use scale_info::TypeInfo; -use sp_std::{ +use core::{ marker::PhantomData, - prelude::*, slice::{Iter, IterMut}, - vec::IntoIter, }; +use scale_info::TypeInfo; use sp_application_crypto::KeyTypeId; use sp_arithmetic::traits::{BaseArithmetic, Saturating}; @@ -172,10 +174,10 @@ pub type ValidatorSignature = validator_app::Signature; /// A declarations of storage keys where an external observer can find some interesting data. pub mod well_known_keys { use super::{HrmpChannelId, Id, WellKnownKey}; + use alloc::vec::Vec; use codec::Encode as _; use hex_literal::hex; use sp_io::hashing::twox_64; - use sp_std::prelude::*; // A note on generating these magic values below: // @@ -617,13 +619,13 @@ impl CommittedCandidateReceipt { } impl PartialOrd for CommittedCandidateReceipt { - fn partial_cmp(&self, other: &Self) -> Option { + fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } impl Ord for CommittedCandidateReceipt { - fn cmp(&self, other: &Self) -> sp_std::cmp::Ordering { + fn cmp(&self, other: &Self) -> core::cmp::Ordering { // TODO: compare signatures or something more sane // https://github.com/paritytech/polkadot/issues/222 self.descriptor() @@ -984,7 +986,7 @@ impl GroupRotationInfo { return GroupIndex(0) } - let cores = sp_std::cmp::min(cores, u32::MAX as usize); + let cores = core::cmp::min(cores, u32::MAX as usize); let blocks_since_start = self.now.saturating_sub(self.session_start_block); let rotations = blocks_since_start / self.group_rotation_frequency; @@ -1006,7 +1008,7 @@ impl GroupRotationInfo { return CoreIndex(0) } - let cores = sp_std::cmp::min(cores, u32::MAX as usize); + let cores = core::cmp::min(cores, u32::MAX as usize); let blocks_since_start = self.now.saturating_sub(self.session_start_block); let rotations = blocks_since_start / self.group_rotation_frequency; let rotations = rotations % cores as u32; @@ -1870,7 +1872,7 @@ pub fn effective_minimum_backing_votes( group_len: usize, configured_minimum_backing_votes: u32, ) -> usize { - sp_std::cmp::min(group_len, configured_minimum_backing_votes as usize) + core::cmp::min(group_len, configured_minimum_backing_votes as usize) } /// Information about validator sets of a session. @@ -1966,7 +1968,7 @@ impl PvfCheckStatement { pub struct WellKnownKey { /// The raw storage key. pub key: Vec, - _p: sp_std::marker::PhantomData, + _p: core::marker::PhantomData, } impl From> for WellKnownKey { diff --git a/polkadot/primitives/src/v7/signed.rs b/polkadot/primitives/src/v7/signed.rs index 62e4df23850..f819b379a30 100644 --- a/polkadot/primitives/src/v7/signed.rs +++ b/polkadot/primitives/src/v7/signed.rs @@ -17,11 +17,11 @@ use codec::{Decode, Encode}; use scale_info::TypeInfo; +use alloc::vec::Vec; #[cfg(feature = "std")] use sp_application_crypto::AppCrypto; #[cfg(feature = "std")] use sp_keystore::{Error as KeystoreError, KeystorePtr}; -use sp_std::prelude::Vec; use sp_core::RuntimeDebug; use sp_runtime::traits::AppVerify; @@ -57,7 +57,7 @@ pub struct UncheckedSigned { /// The signature by the validator of the signed payload. signature: ValidatorSignature, /// This ensures the real payload is tracked at the typesystem level. - real_payload: sp_std::marker::PhantomData, + real_payload: core::marker::PhantomData, } impl, RealPayload: Encode> Signed { @@ -163,7 +163,7 @@ impl, RealPayload: Encode> Signed, RealPayload: Encode> Signed, RealPayload: Encode> UncheckedSigned, RealPayload: Encode> UncheckedSigned(sp_std::marker::PhantomData); + pub struct VersionUncheckedMigrateToV1(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV1 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { diff --git a/polkadot/runtime/common/src/assigned_slots/mod.rs b/polkadot/runtime/common/src/assigned_slots/mod.rs index d0a531b8b6c..dd39789e10c 100644 --- a/polkadot/runtime/common/src/assigned_slots/mod.rs +++ b/polkadot/runtime/common/src/assigned_slots/mod.rs @@ -30,6 +30,7 @@ use crate::{ slots::{self, Pallet as Slots, WeightInfo as SlotsWeightInfo}, traits::{LeaseError, Leaser, Registrar}, }; +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{pallet_prelude::*, traits::Currency}; use frame_system::pallet_prelude::*; @@ -41,7 +42,6 @@ use polkadot_runtime_parachains::{ }; use scale_info::TypeInfo; use sp_runtime::traits::{One, Saturating, Zero}; -use sp_std::prelude::*; const LOG_TARGET: &str = "runtime::assigned_slots"; diff --git a/polkadot/runtime/common/src/auctions.rs b/polkadot/runtime/common/src/auctions.rs index 19d82ae85d0..78f20d918ba 100644 --- a/polkadot/runtime/common/src/auctions.rs +++ b/polkadot/runtime/common/src/auctions.rs @@ -22,7 +22,9 @@ use crate::{ slot_range::SlotRange, traits::{AuctionStatus, Auctioneer, LeaseError, Leaser, Registrar}, }; +use alloc::{vec, vec::Vec}; use codec::Decode; +use core::mem::swap; use frame_support::{ dispatch::DispatchResult, ensure, @@ -33,7 +35,6 @@ use frame_system::pallet_prelude::BlockNumberFor; pub use pallet::*; use polkadot_primitives::Id as ParaId; use sp_runtime::traits::{CheckedSub, One, Saturating, Zero}; -use sp_std::{mem::swap, prelude::*}; type CurrencyOf = <::Leaser as Leaser>>::Currency; type BalanceOf = <<::Leaser as Leaser>>::Currency as Currency< diff --git a/polkadot/runtime/common/src/claims.rs b/polkadot/runtime/common/src/claims.rs index c12af215a04..162bf01c384 100644 --- a/polkadot/runtime/common/src/claims.rs +++ b/polkadot/runtime/common/src/claims.rs @@ -16,7 +16,11 @@ //! Pallet to process claims from Ethereum addresses. +#[cfg(not(feature = "std"))] +use alloc::{format, string::String}; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; +use core::fmt::Debug; use frame_support::{ ensure, traits::{Currency, Get, IsSubType, VestingSchedule}, @@ -35,9 +39,6 @@ use sp_runtime::{ }, RuntimeDebug, }; -#[cfg(not(feature = "std"))] -use sp_std::alloc::{format, string::String}; -use sp_std::{fmt::Debug, prelude::*}; type CurrencyOf = <::VestingSchedule as VestingSchedule< ::AccountId, @@ -150,8 +151,8 @@ impl PartialEq for EcdsaSignature { } } -impl sp_std::fmt::Debug for EcdsaSignature { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for EcdsaSignature { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "EcdsaSignature({:?})", &self.0[..]) } } @@ -596,12 +597,12 @@ where ::RuntimeCall: IsSubType>, { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "PrevalidateAttests") } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -612,7 +613,7 @@ where { /// Create new `SignedExtension` to check runtime version. pub fn new() -> Self { - Self(sp_std::marker::PhantomData) + Self(core::marker::PhantomData) } } diff --git a/polkadot/runtime/common/src/crowdloan/migration.rs b/polkadot/runtime/common/src/crowdloan/migration.rs index 3afd6b3fbc9..0ee3872a366 100644 --- a/polkadot/runtime/common/src/crowdloan/migration.rs +++ b/polkadot/runtime/common/src/crowdloan/migration.rs @@ -21,7 +21,7 @@ use frame_support::{ Twox64Concat, }; -pub struct MigrateToTrackInactiveV2(sp_std::marker::PhantomData); +pub struct MigrateToTrackInactiveV2(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToTrackInactiveV2 { fn on_runtime_upgrade() -> Weight { let on_chain_version = Pallet::::on_chain_storage_version(); diff --git a/polkadot/runtime/common/src/crowdloan/mod.rs b/polkadot/runtime/common/src/crowdloan/mod.rs index 61d406aa681..8cf288197e3 100644 --- a/polkadot/runtime/common/src/crowdloan/mod.rs +++ b/polkadot/runtime/common/src/crowdloan/mod.rs @@ -55,6 +55,7 @@ use crate::{ slot_range::SlotRange, traits::{Auctioneer, Registrar}, }; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; use frame_support::{ ensure, @@ -77,7 +78,6 @@ use sp_runtime::{ }, MultiSignature, MultiSigner, RuntimeDebug, }; -use sp_std::vec::Vec; type CurrencyOf = <::Auctioneer as Auctioneer>>::Currency; type LeasePeriodOf = <::Auctioneer as Auctioneer>>::LeasePeriod; @@ -832,16 +832,16 @@ impl Pallet { impl crate::traits::OnSwap for Pallet { fn on_swap(one: ParaId, other: ParaId) { - Funds::::mutate(one, |x| Funds::::mutate(other, |y| sp_std::mem::swap(x, y))) + Funds::::mutate(one, |x| Funds::::mutate(other, |y| core::mem::swap(x, y))) } } #[cfg(any(feature = "runtime-benchmarks", test))] mod crypto { + use alloc::vec::Vec; use sp_core::ed25519; use sp_io::crypto::{ed25519_generate, ed25519_sign}; use sp_runtime::{MultiSignature, MultiSigner}; - use sp_std::vec::Vec; pub fn create_ed25519_pubkey(seed: Vec) -> MultiSigner { ed25519_generate(0.into(), Some(seed)).into() @@ -1968,7 +1968,6 @@ mod benchmarking { use polkadot_runtime_parachains::paras; use sp_core::crypto::UncheckedFrom; use sp_runtime::traits::{Bounded, CheckedSub}; - use sp_std::prelude::*; use frame_benchmarking::{account, benchmarks, whitelisted_caller}; diff --git a/polkadot/runtime/common/src/identity_migrator.rs b/polkadot/runtime/common/src/identity_migrator.rs index 7d02e24b536..126c886280e 100644 --- a/polkadot/runtime/common/src/identity_migrator.rs +++ b/polkadot/runtime/common/src/identity_migrator.rs @@ -172,6 +172,7 @@ impl OnReapIdentity for () { #[benchmarks] mod benchmarks { use super::*; + use alloc::{boxed::Box, vec, vec::Vec}; use codec::Encode; use frame_support::traits::EnsureOrigin; use frame_system::RawOrigin; @@ -180,7 +181,6 @@ mod benchmarks { traits::{Bounded, Hash, StaticLookup}, Saturating, }; - use sp_std::{boxed::Box, vec::Vec, *}; const SEED: u32 = 0; diff --git a/polkadot/runtime/common/src/impls.rs b/polkadot/runtime/common/src/impls.rs index 709cc69cdbe..9d61cd01873 100644 --- a/polkadot/runtime/common/src/impls.rs +++ b/polkadot/runtime/common/src/impls.rs @@ -28,7 +28,7 @@ use sp_runtime::{traits::TryConvert, Perquintill, RuntimeDebug}; use xcm::VersionedLocation; /// Logic for the author to get a portion of fees. -pub struct ToAuthor(sp_std::marker::PhantomData); +pub struct ToAuthor(core::marker::PhantomData); impl OnUnbalanced>> for ToAuthor where R: pallet_balances::Config + pallet_authorship::Config, @@ -44,7 +44,7 @@ where } } -pub struct DealWithFees(sp_std::marker::PhantomData); +pub struct DealWithFees(core::marker::PhantomData); impl OnUnbalanced>> for DealWithFees where R: pallet_balances::Config + pallet_authorship::Config + pallet_treasury::Config, diff --git a/polkadot/runtime/common/src/integration_tests.rs b/polkadot/runtime/common/src/integration_tests.rs index 052fb0389db..7a689a517ea 100644 --- a/polkadot/runtime/common/src/integration_tests.rs +++ b/polkadot/runtime/common/src/integration_tests.rs @@ -24,6 +24,7 @@ use crate::{ slots, traits::{AuctionStatus, Auctioneer, Leaser, Registrar as RegistrarT}, }; +use alloc::sync::Arc; use codec::Encode; use frame_support::{ assert_noop, assert_ok, derive_impl, parameter_types, @@ -50,7 +51,6 @@ use sp_runtime::{ transaction_validity::TransactionPriority, AccountId32, BuildStorage, MultiSignature, }; -use sp_std::sync::Arc; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlockU32; diff --git a/polkadot/runtime/common/src/lib.rs b/polkadot/runtime/common/src/lib.rs index 6e50384f68c..41e1cdbab80 100644 --- a/polkadot/runtime/common/src/lib.rs +++ b/polkadot/runtime/common/src/lib.rs @@ -41,6 +41,8 @@ mod integration_tests; #[cfg(test)] mod mock; +extern crate alloc; + use frame_support::{ parameter_types, traits::{ConstU32, Currency, OneSessionHandler}, @@ -169,7 +171,7 @@ static_assertions::assert_eq_size!(polkadot_primitives::Balance, u128); /// A placeholder since there is currently no provided session key handler for parachain validator /// keys. -pub struct ParachainSessionKeyPlaceholder(sp_std::marker::PhantomData); +pub struct ParachainSessionKeyPlaceholder(core::marker::PhantomData); impl sp_runtime::BoundToRuntimeAppPublic for ParachainSessionKeyPlaceholder { type Public = ValidatorId; } @@ -198,7 +200,7 @@ impl OneSessionHandler /// A placeholder since there is currently no provided session key handler for parachain validator /// keys. -pub struct AssignmentSessionKeyPlaceholder(sp_std::marker::PhantomData); +pub struct AssignmentSessionKeyPlaceholder(core::marker::PhantomData); impl sp_runtime::BoundToRuntimeAppPublic for AssignmentSessionKeyPlaceholder { type Public = AssignmentId; } diff --git a/polkadot/runtime/common/src/mock.rs b/polkadot/runtime/common/src/mock.rs index 6534110cc21..54170b07fa6 100644 --- a/polkadot/runtime/common/src/mock.rs +++ b/polkadot/runtime/common/src/mock.rs @@ -37,7 +37,7 @@ thread_local! { static MANAGERS: RefCell>> = RefCell::new(HashMap::new()); } -pub struct TestRegistrar(sp_std::marker::PhantomData); +pub struct TestRegistrar(core::marker::PhantomData); impl Registrar for TestRegistrar { type AccountId = T::AccountId; diff --git a/polkadot/runtime/common/src/paras_registrar/migration.rs b/polkadot/runtime/common/src/paras_registrar/migration.rs index 18bb6bbfb55..6b110d2ff5d 100644 --- a/polkadot/runtime/common/src/paras_registrar/migration.rs +++ b/polkadot/runtime/common/src/paras_registrar/migration.rs @@ -25,7 +25,7 @@ pub struct ParaInfoV1 { } pub struct VersionUncheckedMigrateToV1( - sp_std::marker::PhantomData<(T, UnlockParaIds)>, + core::marker::PhantomData<(T, UnlockParaIds)>, ); impl> UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV1 diff --git a/polkadot/runtime/common/src/paras_registrar/mod.rs b/polkadot/runtime/common/src/paras_registrar/mod.rs index 606883b7119..07f02e92656 100644 --- a/polkadot/runtime/common/src/paras_registrar/mod.rs +++ b/polkadot/runtime/common/src/paras_registrar/mod.rs @@ -19,6 +19,8 @@ pub mod migration; +use alloc::{vec, vec::Vec}; +use core::result; use frame_support::{ dispatch::DispatchResult, ensure, @@ -34,7 +36,6 @@ use polkadot_runtime_parachains::{ paras::{self, ParaGenesisArgs, UpgradeStrategy}, Origin, ParaLifecycle, }; -use sp_std::{prelude::*, result}; use crate::traits::{OnSwap, Registrar}; use codec::{Decode, Encode}; @@ -210,7 +211,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, pub next_free_para_id: ParaId, } @@ -717,6 +718,7 @@ mod tests { use crate::{ mock::conclude_pvf_checking, paras_registrar, traits::Registrar as RegistrarTrait, }; + use alloc::collections::btree_map::BTreeMap; use frame_support::{ assert_noop, assert_ok, derive_impl, parameter_types, traits::{OnFinalize, OnInitialize}, @@ -733,7 +735,6 @@ mod tests { transaction_validity::TransactionPriority, BuildStorage, Perbill, }; - use sp_std::collections::btree_map::BTreeMap; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlockU32; diff --git a/polkadot/runtime/common/src/paras_sudo_wrapper.rs b/polkadot/runtime/common/src/paras_sudo_wrapper.rs index 3ff8d4ac08e..af93c70b478 100644 --- a/polkadot/runtime/common/src/paras_sudo_wrapper.rs +++ b/polkadot/runtime/common/src/paras_sudo_wrapper.rs @@ -16,6 +16,7 @@ //! A simple wrapper allowing `Sudo` to call into `paras` routines. +use alloc::boxed::Box; use codec::Encode; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; @@ -26,7 +27,6 @@ use polkadot_runtime_parachains::{ paras::{self, AssignCoretime, ParaGenesisArgs}, ParaLifecycle, }; -use sp_std::boxed::Box; #[frame_support::pallet] pub mod pallet { diff --git a/polkadot/runtime/common/src/purchase.rs b/polkadot/runtime/common/src/purchase.rs index eb480e4efe1..d650548b8ac 100644 --- a/polkadot/runtime/common/src/purchase.rs +++ b/polkadot/runtime/common/src/purchase.rs @@ -16,6 +16,7 @@ //! Pallet to process purchase of DOTs. +use alloc::vec::Vec; use codec::{Decode, Encode}; use frame_support::{ pallet_prelude::*, @@ -29,7 +30,6 @@ use sp_runtime::{ traits::{CheckedAdd, Saturating, Verify, Zero}, AnySignature, DispatchError, DispatchResult, Permill, RuntimeDebug, }; -use sp_std::prelude::*; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; diff --git a/polkadot/runtime/common/src/slots/mod.rs b/polkadot/runtime/common/src/slots/mod.rs index 747b7b5ca63..333f14c6608 100644 --- a/polkadot/runtime/common/src/slots/mod.rs +++ b/polkadot/runtime/common/src/slots/mod.rs @@ -25,6 +25,7 @@ pub mod migration; use crate::traits::{LeaseError, Leaser, Registrar}; +use alloc::{vec, vec::Vec}; use frame_support::{ pallet_prelude::*, traits::{Currency, ReservableCurrency}, @@ -34,7 +35,6 @@ use frame_system::pallet_prelude::*; pub use pallet::*; use polkadot_primitives::Id as ParaId; use sp_runtime::traits::{CheckedConversion, CheckedSub, Saturating, Zero}; -use sp_std::prelude::*; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -309,7 +309,7 @@ impl Pallet { // Useful when trying to clean up a parachain leases, as this would tell // you all the balances you need to unreserve. fn all_deposits_held(para: ParaId) -> Vec<(T::AccountId, BalanceOf)> { - let mut tracker = sp_std::collections::btree_map::BTreeMap::new(); + let mut tracker = alloc::collections::btree_map::BTreeMap::new(); Leases::::get(para).into_iter().for_each(|lease| match lease { Some((who, amount)) => match tracker.get(&who) { Some(prev_amount) => @@ -329,7 +329,7 @@ impl Pallet { impl crate::traits::OnSwap for Pallet { fn on_swap(one: ParaId, other: ParaId) { - Leases::::mutate(one, |x| Leases::::mutate(other, |y| sp_std::mem::swap(x, y))) + Leases::::mutate(one, |x| Leases::::mutate(other, |y| core::mem::swap(x, y))) } } diff --git a/polkadot/runtime/common/src/traits.rs b/polkadot/runtime/common/src/traits.rs index eadeac74fcd..6e49abcee98 100644 --- a/polkadot/runtime/common/src/traits.rs +++ b/polkadot/runtime/common/src/traits.rs @@ -16,12 +16,12 @@ //! Traits used across pallets for Polkadot. +use alloc::vec::*; use frame_support::{ dispatch::DispatchResult, traits::{Currency, ReservableCurrency}, }; use polkadot_primitives::{HeadData, Id as ParaId, ValidationCode}; -use sp_std::vec::*; /// Parachain registration API. pub trait Registrar { diff --git a/polkadot/runtime/common/src/try_runtime.rs b/polkadot/runtime/common/src/try_runtime.rs index 81aa34317bf..b22e1703292 100644 --- a/polkadot/runtime/common/src/try_runtime.rs +++ b/polkadot/runtime/common/src/try_runtime.rs @@ -16,13 +16,13 @@ //! Common try-runtime only tests for runtimes. +use alloc::{collections::btree_set::BTreeSet, vec::Vec}; use frame_support::{ dispatch::RawOrigin, traits::{Get, Hooks}, }; use pallet_fast_unstake::{Pallet as FastUnstake, *}; use pallet_staking::*; -use sp_std::{collections::btree_set::BTreeSet, prelude::*}; /// register all inactive nominators for fast-unstake, and progress until they have all been /// processed. diff --git a/polkadot/runtime/common/src/xcm_sender.rs b/polkadot/runtime/common/src/xcm_sender.rs index 5858a0ac3ca..dace785a535 100644 --- a/polkadot/runtime/common/src/xcm_sender.rs +++ b/polkadot/runtime/common/src/xcm_sender.rs @@ -16,7 +16,9 @@ //! XCM sender for relay chain. +use alloc::vec::Vec; use codec::{Decode, Encode}; +use core::marker::PhantomData; use frame_support::traits::Get; use frame_system::pallet_prelude::BlockNumberFor; use polkadot_primitives::Id as ParaId; @@ -25,7 +27,6 @@ use polkadot_runtime_parachains::{ dmp, FeeTracker, }; use sp_runtime::FixedPointNumber; -use sp_std::{marker::PhantomData, prelude::*}; use xcm::prelude::*; use xcm_builder::InspectMessageQueues; use SendError::*; @@ -56,7 +57,7 @@ impl PriceForMessageDelivery for NoPriceForMessageDelivery { } /// Implementation of [`PriceForMessageDelivery`] which returns a fixed price. -pub struct ConstantPrice(sp_std::marker::PhantomData); +pub struct ConstantPrice(core::marker::PhantomData); impl> PriceForMessageDelivery for ConstantPrice { type Id = (); @@ -79,7 +80,7 @@ impl> PriceForMessageDelivery for ConstantPrice { /// - `B`: The base fee to pay for message delivery. /// - `M`: The fee to pay for each and every byte of the message after encoding it. /// - `F`: A fee factor multiplier. It can be understood as the exponent term in the formula. -pub struct ExponentialPrice(sp_std::marker::PhantomData<(A, B, M, F)>); +pub struct ExponentialPrice(core::marker::PhantomData<(A, B, M, F)>); impl, B: Get, M: Get, F: FeeTracker> PriceForMessageDelivery for ExponentialPrice { @@ -169,7 +170,7 @@ pub struct ToParachainDeliveryHelper< ParaId, ToParaIdHelper, >( - sp_std::marker::PhantomData<( + core::marker::PhantomData<( XcmConfig, ExistentialDeposit, PriceForDelivery, @@ -223,7 +224,7 @@ impl< } // overestimate delivery fee - let overestimated_xcm = vec![ClearOrigin; 128].into(); + let overestimated_xcm = alloc::vec![ClearOrigin; 128].into(); let overestimated_fees = PriceForDelivery::price_for_delivery(Parachain::get(), &overestimated_xcm); @@ -258,6 +259,7 @@ impl EnsureForParachain for () { mod tests { use super::*; use crate::integration_tests::new_test_ext; + use alloc::vec; use frame_support::{assert_ok, parameter_types}; use polkadot_runtime_parachains::FeeTracker; use sp_runtime::FixedU128; diff --git a/polkadot/runtime/metrics/Cargo.toml b/polkadot/runtime/metrics/Cargo.toml index 54c685effc1..3709e1eb697 100644 --- a/polkadot/runtime/metrics/Cargo.toml +++ b/polkadot/runtime/metrics/Cargo.toml @@ -10,7 +10,6 @@ description = "Runtime metric interface for the Polkadot node" workspace = true [dependencies] -sp-std = { workspace = true } sp-tracing = { workspace = true } codec = { workspace = true } polkadot-primitives = { workspace = true } @@ -25,7 +24,6 @@ std = [ "codec/std", "frame-benchmarking?/std", "polkadot-primitives/std", - "sp-std/std", "sp-tracing/std", ] runtime-metrics = ["frame-benchmarking", "sp-tracing/with-tracing"] diff --git a/polkadot/runtime/metrics/src/lib.rs b/polkadot/runtime/metrics/src/lib.rs index 6164d71f112..479ec7a69c3 100644 --- a/polkadot/runtime/metrics/src/lib.rs +++ b/polkadot/runtime/metrics/src/lib.rs @@ -22,6 +22,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "runtime-metrics")] mod with_runtime_metrics; #[cfg(feature = "runtime-metrics")] diff --git a/polkadot/runtime/metrics/src/with_runtime_metrics.rs b/polkadot/runtime/metrics/src/with_runtime_metrics.rs index 1339df9ff68..979d5eda9af 100644 --- a/polkadot/runtime/metrics/src/with_runtime_metrics.rs +++ b/polkadot/runtime/metrics/src/with_runtime_metrics.rs @@ -22,14 +22,13 @@ const TRACING_TARGET: &'static str = "metrics"; +use alloc::vec::Vec; use codec::Encode; use polkadot_primitives::{ metric_definitions::{CounterDefinition, CounterVecDefinition, HistogramDefinition}, RuntimeMetricLabelValues, RuntimeMetricOp, RuntimeMetricUpdate, }; -use sp_std::prelude::*; - /// Holds a set of counters that have different values for their labels, /// like Prometheus `CounterVec`. pub struct CounterVec { diff --git a/polkadot/runtime/parachains/Cargo.toml b/polkadot/runtime/parachains/Cargo.toml index 82ba22a70f3..7afdf49fe55 100644 --- a/polkadot/runtime/parachains/Cargo.toml +++ b/polkadot/runtime/parachains/Cargo.toml @@ -21,7 +21,6 @@ bitflags = { workspace = true } sp-api = { workspace = true } sp-inherents = { workspace = true } -sp-std = { workspace = true } sp-io = { workspace = true } sp-runtime = { features = ["serde"], workspace = true } sp-session = { workspace = true } @@ -110,7 +109,6 @@ std = [ "sp-runtime/std", "sp-session/std", "sp-staking/std", - "sp-std/std", "xcm-executor/std", "xcm/std", ] diff --git a/polkadot/runtime/parachains/src/assigner_coretime/mod.rs b/polkadot/runtime/parachains/src/assigner_coretime/mod.rs index e68ac2664b8..9ed007919b8 100644 --- a/polkadot/runtime/parachains/src/assigner_coretime/mod.rs +++ b/polkadot/runtime/parachains/src/assigner_coretime/mod.rs @@ -34,14 +34,13 @@ use crate::{ ParaId, }; +use alloc::{vec, vec::Vec}; use frame_support::{defensive, pallet_prelude::*}; use frame_system::pallet_prelude::*; use pallet_broker::CoreAssignment; use polkadot_primitives::CoreIndex; use sp_runtime::traits::{One, Saturating}; -use sp_std::prelude::*; - pub use pallet::*; /// Fraction expressed as a nominator with an assumed denominator of 57,600. diff --git a/polkadot/runtime/parachains/src/assigner_coretime/tests.rs b/polkadot/runtime/parachains/src/assigner_coretime/tests.rs index bab09eda52c..9b0cbcb2d7d 100644 --- a/polkadot/runtime/parachains/src/assigner_coretime/tests.rs +++ b/polkadot/runtime/parachains/src/assigner_coretime/tests.rs @@ -26,10 +26,10 @@ use crate::{ paras::{ParaGenesisArgs, ParaKind}, scheduler::common::Assignment, }; +use alloc::collections::btree_map::BTreeMap; use frame_support::{assert_noop, assert_ok, pallet_prelude::*, traits::Currency}; use pallet_broker::TaskId; use polkadot_primitives::{BlockNumber, Id as ParaId, SessionIndex, ValidationCode}; -use sp_std::collections::btree_map::BTreeMap; fn schedule_blank_para(id: ParaId, parakind: ParaKind) { let validation_code: ValidationCode = vec![1, 2, 3].into(); diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs b/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs index ba6951a1469..b0ebfe77a96 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs @@ -25,6 +25,7 @@ use crate::{ shared::Pallet as ParasShared, }; +use alloc::vec; use frame_benchmarking::v2::*; use frame_system::RawOrigin; use sp_runtime::traits::Bounded; diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/migration.rs b/polkadot/runtime/parachains/src/assigner_on_demand/migration.rs index 314be11adbe..03f63d7333b 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/migration.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/migration.rs @@ -23,7 +23,7 @@ use frame_support::{ mod v0 { use super::*; - use sp_std::collections::vec_deque::VecDeque; + use alloc::collections::vec_deque::VecDeque; #[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone)] pub(super) struct EnqueuedOrder { @@ -50,7 +50,7 @@ mod v1 { use crate::assigner_on_demand::LOG_TARGET; /// Migration to V1 - pub struct UncheckedMigrateToV1(sp_std::marker::PhantomData); + pub struct UncheckedMigrateToV1(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for UncheckedMigrateToV1 { fn on_runtime_upgrade() -> Weight { let mut weight: Weight = Weight::zero(); @@ -88,7 +88,7 @@ mod v1 { } #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { let n: u32 = v0::OnDemandQueue::::get().len() as u32; log::info!( @@ -100,7 +100,7 @@ mod v1 { } #[cfg(feature = "try-runtime")] - fn post_upgrade(state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { + fn post_upgrade(state: alloc::vec::Vec) -> Result<(), sp_runtime::TryRuntimeError> { log::info!(target: LOG_TARGET, "Running post_upgrade()"); ensure!( diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs index 03f05842bca..f045e957a69 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs @@ -61,7 +61,6 @@ use sp_runtime::{ traits::{AccountIdConversion, One, SaturatedConversion}, FixedPointNumber, FixedPointOperand, FixedU128, Perbill, Saturating, }; -use sp_std::prelude::*; use types::{ BalanceOf, CoreAffinityCount, EnqueuedOrder, QueuePushDirection, QueueStatusType, SpotTrafficCalculationErr, diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs b/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs index a6074b305b4..0bad4346cfd 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs @@ -30,16 +30,14 @@ use crate::{ }, paras::{ParaGenesisArgs, ParaKind}, }; +use alloc::collections::btree_map::BTreeMap; +use core::cmp::{Ord, Ordering}; use frame_support::{assert_noop, assert_ok}; use pallet_balances::Error as BalancesError; use polkadot_primitives::{ BlockNumber, SessionIndex, ValidationCode, ON_DEMAND_MAX_QUEUE_MAX_SIZE, }; use sp_runtime::traits::BadOrigin; -use sp_std::{ - cmp::{Ord, Ordering}, - collections::btree_map::BTreeMap, -}; fn schedule_blank_para(id: ParaId, parakind: ParaKind) { let validation_code: ValidationCode = vec![1, 2, 3].into(); diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/types.rs b/polkadot/runtime/parachains/src/assigner_on_demand/types.rs index 51d586a77a1..96367b971fe 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/types.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/types.rs @@ -18,16 +18,13 @@ use super::{alloc, pallet::Config}; use alloc::collections::BinaryHeap; +use core::cmp::{Ord, Ordering, PartialOrd}; use frame_support::{ pallet_prelude::{Decode, Encode, RuntimeDebug, TypeInfo}, traits::Currency, }; use polkadot_primitives::{CoreIndex, Id as ParaId, ON_DEMAND_MAX_QUEUE_MAX_SIZE}; use sp_runtime::FixedU128; -use sp_std::{ - cmp::{Ord, Ordering, PartialOrd}, - prelude::*, -}; /// Shorthand for the Balance type the runtime is using. pub type BalanceOf = diff --git a/polkadot/runtime/parachains/src/assigner_parachains/tests.rs b/polkadot/runtime/parachains/src/assigner_parachains/tests.rs index 14cb1a89786..817e43a7138 100644 --- a/polkadot/runtime/parachains/src/assigner_parachains/tests.rs +++ b/polkadot/runtime/parachains/src/assigner_parachains/tests.rs @@ -23,9 +23,9 @@ use crate::{ }, paras::{ParaGenesisArgs, ParaKind}, }; +use alloc::collections::btree_map::BTreeMap; use frame_support::{assert_ok, pallet_prelude::*}; use polkadot_primitives::{BlockNumber, Id as ParaId, SessionIndex, ValidationCode}; -use sp_std::collections::btree_map::BTreeMap; fn schedule_blank_para(id: ParaId, parakind: ParaKind) { let validation_code: ValidationCode = vec![1, 2, 3].into(); diff --git a/polkadot/runtime/parachains/src/builder.rs b/polkadot/runtime/parachains/src/builder.rs index c046526ba37..ec07cca2107 100644 --- a/polkadot/runtime/parachains/src/builder.rs +++ b/polkadot/runtime/parachains/src/builder.rs @@ -21,6 +21,11 @@ use crate::{ scheduler::{self, common::AssignmentProvider, CoreOccupied, ParasEntry}, session_info, shared, }; +use alloc::{ + collections::{btree_map::BTreeMap, btree_set::BTreeSet, vec_deque::VecDeque}, + vec, + vec::Vec, +}; use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; @@ -39,11 +44,6 @@ use sp_runtime::{ traits::{Header as HeaderT, One, TrailingZeroInput, Zero}, RuntimeAppPublic, }; -use sp_std::{ - collections::{btree_map::BTreeMap, btree_set::BTreeSet, vec_deque::VecDeque}, - prelude::Vec, - vec, -}; fn mock_validation_code() -> ValidationCode { ValidationCode(vec![1, 2, 3]) @@ -112,7 +112,7 @@ pub(crate) struct BenchBuilder { fill_claimqueue: bool, /// Cores which should not be available when being populated with pending candidates. unavailable_cores: Vec, - _phantom: sp_std::marker::PhantomData, + _phantom: core::marker::PhantomData, } /// Paras inherent `enter` benchmark scenario. @@ -143,7 +143,7 @@ impl BenchBuilder { code_upgrade: None, fill_claimqueue: true, unavailable_cores: vec![], - _phantom: sp_std::marker::PhantomData::, + _phantom: core::marker::PhantomData::, } } diff --git a/polkadot/runtime/parachains/src/configuration.rs b/polkadot/runtime/parachains/src/configuration.rs index bffeab4a0d2..d09962ef2b4 100644 --- a/polkadot/runtime/parachains/src/configuration.rs +++ b/polkadot/runtime/parachains/src/configuration.rs @@ -19,6 +19,7 @@ //! Configuration can change only at session boundaries and is buffered until then. use crate::{inclusion::MAX_UPWARD_MESSAGE_SIZE_BOUND, shared}; +use alloc::vec::Vec; use codec::{Decode, Encode}; use frame_support::{pallet_prelude::*, DefaultNoBound}; use frame_system::pallet_prelude::*; @@ -31,7 +32,6 @@ use polkadot_primitives::{ MAX_POV_SIZE, ON_DEMAND_MAX_QUEUE_MAX_SIZE, }; use sp_runtime::{traits::Zero, Perbill, Percent}; -use sp_std::prelude::*; #[cfg(test)] mod tests; @@ -345,7 +345,7 @@ pub enum InconsistentError { impl HostConfiguration where - BlockNumber: Zero + PartialOrd + sp_std::fmt::Debug + Clone + From, + BlockNumber: Zero + PartialOrd + core::fmt::Debug + Clone + From, { /// Checks that this instance is consistent with the requirements on each individual member. /// @@ -1469,7 +1469,7 @@ impl Pallet { /// The implementation of `Get<(u32, u32)>` which reads `ActiveConfig` and returns `P` percent of /// `hrmp_channel_max_message_size` / `hrmp_channel_max_capacity`. -pub struct ActiveConfigHrmpChannelSizeAndCapacityRatio(sp_std::marker::PhantomData<(T, P)>); +pub struct ActiveConfigHrmpChannelSizeAndCapacityRatio(core::marker::PhantomData<(T, P)>); impl> Get<(u32, u32)> for ActiveConfigHrmpChannelSizeAndCapacityRatio { diff --git a/polkadot/runtime/parachains/src/configuration/migration/v10.rs b/polkadot/runtime/parachains/src/configuration/migration/v10.rs index c53f58faaf0..9375af88306 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v10.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v10.rs @@ -17,6 +17,7 @@ //! A module that is responsible for migration of storage. use crate::configuration::{Config, Pallet}; +use alloc::vec::Vec; use frame_support::{ pallet_prelude::*, traits::{Defensive, UncheckedOnRuntimeUpgrade}, @@ -28,7 +29,6 @@ use polkadot_primitives::{ LEGACY_MIN_BACKING_VOTES, ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, }; use sp_runtime::Perbill; -use sp_std::vec::Vec; use super::v9::V9HostConfiguration; // All configuration of the runtime with respect to paras. @@ -164,7 +164,7 @@ mod v10 { >; } -pub struct VersionUncheckedMigrateToV10(sp_std::marker::PhantomData); +pub struct VersionUncheckedMigrateToV10(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV10 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { diff --git a/polkadot/runtime/parachains/src/configuration/migration/v11.rs b/polkadot/runtime/parachains/src/configuration/migration/v11.rs index 4d1bfc26196..4dce48fe52b 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v11.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v11.rs @@ -17,6 +17,7 @@ //! A module that is responsible for migration of storage. use crate::configuration::{self, Config, Pallet}; +use alloc::vec::Vec; use frame_support::{ migrations::VersionedMigration, pallet_prelude::*, @@ -28,7 +29,6 @@ use polkadot_primitives::{ ApprovalVotingParams, AsyncBackingParams, ExecutorParams, NodeFeatures, SessionIndex, LEGACY_MIN_BACKING_VOTES, ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, }; -use sp_std::vec::Vec; use polkadot_core_primitives::Balance; use sp_arithmetic::Perbill; @@ -177,7 +177,7 @@ pub type MigrateToV11 = VersionedMigration< ::DbWeight, >; -pub struct UncheckedMigrateToV11(sp_std::marker::PhantomData); +pub struct UncheckedMigrateToV11(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for UncheckedMigrateToV11 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { diff --git a/polkadot/runtime/parachains/src/configuration/migration/v12.rs b/polkadot/runtime/parachains/src/configuration/migration/v12.rs index 126597ed845..6b77655687f 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v12.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v12.rs @@ -17,6 +17,7 @@ //! A module that is responsible for migration of storage. use crate::configuration::{self, migration::v11::V11HostConfiguration, Config, Pallet}; +use alloc::vec::Vec; use frame_support::{ migrations::VersionedMigration, pallet_prelude::*, @@ -26,7 +27,6 @@ use frame_system::pallet_prelude::BlockNumberFor; use polkadot_primitives::vstaging::SchedulerParams; use sp_core::Get; use sp_staking::SessionIndex; -use sp_std::vec::Vec; type V12HostConfiguration = configuration::HostConfiguration; @@ -68,7 +68,7 @@ pub type MigrateToV12 = VersionedMigration< ::DbWeight, >; -pub struct UncheckedMigrateToV12(sp_std::marker::PhantomData); +pub struct UncheckedMigrateToV12(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for UncheckedMigrateToV12 { #[cfg(feature = "try-runtime")] diff --git a/polkadot/runtime/parachains/src/configuration/migration/v6.rs b/polkadot/runtime/parachains/src/configuration/migration/v6.rs index bec41d3ea0d..468bf78692a 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v6.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v6.rs @@ -17,13 +17,11 @@ //! Contains the V6 storage definition of the host configuration. use crate::configuration::{Config, Pallet}; +use alloc::vec::Vec; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::BlockNumberFor; -use sp_std::vec::Vec; use polkadot_primitives::{AsyncBackingParams, Balance, ExecutorParams, SessionIndex}; -#[cfg(feature = "try-runtime")] -use sp_std::prelude::*; #[derive(codec::Encode, codec::Decode, Debug, Clone)] pub struct V6HostConfiguration { diff --git a/polkadot/runtime/parachains/src/configuration/migration/v7.rs b/polkadot/runtime/parachains/src/configuration/migration/v7.rs index 8fe4087cf9b..9acd28d0f76 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v7.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v7.rs @@ -17,6 +17,7 @@ //! A module that is responsible for migration of storage. use crate::configuration::{self, Config, Pallet}; +use alloc::vec::Vec; use frame_support::{ pallet_prelude::*, traits::{Defensive, StorageVersion}, @@ -24,7 +25,6 @@ use frame_support::{ }; use frame_system::pallet_prelude::BlockNumberFor; use polkadot_primitives::{AsyncBackingParams, Balance, ExecutorParams, SessionIndex}; -use sp_std::vec::Vec; use frame_support::traits::OnRuntimeUpgrade; @@ -154,7 +154,7 @@ mod v7 { >; } -pub struct MigrateToV7(sp_std::marker::PhantomData); +pub struct MigrateToV7(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV7 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { diff --git a/polkadot/runtime/parachains/src/configuration/migration/v8.rs b/polkadot/runtime/parachains/src/configuration/migration/v8.rs index 0aa7f550b10..81ced74bebb 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v8.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v8.rs @@ -17,6 +17,7 @@ //! A module that is responsible for migration of storage. use crate::configuration::{self, Config, Pallet}; +use alloc::vec::Vec; use frame_support::{ pallet_prelude::*, traits::{Defensive, StorageVersion}, @@ -27,7 +28,6 @@ use polkadot_primitives::{ AsyncBackingParams, Balance, ExecutorParams, SessionIndex, ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, }; use sp_runtime::Perbill; -use sp_std::vec::Vec; use frame_support::traits::OnRuntimeUpgrade; @@ -161,7 +161,7 @@ mod v8 { >; } -pub struct MigrateToV8(sp_std::marker::PhantomData); +pub struct MigrateToV8(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV8 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { diff --git a/polkadot/runtime/parachains/src/configuration/migration/v9.rs b/polkadot/runtime/parachains/src/configuration/migration/v9.rs index 6afdd3cec29..dff5fdb17a6 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v9.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v9.rs @@ -17,6 +17,7 @@ //! A module that is responsible for migration of storage. use crate::configuration::{self, Config, Pallet}; +use alloc::vec::Vec; use frame_support::{ pallet_prelude::*, traits::{Defensive, StorageVersion}, @@ -28,7 +29,6 @@ use polkadot_primitives::{ ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, }; use sp_runtime::Perbill; -use sp_std::vec::Vec; use frame_support::traits::OnRuntimeUpgrade; @@ -164,7 +164,7 @@ mod v9 { >; } -pub struct MigrateToV9(sp_std::marker::PhantomData); +pub struct MigrateToV9(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV9 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { diff --git a/polkadot/runtime/parachains/src/coretime/migration.rs b/polkadot/runtime/parachains/src/coretime/migration.rs index 3f82472da8a..4e750886755 100644 --- a/polkadot/runtime/parachains/src/coretime/migration.rs +++ b/polkadot/runtime/parachains/src/coretime/migration.rs @@ -26,10 +26,12 @@ mod v_coretime { coretime::{mk_coretime_call, Config, PartsOf57600, WeightInfo}, paras, }; + use alloc::{vec, vec::Vec}; #[cfg(feature = "try-runtime")] use codec::Decode; #[cfg(feature = "try-runtime")] use codec::Encode; + use core::{iter, result}; #[cfg(feature = "try-runtime")] use frame_support::ensure; use frame_support::{ @@ -43,9 +45,6 @@ mod v_coretime { use sp_arithmetic::traits::SaturatedConversion; use sp_core::Get; use sp_runtime::BoundedVec; - #[cfg(feature = "try-runtime")] - use sp_std::vec::Vec; - use sp_std::{iter, prelude::*, result}; use xcm::prelude::{send_xcm, Instruction, Junction, Location, SendError, WeightLimit, Xcm}; /// Return information about a legacy lease of a parachain. @@ -59,7 +58,7 @@ mod v_coretime { /// This assumes that the `Coretime` and the `AssignerCoretime` pallets are added at the same /// time to a runtime. pub struct MigrateToCoretime( - sp_std::marker::PhantomData<(T, SendXcm, LegacyLease)>, + core::marker::PhantomData<(T, SendXcm, LegacyLease)>, ); impl>> diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs index fc8a3c7d9d2..1c38b398923 100644 --- a/polkadot/runtime/parachains/src/coretime/mod.rs +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -18,6 +18,8 @@ //! //! +use alloc::{vec, vec::Vec}; +use core::result; use frame_support::{ pallet_prelude::*, traits::{defensive_prelude::*, Currency}, @@ -28,7 +30,6 @@ use pallet_broker::{CoreAssignment, CoreIndex as BrokerCoreIndex}; use polkadot_primitives::{Balance, BlockNumber, CoreIndex, Id as ParaId}; use sp_arithmetic::traits::SaturatedConversion; use sp_runtime::traits::TryConvert; -use sp_std::{prelude::*, result}; use xcm::{ prelude::{send_xcm, Instruction, Junction, Location, OriginKind, SendXcm, WeightLimit, Xcm}, v4::{ diff --git a/polkadot/runtime/parachains/src/disputes.rs b/polkadot/runtime/parachains/src/disputes.rs index 4a0f2390b45..f86573dadf5 100644 --- a/polkadot/runtime/parachains/src/disputes.rs +++ b/polkadot/runtime/parachains/src/disputes.rs @@ -19,8 +19,10 @@ use crate::{ configuration, initializer::SessionChangeNotification, metrics::METRICS, session_info, }; +use alloc::{collections::btree_set::BTreeSet, vec::Vec}; use bitvec::{bitvec, order::Lsb0 as BitOrderLsb0}; use codec::{Decode, Encode}; +use core::cmp::Ordering; use frame_support::{ensure, weights::Weight}; use frame_system::pallet_prelude::*; use polkadot_primitives::{ @@ -36,7 +38,6 @@ use sp_runtime::{ traits::{AppVerify, One, Saturating, Zero}, DispatchError, RuntimeDebug, SaturatedConversion, }; -use sp_std::{cmp::Ordering, collections::btree_set::BTreeSet, prelude::*}; #[cfg(test)] #[allow(unused_imports)] diff --git a/polkadot/runtime/parachains/src/disputes/migration.rs b/polkadot/runtime/parachains/src/disputes/migration.rs index e12edffb51b..dd32340c9f6 100644 --- a/polkadot/runtime/parachains/src/disputes/migration.rs +++ b/polkadot/runtime/parachains/src/disputes/migration.rs @@ -21,16 +21,16 @@ use frame_support::traits::StorageVersion; pub mod v1 { use super::*; use crate::disputes::{Config, Pallet}; + use alloc::vec::Vec; use frame_support::{ pallet_prelude::*, storage_alias, traits::OnRuntimeUpgrade, weights::Weight, }; use polkadot_primitives::SessionIndex; - use sp_std::prelude::*; #[storage_alias] type SpamSlots = StorageMap, Twox64Concat, SessionIndex, Vec>; - pub struct MigrateToV1(sp_std::marker::PhantomData); + pub struct MigrateToV1(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { let mut weight: Weight = Weight::zero(); diff --git a/polkadot/runtime/parachains/src/disputes/slashing.rs b/polkadot/runtime/parachains/src/disputes/slashing.rs index b50853ecc69..4b76fb47e1f 100644 --- a/polkadot/runtime/parachains/src/disputes/slashing.rs +++ b/polkadot/runtime/parachains/src/disputes/slashing.rs @@ -50,6 +50,12 @@ use frame_support::{ }; use frame_system::pallet_prelude::BlockNumberFor; +use alloc::{ + boxed::Box, + collections::{btree_map::Entry, btree_set::BTreeSet}, + vec, + vec::Vec, +}; use polkadot_primitives::{ slashing::{DisputeProof, DisputesTimeSlot, PendingSlashes, SlashingOffenceKind}, CandidateHash, SessionIndex, ValidatorId, ValidatorIndex, @@ -65,10 +71,6 @@ use sp_runtime::{ }; use sp_session::{GetSessionNumber, GetValidatorCount}; use sp_staking::offence::{Kind, Offence, OffenceError, ReportOffence}; -use sp_std::{ - collections::{btree_map::Entry, btree_set::BTreeSet}, - prelude::*, -}; const LOG_TARGET: &str = "runtime::parachains::slashing"; @@ -158,7 +160,7 @@ impl SlashingOffence { /// This type implements `SlashingHandler`. pub struct SlashValidatorsForDisputes { - _phantom: sp_std::marker::PhantomData, + _phantom: core::marker::PhantomData, } impl Default for SlashValidatorsForDisputes { @@ -640,7 +642,7 @@ fn is_known_offence( /// When configured properly, should be instantiated with /// `T::KeyOwnerIdentification, Offences, ReportLongevity` parameters. pub struct SlashingReportHandler { - _phantom: sp_std::marker::PhantomData<(I, R, L)>, + _phantom: core::marker::PhantomData<(I, R, L)>, } impl Default for SlashingReportHandler { diff --git a/polkadot/runtime/parachains/src/dmp.rs b/polkadot/runtime/parachains/src/dmp.rs index c0e1635ba16..54e112d1b8b 100644 --- a/polkadot/runtime/parachains/src/dmp.rs +++ b/polkadot/runtime/parachains/src/dmp.rs @@ -46,6 +46,8 @@ use crate::{ configuration::{self, HostConfiguration}, initializer, FeeTracker, }; +use alloc::vec::Vec; +use core::fmt; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::BlockNumberFor; use polkadot_primitives::{DownwardMessage, Hash, Id as ParaId, InboundDownwardMessage}; @@ -54,7 +56,6 @@ use sp_runtime::{ traits::{BlakeTwo256, Hash as HashT, SaturatedConversion}, FixedU128, Saturating, }; -use sp_std::{fmt, prelude::*}; use xcm::latest::SendError; pub use pallet::*; diff --git a/polkadot/runtime/parachains/src/hrmp.rs b/polkadot/runtime/parachains/src/hrmp.rs index e34e4a03e71..8b01a755c3c 100644 --- a/polkadot/runtime/parachains/src/hrmp.rs +++ b/polkadot/runtime/parachains/src/hrmp.rs @@ -18,7 +18,13 @@ use crate::{ configuration::{self, HostConfiguration}, dmp, ensure_parachain, initializer, paras, }; +use alloc::{ + collections::{btree_map::BTreeMap, btree_set::BTreeSet}, + vec, + vec::Vec, +}; use codec::{Decode, Encode}; +use core::{fmt, mem}; use frame_support::{pallet_prelude::*, traits::ReservableCurrency, DefaultNoBound}; use frame_system::pallet_prelude::*; use polkadot_parachain_primitives::primitives::{HorizontalMessages, IsSystem}; @@ -31,11 +37,6 @@ use sp_runtime::{ traits::{AccountIdConversion, BlakeTwo256, Hash as HashT, UniqueSaturatedInto, Zero}, ArithmeticError, }; -use sp_std::{ - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - fmt, mem, - prelude::*, -}; pub use pallet::*; @@ -487,7 +488,7 @@ pub mod pallet { #[derive(DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - _config: sp_std::marker::PhantomData, + _config: core::marker::PhantomData, preopen_hrmp_channels: Vec<(ParaId, ParaId, u32, u32)>, } diff --git a/polkadot/runtime/parachains/src/inclusion/migration.rs b/polkadot/runtime/parachains/src/inclusion/migration.rs index a340d52643e..36a810d341c 100644 --- a/polkadot/runtime/parachains/src/inclusion/migration.rs +++ b/polkadot/runtime/parachains/src/inclusion/migration.rs @@ -73,9 +73,9 @@ mod v1 { CandidatePendingAvailability as V1CandidatePendingAvailability, Config, Pallet, PendingAvailability as V1PendingAvailability, }; + use alloc::{collections::vec_deque::VecDeque, vec::Vec}; use frame_support::{traits::UncheckedOnRuntimeUpgrade, weights::Weight}; use sp_core::Get; - use sp_std::{collections::vec_deque::VecDeque, vec::Vec}; #[cfg(feature = "try-runtime")] use codec::{Decode, Encode}; @@ -85,7 +85,7 @@ mod v1 { traits::{GetStorageVersion, StorageVersion}, }; - pub struct VersionUncheckedMigrateToV1(sp_std::marker::PhantomData); + pub struct VersionUncheckedMigrateToV1(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV1 { #[cfg(feature = "try-runtime")] diff --git a/polkadot/runtime/parachains/src/inclusion/mod.rs b/polkadot/runtime/parachains/src/inclusion/mod.rs index a86941a1a0b..281dc5d0c5f 100644 --- a/polkadot/runtime/parachains/src/inclusion/mod.rs +++ b/polkadot/runtime/parachains/src/inclusion/mod.rs @@ -27,8 +27,15 @@ use crate::{ shared::{self, AllowedRelayParentsTracker}, util::make_persisted_validation_data_with_parent, }; +use alloc::{ + collections::{btree_map::BTreeMap, btree_set::BTreeSet, vec_deque::VecDeque}, + vec, + vec::Vec, +}; use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; use codec::{Decode, Encode}; +#[cfg(feature = "std")] +use core::fmt; use frame_support::{ defensive, pallet_prelude::*, @@ -46,12 +53,6 @@ use polkadot_primitives::{ }; use scale_info::TypeInfo; use sp_runtime::{traits::One, DispatchError, SaturatedConversion, Saturating}; -#[cfg(feature = "std")] -use sp_std::fmt; -use sp_std::{ - collections::{btree_map::BTreeMap, btree_set::BTreeSet, vec_deque::VecDeque}, - prelude::*, -}; pub use pallet::*; diff --git a/polkadot/runtime/parachains/src/initializer.rs b/polkadot/runtime/parachains/src/initializer.rs index fd0f1c3c065..340f727097b 100644 --- a/polkadot/runtime/parachains/src/initializer.rs +++ b/polkadot/runtime/parachains/src/initializer.rs @@ -25,6 +25,7 @@ use crate::{ disputes::{self, DisputesHandler as _, SlashingHandler as _}, dmp, hrmp, inclusion, paras, scheduler, session_info, shared, }; +use alloc::vec::Vec; use codec::{Decode, Encode}; use frame_support::{ traits::{OneSessionHandler, Randomness}, @@ -33,7 +34,6 @@ use frame_support::{ use frame_system::limits::BlockWeights; use polkadot_primitives::{BlockNumber, ConsensusLog, SessionIndex, ValidatorId}; use scale_info::TypeInfo; -use sp_std::prelude::*; #[cfg(test)] mod tests; @@ -249,7 +249,7 @@ impl Pallet { // TODO: audit usage of randomness API // https://github.com/paritytech/polkadot/issues/2601 let (random_hash, _) = T::Randomness::random(&b"paras"[..]); - let len = sp_std::cmp::min(32, random_hash.as_ref().len()); + let len = core::cmp::min(32, random_hash.as_ref().len()); buf[..len].copy_from_slice(&random_hash.as_ref()[..len]); buf }; diff --git a/polkadot/runtime/parachains/src/lib.rs b/polkadot/runtime/parachains/src/lib.rs index 51110e89416..f2995d770e7 100644 --- a/polkadot/runtime/parachains/src/lib.rs +++ b/polkadot/runtime/parachains/src/lib.rs @@ -53,6 +53,8 @@ mod mock; #[cfg(test)] mod ump_tests; +extern crate alloc; + pub use origin::{ensure_parachain, Origin}; pub use paras::{ParaLifecycle, UpgradeStrategy}; use polkadot_primitives::{HeadData, Id as ParaId, ValidationCode}; diff --git a/polkadot/runtime/parachains/src/mock.rs b/polkadot/runtime/parachains/src/mock.rs index 9c23347ebb5..45576668f6d 100644 --- a/polkadot/runtime/parachains/src/mock.rs +++ b/polkadot/runtime/parachains/src/mock.rs @@ -51,11 +51,10 @@ use sp_runtime::{ transaction_validity::TransactionPriority, BuildStorage, FixedU128, Perbill, Permill, }; -use sp_std::{ +use std::{ cell::RefCell, - collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + collections::{btree_map::BTreeMap, vec_deque::VecDeque, HashMap}, }; -use std::collections::HashMap; use xcm::{ prelude::XcmVersion, v4::{Assets, InteriorLocation, Location, SendError, SendResult, SendXcm, Xcm, XcmHash}, @@ -677,7 +676,7 @@ impl inclusion::RewardValidators for TestRewardValidators { /// Create a new set of test externalities. pub fn new_test_ext(state: MockGenesisConfig) -> TestExternalities { use sp_keystore::{testing::MemoryKeystore, KeystoreExt, KeystorePtr}; - use sp_std::sync::Arc; + use std::sync::Arc; sp_tracing::try_init_simple(); diff --git a/polkadot/runtime/parachains/src/origin.rs b/polkadot/runtime/parachains/src/origin.rs index 5202cba232d..fd22929b08f 100644 --- a/polkadot/runtime/parachains/src/origin.rs +++ b/polkadot/runtime/parachains/src/origin.rs @@ -16,9 +16,9 @@ //! Declaration of the parachain specific origin and a pallet that hosts it. +use core::result; use polkadot_primitives::Id as ParaId; use sp_runtime::traits::BadOrigin; -use sp_std::result; pub use pallet::*; diff --git a/polkadot/runtime/parachains/src/paras/benchmarking.rs b/polkadot/runtime/parachains/src/paras/benchmarking.rs index 0f3318612a7..630b86132ab 100644 --- a/polkadot/runtime/parachains/src/paras/benchmarking.rs +++ b/polkadot/runtime/parachains/src/paras/benchmarking.rs @@ -16,6 +16,7 @@ use super::*; use crate::configuration::HostConfiguration; +use alloc::vec; use frame_benchmarking::benchmarks; use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; use polkadot_primitives::{ diff --git a/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs b/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs index 0bf5fe783a0..80443c7626e 100644 --- a/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs +++ b/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs @@ -17,6 +17,7 @@ //! This module focuses on the benchmarking of the `include_pvf_check_statement` dispatchable. use crate::{configuration, paras::*, shared::Pallet as ParasShared}; +use alloc::{vec, vec::Vec}; use frame_support::assert_ok; use frame_system::RawOrigin; use polkadot_primitives::{HeadData, Id as ParaId, ValidationCode, ValidatorId, ValidatorIndex}; diff --git a/polkadot/runtime/parachains/src/paras/mod.rs b/polkadot/runtime/parachains/src/paras/mod.rs index 8cffcbbbb02..3f0b8659b15 100644 --- a/polkadot/runtime/parachains/src/paras/mod.rs +++ b/polkadot/runtime/parachains/src/paras/mod.rs @@ -113,8 +113,10 @@ use crate::{ initializer::SessionChangeNotification, shared, }; +use alloc::{collections::btree_set::BTreeSet, vec::Vec}; use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; use codec::{Decode, Encode}; +use core::{cmp, mem}; use frame_support::{pallet_prelude::*, traits::EstimateNextSessionRotation, DefaultNoBound}; use frame_system::pallet_prelude::*; use polkadot_primitives::{ @@ -127,7 +129,6 @@ use sp_runtime::{ traits::{AppVerify, One, Saturating}, DispatchResult, SaturatedConversion, }; -use sp_std::{cmp, collections::btree_set::BTreeSet, mem, prelude::*}; use serde::{Deserialize, Serialize}; @@ -863,7 +864,7 @@ pub mod pallet { #[derive(DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, pub paras: Vec<(ParaId, ParaGenesisArgs)>, } diff --git a/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs b/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs index 4c8b093451e..c5284ba1dd1 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs @@ -16,9 +16,10 @@ use super::*; use crate::{inclusion, ParaId}; +use alloc::collections::btree_map::BTreeMap; +use core::cmp::min; use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; use frame_system::RawOrigin; -use sp_std::{cmp::min, collections::btree_map::BTreeMap}; use polkadot_primitives::v7::GroupIndex; diff --git a/polkadot/runtime/parachains/src/paras_inherent/misc.rs b/polkadot/runtime/parachains/src/paras_inherent/misc.rs index dac9e6e256d..2858c3f95de 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/misc.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/misc.rs @@ -14,7 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use sp_std::{cmp::Ordering, vec::Vec}; +use alloc::vec::Vec; +use core::cmp::Ordering; /// A helper trait to allow calling retain while getting access /// to the index of the item in the `vec`. diff --git a/polkadot/runtime/parachains/src/paras_inherent/mod.rs b/polkadot/runtime/parachains/src/paras_inherent/mod.rs index 8b527c09490..fe4eef16f02 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/mod.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/mod.rs @@ -32,6 +32,11 @@ use crate::{ shared::{self, AllowedRelayParentsTracker}, ParaId, }; +use alloc::{ + collections::{btree_map::BTreeMap, btree_set::BTreeSet}, + vec, + vec::Vec, +}; use bitvec::prelude::BitVec; use frame_support::{ defensive, @@ -53,11 +58,6 @@ use polkadot_primitives::{ use rand::{seq::SliceRandom, SeedableRng}; use scale_info::TypeInfo; use sp_runtime::traits::{Header as HeaderT, One}; -use sp_std::{ - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - prelude::*, - vec::Vec, -}; mod misc; mod weights; @@ -295,7 +295,7 @@ impl Pallet { fn process_inherent_data( data: ParachainsInherentData>, context: ProcessInherentDataContext, - ) -> sp_std::result::Result< + ) -> core::result::Result< (ParachainsInherentData>, PostDispatchInfo), DispatchErrorWithPostInfo, > { @@ -762,7 +762,7 @@ pub(crate) fn apply_weight_limit( let mut chained_candidates: Vec> = Vec::new(); let mut current_para_id = None; - for candidate in sp_std::mem::take(candidates).into_iter() { + for candidate in core::mem::take(candidates).into_iter() { let candidate_para_id = candidate.descriptor().para_id; if Some(candidate_para_id) == current_para_id { let chain = chained_candidates diff --git a/polkadot/runtime/parachains/src/paras_inherent/tests.rs b/polkadot/runtime/parachains/src/paras_inherent/tests.rs index abf1c1a56b2..0d5653eb729 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/tests.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/tests.rs @@ -53,13 +53,13 @@ mod enter { }, session_info, }; + use alloc::collections::btree_map::BTreeMap; use assert_matches::assert_matches; use core::panic; use frame_support::assert_ok; use frame_system::limits; use polkadot_primitives::{vstaging::SchedulerParams, AvailabilityBitfield, UncheckedSigned}; use sp_runtime::Perbill; - use sp_std::collections::btree_map::BTreeMap; struct TestConfig { dispute_statements: BTreeMap, @@ -1744,8 +1744,8 @@ mod sanitizers { scheduler::{common::Assignment, ParasEntry}, util::{make_persisted_validation_data, make_persisted_validation_data_with_parent}, }; + use alloc::collections::vec_deque::VecDeque; use polkadot_primitives::ValidationCode; - use sp_std::collections::vec_deque::VecDeque; use super::*; diff --git a/polkadot/runtime/parachains/src/reward_points.rs b/polkadot/runtime/parachains/src/reward_points.rs index 5f45445b0ba..69ef2db756c 100644 --- a/polkadot/runtime/parachains/src/reward_points.rs +++ b/polkadot/runtime/parachains/src/reward_points.rs @@ -22,9 +22,9 @@ //! for the time being, although we will build schemes to do so in the future. use crate::{session_info, shared}; +use alloc::collections::btree_set::BTreeSet; use frame_support::traits::{Defensive, ValidatorSet}; use polkadot_primitives::{SessionIndex, ValidatorIndex}; -use sp_std::collections::btree_set::BTreeSet; /// The amount of era points given by backing a candidate that is included. pub const BACKING_POINTS: u32 = 20; @@ -32,7 +32,7 @@ pub const BACKING_POINTS: u32 = 20; pub const DISPUTE_STATEMENT_POINTS: u32 = 20; /// Rewards validators for participating in parachains with era points in pallet-staking. -pub struct RewardValidatorsWithEraPoints(sp_std::marker::PhantomData); +pub struct RewardValidatorsWithEraPoints(core::marker::PhantomData); impl RewardValidatorsWithEraPoints where diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/v10.rs b/polkadot/runtime/parachains/src/runtime_api_impl/v10.rs index 4417ec75abd..69789023221 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/v10.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/v10.rs @@ -22,6 +22,7 @@ use crate::{ scheduler::{self, CoreOccupied}, session_info, shared, }; +use alloc::{collections::btree_map::BTreeMap, vec, vec::Vec}; use frame_support::traits::{GetStorageVersion, StorageVersion}; use frame_system::pallet_prelude::*; use polkadot_primitives::{ @@ -37,7 +38,6 @@ use polkadot_primitives::{ ValidatorId, ValidatorIndex, ValidatorSignature, }; use sp_runtime::traits::One; -use sp_std::{collections::btree_map::BTreeMap, prelude::*}; /// Implementation for the `validators` function of the runtime API. pub fn validators() -> Vec { diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs b/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs index f4e3db185fe..4aa381e33b1 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs @@ -17,12 +17,12 @@ //! Put implementations of functions from staging APIs here. use crate::{configuration, inclusion, initializer, scheduler}; -use polkadot_primitives::{CommittedCandidateReceipt, CoreIndex, Id as ParaId}; -use sp_runtime::traits::One; -use sp_std::{ +use alloc::{ collections::{btree_map::BTreeMap, vec_deque::VecDeque}, vec::Vec, }; +use polkadot_primitives::{CommittedCandidateReceipt, CoreIndex, Id as ParaId}; +use sp_runtime::traits::One; /// Returns the claimqueue from the scheduler pub fn claim_queue() -> BTreeMap> { diff --git a/polkadot/runtime/parachains/src/scheduler.rs b/polkadot/runtime/parachains/src/scheduler.rs index d7fe5c06863..445583d929a 100644 --- a/polkadot/runtime/parachains/src/scheduler.rs +++ b/polkadot/runtime/parachains/src/scheduler.rs @@ -39,6 +39,13 @@ use core::iter::Peekable; use crate::{configuration, initializer::SessionChangeNotification, paras}; +use alloc::{ + collections::{ + btree_map::{self, BTreeMap}, + vec_deque::VecDeque, + }, + vec::Vec, +}; use frame_support::{pallet_prelude::*, traits::Defensive}; use frame_system::pallet_prelude::BlockNumberFor; pub use polkadot_core_primitives::v2::BlockNumber; @@ -46,13 +53,6 @@ use polkadot_primitives::{ CoreIndex, GroupIndex, GroupRotationInfo, Id as ParaId, ScheduledCore, ValidatorIndex, }; use sp_runtime::traits::One; -use sp_std::{ - collections::{ - btree_map::{self, BTreeMap}, - vec_deque::VecDeque, - }, - prelude::*, -}; pub mod common; @@ -314,10 +314,8 @@ impl Pallet { .into_iter() .filter(|(freed_index, _)| (freed_index.0 as usize) < c_len) .for_each(|(freed_index, freed_reason)| { - match sp_std::mem::replace( - &mut cores[freed_index.0 as usize], - CoreOccupied::Free, - ) { + match core::mem::replace(&mut cores[freed_index.0 as usize], CoreOccupied::Free) + { CoreOccupied::Free => {}, CoreOccupied::Paras(entry) => { match freed_reason { @@ -569,7 +567,7 @@ impl Pallet { fn push_occupied_cores_to_assignment_provider() { AvailabilityCores::::mutate(|cores| { for core in cores.iter_mut() { - match sp_std::mem::replace(core, CoreOccupied::Free) { + match core::mem::replace(core, CoreOccupied::Free) { CoreOccupied::Free => continue, CoreOccupied::Paras(entry) => { Self::maybe_push_assignment(entry); diff --git a/polkadot/runtime/parachains/src/scheduler/migration.rs b/polkadot/runtime/parachains/src/scheduler/migration.rs index 84d7d4b5671..125f105ef70 100644 --- a/polkadot/runtime/parachains/src/scheduler/migration.rs +++ b/polkadot/runtime/parachains/src/scheduler/migration.rs @@ -17,6 +17,7 @@ //! A module that is responsible for migration of storage. use super::*; +use alloc::vec::Vec; use frame_support::{ migrations::VersionedMigration, pallet_prelude::ValueQuery, storage_alias, traits::UncheckedOnRuntimeUpgrade, weights::Weight, @@ -164,7 +165,7 @@ mod v1 { } /// Migration to V1 - pub struct UncheckedMigrateToV1(sp_std::marker::PhantomData); + pub struct UncheckedMigrateToV1(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for UncheckedMigrateToV1 { fn on_runtime_upgrade() -> Weight { let mut weight: Weight = Weight::zero(); @@ -301,7 +302,7 @@ mod v2 { } /// Migration to V2 - pub struct UncheckedMigrateToV2(sp_std::marker::PhantomData); + pub struct UncheckedMigrateToV2(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for UncheckedMigrateToV2 { fn on_runtime_upgrade() -> Weight { diff --git a/polkadot/runtime/parachains/src/scheduler/tests.rs b/polkadot/runtime/parachains/src/scheduler/tests.rs index 32811241e17..f3866146e81 100644 --- a/polkadot/runtime/parachains/src/scheduler/tests.rs +++ b/polkadot/runtime/parachains/src/scheduler/tests.rs @@ -16,12 +16,12 @@ use super::*; +use alloc::collections::{btree_map::BTreeMap, btree_set::BTreeSet}; use frame_support::assert_ok; use polkadot_primitives::{ vstaging::SchedulerParams, BlockNumber, SessionIndex, ValidationCode, ValidatorId, }; use sp_keyring::Sr25519Keyring; -use sp_std::collections::{btree_map::BTreeMap, btree_set::BTreeSet}; use crate::{ configuration::HostConfiguration, diff --git a/polkadot/runtime/parachains/src/session_info.rs b/polkadot/runtime/parachains/src/session_info.rs index ff032f7e34d..ea05c1aacaa 100644 --- a/polkadot/runtime/parachains/src/session_info.rs +++ b/polkadot/runtime/parachains/src/session_info.rs @@ -24,6 +24,7 @@ use crate::{ configuration, paras, scheduler, shared, util::{take_active_subset, take_active_subset_and_inactive}, }; +use alloc::vec::Vec; use frame_support::{ pallet_prelude::*, traits::{OneSessionHandler, ValidatorSet, ValidatorSetWithIdentification}, @@ -32,7 +33,6 @@ use frame_system::pallet_prelude::BlockNumberFor; use polkadot_primitives::{ AssignmentId, AuthorityDiscoveryId, ExecutorParams, SessionIndex, SessionInfo, }; -use sp_std::vec::Vec; pub use pallet::*; diff --git a/polkadot/runtime/parachains/src/shared.rs b/polkadot/runtime/parachains/src/shared.rs index 417de1fa3fb..154b7cfefc3 100644 --- a/polkadot/runtime/parachains/src/shared.rs +++ b/polkadot/runtime/parachains/src/shared.rs @@ -19,14 +19,14 @@ //! To avoid cyclic dependencies, it is important that this pallet is not //! dependent on any of the other pallets. +use alloc::{ + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + vec::Vec, +}; use frame_support::{pallet_prelude::*, traits::DisabledValidators}; use frame_system::pallet_prelude::BlockNumberFor; use polkadot_primitives::{SessionIndex, ValidatorId, ValidatorIndex}; use sp_runtime::traits::AtLeast32BitUnsigned; -use sp_std::{ - collections::{btree_map::BTreeMap, vec_deque::VecDeque}, - vec::Vec, -}; use rand::{seq::SliceRandom, SeedableRng}; use rand_chacha::ChaCha20Rng; diff --git a/polkadot/runtime/parachains/src/ump_tests.rs b/polkadot/runtime/parachains/src/ump_tests.rs index 4d6da8c9e3c..d914bf8b666 100644 --- a/polkadot/runtime/parachains/src/ump_tests.rs +++ b/polkadot/runtime/parachains/src/ump_tests.rs @@ -34,7 +34,6 @@ use frame_support::{ use polkadot_primitives::{well_known_keys, Id as ParaId, UpwardMessage}; use sp_crypto_hashing::{blake2_256, twox_64}; use sp_runtime::traits::Bounded; -use sp_std::prelude::*; pub(super) struct GenesisConfigBuilder { max_upward_message_size: u32, diff --git a/polkadot/runtime/parachains/src/util.rs b/polkadot/runtime/parachains/src/util.rs index cb2deffd7f6..3588e494438 100644 --- a/polkadot/runtime/parachains/src/util.rs +++ b/polkadot/runtime/parachains/src/util.rs @@ -17,9 +17,9 @@ //! Utilities that don't belong to any particular module but may draw //! on all modules. +use alloc::{collections::btree_set::BTreeSet, vec::Vec}; use frame_system::pallet_prelude::BlockNumberFor; use polkadot_primitives::{HeadData, Id as ParaId, PersistedValidationData, ValidatorIndex}; -use sp_std::{collections::btree_set::BTreeSet, vec::Vec}; use crate::{configuration, hrmp, paras}; @@ -118,7 +118,7 @@ pub fn take_active_subset(active: &[ValidatorIndex], set: &[T]) -> Vec #[cfg(test)] mod tests { - use sp_std::vec::Vec; + use alloc::vec::Vec; use crate::util::{split_active_subset, take_active_subset}; use polkadot_primitives::ValidatorIndex; diff --git a/polkadot/runtime/rococo/Cargo.toml b/polkadot/runtime/rococo/Cargo.toml index c4fbd461a63..f93a3ad6575 100644 --- a/polkadot/runtime/rococo/Cargo.toml +++ b/polkadot/runtime/rococo/Cargo.toml @@ -32,7 +32,6 @@ sp-genesis-builder = { workspace = true } sp-inherents = { workspace = true } sp-offchain = { workspace = true } sp-arithmetic = { workspace = true } -sp-std = { workspace = true } sp-io = { workspace = true } sp-mmr-primitives = { workspace = true } sp-runtime = { workspace = true } @@ -209,7 +208,6 @@ std = [ "sp-runtime/std", "sp-session/std", "sp-staking/std", - "sp-std/std", "sp-storage/std", "sp-tracing/std", "sp-transaction-pool/std", diff --git a/polkadot/runtime/rococo/src/genesis_config_presets.rs b/polkadot/runtime/rococo/src/genesis_config_presets.rs index 1c70c94ce04..67dcd6cd7a5 100644 --- a/polkadot/runtime/rococo/src/genesis_config_presets.rs +++ b/polkadot/runtime/rococo/src/genesis_config_presets.rs @@ -17,6 +17,9 @@ //! Genesis configs presets for the Rococo runtime use crate::{SessionKeys, BABE_GENESIS_EPOCH_CONFIG}; +#[cfg(not(feature = "std"))] +use alloc::format; +use alloc::vec::Vec; use polkadot_primitives::{ vstaging::SchedulerParams, AccountId, AccountPublic, AssignmentId, ValidatorId, }; @@ -27,9 +30,6 @@ use sp_consensus_beefy::ecdsa_crypto::AuthorityId as BeefyId; use sp_consensus_grandpa::AuthorityId as GrandpaId; use sp_core::{sr25519, Pair, Public}; use sp_runtime::traits::IdentifyAccount; -#[cfg(not(feature = "std"))] -use sp_std::alloc::format; -use sp_std::vec::Vec; /// Helper function to generate a crypto pair from seed fn get_from_seed(seed: &str) -> ::Public { @@ -530,7 +530,7 @@ fn wococo_local_testnet_genesis() -> serde_json::Value { } /// Provides the JSON representation of predefined genesis config for given `id`. -pub fn get_preset(id: &sp_genesis_builder::PresetId) -> Option> { +pub fn get_preset(id: &sp_genesis_builder::PresetId) -> Option> { let patch = match id.try_into() { Ok("local_testnet") => rococo_local_testnet_genesis(), Ok("development") => rococo_development_config_genesis(), diff --git a/polkadot/runtime/rococo/src/impls.rs b/polkadot/runtime/rococo/src/impls.rs index 7b5c7b1fb4a..a4440a1c6e0 100644 --- a/polkadot/runtime/rococo/src/impls.rs +++ b/polkadot/runtime/rococo/src/impls.rs @@ -15,13 +15,14 @@ // along with Polkadot. If not, see . use crate::xcm_config; +use alloc::{boxed::Box, vec}; use codec::{Decode, Encode}; +use core::marker::PhantomData; use frame_support::pallet_prelude::DispatchResult; use frame_system::RawOrigin; use polkadot_primitives::Balance; use polkadot_runtime_common::identity_migrator::{OnReapIdentity, WeightInfo}; use rococo_runtime_constants::currency::*; -use sp_std::{marker::PhantomData, prelude::*}; use xcm::{latest::prelude::*, VersionedLocation, VersionedXcm}; use xcm_executor::traits::TransactAsset; diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index ef629c7dad1..5adffbd7422 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -20,7 +20,15 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limit. #![recursion_limit = "512"] +extern crate alloc; + +use alloc::{ + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + vec, + vec::Vec, +}; use codec::{Decode, Encode, MaxEncodedLen}; +use core::cmp::Ordering; use frame_support::{ dynamic_params::{dynamic_pallet_params, dynamic_params}, traits::FromContains, @@ -68,11 +76,6 @@ use sp_consensus_beefy::{ mmr::{BeefyDataProvider, MmrLeafVersion}, }; use sp_genesis_builder::PresetId; -use sp_std::{ - cmp::Ordering, - collections::{btree_map::BTreeMap, vec_deque::VecDeque}, - prelude::*, -}; use frame_support::{ construct_runtime, derive_impl, @@ -1845,7 +1848,7 @@ sp_api::impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -2389,7 +2392,7 @@ sp_api::impl_runtime_apis! { } fn set_up_complex_asset_transfer( - ) -> Option<(Assets, u32, Location, Box)> { + ) -> Option<(Assets, u32, Location, alloc::boxed::Box)> { // Relay supports only native token, either reserve transfer it to non-system parachains, // or teleport it to system parachain. Use the teleport case for benchmarking as it's // slightly heavier. diff --git a/polkadot/runtime/rococo/src/validator_manager.rs b/polkadot/runtime/rococo/src/validator_manager.rs index 0677ba7fbb2..ecfbff4fa06 100644 --- a/polkadot/runtime/rococo/src/validator_manager.rs +++ b/polkadot/runtime/rococo/src/validator_manager.rs @@ -16,8 +16,8 @@ //! A pallet for managing validators on Rococo. +use alloc::vec::Vec; use sp_staking::SessionIndex; -use sp_std::vec::Vec; pub use pallet::*; diff --git a/polkadot/runtime/rococo/src/weights/pallet_session.rs b/polkadot/runtime/rococo/src/weights/pallet_session.rs index dbeca534add..7f573d4e395 100644 --- a/polkadot/runtime/rococo/src/weights/pallet_session.rs +++ b/polkadot/runtime/rococo/src/weights/pallet_session.rs @@ -38,7 +38,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `pallet_session`. pub struct WeightInfo(PhantomData); diff --git a/polkadot/runtime/rococo/src/weights/xcm/mod.rs b/polkadot/runtime/rococo/src/weights/xcm/mod.rs index 12f3df897b1..bd2b0fbb8c0 100644 --- a/polkadot/runtime/rococo/src/weights/xcm/mod.rs +++ b/polkadot/runtime/rococo/src/weights/xcm/mod.rs @@ -18,8 +18,8 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::Runtime; +use alloc::vec::Vec; use frame_support::weights::Weight; -use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; use pallet_xcm_benchmarks_fungible::WeightInfo as XcmBalancesWeight; diff --git a/polkadot/runtime/test-runtime/Cargo.toml b/polkadot/runtime/test-runtime/Cargo.toml index a66fceedae3..ac379b69e3f 100644 --- a/polkadot/runtime/test-runtime/Cargo.toml +++ b/polkadot/runtime/test-runtime/Cargo.toml @@ -22,7 +22,6 @@ sp-consensus-beefy = { workspace = true } sp-api = { workspace = true } sp-inherents = { workspace = true } sp-offchain = { workspace = true } -sp-std = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } sp-staking = { workspace = true } @@ -125,7 +124,6 @@ std = [ "sp-runtime/std", "sp-session/std", "sp-staking/std", - "sp-std/std", "sp-transaction-pool/std", "sp-version/std", "test-runtime-constants/std", diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index 96392c026d5..a8a369a68e6 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -20,12 +20,15 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] -use codec::Encode; -use pallet_transaction_payment::FungibleAdapter; -use sp_std::{ +extern crate alloc; + +use alloc::{ collections::{btree_map::BTreeMap, vec_deque::VecDeque}, - prelude::*, + vec, + vec::Vec, }; +use codec::Encode; +use pallet_transaction_payment::FungibleAdapter; use polkadot_runtime_parachains::{ assigner_parachains as parachains_assigner_parachains, @@ -793,7 +796,7 @@ sp_api::impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> Vec { Runtime::metadata_versions() } } diff --git a/polkadot/runtime/test-runtime/src/xcm_config.rs b/polkadot/runtime/test-runtime/src/xcm_config.rs index b1d86ff9a85..b424b9a3ee5 100644 --- a/polkadot/runtime/test-runtime/src/xcm_config.rs +++ b/polkadot/runtime/test-runtime/src/xcm_config.rs @@ -54,7 +54,7 @@ pub type LocalOriginToLocation = ( /// This implementation ensures that messages with non-reanchored assets return higher /// prices than messages with reanchored assets. /// Useful for `deposit_reserve_asset_works_for_any_xcm_sender` integration test. -pub struct TestDeliveryPrice(sp_std::marker::PhantomData<(A, F)>); +pub struct TestDeliveryPrice(core::marker::PhantomData<(A, F)>); impl, F: FeeTracker> PriceForMessageDelivery for TestDeliveryPrice { type Id = F::Id; diff --git a/polkadot/runtime/westend/Cargo.toml b/polkadot/runtime/westend/Cargo.toml index 5a7805c0516..9e739f4c7fe 100644 --- a/polkadot/runtime/westend/Cargo.toml +++ b/polkadot/runtime/westend/Cargo.toml @@ -28,7 +28,6 @@ sp-offchain = { workspace = true } sp-api = { workspace = true } sp-application-crypto = { workspace = true } sp-arithmetic = { workspace = true } -sp-std = { workspace = true } sp-genesis-builder = { workspace = true } sp-io = { workspace = true } sp-mmr-primitives = { workspace = true } @@ -220,7 +219,6 @@ std = [ "sp-runtime/std", "sp-session/std", "sp-staking/std", - "sp-std/std", "sp-storage/std", "sp-tracing/std", "sp-transaction-pool/std", diff --git a/polkadot/runtime/westend/src/impls.rs b/polkadot/runtime/westend/src/impls.rs index d7ca677a762..11665953bd8 100644 --- a/polkadot/runtime/westend/src/impls.rs +++ b/polkadot/runtime/westend/src/impls.rs @@ -15,12 +15,13 @@ // along with Polkadot. If not, see . use crate::xcm_config; +use alloc::{boxed::Box, vec}; use codec::{Decode, Encode}; +use core::marker::PhantomData; use frame_support::pallet_prelude::DispatchResult; use frame_system::RawOrigin; use polkadot_primitives::Balance; use polkadot_runtime_common::identity_migrator::{OnReapIdentity, WeightInfo}; -use sp_std::{marker::PhantomData, prelude::*}; use westend_runtime_constants::currency::*; use xcm::{latest::prelude::*, VersionedLocation, VersionedXcm}; use xcm_executor::traits::TransactAsset; diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 0d7a8a6a4ac..f0b16e731d9 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -20,6 +20,13 @@ // `#[frame_support::runtime]!` does a lot of recursion and requires us to increase the limit. #![recursion_limit = "512"] +extern crate alloc; + +use alloc::{ + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + vec, + vec::Vec, +}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_election_provider_support::{bounds::ElectionBoundsBuilder, onchain, SequentialPhragmen}; use frame_support::{ @@ -95,10 +102,6 @@ use sp_runtime::{ ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill, Percent, Permill, }; use sp_staking::SessionIndex; -use sp_std::{ - collections::{btree_map::BTreeMap, vec_deque::VecDeque}, - prelude::*, -}; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -1802,7 +1805,7 @@ sp_api::impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } @@ -2420,6 +2423,8 @@ sp_api::impl_runtime_apis! { use xcm_config::{AssetHub, TokenLocation}; + use alloc::boxed::Box; + parameter_types! { pub ExistentialDepositAsset: Option = Some(( TokenLocation::get(), diff --git a/polkadot/runtime/westend/src/weights/xcm/mod.rs b/polkadot/runtime/westend/src/weights/xcm/mod.rs index 09e883a9f7a..cb5894ea51e 100644 --- a/polkadot/runtime/westend/src/weights/xcm/mod.rs +++ b/polkadot/runtime/westend/src/weights/xcm/mod.rs @@ -18,8 +18,8 @@ mod pallet_xcm_benchmarks_fungible; mod pallet_xcm_benchmarks_generic; use crate::Runtime; +use alloc::vec::Vec; use frame_support::weights::Weight; -use sp_std::prelude::*; use xcm::{ latest::{prelude::*, QueryResponseInfo}, DoubleEncoded, diff --git a/polkadot/xcm/docs/src/cookbook/relay_token_transactor/parachain/mod.rs b/polkadot/xcm/docs/src/cookbook/relay_token_transactor/parachain/mod.rs index e7d00ac7103..23d6664bdaf 100644 --- a/polkadot/xcm/docs/src/cookbook/relay_token_transactor/parachain/mod.rs +++ b/polkadot/xcm/docs/src/cookbook/relay_token_transactor/parachain/mod.rs @@ -16,7 +16,7 @@ //! # Runtime -use frame::{deps::frame_system, prelude::*, runtime::prelude::*, traits::IdentityLookup}; +use frame::{deps::frame_system, runtime::prelude::*, traits::IdentityLookup}; use xcm_executor::XcmExecutor; use xcm_simulator::mock_message_queue; diff --git a/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml b/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml index 1177d094c6c..b07bdfdca3d 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml +++ b/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml @@ -18,7 +18,6 @@ scale-info = { features = ["derive"], workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-io = { workspace = true } xcm-executor = { workspace = true } frame-benchmarking = { workspace = true } @@ -48,7 +47,6 @@ std = [ "scale-info/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "xcm-builder/std", "xcm-executor/std", ] diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs index d99da9184b5..6ce49074a6e 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs @@ -16,6 +16,7 @@ use super::*; use crate::{account_and_location, new_executor, AssetTransactorOf, EnsureDelivery, XcmCallOf}; +use alloc::{vec, vec::Vec}; use frame_benchmarking::{benchmarks_instance_pallet, BenchmarkError, BenchmarkResult}; use frame_support::{ pallet_prelude::Get, @@ -23,7 +24,6 @@ use frame_support::{ weights::Weight, }; use sp_runtime::traits::{Bounded, Zero}; -use sp_std::{prelude::*, vec}; use xcm::latest::{prelude::*, MAX_ITEMS_IN_ASSETS}; use xcm_executor::traits::{ConvertLocation, FeeReason, TransactAsset}; @@ -37,7 +37,7 @@ benchmarks_instance_pallet! { >::Balance as TryInto - >::Error: sp_std::fmt::Debug, + >::Error: core::fmt::Debug, } withdraw_asset { diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs index 760b21f9356..40a7da58a68 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs @@ -16,10 +16,10 @@ use super::*; use crate::{account_and_location, new_executor, EnsureDelivery, XcmCallOf}; +use alloc::{vec, vec::Vec}; use codec::Encode; use frame_benchmarking::{benchmarks, BenchmarkError}; use frame_support::{dispatch::GetDispatchInfo, traits::fungible::Inspect}; -use sp_std::{prelude::*, vec}; use xcm::{ latest::{prelude::*, MaxDispatchErrorLen, MaybeErrorCode, Weight, MAX_ITEMS_IN_ASSETS}, DoubleEncoded, diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs index a43f27bf47e..4a12bb7f47c 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs @@ -18,9 +18,11 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use codec::Encode; use frame_benchmarking::{account, BenchmarkError}; -use sp_std::prelude::*; use xcm::latest::prelude::*; use xcm_builder::EnsureDelivery; use xcm_executor::{traits::ConvertLocation, Config as XcmConfig}; diff --git a/polkadot/xcm/pallet-xcm/Cargo.toml b/polkadot/xcm/pallet-xcm/Cargo.toml index 0cce7a34493..ed4b441d7c3 100644 --- a/polkadot/xcm/pallet-xcm/Cargo.toml +++ b/polkadot/xcm/pallet-xcm/Cargo.toml @@ -21,7 +21,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } xcm = { workspace = true } xcm-executor = { workspace = true } @@ -52,7 +51,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "xcm-builder/std", "xcm-executor/std", "xcm-runtime-apis/std", diff --git a/polkadot/xcm/pallet-xcm/src/benchmarking.rs b/polkadot/xcm/pallet-xcm/src/benchmarking.rs index da46a6a37c0..d09c81bf434 100644 --- a/polkadot/xcm/pallet-xcm/src/benchmarking.rs +++ b/polkadot/xcm/pallet-xcm/src/benchmarking.rs @@ -18,7 +18,6 @@ use super::*; use frame_benchmarking::{benchmarks, whitelisted_caller, BenchmarkError, BenchmarkResult}; use frame_support::{assert_ok, weights::Weight}; use frame_system::RawOrigin; -use sp_std::prelude::*; use xcm::latest::prelude::*; use xcm_builder::EnsureDelivery; use xcm_executor::traits::FeeReason; diff --git a/polkadot/xcm/pallet-xcm/src/lib.rs b/polkadot/xcm/pallet-xcm/src/lib.rs index 668f07c52ce..6451901279b 100644 --- a/polkadot/xcm/pallet-xcm/src/lib.rs +++ b/polkadot/xcm/pallet-xcm/src/lib.rs @@ -27,7 +27,11 @@ mod tests; pub mod migration; +extern crate alloc; + +use alloc::{boxed::Box, vec, vec::Vec}; use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; +use core::{marker::PhantomData, result::Result}; use frame_support::{ dispatch::{ DispatchErrorWithPostInfo, GetDispatchInfo, PostDispatchInfo, WithPostDispatchInfo, @@ -49,7 +53,6 @@ use sp_runtime::{ }, Either, RuntimeDebug, }; -use sp_std::{boxed::Box, marker::PhantomData, prelude::*, result::Result, vec}; use xcm::{latest::QueryResponseInfo, prelude::*}; use xcm_builder::{ ExecuteController, ExecuteControllerWeightInfo, InspectMessageQueues, QueryController, @@ -792,7 +795,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, /// The default version to encode outgoing XCM messages with. pub safe_xcm_version: Option, } @@ -1438,8 +1441,8 @@ enum FeesHandling { Separate { local_xcm: Xcm<::RuntimeCall>, remote_xcm: Xcm<()> }, } -impl sp_std::fmt::Debug for FeesHandling { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for FeesHandling { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { Self::Batched { fees } => write!(f, "FeesHandling::Batched({:?})", fees), Self::Separate { local_xcm, remote_xcm } => write!( @@ -1840,8 +1843,8 @@ impl Pallet { FeesHandling::Separate { local_xcm: mut local_fees, remote_xcm: mut remote_fees } => { // fees are handled by separate XCM instructions, prepend fees instructions (for // remote XCM they have to be prepended instead of appended to pass barriers). - sp_std::mem::swap(local, &mut local_fees); - sp_std::mem::swap(remote, &mut remote_fees); + core::mem::swap(local, &mut local_fees); + core::mem::swap(remote, &mut remote_fees); // these are now swapped so fees actually go first local.inner_mut().append(&mut local_fees.into_inner()); remote.inner_mut().append(&mut remote_fees.into_inner()); diff --git a/polkadot/xcm/pallet-xcm/src/migration.rs b/polkadot/xcm/pallet-xcm/src/migration.rs index b157e6b5c3d..0aec97ab410 100644 --- a/polkadot/xcm/pallet-xcm/src/migration.rs +++ b/polkadot/xcm/pallet-xcm/src/migration.rs @@ -34,7 +34,7 @@ pub mod v1 { /// enacted on-chain. /// /// Use experimental [`MigrateToV1`] instead. - pub struct VersionUncheckedMigrateToV1(sp_std::marker::PhantomData); + pub struct VersionUncheckedMigrateToV1(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV1 { fn on_runtime_upgrade() -> Weight { let mut weight = T::DbWeight::get().reads(1); @@ -81,7 +81,7 @@ pub mod v1 { /// `XCM_VERSION`. /// /// NOTE: This migration can be permanently added to the runtime migrations. -pub struct MigrateToLatestXcmVersion(sp_std::marker::PhantomData); +pub struct MigrateToLatestXcmVersion(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToLatestXcmVersion { fn on_runtime_upgrade() -> Weight { CurrentMigration::::put(VersionMigrationStage::default()); diff --git a/polkadot/xcm/pallet-xcm/src/mock.rs b/polkadot/xcm/pallet-xcm/src/mock.rs index 2be6f301f85..3941d104b81 100644 --- a/polkadot/xcm/pallet-xcm/src/mock.rs +++ b/polkadot/xcm/pallet-xcm/src/mock.rs @@ -15,6 +15,7 @@ // along with Polkadot. If not, see . use codec::Encode; +pub use core::cell::RefCell; use frame_support::{ construct_runtime, derive_impl, parameter_types, traits::{ @@ -28,7 +29,6 @@ use polkadot_parachain_primitives::primitives::Id as ParaId; use polkadot_runtime_parachains::origin; use sp_core::H256; use sp_runtime::{traits::IdentityLookup, AccountId32, BuildStorage}; -pub use sp_std::cell::RefCell; use xcm::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, diff --git a/polkadot/xcm/xcm-builder/Cargo.toml b/polkadot/xcm/xcm-builder/Cargo.toml index d43506aa651..7702e2f9be0 100644 --- a/polkadot/xcm/xcm-builder/Cargo.toml +++ b/polkadot/xcm/xcm-builder/Cargo.toml @@ -15,7 +15,6 @@ codec = { features = ["derive"], workspace = true } scale-info = { features = ["derive"], workspace = true } xcm = { workspace = true } xcm-executor = { workspace = true } -sp-std = { workspace = true } sp-arithmetic = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } @@ -66,7 +65,6 @@ std = [ "sp-arithmetic/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-weights/std", "xcm-executor/std", "xcm/std", diff --git a/polkadot/xcm/xcm-builder/src/asset_conversion.rs b/polkadot/xcm/xcm-builder/src/asset_conversion.rs index 520ce87448e..16ae05c2079 100644 --- a/polkadot/xcm/xcm-builder/src/asset_conversion.rs +++ b/polkadot/xcm/xcm-builder/src/asset_conversion.rs @@ -16,9 +16,9 @@ //! Adapters to work with [`frame_support::traits::fungibles`] through XCM. +use core::{marker::PhantomData, result}; use frame_support::traits::{Contains, Get}; use sp_runtime::traits::MaybeEquivalence; -use sp_std::{marker::PhantomData, prelude::*, result}; use xcm::latest::prelude::*; use xcm_executor::traits::{Error as MatchError, MatchesFungibles, MatchesNonFungibles}; diff --git a/polkadot/xcm/xcm-builder/src/barriers.rs b/polkadot/xcm/xcm-builder/src/barriers.rs index 11e9122f9a1..5d95005eb66 100644 --- a/polkadot/xcm/xcm-builder/src/barriers.rs +++ b/polkadot/xcm/xcm-builder/src/barriers.rs @@ -17,12 +17,12 @@ //! Various implementations for `ShouldExecute`. use crate::{CreateMatcher, MatchXcm}; +use core::{cell::Cell, marker::PhantomData, ops::ControlFlow, result::Result}; use frame_support::{ ensure, traits::{Contains, Get, ProcessMessageError}, }; use polkadot_parachain_primitives::primitives::IsSystem; -use sp_std::{cell::Cell, marker::PhantomData, ops::ControlFlow, result::Result}; use xcm::prelude::*; use xcm_executor::traits::{CheckSuspension, OnResponse, Properties, ShouldExecute}; diff --git a/polkadot/xcm/xcm-builder/src/controller.rs b/polkadot/xcm/xcm-builder/src/controller.rs index 04b19eaa587..d4ce2ca5b35 100644 --- a/polkadot/xcm/xcm-builder/src/controller.rs +++ b/polkadot/xcm/xcm-builder/src/controller.rs @@ -18,11 +18,11 @@ //! Controller traits defined in this module are high-level traits that will rely on other traits //! from `xcm-executor` to perform their tasks. +use alloc::boxed::Box; use frame_support::{ dispatch::{DispatchErrorWithPostInfo, WithPostDispatchInfo}, pallet_prelude::DispatchError, }; -use sp_std::boxed::Box; use xcm::prelude::*; pub use xcm_executor::traits::QueryHandler; diff --git a/polkadot/xcm/xcm-builder/src/currency_adapter.rs b/polkadot/xcm/xcm-builder/src/currency_adapter.rs index 99a736d6ac1..355d6ad8538 100644 --- a/polkadot/xcm/xcm-builder/src/currency_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/currency_adapter.rs @@ -19,9 +19,9 @@ #![allow(deprecated)] use super::MintLocation; +use core::{marker::PhantomData, result}; use frame_support::traits::{ExistenceRequirement::AllowDeath, Get, WithdrawReasons}; use sp_runtime::traits::CheckedSub; -use sp_std::{marker::PhantomData, result}; use xcm::latest::{Asset, Error as XcmError, Location, Result, XcmContext}; use xcm_executor::{ traits::{ConvertLocation, MatchesFungible, TransactAsset}, diff --git a/polkadot/xcm/xcm-builder/src/filter_asset_location.rs b/polkadot/xcm/xcm-builder/src/filter_asset_location.rs index d80c5d70dee..16b7be7f3ba 100644 --- a/polkadot/xcm/xcm-builder/src/filter_asset_location.rs +++ b/polkadot/xcm/xcm-builder/src/filter_asset_location.rs @@ -17,8 +17,9 @@ //! Various implementations of `ContainsPair` or //! `Contains<(Location, Vec)>`. +use alloc::vec::Vec; +use core::marker::PhantomData; use frame_support::traits::{Contains, ContainsPair, Get}; -use sp_std::{marker::PhantomData, vec::Vec}; use xcm::latest::{Asset, AssetFilter, AssetId, Location, WildAsset}; /// Accepts an asset iff it is a native asset. @@ -44,7 +45,7 @@ impl> ContainsPair for Case /// implementation of the given `Location` and if every asset from `assets` matches at least one of /// the `AssetFilter` instances provided by the `Get` implementation of `AssetFilters`. pub struct LocationWithAssetFilters( - sp_std::marker::PhantomData<(LocationFilter, AssetFilters)>, + core::marker::PhantomData<(LocationFilter, AssetFilters)>, ); impl, AssetFilters: Get>> Contains<(Location, Vec)> for LocationWithAssetFilters @@ -75,7 +76,7 @@ impl, AssetFilters: Get>> pub struct AllAssets; impl Get> for AllAssets { fn get() -> Vec { - sp_std::vec![AssetFilter::Wild(WildAsset::All)] + alloc::vec![AssetFilter::Wild(WildAsset::All)] } } @@ -96,11 +97,11 @@ mod tests { pub AssetYLocation: Location = Location::new(1, [GeneralIndex(2222)]); pub AssetZLocation: Location = Location::new(1, [GeneralIndex(3333)]); - pub OnlyAssetXOrAssetY: sp_std::vec::Vec = sp_std::vec![ + pub OnlyAssetXOrAssetY: alloc::vec::Vec = alloc::vec![ Wild(AllOf { fun: WildFungible, id: AssetId(AssetXLocation::get()) }), Wild(AllOf { fun: WildFungible, id: AssetId(AssetYLocation::get()) }), ]; - pub OnlyAssetZ: sp_std::vec::Vec = sp_std::vec![ + pub OnlyAssetZ: alloc::vec::Vec = alloc::vec![ Wild(AllOf { fun: WildFungible, id: AssetId(AssetZLocation::get()) }) ]; } diff --git a/polkadot/xcm/xcm-builder/src/fungible_adapter.rs b/polkadot/xcm/xcm-builder/src/fungible_adapter.rs index 45a0e2bdca2..25a705a39eb 100644 --- a/polkadot/xcm/xcm-builder/src/fungible_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/fungible_adapter.rs @@ -17,6 +17,7 @@ //! Adapters to work with [`frame_support::traits::fungible`] through XCM. use super::MintLocation; +use core::{marker::PhantomData, result}; use frame_support::traits::{ tokens::{ fungible, @@ -27,7 +28,6 @@ use frame_support::traits::{ }, Get, }; -use sp_std::{marker::PhantomData, prelude::*, result}; use xcm::latest::prelude::*; use xcm_executor::{ traits::{ConvertLocation, Error as MatchError, MatchesFungible, TransactAsset}, diff --git a/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs b/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs index 88bbf01d9e1..a259afc6e68 100644 --- a/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs @@ -16,6 +16,7 @@ //! Adapters to work with [`frame_support::traits::fungibles`] through XCM. +use core::{marker::PhantomData, result}; use frame_support::traits::{ tokens::{ fungibles, @@ -26,7 +27,6 @@ use frame_support::traits::{ }, Contains, Get, }; -use sp_std::{marker::PhantomData, prelude::*, result}; use xcm::latest::prelude::*; use xcm_executor::traits::{ConvertLocation, Error as MatchError, MatchesFungibles, TransactAsset}; @@ -101,7 +101,7 @@ impl AssetChecking for NoChecking { /// Implementation of `AssetChecking` which subjects a given set of assets `T` to having their /// teleportations recorded with a `MintLocation::Local`. -pub struct LocalMint(sp_std::marker::PhantomData); +pub struct LocalMint(core::marker::PhantomData); impl> AssetChecking for LocalMint { fn asset_checking(asset: &AssetId) -> Option { match T::contains(asset) { @@ -113,7 +113,7 @@ impl> AssetChecking for LocalMint { /// Implementation of `AssetChecking` which subjects a given set of assets `T` to having their /// teleportations recorded with a `MintLocation::NonLocal`. -pub struct NonLocalMint(sp_std::marker::PhantomData); +pub struct NonLocalMint(core::marker::PhantomData); impl> AssetChecking for NonLocalMint { fn asset_checking(asset: &AssetId) -> Option { match T::contains(asset) { @@ -126,7 +126,7 @@ impl> AssetChecking for NonLocalMint { /// Implementation of `AssetChecking` which subjects a given set of assets `L` to having their /// teleportations recorded with a `MintLocation::Local` and a second set of assets `R` to having /// their teleportations recorded with a `MintLocation::NonLocal`. -pub struct DualMint(sp_std::marker::PhantomData<(L, R)>); +pub struct DualMint(core::marker::PhantomData<(L, R)>); impl, R: Contains> AssetChecking for DualMint { diff --git a/polkadot/xcm/xcm-builder/src/lib.rs b/polkadot/xcm/xcm-builder/src/lib.rs index cc06c298a41..c3495601cd8 100644 --- a/polkadot/xcm/xcm-builder/src/lib.rs +++ b/polkadot/xcm/xcm-builder/src/lib.rs @@ -20,6 +20,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(test)] mod tests; diff --git a/polkadot/xcm/xcm-builder/src/location_conversion.rs b/polkadot/xcm/xcm-builder/src/location_conversion.rs index f9525849238..1d840e9c0dd 100644 --- a/polkadot/xcm/xcm-builder/src/location_conversion.rs +++ b/polkadot/xcm/xcm-builder/src/location_conversion.rs @@ -15,11 +15,12 @@ // along with Polkadot. If not, see . use crate::universal_exports::ensure_is_remote; +use alloc::vec::Vec; use codec::{Compact, Decode, Encode}; +use core::marker::PhantomData; use frame_support::traits::Get; use sp_io::hashing::blake2_256; use sp_runtime::traits::{AccountIdConversion, TrailingZeroInput, TryConvert}; -use sp_std::{marker::PhantomData, prelude::*}; use xcm::latest::prelude::*; use xcm_executor::traits::ConvertLocation; @@ -460,7 +461,9 @@ impl #[cfg(test)] mod tests { use super::*; + use alloc::vec; use polkadot_primitives::AccountId; + pub type ForeignChainAliasAccount = HashedDescription; diff --git a/polkadot/xcm/xcm-builder/src/matches_location.rs b/polkadot/xcm/xcm-builder/src/matches_location.rs index b6c2807e6b2..71c5ec1efd6 100644 --- a/polkadot/xcm/xcm-builder/src/matches_location.rs +++ b/polkadot/xcm/xcm-builder/src/matches_location.rs @@ -17,14 +17,14 @@ //! Various implementations and utilities for matching and filtering `Location` and //! `InteriorLocation` types. +use core::marker::PhantomData; use frame_support::traits::{Contains, Get}; use sp_runtime::traits::MaybeEquivalence; -use sp_std::marker::PhantomData; use xcm::latest::{InteriorLocation, Location, NetworkId}; /// An implementation of `Contains` that checks for `Location` or /// `InteriorLocation` if starts with the provided type `T`. -pub struct StartsWith(sp_std::marker::PhantomData<(T, L)>); +pub struct StartsWith(core::marker::PhantomData<(T, L)>); impl, L: TryInto + Clone> Contains for StartsWith { fn contains(location: &L) -> bool { let latest_location: Location = @@ -42,7 +42,7 @@ impl> Contains for StartsWith { /// An implementation of `Contains` that checks for `Location` or /// `InteriorLocation` if starts with expected `GlobalConsensus(NetworkId)` provided as type /// `T`. -pub struct StartsWithExplicitGlobalConsensus(sp_std::marker::PhantomData); +pub struct StartsWithExplicitGlobalConsensus(core::marker::PhantomData); impl> Contains for StartsWithExplicitGlobalConsensus { fn contains(location: &Location) -> bool { matches!(location.interior().global_consensus(), Ok(requested_network) if requested_network.eq(&T::get())) diff --git a/polkadot/xcm/xcm-builder/src/matches_token.rs b/polkadot/xcm/xcm-builder/src/matches_token.rs index e49fd18f88d..095c50a5a25 100644 --- a/polkadot/xcm/xcm-builder/src/matches_token.rs +++ b/polkadot/xcm/xcm-builder/src/matches_token.rs @@ -16,8 +16,8 @@ //! Various implementations for the `MatchesFungible` trait. +use core::marker::PhantomData; use frame_support::traits::Get; -use sp_std::marker::PhantomData; use xcm::latest::{ Asset, AssetId, AssetInstance, Fungibility::{Fungible, NonFungible}, diff --git a/polkadot/xcm/xcm-builder/src/nonfungible_adapter.rs b/polkadot/xcm/xcm-builder/src/nonfungible_adapter.rs index b69002eafc5..8e6232ea64d 100644 --- a/polkadot/xcm/xcm-builder/src/nonfungible_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/nonfungible_adapter.rs @@ -17,11 +17,11 @@ //! Adapters to work with [`frame_support::traits::tokens::nonfungible`] through XCM. use crate::MintLocation; +use core::{marker::PhantomData, result}; use frame_support::{ ensure, traits::{tokens::nonfungible, Get}, }; -use sp_std::{marker::PhantomData, prelude::*, result}; use xcm::latest::prelude::*; use xcm_executor::traits::{ ConvertLocation, Error as MatchError, MatchesNonFungible, TransactAsset, diff --git a/polkadot/xcm/xcm-builder/src/nonfungibles_adapter.rs b/polkadot/xcm/xcm-builder/src/nonfungibles_adapter.rs index 3fce953848e..b111a05a4f1 100644 --- a/polkadot/xcm/xcm-builder/src/nonfungibles_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/nonfungibles_adapter.rs @@ -17,11 +17,11 @@ //! Adapters to work with [`frame_support::traits::tokens::nonfungibles`] through XCM. use crate::{AssetChecking, MintLocation}; +use core::{marker::PhantomData, result}; use frame_support::{ ensure, traits::{tokens::nonfungibles, Get}, }; -use sp_std::{marker::PhantomData, prelude::*, result}; use xcm::latest::prelude::*; use xcm_executor::traits::{ ConvertLocation, Error as MatchError, MatchesNonFungibles, TransactAsset, diff --git a/polkadot/xcm/xcm-builder/src/origin_aliases.rs b/polkadot/xcm/xcm-builder/src/origin_aliases.rs index bbf810463a7..d568adc3127 100644 --- a/polkadot/xcm/xcm-builder/src/origin_aliases.rs +++ b/polkadot/xcm/xcm-builder/src/origin_aliases.rs @@ -16,8 +16,8 @@ //! Implementation for `ContainsPair`. +use core::marker::PhantomData; use frame_support::traits::{Contains, ContainsPair}; -use sp_std::marker::PhantomData; use xcm::latest::prelude::*; /// Alias a Foreign `AccountId32` with a local `AccountId32` if the foreign `AccountId32` matches diff --git a/polkadot/xcm/xcm-builder/src/origin_conversion.rs b/polkadot/xcm/xcm-builder/src/origin_conversion.rs index f64b5660f66..6e73c0dae7b 100644 --- a/polkadot/xcm/xcm-builder/src/origin_conversion.rs +++ b/polkadot/xcm/xcm-builder/src/origin_conversion.rs @@ -16,11 +16,11 @@ //! Various implementations for `ConvertOrigin`. +use core::marker::PhantomData; use frame_support::traits::{EnsureOrigin, Get, GetBacking, OriginTrait}; use frame_system::RawOrigin as SystemRawOrigin; use polkadot_parachain_primitives::primitives::IsSystem; use sp_runtime::traits::TryConvert; -use sp_std::marker::PhantomData; use xcm::latest::{BodyId, BodyPart, Junction, Junctions::*, Location, NetworkId, OriginKind}; use xcm_executor::traits::{ConvertLocation, ConvertOrigin}; diff --git a/polkadot/xcm/xcm-builder/src/pay.rs b/polkadot/xcm/xcm-builder/src/pay.rs index 35b624b0415..978c6870cda 100644 --- a/polkadot/xcm/xcm-builder/src/pay.rs +++ b/polkadot/xcm/xcm-builder/src/pay.rs @@ -16,12 +16,13 @@ //! `PayOverXcm` struct for paying through XCM and getting the status back. +use alloc::vec; +use core::marker::PhantomData; use frame_support::traits::{ tokens::{Pay, PaymentStatus}, Get, }; use sp_runtime::traits::TryConvert; -use sp_std::{marker::PhantomData, vec}; use xcm::{opaque::lts::Weight, prelude::*}; use xcm_executor::traits::{QueryHandler, QueryResponseStatus}; @@ -199,7 +200,7 @@ pub struct LocatableAssetId { /// Adapter `struct` which implements a conversion from any `AssetKind` into a [`LocatableAssetId`] /// value using a fixed `Location` for the `location` field. -pub struct FixedLocation(sp_std::marker::PhantomData); +pub struct FixedLocation(core::marker::PhantomData); impl, AssetKind: Into> TryConvert for FixedLocation { diff --git a/polkadot/xcm/xcm-builder/src/process_xcm_message.rs b/polkadot/xcm/xcm-builder/src/process_xcm_message.rs index ef8c71fc249..2e6f8c5fb56 100644 --- a/polkadot/xcm/xcm-builder/src/process_xcm_message.rs +++ b/polkadot/xcm/xcm-builder/src/process_xcm_message.rs @@ -17,9 +17,9 @@ //! Implementation of `ProcessMessage` for an `ExecuteXcm` implementation. use codec::{Decode, FullCodec, MaxEncodedLen}; +use core::{fmt::Debug, marker::PhantomData}; use frame_support::traits::{ProcessMessage, ProcessMessageError}; use scale_info::TypeInfo; -use sp_std::{fmt::Debug, marker::PhantomData}; use sp_weights::{Weight, WeightMeter}; use xcm::prelude::*; @@ -118,6 +118,7 @@ impl< #[cfg(test)] mod tests { use super::*; + use alloc::vec; use codec::Encode; use frame_support::{ assert_err, assert_ok, diff --git a/polkadot/xcm/xcm-builder/src/routing.rs b/polkadot/xcm/xcm-builder/src/routing.rs index 543aef97c34..03ef780ef03 100644 --- a/polkadot/xcm/xcm-builder/src/routing.rs +++ b/polkadot/xcm/xcm-builder/src/routing.rs @@ -16,9 +16,10 @@ //! Various implementations for `SendXcm`. +use alloc::vec::Vec; use codec::Encode; +use core::{marker::PhantomData, result::Result}; use frame_system::unique; -use sp_std::{marker::PhantomData, result::Result, vec::Vec}; use xcm::prelude::*; use xcm_executor::{traits::FeeReason, FeesMode}; @@ -173,7 +174,7 @@ impl InspectMessageQueues for Tuple { /// `Inner::Ticket`. Therefore, this router aims to validate at least the passed `message`. /// /// NOTE: For use in mock runtimes which don't have the DMP/UMP/HRMP XCM validations. -pub struct EnsureDecodableXcm(sp_std::marker::PhantomData); +pub struct EnsureDecodableXcm(core::marker::PhantomData); impl SendXcm for EnsureDecodableXcm { type Ticket = Inner::Ticket; diff --git a/polkadot/xcm/xcm-builder/src/test_utils.rs b/polkadot/xcm/xcm-builder/src/test_utils.rs index 3131dece375..37a49a1b3dc 100644 --- a/polkadot/xcm/xcm-builder/src/test_utils.rs +++ b/polkadot/xcm/xcm-builder/src/test_utils.rs @@ -16,11 +16,11 @@ // Shared test utilities and implementations for the XCM Builder. +use alloc::vec::Vec; use frame_support::{ parameter_types, traits::{Contains, CrateVersion, PalletInfoData, PalletsInfoAccess}, }; -use sp_std::vec::Vec; pub use xcm::latest::{prelude::*, Weight}; use xcm_executor::traits::{ClaimAssets, DropAssets, VersionChangeNotifier}; pub use xcm_executor::{ diff --git a/polkadot/xcm/xcm-builder/src/tests/mock.rs b/polkadot/xcm/xcm-builder/src/tests/mock.rs index f35c73bdb68..ac43d217ff3 100644 --- a/polkadot/xcm/xcm-builder/src/tests/mock.rs +++ b/polkadot/xcm/xcm-builder/src/tests/mock.rs @@ -26,7 +26,12 @@ pub use crate::{ AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, FixedRateOfFungible, FixedWeightBounds, TakeWeightCredit, }; +pub use alloc::collections::{btree_map::BTreeMap, btree_set::BTreeSet}; pub use codec::{Decode, Encode}; +pub use core::{ + cell::{Cell, RefCell}, + fmt::Debug, +}; use frame_support::traits::{ContainsPair, Everything}; pub use frame_support::{ dispatch::{DispatchInfo, DispatchResultWithPostInfo, GetDispatchInfo, PostDispatchInfo}, @@ -34,11 +39,6 @@ pub use frame_support::{ sp_runtime::{traits::Dispatchable, DispatchError, DispatchErrorWithPostInfo}, traits::{Contains, Get, IsInVec}, }; -pub use sp_std::{ - cell::{Cell, RefCell}, - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - fmt::Debug, -}; pub use xcm::latest::{prelude::*, QueryId, Weight}; use xcm_executor::traits::{Properties, QueryHandler, QueryResponseStatus}; pub use xcm_executor::{ diff --git a/polkadot/xcm/xcm-builder/src/tests/mod.rs b/polkadot/xcm/xcm-builder/src/tests/mod.rs index 16ce3d2cf8f..379baaf5e37 100644 --- a/polkadot/xcm/xcm-builder/src/tests/mod.rs +++ b/polkadot/xcm/xcm-builder/src/tests/mod.rs @@ -15,6 +15,7 @@ // along with Polkadot. If not, see . use super::{test_utils::*, *}; +use alloc::{vec, vec::Vec}; use frame_support::{ assert_err, traits::{ConstU32, ContainsPair, ProcessMessageError}, diff --git a/polkadot/xcm/xcm-builder/src/universal_exports.rs b/polkadot/xcm/xcm-builder/src/universal_exports.rs index 9820d535f7e..8aa9602fcc2 100644 --- a/polkadot/xcm/xcm-builder/src/universal_exports.rs +++ b/polkadot/xcm/xcm-builder/src/universal_exports.rs @@ -17,9 +17,10 @@ //! Traits and utilities to help with origin mutation and bridging. use crate::InspectMessageQueues; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; +use core::{convert::TryInto, marker::PhantomData}; use frame_support::{ensure, traits::Get}; -use sp_std::{convert::TryInto, marker::PhantomData, prelude::*}; use xcm::prelude::*; use xcm_executor::traits::{validate_export, ExportXcm}; use SendError::*; @@ -149,7 +150,7 @@ impl NetworkExportTableItem { /// An adapter for the implementation of `ExporterFor`, which attempts to find the /// `(bridge_location, payment)` for the requested `network` and `remote_location` in the provided /// `T` table containing various exporters. -pub struct NetworkExportTable(sp_std::marker::PhantomData); +pub struct NetworkExportTable(core::marker::PhantomData); impl>> ExporterFor for NetworkExportTable { fn exporter_for( network: &NetworkId, @@ -649,7 +650,7 @@ mod tests { pub PaymentForNetworkAAndParachain2000: Asset = (Location::parent(), 150).into(); - pub BridgeTable: sp_std::vec::Vec = sp_std::vec![ + pub BridgeTable: alloc::vec::Vec = alloc::vec![ // NetworkA allows `Parachain(1000)` as remote location WITHOUT payment. NetworkExportTableItem::new( NetworkA::get(), diff --git a/polkadot/xcm/xcm-builder/src/weight.rs b/polkadot/xcm/xcm-builder/src/weight.rs index 1efa42ce956..7861fdcc2e5 100644 --- a/polkadot/xcm/xcm-builder/src/weight.rs +++ b/polkadot/xcm/xcm-builder/src/weight.rs @@ -15,6 +15,7 @@ // along with Polkadot. If not, see . use codec::Decode; +use core::{marker::PhantomData, result::Result}; use frame_support::{ dispatch::GetDispatchInfo, traits::{ @@ -27,7 +28,6 @@ use frame_support::{ }, }; use sp_runtime::traits::{SaturatedConversion, Saturating, Zero}; -use sp_std::{marker::PhantomData, result::Result}; use xcm::latest::{prelude::*, GetWeight, Weight}; use xcm_executor::{ traits::{WeightBounds, WeightTrader}, diff --git a/polkadot/xcm/xcm-builder/tests/mock/mod.rs b/polkadot/xcm/xcm-builder/tests/mock/mod.rs index 582d596b78f..0468b0a5410 100644 --- a/polkadot/xcm/xcm-builder/tests/mock/mod.rs +++ b/polkadot/xcm/xcm-builder/tests/mock/mod.rs @@ -15,6 +15,7 @@ // along with Polkadot. If not, see . use codec::Encode; +use core::cell::RefCell; use frame_support::{ construct_runtime, derive_impl, parameter_types, traits::{Everything, Nothing}, @@ -23,7 +24,6 @@ use frame_support::{ use frame_system::EnsureRoot; use primitive_types::H256; use sp_runtime::{traits::IdentityLookup, AccountId32, BuildStorage}; -use sp_std::cell::RefCell; use polkadot_parachain_primitives::primitives::Id as ParaId; use polkadot_runtime_parachains::{configuration, origin, shared}; diff --git a/polkadot/xcm/xcm-executor/Cargo.toml b/polkadot/xcm/xcm-executor/Cargo.toml index 7d1fc48692f..cc966f91fe4 100644 --- a/polkadot/xcm/xcm-executor/Cargo.toml +++ b/polkadot/xcm/xcm-executor/Cargo.toml @@ -15,7 +15,6 @@ environmental = { workspace = true } codec = { features = ["derive"], workspace = true } scale-info = { features = ["derive", "serde"], workspace = true } xcm = { workspace = true } -sp-std = { workspace = true } sp-io = { workspace = true } sp-arithmetic = { workspace = true } sp-core = { workspace = true } @@ -42,7 +41,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-weights/std", "tracing/std", "xcm/std", diff --git a/polkadot/xcm/xcm-executor/src/assets.rs b/polkadot/xcm/xcm-executor/src/assets.rs index 4407752f702..09e7535ebf8 100644 --- a/polkadot/xcm/xcm-executor/src/assets.rs +++ b/polkadot/xcm/xcm-executor/src/assets.rs @@ -14,12 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use sp_runtime::{traits::Saturating, RuntimeDebug}; -use sp_std::{ +use alloc::{ collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - mem, - prelude::*, + vec::Vec, }; +use core::mem; +use sp_runtime::{traits::Saturating, RuntimeDebug}; use xcm::latest::{ Asset, AssetFilter, AssetId, AssetInstance, Assets, Fungibility::{Fungible, NonFungible}, @@ -520,7 +520,9 @@ impl AssetsInHolding { #[cfg(test)] mod tests { use super::*; + use alloc::vec; use xcm::latest::prelude::*; + #[allow(non_snake_case)] /// Concrete fungible constructor fn CF(amount: u128) -> Asset { diff --git a/polkadot/xcm/xcm-executor/src/lib.rs b/polkadot/xcm/xcm-executor/src/lib.rs index aeeb24dcf81..1daf5ae750c 100644 --- a/polkadot/xcm/xcm-executor/src/lib.rs +++ b/polkadot/xcm/xcm-executor/src/lib.rs @@ -16,7 +16,11 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; +use core::{fmt::Debug, marker::PhantomData}; use frame_support::{ dispatch::GetDispatchInfo, ensure, @@ -24,7 +28,6 @@ use frame_support::{ }; use sp_core::defer; use sp_io::hashing::blake2_128; -use sp_std::{fmt::Debug, marker::PhantomData, prelude::*}; use sp_weights::Weight; use xcm::latest::prelude::*; @@ -392,7 +395,7 @@ impl XcmExecutor { /// Remove the registered error handler and return it. Do not refund its weight. fn take_error_handler(&mut self) -> Xcm { let mut r = Xcm::(vec![]); - sp_std::mem::swap(&mut self.error_handler, &mut r); + core::mem::swap(&mut self.error_handler, &mut r); self.error_handler_weight = Weight::zero(); r } @@ -407,7 +410,7 @@ impl XcmExecutor { /// Remove the registered appendix and return it. fn take_appendix(&mut self) -> Xcm { let mut r = Xcm::(vec![]); - sp_std::mem::swap(&mut self.appendix, &mut r); + core::mem::swap(&mut self.appendix, &mut r); self.appendix_weight = Weight::zero(); r } diff --git a/polkadot/xcm/xcm-executor/src/traits/asset_lock.rs b/polkadot/xcm/xcm-executor/src/traits/asset_lock.rs index b6270c52945..b4e9f32983f 100644 --- a/polkadot/xcm/xcm-executor/src/traits/asset_lock.rs +++ b/polkadot/xcm/xcm-executor/src/traits/asset_lock.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use sp_std::convert::Infallible; +use core::convert::Infallible; use xcm::prelude::*; #[derive(Debug)] diff --git a/polkadot/xcm/xcm-executor/src/traits/conversion.rs b/polkadot/xcm/xcm-executor/src/traits/conversion.rs index 1efe138b8c2..bc62ad65566 100644 --- a/polkadot/xcm/xcm-executor/src/traits/conversion.rs +++ b/polkadot/xcm/xcm-executor/src/traits/conversion.rs @@ -14,9 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +use core::{marker::PhantomData, result::Result}; use frame_support::traits::{Contains, OriginTrait}; use sp_runtime::{traits::Dispatchable, DispatchErrorWithPostInfo}; -use sp_std::{marker::PhantomData, result::Result}; use xcm::latest::prelude::*; /// Means of converting a location into an account identifier. diff --git a/polkadot/xcm/xcm-executor/src/traits/on_response.rs b/polkadot/xcm/xcm-executor/src/traits/on_response.rs index 5d2412d6137..a4ed6014b4f 100644 --- a/polkadot/xcm/xcm-executor/src/traits/on_response.rs +++ b/polkadot/xcm/xcm-executor/src/traits/on_response.rs @@ -16,10 +16,9 @@ use crate::{Junctions::Here, Xcm}; use codec::{Decode, Encode}; -use core::result; +use core::{fmt::Debug, result}; use frame_support::{pallet_prelude::Get, parameter_types}; use sp_arithmetic::traits::Zero; -use sp_std::fmt::Debug; use xcm::latest::{ Error as XcmError, InteriorLocation, Location, QueryId, Response, Result as XcmResult, Weight, XcmContext, diff --git a/polkadot/xcm/xcm-executor/src/traits/should_execute.rs b/polkadot/xcm/xcm-executor/src/traits/should_execute.rs index 2e3acf5960e..ec9ef70cc81 100644 --- a/polkadot/xcm/xcm-executor/src/traits/should_execute.rs +++ b/polkadot/xcm/xcm-executor/src/traits/should_execute.rs @@ -14,8 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +use core::result::Result; use frame_support::traits::ProcessMessageError; -use sp_std::result::Result; use xcm::latest::{Instruction, Location, Weight, XcmHash}; /// Properties of an XCM message and its imminent execution. diff --git a/polkadot/xcm/xcm-executor/src/traits/token_matching.rs b/polkadot/xcm/xcm-executor/src/traits/token_matching.rs index 45f3dc062a6..aa44aee4f9d 100644 --- a/polkadot/xcm/xcm-executor/src/traits/token_matching.rs +++ b/polkadot/xcm/xcm-executor/src/traits/token_matching.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use sp_std::result; +use core::result; use xcm::latest::prelude::*; pub trait MatchesFungible { diff --git a/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs b/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs index eb85af0b80f..c2331f805b4 100644 --- a/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs +++ b/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs @@ -15,7 +15,7 @@ // along with Polkadot. If not, see . use crate::AssetsInHolding; -use sp_std::result::Result; +use core::result::Result; use xcm::latest::{Asset, Error as XcmError, Location, Result as XcmResult, XcmContext}; /// Facility for asset transacting. diff --git a/polkadot/xcm/xcm-executor/src/traits/weight.rs b/polkadot/xcm/xcm-executor/src/traits/weight.rs index 985dfcd0cf2..72de3e0f433 100644 --- a/polkadot/xcm/xcm-executor/src/traits/weight.rs +++ b/polkadot/xcm/xcm-executor/src/traits/weight.rs @@ -15,7 +15,7 @@ // along with Polkadot. If not, see . use crate::AssetsInHolding; -use sp_std::result::Result; +use core::result::Result; use xcm::latest::{prelude::*, Weight}; /// Determine the weight of an XCM message. diff --git a/polkadot/xcm/xcm-runtime-apis/Cargo.toml b/polkadot/xcm/xcm-runtime-apis/Cargo.toml index 7d3f1a20b63..748d5af68a1 100644 --- a/polkadot/xcm/xcm-runtime-apis/Cargo.toml +++ b/polkadot/xcm/xcm-runtime-apis/Cargo.toml @@ -16,7 +16,6 @@ scale-info = { features = ["derive", "serde"], workspace = true } frame-support = { workspace = true } sp-api = { workspace = true } -sp-std = { workspace = true } sp-weights = { workspace = true } xcm = { workspace = true } xcm-executor = { workspace = true } @@ -48,7 +47,6 @@ std = [ "scale-info/std", "sp-api/std", "sp-io/std", - "sp-std/std", "sp-weights/std", "xcm-builder/std", "xcm-executor/std", diff --git a/polkadot/xcm/xcm-runtime-apis/src/conversions.rs b/polkadot/xcm/xcm-runtime-apis/src/conversions.rs index d422664557e..e5eeac013fe 100644 --- a/polkadot/xcm/xcm-runtime-apis/src/conversions.rs +++ b/polkadot/xcm/xcm-runtime-apis/src/conversions.rs @@ -44,7 +44,7 @@ pub enum Error { /// It is useful when you already have a `ConvertLocation` implementation and a default /// `Ss58Prefix`. pub struct LocationToAccountHelper( - sp_std::marker::PhantomData<(AccountId, Conversion)>, + core::marker::PhantomData<(AccountId, Conversion)>, ); impl> LocationToAccountHelper diff --git a/polkadot/xcm/xcm-runtime-apis/src/dry_run.rs b/polkadot/xcm/xcm-runtime-apis/src/dry_run.rs index 9828acab402..2a1a0daf0d5 100644 --- a/polkadot/xcm/xcm-runtime-apis/src/dry_run.rs +++ b/polkadot/xcm/xcm-runtime-apis/src/dry_run.rs @@ -18,9 +18,9 @@ //! This API can be used to simulate XCMs and, for example, find the fees //! that need to be paid. +use alloc::vec::Vec; use codec::{Decode, Encode}; use frame_support::pallet_prelude::{DispatchResultWithPostInfo, TypeInfo}; -use sp_std::vec::Vec; use xcm::prelude::*; /// Effects of dry-running an extrinsic. diff --git a/polkadot/xcm/xcm-runtime-apis/src/fees.rs b/polkadot/xcm/xcm-runtime-apis/src/fees.rs index 572d4edf533..3445d42ecab 100644 --- a/polkadot/xcm/xcm-runtime-apis/src/fees.rs +++ b/polkadot/xcm/xcm-runtime-apis/src/fees.rs @@ -16,9 +16,9 @@ //! Runtime API definition for getting XCM fees. +use alloc::vec::Vec; use codec::{Decode, Encode}; use frame_support::pallet_prelude::TypeInfo; -use sp_std::vec::Vec; use sp_weights::Weight; use xcm::{Version, VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm}; diff --git a/polkadot/xcm/xcm-runtime-apis/src/lib.rs b/polkadot/xcm/xcm-runtime-apis/src/lib.rs index 7b3b86214b3..b106836c113 100644 --- a/polkadot/xcm/xcm-runtime-apis/src/lib.rs +++ b/polkadot/xcm/xcm-runtime-apis/src/lib.rs @@ -18,6 +18,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + /// Exposes runtime APIs for various XCM-related conversions. pub mod conversions; diff --git a/polkadot/xcm/xcm-runtime-apis/tests/mock.rs b/polkadot/xcm/xcm-runtime-apis/tests/mock.rs index e723e254635..c76b26fcd2a 100644 --- a/polkadot/xcm/xcm-runtime-apis/tests/mock.rs +++ b/polkadot/xcm/xcm-runtime-apis/tests/mock.rs @@ -18,6 +18,7 @@ //! Implements both runtime APIs for fee estimation and getting the messages for transfers. use codec::Encode; +use core::{cell::RefCell, marker::PhantomData}; use frame_support::{ construct_runtime, derive_impl, parameter_types, sp_runtime, sp_runtime::{ @@ -32,7 +33,6 @@ use frame_support::{ }; use frame_system::{EnsureRoot, RawOrigin as SystemRawOrigin}; use pallet_xcm::TestWeightInfo; -use sp_std::{cell::RefCell, marker::PhantomData}; use xcm::{prelude::*, Version as XcmVersion}; use xcm_builder::{ AllowTopLevelPaidExecutionFrom, ConvertedConcreteId, EnsureXcmOrigin, FixedRateOfFungible, diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain/mod.rs b/polkadot/xcm/xcm-simulator/example/src/parachain/mod.rs index 93c8302757c..bfb455aba3f 100644 --- a/polkadot/xcm/xcm-simulator/example/src/parachain/mod.rs +++ b/polkadot/xcm/xcm-simulator/example/src/parachain/mod.rs @@ -31,7 +31,6 @@ use sp_runtime::{ traits::{Get, IdentityLookup}, AccountId32, }; -use sp_std::prelude::*; use xcm::latest::prelude::*; use xcm_builder::{EnsureXcmOrigin, SignedToAccountId32}; use xcm_executor::{traits::ConvertLocation, XcmExecutor}; @@ -101,7 +100,7 @@ impl EnsureOriginWithArg for ForeignCreators { fn try_origin( o: RuntimeOrigin, a: &Location, - ) -> sp_std::result::Result { + ) -> core::result::Result { let origin_location = pallet_xcm::EnsureXcm::::try_origin(o.clone())?; if !a.starts_with(&origin_location) { return Err(o); diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs index 11435868d46..616329a2f06 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs @@ -29,7 +29,6 @@ use sp_runtime::{ traits::{AccountIdLookup, BlakeTwo256, Hash, IdentifyAccount, Verify}, MultiAddress, MultiSignature, }; -use sp_std::prelude::*; use pallet_xcm::XcmPassthrough; use polkadot_core_primitives::BlockNumber as RelayBlockNumber; diff --git a/polkadot/xcm/xcm-simulator/src/lib.rs b/polkadot/xcm/xcm-simulator/src/lib.rs index a6747a4789e..59df394406e 100644 --- a/polkadot/xcm/xcm-simulator/src/lib.rs +++ b/polkadot/xcm/xcm-simulator/src/lib.rs @@ -20,15 +20,18 @@ /// Used for sending messages. pub mod mock_message_queue; +extern crate alloc; + pub use codec::Encode; pub use paste; +pub use alloc::collections::vec_deque::VecDeque; +pub use core::{cell::RefCell, marker::PhantomData}; pub use frame_support::{ traits::{EnqueueMessage, Get, ProcessMessage, ProcessMessageError, ServiceQueues}, weights::{Weight, WeightMeter}, }; pub use sp_io::{hashing::blake2_256, TestExternalities}; -pub use sp_std::{cell::RefCell, collections::vec_deque::VecDeque, marker::PhantomData}; pub use polkadot_core_primitives::BlockNumber as RelayBlockNumber; pub use polkadot_parachain_primitives::primitives::{ diff --git a/polkadot/xcm/xcm-simulator/src/mock_message_queue.rs b/polkadot/xcm/xcm-simulator/src/mock_message_queue.rs index 96b47999fe9..bf7b0e15967 100644 --- a/polkadot/xcm/xcm-simulator/src/mock_message_queue.rs +++ b/polkadot/xcm/xcm-simulator/src/mock_message_queue.rs @@ -24,7 +24,6 @@ use polkadot_parachain_primitives::primitives::{ use polkadot_primitives::BlockNumber as RelayBlockNumber; use sp_runtime::traits::{Get, Hash}; -use sp_std::prelude::*; use xcm::{latest::prelude::*, VersionedXcm}; pub use pallet::*; diff --git a/substrate/bin/node/runtime/src/assets_api.rs b/substrate/bin/node/runtime/src/assets_api.rs index 38ec5650711..98187e7391f 100644 --- a/substrate/bin/node/runtime/src/assets_api.rs +++ b/substrate/bin/node/runtime/src/assets_api.rs @@ -20,8 +20,8 @@ use polkadot_sdk::*; +use alloc::vec::Vec; use codec::Codec; -use sp_std::vec::Vec; sp_api::decl_runtime_apis! { pub trait AssetsApi diff --git a/substrate/bin/node/runtime/src/impls.rs b/substrate/bin/node/runtime/src/impls.rs index dbe562857c9..6c121fad624 100644 --- a/substrate/bin/node/runtime/src/impls.rs +++ b/substrate/bin/node/runtime/src/impls.rs @@ -17,8 +17,7 @@ //! Some configurable implementations as associated type for the substrate runtime. -use polkadot_sdk::*; - +use alloc::boxed::Box; use frame_support::{ pallet_prelude::*, traits::{ @@ -29,7 +28,7 @@ use frame_support::{ use pallet_alliance::{IdentityVerifier, ProposalIndex, ProposalProvider}; use pallet_asset_tx_payment::HandleCredit; use pallet_identity::legacy::IdentityField; -use sp_std::prelude::*; +use polkadot_sdk::*; use crate::{ AccountId, AllianceCollective, AllianceMotion, Assets, Authorship, Balances, Hash, diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index fc87fea57ba..2d1f52066f8 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -22,8 +22,11 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limits. #![recursion_limit = "1024"] +extern crate alloc; + use polkadot_sdk::*; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_election_provider_support::{ bounds::{ElectionBounds, ElectionBoundsBuilder}, @@ -100,7 +103,6 @@ use sp_runtime::{ ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perbill, Percent, Permill, Perquintill, RuntimeDebug, }; -use sp_std::prelude::*; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -2660,7 +2662,7 @@ impl_runtime_apis! { Runtime::metadata_at_version(version) } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { Runtime::metadata_versions() } } diff --git a/substrate/client/executor/runtime-test/Cargo.toml b/substrate/client/executor/runtime-test/Cargo.toml index 5f5e7eb46d6..d132f47ff87 100644 --- a/substrate/client/executor/runtime-test/Cargo.toml +++ b/substrate/client/executor/runtime-test/Cargo.toml @@ -20,7 +20,6 @@ sp-core = { workspace = true } sp-io = { features = ["improved_panic_error_reporting"], workspace = true } sp-runtime = { workspace = true } sp-runtime-interface = { workspace = true } -sp-std = { workspace = true } [build-dependencies] substrate-wasm-builder = { optional = true, workspace = true, default-features = true } @@ -32,6 +31,5 @@ std = [ "sp-io/std", "sp-runtime-interface/std", "sp-runtime/std", - "sp-std/std", "substrate-wasm-builder", ] diff --git a/substrate/client/executor/runtime-test/src/lib.rs b/substrate/client/executor/runtime-test/src/lib.rs index 40683fbb664..08a5e39dff2 100644 --- a/substrate/client/executor/runtime-test/src/lib.rs +++ b/substrate/client/executor/runtime-test/src/lib.rs @@ -32,7 +32,10 @@ pub fn wasm_binary_unwrap() -> &'static [u8] { } #[cfg(not(feature = "std"))] -use sp_std::{vec, vec::Vec}; +extern crate alloc; + +#[cfg(not(feature = "std"))] +use alloc::{vec, vec::Vec}; #[cfg(not(feature = "std"))] use sp_core::{ed25519, sr25519}; @@ -332,7 +335,7 @@ sp_core::wasm_export_functions! { let test_message = b"Hello invalid heap memory"; let ptr = (heap_base + offset) as *mut u8; - let message_slice = unsafe { sp_std::slice::from_raw_parts_mut(ptr, test_message.len()) }; + let message_slice = unsafe { alloc::slice::from_raw_parts_mut(ptr, test_message.len()) }; assert_ne!(test_message, message_slice); message_slice.copy_from_slice(test_message); diff --git a/substrate/client/sysinfo/src/sysinfo.rs b/substrate/client/sysinfo/src/sysinfo.rs index 3fa583cf7ac..37b35fcb910 100644 --- a/substrate/client/sysinfo/src/sysinfo.rs +++ b/substrate/client/sysinfo/src/sysinfo.rs @@ -21,13 +21,13 @@ use crate::{ExecutionLimit, HwBench}; use sc_telemetry::SysInfo; use sp_core::{sr25519, Pair}; use sp_io::crypto::sr25519_verify; -use sp_std::{fmt, fmt::Formatter, prelude::*}; use derive_more::From; use rand::{seq::SliceRandom, Rng, RngCore}; use serde::{de::Visitor, Deserialize, Deserializer, Serialize, Serializer}; use std::{ - fmt::Display, + fmt, + fmt::{Display, Formatter}, fs::File, io::{Seek, SeekFrom, Write}, ops::{Deref, DerefMut}, diff --git a/substrate/frame/Cargo.toml b/substrate/frame/Cargo.toml index 594cb505cd6..41ece6c9a27 100644 --- a/substrate/frame/Cargo.toml +++ b/substrate/frame/Cargo.toml @@ -27,7 +27,6 @@ scale-info = { features = [ # primitive deps, used for developing FRAME pallets. sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-io = { workspace = true } sp-core = { workspace = true } sp-arithmetic = { workspace = true } @@ -104,7 +103,6 @@ std = [ "sp-offchain?/std", "sp-runtime/std", "sp-session?/std", - "sp-std/std", "sp-storage/std", "sp-transaction-pool?/std", "sp-version?/std", diff --git a/substrate/frame/alliance/Cargo.toml b/substrate/frame/alliance/Cargo.toml index 7ad9961d9b8..451b86b35dd 100644 --- a/substrate/frame/alliance/Cargo.toml +++ b/substrate/frame/alliance/Cargo.toml @@ -22,7 +22,6 @@ log = { workspace = true } codec = { features = ["derive"], workspace = true } scale-info = { features = ["derive"], workspace = true } -sp-std = { workspace = true } sp-core = { workspace = true } sp-crypto-hashing = { optional = true, workspace = true } sp-io = { workspace = true } @@ -57,7 +56,6 @@ std = [ "sp-crypto-hashing?/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "array-bytes", diff --git a/substrate/frame/alliance/src/lib.rs b/substrate/frame/alliance/src/lib.rs index ed771c7226e..be65f49e6e4 100644 --- a/substrate/frame/alliance/src/lib.rs +++ b/substrate/frame/alliance/src/lib.rs @@ -94,6 +94,9 @@ pub mod migration; mod types; pub mod weights; +extern crate alloc; + +use alloc::{boxed::Box, vec, vec::Vec}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; @@ -101,7 +104,6 @@ use sp_runtime::{ traits::{Dispatchable, Saturating, StaticLookup, Zero}, DispatchError, RuntimeDebug, }; -use sp_std::prelude::*; use frame_support::{ dispatch::{DispatchResult, DispatchResultWithPostInfo, GetDispatchInfo, PostDispatchInfo}, diff --git a/substrate/frame/alliance/src/types.rs b/substrate/frame/alliance/src/types.rs index 149030b52c6..75b949c19b3 100644 --- a/substrate/frame/alliance/src/types.rs +++ b/substrate/frame/alliance/src/types.rs @@ -15,11 +15,11 @@ // See the License for the specific language governing permissions and // limitations under the License. +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{traits::ConstU32, BoundedVec}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; -use sp_std::prelude::*; /// A Multihash instance that only supports the basic functionality and no hashing. #[derive( diff --git a/substrate/frame/asset-conversion/Cargo.toml b/substrate/frame/asset-conversion/Cargo.toml index 27d86bf6710..4e867ece1bd 100644 --- a/substrate/frame/asset-conversion/Cargo.toml +++ b/substrate/frame/asset-conversion/Cargo.toml @@ -25,7 +25,6 @@ scale-info = { features = ["derive"], workspace = true } sp-api = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } sp-arithmetic = { workspace = true } @@ -51,7 +50,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/asset-conversion/ops/Cargo.toml b/substrate/frame/asset-conversion/ops/Cargo.toml index 0dc6cd5b167..97a676fde10 100644 --- a/substrate/frame/asset-conversion/ops/Cargo.toml +++ b/substrate/frame/asset-conversion/ops/Cargo.toml @@ -24,7 +24,6 @@ pallet-asset-conversion = { workspace = true } scale-info = { features = ["derive"], workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } sp-arithmetic = { workspace = true } @@ -50,7 +49,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/asset-conversion/ops/src/benchmarking.rs b/substrate/frame/asset-conversion/ops/src/benchmarking.rs index a7370f38bc4..384e17c9f0a 100644 --- a/substrate/frame/asset-conversion/ops/src/benchmarking.rs +++ b/substrate/frame/asset-conversion/ops/src/benchmarking.rs @@ -28,7 +28,6 @@ use frame_system::RawOrigin as SystemOrigin; use pallet_asset_conversion::{BenchmarkHelper, Pallet as AssetConversion}; use sp_core::Get; use sp_runtime::traits::One; -use sp_std::prelude::*; /// Provides a pair of amounts expected to serve as sufficient initial liquidity for a pool. fn valid_liquidity_amount(ed1: T::Balance, ed2: T::Balance) -> (T::Balance, T::Balance) diff --git a/substrate/frame/asset-conversion/ops/src/lib.rs b/substrate/frame/asset-conversion/ops/src/lib.rs index a655a9cb445..58c15b47a3e 100644 --- a/substrate/frame/asset-conversion/ops/src/lib.rs +++ b/substrate/frame/asset-conversion/ops/src/lib.rs @@ -42,6 +42,9 @@ pub mod weights; pub use pallet::*; pub use weights::WeightInfo; +extern crate alloc; + +use alloc::boxed::Box; use frame_support::traits::{ fungible::{Inspect as FungibleInspect, Mutate as FungibleMutate}, fungibles::{roles::ResetTeam, Inspect, Mutate, Refund}, @@ -50,7 +53,6 @@ use frame_support::traits::{ }; use pallet_asset_conversion::{PoolLocator, Pools}; use sp_runtime::traits::{TryConvert, Zero}; -use sp_std::boxed::Box; #[frame_support::pallet] pub mod pallet { diff --git a/substrate/frame/asset-conversion/ops/src/mock.rs b/substrate/frame/asset-conversion/ops/src/mock.rs index 91c18b2e794..5c05faa6aa8 100644 --- a/substrate/frame/asset-conversion/ops/src/mock.rs +++ b/substrate/frame/asset-conversion/ops/src/mock.rs @@ -17,7 +17,6 @@ //! Test environment for Asset Conversion Ops pallet. -use super::*; use crate as pallet_asset_conversion_ops; use core::default::Default; use frame_support::{ diff --git a/substrate/frame/asset-conversion/src/benchmarking.rs b/substrate/frame/asset-conversion/src/benchmarking.rs index c5f68476b1d..b003fe48288 100644 --- a/substrate/frame/asset-conversion/src/benchmarking.rs +++ b/substrate/frame/asset-conversion/src/benchmarking.rs @@ -19,6 +19,8 @@ use super::*; use crate::Pallet as AssetConversion; +use alloc::vec; +use core::marker::PhantomData; use frame_benchmarking::{v2::*, whitelisted_caller}; use frame_support::{ assert_ok, @@ -29,7 +31,6 @@ use frame_support::{ }; use frame_system::RawOrigin as SystemOrigin; use sp_core::Get; -use sp_std::{marker::PhantomData, prelude::*}; /// Benchmark Helper pub trait BenchmarkHelper { diff --git a/substrate/frame/asset-conversion/src/lib.rs b/substrate/frame/asset-conversion/src/lib.rs index 62acb693efb..a9dc30375e5 100644 --- a/substrate/frame/asset-conversion/src/lib.rs +++ b/substrate/frame/asset-conversion/src/lib.rs @@ -70,6 +70,9 @@ pub use swap::*; pub use types::*; pub use weights::WeightInfo; +extern crate alloc; + +use alloc::{boxed::Box, collections::btree_set::BTreeSet, vec::Vec}; use codec::Codec; use frame_support::{ storage::{with_storage_layer, with_transaction}, @@ -93,7 +96,6 @@ use sp_runtime::{ }, DispatchError, Saturating, TokenError, TransactionOutcome, }; -use sp_std::{boxed::Box, collections::btree_set::BTreeSet, vec::Vec}; #[frame_support::pallet] pub mod pallet { diff --git a/substrate/frame/asset-rate/Cargo.toml b/substrate/frame/asset-rate/Cargo.toml index 96c87020684..4aeb6a39e82 100644 --- a/substrate/frame/asset-rate/Cargo.toml +++ b/substrate/frame/asset-rate/Cargo.toml @@ -23,7 +23,6 @@ frame-benchmarking = { optional = true, workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-core = { optional = true, workspace = true } [dev-dependencies] @@ -43,7 +42,6 @@ std = [ "sp-core?/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/asset-rate/src/lib.rs b/substrate/frame/asset-rate/src/lib.rs index 69f8267a4f2..cfb013a73f5 100644 --- a/substrate/frame/asset-rate/src/lib.rs +++ b/substrate/frame/asset-rate/src/lib.rs @@ -59,6 +59,9 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::boxed::Box; use frame_support::traits::{ fungible::Inspect, tokens::{ConversionFromAssetBalance, ConversionToAssetBalance}, @@ -67,7 +70,6 @@ use sp_runtime::{ traits::{CheckedDiv, Zero}, FixedPointNumber, FixedU128, }; -use sp_std::boxed::Box; pub use pallet::*; pub use weights::WeightInfo; diff --git a/substrate/frame/assets/Cargo.toml b/substrate/frame/assets/Cargo.toml index d0b5dc77789..802b8b9f39d 100644 --- a/substrate/frame/assets/Cargo.toml +++ b/substrate/frame/assets/Cargo.toml @@ -20,7 +20,6 @@ codec = { workspace = true } impl-trait-for-tuples = "0.2.2" log = { workspace = true } scale-info = { features = ["derive"], workspace = true } -sp-std = { workspace = true } # Needed for various traits. In our case, `OnFinalize`. sp-runtime = { workspace = true } # Needed for type-safe access to storage DB. @@ -48,7 +47,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/assets/src/benchmarking.rs b/substrate/frame/assets/src/benchmarking.rs index 1b65bb953d7..97cc04174a0 100644 --- a/substrate/frame/assets/src/benchmarking.rs +++ b/substrate/frame/assets/src/benchmarking.rs @@ -20,13 +20,13 @@ #![cfg(feature = "runtime-benchmarks")] use super::*; +use alloc::vec; use frame_benchmarking::v1::{ account, benchmarks_instance_pallet, whitelist_account, whitelisted_caller, BenchmarkError, }; use frame_support::traits::{EnsureOrigin, Get, UnfilteredDispatchable}; use frame_system::RawOrigin as SystemOrigin; use sp_runtime::traits::Bounded; -use sp_std::prelude::*; use crate::Pallet as Assets; @@ -76,7 +76,7 @@ fn swap_is_sufficient, I: 'static>(s: &mut bool) { let asset_id = default_asset_id::(); Asset::::mutate(&asset_id.into(), |maybe_a| { if let Some(ref mut a) = maybe_a { - sp_std::mem::swap(s, &mut a.is_sufficient) + core::mem::swap(s, &mut a.is_sufficient) } }); } diff --git a/substrate/frame/assets/src/functions.rs b/substrate/frame/assets/src/functions.rs index 1e4a9522759..c218c4ddc95 100644 --- a/substrate/frame/assets/src/functions.rs +++ b/substrate/frame/assets/src/functions.rs @@ -18,6 +18,7 @@ //! Functions for the Assets pallet. use super::*; +use alloc::vec; use frame_support::{defensive, traits::Get, BoundedVec}; #[must_use] @@ -35,20 +36,20 @@ impl, I: 'static> Pallet { /// Return the extra "sid-car" data for `id`/`who`, or `None` if the account doesn't exist. pub fn adjust_extra( id: T::AssetId, - who: impl sp_std::borrow::Borrow, + who: impl core::borrow::Borrow, ) -> Option> { ExtraMutator::maybe_new(id, who) } /// Get the asset `id` balance of `who`, or zero if the asset-account doesn't exist. - pub fn balance(id: T::AssetId, who: impl sp_std::borrow::Borrow) -> T::Balance { + pub fn balance(id: T::AssetId, who: impl core::borrow::Borrow) -> T::Balance { Self::maybe_balance(id, who).unwrap_or_default() } /// Get the asset `id` balance of `who` if the asset-account exists. pub fn maybe_balance( id: T::AssetId, - who: impl sp_std::borrow::Borrow, + who: impl core::borrow::Borrow, ) -> Option { Account::::get(id, who.borrow()).map(|a| a.balance) } diff --git a/substrate/frame/assets/src/impl_fungibles.rs b/substrate/frame/assets/src/impl_fungibles.rs index 30122f6d788..578fa08c4e6 100644 --- a/substrate/frame/assets/src/impl_fungibles.rs +++ b/substrate/frame/assets/src/impl_fungibles.rs @@ -17,6 +17,7 @@ //! Implementations for fungibles trait. +use alloc::vec::Vec; use frame_support::{ defensive, traits::tokens::{ diff --git a/substrate/frame/assets/src/lib.rs b/substrate/frame/assets/src/lib.rs index 6dbce717a8e..b9b5b2388df 100644 --- a/substrate/frame/assets/src/lib.rs +++ b/substrate/frame/assets/src/lib.rs @@ -167,13 +167,15 @@ mod impl_stored_map; mod types; pub use types::*; +extern crate alloc; + use scale_info::TypeInfo; use sp_runtime::{ traits::{AtLeast32BitUnsigned, CheckedAdd, CheckedSub, Saturating, StaticLookup, Zero}, ArithmeticError, DispatchError, TokenError, }; -use sp_std::prelude::*; +use alloc::vec::Vec; use core::marker::PhantomData; use frame_support::{ dispatch::DispatchResult, diff --git a/substrate/frame/atomic-swap/Cargo.toml b/substrate/frame/atomic-swap/Cargo.toml index 7e2f5fc74ab..03310063012 100644 --- a/substrate/frame/atomic-swap/Cargo.toml +++ b/substrate/frame/atomic-swap/Cargo.toml @@ -23,7 +23,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -39,7 +38,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/atomic-swap/src/lib.rs b/substrate/frame/atomic-swap/src/lib.rs index dc0300dc1a5..c3010f5c9c0 100644 --- a/substrate/frame/atomic-swap/src/lib.rs +++ b/substrate/frame/atomic-swap/src/lib.rs @@ -42,6 +42,9 @@ mod tests; +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode}; use core::{ marker::PhantomData, @@ -58,7 +61,6 @@ use frame_system::pallet_prelude::BlockNumberFor; use scale_info::TypeInfo; use sp_io::hashing::blake2_256; use sp_runtime::RuntimeDebug; -use sp_std::vec::Vec; /// Pending atomic swap operation. #[derive(Clone, Eq, PartialEq, RuntimeDebugNoBound, Encode, Decode, TypeInfo, MaxEncodedLen)] diff --git a/substrate/frame/aura/Cargo.toml b/substrate/frame/aura/Cargo.toml index 97582e7d2e9..f9d74592763 100644 --- a/substrate/frame/aura/Cargo.toml +++ b/substrate/frame/aura/Cargo.toml @@ -25,7 +25,6 @@ pallet-timestamp = { workspace = true } sp-application-crypto = { workspace = true } sp-consensus-aura = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-core = { workspace = true } @@ -45,7 +44,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/aura/src/lib.rs b/substrate/frame/aura/src/lib.rs index 3ca1444aaae..f829578fb28 100644 --- a/substrate/frame/aura/src/lib.rs +++ b/substrate/frame/aura/src/lib.rs @@ -38,6 +38,9 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ traits::{DisabledValidators, FindAuthor, Get, OnTimestampSet, OneSessionHandler}, @@ -50,7 +53,6 @@ use sp_runtime::{ traits::{IsMember, Member, SaturatedConversion, Saturating, Zero}, RuntimeAppPublic, }; -use sp_std::prelude::*; pub mod migrations; mod mock; @@ -66,7 +68,7 @@ const LOG_TARGET: &str = "runtime::aura"; /// /// This was the default behavior of the Aura pallet and may be used for /// backwards compatibility. -pub struct MinimumPeriodTimesTwo(sp_std::marker::PhantomData); +pub struct MinimumPeriodTimesTwo(core::marker::PhantomData); impl Get for MinimumPeriodTimesTwo { fn get() -> T::Moment { @@ -119,7 +121,7 @@ pub mod pallet { } #[pallet::pallet] - pub struct Pallet(sp_std::marker::PhantomData); + pub struct Pallet(core::marker::PhantomData); #[pallet::hooks] impl Hooks> for Pallet { @@ -362,7 +364,7 @@ impl FindAuthor for Pallet { /// We can not implement `FindAuthor` twice, because the compiler does not know if /// `u32 == T::AuthorityId` and thus, prevents us to implement the trait twice. #[doc(hidden)] -pub struct FindAccountFromAuthorIndex(sp_std::marker::PhantomData<(T, Inner)>); +pub struct FindAccountFromAuthorIndex(core::marker::PhantomData<(T, Inner)>); impl> FindAuthor for FindAccountFromAuthorIndex diff --git a/substrate/frame/authority-discovery/Cargo.toml b/substrate/frame/authority-discovery/Cargo.toml index 79057d94107..9d55a7fd5dc 100644 --- a/substrate/frame/authority-discovery/Cargo.toml +++ b/substrate/frame/authority-discovery/Cargo.toml @@ -28,7 +28,6 @@ pallet-session = { features = [ sp-application-crypto = { workspace = true } sp-authority-discovery = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-core = { workspace = true, default-features = true } @@ -47,7 +46,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/authority-discovery/src/lib.rs b/substrate/frame/authority-discovery/src/lib.rs index 16f71960d69..220b39292b5 100644 --- a/substrate/frame/authority-discovery/src/lib.rs +++ b/substrate/frame/authority-discovery/src/lib.rs @@ -23,12 +23,14 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use frame_support::{ traits::{Get, OneSessionHandler}, WeakBoundedVec, }; use sp_authority_discovery::AuthorityId; -use sp_std::prelude::*; pub use pallet::*; @@ -62,7 +64,7 @@ pub mod pallet { pub struct GenesisConfig { pub keys: Vec, #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -168,6 +170,7 @@ impl OneSessionHandler for Pallet { mod tests { use super::*; use crate as pallet_authority_discovery; + use alloc::vec; use frame_support::{derive_impl, parameter_types, traits::ConstU32}; use sp_application_crypto::Pair; use sp_authority_discovery::AuthorityPair; diff --git a/substrate/frame/authorship/Cargo.toml b/substrate/frame/authorship/Cargo.toml index 58292c0eba3..8ecacca93e0 100644 --- a/substrate/frame/authorship/Cargo.toml +++ b/substrate/frame/authorship/Cargo.toml @@ -24,7 +24,6 @@ scale-info = { features = ["derive"], workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-core = { workspace = true, default-features = true } @@ -40,7 +39,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/authorship/src/lib.rs b/substrate/frame/authorship/src/lib.rs index d8f1baab23c..a0cca806e78 100644 --- a/substrate/frame/authorship/src/lib.rs +++ b/substrate/frame/authorship/src/lib.rs @@ -22,7 +22,6 @@ #![cfg_attr(not(feature = "std"), no_std)] use frame_support::traits::FindAuthor; -use sp_std::prelude::*; pub use pallet::*; diff --git a/substrate/frame/babe/Cargo.toml b/substrate/frame/babe/Cargo.toml index 68638798e79..3dfda3b618b 100644 --- a/substrate/frame/babe/Cargo.toml +++ b/substrate/frame/babe/Cargo.toml @@ -32,7 +32,6 @@ sp-io = { workspace = true } sp-runtime = { features = ["serde"], workspace = true } sp-session = { workspace = true } sp-staking = { features = ["serde"], workspace = true } -sp-std = { workspace = true } [dev-dependencies] frame-election-provider-support = { workspace = true, default-features = true } @@ -65,7 +64,6 @@ std = [ "sp-runtime/std", "sp-session/std", "sp-staking/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/babe/src/equivocation.rs b/substrate/frame/babe/src/equivocation.rs index ed1df640583..4be07bdae1f 100644 --- a/substrate/frame/babe/src/equivocation.rs +++ b/substrate/frame/babe/src/equivocation.rs @@ -33,6 +33,7 @@ //! that the `ValidateUnsigned` for the BABE pallet is used in the runtime //! definition. +use alloc::{boxed::Box, vec, vec::Vec}; use frame_support::traits::{Get, KeyOwnerProofSystem}; use frame_system::pallet_prelude::HeaderFor; use log::{error, info}; @@ -50,7 +51,6 @@ use sp_staking::{ offence::{Kind, Offence, OffenceReportSystem, ReportOffence}, SessionIndex, }; -use sp_std::prelude::*; use crate::{Call, Config, Error, Pallet, LOG_TARGET}; @@ -104,7 +104,7 @@ impl Offence for EquivocationOffence { /// - On-chain validity checks and processing are mostly delegated to the user provided generic /// types implementing `KeyOwnerProofSystem` and `ReportOffence` traits. /// - Offence reporter for unsigned transactions is fetched via the the authorship pallet. -pub struct EquivocationReportSystem(sp_std::marker::PhantomData<(T, R, P, L)>); +pub struct EquivocationReportSystem(core::marker::PhantomData<(T, R, P, L)>); impl OffenceReportSystem, (EquivocationProof>, T::KeyOwnerProof)> diff --git a/substrate/frame/babe/src/lib.rs b/substrate/frame/babe/src/lib.rs index 9e16f1d0951..3e33d5627c4 100644 --- a/substrate/frame/babe/src/lib.rs +++ b/substrate/frame/babe/src/lib.rs @@ -21,6 +21,9 @@ #![cfg_attr(not(feature = "std"), no_std)] #![warn(unused_must_use, unsafe_code, unused_variables, unused_must_use)] +extern crate alloc; + +use alloc::{boxed::Box, vec, vec::Vec}; use codec::{Decode, Encode}; use frame_support::{ dispatch::{DispatchResultWithPostInfo, Pays}, @@ -44,7 +47,6 @@ use sp_runtime::{ }; use sp_session::{GetSessionNumber, GetValidatorCount}; use sp_staking::{offence::OffenceReportSystem, SessionIndex}; -use sp_std::prelude::*; pub use sp_consensus_babe::AuthorityId; @@ -315,7 +317,7 @@ pub mod pallet { pub authorities: Vec<(AuthorityId, BabeAuthorityWeight)>, pub epoch_config: BabeEpochConfiguration, #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -687,7 +689,7 @@ impl Pallet { // Update the start blocks of the previous and new current epoch. EpochStart::::mutate(|(previous_epoch_start_block, current_epoch_start_block)| { - *previous_epoch_start_block = sp_std::mem::take(current_epoch_start_block); + *previous_epoch_start_block = core::mem::take(current_epoch_start_block); *current_epoch_start_block = >::block_number(); }); @@ -868,7 +870,7 @@ impl Pallet { /// randomness. Returns the new randomness. fn randomness_change_epoch(next_epoch_index: u64) -> BabeRandomness { let this_randomness = NextRandomness::::get(); - let segment_idx: u32 = SegmentIndex::::mutate(|s| sp_std::mem::replace(s, 0)); + let segment_idx: u32 = SegmentIndex::::mutate(|s| core::mem::replace(s, 0)); // overestimate to the segment being full. let rho_size = (segment_idx.saturating_add(1) * UNDER_CONSTRUCTION_SEGMENT_LENGTH) as usize; @@ -1055,7 +1057,7 @@ pub mod migrations { fn pallet_prefix() -> &'static str; } - struct __OldNextEpochConfig(sp_std::marker::PhantomData); + struct __OldNextEpochConfig(core::marker::PhantomData); impl frame_support::traits::StorageInstance for __OldNextEpochConfig { fn pallet_prefix() -> &'static str { T::pallet_prefix() diff --git a/substrate/frame/bags-list/Cargo.toml b/substrate/frame/bags-list/Cargo.toml index bf57bd2af53..549c4334b55 100644 --- a/substrate/frame/bags-list/Cargo.toml +++ b/substrate/frame/bags-list/Cargo.toml @@ -25,7 +25,6 @@ scale-info = { features = [ # primitives sp-runtime = { workspace = true } -sp-std = { workspace = true } # FRAME frame-support = { workspace = true } @@ -66,7 +65,6 @@ std = [ "sp-core?/std", "sp-io?/std", "sp-runtime/std", - "sp-std/std", "sp-tracing?/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/bags-list/remote-tests/src/lib.rs b/substrate/frame/bags-list/remote-tests/src/lib.rs index 9f7c22d99da..1f0584fa07e 100644 --- a/substrate/frame/bags-list/remote-tests/src/lib.rs +++ b/substrate/frame/bags-list/remote-tests/src/lib.rs @@ -19,7 +19,6 @@ use frame_election_provider_support::ScoreProvider; use pallet_bags_list::Instance1; -use sp_std::prelude::*; /// A common log target to use. pub const LOG_TARGET: &str = "runtime::bags-list::remote-tests"; diff --git a/substrate/frame/bags-list/src/benchmarks.rs b/substrate/frame/bags-list/src/benchmarks.rs index 0c3955c0d7b..55f4c24835e 100644 --- a/substrate/frame/bags-list/src/benchmarks.rs +++ b/substrate/frame/bags-list/src/benchmarks.rs @@ -19,6 +19,7 @@ use super::*; use crate::list::List; +use alloc::{vec, vec::Vec}; use frame_benchmarking::v1::{ account, benchmarks_instance_pallet, whitelist_account, whitelisted_caller, }; diff --git a/substrate/frame/bags-list/src/lib.rs b/substrate/frame/bags-list/src/lib.rs index 8e3d4cc1f01..f6af1da5e7b 100644 --- a/substrate/frame/bags-list/src/lib.rs +++ b/substrate/frame/bags-list/src/lib.rs @@ -122,11 +122,13 @@ #[doc = docify::embed!("src/tests.rs", examples_work)] pub mod example {} +extern crate alloc; + +use alloc::boxed::Box; use codec::FullCodec; use frame_election_provider_support::{ScoreProvider, SortedListProvider}; use frame_system::ensure_signed; use sp_runtime::traits::{AtLeast32BitUnsigned, Bounded, StaticLookup}; -use sp_std::prelude::*; #[cfg(any(test, feature = "try-runtime", feature = "fuzz"))] use sp_runtime::TryRuntimeError; @@ -238,7 +240,7 @@ pub mod pallet { + Eq + Ord + PartialOrd - + sp_std::fmt::Debug + + core::fmt::Debug + Copy + AtLeast32BitUnsigned + Bounded @@ -465,7 +467,7 @@ impl, I: 'static> SortedListProvider for Pallet let node = list::Node::::get(who).unwrap(); let current_bag_idx = thresholds .iter() - .chain(sp_std::iter::once(&T::Score::max_value())) + .chain(core::iter::once(&T::Score::max_value())) .position(|w| w == &node.bag_upper) .unwrap(); diff --git a/substrate/frame/bags-list/src/list/mod.rs b/substrate/frame/bags-list/src/list/mod.rs index e90530341a1..696b64d40e9 100644 --- a/substrate/frame/bags-list/src/list/mod.rs +++ b/substrate/frame/bags-list/src/list/mod.rs @@ -25,7 +25,12 @@ //! interface. use crate::Config; +use alloc::{ + boxed::Box, + collections::{btree_map::BTreeMap, btree_set::BTreeSet}, +}; use codec::{Decode, Encode, MaxEncodedLen}; +use core::{iter, marker::PhantomData}; use frame_election_provider_support::ScoreProvider; use frame_support::{ defensive, ensure, @@ -34,14 +39,15 @@ use frame_support::{ }; use scale_info::TypeInfo; use sp_runtime::traits::{Bounded, Zero}; -use sp_std::{ - boxed::Box, - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - iter, - marker::PhantomData, - prelude::*, -}; +#[cfg(any( + test, + feature = "try-runtime", + feature = "fuzz", + feature = "std", + feature = "runtime-benchmarks" +))] +use alloc::vec::Vec; #[cfg(any(test, feature = "try-runtime", feature = "fuzz"))] use sp_runtime::TryRuntimeError; @@ -274,7 +280,7 @@ impl, I: 'static> List { let start_node = Node::::get(start).ok_or(ListError::NodeNotFound)?; let start_node_upper = start_node.bag_upper; - let start_bag = sp_std::iter::successors(start_node.next(), |prev| prev.next()); + let start_bag = core::iter::successors(start_node.next(), |prev| prev.next()); let thresholds = T::BagThresholds::get(); let idx = thresholds.partition_point(|&threshold| start_node_upper > threshold); @@ -341,7 +347,7 @@ impl, I: 'static> List { if !Self::contains(id) { return Err(ListError::NodeNotFound) } - let _ = Self::remove_many(sp_std::iter::once(id)); + let _ = Self::remove_many(core::iter::once(id)); Ok(()) } @@ -591,7 +597,7 @@ impl, I: 'static> List { Box::new(iter) } else { // otherwise, insert it here. - Box::new(iter.chain(sp_std::iter::once(T::Score::max_value()))) + Box::new(iter.chain(core::iter::once(T::Score::max_value()))) }; iter.filter_map(|t| { @@ -673,7 +679,7 @@ impl, I: 'static> Bag { /// Iterate over the nodes in this bag. pub(crate) fn iter(&self) -> impl Iterator> { - sp_std::iter::successors(self.head(), |prev| prev.next()) + core::iter::successors(self.head(), |prev| prev.next()) } /// Insert a new id into this bag. @@ -804,7 +810,7 @@ impl, I: 'static> Bag { #[cfg(feature = "std")] #[allow(dead_code)] pub fn std_iter(&self) -> impl Iterator> { - sp_std::iter::successors(self.head(), |prev| prev.next()) + core::iter::successors(self.head(), |prev| prev.next()) } } diff --git a/substrate/frame/bags-list/src/migrations.rs b/substrate/frame/bags-list/src/migrations.rs index 7df63a6a44c..bfc70fef370 100644 --- a/substrate/frame/bags-list/src/migrations.rs +++ b/substrate/frame/bags-list/src/migrations.rs @@ -28,10 +28,10 @@ use frame_support::ensure; use sp_runtime::TryRuntimeError; #[cfg(feature = "try-runtime")] -use sp_std::vec::Vec; +use alloc::vec::Vec; /// A struct that does not migration, but only checks that the counter prefix exists and is correct. -pub struct CheckCounterPrefix, I: 'static>(sp_std::marker::PhantomData<(T, I)>); +pub struct CheckCounterPrefix, I: 'static>(core::marker::PhantomData<(T, I)>); impl, I: 'static> OnRuntimeUpgrade for CheckCounterPrefix { fn on_runtime_upgrade() -> frame_support::weights::Weight { frame_support::weights::Weight::zero() @@ -88,7 +88,7 @@ mod old { } /// A struct that migrates all bags lists to contain a score value. -pub struct AddScore, I: 'static = ()>(sp_std::marker::PhantomData<(T, I)>); +pub struct AddScore, I: 'static = ()>(core::marker::PhantomData<(T, I)>); impl, I: 'static> OnRuntimeUpgrade for AddScore { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { diff --git a/substrate/frame/balances/Cargo.toml b/substrate/frame/balances/Cargo.toml index 5fa8fa84bf5..85734dce9e9 100644 --- a/substrate/frame/balances/Cargo.toml +++ b/substrate/frame/balances/Cargo.toml @@ -23,7 +23,6 @@ frame-benchmarking = { optional = true, workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } docify = { workspace = true } [dev-dependencies] @@ -46,7 +45,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] # Enable support for setting the existential deposit to zero. insecure_zero_ed = [] diff --git a/substrate/frame/balances/src/impl_currency.rs b/substrate/frame/balances/src/impl_currency.rs index d5fe9934e23..454aead1773 100644 --- a/substrate/frame/balances/src/impl_currency.rs +++ b/substrate/frame/balances/src/impl_currency.rs @@ -39,8 +39,8 @@ pub use imbalances::{NegativeImbalance, PositiveImbalance}; // of the inner member. mod imbalances { use super::{result, Config, Imbalance, RuntimeDebug, Saturating, TryDrop, Zero}; + use core::mem; use frame_support::traits::SameOrOther; - use sp_std::mem; /// Opaque, move-only struct with private fields that serves as a token denoting that /// funds have been created without any equal and opposite accounting. diff --git a/substrate/frame/balances/src/lib.rs b/substrate/frame/balances/src/lib.rs index d01884293c0..0aaf618b303 100644 --- a/substrate/frame/balances/src/lib.rs +++ b/substrate/frame/balances/src/lib.rs @@ -150,7 +150,11 @@ mod tests; mod types; pub mod weights; +extern crate alloc; + +use alloc::vec::Vec; use codec::{Codec, MaxEncodedLen}; +use core::{cmp, fmt::Debug, mem, result}; use frame_support::{ ensure, pallet_prelude::DispatchResult, @@ -176,7 +180,6 @@ use sp_runtime::{ }, ArithmeticError, DispatchError, FixedPointOperand, Perbill, RuntimeDebug, TokenError, }; -use sp_std::{cmp, fmt::Debug, mem, prelude::*, result}; pub use types::{ AccountData, AdjustmentDirection, BalanceLock, DustCleaner, ExtraFlags, Reasons, ReserveData, }; @@ -525,7 +528,7 @@ pub mod pallet { .iter() .map(|(x, _)| x) .cloned() - .collect::>(); + .collect::>(); assert!( endowed_accounts.len() == self.balances.len(), @@ -856,13 +859,13 @@ pub mod pallet { } /// Get the free balance of an account. - pub fn free_balance(who: impl sp_std::borrow::Borrow) -> T::Balance { + pub fn free_balance(who: impl core::borrow::Borrow) -> T::Balance { Self::account(who.borrow()).free } /// Get the balance of an account that can be used for transfers, reservations, or any other /// non-locking, non-transaction-fee activity. Will be at most `free_balance`. - pub fn usable_balance(who: impl sp_std::borrow::Borrow) -> T::Balance { + pub fn usable_balance(who: impl core::borrow::Borrow) -> T::Balance { >::reducible_balance(who.borrow(), Expendable, Polite) } @@ -870,14 +873,12 @@ pub mod pallet { /// or any other kind of fees, though). Will be at most `free_balance`. /// /// This requires that the account stays alive. - pub fn usable_balance_for_fees( - who: impl sp_std::borrow::Borrow, - ) -> T::Balance { + pub fn usable_balance_for_fees(who: impl core::borrow::Borrow) -> T::Balance { >::reducible_balance(who.borrow(), Protect, Polite) } /// Get the reserved balance of an account. - pub fn reserved_balance(who: impl sp_std::borrow::Borrow) -> T::Balance { + pub fn reserved_balance(who: impl core::borrow::Borrow) -> T::Balance { Self::account(who.borrow()).reserved } diff --git a/substrate/frame/beefy-mmr/Cargo.toml b/substrate/frame/beefy-mmr/Cargo.toml index b46998a8574..11a7b281e87 100644 --- a/substrate/frame/beefy-mmr/Cargo.toml +++ b/substrate/frame/beefy-mmr/Cargo.toml @@ -27,7 +27,6 @@ sp-consensus-beefy = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-api = { workspace = true } sp-state-machine = { workspace = true } @@ -56,7 +55,6 @@ std = [ "sp-runtime/std", "sp-staking/std", "sp-state-machine/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/beefy-mmr/src/lib.rs b/substrate/frame/beefy-mmr/src/lib.rs index 18ebc9d8f38..ec341cad208 100644 --- a/substrate/frame/beefy-mmr/src/lib.rs +++ b/substrate/frame/beefy-mmr/src/lib.rs @@ -33,9 +33,11 @@ //! //! and thanks to versioning can be easily updated in the future. +extern crate alloc; + use sp_runtime::traits::{Convert, Header, Member}; -use sp_std::prelude::*; +use alloc::vec::Vec; use codec::Decode; use pallet_mmr::{primitives::AncestryProof, LeafDataProvider, ParentNumberAndHash}; use sp_consensus_beefy::{ @@ -56,7 +58,7 @@ mod mock; mod tests; /// A BEEFY consensus digest item with MMR root hash. -pub struct DepositBeefyDigest(sp_std::marker::PhantomData); +pub struct DepositBeefyDigest(core::marker::PhantomData); impl pallet_mmr::primitives::OnNewRoot for DepositBeefyDigest where diff --git a/substrate/frame/beefy/Cargo.toml b/substrate/frame/beefy/Cargo.toml index 8ce3a05985b..089b817e226 100644 --- a/substrate/frame/beefy/Cargo.toml +++ b/substrate/frame/beefy/Cargo.toml @@ -24,7 +24,6 @@ sp-consensus-beefy = { features = ["serde"], workspace = true } sp-runtime = { features = ["serde"], workspace = true } sp-session = { workspace = true } sp-staking = { features = ["serde"], workspace = true } -sp-std = { workspace = true } [dev-dependencies] frame-election-provider-support = { workspace = true, default-features = true } @@ -61,7 +60,6 @@ std = [ "sp-session/std", "sp-staking/std", "sp-state-machine/std", - "sp-std/std", ] try-runtime = [ "frame-election-provider-support/try-runtime", diff --git a/substrate/frame/beefy/src/equivocation.rs b/substrate/frame/beefy/src/equivocation.rs index a1526e78111..15345e6ae19 100644 --- a/substrate/frame/beefy/src/equivocation.rs +++ b/substrate/frame/beefy/src/equivocation.rs @@ -34,6 +34,7 @@ //! that the `ValidateUnsigned` for the BEEFY pallet is used in the runtime //! definition. +use alloc::{vec, vec::Vec}; use codec::{self as codec, Decode, Encode}; use frame_support::traits::{Get, KeyOwnerProofSystem}; use frame_system::pallet_prelude::{BlockNumberFor, HeaderFor}; @@ -54,7 +55,6 @@ use sp_staking::{ offence::{Kind, Offence, OffenceReportSystem, ReportOffence}, SessionIndex, }; -use sp_std::prelude::*; use super::{Call, Config, Error, Pallet, LOG_TARGET}; @@ -122,7 +122,7 @@ where /// - On-chain validity checks and processing are mostly delegated to the user provided generic /// types implementing `KeyOwnerProofSystem` and `ReportOffence` traits. /// - Offence reporter for unsigned transactions is fetched via the authorship pallet. -pub struct EquivocationReportSystem(sp_std::marker::PhantomData<(T, R, P, L)>); +pub struct EquivocationReportSystem(core::marker::PhantomData<(T, R, P, L)>); /// Equivocation evidence convenience alias. pub enum EquivocationEvidenceFor { diff --git a/substrate/frame/beefy/src/lib.rs b/substrate/frame/beefy/src/lib.rs index a49f5d28f45..fd9a0027c6f 100644 --- a/substrate/frame/beefy/src/lib.rs +++ b/substrate/frame/beefy/src/lib.rs @@ -17,6 +17,9 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{boxed::Box, vec::Vec}; use codec::{Encode, MaxEncodedLen}; use frame_support::{ @@ -38,7 +41,6 @@ use sp_runtime::{ }; use sp_session::{GetSessionNumber, GetValidatorCount}; use sp_staking::{offence::OffenceReportSystem, SessionIndex}; -use sp_std::prelude::*; use sp_consensus_beefy::{ AncestryHelper, AuthorityIndex, BeefyAuthorityId, ConsensusLog, DoubleVotingProof, diff --git a/substrate/frame/benchmarking/Cargo.toml b/substrate/frame/benchmarking/Cargo.toml index a2c15951a59..61bc706963b 100644 --- a/substrate/frame/benchmarking/Cargo.toml +++ b/substrate/frame/benchmarking/Cargo.toml @@ -31,7 +31,6 @@ sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } sp-runtime-interface = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } static_assertions = { workspace = true, default-features = true } @@ -58,7 +57,6 @@ std = [ "sp-keystore/std", "sp-runtime-interface/std", "sp-runtime/std", - "sp-std/std", "sp-storage/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/benchmarking/pov/Cargo.toml b/substrate/frame/benchmarking/pov/Cargo.toml index 4341f011fcb..6a449fb597d 100644 --- a/substrate/frame/benchmarking/pov/Cargo.toml +++ b/substrate/frame/benchmarking/pov/Cargo.toml @@ -22,7 +22,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [features] default = ["std"] @@ -34,7 +33,6 @@ std = [ "scale-info/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/benchmarking/pov/src/benchmarking.rs b/substrate/frame/benchmarking/pov/src/benchmarking.rs index 7e6aa8e6bf6..bf3d406d0b2 100644 --- a/substrate/frame/benchmarking/pov/src/benchmarking.rs +++ b/substrate/frame/benchmarking/pov/src/benchmarking.rs @@ -247,7 +247,7 @@ mod benchmarks { #[benchmark(pov_mode = Measured)] fn measured_storage_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { - let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); + let v: sp_runtime::BoundedVec = alloc::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); #[block] { @@ -257,7 +257,7 @@ mod benchmarks { #[benchmark(pov_mode = MaxEncodedLen)] fn mel_storage_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { - let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); + let v: sp_runtime::BoundedVec = alloc::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); #[block] { @@ -267,7 +267,7 @@ mod benchmarks { #[benchmark(pov_mode = Measured)] fn measured_storage_double_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { - let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); + let v: sp_runtime::BoundedVec = alloc::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); LargeValue2::::put(&v); #[block] @@ -279,7 +279,7 @@ mod benchmarks { #[benchmark(pov_mode = MaxEncodedLen)] fn mel_storage_double_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { - let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); + let v: sp_runtime::BoundedVec = alloc::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); LargeValue2::::put(&v); #[block] @@ -293,7 +293,7 @@ mod benchmarks { Pov::LargeValue2: Measured })] fn mel_mixed_storage_double_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { - let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); + let v: sp_runtime::BoundedVec = alloc::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); LargeValue2::::put(&v); #[block] @@ -307,7 +307,7 @@ mod benchmarks { Pov::LargeValue2: MaxEncodedLen })] fn measured_mixed_storage_double_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { - let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); + let v: sp_runtime::BoundedVec = alloc::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); LargeValue2::::put(&v); #[block] @@ -319,8 +319,8 @@ mod benchmarks { #[benchmark(pov_mode = Measured)] fn storage_map_unbounded_both_measured_read(i: Linear<0, 1000>) { - UnboundedMap::::insert(i, sp_std::vec![0; i as usize]); - UnboundedMap2::::insert(i, sp_std::vec![0; i as usize]); + UnboundedMap::::insert(i, alloc::vec![0; i as usize]); + UnboundedMap2::::insert(i, alloc::vec![0; i as usize]); #[block] { assert!(UnboundedMap::::get(i).is_some()); @@ -333,7 +333,7 @@ mod benchmarks { })] fn storage_map_partial_unbounded_read(i: Linear<0, 1000>) { Map1M::::insert(i, 0); - UnboundedMap::::insert(i, sp_std::vec![0; i as usize]); + UnboundedMap::::insert(i, alloc::vec![0; i as usize]); #[block] { assert!(Map1M::::get(i).is_some()); @@ -346,7 +346,7 @@ mod benchmarks { })] fn storage_map_partial_unbounded_ignored_read(i: Linear<0, 1000>) { Map1M::::insert(i, 0); - UnboundedMap::::insert(i, sp_std::vec![0; i as usize]); + UnboundedMap::::insert(i, alloc::vec![0; i as usize]); #[block] { assert!(Map1M::::get(i).is_some()); @@ -379,7 +379,7 @@ mod benchmarks { #[benchmark] fn storage_iteration() { for i in 0..65000 { - UnboundedMapTwox::::insert(i, sp_std::vec![0; 64]); + UnboundedMapTwox::::insert(i, alloc::vec![0; 64]); } #[block] { diff --git a/substrate/frame/benchmarking/pov/src/lib.rs b/substrate/frame/benchmarking/pov/src/lib.rs index eb02ccc983c..4cdbaec2305 100644 --- a/substrate/frame/benchmarking/pov/src/lib.rs +++ b/substrate/frame/benchmarking/pov/src/lib.rs @@ -23,13 +23,15 @@ mod benchmarking; mod tests; mod weights; +extern crate alloc; + pub use pallet::*; #[frame_support::pallet] pub mod pallet { + use alloc::vec::Vec; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - use sp_std::prelude::*; #[pallet::pallet] pub struct Pallet(_); diff --git a/substrate/frame/benchmarking/src/baseline.rs b/substrate/frame/benchmarking/src/baseline.rs index e76d5aed7b8..711d2123ca8 100644 --- a/substrate/frame/benchmarking/src/baseline.rs +++ b/substrate/frame/benchmarking/src/baseline.rs @@ -21,12 +21,12 @@ #![cfg(feature = "runtime-benchmarks")] use crate::benchmarks; +use alloc::{vec, vec::Vec}; use frame_system::Pallet as System; use sp_runtime::{ traits::{AppVerify, Hash}, RuntimeAppPublic, }; -use sp_std::{vec, vec::Vec}; mod crypto { use sp_application_crypto::{app_crypto, sr25519, KeyTypeId}; diff --git a/substrate/frame/benchmarking/src/lib.rs b/substrate/frame/benchmarking/src/lib.rs index d4ee0abbecc..625da2a24bd 100644 --- a/substrate/frame/benchmarking/src/lib.rs +++ b/substrate/frame/benchmarking/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "std")] mod analysis; #[cfg(test)] @@ -35,6 +37,7 @@ pub mod v1; /// The exports are not stable and should not be relied on. #[doc(hidden)] pub mod __private { + pub use alloc::{boxed::Box, str, vec, vec::Vec}; pub use codec; pub use frame_support::{storage, traits}; pub use log; @@ -42,7 +45,6 @@ pub mod __private { pub use sp_core::defer; pub use sp_io::storage::root as storage_root; pub use sp_runtime::{traits::Zero, StateVersion}; - pub use sp_std::{self, boxed::Box, str, vec, vec::Vec}; pub use sp_storage::{well_known_keys, TrackedStorageKey}; } diff --git a/substrate/frame/benchmarking/src/tests.rs b/substrate/frame/benchmarking/src/tests.rs index bcca5fe7c2f..09011eadb03 100644 --- a/substrate/frame/benchmarking/src/tests.rs +++ b/substrate/frame/benchmarking/src/tests.rs @@ -25,7 +25,6 @@ use sp_runtime::{ traits::{BlakeTwo256, IdentityLookup}, BuildStorage, }; -use sp_std::prelude::*; use std::cell::RefCell; #[frame_support::pallet(dev_mode)] @@ -130,7 +129,6 @@ mod benchmarks { use frame_support::{assert_err, assert_ok, ensure, traits::Get}; use frame_system::RawOrigin; use rusty_fork::rusty_fork_test; - use sp_std::prelude::*; // Additional used internally by the benchmark macro. use super::pallet_test::{Call, Config, Pallet}; diff --git a/substrate/frame/benchmarking/src/tests_instance.rs b/substrate/frame/benchmarking/src/tests_instance.rs index d6e1cf99ef7..ecffbd1a018 100644 --- a/substrate/frame/benchmarking/src/tests_instance.rs +++ b/substrate/frame/benchmarking/src/tests_instance.rs @@ -25,7 +25,6 @@ use sp_runtime::{ traits::{BlakeTwo256, IdentityLookup}, BuildStorage, }; -use sp_std::prelude::*; #[frame_support::pallet] mod pallet_test { @@ -131,7 +130,6 @@ mod benchmarks { use crate::account; use frame_support::ensure; use frame_system::RawOrigin; - use sp_std::prelude::*; // Additional used internally by the benchmark macro. use super::pallet_test::{Call, Config, Pallet}; diff --git a/substrate/frame/benchmarking/src/utils.rs b/substrate/frame/benchmarking/src/utils.rs index bfa25f63ef3..ca362f7aa7e 100644 --- a/substrate/frame/benchmarking/src/utils.rs +++ b/substrate/frame/benchmarking/src/utils.rs @@ -16,6 +16,7 @@ // limitations under the License. //! Interfaces, types and utils for benchmarking a FRAME runtime. +use alloc::vec::Vec; use codec::{Decode, Encode}; use frame_support::{dispatch::DispatchErrorWithPostInfo, pallet_prelude::*, traits::StorageInfo}; use scale_info::TypeInfo; @@ -23,7 +24,6 @@ use scale_info::TypeInfo; use serde::{Deserialize, Serialize}; use sp_io::hashing::blake2_256; use sp_runtime::{traits::TrailingZeroInput, DispatchError}; -use sp_std::vec::Vec; use sp_storage::TrackedStorageKey; /// An alphabet of possible parameters to use for benchmarking. diff --git a/substrate/frame/benchmarking/src/v1.rs b/substrate/frame/benchmarking/src/v1.rs index 07778646237..d687f9fdfa1 100644 --- a/substrate/frame/benchmarking/src/v1.rs +++ b/substrate/frame/benchmarking/src/v1.rs @@ -1741,9 +1741,9 @@ pub fn show_benchmark_debug_info( * Components: {:?}\n\ * Verify: {:?}\n\ * Error message: {}", - sp_std::str::from_utf8(instance_string) + alloc::str::from_utf8(instance_string) .expect("it's all just strings ran through the wasm interface. qed"), - sp_std::str::from_utf8(benchmark) + alloc::str::from_utf8(benchmark) .expect("it's all just strings ran through the wasm interface. qed"), components, verify, diff --git a/substrate/frame/bounties/Cargo.toml b/substrate/frame/bounties/Cargo.toml index 4b242a1a577..cb9fa1f964b 100644 --- a/substrate/frame/bounties/Cargo.toml +++ b/substrate/frame/bounties/Cargo.toml @@ -28,7 +28,6 @@ pallet-treasury = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -47,7 +46,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/bounties/src/benchmarking.rs b/substrate/frame/bounties/src/benchmarking.rs index f53d95d919d..de93ba5c4ce 100644 --- a/substrate/frame/bounties/src/benchmarking.rs +++ b/substrate/frame/bounties/src/benchmarking.rs @@ -21,6 +21,7 @@ use super::*; +use alloc::{vec, vec::Vec}; use frame_benchmarking::v1::{ account, benchmarks_instance_pallet, whitelisted_caller, BenchmarkError, }; diff --git a/substrate/frame/bounties/src/lib.rs b/substrate/frame/bounties/src/lib.rs index c04bec2d12a..7b89a6e3e76 100644 --- a/substrate/frame/bounties/src/lib.rs +++ b/substrate/frame/bounties/src/lib.rs @@ -87,7 +87,9 @@ pub mod migrations; mod tests; pub mod weights; -use sp_std::prelude::*; +extern crate alloc; + +use alloc::vec::Vec; use frame_support::traits::{ Currency, ExistenceRequirement::AllowDeath, Get, Imbalance, OnUnbalanced, ReservableCurrency, diff --git a/substrate/frame/broker/Cargo.toml b/substrate/frame/broker/Cargo.toml index 77c4883e4a4..7593a4e8da1 100644 --- a/substrate/frame/broker/Cargo.toml +++ b/substrate/frame/broker/Cargo.toml @@ -20,7 +20,6 @@ codec = { features = ["derive"], workspace = true } scale-info = { features = ["derive"], workspace = true } bitvec = { workspace = true } sp-api = { workspace = true } -sp-std = { workspace = true } sp-arithmetic = { workspace = true } sp-core = { workspace = true } sp-runtime = { workspace = true } @@ -49,7 +48,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/broker/src/benchmarking.rs b/substrate/frame/broker/src/benchmarking.rs index 3c9ea4cdba4..33df56c95f6 100644 --- a/substrate/frame/broker/src/benchmarking.rs +++ b/substrate/frame/broker/src/benchmarking.rs @@ -20,6 +20,7 @@ use super::*; use crate::{CoreAssignment::Task, Pallet as Broker}; +use alloc::{vec, vec::Vec}; use frame_benchmarking::v2::*; use frame_support::{ storage::bounded_vec::BoundedVec, @@ -32,7 +33,6 @@ use frame_system::{Pallet as System, RawOrigin}; use sp_arithmetic::{traits::Zero, Perbill}; use sp_core::Get; use sp_runtime::{traits::BlockNumberProvider, Saturating}; -use sp_std::{vec, vec::Vec}; const SEED: u32 = 0; const MAX_CORE_COUNT: u16 = 1_000; diff --git a/substrate/frame/broker/src/coretime_interface.rs b/substrate/frame/broker/src/coretime_interface.rs index f92f8b22091..9c18e2c4ff0 100644 --- a/substrate/frame/broker/src/coretime_interface.rs +++ b/substrate/frame/broker/src/coretime_interface.rs @@ -17,13 +17,14 @@ #![deny(missing_docs)] +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; +use core::fmt::Debug; use frame_support::Parameter; use scale_info::TypeInfo; use sp_arithmetic::traits::AtLeast32BitUnsigned; use sp_core::RuntimeDebug; use sp_runtime::traits::BlockNumberProvider; -use sp_std::{fmt::Debug, vec::Vec}; use crate::Timeslice; diff --git a/substrate/frame/broker/src/lib.rs b/substrate/frame/broker/src/lib.rs index 4cb380bae91..45c33c1bfa6 100644 --- a/substrate/frame/broker/src/lib.rs +++ b/substrate/frame/broker/src/lib.rs @@ -47,12 +47,15 @@ pub use core_mask::*; pub use coretime_interface::*; pub use types::*; +extern crate alloc; + /// The log target for this pallet. const LOG_TARGET: &str = "runtime::broker"; #[frame_support::pallet] pub mod pallet { use super::*; + use alloc::vec::Vec; use frame_support::{ pallet_prelude::{DispatchResult, DispatchResultWithPostInfo, *}, traits::{ @@ -63,7 +66,6 @@ pub mod pallet { }; use frame_system::pallet_prelude::*; use sp_runtime::traits::{Convert, ConvertBack}; - use sp_std::vec::Vec; const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); @@ -496,7 +498,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] diff --git a/substrate/frame/broker/src/migration.rs b/substrate/frame/broker/src/migration.rs index 917f44a134c..c2a243d6f0e 100644 --- a/substrate/frame/broker/src/migration.rs +++ b/substrate/frame/broker/src/migration.rs @@ -23,9 +23,9 @@ use frame_support::traits::{Get, UncheckedOnRuntimeUpgrade}; use sp_runtime::Saturating; #[cfg(feature = "try-runtime")] -use frame_support::ensure; +use alloc::vec::Vec; #[cfg(feature = "try-runtime")] -use sp_std::vec::Vec; +use frame_support::ensure; mod v1 { use super::*; diff --git a/substrate/frame/broker/src/mock.rs b/substrate/frame/broker/src/mock.rs index f29651abff7..6b1d2bbf701 100644 --- a/substrate/frame/broker/src/mock.rs +++ b/substrate/frame/broker/src/mock.rs @@ -18,6 +18,7 @@ #![cfg(test)] use crate::{test_fungibles::TestFungibles, *}; +use alloc::collections::btree_map::BTreeMap; use frame_support::{ assert_ok, derive_impl, ensure, ord_parameter_types, parameter_types, traits::{ @@ -34,7 +35,6 @@ use sp_runtime::{ traits::{BlockNumberProvider, Identity}, BuildStorage, Saturating, }; -use sp_std::collections::btree_map::BTreeMap; type Block = frame_system::mocking::MockBlock; diff --git a/substrate/frame/broker/src/nonfungible_impl.rs b/substrate/frame/broker/src/nonfungible_impl.rs index 80dcc175df5..e272ecbe008 100644 --- a/substrate/frame/broker/src/nonfungible_impl.rs +++ b/substrate/frame/broker/src/nonfungible_impl.rs @@ -16,11 +16,11 @@ // limitations under the License. use super::*; +use alloc::vec::Vec; use frame_support::{ pallet_prelude::{DispatchResult, *}, traits::nonfungible::{Inspect, Mutate, Transfer}, }; -use sp_std::vec::Vec; impl Inspect for Pallet { type ItemId = u128; diff --git a/substrate/frame/broker/src/test_fungibles.rs b/substrate/frame/broker/src/test_fungibles.rs index d18bff14953..b0a06fc1a32 100644 --- a/substrate/frame/broker/src/test_fungibles.rs +++ b/substrate/frame/broker/src/test_fungibles.rs @@ -15,6 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +use alloc::collections::btree_map::BTreeMap; use codec::{Decode, Encode}; use frame_support::{ parameter_types, @@ -29,7 +30,6 @@ use scale_info::TypeInfo; use sp_arithmetic::traits::Zero; use sp_core::{Get, TypedGet}; use sp_runtime::{DispatchError, DispatchResult}; -use sp_std::collections::btree_map::BTreeMap; parameter_types! { static TestAssetOf: BTreeMap<(u32, Vec), Vec> = Default::default(); diff --git a/substrate/frame/broker/src/tick_impls.rs b/substrate/frame/broker/src/tick_impls.rs index 3292faa4eb7..71a1286d739 100644 --- a/substrate/frame/broker/src/tick_impls.rs +++ b/substrate/frame/broker/src/tick_impls.rs @@ -16,10 +16,10 @@ // limitations under the License. use super::*; +use alloc::{vec, vec::Vec}; use frame_support::{pallet_prelude::*, traits::defensive_prelude::*, weights::WeightMeter}; use sp_arithmetic::traits::{One, SaturatedConversion, Saturating, Zero}; use sp_runtime::traits::ConvertBack; -use sp_std::{vec, vec::Vec}; use CompletionStatus::Complete; impl Pallet { diff --git a/substrate/frame/child-bounties/Cargo.toml b/substrate/frame/child-bounties/Cargo.toml index d0072e3a476..9c979b41462 100644 --- a/substrate/frame/child-bounties/Cargo.toml +++ b/substrate/frame/child-bounties/Cargo.toml @@ -29,7 +29,6 @@ pallet-treasury = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -49,7 +48,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking", diff --git a/substrate/frame/child-bounties/src/benchmarking.rs b/substrate/frame/child-bounties/src/benchmarking.rs index 947cfcfaa96..b1f6370f334 100644 --- a/substrate/frame/child-bounties/src/benchmarking.rs +++ b/substrate/frame/child-bounties/src/benchmarking.rs @@ -21,6 +21,8 @@ use super::*; +use alloc::{vec, vec::Vec}; + use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller, BenchmarkError}; use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; diff --git a/substrate/frame/child-bounties/src/lib.rs b/substrate/frame/child-bounties/src/lib.rs index 04a1f9799cb..911fd4c4c49 100644 --- a/substrate/frame/child-bounties/src/lib.rs +++ b/substrate/frame/child-bounties/src/lib.rs @@ -56,7 +56,9 @@ mod benchmarking; mod tests; pub mod weights; -use sp_std::prelude::*; +extern crate alloc; + +use alloc::vec::Vec; use frame_support::traits::{ Currency, diff --git a/substrate/frame/collective/Cargo.toml b/substrate/frame/collective/Cargo.toml index 6fc4bb77829..7d9a4c41c81 100644 --- a/substrate/frame/collective/Cargo.toml +++ b/substrate/frame/collective/Cargo.toml @@ -25,7 +25,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [features] default = ["std"] @@ -39,7 +38,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/collective/src/lib.rs b/substrate/frame/collective/src/lib.rs index d0009d02f68..3544a8cddb4 100644 --- a/substrate/frame/collective/src/lib.rs +++ b/substrate/frame/collective/src/lib.rs @@ -41,14 +41,17 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{boxed::Box, vec, vec::Vec}; use codec::{Decode, Encode, MaxEncodedLen}; +use core::{marker::PhantomData, result}; use scale_info::TypeInfo; use sp_io::storage; use sp_runtime::{ traits::{Dispatchable, Hash}, DispatchError, RuntimeDebug, }; -use sp_std::{marker::PhantomData, prelude::*, result}; use frame_support::{ dispatch::{ @@ -239,7 +242,7 @@ pub mod pallet { #[pallet::genesis_build] impl, I: 'static> BuildGenesisConfig for GenesisConfig { fn build(&self) { - use sp_std::collections::btree_set::BTreeSet; + use alloc::collections::btree_set::BTreeSet; let members_set: BTreeSet<_> = self.members.iter().collect(); assert_eq!( members_set.len(), diff --git a/substrate/frame/contracts/mock-network/Cargo.toml b/substrate/frame/contracts/mock-network/Cargo.toml index 7df5d304c34..85d98206ea5 100644 --- a/substrate/frame/contracts/mock-network/Cargo.toml +++ b/substrate/frame/contracts/mock-network/Cargo.toml @@ -36,7 +36,6 @@ sp-core = { workspace = true } sp-io = { workspace = true } sp-keystore = { workspace = true, default-features = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-tracing = { workspace = true, default-features = true } xcm = { workspace = true } xcm-builder = { workspace = true, default-features = true } @@ -67,7 +66,6 @@ std = [ "sp-io/std", "sp-keystore/std", "sp-runtime/std", - "sp-std/std", "xcm-executor/std", "xcm/std", ] diff --git a/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs b/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs index bfdf6dd97ea..6e922c16c29 100644 --- a/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs +++ b/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs @@ -25,7 +25,6 @@ use polkadot_parachain_primitives::primitives::{ use polkadot_primitives::BlockNumber as RelayBlockNumber; use sp_runtime::traits::{Get, Hash}; -use sp_std::prelude::*; use xcm::{latest::prelude::*, VersionedXcm}; #[frame_support::pallet] diff --git a/substrate/frame/contracts/mock-network/src/parachain.rs b/substrate/frame/contracts/mock-network/src/parachain.rs index f35846ba32c..3579b46ea6e 100644 --- a/substrate/frame/contracts/mock-network/src/parachain.rs +++ b/substrate/frame/contracts/mock-network/src/parachain.rs @@ -35,7 +35,6 @@ use pallet_xcm::XcmPassthrough; use sp_core::{ConstU32, ConstU64, H256}; use sp_runtime::traits::{Get, IdentityLookup, MaybeEquivalence}; -use sp_std::prelude::*; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, diff --git a/substrate/frame/contracts/proc-macro/src/lib.rs b/substrate/frame/contracts/proc-macro/src/lib.rs index f91f8660cd3..84ea7de00a2 100644 --- a/substrate/frame/contracts/proc-macro/src/lib.rs +++ b/substrate/frame/contracts/proc-macro/src/lib.rs @@ -649,7 +649,7 @@ fn expand_functions(def: &EnvDef, expand_mode: ExpandMode) -> TokenStream2 { quote! { let result = #body; if ::log::log_enabled!(target: "runtime::contracts::strace", ::log::Level::Trace) { - use sp_std::fmt::Write; + use core::fmt::Write; let mut w = sp_std::Writer::default(); let _ = core::write!(&mut w, #trace_fmt_str, #( #trace_fmt_args, )* result); let msg = core::str::from_utf8(&w.inner()).unwrap_or_default(); diff --git a/substrate/frame/contracts/src/benchmarking/call_builder.rs b/substrate/frame/contracts/src/benchmarking/call_builder.rs index 5d73d825fca..d87eaba7343 100644 --- a/substrate/frame/contracts/src/benchmarking/call_builder.rs +++ b/substrate/frame/contracts/src/benchmarking/call_builder.rs @@ -23,11 +23,11 @@ use crate::{ BalanceOf, Config, DebugBufferVec, Determinism, ExecReturnValue, GasMeter, Origin, Schedule, TypeInfo, WasmBlob, Weight, }; +use alloc::{vec, vec::Vec}; use codec::{Encode, HasCompact}; use core::fmt::Debug; use frame_benchmarking::benchmarking; use sp_core::Get; -use sp_std::prelude::*; type StackExt<'a, T> = Stack<'a, T, WasmBlob>; diff --git a/substrate/frame/contracts/src/benchmarking/code.rs b/substrate/frame/contracts/src/benchmarking/code.rs index 65bcf30683c..1473022b553 100644 --- a/substrate/frame/contracts/src/benchmarking/code.rs +++ b/substrate/frame/contracts/src/benchmarking/code.rs @@ -25,9 +25,9 @@ //! compiles it down into a `WasmModule` that can be used as a contract's code. use crate::Config; +use alloc::{borrow::ToOwned, vec, vec::Vec}; use frame_support::traits::Get; use sp_runtime::{traits::Hash, Saturating}; -use sp_std::{borrow::ToOwned, prelude::*}; use wasm_instrument::parity_wasm::{ builder, elements::{ @@ -338,7 +338,7 @@ pub mod body { .cycle() .take(instructions.len() * usize::try_from(repetitions).unwrap()) .cloned() - .chain(sp_std::iter::once(Instruction::End)) + .chain(core::iter::once(Instruction::End)) .collect(), ); FuncBody::new(locals.to_vec(), instructions) diff --git a/substrate/frame/contracts/src/benchmarking/mod.rs b/substrate/frame/contracts/src/benchmarking/mod.rs index 80c7e863d29..612f929e8b1 100644 --- a/substrate/frame/contracts/src/benchmarking/mod.rs +++ b/substrate/frame/contracts/src/benchmarking/mod.rs @@ -34,6 +34,7 @@ use crate::{ wasm::BenchEnv, Pallet as Contracts, *, }; +use alloc::{vec, vec::Vec}; use codec::{Encode, MaxEncodedLen}; use frame_benchmarking::v2::*; use frame_support::{ @@ -46,7 +47,6 @@ use frame_system::RawOrigin; use pallet_balances; use pallet_contracts_uapi::{CallFlags, ReturnErrorCode}; use sp_runtime::traits::{Bounded, Hash}; -use sp_std::prelude::*; use wasm_instrument::parity_wasm::elements::{Instruction, Local, ValueType}; /// How many runs we do per API benchmark. @@ -186,7 +186,7 @@ fn caller_funding() -> BalanceOf { #[benchmarks( where - as codec::HasCompact>::Type: Clone + Eq + PartialEq + sp_std::fmt::Debug + scale_info::TypeInfo + codec::Encode, + as codec::HasCompact>::Type: Clone + Eq + PartialEq + core::fmt::Debug + scale_info::TypeInfo + codec::Encode, T: Config + pallet_balances::Config, BalanceOf: From< as Currency>::Balance>, as Currency>::Balance: From>, diff --git a/substrate/frame/contracts/src/chain_extension.rs b/substrate/frame/contracts/src/chain_extension.rs index f3a67fcb09a..b9bb451fd73 100644 --- a/substrate/frame/contracts/src/chain_extension.rs +++ b/substrate/frame/contracts/src/chain_extension.rs @@ -74,17 +74,18 @@ use crate::{ wasm::{Runtime, RuntimeCosts}, Error, }; +use alloc::vec::Vec; use codec::{Decode, MaxEncodedLen}; +use core::marker::PhantomData; use frame_support::weights::Weight; use sp_runtime::DispatchError; -use sp_std::{marker::PhantomData, vec::Vec}; pub use crate::{exec::Ext, gas::ChargedAmount, storage::meter::Diff, Config}; pub use frame_system::Config as SysConfig; pub use pallet_contracts_uapi::ReturnFlags; /// Result that returns a [`DispatchError`] on error. -pub type Result = sp_std::result::Result; +pub type Result = core::result::Result; /// A trait used to extend the set of contract callable functions. /// diff --git a/substrate/frame/contracts/src/exec.rs b/substrate/frame/contracts/src/exec.rs index 84a3f7dc2a1..0cc4844166f 100644 --- a/substrate/frame/contracts/src/exec.rs +++ b/substrate/frame/contracts/src/exec.rs @@ -24,6 +24,8 @@ use crate::{ DebugBufferVec, Determinism, Error, Event, Nonce, Origin, Pallet as Contracts, Schedule, LOG_TARGET, }; +use alloc::vec::Vec; +use core::{fmt::Debug, marker::PhantomData, mem}; use frame_support::{ crypto::ecdsa::ECDSAExt, dispatch::{DispatchResult, DispatchResultWithPostInfo}, @@ -49,7 +51,6 @@ use sp_runtime::{ traits::{Convert, Dispatchable, Zero}, DispatchError, }; -use sp_std::{fmt::Debug, marker::PhantomData, mem, prelude::*, vec::Vec}; pub type AccountIdOf = ::AccountId; pub type MomentOf = <::Time as Time>::Moment; @@ -1185,12 +1186,12 @@ where /// /// The iterator starts with the top frame and ends with the root frame. fn frames(&self) -> impl Iterator> { - sp_std::iter::once(&self.first_frame).chain(&self.frames).rev() + core::iter::once(&self.first_frame).chain(&self.frames).rev() } /// Same as `frames` but with a mutable reference as iterator item. fn frames_mut(&mut self) -> impl Iterator> { - sp_std::iter::once(&mut self.first_frame).chain(&mut self.frames).rev() + core::iter::once(&mut self.first_frame).chain(&mut self.frames).rev() } /// Returns whether the current contract is on the stack multiple times. diff --git a/substrate/frame/contracts/src/lib.rs b/substrate/frame/contracts/src/lib.rs index 33083c7ebe7..ed00fdca62f 100644 --- a/substrate/frame/contracts/src/lib.rs +++ b/substrate/frame/contracts/src/lib.rs @@ -87,6 +87,7 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(feature = "runtime-benchmarks", recursion_limit = "1024")] +extern crate alloc; mod address; mod benchmarking; mod exec; @@ -115,6 +116,7 @@ use crate::{ wasm::{CodeInfo, WasmBlob}, }; use codec::{Codec, Decode, Encode, HasCompact, MaxEncodedLen}; +use core::fmt::Debug; use environmental::*; use frame_support::{ dispatch::{GetDispatchInfo, Pays, PostDispatchInfo, RawOrigin, WithPostDispatchInfo}, @@ -137,7 +139,6 @@ use sp_runtime::{ traits::{BadOrigin, Convert, Dispatchable, Saturating, StaticLookup, Zero}, DispatchError, RuntimeDebug, }; -use sp_std::{fmt::Debug, prelude::*}; pub use crate::{ address::{AddressGenerator, DefaultAddressGenerator}, diff --git a/substrate/frame/contracts/src/migration.rs b/substrate/frame/contracts/src/migration.rs index c633ba9c2d5..29ac74d0d50 100644 --- a/substrate/frame/contracts/src/migration.rs +++ b/substrate/frame/contracts/src/migration.rs @@ -69,17 +69,16 @@ include!(concat!(env!("OUT_DIR"), "/migration_codegen.rs")); use crate::{weights::WeightInfo, Config, Error, MigrationInProgress, Pallet, Weight, LOG_TARGET}; use codec::{Codec, Decode}; +use core::marker::PhantomData; use frame_support::{ pallet_prelude::*, traits::{ConstU32, OnRuntimeUpgrade}, weights::WeightMeter, }; use sp_runtime::Saturating; -use sp_std::marker::PhantomData; #[cfg(feature = "try-runtime")] -use sp_std::prelude::*; - +use alloc::vec::Vec; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; @@ -604,7 +603,7 @@ mod test { let mut meter = WeightMeter::with_limit(Weight::from_all(1)); let result = Migrations::steps(version, &cursor, &mut meter); - cursor = vec![1u8, 0].try_into().unwrap(); + cursor = alloc::vec![1u8, 0].try_into().unwrap(); assert_eq!(result, StepResult::InProgress { cursor: cursor.clone(), steps_done: 1 }); assert_eq!(meter.consumed(), Weight::from_all(1)); diff --git a/substrate/frame/contracts/src/migration/v09.rs b/substrate/frame/contracts/src/migration/v09.rs index 7e84191910d..6a67395174f 100644 --- a/substrate/frame/contracts/src/migration/v09.rs +++ b/substrate/frame/contracts/src/migration/v09.rs @@ -22,13 +22,13 @@ use crate::{ weights::WeightInfo, CodeHash, Config, Determinism, Pallet, Weight, LOG_TARGET, }; +use alloc::vec::Vec; use codec::{Decode, Encode}; use frame_support::{ pallet_prelude::*, storage_alias, weights::WeightMeter, DefaultNoBound, Identity, }; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; -use sp_std::prelude::*; mod v8 { use super::*; @@ -56,7 +56,7 @@ pub fn store_old_dummy_code(len: usize) { instruction_weights_version: 0, initial: 0, maximum: 0, - code: vec![42u8; len], + code: alloc::vec![42u8; len], }; let hash = T::Hashing::hash(&module.code); v8::CodeStorage::::insert(hash, module); diff --git a/substrate/frame/contracts/src/migration/v10.rs b/substrate/frame/contracts/src/migration/v10.rs index 61632a1fd1b..23e7fd238bb 100644 --- a/substrate/frame/contracts/src/migration/v10.rs +++ b/substrate/frame/contracts/src/migration/v10.rs @@ -40,13 +40,15 @@ use frame_support::{ DefaultNoBound, }; use sp_core::hexdisplay::HexDisplay; -#[cfg(feature = "try-runtime")] -use sp_runtime::TryRuntimeError; use sp_runtime::{ traits::{Hash, TrailingZeroInput, Zero}, Perbill, Saturating, }; -use sp_std::prelude::*; + +#[cfg(feature = "try-runtime")] +use alloc::vec::Vec; +#[cfg(feature = "try-runtime")] +use sp_runtime::TryRuntimeError; mod v9 { use super::*; diff --git a/substrate/frame/contracts/src/migration/v11.rs b/substrate/frame/contracts/src/migration/v11.rs index 9b4316162ca..bd128e22869 100644 --- a/substrate/frame/contracts/src/migration/v11.rs +++ b/substrate/frame/contracts/src/migration/v11.rs @@ -23,11 +23,13 @@ use crate::{ weights::WeightInfo, Config, Pallet, TrieId, Weight, LOG_TARGET, }; +use alloc::vec::Vec; use codec::{Decode, Encode}; +use core::marker::PhantomData; use frame_support::{pallet_prelude::*, storage_alias, weights::WeightMeter, DefaultNoBound}; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; -use sp_std::{marker::PhantomData, prelude::*}; + mod v10 { use super::*; diff --git a/substrate/frame/contracts/src/migration/v12.rs b/substrate/frame/contracts/src/migration/v12.rs index aad51a9edca..3c33591e435 100644 --- a/substrate/frame/contracts/src/migration/v12.rs +++ b/substrate/frame/contracts/src/migration/v12.rs @@ -23,6 +23,7 @@ use crate::{ weights::WeightInfo, AccountIdOf, BalanceOf, CodeHash, Config, Determinism, Pallet, Weight, LOG_TARGET, }; +use alloc::vec::Vec; use codec::{Decode, Encode}; use frame_support::{ pallet_prelude::*, storage_alias, traits::ReservableCurrency, weights::WeightMeter, @@ -33,7 +34,6 @@ use sp_core::hexdisplay::HexDisplay; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; use sp_runtime::{traits::Zero, FixedPointNumber, FixedU128, Saturating}; -use sp_std::prelude::*; mod v11 { use super::*; @@ -109,7 +109,7 @@ where { use sp_runtime::traits::Hash; - let code = vec![42u8; len]; + let code = alloc::vec![42u8; len]; let hash = T::Hashing::hash(&code); PristineCode::::insert(hash, code.clone()); diff --git a/substrate/frame/contracts/src/migration/v13.rs b/substrate/frame/contracts/src/migration/v13.rs index 6929bbce28e..d1888b338da 100644 --- a/substrate/frame/contracts/src/migration/v13.rs +++ b/substrate/frame/contracts/src/migration/v13.rs @@ -26,7 +26,6 @@ use crate::{ use codec::{Decode, Encode}; use frame_support::{pallet_prelude::*, storage_alias, weights::WeightMeter, DefaultNoBound}; use sp_runtime::BoundedBTreeMap; -use sp_std::prelude::*; mod v12 { use super::*; diff --git a/substrate/frame/contracts/src/migration/v14.rs b/substrate/frame/contracts/src/migration/v14.rs index 017fd6d0c15..11336fe2e7d 100644 --- a/substrate/frame/contracts/src/migration/v14.rs +++ b/substrate/frame/contracts/src/migration/v14.rs @@ -26,6 +26,8 @@ use crate::{ weights::WeightInfo, BalanceOf, CodeHash, Config, Determinism, HoldReason, Pallet, Weight, LOG_TARGET, }; +#[cfg(feature = "try-runtime")] +use alloc::collections::btree_map::BTreeMap; use codec::{Decode, Encode}; #[cfg(feature = "try-runtime")] use environmental::Vec; @@ -42,8 +44,6 @@ use sp_core::hexdisplay::HexDisplay; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; use sp_runtime::{traits::Zero, Saturating}; -#[cfg(feature = "try-runtime")] -use sp_std::collections::btree_map::BTreeMap; mod v13 { use super::*; @@ -80,8 +80,8 @@ where T: Config, OldCurrency: ReservableCurrency<::AccountId> + 'static, { + use alloc::vec; use sp_runtime::traits::Hash; - use sp_std::vec; let len = T::MaxCodeLen::get(); let code = vec![42u8; len as usize]; diff --git a/substrate/frame/contracts/src/migration/v15.rs b/substrate/frame/contracts/src/migration/v15.rs index 3c700d1c0b0..11f07282d56 100644 --- a/substrate/frame/contracts/src/migration/v15.rs +++ b/substrate/frame/contracts/src/migration/v15.rs @@ -28,6 +28,8 @@ use crate::{ AccountIdOf, BalanceOf, CodeHash, Config, HoldReason, Pallet, TrieId, Weight, LOG_TARGET, }; #[cfg(feature = "try-runtime")] +use alloc::vec::Vec; +#[cfg(feature = "try-runtime")] use frame_support::traits::fungible::InspectHold; use frame_support::{ pallet_prelude::*, @@ -44,8 +46,6 @@ use sp_core::hexdisplay::HexDisplay; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; use sp_runtime::{traits::Zero, Saturating}; -#[cfg(feature = "try-runtime")] -use sp_std::vec::Vec; mod v14 { use super::*; diff --git a/substrate/frame/contracts/src/migration/v16.rs b/substrate/frame/contracts/src/migration/v16.rs index 74fbc997718..3d5b2d2a85f 100644 --- a/substrate/frame/contracts/src/migration/v16.rs +++ b/substrate/frame/contracts/src/migration/v16.rs @@ -26,7 +26,6 @@ use crate::{ use codec::{Decode, Encode}; use frame_support::{pallet_prelude::*, storage_alias, DefaultNoBound}; use sp_runtime::{BoundedBTreeMap, Saturating}; -use sp_std::prelude::*; #[cfg(feature = "runtime-benchmarks")] pub fn store_old_contract_info( diff --git a/substrate/frame/contracts/src/primitives.rs b/substrate/frame/contracts/src/primitives.rs index ab73b28e8c4..622a69f529f 100644 --- a/substrate/frame/contracts/src/primitives.rs +++ b/substrate/frame/contracts/src/primitives.rs @@ -17,6 +17,7 @@ //! A crate that hosts a common definitions that are relevant for the pallet-contracts. +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::weights::Weight; use pallet_contracts_uapi::ReturnFlags; @@ -25,7 +26,6 @@ use sp_runtime::{ traits::{Saturating, Zero}, DispatchError, RuntimeDebug, }; -use sp_std::prelude::*; /// Result type of a `bare_call` or `bare_instantiate` call as well as `ContractsApi::call` and /// `ContractsApi::instantiate`. diff --git a/substrate/frame/contracts/src/storage.rs b/substrate/frame/contracts/src/storage.rs index 1e9739a1599..23b5a2514eb 100644 --- a/substrate/frame/contracts/src/storage.rs +++ b/substrate/frame/contracts/src/storage.rs @@ -25,7 +25,9 @@ use crate::{ BalanceOf, CodeHash, CodeInfo, Config, ContractInfoOf, DeletionQueue, DeletionQueueCounter, Error, TrieId, SENTINEL, }; +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; +use core::marker::PhantomData; use frame_support::{ storage::child::{self, ChildInfo}, weights::{Weight, WeightMeter}, @@ -38,7 +40,6 @@ use sp_runtime::{ traits::{Hash, Saturating, Zero}, BoundedBTreeMap, DispatchError, DispatchResult, RuntimeDebug, }; -use sp_std::{marker::PhantomData, prelude::*}; use self::meter::Diff; diff --git a/substrate/frame/contracts/src/storage/meter.rs b/substrate/frame/contracts/src/storage/meter.rs index 7c55ce5d3f0..951cb25994e 100644 --- a/substrate/frame/contracts/src/storage/meter.rs +++ b/substrate/frame/contracts/src/storage/meter.rs @@ -22,6 +22,8 @@ use crate::{ Inspect, Origin, Pallet, StorageDeposit as Deposit, System, LOG_TARGET, }; +use alloc::vec::Vec; +use core::{fmt::Debug, marker::PhantomData}; use frame_support::{ ensure, traits::{ @@ -37,7 +39,6 @@ use sp_runtime::{ traits::{Saturating, Zero}, DispatchError, FixedPointNumber, FixedU128, }; -use sp_std::{fmt::Debug, marker::PhantomData, vec::Vec}; /// Deposit that uses the native fungible's balance type. pub type DepositOf = Deposit>; diff --git a/substrate/frame/contracts/src/tests.rs b/substrate/frame/contracts/src/tests.rs index c20577a3f64..3f608d90bea 100644 --- a/substrate/frame/contracts/src/tests.rs +++ b/substrate/frame/contracts/src/tests.rs @@ -458,7 +458,7 @@ parameter_types! { pub static InstantiateAccount: Option<::AccountId> = None; } -pub struct EnsureAccount(sp_std::marker::PhantomData<(T, A)>); +pub struct EnsureAccount(core::marker::PhantomData<(T, A)>); impl>>> EnsureOrigin<::RuntimeOrigin> for EnsureAccount where diff --git a/substrate/frame/contracts/src/wasm/mod.rs b/substrate/frame/contracts/src/wasm/mod.rs index 0d65d696758..2fef07f8b7a 100644 --- a/substrate/frame/contracts/src/wasm/mod.rs +++ b/substrate/frame/contracts/src/wasm/mod.rs @@ -48,6 +48,7 @@ use crate::{ AccountIdOf, BadOrigin, BalanceOf, CodeHash, CodeInfoOf, CodeVec, Config, Error, Event, HoldReason, Pallet, PristineCode, Schedule, Weight, LOG_TARGET, }; +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ dispatch::DispatchResult, @@ -56,7 +57,6 @@ use frame_support::{ }; use sp_core::Get; use sp_runtime::{DispatchError, RuntimeDebug}; -use sp_std::prelude::*; use wasmi::{CompilationMode, InstancePre, Linker, Memory, MemoryType, StackLimits, Store}; const BYTES_PER_PAGE: usize = 64 * 1024; diff --git a/substrate/frame/contracts/src/wasm/prepare.rs b/substrate/frame/contracts/src/wasm/prepare.rs index 50eb6d62532..93fe3080d22 100644 --- a/substrate/frame/contracts/src/wasm/prepare.rs +++ b/substrate/frame/contracts/src/wasm/prepare.rs @@ -28,10 +28,10 @@ use crate::{ }, AccountIdOf, CodeVec, Config, Error, Schedule, LOG_TARGET, }; +#[cfg(any(test, feature = "runtime-benchmarks"))] +use alloc::vec::Vec; use codec::MaxEncodedLen; use sp_runtime::{traits::Hash, DispatchError}; -#[cfg(any(test, feature = "runtime-benchmarks"))] -use sp_std::prelude::Vec; use wasmi::{ core::ValType as WasmiValueType, CompilationMode, Config as WasmiConfig, Engine, ExternType, Module, StackLimits, @@ -56,7 +56,7 @@ pub enum LoadingMode { #[cfg(test)] pub mod tracker { - use sp_std::cell::RefCell; + use core::cell::RefCell; thread_local! { pub static LOADED_MODULE: RefCell> = RefCell::new(Vec::new()); } diff --git a/substrate/frame/contracts/src/wasm/runtime.rs b/substrate/frame/contracts/src/wasm/runtime.rs index 5f50dbf391a..50b06de080c 100644 --- a/substrate/frame/contracts/src/wasm/runtime.rs +++ b/substrate/frame/contracts/src/wasm/runtime.rs @@ -24,7 +24,9 @@ use crate::{ weights::WeightInfo, BalanceOf, CodeHash, Config, DebugBufferVec, Error, SENTINEL, }; +use alloc::{boxed::Box, vec, vec::Vec}; use codec::{Decode, DecodeLimit, Encode, MaxEncodedLen}; +use core::fmt; use frame_support::{ dispatch::DispatchInfo, ensure, pallet_prelude::DispatchResultWithPostInfo, parameter_types, traits::Get, weights::Weight, @@ -36,7 +38,6 @@ use sp_runtime::{ traits::{Bounded, Zero}, DispatchError, RuntimeDebug, }; -use sp_std::{fmt, prelude::*}; use wasmi::{core::HostError, errors::LinkerError, Linker, Memory, Store}; type CallOf = ::RuntimeCall; @@ -1900,7 +1901,7 @@ pub mod env { data_len: u32, ) -> Result<(), TrapReason> { let num_topic = topics_len - .checked_div(sp_std::mem::size_of::>() as u32) + .checked_div(core::mem::size_of::>() as u32) .ok_or("Zero sized topics are not allowed")?; ctx.charge_gas(RuntimeCosts::DepositEvent { num_topic, len: data_len })?; if data_len > ctx.ext.max_value_size() { diff --git a/substrate/frame/conviction-voting/Cargo.toml b/substrate/frame/conviction-voting/Cargo.toml index b96809b8aeb..6184b0ffd6e 100644 --- a/substrate/frame/conviction-voting/Cargo.toml +++ b/substrate/frame/conviction-voting/Cargo.toml @@ -28,7 +28,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -49,7 +48,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/conviction-voting/src/benchmarking.rs b/substrate/frame/conviction-voting/src/benchmarking.rs index 8701ed7ebb0..546ad538535 100644 --- a/substrate/frame/conviction-voting/src/benchmarking.rs +++ b/substrate/frame/conviction-voting/src/benchmarking.rs @@ -19,6 +19,7 @@ use super::*; +use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use assert_matches::assert_matches; use frame_benchmarking::v1::{account, benchmarks_instance_pallet, whitelist_account}; use frame_support::{ @@ -30,7 +31,6 @@ use frame_support::{ }, }; use sp_runtime::traits::Bounded; -use sp_std::collections::btree_map::BTreeMap; use crate::Pallet as ConvictionVoting; diff --git a/substrate/frame/conviction-voting/src/lib.rs b/substrate/frame/conviction-voting/src/lib.rs index 466fc70a619..be7f7f44807 100644 --- a/substrate/frame/conviction-voting/src/lib.rs +++ b/substrate/frame/conviction-voting/src/lib.rs @@ -27,6 +27,8 @@ #![recursion_limit = "256"] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use frame_support::{ dispatch::DispatchResult, ensure, @@ -40,7 +42,6 @@ use sp_runtime::{ traits::{AtLeast32BitUnsigned, Saturating, StaticLookup, Zero}, ArithmeticError, DispatchError, Perbill, }; -use sp_std::prelude::*; mod conviction; mod types; @@ -559,7 +560,7 @@ impl, I: 'static> Pallet { ensure!(balance <= T::Currency::total_balance(&who), Error::::InsufficientFunds); let votes = VotingFor::::try_mutate(&who, &class, |voting| -> Result { - let old = sp_std::mem::replace( + let old = core::mem::replace( voting, Voting::Delegating(Delegating { balance, @@ -596,7 +597,7 @@ impl, I: 'static> Pallet { fn try_undelegate(who: T::AccountId, class: ClassOf) -> Result { let votes = VotingFor::::try_mutate(&who, &class, |voting| -> Result { - match sp_std::mem::replace(voting, Voting::default()) { + match core::mem::replace(voting, Voting::default()) { Voting::Delegating(Delegating { balance, target, diff --git a/substrate/frame/conviction-voting/src/types.rs b/substrate/frame/conviction-voting/src/types.rs index 2c45b54485b..d6bbb678a14 100644 --- a/substrate/frame/conviction-voting/src/types.rs +++ b/substrate/frame/conviction-voting/src/types.rs @@ -18,6 +18,7 @@ //! Miscellaneous additional datatypes. use codec::{Codec, Decode, Encode, MaxEncodedLen}; +use core::{fmt::Debug, marker::PhantomData}; use frame_support::{ traits::VoteTally, CloneNoBound, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound, }; @@ -26,7 +27,6 @@ use sp_runtime::{ traits::{Saturating, Zero}, RuntimeDebug, }; -use sp_std::{fmt::Debug, marker::PhantomData}; use super::*; use crate::{AccountVote, Conviction, Vote}; diff --git a/substrate/frame/conviction-voting/src/vote.rs b/substrate/frame/conviction-voting/src/vote.rs index 5ae08f0de65..1c5b742ba12 100644 --- a/substrate/frame/conviction-voting/src/vote.rs +++ b/substrate/frame/conviction-voting/src/vote.rs @@ -25,7 +25,6 @@ use sp_runtime::{ traits::{Saturating, Zero}, RuntimeDebug, }; -use sp_std::prelude::*; /// A number of lock periods, plus a vote, one way or the other. #[derive(Copy, Clone, Eq, PartialEq, Default, RuntimeDebug, MaxEncodedLen)] diff --git a/substrate/frame/core-fellowship/Cargo.toml b/substrate/frame/core-fellowship/Cargo.toml index 44290402594..7ef6f9e11eb 100644 --- a/substrate/frame/core-fellowship/Cargo.toml +++ b/substrate/frame/core-fellowship/Cargo.toml @@ -26,7 +26,6 @@ sp-arithmetic = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } pallet-ranked-collective = { optional = true, workspace = true } [features] @@ -44,7 +43,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/core-fellowship/src/benchmarking.rs b/substrate/frame/core-fellowship/src/benchmarking.rs index 34461e062b3..adb8a4a091b 100644 --- a/substrate/frame/core-fellowship/src/benchmarking.rs +++ b/substrate/frame/core-fellowship/src/benchmarking.rs @@ -22,6 +22,7 @@ use super::*; use crate::Pallet as CoreFellowship; +use alloc::{boxed::Box, vec}; use frame_benchmarking::v2::*; use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; use sp_arithmetic::traits::Bounded; diff --git a/substrate/frame/core-fellowship/src/lib.rs b/substrate/frame/core-fellowship/src/lib.rs index 5ed2562d6d0..c61447e3628 100644 --- a/substrate/frame/core-fellowship/src/lib.rs +++ b/substrate/frame/core-fellowship/src/lib.rs @@ -57,11 +57,14 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::boxed::Box; use codec::{Decode, Encode, MaxEncodedLen}; +use core::{fmt::Debug, marker::PhantomData}; use scale_info::TypeInfo; use sp_arithmetic::traits::{Saturating, Zero}; use sp_runtime::RuntimeDebug; -use sp_std::{fmt::Debug, marker::PhantomData, prelude::*}; use frame_support::{ defensive, diff --git a/substrate/frame/core-fellowship/src/migration.rs b/substrate/frame/core-fellowship/src/migration.rs index b8b5540a4b4..b1e27d1e793 100644 --- a/substrate/frame/core-fellowship/src/migration.rs +++ b/substrate/frame/core-fellowship/src/migration.rs @@ -24,6 +24,8 @@ use frame_support::{ BoundedVec, }; +#[cfg(feature = "try-runtime")] +use alloc::vec::Vec; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; diff --git a/substrate/frame/delegated-staking/Cargo.toml b/substrate/frame/delegated-staking/Cargo.toml index 0c1bcf0df0c..a7751e1d6c1 100644 --- a/substrate/frame/delegated-staking/Cargo.toml +++ b/substrate/frame/delegated-staking/Cargo.toml @@ -16,7 +16,6 @@ codec = { features = ["derive"], workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } scale-info = { features = ["derive"], workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } sp-staking = { workspace = true } @@ -48,7 +47,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-election-provider-support/runtime-benchmarks", diff --git a/substrate/frame/delegated-staking/src/impls.rs b/substrate/frame/delegated-staking/src/impls.rs index 9f5649672d7..f8df9dfe7b4 100644 --- a/substrate/frame/delegated-staking/src/impls.rs +++ b/substrate/frame/delegated-staking/src/impls.rs @@ -139,7 +139,7 @@ impl OnStakingUpdate> for Pallet { fn on_slash( who: &T::AccountId, _slashed_active: BalanceOf, - _slashed_unlocking: &sp_std::collections::btree_map::BTreeMap>, + _slashed_unlocking: &alloc::collections::btree_map::BTreeMap>, slashed_total: BalanceOf, ) { >::mutate(who, |maybe_register| match maybe_register { diff --git a/substrate/frame/delegated-staking/src/lib.rs b/substrate/frame/delegated-staking/src/lib.rs index f16bb0d1dc0..61809dcb54e 100644 --- a/substrate/frame/delegated-staking/src/lib.rs +++ b/substrate/frame/delegated-staking/src/lib.rs @@ -132,10 +132,13 @@ mod mock; mod tests; mod types; +extern crate alloc; + pub use pallet::*; use types::*; +use core::convert::TryInto; use frame_support::{ pallet_prelude::*, traits::{ @@ -154,7 +157,6 @@ use sp_runtime::{ ArithmeticError, DispatchResult, Perbill, RuntimeDebug, Saturating, }; use sp_staking::{Agent, Delegator, EraIndex, StakingInterface, StakingUnchecked}; -use sp_std::{convert::TryInto, prelude::*}; pub type BalanceOf = <::Currency as FunInspect<::AccountId>>::Balance; @@ -779,7 +781,7 @@ impl Pallet { } #[cfg(any(test, feature = "try-runtime"))] -use sp_std::collections::btree_map::BTreeMap; +use alloc::collections::btree_map::BTreeMap; #[cfg(any(test, feature = "try-runtime"))] impl Pallet { diff --git a/substrate/frame/democracy/Cargo.toml b/substrate/frame/democracy/Cargo.toml index 6a44951e09c..ce5ffa57d57 100644 --- a/substrate/frame/democracy/Cargo.toml +++ b/substrate/frame/democracy/Cargo.toml @@ -26,7 +26,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-core = { workspace = true } log = { workspace = true } @@ -51,7 +50,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/democracy/src/benchmarking.rs b/substrate/frame/democracy/src/benchmarking.rs index 799d614c37f..ee36e9212f5 100644 --- a/substrate/frame/democracy/src/benchmarking.rs +++ b/substrate/frame/democracy/src/benchmarking.rs @@ -85,8 +85,8 @@ fn assert_has_event(generic_event: ::RuntimeEvent) { // note a new preimage. fn note_preimage() -> T::Hash { + use alloc::borrow::Cow; use core::sync::atomic::{AtomicU8, Ordering}; - use sp_std::borrow::Cow; // note a new preimage on every function invoke. static COUNTER: AtomicU8 = AtomicU8::new(0); let data = Cow::from(vec![COUNTER.fetch_add(1, Ordering::Relaxed)]); diff --git a/substrate/frame/democracy/src/lib.rs b/substrate/frame/democracy/src/lib.rs index e3b4696f8b2..27bc36a756e 100644 --- a/substrate/frame/democracy/src/lib.rs +++ b/substrate/frame/democracy/src/lib.rs @@ -152,6 +152,9 @@ #![recursion_limit = "256"] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; use frame_support::{ ensure, @@ -168,7 +171,6 @@ use sp_runtime::{ traits::{BadOrigin, Bounded as ArithBounded, One, Saturating, StaticLookup, Zero}, ArithmeticError, DispatchError, DispatchResult, }; -use sp_std::prelude::*; mod conviction; mod types; @@ -438,7 +440,7 @@ pub mod pallet { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - _config: sp_std::marker::PhantomData, + _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -1433,7 +1435,7 @@ impl Pallet { delegations: Default::default(), prior: Default::default(), }; - sp_std::mem::swap(&mut old, voting); + core::mem::swap(&mut old, voting); match old { Voting::Delegating { balance, target, conviction, delegations, mut prior, .. @@ -1474,7 +1476,7 @@ impl Pallet { fn try_undelegate(who: T::AccountId) -> Result { let votes = VotingOf::::try_mutate(&who, |voting| -> Result { let mut old = Voting::default(); - sp_std::mem::swap(&mut old, voting); + core::mem::swap(&mut old, voting); match old { Voting::Delegating { balance, target, conviction, delegations, mut prior } => { // remove any delegation votes to our current target. diff --git a/substrate/frame/democracy/src/migrations/unlock_and_unreserve_all_funds.rs b/substrate/frame/democracy/src/migrations/unlock_and_unreserve_all_funds.rs index 1cb50a157b1..ca0e0f7a091 100644 --- a/substrate/frame/democracy/src/migrations/unlock_and_unreserve_all_funds.rs +++ b/substrate/frame/democracy/src/migrations/unlock_and_unreserve_all_funds.rs @@ -19,6 +19,7 @@ //! pallet. use crate::{PropIndex, Voting, DEMOCRACY_ID}; +use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use core::iter::Sum; use frame_support::{ pallet_prelude::ValueQuery, @@ -29,7 +30,6 @@ use frame_support::{ }; use sp_core::Get; use sp_runtime::{traits::Zero, BoundedVec, Saturating}; -use sp_std::{collections::btree_map::BTreeMap, vec::Vec}; const LOG_TARGET: &str = "runtime::democracy::migrations::unlock_and_unreserve_all_funds"; @@ -87,7 +87,7 @@ type VotingOf = StorageMap< /// The pallet should be made inoperable before this migration is run. /// /// (See also [`RemovePallet`][frame_support::migrations::RemovePallet]) -pub struct UnlockAndUnreserveAllFunds(sp_std::marker::PhantomData); +pub struct UnlockAndUnreserveAllFunds(core::marker::PhantomData); impl UnlockAndUnreserveAllFunds { /// Calculates and returns the total amounts reserved by each account by this pallet, and all @@ -170,8 +170,8 @@ where /// the actual total reserved amount for any accounts. #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + use alloc::collections::btree_set::BTreeSet; use codec::Encode; - use sp_std::collections::btree_set::BTreeSet; // Get staked and deposited balances as reported by this pallet. let (account_deposits, account_locks, _) = Self::get_account_deposits_and_locks(); diff --git a/substrate/frame/democracy/src/vote.rs b/substrate/frame/democracy/src/vote.rs index b3fe9aa28e1..779f7ecd570 100644 --- a/substrate/frame/democracy/src/vote.rs +++ b/substrate/frame/democracy/src/vote.rs @@ -25,7 +25,6 @@ use sp_runtime::{ traits::{Saturating, Zero}, BoundedVec, RuntimeDebug, }; -use sp_std::prelude::*; /// A number of lock periods, plus a vote, one way or the other. #[derive(Copy, Clone, Eq, PartialEq, Default, RuntimeDebug)] diff --git a/substrate/frame/election-provider-multi-phase/Cargo.toml b/substrate/frame/election-provider-multi-phase/Cargo.toml index 941d720f2c6..4d1f521d726 100644 --- a/substrate/frame/election-provider-multi-phase/Cargo.toml +++ b/substrate/frame/election-provider-multi-phase/Cargo.toml @@ -27,7 +27,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } -sp-std = { workspace = true } sp-core = { workspace = true } sp-runtime = { workspace = true } sp-npos-elections = { workspace = true } @@ -68,7 +67,6 @@ std = [ "sp-io/std", "sp-npos-elections/std", "sp-runtime/std", - "sp-std/std", "sp-tracing/std", "strum/std", ] diff --git a/substrate/frame/election-provider-multi-phase/src/helpers.rs b/substrate/frame/election-provider-multi-phase/src/helpers.rs index a3f27fc18f0..8269b2cb73b 100644 --- a/substrate/frame/election-provider-multi-phase/src/helpers.rs +++ b/substrate/frame/election-provider-multi-phase/src/helpers.rs @@ -21,7 +21,7 @@ use crate::{ unsigned::{MinerConfig, MinerVoterOf}, SolutionTargetIndexOf, SolutionVoterIndexOf, VoteWeight, }; -use sp_std::{collections::btree_map::BTreeMap, prelude::*}; +use alloc::{collections::btree_map::BTreeMap, vec::Vec}; #[macro_export] macro_rules! log { diff --git a/substrate/frame/election-provider-multi-phase/src/lib.rs b/substrate/frame/election-provider-multi-phase/src/lib.rs index 63b4c49cdfe..9ce8b3890a6 100644 --- a/substrate/frame/election-provider-multi-phase/src/lib.rs +++ b/substrate/frame/election-provider-multi-phase/src/lib.rs @@ -229,6 +229,9 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{boxed::Box, vec::Vec}; use codec::{Decode, Encode}; use frame_election_provider_support::{ bounds::{CountBound, ElectionBounds, ElectionBoundsBuilder, SizeBound}, @@ -256,7 +259,6 @@ use sp_runtime::{ }, DispatchError, ModuleError, PerThing, Perbill, RuntimeDebug, SaturatedConversion, }; -use sp_std::prelude::*; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; @@ -837,7 +839,7 @@ pub mod pallet { } fn integrity_test() { - use sp_std::mem::size_of; + use core::mem::size_of; // The index type of both voters and targets need to be smaller than that of usize (very // unlikely to be the case, but anyhow).. assert!(size_of::>() <= size_of::()); @@ -1354,7 +1356,7 @@ pub mod pallet { /// This wrapper is created for handling the synchronization of [`Snapshot`], [`SnapshotMetadata`] /// and [`DesiredTargets`] storage items. -pub struct SnapshotWrapper(sp_std::marker::PhantomData); +pub struct SnapshotWrapper(core::marker::PhantomData); impl SnapshotWrapper { /// Kill all snapshot related storage items at the same time. diff --git a/substrate/frame/election-provider-multi-phase/src/migrations.rs b/substrate/frame/election-provider-multi-phase/src/migrations.rs index 156f1c02e27..73a2d878f15 100644 --- a/substrate/frame/election-provider-multi-phase/src/migrations.rs +++ b/substrate/frame/election-provider-multi-phase/src/migrations.rs @@ -16,15 +16,15 @@ // limitations under the License. pub mod v1 { + use alloc::collections::btree_map::BTreeMap; use frame_support::{ storage::unhashed, traits::{Defensive, GetStorageVersion, OnRuntimeUpgrade}, BoundedVec, }; - use sp_std::collections::btree_map::BTreeMap; use crate::*; - pub struct MigrateToV1(sp_std::marker::PhantomData); + pub struct MigrateToV1(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { let current = Pallet::::in_code_storage_version(); diff --git a/substrate/frame/election-provider-multi-phase/src/signed.rs b/substrate/frame/election-provider-multi-phase/src/signed.rs index ae830ed0382..fe07e477e1d 100644 --- a/substrate/frame/election-provider-multi-phase/src/signed.rs +++ b/substrate/frame/election-provider-multi-phase/src/signed.rs @@ -24,7 +24,12 @@ use crate::{ ReadySolution, SignedSubmissionIndices, SignedSubmissionNextIndex, SignedSubmissionsMap, SolutionOf, SolutionOrSnapshotSize, Weight, WeightInfo, }; +use alloc::{ + collections::{btree_map::BTreeMap, btree_set::BTreeSet}, + vec::Vec, +}; use codec::{Decode, Encode, HasCompact}; +use core::cmp::Ordering; use frame_election_provider_support::NposSolution; use frame_support::traits::{ defensive_prelude::*, Currency, Get, OnUnbalanced, ReservableCurrency, @@ -37,11 +42,6 @@ use sp_runtime::{ traits::{Convert, Saturating, Zero}, FixedPointNumber, FixedPointOperand, FixedU128, Percent, RuntimeDebug, }; -use sp_std::{ - cmp::Ordering, - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - vec::Vec, -}; /// A raw, unchecked signed submission. /// diff --git a/substrate/frame/election-provider-multi-phase/src/unsigned.rs b/substrate/frame/election-provider-multi-phase/src/unsigned.rs index 8b25815eca1..728ab930238 100644 --- a/substrate/frame/election-provider-multi-phase/src/unsigned.rs +++ b/substrate/frame/election-provider-multi-phase/src/unsigned.rs @@ -21,6 +21,7 @@ use crate::{ helpers, Call, Config, ElectionCompute, Error, FeasibilityError, Pallet, RawSolution, ReadySolution, RoundSnapshot, SolutionAccuracyOf, SolutionOf, SolutionOrSnapshotSize, Weight, }; +use alloc::{boxed::Box, vec::Vec}; use codec::Encode; use frame_election_provider_support::{NposSolution, NposSolver, PerThing128, VoteWeight}; use frame_support::{ @@ -39,7 +40,6 @@ use sp_runtime::{ offchain::storage::{MutateStorageError, StorageValueRef}, DispatchError, SaturatedConversion, }; -use sp_std::prelude::*; /// Storage key used to store the last block number at which offchain worker ran. pub(crate) const OFFCHAIN_LAST_BLOCK: &[u8] = b"parity/multi-phase-unsigned-election"; @@ -396,14 +396,14 @@ impl Pallet { /// Configurations for a miner that comes with this pallet. pub trait MinerConfig { /// The account id type. - type AccountId: Ord + Clone + codec::Codec + sp_std::fmt::Debug; + type AccountId: Ord + Clone + codec::Codec + core::fmt::Debug; /// The solution that the miner is mining. type Solution: codec::Codec + Default + PartialEq + Eq + Clone - + sp_std::fmt::Debug + + core::fmt::Debug + Ord + NposSolution + TypeInfo; @@ -428,7 +428,7 @@ pub trait MinerConfig { } /// A base miner, suitable to be used for both signed and unsigned submissions. -pub struct Miner(sp_std::marker::PhantomData); +pub struct Miner(core::marker::PhantomData); impl Miner { /// Same as [`Pallet::mine_solution`], but the input snapshot data must be given. pub fn mine_solution_with_snapshot( @@ -505,7 +505,7 @@ impl Miner { stake }) .unwrap_or_default(); - sp_std::cmp::Reverse(stake) + core::cmp::Reverse(stake) }, ); @@ -1016,6 +1016,7 @@ mod tests { Event, InvalidTransaction, Phase, QueuedSolution, TransactionSource, TransactionValidityError, }; + use alloc::vec; use codec::Decode; use frame_election_provider_support::IndexAssignment; use frame_support::{assert_noop, assert_ok, traits::OffchainWorker}; diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs index bb1bdb31420..5c64f2a0bc2 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs @@ -38,7 +38,6 @@ use sp_staking::{ offence::{OffenceDetails, OnOffenceHandler}, EraIndex, SessionIndex, }; -use sp_std::prelude::*; use std::collections::BTreeMap; use codec::Decode; diff --git a/substrate/frame/election-provider-support/Cargo.toml b/substrate/frame/election-provider-support/Cargo.toml index 012392ffc59..80fea6c5ca9 100644 --- a/substrate/frame/election-provider-support/Cargo.toml +++ b/substrate/frame/election-provider-support/Cargo.toml @@ -23,7 +23,6 @@ frame-system = { workspace = true } sp-arithmetic = { workspace = true } sp-npos-elections = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-core = { workspace = true } [dev-dependencies] @@ -44,7 +43,6 @@ std = [ "sp-io/std", "sp-npos-elections/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-support/runtime-benchmarks", diff --git a/substrate/frame/election-provider-support/benchmarking/Cargo.toml b/substrate/frame/election-provider-support/benchmarking/Cargo.toml index ecf41ff9663..dcfcb9c35cd 100644 --- a/substrate/frame/election-provider-support/benchmarking/Cargo.toml +++ b/substrate/frame/election-provider-support/benchmarking/Cargo.toml @@ -23,7 +23,6 @@ frame-election-provider-support = { workspace = true } frame-system = { workspace = true } sp-npos-elections = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [features] default = ["std"] @@ -34,7 +33,6 @@ std = [ "frame-system/std", "sp-npos-elections/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/election-provider-support/benchmarking/src/inner.rs b/substrate/frame/election-provider-support/benchmarking/src/inner.rs index 4722680cfcc..8cca0d459ea 100644 --- a/substrate/frame/election-provider-support/benchmarking/src/inner.rs +++ b/substrate/frame/election-provider-support/benchmarking/src/inner.rs @@ -18,10 +18,10 @@ //! Election provider support pallet benchmarking. //! This is separated into its own crate to avoid bloating the size of the runtime. +use alloc::vec::Vec; use codec::Decode; use frame_benchmarking::v1::benchmarks; use frame_election_provider_support::{NposSolver, PhragMMS, SequentialPhragmen}; -use sp_std::vec::Vec; pub struct Pallet(frame_system::Pallet); pub trait Config: frame_system::Config {} diff --git a/substrate/frame/election-provider-support/benchmarking/src/lib.rs b/substrate/frame/election-provider-support/benchmarking/src/lib.rs index 78b226e52af..d092483f938 100644 --- a/substrate/frame/election-provider-support/benchmarking/src/lib.rs +++ b/substrate/frame/election-provider-support/benchmarking/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "runtime-benchmarks")] pub mod inner; diff --git a/substrate/frame/election-provider-support/solution-type/src/codec.rs b/substrate/frame/election-provider-support/solution-type/src/codec.rs index 17a256c228e..16d5f17469b 100644 --- a/substrate/frame/election-provider-support/solution-type/src/codec.rs +++ b/substrate/frame/election-provider-support/solution-type/src/codec.rs @@ -51,14 +51,14 @@ fn decode_impl( quote! { let #name = < - _fepsp::sp_std::prelude::Vec<(_fepsp::codec::Compact<#voter_type>, _fepsp::codec::Compact<#target_type>)> + _fepsp::Vec<(_fepsp::codec::Compact<#voter_type>, _fepsp::codec::Compact<#target_type>)> as _fepsp::codec::Decode >::decode(value)?; let #name = #name .into_iter() .map(|(v, t)| (v.0, t.0)) - .collect::<_fepsp::sp_std::prelude::Vec<_>>(); + .collect::<_fepsp::Vec<_>>(); } }; @@ -73,7 +73,7 @@ fn decode_impl( quote! { let #name = < - _fepsp::sp_std::prelude::Vec<( + _fepsp::Vec<( _fepsp::codec::Compact<#voter_type>, [(_fepsp::codec::Compact<#target_type>, _fepsp::codec::Compact<#weight_type>); #c-1], _fepsp::codec::Compact<#target_type>, @@ -87,7 +87,7 @@ fn decode_impl( [ #inner_impl ], t_last.0, )) - .collect::<_fepsp::sp_std::prelude::Vec<_>>(); + .collect::<_fepsp::Vec<_>>(); } }) .collect::(); @@ -126,7 +126,7 @@ fn encode_impl(ident: &syn::Ident, count: usize) -> TokenStream2 { _fepsp::codec::Compact(v.clone()), _fepsp::codec::Compact(t.clone()), )) - .collect::<_fepsp::sp_std::prelude::Vec<_>>(); + .collect::<_fepsp::Vec<_>>(); #name.encode_to(&mut r); } }; @@ -153,7 +153,7 @@ fn encode_impl(ident: &syn::Ident, count: usize) -> TokenStream2 { [ #inners_solution_array ], _fepsp::codec::Compact(t_last.clone()), )) - .collect::<_fepsp::sp_std::prelude::Vec<_>>(); + .collect::<_fepsp::Vec<_>>(); #name.encode_to(&mut r); } }) @@ -161,7 +161,7 @@ fn encode_impl(ident: &syn::Ident, count: usize) -> TokenStream2 { quote!( impl _fepsp::codec::Encode for #ident { - fn encode(&self) -> _fepsp::sp_std::prelude::Vec { + fn encode(&self) -> _fepsp::Vec { let mut r = vec![]; #encode_impl_single #encode_impl_rest @@ -182,7 +182,7 @@ fn scale_info_impl( let name = format!("{}", vote_field(1)); quote! { .field(|f| - f.ty::<_fepsp::sp_std::prelude::Vec< + f.ty::<_fepsp::Vec< (_fepsp::codec::Compact<#voter_type>, _fepsp::codec::Compact<#target_type>) >>() .name(#name) @@ -194,7 +194,7 @@ fn scale_info_impl( let name = format!("{}", vote_field(2)); quote! { .field(|f| - f.ty::<_fepsp::sp_std::prelude::Vec<( + f.ty::<_fepsp::Vec<( _fepsp::codec::Compact<#voter_type>, (_fepsp::codec::Compact<#target_type>, _fepsp::codec::Compact<#weight_type>), _fepsp::codec::Compact<#target_type> @@ -209,7 +209,7 @@ fn scale_info_impl( let name = format!("{}", vote_field(c)); quote! { .field(|f| - f.ty::<_fepsp::sp_std::prelude::Vec<( + f.ty::<_fepsp::Vec<( _fepsp::codec::Compact<#voter_type>, [ (_fepsp::codec::Compact<#target_type>, _fepsp::codec::Compact<#weight_type>); diff --git a/substrate/frame/election-provider-support/solution-type/src/single_page.rs b/substrate/frame/election-provider-support/solution-type/src/single_page.rs index 161631ee83f..de59df162c8 100644 --- a/substrate/frame/election-provider-support/solution-type/src/single_page.rs +++ b/substrate/frame/election-provider-support/solution-type/src/single_page.rs @@ -40,7 +40,7 @@ pub(crate) fn generate(def: crate::SolutionDef) -> Result { let name = vote_field(1); // NOTE: we use the visibility of the struct for the fields as well.. could be made better. quote!( - #vis #name: _fepsp::sp_std::prelude::Vec<(#voter_type, #target_type)>, + #vis #name: _fepsp::Vec<(#voter_type, #target_type)>, ) }; @@ -49,7 +49,7 @@ pub(crate) fn generate(def: crate::SolutionDef) -> Result { let field_name = vote_field(c); let array_len = c - 1; quote!( - #vis #field_name: _fepsp::sp_std::prelude::Vec<( + #vis #field_name: _fepsp::Vec<( #voter_type, [(#target_type, #weight_type); #array_len], #target_type @@ -147,8 +147,8 @@ pub(crate) fn generate(def: crate::SolutionDef) -> Result { self, voter_at: impl Fn(Self::VoterIndex) -> Option, target_at: impl Fn(Self::TargetIndex) -> Option, - ) -> Result<_fepsp::sp_std::prelude::Vec<_feps::Assignment>, _feps::Error> { - let mut #assignment_name: _fepsp::sp_std::prelude::Vec<_feps::Assignment> = Default::default(); + ) -> Result<_fepsp::Vec<_feps::Assignment>, _feps::Error> { + let mut #assignment_name: _fepsp::Vec<_feps::Assignment> = Default::default(); #into_impl Ok(#assignment_name) } @@ -165,10 +165,10 @@ pub(crate) fn generate(def: crate::SolutionDef) -> Result { all_edges } - fn unique_targets(&self) -> _fepsp::sp_std::prelude::Vec { + fn unique_targets(&self) -> _fepsp::Vec { // NOTE: this implementation returns the targets sorted, but we don't use it yet per // se, nor is the API enforcing it. - use _fepsp::sp_std::collections::btree_set::BTreeSet; + use _fepsp::BTreeSet; let mut all_targets: BTreeSet = BTreeSet::new(); let mut maybe_insert_target = |t: Self::TargetIndex| { all_targets.insert(t); @@ -206,7 +206,7 @@ pub(crate) fn generate(def: crate::SolutionDef) -> Result { .saturating_add((s as usize).saturating_mul(max_element_size)) } } - impl<'a> _fepsp::sp_std::convert::TryFrom<&'a [__IndexAssignment]> for #ident { + impl<'a> core::convert::TryFrom<&'a [__IndexAssignment]> for #ident { type Error = _feps::Error; fn try_from(index_assignments: &'a [__IndexAssignment]) -> Result { let mut #struct_name = #ident::default(); @@ -361,7 +361,7 @@ pub(crate) fn into_impl( let target = target_at(*t_idx).or_invalid_index()?; Ok((target, *p)) }) - .collect::, _feps::Error>>()?; + .collect::, _feps::Error>>()?; if sum >= #per_thing::one() { return Err(_feps::Error::SolutionWeightOverflow); diff --git a/substrate/frame/election-provider-support/src/lib.rs b/substrate/frame/election-provider-support/src/lib.rs index 2e9ee3b8a48..394f58a3844 100644 --- a/substrate/frame/election-provider-support/src/lib.rs +++ b/substrate/frame/election-provider-support/src/lib.rs @@ -177,11 +177,14 @@ pub mod bounds; pub mod onchain; pub mod traits; +extern crate alloc; + +use alloc::{boxed::Box, vec::Vec}; +use core::fmt::Debug; use sp_runtime::{ traits::{Bounded, Saturating, Zero}, RuntimeDebug, }; -use sp_std::{fmt::Debug, prelude::*}; pub use bounds::DataProviderBounds; pub use codec::{Decode, Encode}; @@ -202,10 +205,10 @@ use sp_runtime::TryRuntimeError; // re-export for the solution macro, with the dependencies of the macro. #[doc(hidden)] pub mod private { + pub use alloc::{collections::btree_set::BTreeSet, vec::Vec}; pub use codec; pub use scale_info; pub use sp_arithmetic; - pub use sp_std; // Simple Extension trait to easily convert `None` from index closures to `Err`. // @@ -276,7 +279,7 @@ pub type IndexAssignmentOf = IndexAssignment< /// Types that are used by the data provider trait. pub mod data_provider { /// Alias for the result type of the election data provider. - pub type Result = sp_std::result::Result; + pub type Result = core::result::Result; } /// Something that can provide the data to an [`ElectionProvider`]. @@ -431,7 +434,7 @@ pub trait InstantElectionProvider: ElectionProviderBase { } /// An election provider that does nothing whatsoever. -pub struct NoElection(sp_std::marker::PhantomData); +pub struct NoElection(core::marker::PhantomData); impl ElectionProviderBase for NoElection<(AccountId, BlockNumber, DataProvider, MaxWinners)> @@ -486,7 +489,7 @@ where /// used on the implementing side of [`ElectionDataProvider`]. pub trait SortedListProvider { /// The list's error type. - type Error: sp_std::fmt::Debug; + type Error: core::fmt::Debug; /// The type used by the list to compare nodes for ordering. type Score: Bounded + Saturating + Zero; @@ -597,7 +600,7 @@ pub trait NposSolver { /// The accuracy of this solver. This will affect the accuracy of the output. type Accuracy: PerThing128; /// The error type of this implementation. - type Error: sp_std::fmt::Debug + sp_std::cmp::PartialEq; + type Error: core::fmt::Debug + core::cmp::PartialEq; /// Solve an NPoS solution with the given `voters`, `targets`, and select `to_elect` count /// of `targets`. @@ -617,7 +620,7 @@ pub trait NposSolver { /// A wrapper for [`sp_npos_elections::seq_phragmen`] that implements [`NposSolver`]. See the /// documentation of [`sp_npos_elections::seq_phragmen`] for more info. pub struct SequentialPhragmen( - sp_std::marker::PhantomData<(AccountId, Accuracy, Balancing)>, + core::marker::PhantomData<(AccountId, Accuracy, Balancing)>, ); impl>> @@ -642,7 +645,7 @@ impl( - sp_std::marker::PhantomData<(AccountId, Accuracy, Balancing)>, + core::marker::PhantomData<(AccountId, Accuracy, Balancing)>, ); impl>> diff --git a/substrate/frame/election-provider-support/src/onchain.rs b/substrate/frame/election-provider-support/src/onchain.rs index ee4f6992a08..1063d5d35ae 100644 --- a/substrate/frame/election-provider-support/src/onchain.rs +++ b/substrate/frame/election-provider-support/src/onchain.rs @@ -24,11 +24,12 @@ use crate::{ BoundedSupportsOf, Debug, ElectionDataProvider, ElectionProvider, ElectionProviderBase, InstantElectionProvider, NposSolver, WeightInfo, }; +use alloc::collections::btree_map::BTreeMap; +use core::marker::PhantomData; use frame_support::{dispatch::DispatchClass, traits::Get}; use sp_npos_elections::{ assignment_ratio_to_staked_normalized, to_supports, BoundedSupports, ElectionResult, VoteWeight, }; -use sp_std::{collections::btree_map::BTreeMap, marker::PhantomData, prelude::*}; /// Errors of the on-chain election. #[derive(Eq, PartialEq, Debug)] diff --git a/substrate/frame/election-provider-support/src/traits.rs b/substrate/frame/election-provider-support/src/traits.rs index 43d183b338e..84fd57992d3 100644 --- a/substrate/frame/election-provider-support/src/traits.rs +++ b/substrate/frame/election-provider-support/src/traits.rs @@ -18,11 +18,12 @@ //! Traits for the election operations. use crate::{Assignment, IdentifierT, IndexAssignmentOf, PerThing128, VoteWeight}; +use alloc::vec::Vec; use codec::Encode; +use core::fmt::Debug; use scale_info::TypeInfo; use sp_arithmetic::traits::{Bounded, UniqueSaturatedInto}; use sp_npos_elections::{ElectionScore, Error, EvaluateSupport}; -use sp_std::{fmt::Debug, prelude::*}; /// An opaque index-based, NPoS solution type. pub trait NposSolution diff --git a/substrate/frame/elections-phragmen/Cargo.toml b/substrate/frame/elections-phragmen/Cargo.toml index b53118b6b6f..6d1ecbd0735 100644 --- a/substrate/frame/elections-phragmen/Cargo.toml +++ b/substrate/frame/elections-phragmen/Cargo.toml @@ -28,7 +28,6 @@ sp-core = { workspace = true } sp-io = { workspace = true } sp-npos-elections = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-staking = { workspace = true } [dev-dependencies] @@ -52,7 +51,6 @@ std = [ "sp-npos-elections/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", "sp-tracing/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/elections-phragmen/src/lib.rs b/substrate/frame/elections-phragmen/src/lib.rs index c6eca40c471..565ead4059d 100644 --- a/substrate/frame/elections-phragmen/src/lib.rs +++ b/substrate/frame/elections-phragmen/src/lib.rs @@ -98,7 +98,11 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; +use core::cmp::Ordering; use frame_support::{ traits::{ defensive_prelude::*, ChangeMembers, Contains, ContainsLengthBound, Currency, Get, @@ -115,7 +119,6 @@ use sp_runtime::{ DispatchError, Perbill, RuntimeDebug, }; use sp_staking::currency_to_vote::CurrencyToVote; -use sp_std::{cmp::Ordering, prelude::*}; #[cfg(any(feature = "try-runtime", test))] use sp_runtime::TryRuntimeError; diff --git a/substrate/frame/elections-phragmen/src/migrations/unlock_and_unreserve_all_funds.rs b/substrate/frame/elections-phragmen/src/migrations/unlock_and_unreserve_all_funds.rs index 482766ee97f..ed4569aa25e 100644 --- a/substrate/frame/elections-phragmen/src/migrations/unlock_and_unreserve_all_funds.rs +++ b/substrate/frame/elections-phragmen/src/migrations/unlock_and_unreserve_all_funds.rs @@ -18,6 +18,7 @@ //! A migration that unreserves all deposit and unlocks all stake held in the context of this //! pallet. +use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use core::iter::Sum; use frame_support::{ pallet_prelude::ValueQuery, @@ -28,7 +29,6 @@ use frame_support::{ }; use sp_core::Get; use sp_runtime::traits::Zero; -use sp_std::{collections::btree_map::BTreeMap, vec::Vec}; const LOG_TARGET: &str = "elections_phragmen::migrations::unlock_and_unreserve_all_funds"; @@ -93,7 +93,7 @@ type Voting = StorageMap< /// The pallet should be made inoperable before this migration is run. /// /// (See also [`RemovePallet`][frame_support::migrations::RemovePallet]) -pub struct UnlockAndUnreserveAllFunds(sp_std::marker::PhantomData); +pub struct UnlockAndUnreserveAllFunds(core::marker::PhantomData); impl UnlockAndUnreserveAllFunds { /// Calculates and returns the total amounts deposited and staked by each account in the context @@ -187,8 +187,8 @@ where /// reported as staked by the pallet and the amount actually locked in `Balances`. #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + use alloc::collections::btree_set::BTreeSet; use codec::Encode; - use sp_std::collections::btree_set::BTreeSet; // Get staked and deposited balances as reported by this pallet. let (account_deposited_sums, account_staked_sums, _) = diff --git a/substrate/frame/elections-phragmen/src/migrations/v3.rs b/substrate/frame/elections-phragmen/src/migrations/v3.rs index b0092d6c07b..82f82f23e71 100644 --- a/substrate/frame/elections-phragmen/src/migrations/v3.rs +++ b/substrate/frame/elections-phragmen/src/migrations/v3.rs @@ -19,12 +19,12 @@ use super::super::LOG_TARGET; use crate::{Config, Pallet}; +use alloc::vec::Vec; use codec::{Decode, Encode, FullCodec}; use frame_support::{ pallet_prelude::ValueQuery, traits::StorageVersion, weights::Weight, Twox64Concat, }; use sp_runtime::RuntimeDebug; -use sp_std::prelude::*; #[derive(Encode, Decode, Clone, Default, RuntimeDebug, PartialEq)] struct SeatHolder { diff --git a/substrate/frame/elections-phragmen/src/migrations/v5.rs b/substrate/frame/elections-phragmen/src/migrations/v5.rs index 6e360aa8b8c..150a4c4fa6c 100644 --- a/substrate/frame/elections-phragmen/src/migrations/v5.rs +++ b/substrate/frame/elections-phragmen/src/migrations/v5.rs @@ -16,6 +16,7 @@ // limitations under the License. use super::super::*; +use alloc::{boxed::Box, vec::Vec}; /// Migrate the locks and vote stake on accounts (as specified with param `to_migrate`) that have /// more than their free balance locked. diff --git a/substrate/frame/examples/basic/Cargo.toml b/substrate/frame/examples/basic/Cargo.toml index b34d9efc15b..af547c7eeb2 100644 --- a/substrate/frame/examples/basic/Cargo.toml +++ b/substrate/frame/examples/basic/Cargo.toml @@ -26,7 +26,6 @@ frame-system = { workspace = true } pallet-balances = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-core = { workspace = true } @@ -44,7 +43,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/examples/basic/src/lib.rs b/substrate/frame/examples/basic/src/lib.rs index 12cadc969fd..fea04cb447a 100644 --- a/substrate/frame/examples/basic/src/lib.rs +++ b/substrate/frame/examples/basic/src/lib.rs @@ -53,6 +53,9 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode}; use core::marker::PhantomData; use frame_support::{ @@ -69,7 +72,6 @@ use sp_runtime::{ InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, }, }; -use sp_std::vec::Vec; // Re-export pallet items so that they can be accessed from the crate namespace. pub use pallet::*; diff --git a/substrate/frame/examples/basic/src/tests.rs b/substrate/frame/examples/basic/src/tests.rs index 505cd6f906d..d7095eb3c94 100644 --- a/substrate/frame/examples/basic/src/tests.rs +++ b/substrate/frame/examples/basic/src/tests.rs @@ -92,7 +92,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities { example: pallet_example_basic::GenesisConfig { dummy: 42, // we configure the map with (key, value) pairs. - bar: vec![(1, 2), (2, 3)], + bar: alloc::vec![(1, 2), (2, 3)], foo: 24, }, } diff --git a/substrate/frame/examples/default-config/Cargo.toml b/substrate/frame/examples/default-config/Cargo.toml index 8a0d14edbdb..81509c782a3 100644 --- a/substrate/frame/examples/default-config/Cargo.toml +++ b/substrate/frame/examples/default-config/Cargo.toml @@ -25,7 +25,6 @@ frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [features] default = ["std"] @@ -37,7 +36,6 @@ std = [ "scale-info/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/examples/default-config/src/lib.rs b/substrate/frame/examples/default-config/src/lib.rs index 5b66c78e062..ccdcd496859 100644 --- a/substrate/frame/examples/default-config/src/lib.rs +++ b/substrate/frame/examples/default-config/src/lib.rs @@ -32,6 +32,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[frame_support::pallet] pub mod pallet { use frame_support::pallet_prelude::*; @@ -189,7 +191,7 @@ pub mod tests { } parameter_types! { - pub const SomeCall: RuntimeCall = RuntimeCall::System(frame_system::Call::::remark { remark: vec![] }); + pub const SomeCall: RuntimeCall = RuntimeCall::System(frame_system::Call::::remark { remark: alloc::vec![] }); } #[derive_impl(TestDefaultConfig as pallet::DefaultConfig)] diff --git a/substrate/frame/examples/dev-mode/Cargo.toml b/substrate/frame/examples/dev-mode/Cargo.toml index 1dd033d7e07..c3dd7f26f21 100644 --- a/substrate/frame/examples/dev-mode/Cargo.toml +++ b/substrate/frame/examples/dev-mode/Cargo.toml @@ -24,7 +24,6 @@ frame-system = { workspace = true } pallet-balances = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-core = { workspace = true } @@ -41,7 +40,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/examples/dev-mode/src/lib.rs b/substrate/frame/examples/dev-mode/src/lib.rs index 15f1a4b5d61..eb94c024280 100644 --- a/substrate/frame/examples/dev-mode/src/lib.rs +++ b/substrate/frame/examples/dev-mode/src/lib.rs @@ -28,9 +28,11 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{vec, vec::Vec}; use frame_support::dispatch::DispatchResult; use frame_system::ensure_signed; -use sp_std::{vec, vec::Vec}; // Re-export pallet items so that they can be accessed from the crate namespace. pub use pallet::*; diff --git a/substrate/frame/examples/kitchensink/Cargo.toml b/substrate/frame/examples/kitchensink/Cargo.toml index b3869dff941..f1f9fdb492d 100644 --- a/substrate/frame/examples/kitchensink/Cargo.toml +++ b/substrate/frame/examples/kitchensink/Cargo.toml @@ -25,7 +25,6 @@ frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } frame-benchmarking = { optional = true, workspace = true } @@ -47,7 +46,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/examples/kitchensink/src/lib.rs b/substrate/frame/examples/kitchensink/src/lib.rs index b7425b0c084..44231856542 100644 --- a/substrate/frame/examples/kitchensink/src/lib.rs +++ b/substrate/frame/examples/kitchensink/src/lib.rs @@ -42,6 +42,8 @@ use sp_runtime::TryRuntimeError; pub mod weights; pub use weights::*; +extern crate alloc; + #[frame_support::pallet] pub mod pallet { use super::*; diff --git a/substrate/frame/examples/offchain-worker/Cargo.toml b/substrate/frame/examples/offchain-worker/Cargo.toml index f8ccd1f04e4..179a658de31 100644 --- a/substrate/frame/examples/offchain-worker/Cargo.toml +++ b/substrate/frame/examples/offchain-worker/Cargo.toml @@ -27,7 +27,6 @@ sp-core = { workspace = true } sp-io = { workspace = true } sp-keystore = { optional = true, workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [features] default = ["std"] @@ -42,7 +41,6 @@ std = [ "sp-io/std", "sp-keystore/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/examples/offchain-worker/src/lib.rs b/substrate/frame/examples/offchain-worker/src/lib.rs index 0a90e896188..add014f6b34 100644 --- a/substrate/frame/examples/offchain-worker/src/lib.rs +++ b/substrate/frame/examples/offchain-worker/src/lib.rs @@ -45,6 +45,9 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode}; use frame_support::traits::Get; use frame_system::{ @@ -67,7 +70,6 @@ use sp_runtime::{ transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, RuntimeDebug, }; -use sp_std::vec::Vec; #[cfg(test)] mod tests; @@ -606,7 +608,7 @@ impl Pallet { let body = response.body().collect::>(); // Create a str slice from the body. - let body_str = sp_std::str::from_utf8(&body).map_err(|_| { + let body_str = alloc::str::from_utf8(&body).map_err(|_| { log::warn!("No UTF8 body"); http::Error::Unknown })?; diff --git a/substrate/frame/examples/offchain-worker/src/tests.rs b/substrate/frame/examples/offchain-worker/src/tests.rs index e2c57a8c1e1..b665cbbb62a 100644 --- a/substrate/frame/examples/offchain-worker/src/tests.rs +++ b/substrate/frame/examples/offchain-worker/src/tests.rs @@ -375,7 +375,7 @@ fn price_oracle_response(state: &mut testing::OffchainState) { #[test] fn parse_price_works() { - let test_data = vec![ + let test_data = alloc::vec![ ("{\"USD\":6536.92}", Some(653692)), ("{\"USD\":65.92}", Some(6592)), ("{\"USD\":6536.924565}", Some(653692)), diff --git a/substrate/frame/examples/single-block-migrations/Cargo.toml b/substrate/frame/examples/single-block-migrations/Cargo.toml index a6cf020ce53..2d524f2caa2 100644 --- a/substrate/frame/examples/single-block-migrations/Cargo.toml +++ b/substrate/frame/examples/single-block-migrations/Cargo.toml @@ -22,7 +22,6 @@ frame-executive = { workspace = true } frame-system = { workspace = true } frame-try-runtime = { optional = true, workspace = true } pallet-balances = { workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } @@ -42,7 +41,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-version/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/examples/single-block-migrations/src/lib.rs b/substrate/frame/examples/single-block-migrations/src/lib.rs index 411537aa8c6..07c7199b932 100644 --- a/substrate/frame/examples/single-block-migrations/src/lib.rs +++ b/substrate/frame/examples/single-block-migrations/src/lib.rs @@ -156,6 +156,9 @@ pub use pallet::*; pub mod migrations; #[doc(hidden)] mod mock; + +extern crate alloc; + use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::traits::StorageVersion; use sp_runtime::RuntimeDebug; diff --git a/substrate/frame/examples/single-block-migrations/src/migrations/v1.rs b/substrate/frame/examples/single-block-migrations/src/migrations/v1.rs index 7b543d72c98..55cf7cef9a7 100644 --- a/substrate/frame/examples/single-block-migrations/src/migrations/v1.rs +++ b/substrate/frame/examples/single-block-migrations/src/migrations/v1.rs @@ -21,7 +21,7 @@ use frame_support::{ }; #[cfg(feature = "try-runtime")] -use sp_std::vec::Vec; +use alloc::vec::Vec; /// Collection of storage item formats from the previous storage version. /// @@ -41,7 +41,7 @@ mod v0 { /// /// In this migration, update the on-chain storage for the pallet to reflect the new storage /// layout. -pub struct InnerMigrateV0ToV1(sp_std::marker::PhantomData); +pub struct InnerMigrateV0ToV1(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for InnerMigrateV0ToV1 { /// Return the existing [`crate::Value`] so we can check that it was correctly set in diff --git a/substrate/frame/examples/split/Cargo.toml b/substrate/frame/examples/split/Cargo.toml index d8a8c6869ab..9542902bae6 100644 --- a/substrate/frame/examples/split/Cargo.toml +++ b/substrate/frame/examples/split/Cargo.toml @@ -25,7 +25,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } -sp-std = { workspace = true } frame-benchmarking = { optional = true, workspace = true } @@ -43,7 +42,6 @@ std = [ "scale-info/std", "sp-core/std", "sp-io/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/examples/tasks/Cargo.toml b/substrate/frame/examples/tasks/Cargo.toml index 1ca62fd8994..00695ceddf1 100644 --- a/substrate/frame/examples/tasks/Cargo.toml +++ b/substrate/frame/examples/tasks/Cargo.toml @@ -24,7 +24,6 @@ frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-core = { workspace = true } frame-benchmarking = { optional = true, workspace = true } @@ -41,7 +40,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/executive/Cargo.toml b/substrate/frame/executive/Cargo.toml index 0f9741eec18..78d9ea6fa49 100644 --- a/substrate/frame/executive/Cargo.toml +++ b/substrate/frame/executive/Cargo.toml @@ -28,7 +28,6 @@ frame-try-runtime = { optional = true, workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-tracing = { workspace = true } [dev-dependencies] @@ -57,7 +56,6 @@ std = [ "sp-inherents/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-tracing/std", "sp-version/std", ] diff --git a/substrate/frame/executive/src/lib.rs b/substrate/frame/executive/src/lib.rs index 3028eaf318e..1e7bac64e18 100644 --- a/substrate/frame/executive/src/lib.rs +++ b/substrate/frame/executive/src/lib.rs @@ -151,7 +151,10 @@ pub mod block_flowchart {} #[cfg(test)] mod tests; +extern crate alloc; + use codec::{Codec, Encode}; +use core::marker::PhantomData; use frame_support::{ defensive_assert, dispatch::{DispatchClass, DispatchInfo, GetDispatchInfo, PostDispatchInfo}, @@ -174,7 +177,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, ExtrinsicInclusionMode, }; -use sp_std::{marker::PhantomData, prelude::*}; #[cfg(feature = "try-runtime")] use ::{ @@ -467,7 +469,7 @@ where /// Logs the result of trying to decode the entire state. fn log_decode_result( - res: Result>, + res: Result>, ) -> Result<(), TryRuntimeError> { match res { Ok(bytes) => { diff --git a/substrate/frame/fast-unstake/Cargo.toml b/substrate/frame/fast-unstake/Cargo.toml index 59676ad3995..2b188bad1df 100644 --- a/substrate/frame/fast-unstake/Cargo.toml +++ b/substrate/frame/fast-unstake/Cargo.toml @@ -24,7 +24,6 @@ frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-staking = { workspace = true } frame-election-provider-support = { workspace = true } @@ -58,7 +57,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", "sp-tracing/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/fast-unstake/src/benchmarking.rs b/substrate/frame/fast-unstake/src/benchmarking.rs index 4828dcb9b42..d01ff715ca4 100644 --- a/substrate/frame/fast-unstake/src/benchmarking.rs +++ b/substrate/frame/fast-unstake/src/benchmarking.rs @@ -20,6 +20,7 @@ #![cfg(feature = "runtime-benchmarks")] use crate::{types::*, Pallet as FastUnstake, *}; +use alloc::{vec, vec::Vec}; use frame_benchmarking::v1::{benchmarks, whitelist_account, BenchmarkError}; use frame_support::{ assert_ok, @@ -28,7 +29,6 @@ use frame_support::{ use frame_system::RawOrigin; use sp_runtime::traits::Zero; use sp_staking::{EraIndex, StakingInterface}; -use sp_std::prelude::*; const USER_SEED: u32 = 0; diff --git a/substrate/frame/fast-unstake/src/lib.rs b/substrate/frame/fast-unstake/src/lib.rs index f31c9c64026..41920907bd5 100644 --- a/substrate/frame/fast-unstake/src/lib.rs +++ b/substrate/frame/fast-unstake/src/lib.rs @@ -112,6 +112,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub use pallet::*; #[cfg(test)] @@ -150,6 +152,7 @@ macro_rules! log { pub mod pallet { use super::*; use crate::types::*; + use alloc::vec::Vec; use frame_support::{ pallet_prelude::*, traits::{Defensive, ReservableCurrency, StorageVersion}, @@ -157,7 +160,6 @@ pub mod pallet { use frame_system::pallet_prelude::*; use sp_runtime::{traits::Zero, DispatchResult}; use sp_staking::{EraIndex, StakingInterface}; - use sp_std::{prelude::*, vec::Vec}; pub use weights::WeightInfo; #[cfg(feature = "try-runtime")] diff --git a/substrate/frame/fast-unstake/src/migrations.rs b/substrate/frame/fast-unstake/src/migrations.rs index 97ad86bfff4..1a873534ac8 100644 --- a/substrate/frame/fast-unstake/src/migrations.rs +++ b/substrate/frame/fast-unstake/src/migrations.rs @@ -17,20 +17,20 @@ pub mod v1 { use crate::{types::BalanceOf, *}; + use alloc::vec::Vec; use frame_support::{ storage::unhashed, traits::{Defensive, Get, GetStorageVersion, OnRuntimeUpgrade}, weights::Weight, }; use sp_staking::EraIndex; - use sp_std::prelude::*; #[cfg(feature = "try-runtime")] use frame_support::ensure; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; - pub struct MigrateToV1(sp_std::marker::PhantomData); + pub struct MigrateToV1(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { let current = Pallet::::in_code_storage_version(); diff --git a/substrate/frame/fast-unstake/src/mock.rs b/substrate/frame/fast-unstake/src/mock.rs index 7ce7fee1410..757052e230a 100644 --- a/substrate/frame/fast-unstake/src/mock.rs +++ b/substrate/frame/fast-unstake/src/mock.rs @@ -26,7 +26,6 @@ use frame_support::{ use sp_runtime::{traits::IdentityLookup, BuildStorage}; use pallet_staking::{Exposure, IndividualExposure, StakerStatus}; -use sp_std::prelude::*; pub type AccountId = u128; pub type BlockNumber = u64; diff --git a/substrate/frame/fast-unstake/src/types.rs b/substrate/frame/fast-unstake/src/types.rs index 3fb5720861f..2a2319ef612 100644 --- a/substrate/frame/fast-unstake/src/types.rs +++ b/substrate/frame/fast-unstake/src/types.rs @@ -24,7 +24,6 @@ use frame_support::{ }; use scale_info::TypeInfo; use sp_staking::{EraIndex, StakingInterface}; -use sp_std::prelude::*; /// Maximum number of eras that we might check for a single staker. /// @@ -32,7 +31,7 @@ use sp_std::prelude::*; #[derive(scale_info::TypeInfo, codec::Encode, codec::Decode, codec::MaxEncodedLen)] #[codec(mel_bound(T: Config))] #[scale_info(skip_type_params(T))] -pub struct MaxChecking(sp_std::marker::PhantomData); +pub struct MaxChecking(core::marker::PhantomData); impl frame_support::traits::Get for MaxChecking { fn get() -> u32 { T::Staking::bonding_duration() + 1 diff --git a/substrate/frame/glutton/Cargo.toml b/substrate/frame/glutton/Cargo.toml index 58faecde629..5a73e8caef8 100644 --- a/substrate/frame/glutton/Cargo.toml +++ b/substrate/frame/glutton/Cargo.toml @@ -26,7 +26,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-inherents = { workspace = true } [dev-dependencies] @@ -47,7 +46,6 @@ std = [ "sp-inherents/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/glutton/src/lib.rs b/substrate/frame/glutton/src/lib.rs index 5427173b486..c8d2981ebfe 100644 --- a/substrate/frame/glutton/src/lib.rs +++ b/substrate/frame/glutton/src/lib.rs @@ -35,12 +35,14 @@ mod mock; mod tests; pub mod weights; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use blake2::{Blake2b512, Digest}; use frame_support::{pallet_prelude::*, weights::WeightMeter, DefaultNoBound}; use frame_system::pallet_prelude::*; use sp_io::hashing::twox_256; use sp_runtime::{traits::Zero, FixedPointNumber, FixedU64}; -use sp_std::{vec, vec::Vec}; pub use pallet::*; pub use weights::WeightInfo; @@ -162,7 +164,7 @@ pub mod pallet { pub block_length: FixedU64, #[serde(skip)] /// The required configuration field. - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] diff --git a/substrate/frame/grandpa/Cargo.toml b/substrate/frame/grandpa/Cargo.toml index e08af3a5e91..e24f9a51db8 100644 --- a/substrate/frame/grandpa/Cargo.toml +++ b/substrate/frame/grandpa/Cargo.toml @@ -31,7 +31,6 @@ sp-io = { workspace = true } sp-runtime = { features = ["serde"], workspace = true } sp-session = { workspace = true } sp-staking = { features = ["serde"], workspace = true } -sp-std = { workspace = true } [dev-dependencies] finality-grandpa = { features = ["derive-codec"], workspace = true, default-features = true } @@ -67,7 +66,6 @@ std = [ "sp-runtime/std", "sp-session/std", "sp-staking/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/grandpa/src/equivocation.rs b/substrate/frame/grandpa/src/equivocation.rs index 16727f79a58..b213c1ceb72 100644 --- a/substrate/frame/grandpa/src/equivocation.rs +++ b/substrate/frame/grandpa/src/equivocation.rs @@ -35,6 +35,7 @@ //! that the `ValidateUnsigned` for the GRANDPA pallet is used in the runtime //! definition. +use alloc::{boxed::Box, vec, vec::Vec}; use codec::{self as codec, Decode, Encode}; use frame_support::traits::{Get, KeyOwnerProofSystem}; use frame_system::pallet_prelude::BlockNumberFor; @@ -52,7 +53,6 @@ use sp_staking::{ offence::{Kind, Offence, OffenceReportSystem, ReportOffence}, SessionIndex, }; -use sp_std::prelude::*; use super::{Call, Config, Error, Pallet, LOG_TARGET}; @@ -114,7 +114,7 @@ impl Offence for EquivocationOffence { /// - On-chain validity checks and processing are mostly delegated to the user provided generic /// types implementing `KeyOwnerProofSystem` and `ReportOffence` traits. /// - Offence reporter for unsigned transactions is fetched via the the authorship pallet. -pub struct EquivocationReportSystem(sp_std::marker::PhantomData<(T, R, P, L)>); +pub struct EquivocationReportSystem(core::marker::PhantomData<(T, R, P, L)>); impl OffenceReportSystem< diff --git a/substrate/frame/grandpa/src/lib.rs b/substrate/frame/grandpa/src/lib.rs index 90bcd8721df..4f69aeaef52 100644 --- a/substrate/frame/grandpa/src/lib.rs +++ b/substrate/frame/grandpa/src/lib.rs @@ -28,11 +28,14 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + // Re-export since this is necessary for `impl_apis` in runtime. pub use sp_consensus_grandpa::{ self as fg_primitives, AuthorityId, AuthorityList, AuthorityWeight, }; +use alloc::{boxed::Box, vec::Vec}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ dispatch::{DispatchResultWithPostInfo, Pays}, @@ -50,7 +53,6 @@ use sp_consensus_grandpa::{ use sp_runtime::{generic::DigestItem, traits::Zero, DispatchResult}; use sp_session::{GetSessionNumber, GetValidatorCount}; use sp_staking::{offence::OffenceReportSystem, SessionIndex}; -use sp_std::prelude::*; mod default_weights; mod equivocation; @@ -351,7 +353,7 @@ pub mod pallet { pub struct GenesisConfig { pub authorities: AuthorityList, #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] diff --git a/substrate/frame/grandpa/src/migrations/v5.rs b/substrate/frame/grandpa/src/migrations/v5.rs index a0865a3f2bf..f1af0af42dd 100644 --- a/substrate/frame/grandpa/src/migrations/v5.rs +++ b/substrate/frame/grandpa/src/migrations/v5.rs @@ -16,7 +16,9 @@ // limitations under the License. use crate::{BoundedAuthorityList, Pallet}; +use alloc::vec::Vec; use codec::Decode; +use core::marker::PhantomData; use frame_support::{ migrations::VersionedMigration, storage, @@ -24,7 +26,6 @@ use frame_support::{ weights::Weight, }; use sp_consensus_grandpa::AuthorityList; -use sp_std::{marker::PhantomData, vec::Vec}; const GRANDPA_AUTHORITIES_KEY: &[u8] = b":grandpa_authorities"; diff --git a/substrate/frame/identity/Cargo.toml b/substrate/frame/identity/Cargo.toml index d0b796cd75d..6794fbfbbf4 100644 --- a/substrate/frame/identity/Cargo.toml +++ b/substrate/frame/identity/Cargo.toml @@ -25,7 +25,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -48,7 +47,6 @@ std = [ "sp-io/std", "sp-keystore/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/identity/src/benchmarking.rs b/substrate/frame/identity/src/benchmarking.rs index 957549b19f8..ab04000c228 100644 --- a/substrate/frame/identity/src/benchmarking.rs +++ b/substrate/frame/identity/src/benchmarking.rs @@ -22,6 +22,7 @@ use super::*; use crate::Pallet as Identity; +use alloc::{vec, vec::Vec}; use frame_benchmarking::{account, v2::*, whitelisted_caller, BenchmarkError}; use frame_support::{ assert_ok, ensure, diff --git a/substrate/frame/identity/src/legacy.rs b/substrate/frame/identity/src/legacy.rs index 60e812c2238..c2107e92903 100644 --- a/substrate/frame/identity/src/legacy.rs +++ b/substrate/frame/identity/src/legacy.rs @@ -15,6 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#[cfg(feature = "runtime-benchmarks")] +use alloc::vec; use codec::{Decode, Encode, MaxEncodedLen}; #[cfg(feature = "runtime-benchmarks")] use enumflags2::BitFlag; @@ -22,7 +24,6 @@ use enumflags2::{bitflags, BitFlags}; use frame_support::{traits::Get, CloneNoBound, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound}; use scale_info::{build::Variants, Path, Type, TypeInfo}; use sp_runtime::{BoundedVec, RuntimeDebug}; -use sp_std::prelude::*; use crate::types::{Data, IdentityInformationProvider}; diff --git a/substrate/frame/identity/src/lib.rs b/substrate/frame/identity/src/lib.rs index 50d6de32ac6..776a08f5e9e 100644 --- a/substrate/frame/identity/src/lib.rs +++ b/substrate/frame/identity/src/lib.rs @@ -101,7 +101,10 @@ mod tests; mod types; pub mod weights; +extern crate alloc; + use crate::types::{AuthorityPropertiesOf, Suffix, Username}; +use alloc::{boxed::Box, vec::Vec}; use codec::Encode; use frame_support::{ ensure, @@ -113,7 +116,6 @@ pub use pallet::*; use sp_runtime::traits::{ AppendZerosInput, Hash, IdentifyAccount, Saturating, StaticLookup, Verify, Zero, }; -use sp_std::prelude::*; pub use types::{ Data, IdentityInformationProvider, Judgement, RegistrarIndex, RegistrarInfo, Registration, }; diff --git a/substrate/frame/identity/src/types.rs b/substrate/frame/identity/src/types.rs index 10f0db8c25d..45401d53e9e 100644 --- a/substrate/frame/identity/src/types.rs +++ b/substrate/frame/identity/src/types.rs @@ -16,7 +16,9 @@ // limitations under the License. use super::*; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode, MaxEncodedLen}; +use core::{fmt::Debug, iter::once, ops::Add}; use frame_support::{ traits::{ConstU32, Get}, BoundedVec, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, @@ -29,7 +31,6 @@ use sp_runtime::{ traits::{Member, Zero}, RuntimeDebug, }; -use sp_std::{fmt::Debug, iter::once, ops::Add, prelude::*}; /// An identifier for a single name registrar/identity verification service. pub type RegistrarIndex = u32; @@ -65,7 +66,7 @@ impl Data { } impl Decode for Data { - fn decode(input: &mut I) -> sp_std::result::Result { + fn decode(input: &mut I) -> core::result::Result { let b = input.read_byte()?; Ok(match b { 0 => Data::None, @@ -295,7 +296,7 @@ impl< IdentityInfo: IdentityInformationProvider, > Decode for Registration { - fn decode(input: &mut I) -> sp_std::result::Result { + fn decode(input: &mut I) -> core::result::Result { let (judgements, deposit, info) = Decode::decode(&mut AppendZerosInput::new(input))?; Ok(Self { judgements, deposit, info }) } diff --git a/substrate/frame/im-online/Cargo.toml b/substrate/frame/im-online/Cargo.toml index 85cbcb3941b..2cb03b57d6c 100644 --- a/substrate/frame/im-online/Cargo.toml +++ b/substrate/frame/im-online/Cargo.toml @@ -28,7 +28,6 @@ sp-core = { features = ["serde"], workspace = true } sp-io = { workspace = true } sp-runtime = { features = ["serde"], workspace = true } sp-staking = { features = ["serde"], workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-session = { workspace = true, default-features = true } @@ -49,7 +48,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/im-online/src/lib.rs b/substrate/frame/im-online/src/lib.rs index f91a473e53d..ee2a8451d6f 100644 --- a/substrate/frame/im-online/src/lib.rs +++ b/substrate/frame/im-online/src/lib.rs @@ -82,6 +82,9 @@ mod mock; mod tests; pub mod weights; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ pallet_prelude::*, @@ -107,7 +110,6 @@ use sp_staking::{ offence::{Kind, Offence, ReportOffence}, SessionIndex, }; -use sp_std::prelude::*; pub use weights::WeightInfo; pub mod sr25519 { @@ -196,8 +198,8 @@ enum OffchainErr { SubmitTransaction, } -impl sp_std::fmt::Debug for OffchainErr { - fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { +impl core::fmt::Debug for OffchainErr { + fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { match *self { OffchainErr::TooEarly => write!(fmt, "Too early to send heartbeat."), OffchainErr::WaitingForInclusion(ref block) => { diff --git a/substrate/frame/im-online/src/migration.rs b/substrate/frame/im-online/src/migration.rs index 754a2e672e6..6d3a5cda697 100644 --- a/substrate/frame/im-online/src/migration.rs +++ b/substrate/frame/im-online/src/migration.rs @@ -18,6 +18,7 @@ //! Storage migrations for the im-online pallet. use super::*; +use alloc::vec::Vec; use frame_support::{storage_alias, traits::OnRuntimeUpgrade}; #[cfg(feature = "try-runtime")] diff --git a/substrate/frame/indices/Cargo.toml b/substrate/frame/indices/Cargo.toml index 20c3863ff99..ea170481531 100644 --- a/substrate/frame/indices/Cargo.toml +++ b/substrate/frame/indices/Cargo.toml @@ -25,7 +25,6 @@ sp-core = { workspace = true } sp-io = { workspace = true } sp-keyring = { optional = true, workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -44,7 +43,6 @@ std = [ "sp-keyring", "sp-keyring?/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/indices/src/lib.rs b/substrate/frame/indices/src/lib.rs index ff12d092cfb..740d69365df 100644 --- a/substrate/frame/indices/src/lib.rs +++ b/substrate/frame/indices/src/lib.rs @@ -25,13 +25,15 @@ mod mock; mod tests; pub mod weights; +extern crate alloc; + +use alloc::vec::Vec; use codec::Codec; use frame_support::traits::{BalanceStatus::Reserved, Currency, ReservableCurrency}; use sp_runtime::{ traits::{AtLeast32Bit, LookupError, Saturating, StaticLookup, Zero}, MultiAddress, }; -use sp_std::prelude::*; pub use weights::WeightInfo; type BalanceOf = diff --git a/substrate/frame/insecure-randomness-collective-flip/Cargo.toml b/substrate/frame/insecure-randomness-collective-flip/Cargo.toml index 0da0d537395..977b9fdb6f6 100644 --- a/substrate/frame/insecure-randomness-collective-flip/Cargo.toml +++ b/substrate/frame/insecure-randomness-collective-flip/Cargo.toml @@ -22,7 +22,6 @@ scale-info = { features = ["derive"], workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-core = { workspace = true, default-features = true } @@ -39,7 +38,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/lottery/Cargo.toml b/substrate/frame/lottery/Cargo.toml index 34d1728e42e..0a33e54a825 100644 --- a/substrate/frame/lottery/Cargo.toml +++ b/substrate/frame/lottery/Cargo.toml @@ -23,7 +23,6 @@ frame-benchmarking = { optional = true, workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] frame-support-test = { workspace = true } @@ -44,7 +43,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/lottery/src/benchmarking.rs b/substrate/frame/lottery/src/benchmarking.rs index 123b425b976..046bc0acbb6 100644 --- a/substrate/frame/lottery/src/benchmarking.rs +++ b/substrate/frame/lottery/src/benchmarking.rs @@ -22,6 +22,7 @@ use super::*; use crate::Pallet as Lottery; +use alloc::{boxed::Box, vec}; use frame_benchmarking::{ v1::{account, whitelisted_caller, BenchmarkError}, v2::*, diff --git a/substrate/frame/lottery/src/lib.rs b/substrate/frame/lottery/src/lib.rs index 54a8edd3860..0071b258fc4 100644 --- a/substrate/frame/lottery/src/lib.rs +++ b/substrate/frame/lottery/src/lib.rs @@ -54,6 +54,9 @@ mod mock; mod tests; pub mod weights; +extern crate alloc; + +use alloc::{boxed::Box, vec::Vec}; use codec::{Decode, Encode}; use frame_support::{ dispatch::{DispatchResult, GetDispatchInfo}, @@ -68,7 +71,6 @@ use sp_runtime::{ traits::{AccountIdConversion, Dispatchable, Saturating, Zero}, ArithmeticError, DispatchError, RuntimeDebug, }; -use sp_std::prelude::*; pub use weights::WeightInfo; type BalanceOf = diff --git a/substrate/frame/membership/Cargo.toml b/substrate/frame/membership/Cargo.toml index 35b0eeaa714..0fc5ce02809 100644 --- a/substrate/frame/membership/Cargo.toml +++ b/substrate/frame/membership/Cargo.toml @@ -25,7 +25,6 @@ frame-system = { workspace = true } sp-core = { features = ["serde"], workspace = true } sp-io = { workspace = true } sp-runtime = { features = ["serde"], workspace = true } -sp-std = { workspace = true } [features] default = ["std"] @@ -39,7 +38,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/membership/src/lib.rs b/substrate/frame/membership/src/lib.rs index d5dad68e811..e38a6ba5d93 100644 --- a/substrate/frame/membership/src/lib.rs +++ b/substrate/frame/membership/src/lib.rs @@ -23,12 +23,14 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use frame_support::{ traits::{ChangeMembers, Contains, ContainsLengthBound, Get, InitializeMembers, SortedMembers}, BoundedVec, }; use sp_runtime::traits::{StaticLookup, UniqueSaturatedInto}; -use sp_std::prelude::*; pub mod migrations; pub mod weights; @@ -113,7 +115,7 @@ pub mod pallet { #[pallet::genesis_build] impl, I: 'static> BuildGenesisConfig for GenesisConfig { fn build(&self) { - use sp_std::collections::btree_set::BTreeSet; + use alloc::collections::btree_set::BTreeSet; let members_set: BTreeSet<_> = self.members.iter().collect(); assert_eq!( members_set.len(), diff --git a/substrate/frame/merkle-mountain-range/Cargo.toml b/substrate/frame/merkle-mountain-range/Cargo.toml index 27ba77e5a62..b8a9b6065c6 100644 --- a/substrate/frame/merkle-mountain-range/Cargo.toml +++ b/substrate/frame/merkle-mountain-range/Cargo.toml @@ -25,7 +25,6 @@ sp-core = { workspace = true } sp-io = { workspace = true } sp-mmr-primitives = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] array-bytes = { workspace = true, default-features = true } @@ -45,7 +44,6 @@ std = [ "sp-io/std", "sp-mmr-primitives/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/merkle-mountain-range/src/lib.rs b/substrate/frame/merkle-mountain-range/src/lib.rs index 47a325db605..cacb33b5043 100644 --- a/substrate/frame/merkle-mountain-range/src/lib.rs +++ b/substrate/frame/merkle-mountain-range/src/lib.rs @@ -56,6 +56,9 @@ //! NOTE This pallet is experimental and not proven to work in production. #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use frame_support::weights::Weight; use frame_system::pallet_prelude::{BlockNumberFor, HeaderFor}; use log; @@ -64,7 +67,6 @@ use sp_runtime::{ traits::{self, One, Saturating}, SaturatedConversion, }; -use sp_std::prelude::*; pub use pallet::*; pub use sp_mmr_primitives::{ @@ -89,7 +91,7 @@ mod tests; /// is not available (since the block is not finished yet), /// we use the `parent_hash` here along with parent block number. pub struct ParentNumberAndHash { - _phantom: sp_std::marker::PhantomData, + _phantom: core::marker::PhantomData, } impl LeafDataProvider for ParentNumberAndHash { @@ -110,7 +112,7 @@ pub trait BlockHashProvider { /// Default implementation of BlockHashProvider using frame_system. pub struct DefaultBlockHashProvider { - _phantom: sp_std::marker::PhantomData, + _phantom: core::marker::PhantomData, } impl BlockHashProvider, T::Hash> @@ -302,7 +304,7 @@ impl, I: 'static> Pallet { fn node_temp_offchain_key( pos: NodeIndex, parent_hash: ::Hash, - ) -> sp_std::prelude::Vec { + ) -> Vec { NodesUtils::node_temp_offchain_key::>(&T::INDEXING_PREFIX, pos, parent_hash) } @@ -311,7 +313,7 @@ impl, I: 'static> Pallet { /// Used for nodes added by now finalized blocks. /// Never read keys using `node_canon_offchain_key` unless you sure that /// there's no `node_offchain_key` key in the storage. - fn node_canon_offchain_key(pos: NodeIndex) -> sp_std::prelude::Vec { + fn node_canon_offchain_key(pos: NodeIndex) -> Vec { NodesUtils::node_canon_offchain_key(&T::INDEXING_PREFIX, pos) } diff --git a/substrate/frame/merkle-mountain-range/src/mmr/mmr.rs b/substrate/frame/merkle-mountain-range/src/mmr/mmr.rs index 8a99f4d87de..2b46357c507 100644 --- a/substrate/frame/merkle-mountain-range/src/mmr/mmr.rs +++ b/substrate/frame/merkle-mountain-range/src/mmr/mmr.rs @@ -23,8 +23,8 @@ use crate::{ primitives::{self, Error, NodeIndex}, Config, HashOf, HashingOf, }; +use alloc::vec::Vec; use sp_mmr_primitives::{mmr_lib, mmr_lib::MMRStoreReadOps, utils::NodesUtils, LeafIndex}; -use sp_std::prelude::*; /// Stateless verification of the proof for a batch of leaves. /// Note, the leaves should be sorted such that corresponding leaves and leaf indices have the diff --git a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs index e27440be35c..a3908980148 100644 --- a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs +++ b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs @@ -17,14 +17,13 @@ //! An MMR storage implementation. +use alloc::{vec, vec::Vec}; use codec::Encode; +use core::iter::Peekable; use log::{debug, trace}; use sp_core::offchain::StorageKind; use sp_io::offchain_index; use sp_mmr_primitives::{mmr_lib, mmr_lib::helper, utils::NodesUtils}; -use sp_std::iter::Peekable; -#[cfg(not(feature = "std"))] -use sp_std::prelude::*; use crate::{ mmr::{Node, NodeOf}, @@ -52,7 +51,7 @@ pub struct OffchainStorage; /// /// There are two different implementations depending on the use case. /// See docs for [RuntimeStorage] and [OffchainStorage]. -pub struct Storage(sp_std::marker::PhantomData<(StorageType, T, I, L)>); +pub struct Storage(core::marker::PhantomData<(StorageType, T, I, L)>); impl Default for Storage { fn default() -> Self { diff --git a/substrate/frame/message-queue/Cargo.toml b/substrate/frame/message-queue/Cargo.toml index 5ced1a4e08f..0c3bbb2c883 100644 --- a/substrate/frame/message-queue/Cargo.toml +++ b/substrate/frame/message-queue/Cargo.toml @@ -21,7 +21,6 @@ environmental = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-arithmetic = { workspace = true } sp-weights = { workspace = true } @@ -49,7 +48,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-tracing/std", "sp-weights/std", ] diff --git a/substrate/frame/message-queue/src/benchmarking.rs b/substrate/frame/message-queue/src/benchmarking.rs index 7e99bc05858..8f0712acc5f 100644 --- a/substrate/frame/message-queue/src/benchmarking.rs +++ b/substrate/frame/message-queue/src/benchmarking.rs @@ -26,7 +26,6 @@ use frame_benchmarking::v2::*; use frame_support::traits::Get; use frame_system::RawOrigin; use sp_io::hashing::blake2_256; -use sp_std::prelude::*; #[benchmarks( where diff --git a/substrate/frame/message-queue/src/lib.rs b/substrate/frame/message-queue/src/lib.rs index ef3420d21be..2dbffef7e5a 100644 --- a/substrate/frame/message-queue/src/lib.rs +++ b/substrate/frame/message-queue/src/lib.rs @@ -203,7 +203,11 @@ pub mod mock_helpers; mod tests; pub mod weights; +extern crate alloc; + +use alloc::{vec, vec::Vec}; use codec::{Codec, Decode, Encode, MaxEncodedLen}; +use core::{fmt::Debug, ops::Deref}; use frame_support::{ defensive, pallet_prelude::*, @@ -223,7 +227,6 @@ use sp_runtime::{ traits::{One, Zero}, SaturatedConversion, Saturating, }; -use sp_std::{fmt::Debug, ops::Deref, prelude::*, vec}; use sp_weights::WeightMeter; pub use weights::WeightInfo; @@ -307,7 +310,7 @@ impl< return Err(()) } - let mut heap = sp_std::mem::take(&mut self.heap).into_inner(); + let mut heap = core::mem::take(&mut self.heap).into_inner(); header.using_encoded(|h| heap.extend_from_slice(h)); heap.extend_from_slice(message.deref()); self.heap = BoundedVec::defensive_truncate_from(heap); @@ -1509,7 +1512,7 @@ pub(crate) fn with_service_mutex R, R>(f: F) -> Result { } /// Provides a [`sp_core::Get`] to access the `MEL` of a [`codec::MaxEncodedLen`] type. -pub struct MaxEncodedLenOf(sp_std::marker::PhantomData); +pub struct MaxEncodedLenOf(core::marker::PhantomData); impl Get for MaxEncodedLenOf { fn get() -> u32 { T::max_encoded_len() as u32 @@ -1518,7 +1521,7 @@ impl Get for MaxEncodedLenOf { /// Calculates the maximum message length and exposed it through the [`codec::MaxEncodedLen`] trait. pub struct MaxMessageLen( - sp_std::marker::PhantomData<(Origin, Size, HeapSize)>, + core::marker::PhantomData<(Origin, Size, HeapSize)>, ); impl, HeapSize: Get> Get for MaxMessageLen @@ -1544,7 +1547,7 @@ pub type BookStateOf = BookState>; /// Converts a [`sp_core::Get`] with returns a type that can be cast into an `u32` into a `Get` /// which returns an `u32`. -pub struct IntoU32(sp_std::marker::PhantomData<(T, O)>); +pub struct IntoU32(core::marker::PhantomData<(T, O)>); impl, O: Into> Get for IntoU32 { fn get() -> u32 { T::get().into() diff --git a/substrate/frame/message-queue/src/mock.rs b/substrate/frame/message-queue/src/mock.rs index 66a242d5a18..26533cc7c33 100644 --- a/substrate/frame/message-queue/src/mock.rs +++ b/substrate/frame/message-queue/src/mock.rs @@ -23,9 +23,9 @@ pub use super::mock_helpers::*; use super::*; use crate as pallet_message_queue; +use alloc::collections::btree_map::BTreeMap; use frame_support::{derive_impl, parameter_types}; use sp_runtime::BuildStorage; -use sp_std::collections::btree_map::BTreeMap; type Block = frame_system::mocking::MockBlock; diff --git a/substrate/frame/message-queue/src/mock_helpers.rs b/substrate/frame/message-queue/src/mock_helpers.rs index 28395e27cdd..873add776e2 100644 --- a/substrate/frame/message-queue/src/mock_helpers.rs +++ b/substrate/frame/message-queue/src/mock_helpers.rs @@ -22,6 +22,7 @@ //! Cannot be put into mock.rs since benchmarks require no-std and mock.rs is std. use crate::*; +use alloc::vec::Vec; use frame_support::traits::Defensive; /// Converts `Self` into a `Weight` by using `Self` for all components. diff --git a/substrate/frame/migrations/Cargo.toml b/substrate/frame/migrations/Cargo.toml index 5a946d3aa05..5fbed74a440 100644 --- a/substrate/frame/migrations/Cargo.toml +++ b/substrate/frame/migrations/Cargo.toml @@ -21,7 +21,6 @@ frame-benchmarking = { optional = true, workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } sp-core = { workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } [dev-dependencies] @@ -46,7 +45,6 @@ std = [ "scale-info/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/migrations/src/lib.rs b/substrate/frame/migrations/src/lib.rs index 649bc314a12..68041a57eaa 100644 --- a/substrate/frame/migrations/src/lib.rs +++ b/substrate/frame/migrations/src/lib.rs @@ -69,22 +69,22 @@ //! either be [`MigrationCursor::Active`] or [`MigrationCursor::Stuck`]. In the active case it //! points to the currently active migration and stores its inner cursor. The inner cursor can then //! be used by the migration to store its inner state and advance. Each time when the migration -//! returns `Some(cursor)`, it signals the pallet that it is not done yet. +//! returns `Some(cursor)`, it signals the pallet that it is not done yet. //! The cursor is reset on each runtime upgrade. This ensures that it starts to execute at the //! first migration in the vector. The pallets cursor is only ever incremented or set to `Stuck` //! once it encounters an error (Goal 4). Once in the stuck state, the pallet will stay stuck until -//! it is fixed through manual governance intervention. +//! it is fixed through manual governance intervention. //! As soon as the cursor of the pallet becomes `Some(_)`; [`MultiStepMigrator::ongoing`] returns //! `true` (Goal 2). This can be used by upstream code to possibly pause transactions. //! In `on_initialize` the pallet will load the current migration and check whether it was already //! executed in the past by checking for membership of its ID in the [`Historic`] set. Historic //! migrations are skipped without causing an error. Each successfully executed migration is added -//! to this set (Goal 5). +//! to this set (Goal 5). //! This proceeds until no more migrations remain. At that point, the event `UpgradeCompleted` is -//! emitted (Goal 1). +//! emitted (Goal 1). //! The execution of each migration happens by calling [`SteppedMigration::transactional_step`]. //! This function wraps the inner `step` function into a transactional layer to allow rollback in -//! the error case (Goal 6). +//! the error case (Goal 6). //! Weight limits must be checked by the migration itself. The pallet provides a [`WeightMeter`] for //! that purpose. The pallet may return [`SteppedMigrationError::InsufficientWeight`] at any point. //! In that scenario, one of two things will happen: if that migration was exclusively executed @@ -145,9 +145,12 @@ pub mod mock_helpers; mod tests; pub mod weights; +extern crate alloc; + pub use pallet::*; pub use weights::WeightInfo; +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use core::ops::ControlFlow; use frame_support::{ @@ -159,7 +162,6 @@ use frame_support::{ }; use frame_system::{pallet_prelude::BlockNumberFor, Pallet as System}; use sp_runtime::Saturating; -use sp_std::vec::Vec; /// Points to the next migration to execute. #[derive(Debug, Clone, Eq, PartialEq, Encode, Decode, scale_info::TypeInfo, MaxEncodedLen)] diff --git a/substrate/frame/migrations/src/mock_helpers.rs b/substrate/frame/migrations/src/mock_helpers.rs index d230417d12e..9d3b4d1193f 100644 --- a/substrate/frame/migrations/src/mock_helpers.rs +++ b/substrate/frame/migrations/src/mock_helpers.rs @@ -19,6 +19,7 @@ #![allow(missing_docs)] +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; use frame_support::{ migrations::*, @@ -26,7 +27,6 @@ use frame_support::{ }; use sp_core::ConstU32; use sp_runtime::BoundedVec; -use sp_std::{vec, vec::Vec}; /// Opaque identifier of a migration. pub type MockedIdentifier = BoundedVec>; diff --git a/substrate/frame/mixnet/Cargo.toml b/substrate/frame/mixnet/Cargo.toml index f3bea3d2914..a9980ac268b 100644 --- a/substrate/frame/mixnet/Cargo.toml +++ b/substrate/frame/mixnet/Cargo.toml @@ -28,7 +28,6 @@ sp-arithmetic = { workspace = true } sp-io = { workspace = true } sp-mixnet = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [features] default = ["std"] @@ -45,7 +44,6 @@ std = [ "sp-io/std", "sp-mixnet/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/mixnet/src/lib.rs b/substrate/frame/mixnet/src/lib.rs index c7a5b624157..c0505a4f010 100644 --- a/substrate/frame/mixnet/src/lib.rs +++ b/substrate/frame/mixnet/src/lib.rs @@ -21,7 +21,11 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; +use core::cmp::Ordering; use frame_support::{ traits::{EstimateNextSessionRotation, Get, OneSessionHandler}, BoundedVec, @@ -41,7 +45,6 @@ use sp_mixnet::types::{ SessionPhase, SessionStatus, KX_PUBLIC_SIZE, }; use sp_runtime::RuntimeDebug; -use sp_std::{cmp::Ordering, vec::Vec}; const LOG_TARGET: &str = "runtime::mixnet"; diff --git a/substrate/frame/multisig/Cargo.toml b/substrate/frame/multisig/Cargo.toml index 329b2e8824e..c1571c6c030 100644 --- a/substrate/frame/multisig/Cargo.toml +++ b/substrate/frame/multisig/Cargo.toml @@ -23,7 +23,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } # third party log = { workspace = true } @@ -43,7 +42,6 @@ std = [ "scale-info/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/multisig/src/lib.rs b/substrate/frame/multisig/src/lib.rs index a83b78e316f..51c36773bda 100644 --- a/substrate/frame/multisig/src/lib.rs +++ b/substrate/frame/multisig/src/lib.rs @@ -48,6 +48,9 @@ pub mod migrations; mod tests; pub mod weights; +extern crate alloc; + +use alloc::{boxed::Box, vec, vec::Vec}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ dispatch::{ @@ -66,7 +69,6 @@ use sp_runtime::{ traits::{Dispatchable, TrailingZeroInput, Zero}, DispatchError, RuntimeDebug, }; -use sp_std::prelude::*; pub use weights::WeightInfo; pub use pallet::*; diff --git a/substrate/frame/nft-fractionalization/Cargo.toml b/substrate/frame/nft-fractionalization/Cargo.toml index f0613581257..ca2e70cbe6c 100644 --- a/substrate/frame/nft-fractionalization/Cargo.toml +++ b/substrate/frame/nft-fractionalization/Cargo.toml @@ -25,7 +25,6 @@ frame-system = { workspace = true } pallet-assets = { workspace = true } pallet-nfts = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -48,7 +47,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/nft-fractionalization/src/benchmarking.rs b/substrate/frame/nft-fractionalization/src/benchmarking.rs index 0b54acdab49..811b5fe1b31 100644 --- a/substrate/frame/nft-fractionalization/src/benchmarking.rs +++ b/substrate/frame/nft-fractionalization/src/benchmarking.rs @@ -32,7 +32,6 @@ use frame_support::{ use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin as SystemOrigin}; use pallet_nfts::{CollectionConfig, CollectionSettings, ItemConfig, MintSettings}; use sp_runtime::traits::StaticLookup; -use sp_std::prelude::*; use crate::Pallet as NftFractionalization; diff --git a/substrate/frame/nft-fractionalization/src/lib.rs b/substrate/frame/nft-fractionalization/src/lib.rs index cb269f464c4..5fa990ecebe 100644 --- a/substrate/frame/nft-fractionalization/src/lib.rs +++ b/substrate/frame/nft-fractionalization/src/lib.rs @@ -56,6 +56,7 @@ pub use weights::WeightInfo; #[frame_support::pallet] pub mod pallet { use super::*; + use core::fmt::Display; use frame_support::{ dispatch::DispatchResult, ensure, @@ -83,7 +84,6 @@ pub mod pallet { use frame_system::pallet_prelude::*; use scale_info::prelude::{format, string::String}; use sp_runtime::traits::{One, Zero}; - use sp_std::{fmt::Display, prelude::*}; #[pallet::pallet] pub struct Pallet(_); diff --git a/substrate/frame/nfts/Cargo.toml b/substrate/frame/nfts/Cargo.toml index a1eef3226ec..e3ffd971a2b 100644 --- a/substrate/frame/nfts/Cargo.toml +++ b/substrate/frame/nfts/Cargo.toml @@ -26,7 +26,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -47,7 +46,6 @@ std = [ "sp-io/std", "sp-keystore/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/nfts/runtime-api/Cargo.toml b/substrate/frame/nfts/runtime-api/Cargo.toml index 731f5f5ae77..4125aa1aab0 100644 --- a/substrate/frame/nfts/runtime-api/Cargo.toml +++ b/substrate/frame/nfts/runtime-api/Cargo.toml @@ -19,8 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { features = ["derive"], workspace = true } pallet-nfts = { workspace = true } sp-api = { workspace = true } -sp-std = { workspace = true } [features] default = ["std"] -std = ["codec/std", "pallet-nfts/std", "sp-api/std", "sp-std/std"] +std = ["codec/std", "pallet-nfts/std", "sp-api/std"] diff --git a/substrate/frame/nfts/runtime-api/src/lib.rs b/substrate/frame/nfts/runtime-api/src/lib.rs index 816088f1b71..87faa790985 100644 --- a/substrate/frame/nfts/runtime-api/src/lib.rs +++ b/substrate/frame/nfts/runtime-api/src/lib.rs @@ -19,8 +19,10 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode}; -use sp_std::vec::Vec; sp_api::decl_runtime_apis! { pub trait NftsApi diff --git a/substrate/frame/nfts/src/benchmarking.rs b/substrate/frame/nfts/src/benchmarking.rs index 80860bc5a53..bc81096b459 100644 --- a/substrate/frame/nfts/src/benchmarking.rs +++ b/substrate/frame/nfts/src/benchmarking.rs @@ -31,7 +31,6 @@ use frame_support::{ }; use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin as SystemOrigin}; use sp_runtime::traits::{Bounded, One}; -use sp_std::prelude::*; use crate::Pallet as Nfts; diff --git a/substrate/frame/nfts/src/common_functions.rs b/substrate/frame/nfts/src/common_functions.rs index 1ad523d664c..2c4778c1444 100644 --- a/substrate/frame/nfts/src/common_functions.rs +++ b/substrate/frame/nfts/src/common_functions.rs @@ -18,6 +18,7 @@ //! Various pieces of common functionality. use crate::*; +use alloc::vec::Vec; use frame_support::pallet_prelude::*; impl, I: 'static> Pallet { diff --git a/substrate/frame/nfts/src/features/metadata.rs b/substrate/frame/nfts/src/features/metadata.rs index 85edd294d50..260061603e9 100644 --- a/substrate/frame/nfts/src/features/metadata.rs +++ b/substrate/frame/nfts/src/features/metadata.rs @@ -18,6 +18,7 @@ //! This module contains helper methods to configure the metadata of collections and items. use crate::*; +use alloc::vec::Vec; use frame_support::pallet_prelude::*; impl, I: 'static> Pallet { diff --git a/substrate/frame/nfts/src/features/roles.rs b/substrate/frame/nfts/src/features/roles.rs index f6d2785fd9c..aa6394f70bf 100644 --- a/substrate/frame/nfts/src/features/roles.rs +++ b/substrate/frame/nfts/src/features/roles.rs @@ -18,8 +18,8 @@ //! This module contains helper methods to configure account roles for existing collections. use crate::*; +use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use frame_support::pallet_prelude::*; -use sp_std::collections::btree_map::BTreeMap; impl, I: 'static> Pallet { /// Set the team roles for a specific collection. diff --git a/substrate/frame/nfts/src/impl_nonfungibles.rs b/substrate/frame/nfts/src/impl_nonfungibles.rs index ee7f42cfc68..c90655aadbf 100644 --- a/substrate/frame/nfts/src/impl_nonfungibles.rs +++ b/substrate/frame/nfts/src/impl_nonfungibles.rs @@ -25,7 +25,6 @@ use frame_support::{ BoundedSlice, }; use sp_runtime::{DispatchError, DispatchResult}; -use sp_std::prelude::*; impl, I: 'static> Inspect<::AccountId> for Pallet { type ItemId = T::ItemId; diff --git a/substrate/frame/nfts/src/lib.rs b/substrate/frame/nfts/src/lib.rs index 0406cac6e2c..4e5493a3c75 100644 --- a/substrate/frame/nfts/src/lib.rs +++ b/substrate/frame/nfts/src/lib.rs @@ -48,6 +48,9 @@ mod types; pub mod macros; pub mod weights; +extern crate alloc; + +use alloc::{boxed::Box, vec, vec::Vec}; use codec::{Decode, Encode}; use frame_support::traits::{ tokens::Locker, BalanceStatus::Reserved, Currency, EnsureOriginWithArg, Incrementable, @@ -58,7 +61,6 @@ use sp_runtime::{ traits::{IdentifyAccount, Saturating, StaticLookup, Verify, Zero}, RuntimeDebug, }; -use sp_std::prelude::*; pub use pallet::*; pub use types::*; diff --git a/substrate/frame/nfts/src/tests.rs b/substrate/frame/nfts/src/tests.rs index 4d23aca64ce..e1b598ca426 100644 --- a/substrate/frame/nfts/src/tests.rs +++ b/substrate/frame/nfts/src/tests.rs @@ -32,7 +32,6 @@ use sp_runtime::{ traits::{Dispatchable, IdentifyAccount}, MultiSignature, MultiSigner, }; -use sp_std::prelude::*; type AccountIdOf = ::AccountId; diff --git a/substrate/frame/nfts/src/types.rs b/substrate/frame/nfts/src/types.rs index 5a9f6ae2f0e..1687a03520a 100644 --- a/substrate/frame/nfts/src/types.rs +++ b/substrate/frame/nfts/src/types.rs @@ -19,6 +19,7 @@ use super::*; use crate::macros::*; +use alloc::{vec, vec::Vec}; use codec::EncodeLike; use enumflags2::{bitflags, BitFlags}; use frame_support::{ diff --git a/substrate/frame/nis/Cargo.toml b/substrate/frame/nis/Cargo.toml index 418c906e2b6..fb6c25789b2 100644 --- a/substrate/frame/nis/Cargo.toml +++ b/substrate/frame/nis/Cargo.toml @@ -24,7 +24,6 @@ frame-system = { workspace = true } sp-arithmetic = { workspace = true } sp-core = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -43,7 +42,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/nis/src/benchmarking.rs b/substrate/frame/nis/src/benchmarking.rs index f6a83b78d51..2c7ad651f99 100644 --- a/substrate/frame/nis/src/benchmarking.rs +++ b/substrate/frame/nis/src/benchmarking.rs @@ -30,7 +30,6 @@ use sp_runtime::{ traits::{Bounded, One, Zero}, DispatchError, PerThing, }; -use sp_std::prelude::*; use crate::Pallet as Nis; diff --git a/substrate/frame/nis/src/lib.rs b/substrate/frame/nis/src/lib.rs index d815ea6ac11..016daa4cb78 100644 --- a/substrate/frame/nis/src/lib.rs +++ b/substrate/frame/nis/src/lib.rs @@ -76,6 +76,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use frame_support::traits::{ fungible::{self, Inspect as FunInspect, Mutate as FunMutate}, tokens::{DepositConsequence, Fortitude, Preservation, Provenance, WithdrawConsequence}, @@ -95,7 +97,7 @@ mod mock; mod tests; pub mod weights; -pub struct WithMaximumOf(sp_std::marker::PhantomData); +pub struct WithMaximumOf(core::marker::PhantomData); impl Convert for WithMaximumOf where A::Type: Clone + Unsigned + From, @@ -116,7 +118,7 @@ where } } -pub struct NoCounterpart(sp_std::marker::PhantomData); +pub struct NoCounterpart(core::marker::PhantomData); impl FunInspect for NoCounterpart { type Balance = u32; fn total_issuance() -> u32 { @@ -171,6 +173,7 @@ impl BenchmarkSetup for () { pub mod pallet { use super::{FunInspect, FunMutate}; pub use crate::weights::WeightInfo; + use alloc::{vec, vec::Vec}; use frame_support::{ pallet_prelude::*, traits::{ @@ -193,7 +196,6 @@ pub mod pallet { traits::{AccountIdConversion, Bounded, Convert, ConvertBack, Saturating, Zero}, Rounding, TokenError, }; - use sp_std::prelude::*; type BalanceOf = <::Currency as FunInspect<::AccountId>>::Balance; @@ -372,7 +374,7 @@ pub mod pallet { pub receipts_on_hold: Balance, } - pub struct OnEmptyQueueTotals(sp_std::marker::PhantomData); + pub struct OnEmptyQueueTotals(core::marker::PhantomData); impl Get> for OnEmptyQueueTotals { fn get() -> QueueTotalsTypeOf { BoundedVec::truncate_from(vec![ @@ -573,7 +575,7 @@ pub mod pallet { // queue is let mut bid = Bid { amount, who: who.clone() }; let net = if queue_full { - sp_std::mem::swap(&mut q[0], &mut bid); + core::mem::swap(&mut q[0], &mut bid); let _ = T::Currency::release( &HoldReason::NftReceipt.into(), &bid.who, diff --git a/substrate/frame/node-authorization/Cargo.toml b/substrate/frame/node-authorization/Cargo.toml index d16e9bc6ead..b56a76ce641 100644 --- a/substrate/frame/node-authorization/Cargo.toml +++ b/substrate/frame/node-authorization/Cargo.toml @@ -23,7 +23,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [features] default = ["std"] @@ -36,7 +35,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/node-authorization/src/lib.rs b/substrate/frame/node-authorization/src/lib.rs index a7967536079..7682b54ea0f 100644 --- a/substrate/frame/node-authorization/src/lib.rs +++ b/substrate/frame/node-authorization/src/lib.rs @@ -44,10 +44,12 @@ mod tests; pub mod weights; +extern crate alloc; + +use alloc::{collections::btree_set::BTreeSet, vec::Vec}; pub use pallet::*; use sp_core::OpaquePeerId as PeerId; use sp_runtime::traits::StaticLookup; -use sp_std::{collections::btree_set::BTreeSet, prelude::*}; pub use weights::WeightInfo; type AccountIdLookupOf = <::Lookup as StaticLookup>::Source; diff --git a/substrate/frame/nomination-pools/Cargo.toml b/substrate/frame/nomination-pools/Cargo.toml index 535d5252435..bfcc92edb7e 100644 --- a/substrate/frame/nomination-pools/Cargo.toml +++ b/substrate/frame/nomination-pools/Cargo.toml @@ -27,7 +27,6 @@ scale-info = { features = [ frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-staking = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } @@ -55,7 +54,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", "sp-tracing?/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/nomination-pools/benchmarking/Cargo.toml b/substrate/frame/nomination-pools/benchmarking/Cargo.toml index 1516f0154b8..e73a208926e 100644 --- a/substrate/frame/nomination-pools/benchmarking/Cargo.toml +++ b/substrate/frame/nomination-pools/benchmarking/Cargo.toml @@ -34,7 +34,6 @@ pallet-nomination-pools = { workspace = true } sp-runtime = { workspace = true } sp-runtime-interface = { workspace = true } sp-staking = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true } @@ -64,7 +63,6 @@ std = [ "sp-runtime-interface/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/nomination-pools/benchmarking/src/inner.rs b/substrate/frame/nomination-pools/benchmarking/src/inner.rs index b8c978945e9..2a455942511 100644 --- a/substrate/frame/nomination-pools/benchmarking/src/inner.rs +++ b/substrate/frame/nomination-pools/benchmarking/src/inner.rs @@ -17,6 +17,7 @@ //! Benchmarks for the nomination pools coupled with the staking and bags list pallets. +use alloc::{vec, vec::Vec}; use frame_benchmarking::v1::{account, whitelist_account}; use frame_election_provider_support::SortedListProvider; use frame_support::{ @@ -41,7 +42,6 @@ use sp_runtime::{ Perbill, }; use sp_staking::EraIndex; -use sp_std::{vec, vec::Vec}; // `frame_benchmarking::benchmarks!` macro needs this use pallet_nomination_pools::Call; diff --git a/substrate/frame/nomination-pools/benchmarking/src/lib.rs b/substrate/frame/nomination-pools/benchmarking/src/lib.rs index 910cdf2e3df..feb73be7168 100644 --- a/substrate/frame/nomination-pools/benchmarking/src/lib.rs +++ b/substrate/frame/nomination-pools/benchmarking/src/lib.rs @@ -20,6 +20,8 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "256"] +extern crate alloc; + #[cfg(feature = "runtime-benchmarks")] pub mod inner; diff --git a/substrate/frame/nomination-pools/runtime-api/Cargo.toml b/substrate/frame/nomination-pools/runtime-api/Cargo.toml index 2b217e02145..2f91e550bc0 100644 --- a/substrate/frame/nomination-pools/runtime-api/Cargo.toml +++ b/substrate/frame/nomination-pools/runtime-api/Cargo.toml @@ -18,9 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { features = ["derive"], workspace = true } sp-api = { workspace = true } -sp-std = { workspace = true } pallet-nomination-pools = { workspace = true } [features] default = ["std"] -std = ["codec/std", "pallet-nomination-pools/std", "sp-api/std", "sp-std/std"] +std = ["codec/std", "pallet-nomination-pools/std", "sp-api/std"] diff --git a/substrate/frame/nomination-pools/src/adapter.rs b/substrate/frame/nomination-pools/src/adapter.rs index 4809fbc0e9d..4d571855e4f 100644 --- a/substrate/frame/nomination-pools/src/adapter.rs +++ b/substrate/frame/nomination-pools/src/adapter.rs @@ -83,7 +83,7 @@ impl Member { /// [`DelegateStake`] for more detail. pub trait StakeStrategy { type Balance: frame_support::traits::tokens::Balance; - type AccountId: Clone + sp_std::fmt::Debug; + type AccountId: Clone + core::fmt::Debug; type CoreStaking: StakingInterface; /// The type of staking strategy of the current adapter. diff --git a/substrate/frame/nomination-pools/src/lib.rs b/substrate/frame/nomination-pools/src/lib.rs index 641f2b14577..472f0affcc7 100644 --- a/substrate/frame/nomination-pools/src/lib.rs +++ b/substrate/frame/nomination-pools/src/lib.rs @@ -351,8 +351,12 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use adapter::{Member, Pool, StakeStrategy}; +use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use codec::Codec; +use core::{fmt::Debug, ops::Div}; use frame_support::{ defensive, defensive_assert, ensure, pallet_prelude::{MaxEncodedLen, *}, @@ -375,7 +379,6 @@ use sp_runtime::{ FixedPointNumber, Perbill, }; use sp_staking::{EraIndex, StakingInterface}; -use sp_std::{collections::btree_map::BTreeMap, fmt::Debug, ops::Div, vec::Vec}; #[cfg(any(feature = "try-runtime", feature = "fuzzing", test, debug_assertions))] use sp_runtime::TryRuntimeError; @@ -949,14 +952,14 @@ pub struct BondedPool { inner: BondedPoolInner, } -impl sp_std::ops::Deref for BondedPool { +impl core::ops::Deref for BondedPool { type Target = BondedPoolInner; fn deref(&self) -> &Self::Target { &self.inner } } -impl sp_std::ops::DerefMut for BondedPool { +impl core::ops::DerefMut for BondedPool { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner } diff --git a/substrate/frame/nomination-pools/src/migration.rs b/substrate/frame/nomination-pools/src/migration.rs index a9222ea53d7..d8697364a76 100644 --- a/substrate/frame/nomination-pools/src/migration.rs +++ b/substrate/frame/nomination-pools/src/migration.rs @@ -17,8 +17,8 @@ use super::*; use crate::log; +use alloc::{collections::btree_map::BTreeMap, vec::Vec}; use frame_support::traits::{OnRuntimeUpgrade, UncheckedOnRuntimeUpgrade}; -use sp_std::{collections::btree_map::BTreeMap, vec::Vec}; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; @@ -60,7 +60,7 @@ pub mod unversioned { use super::*; /// Checks and updates `TotalValueLocked` if out of sync. - pub struct TotalValueLockedSync(sp_std::marker::PhantomData); + pub struct TotalValueLockedSync(core::marker::PhantomData); impl OnRuntimeUpgrade for TotalValueLockedSync { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { @@ -125,7 +125,7 @@ pub mod unversioned { /// /// If there are pools that fail to migrate or did not fit in the bounds, the remaining pools /// can be migrated via the permission-less extrinsic [`Call::migrate_pool_to_delegate_stake`]. - pub struct DelegationStakeMigration(sp_std::marker::PhantomData<(T, MaxPools)>); + pub struct DelegationStakeMigration(core::marker::PhantomData<(T, MaxPools)>); impl> OnRuntimeUpgrade for DelegationStakeMigration { fn on_runtime_upgrade() -> Weight { @@ -262,7 +262,7 @@ pub mod v8 { } } - pub struct VersionUncheckedMigrateV7ToV8(sp_std::marker::PhantomData); + pub struct VersionUncheckedMigrateV7ToV8(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateV7ToV8 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { @@ -341,7 +341,7 @@ pub(crate) mod v7 { pub type BondedPools = CountedStorageMap, Twox64Concat, PoolId, V7BondedPoolInner>; - pub struct VersionUncheckedMigrateV6ToV7(sp_std::marker::PhantomData); + pub struct VersionUncheckedMigrateV6ToV7(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateV6ToV7 { fn on_runtime_upgrade() -> Weight { let migrated = BondedPools::::count(); @@ -402,7 +402,7 @@ mod v6 { /// This migration would restrict reward account of pools to go below ED by doing a named /// freeze on all the existing pools. - pub struct MigrateToV6(sp_std::marker::PhantomData); + pub struct MigrateToV6(core::marker::PhantomData); impl MigrateToV6 { fn freeze_ed(pool_id: PoolId) -> Result<(), ()> { @@ -470,7 +470,7 @@ pub mod v5 { /// This migration adds `total_commission_pending` and `total_commission_claimed` field to every /// `RewardPool`, if any. - pub struct MigrateToV5(sp_std::marker::PhantomData); + pub struct MigrateToV5(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV5 { fn on_runtime_upgrade() -> Weight { let in_code = Pallet::::in_code_storage_version(); @@ -625,7 +625,7 @@ pub mod v4 { #[deprecated( note = "To avoid mangled storage please use `MigrateV3ToV5` instead. See: github.com/paritytech/substrate/pull/13715" )] - pub struct MigrateToV4(sp_std::marker::PhantomData<(T, U)>); + pub struct MigrateToV4(core::marker::PhantomData<(T, U)>); #[allow(deprecated)] impl> OnRuntimeUpgrade for MigrateToV4 { fn on_runtime_upgrade() -> Weight { @@ -707,7 +707,7 @@ pub mod v3 { use super::*; /// This migration removes stale bonded-pool metadata, if any. - pub struct MigrateToV3(sp_std::marker::PhantomData); + pub struct MigrateToV3(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV3 { fn on_runtime_upgrade() -> Weight { let current = Pallet::::in_code_storage_version(); @@ -845,7 +845,7 @@ pub mod v2 { /// Migrate the pool reward scheme to the new version, as per /// . - pub struct MigrateToV2(sp_std::marker::PhantomData); + pub struct MigrateToV2(core::marker::PhantomData); impl MigrateToV2 { fn run(current: StorageVersion) -> Weight { let mut reward_pools_translated = 0u64; @@ -1104,7 +1104,7 @@ pub mod v1 { /// Trivial migration which makes the roles of each pool optional. /// /// Note: The depositor is not optional since they can never change. - pub struct MigrateToV1(sp_std::marker::PhantomData); + pub struct MigrateToV1(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { let current = Pallet::::in_code_storage_version(); diff --git a/substrate/frame/offences/Cargo.toml b/substrate/frame/offences/Cargo.toml index 51eb3e4f438..9cf5e911a9d 100644 --- a/substrate/frame/offences/Cargo.toml +++ b/substrate/frame/offences/Cargo.toml @@ -25,7 +25,6 @@ frame-system = { workspace = true } pallet-balances = { workspace = true } sp-runtime = { workspace = true } sp-staking = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-core = { workspace = true, default-features = true } @@ -45,7 +44,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-support/runtime-benchmarks", diff --git a/substrate/frame/offences/benchmarking/Cargo.toml b/substrate/frame/offences/benchmarking/Cargo.toml index 037812b3ed1..eb97eb3d413 100644 --- a/substrate/frame/offences/benchmarking/Cargo.toml +++ b/substrate/frame/offences/benchmarking/Cargo.toml @@ -31,7 +31,6 @@ pallet-session = { workspace = true } pallet-staking = { workspace = true } sp-runtime = { workspace = true } sp-staking = { workspace = true } -sp-std = { workspace = true } log = { workspace = true } [dev-dependencies] @@ -62,7 +61,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/offences/benchmarking/src/inner.rs b/substrate/frame/offences/benchmarking/src/inner.rs index 9aa88f7a0d6..b16e5be653d 100644 --- a/substrate/frame/offences/benchmarking/src/inner.rs +++ b/substrate/frame/offences/benchmarking/src/inner.rs @@ -17,7 +17,7 @@ //! Offences pallet benchmarking. -use sp_std::{prelude::*, vec}; +use alloc::{vec, vec::Vec}; use frame_benchmarking::v1::{account, benchmarks}; use frame_support::traits::{Currency, Get}; diff --git a/substrate/frame/offences/benchmarking/src/lib.rs b/substrate/frame/offences/benchmarking/src/lib.rs index b08955a1332..f696546d1f0 100644 --- a/substrate/frame/offences/benchmarking/src/lib.rs +++ b/substrate/frame/offences/benchmarking/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "runtime-benchmarks")] pub mod inner; diff --git a/substrate/frame/offences/src/lib.rs b/substrate/frame/offences/src/lib.rs index a328b2fee4e..ffea32a1f47 100644 --- a/substrate/frame/offences/src/lib.rs +++ b/substrate/frame/offences/src/lib.rs @@ -26,16 +26,17 @@ pub mod migration; mod mock; mod tests; -use core::marker::PhantomData; +extern crate alloc; +use alloc::vec::Vec; use codec::Encode; +use core::marker::PhantomData; use frame_support::weights::Weight; use sp_runtime::{traits::Hash, Perbill}; use sp_staking::{ offence::{Kind, Offence, OffenceDetails, OffenceError, OnOffenceHandler, ReportOffence}, SessionIndex, }; -use sp_std::prelude::*; pub use pallet::*; diff --git a/substrate/frame/offences/src/migration.rs b/substrate/frame/offences/src/migration.rs index 199f4749136..abf8acd9487 100644 --- a/substrate/frame/offences/src/migration.rs +++ b/substrate/frame/offences/src/migration.rs @@ -16,6 +16,7 @@ // limitations under the License. use super::{Config, Kind, OffenceDetails, Pallet, Perbill, SessionIndex, LOG_TARGET}; +use alloc::vec::Vec; use frame_support::{ pallet_prelude::ValueQuery, storage_alias, @@ -24,7 +25,6 @@ use frame_support::{ Twox64Concat, }; use sp_staking::offence::OnOffenceHandler; -use sp_std::vec::Vec; #[cfg(feature = "try-runtime")] use frame_support::ensure; @@ -49,7 +49,7 @@ pub mod v1 { use super::*; - pub struct MigrateToV1(sp_std::marker::PhantomData); + pub struct MigrateToV1(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { diff --git a/substrate/frame/paged-list/Cargo.toml b/substrate/frame/paged-list/Cargo.toml index f5a3a2e5bae..597bdd37f57 100644 --- a/substrate/frame/paged-list/Cargo.toml +++ b/substrate/frame/paged-list/Cargo.toml @@ -24,7 +24,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-metadata-ir = { optional = true, workspace = true } @@ -42,7 +41,6 @@ std = [ "sp-io/std", "sp-metadata-ir/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/paged-list/src/lib.rs b/substrate/frame/paged-list/src/lib.rs index ddeed174f34..ed68dac63be 100644 --- a/substrate/frame/paged-list/src/lib.rs +++ b/substrate/frame/paged-list/src/lib.rs @@ -58,7 +58,7 @@ //! //! ## Low Level / Implementation Details //! -//! Implementation details are documented in [`paged_list::StoragePagedList`]. +//! Implementation details are documented in [`paged_list::StoragePagedList`]. //! All storage entries are prefixed with a unique prefix that is generated by [`ListPrefix`]. #![cfg_attr(not(feature = "std"), no_std)] @@ -69,6 +69,8 @@ pub mod mock; mod paged_list; mod tests; +extern crate alloc; + use codec::FullCodec; use frame_support::{ pallet_prelude::StorageList, diff --git a/substrate/frame/paged-list/src/paged_list.rs b/substrate/frame/paged-list/src/paged_list.rs index eecc728cd62..bbd889e2521 100644 --- a/substrate/frame/paged-list/src/paged_list.rs +++ b/substrate/frame/paged-list/src/paged_list.rs @@ -23,6 +23,7 @@ #![deny(missing_docs)] #![deny(unsafe_code)] +use alloc::vec::Vec; use codec::{Decode, Encode, EncodeLike, FullCodec}; use core::marker::PhantomData; use frame_support::{ @@ -32,7 +33,6 @@ use frame_support::{ CloneNoBound, DebugNoBound, DefaultNoBound, EqNoBound, PartialEqNoBound, }; use sp_runtime::traits::Saturating; -use sp_std::prelude::*; pub type PageIndex = u32; pub type ValueIndex = u32; @@ -177,7 +177,7 @@ pub struct Page { /// The index of the page. index: PageIndex, /// The remaining values of the page, to be drained by [`Page::next`]. - values: sp_std::iter::Skip>, + values: core::iter::Skip>, } impl Page { @@ -188,7 +188,7 @@ impl Page { ) -> Option { let key = page_key::(index); let values = sp_io::storage::get(&key) - .and_then(|raw| sp_std::vec::Vec::::decode(&mut &raw[..]).ok())?; + .and_then(|raw| alloc::vec::Vec::::decode(&mut &raw[..]).ok())?; if values.is_empty() { // Don't create empty pages. return None diff --git a/substrate/frame/parameters/Cargo.toml b/substrate/frame/parameters/Cargo.toml index b993347d246..a97ba1172a5 100644 --- a/substrate/frame/parameters/Cargo.toml +++ b/substrate/frame/parameters/Cargo.toml @@ -18,7 +18,6 @@ frame-support = { features = ["experimental"], workspace = true } frame-system = { workspace = true } sp-core = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } frame-benchmarking = { optional = true, workspace = true } [dev-dependencies] @@ -38,7 +37,6 @@ std = [ "serde", "sp-core/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/preimage/Cargo.toml b/substrate/frame/preimage/Cargo.toml index ee572b189b2..425c4e81aa7 100644 --- a/substrate/frame/preimage/Cargo.toml +++ b/substrate/frame/preimage/Cargo.toml @@ -20,7 +20,6 @@ frame-system = { workspace = true } sp-core = { optional = true, workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } log = { workspace = true } [dev-dependencies] @@ -48,7 +47,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/preimage/src/benchmarking.rs b/substrate/frame/preimage/src/benchmarking.rs index f2b76a7999d..2d3bec16b81 100644 --- a/substrate/frame/preimage/src/benchmarking.rs +++ b/substrate/frame/preimage/src/benchmarking.rs @@ -18,11 +18,11 @@ //! Preimage pallet benchmarking. use super::*; +use alloc::vec; use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller, BenchmarkError}; use frame_support::assert_ok; use frame_system::RawOrigin; use sp_runtime::traits::Bounded; -use sp_std::{prelude::*, vec}; use crate::Pallet as Preimage; diff --git a/substrate/frame/preimage/src/lib.rs b/substrate/frame/preimage/src/lib.rs index dd323a12b8f..30056fc6d9a 100644 --- a/substrate/frame/preimage/src/lib.rs +++ b/substrate/frame/preimage/src/lib.rs @@ -37,11 +37,13 @@ mod mock; mod tests; pub mod weights; +extern crate alloc; + +use alloc::{borrow::Cow, vec::Vec}; use sp_runtime::{ traits::{BadOrigin, Hash, Saturating}, Perbill, }; -use sp_std::{borrow::Cow, prelude::*}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ diff --git a/substrate/frame/preimage/src/migration.rs b/substrate/frame/preimage/src/migration.rs index a86109f892a..e38483ee68c 100644 --- a/substrate/frame/preimage/src/migration.rs +++ b/substrate/frame/preimage/src/migration.rs @@ -18,11 +18,11 @@ //! Storage migrations for the preimage pallet. use super::*; +use alloc::collections::btree_map::BTreeMap; use frame_support::{ storage_alias, traits::{ConstU32, OnRuntimeUpgrade}, }; -use sp_std::collections::btree_map::BTreeMap; #[cfg(feature = "try-runtime")] use frame_support::ensure; @@ -79,7 +79,7 @@ pub mod v1 { /// /// Note: This needs to be run with the same hashing algorithm as before /// since it is not re-hashing the preimages. - pub struct Migration(sp_std::marker::PhantomData); + pub struct Migration(core::marker::PhantomData); impl OnRuntimeUpgrade for Migration { #[cfg(feature = "try-runtime")] diff --git a/substrate/frame/proxy/Cargo.toml b/substrate/frame/proxy/Cargo.toml index 6b4251e1bcc..af2427da380 100644 --- a/substrate/frame/proxy/Cargo.toml +++ b/substrate/frame/proxy/Cargo.toml @@ -23,7 +23,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -43,7 +42,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/proxy/src/benchmarking.rs b/substrate/frame/proxy/src/benchmarking.rs index e0d14163d21..4081af49c24 100644 --- a/substrate/frame/proxy/src/benchmarking.rs +++ b/substrate/frame/proxy/src/benchmarking.rs @@ -21,6 +21,7 @@ use super::*; use crate::Pallet as Proxy; +use alloc::{boxed::Box, vec}; use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller}; use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; use sp_runtime::traits::Bounded; diff --git a/substrate/frame/proxy/src/lib.rs b/substrate/frame/proxy/src/lib.rs index 2b3fac5f59e..d681088165c 100644 --- a/substrate/frame/proxy/src/lib.rs +++ b/substrate/frame/proxy/src/lib.rs @@ -33,6 +33,9 @@ mod benchmarking; mod tests; pub mod weights; +extern crate alloc; + +use alloc::{boxed::Box, vec}; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ dispatch::GetDispatchInfo, @@ -47,7 +50,6 @@ use sp_runtime::{ traits::{Dispatchable, Hash, Saturating, StaticLookup, TrailingZeroInput, Zero}, DispatchError, DispatchResult, RuntimeDebug, }; -use sp_std::prelude::*; pub use weights::WeightInfo; type CallHashOf = <::CallHasher as Hash>::Output; diff --git a/substrate/frame/proxy/src/tests.rs b/substrate/frame/proxy/src/tests.rs index 3ed61fbedaa..3edb96026a8 100644 --- a/substrate/frame/proxy/src/tests.rs +++ b/substrate/frame/proxy/src/tests.rs @@ -22,6 +22,7 @@ use super::*; use crate as proxy; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; use frame_support::{ assert_noop, assert_ok, derive_impl, diff --git a/substrate/frame/ranked-collective/Cargo.toml b/substrate/frame/ranked-collective/Cargo.toml index be48d5cad40..dd9b466e0f9 100644 --- a/substrate/frame/ranked-collective/Cargo.toml +++ b/substrate/frame/ranked-collective/Cargo.toml @@ -26,7 +26,6 @@ sp-arithmetic = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } impl-trait-for-tuples = { workspace = true } [features] @@ -42,7 +41,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/ranked-collective/src/benchmarking.rs b/substrate/frame/ranked-collective/src/benchmarking.rs index 462f55a238d..dc7f4aaca77 100644 --- a/substrate/frame/ranked-collective/src/benchmarking.rs +++ b/substrate/frame/ranked-collective/src/benchmarking.rs @@ -20,6 +20,7 @@ use super::*; #[allow(unused_imports)] use crate::Pallet as RankedCollective; +use alloc::vec::Vec; use frame_benchmarking::v1::{ account, benchmarks_instance_pallet, whitelisted_caller, BenchmarkError, diff --git a/substrate/frame/ranked-collective/src/lib.rs b/substrate/frame/ranked-collective/src/lib.rs index 53d5f0c6662..e34cf3d8df7 100644 --- a/substrate/frame/ranked-collective/src/lib.rs +++ b/substrate/frame/ranked-collective/src/lib.rs @@ -40,7 +40,10 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use codec::{Decode, Encode, MaxEncodedLen}; +use core::marker::PhantomData; use scale_info::TypeInfo; use sp_arithmetic::traits::Saturating; use sp_runtime::{ @@ -48,7 +51,6 @@ use sp_runtime::{ ArithmeticError::Overflow, DispatchError, Perbill, RuntimeDebug, }; -use sp_std::{marker::PhantomData, prelude::*}; use frame_support::{ dispatch::{DispatchResultWithPostInfo, PostDispatchInfo}, diff --git a/substrate/frame/recovery/Cargo.toml b/substrate/frame/recovery/Cargo.toml index 3b3a382fe6d..42493b43510 100644 --- a/substrate/frame/recovery/Cargo.toml +++ b/substrate/frame/recovery/Cargo.toml @@ -23,7 +23,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -49,7 +48,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/recovery/src/benchmarking.rs b/substrate/frame/recovery/src/benchmarking.rs index 72f77336212..b7639742a62 100644 --- a/substrate/frame/recovery/src/benchmarking.rs +++ b/substrate/frame/recovery/src/benchmarking.rs @@ -20,6 +20,7 @@ use super::*; use crate::Pallet; +use alloc::{boxed::Box, vec, vec::Vec}; use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller}; use frame_support::traits::{Currency, Get}; use frame_system::RawOrigin; diff --git a/substrate/frame/recovery/src/lib.rs b/substrate/frame/recovery/src/lib.rs index 5673147c8e0..69be4df971b 100644 --- a/substrate/frame/recovery/src/lib.rs +++ b/substrate/frame/recovery/src/lib.rs @@ -150,13 +150,15 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{boxed::Box, vec::Vec}; use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; use sp_runtime::{ traits::{CheckedAdd, CheckedMul, Dispatchable, SaturatedConversion, StaticLookup}, RuntimeDebug, }; -use sp_std::prelude::*; use frame_support::{ dispatch::{GetDispatchInfo, PostDispatchInfo}, diff --git a/substrate/frame/referenda/Cargo.toml b/substrate/frame/referenda/Cargo.toml index eb30fef7894..578486714d6 100644 --- a/substrate/frame/referenda/Cargo.toml +++ b/substrate/frame/referenda/Cargo.toml @@ -28,7 +28,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } log = { workspace = true } [dev-dependencies] @@ -55,7 +54,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "assert_matches", diff --git a/substrate/frame/referenda/src/benchmarking.rs b/substrate/frame/referenda/src/benchmarking.rs index 47d43cc0600..67ac82787d3 100644 --- a/substrate/frame/referenda/src/benchmarking.rs +++ b/substrate/frame/referenda/src/benchmarking.rs @@ -19,6 +19,7 @@ use super::*; use crate::Pallet as Referenda; +use alloc::{vec, vec::Vec}; use assert_matches::assert_matches; use frame_benchmarking::v1::{ account, benchmarks_instance_pallet, whitelist_account, BenchmarkError, @@ -632,7 +633,7 @@ benchmarks_instance_pallet! { } set_some_metadata { - use sp_std::borrow::Cow; + use alloc::borrow::Cow; let origin = T::SubmitOrigin::try_successful_origin(&RawOrigin::Root.into()) .expect("SubmitOrigin has no successful origin required for the benchmark"); let index = create_referendum::(origin.clone()); @@ -643,7 +644,7 @@ benchmarks_instance_pallet! { } clear_metadata { - use sp_std::borrow::Cow; + use alloc::borrow::Cow; let origin = T::SubmitOrigin::try_successful_origin(&RawOrigin::Root.into()) .expect("SubmitOrigin has no successful origin required for the benchmark"); let index = create_referendum::(origin.clone()); diff --git a/substrate/frame/referenda/src/lib.rs b/substrate/frame/referenda/src/lib.rs index 0cdf450d3b6..e72dd7f11cb 100644 --- a/substrate/frame/referenda/src/lib.rs +++ b/substrate/frame/referenda/src/lib.rs @@ -64,7 +64,11 @@ #![recursion_limit = "256"] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::boxed::Box; use codec::{Codec, Encode}; +use core::fmt::Debug; use frame_support::{ dispatch::DispatchResult, ensure, @@ -84,7 +88,6 @@ use sp_runtime::{ traits::{AtLeast32BitUnsigned, Bounded, Dispatchable, One, Saturating, Zero}, DispatchError, Perbill, }; -use sp_std::{fmt::Debug, prelude::*}; mod branch; pub mod migration; @@ -102,6 +105,7 @@ pub use self::{ }, weights::WeightInfo, }; +pub use alloc::vec::Vec; #[cfg(test)] mod mock; @@ -112,7 +116,6 @@ mod tests; pub mod benchmarking; pub use frame_support::traits::Get; -pub use sp_std::vec::Vec; #[macro_export] macro_rules! impl_tracksinfo_get { diff --git a/substrate/frame/referenda/src/types.rs b/substrate/frame/referenda/src/types.rs index b3c583322cc..1039b288b2a 100644 --- a/substrate/frame/referenda/src/types.rs +++ b/substrate/frame/referenda/src/types.rs @@ -515,7 +515,7 @@ impl Curve { #[cfg(feature = "std")] impl Debug for Curve { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { Self::LinearDecreasing { length, floor, ceil } => { write!( diff --git a/substrate/frame/remark/Cargo.toml b/substrate/frame/remark/Cargo.toml index 44cf5ebc3b4..efc9917428c 100644 --- a/substrate/frame/remark/Cargo.toml +++ b/substrate/frame/remark/Cargo.toml @@ -25,7 +25,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-core = { workspace = true } @@ -48,7 +47,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/remark/src/benchmarking.rs b/substrate/frame/remark/src/benchmarking.rs index 83194683496..15b72b4748d 100644 --- a/substrate/frame/remark/src/benchmarking.rs +++ b/substrate/frame/remark/src/benchmarking.rs @@ -20,9 +20,9 @@ #![cfg(feature = "runtime-benchmarks")] use super::*; +use alloc::vec; use frame_benchmarking::v1::{benchmarks, whitelisted_caller}; use frame_system::{EventRecord, Pallet as System, RawOrigin}; -use sp_std::*; #[cfg(test)] use crate::Pallet as Remark; diff --git a/substrate/frame/remark/src/lib.rs b/substrate/frame/remark/src/lib.rs index 8ca3cd395af..eae8e0b83f5 100644 --- a/substrate/frame/remark/src/lib.rs +++ b/substrate/frame/remark/src/lib.rs @@ -28,7 +28,9 @@ mod mock; #[cfg(test)] mod tests; -use sp_std::prelude::*; +extern crate alloc; + +use alloc::vec::Vec; // Re-export pallet items so that they can be accessed from the crate namespace. pub use pallet::*; diff --git a/substrate/frame/root-offences/src/mock.rs b/substrate/frame/root-offences/src/mock.rs index 3c758b91d52..ab43b723e8a 100644 --- a/substrate/frame/root-offences/src/mock.rs +++ b/substrate/frame/root-offences/src/mock.rs @@ -18,6 +18,7 @@ use super::*; use crate as root_offences; +use alloc::collections::btree_map::BTreeMap; use frame_election_provider_support::{ bounds::{ElectionBounds, ElectionBoundsBuilder}, onchain, SequentialPhragmen, @@ -29,7 +30,6 @@ use frame_support::{ use pallet_staking::StakerStatus; use sp_runtime::{curve::PiecewiseLinear, testing::UintAuthorityId, traits::Zero, BuildStorage}; use sp_staking::{EraIndex, SessionIndex}; -use sp_std::collections::btree_map::BTreeMap; type Block = frame_system::mocking::MockBlock; type AccountId = u64; diff --git a/substrate/frame/root-testing/Cargo.toml b/substrate/frame/root-testing/Cargo.toml index 38d91c8104b..96d86136262 100644 --- a/substrate/frame/root-testing/Cargo.toml +++ b/substrate/frame/root-testing/Cargo.toml @@ -23,7 +23,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [features] try-runtime = [ @@ -40,5 +39,4 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] diff --git a/substrate/frame/safe-mode/Cargo.toml b/substrate/frame/safe-mode/Cargo.toml index 749c4bcdc70..b704818f1ad 100644 --- a/substrate/frame/safe-mode/Cargo.toml +++ b/substrate/frame/safe-mode/Cargo.toml @@ -23,7 +23,6 @@ frame-system = { workspace = true } scale-info = { features = ["derive"], workspace = true } sp-arithmetic = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } pallet-balances = { optional = true, workspace = true } pallet-utility = { optional = true, workspace = true } pallet-proxy = { optional = true, workspace = true } @@ -51,7 +50,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/salary/Cargo.toml b/substrate/frame/salary/Cargo.toml index c9b72da2e64..9121f59ff46 100644 --- a/substrate/frame/salary/Cargo.toml +++ b/substrate/frame/salary/Cargo.toml @@ -26,7 +26,6 @@ sp-arithmetic = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } pallet-ranked-collective = { optional = true, workspace = true } [features] @@ -44,7 +43,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/sassafras/Cargo.toml b/substrate/frame/sassafras/Cargo.toml index ecd03c47db6..0eefca57849 100644 --- a/substrate/frame/sassafras/Cargo.toml +++ b/substrate/frame/sassafras/Cargo.toml @@ -26,7 +26,6 @@ log = { workspace = true } sp-consensus-sassafras = { features = ["serde"], workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] array-bytes = { workspace = true, default-features = true } @@ -45,7 +44,6 @@ std = [ "sp-consensus-sassafras/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/sassafras/src/lib.rs b/substrate/frame/sassafras/src/lib.rs index d521ed9dd91..285758afbe6 100644 --- a/substrate/frame/sassafras/src/lib.rs +++ b/substrate/frame/sassafras/src/lib.rs @@ -47,10 +47,13 @@ #![warn(unused_must_use, unsafe_code, unused_variables, unused_imports, missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use codec::{Decode, Encode, MaxEncodedLen}; use log::{debug, error, trace, warn}; use scale_info::TypeInfo; +use alloc::vec::Vec; use frame_support::{ dispatch::{DispatchResultWithPostInfo, Pays}, traits::{Defensive, Get}, @@ -72,7 +75,6 @@ use sp_runtime::{ traits::{One, Zero}, BoundToRuntimeAppPublic, }; -use sp_std::prelude::Vec; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; @@ -288,7 +290,7 @@ pub mod pallet { pub epoch_config: EpochConfiguration, /// Phantom config #[serde(skip)] - pub _phantom: sp_std::marker::PhantomData, + pub _phantom: core::marker::PhantomData, } #[pallet::genesis_build] diff --git a/substrate/frame/scheduler/Cargo.toml b/substrate/frame/scheduler/Cargo.toml index 0a6b646fc8c..29aaaec9aa4 100644 --- a/substrate/frame/scheduler/Cargo.toml +++ b/substrate/frame/scheduler/Cargo.toml @@ -21,7 +21,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-weights = { workspace = true } docify = { workspace = true } @@ -51,7 +50,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-weights/std", ] try-runtime = [ diff --git a/substrate/frame/scheduler/src/benchmarking.rs b/substrate/frame/scheduler/src/benchmarking.rs index 884f7800038..d0a14fc73d6 100644 --- a/substrate/frame/scheduler/src/benchmarking.rs +++ b/substrate/frame/scheduler/src/benchmarking.rs @@ -18,6 +18,7 @@ //! Scheduler pallet benchmarking. use super::*; +use alloc::vec; use frame_benchmarking::v1::{account, benchmarks, BenchmarkError}; use frame_support::{ ensure, @@ -25,7 +26,6 @@ use frame_support::{ weights::WeightMeter, }; use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; -use sp_std::{prelude::*, vec}; use crate::Pallet as Scheduler; use frame_system::{Call as SystemCall, EventRecord}; diff --git a/substrate/frame/scheduler/src/lib.rs b/substrate/frame/scheduler/src/lib.rs index d19a1e0001d..3eecf6d6f9e 100644 --- a/substrate/frame/scheduler/src/lib.rs +++ b/substrate/frame/scheduler/src/lib.rs @@ -85,7 +85,11 @@ mod mock; mod tests; pub mod weights; +extern crate alloc; + +use alloc::{boxed::Box, vec::Vec}; use codec::{Decode, Encode, MaxEncodedLen}; +use core::{borrow::Borrow, cmp::Ordering, marker::PhantomData}; use frame_support::{ dispatch::{DispatchResult, GetDispatchInfo, Parameter, RawOrigin}, ensure, @@ -106,7 +110,6 @@ use sp_runtime::{ traits::{BadOrigin, Dispatchable, One, Saturating, Zero}, BoundedVec, DispatchError, RuntimeDebug, }; -use sp_std::{borrow::Borrow, cmp::Ordering, marker::PhantomData, prelude::*}; pub use pallet::*; pub use weights::WeightInfo; diff --git a/substrate/frame/scheduler/src/migration.rs b/substrate/frame/scheduler/src/migration.rs index c2e956035a7..a304689a120 100644 --- a/substrate/frame/scheduler/src/migration.rs +++ b/substrate/frame/scheduler/src/migration.rs @@ -305,8 +305,8 @@ pub mod v4 { mod test { use super::*; use crate::mock::*; + use alloc::borrow::Cow; use frame_support::Hashable; - use sp_std::borrow::Cow; use substrate_test_utils::assert_eq_uvec; #[test] diff --git a/substrate/frame/scored-pool/Cargo.toml b/substrate/frame/scored-pool/Cargo.toml index 69ecd527eb7..132799ead62 100644 --- a/substrate/frame/scored-pool/Cargo.toml +++ b/substrate/frame/scored-pool/Cargo.toml @@ -22,7 +22,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -39,7 +38,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/scored-pool/src/lib.rs b/substrate/frame/scored-pool/src/lib.rs index 2bf70cbc574..c4464bbbfac 100644 --- a/substrate/frame/scored-pool/src/lib.rs +++ b/substrate/frame/scored-pool/src/lib.rs @@ -98,7 +98,11 @@ mod mock; #[cfg(test)] mod tests; +extern crate alloc; + +use alloc::vec::Vec; use codec::{FullCodec, MaxEncodedLen}; +use core::{cmp::Reverse, fmt::Debug}; use frame_support::{ ensure, traits::{ChangeMembers, Currency, Get, InitializeMembers, ReservableCurrency}, @@ -106,7 +110,6 @@ use frame_support::{ }; pub use pallet::*; use sp_runtime::traits::{AtLeast32Bit, StaticLookup, Zero}; -use sp_std::{fmt::Debug, prelude::*}; type BalanceOf = <>::Currency as Currency<::AccountId>>::Balance; diff --git a/substrate/frame/session/Cargo.toml b/substrate/frame/session/Cargo.toml index c7b499548bd..09bb93d8c1d 100644 --- a/substrate/frame/session/Cargo.toml +++ b/substrate/frame/session/Cargo.toml @@ -28,7 +28,6 @@ sp-io = { workspace = true } sp-runtime = { features = ["serde"], workspace = true } sp-session = { workspace = true } sp-staking = { features = ["serde"], workspace = true } -sp-std = { workspace = true } sp-trie = { optional = true, workspace = true } sp-state-machine = { workspace = true } @@ -48,7 +47,6 @@ std = [ "sp-session/std", "sp-staking/std", "sp-state-machine/std", - "sp-std/std", "sp-trie/std", ] try-runtime = [ diff --git a/substrate/frame/session/benchmarking/Cargo.toml b/substrate/frame/session/benchmarking/Cargo.toml index ba7f7acfd99..9ca3549f681 100644 --- a/substrate/frame/session/benchmarking/Cargo.toml +++ b/substrate/frame/session/benchmarking/Cargo.toml @@ -25,7 +25,6 @@ pallet-session = { workspace = true } pallet-staking = { workspace = true } sp-runtime = { workspace = true } sp-session = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] codec = { features = ["derive"], workspace = true, default-features = true } @@ -53,7 +52,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-session/std", - "sp-std/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/session/benchmarking/src/inner.rs b/substrate/frame/session/benchmarking/src/inner.rs index d86c5d9ad27..f08e10f0786 100644 --- a/substrate/frame/session/benchmarking/src/inner.rs +++ b/substrate/frame/session/benchmarking/src/inner.rs @@ -18,8 +18,8 @@ //! Benchmarks for the Session Pallet. // This is separated into its own crate due to cyclic dependency issues. +use alloc::{vec, vec::Vec}; use sp_runtime::traits::{One, StaticLookup, TrailingZeroInput}; -use sp_std::{prelude::*, vec}; use codec::Decode; use frame_benchmarking::v1::benchmarks; diff --git a/substrate/frame/session/benchmarking/src/lib.rs b/substrate/frame/session/benchmarking/src/lib.rs index b08955a1332..f696546d1f0 100644 --- a/substrate/frame/session/benchmarking/src/lib.rs +++ b/substrate/frame/session/benchmarking/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "runtime-benchmarks")] pub mod inner; diff --git a/substrate/frame/session/src/historical/mod.rs b/substrate/frame/session/src/historical/mod.rs index 618497e3d54..fac580b49b3 100644 --- a/substrate/frame/session/src/historical/mod.rs +++ b/substrate/frame/session/src/historical/mod.rs @@ -30,14 +30,15 @@ pub mod offchain; pub mod onchain; mod shared; +use alloc::vec::Vec; use codec::{Decode, Encode}; +use core::fmt::Debug; use sp_runtime::{ traits::{Convert, OpaqueKeys}, KeyTypeId, }; use sp_session::{MembershipProof, ValidatorCount}; use sp_staking::SessionIndex; -use sp_std::{fmt::Debug, prelude::*}; use sp_trie::{ trie_types::{TrieDBBuilder, TrieDBMutBuilderV0}, LayoutV0, MemoryDB, Recorder, StorageProof, Trie, TrieMut, TrieRecorder, @@ -103,7 +104,7 @@ impl Pallet { None => return, // nothing to prune. }; - let up_to = sp_std::cmp::min(up_to, end); + let up_to = core::cmp::min(up_to, end); if up_to < start { return // out of bounds. harmless. @@ -168,7 +169,7 @@ pub trait SessionManager: /// An `SessionManager` implementation that wraps an inner `I` and also /// sets the historical trie root of the ending session. -pub struct NoteHistoricalRoot(sp_std::marker::PhantomData<(T, I)>); +pub struct NoteHistoricalRoot(core::marker::PhantomData<(T, I)>); impl> NoteHistoricalRoot { fn do_new_session(new_index: SessionIndex, is_genesis: bool) -> Option> { @@ -374,6 +375,7 @@ pub(crate) mod tests { use crate::mock::{ force_new_session, set_next_validators, NextValidators, Session, System, Test, }; + use alloc::vec; use sp_runtime::{key_types::DUMMY, testing::UintAuthorityId, BuildStorage}; use sp_state_machine::BasicExternalities; diff --git a/substrate/frame/session/src/historical/offchain.rs b/substrate/frame/session/src/historical/offchain.rs index 95f4d762949..685a0be8e19 100644 --- a/substrate/frame/session/src/historical/offchain.rs +++ b/substrate/frame/session/src/historical/offchain.rs @@ -23,12 +23,12 @@ //! required data to the offchain validator set. This is used in conjunction with [`ProvingTrie`] //! and the off-chain indexing API. +use alloc::vec::Vec; use sp_runtime::{ offchain::storage::{MutateStorageError, StorageRetrievalError, StorageValueRef}, KeyTypeId, }; use sp_session::MembershipProof; -use sp_std::prelude::*; use super::{shared, Config, IdentificationTuple, ProvingTrie}; use crate::{Pallet as SessionModule, SessionIndex}; @@ -60,9 +60,9 @@ impl ValidatorSet { /// Implement conversion into iterator for usage /// with [ProvingTrie](super::ProvingTrie::generate_for). -impl sp_std::iter::IntoIterator for ValidatorSet { +impl core::iter::IntoIterator for ValidatorSet { type Item = (T::ValidatorId, T::FullIdentification); - type IntoIter = sp_std::vec::IntoIter; + type IntoIter = alloc::vec::IntoIter; fn into_iter(self) -> Self::IntoIter { self.validator_set.into_iter() } diff --git a/substrate/frame/session/src/historical/onchain.rs b/substrate/frame/session/src/historical/onchain.rs index 97a7f02bd09..a9eb18474b8 100644 --- a/substrate/frame/session/src/historical/onchain.rs +++ b/substrate/frame/session/src/historical/onchain.rs @@ -17,9 +17,9 @@ //! On-chain logic to store a validator-set for deferred validation using an off-chain worker. +use alloc::vec::Vec; use codec::Encode; use sp_runtime::traits::Convert; -use sp_std::prelude::*; use super::{shared, Config as HistoricalConfig}; use crate::{Config as SessionConfig, Pallet as SessionModule, SessionIndex}; diff --git a/substrate/frame/session/src/historical/shared.rs b/substrate/frame/session/src/historical/shared.rs index 297385dfb42..06b25ec99a4 100644 --- a/substrate/frame/session/src/historical/shared.rs +++ b/substrate/frame/session/src/historical/shared.rs @@ -18,9 +18,9 @@ //! Shared logic between on-chain and off-chain components used for slashing using an off-chain //! worker. +use alloc::{borrow::ToOwned, vec::Vec}; use codec::Encode; use sp_staking::SessionIndex; -use sp_std::prelude::*; pub(super) const PREFIX: &[u8] = b"session_historical"; pub(super) const LAST_PRUNE: &[u8] = b"session_historical_last_prune"; diff --git a/substrate/frame/session/src/lib.rs b/substrate/frame/session/src/lib.rs index 9506e98adf7..45f70dfa258 100644 --- a/substrate/frame/session/src/lib.rs +++ b/substrate/frame/session/src/lib.rs @@ -115,7 +115,14 @@ mod mock; mod tests; pub mod weights; +extern crate alloc; + +use alloc::{boxed::Box, vec::Vec}; use codec::{Decode, MaxEncodedLen}; +use core::{ + marker::PhantomData, + ops::{Rem, Sub}, +}; use frame_support::{ dispatch::DispatchResult, ensure, @@ -132,11 +139,6 @@ use sp_runtime::{ ConsensusEngineId, DispatchError, KeyTypeId, Permill, RuntimeAppPublic, }; use sp_staking::SessionIndex; -use sp_std::{ - marker::PhantomData, - ops::{Rem, Sub}, - prelude::*, -}; pub use pallet::*; pub use weights::WeightInfo; @@ -917,7 +919,7 @@ impl frame_support::traits::DisabledValidators for Pallet { /// Wraps the author-scraping logic for consensus engines that can recover /// the canonical index of an author. This then transforms it into the /// registering account-ID of that session key index. -pub struct FindAccountFromAuthorIndex(sp_std::marker::PhantomData<(T, Inner)>); +pub struct FindAccountFromAuthorIndex(core::marker::PhantomData<(T, Inner)>); impl> FindAuthor for FindAccountFromAuthorIndex diff --git a/substrate/frame/society/Cargo.toml b/substrate/frame/society/Cargo.toml index 6582d47f194..b6fa70c42ef 100644 --- a/substrate/frame/society/Cargo.toml +++ b/substrate/frame/society/Cargo.toml @@ -21,7 +21,6 @@ rand_chacha = { workspace = true } scale-info = { features = ["derive"], workspace = true } codec = { features = ["derive"], workspace = true } -sp-std = { workspace = true } sp-io = { workspace = true } sp-arithmetic = { workspace = true } sp-runtime = { workspace = true } @@ -52,7 +51,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking", diff --git a/substrate/frame/society/src/benchmarking.rs b/substrate/frame/society/src/benchmarking.rs index 20af6e35ada..8c3d2bf32ce 100644 --- a/substrate/frame/society/src/benchmarking.rs +++ b/substrate/frame/society/src/benchmarking.rs @@ -24,6 +24,7 @@ use super::*; use frame_benchmarking::{account, benchmarks_instance_pallet, whitelisted_caller}; use frame_system::RawOrigin; +use alloc::vec; use sp_runtime::traits::Bounded; use crate::Pallet as Society; diff --git a/substrate/frame/society/src/lib.rs b/substrate/frame/society/src/lib.rs index 5bce245f73f..b4c5c88af3d 100644 --- a/substrate/frame/society/src/lib.rs +++ b/substrate/frame/society/src/lib.rs @@ -257,6 +257,9 @@ pub mod weights; pub mod migrations; +extern crate alloc; + +use alloc::vec::Vec; use frame_support::{ impl_ensure_origin_with_arg_ignoring_arg, pallet_prelude::*, @@ -282,7 +285,6 @@ use sp_runtime::{ ArithmeticError::Overflow, Percent, RuntimeDebug, }; -use sp_std::prelude::*; pub use weights::WeightInfo; @@ -1362,7 +1364,7 @@ pub mod pallet { } /// Simple ensure origin struct to filter for the founder account. -pub struct EnsureFounder(sp_std::marker::PhantomData); +pub struct EnsureFounder(core::marker::PhantomData); impl EnsureOrigin<::RuntimeOrigin> for EnsureFounder { type Success = T::AccountId; fn try_origin(o: T::RuntimeOrigin) -> Result { diff --git a/substrate/frame/society/src/migrations.rs b/substrate/frame/society/src/migrations.rs index 7ded1f84f58..396ed787c78 100644 --- a/substrate/frame/society/src/migrations.rs +++ b/substrate/frame/society/src/migrations.rs @@ -18,6 +18,7 @@ //! # Migrations for Society Pallet use super::*; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; use frame_support::traits::{Defensive, DefensiveOption, Instance, UncheckedOnRuntimeUpgrade}; diff --git a/substrate/frame/src/lib.rs b/substrate/frame/src/lib.rs index e09d8fc4fa1..3836e71cb00 100644 --- a/substrate/frame/src/lib.rs +++ b/substrate/frame/src/lib.rs @@ -132,10 +132,6 @@ pub mod prelude { #[doc(no_inline)] pub use frame_system::pallet_prelude::*; - /// All of the std alternative types. - #[doc(no_inline)] - pub use sp_std::prelude::*; - /// All FRAME-relevant derive macros. #[doc(no_inline)] pub use super::derive::*; @@ -164,7 +160,6 @@ pub mod testing_prelude { pub use frame_system::{self, mocking::*}; pub use sp_io::TestExternalities as TestState; - pub use sp_std::if_std; } /// All of the types and tools needed to build FRAME-based runtimes. @@ -347,13 +342,13 @@ pub mod primitives { /// This is already part of the [`prelude`]. pub mod derive { pub use codec::{Decode, Encode}; + pub use core::fmt::Debug; pub use frame_support::{ CloneNoBound, DebugNoBound, DefaultNoBound, EqNoBound, OrdNoBound, PartialEqNoBound, PartialOrdNoBound, RuntimeDebugNoBound, }; pub use scale_info::TypeInfo; pub use sp_runtime::RuntimeDebug; - pub use sp_std::fmt::Debug; } /// Access to all of the dependencies of this crate. In case the re-exports are not enough, this @@ -373,7 +368,6 @@ pub mod deps { pub use sp_core; pub use sp_io; pub use sp_runtime; - pub use sp_std; pub use codec; pub use scale_info; diff --git a/substrate/frame/staking/Cargo.toml b/substrate/frame/staking/Cargo.toml index afae4652a4e..57eeec54363 100644 --- a/substrate/frame/staking/Cargo.toml +++ b/substrate/frame/staking/Cargo.toml @@ -24,7 +24,6 @@ scale-info = { features = ["derive", "serde"], workspace = true } sp-io = { workspace = true } sp-runtime = { features = ["serde"], workspace = true } sp-staking = { features = ["serde"], workspace = true } -sp-std = { workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } pallet-session = { features = [ @@ -74,7 +73,6 @@ std = [ "sp-npos-elections/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", "sp-tracing/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/staking/src/benchmarking.rs b/substrate/frame/staking/src/benchmarking.rs index 3ed33ffea42..1f8580d7a3e 100644 --- a/substrate/frame/staking/src/benchmarking.rs +++ b/substrate/frame/staking/src/benchmarking.rs @@ -33,7 +33,6 @@ use sp_runtime::{ Perbill, Percent, Saturating, }; use sp_staking::{currency_to_vote::CurrencyToVote, SessionIndex}; -use sp_std::prelude::*; pub use frame_benchmarking::v1::{ account, benchmarks, impl_benchmark_test_suite, whitelist_account, whitelisted_caller, @@ -169,7 +168,7 @@ impl ListScenario { // burn the entire issuance. let i = T::Currency::burn(T::Currency::total_issuance()); - sp_std::mem::forget(i); + core::mem::forget(i); // create accounts with the origin weight diff --git a/substrate/frame/staking/src/ledger.rs b/substrate/frame/staking/src/ledger.rs index 294918376d8..dc4b4fc326b 100644 --- a/substrate/frame/staking/src/ledger.rs +++ b/substrate/frame/staking/src/ledger.rs @@ -36,7 +36,6 @@ use frame_support::{ traits::{Defensive, LockableCurrency}, }; use sp_staking::{StakingAccount, StakingInterface}; -use sp_std::prelude::*; use crate::{ BalanceOf, Bonded, Config, Error, Ledger, Pallet, Payee, RewardDestination, StakingLedger, diff --git a/substrate/frame/staking/src/lib.rs b/substrate/frame/staking/src/lib.rs index 053ecdef2b0..9e59cbd3d0c 100644 --- a/substrate/frame/staking/src/lib.rs +++ b/substrate/frame/staking/src/lib.rs @@ -304,6 +304,9 @@ pub mod weights; mod pallet; +extern crate alloc; + +use alloc::{collections::btree_map::BTreeMap, vec, vec::Vec}; use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; use frame_support::{ defensive, defensive_assert, @@ -325,7 +328,6 @@ use sp_staking::{ StakingAccount, }; pub use sp_staking::{Exposure, IndividualExposure, StakerStatus}; -use sp_std::{collections::btree_map::BTreeMap, prelude::*}; pub use weights::WeightInfo; pub use pallet::{pallet::*, UseNominatorsAndValidatorsMap, UseValidatorsMap}; @@ -674,7 +676,7 @@ impl StakingLedger { // slightly under-slashed, by at most `MaxUnlockingChunks * ED`, which is not a big // deal. slash_from_target = - sp_std::mem::replace(target, Zero::zero()).saturating_add(slash_from_target) + core::mem::replace(target, Zero::zero()).saturating_add(slash_from_target) } self.total = self.total.saturating_sub(slash_from_target); @@ -916,7 +918,7 @@ impl EraPayout for () { /// Adaptor to turn a `PiecewiseLinear` curve definition into an `EraPayout` impl, used for /// backwards compatibility. -pub struct ConvertCurve(sp_std::marker::PhantomData); +pub struct ConvertCurve(core::marker::PhantomData); impl EraPayout for ConvertCurve where Balance: AtLeast32BitUnsigned + Clone + Copy, @@ -974,7 +976,7 @@ impl Default for Forcing { /// A `Convert` implementation that finds the stash of the given controller account, /// if any. -pub struct StashOf(sp_std::marker::PhantomData); +pub struct StashOf(core::marker::PhantomData); impl Convert> for StashOf { fn convert(controller: T::AccountId) -> Option { @@ -987,7 +989,7 @@ impl Convert> for StashOf { /// /// Active exposure is the exposure of the validator set currently validating, i.e. in /// `active_era`. It can differ from the latest planned exposure in `current_era`. -pub struct ExposureOf(sp_std::marker::PhantomData); +pub struct ExposureOf(core::marker::PhantomData); impl Convert>>> for ExposureOf @@ -1000,7 +1002,7 @@ impl Convert /// Filter historical offences out and only allow those from the bonding period. pub struct FilterHistoricalOffences { - _inner: sp_std::marker::PhantomData<(T, R)>, + _inner: core::marker::PhantomData<(T, R)>, } impl ReportOffence @@ -1033,7 +1035,7 @@ where /// Wrapper struct for Era related information. It is not a pure encapsulation as these storage /// items can be accessed directly but nevertheless, its recommended to use `EraInfo` where we /// can and add more functions to it as needed. -pub struct EraInfo(sp_std::marker::PhantomData); +pub struct EraInfo(core::marker::PhantomData); impl EraInfo { /// Returns true if validator has one or more page of era rewards not claimed yet. // Also looks at legacy storage that can be cleaned up after #433. diff --git a/substrate/frame/staking/src/migrations.rs b/substrate/frame/staking/src/migrations.rs index b2ddf77004f..5c9cf861321 100644 --- a/substrate/frame/staking/src/migrations.rs +++ b/substrate/frame/staking/src/migrations.rs @@ -67,7 +67,7 @@ pub mod v15 { // The disabling strategy used by staking pallet type DefaultDisablingStrategy = UpToLimitDisablingStrategy; - pub struct VersionUncheckedMigrateV14ToV15(sp_std::marker::PhantomData); + pub struct VersionUncheckedMigrateV14ToV15(core::marker::PhantomData); impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateV14ToV15 { fn on_runtime_upgrade() -> Weight { let mut migrated = v14::OffendingValidators::::take() @@ -382,14 +382,14 @@ pub mod v10 { pub mod v9 { use super::*; #[cfg(feature = "try-runtime")] - use codec::{Decode, Encode}; + use alloc::vec::Vec; #[cfg(feature = "try-runtime")] - use sp_std::vec::Vec; + use codec::{Decode, Encode}; /// Migration implementation that injects all validators into sorted list. /// /// This is only useful for chains that started their `VoterList` just based on nominators. - pub struct InjectValidatorsIntoVoterList(sp_std::marker::PhantomData); + pub struct InjectValidatorsIntoVoterList(core::marker::PhantomData); impl OnRuntimeUpgrade for InjectValidatorsIntoVoterList { fn on_runtime_upgrade() -> Weight { if StorageVersion::::get() == ObsoleteReleases::V8_0_0 { diff --git a/substrate/frame/staking/src/pallet/impls.rs b/substrate/frame/staking/src/pallet/impls.rs index 90374451a3a..b19a127d13c 100644 --- a/substrate/frame/staking/src/pallet/impls.rs +++ b/substrate/frame/staking/src/pallet/impls.rs @@ -48,7 +48,6 @@ use sp_staking::{ StakingAccount::{self, Controller, Stash}, StakingInterface, }; -use sp_std::prelude::*; use crate::{ election_size_tracker::StaticTracker, log, slashing, weights::WeightInfo, ActiveEraInfo, @@ -56,6 +55,7 @@ use crate::{ LedgerIntegrityState, MaxNominationsOf, MaxWinnersOf, Nominations, NominationsQuota, PositiveImbalanceOf, RewardDestination, SessionInterface, StakingLedger, ValidatorPrefs, }; +use alloc::{boxed::Box, vec, vec::Vec}; use super::pallet::*; @@ -1584,14 +1584,14 @@ impl ScoreProvider for Pallet { let imbalance = T::Currency::burn(T::Currency::total_issuance()); // kinda ugly, but gets the job done. The fact that this works here is a HUGE exception. // Don't try this pattern in other places. - sp_std::mem::forget(imbalance); + core::mem::forget(imbalance); } } /// A simple sorted list implementation that does not require any additional pallets. Note, this /// does not provide validators in sorted order. If you desire nominators in a sorted order take /// a look at [`pallet-bags-list`]. -pub struct UseValidatorsMap(sp_std::marker::PhantomData); +pub struct UseValidatorsMap(core::marker::PhantomData); impl SortedListProvider for UseValidatorsMap { type Score = BalanceOf; type Error = (); @@ -1657,7 +1657,7 @@ impl SortedListProvider for UseValidatorsMap { /// A simple voter list implementation that does not require any additional pallets. Note, this /// does not provided nominators in sorted ordered. If you desire nominators in a sorted order take /// a look at [`pallet-bags-list]. -pub struct UseNominatorsAndValidatorsMap(sp_std::marker::PhantomData); +pub struct UseNominatorsAndValidatorsMap(core::marker::PhantomData); impl SortedListProvider for UseNominatorsAndValidatorsMap { type Error = (); type Score = VoteWeight; @@ -1995,7 +1995,7 @@ impl Pallet { /// is resolved, turn warns into check /// failures. fn check_bonded_consistency() -> Result<(), TryRuntimeError> { - use sp_std::collections::btree_set::BTreeSet; + use alloc::collections::btree_set::BTreeSet; let mut count_controller_double = 0; let mut count_double = 0; @@ -2159,8 +2159,8 @@ impl Pallet { /// = exposure.own + exposure.own). /// * Paged exposures metadata (`ErasStakersOverview`) matches the paged exposures state. fn check_paged_exposures() -> Result<(), TryRuntimeError> { + use alloc::collections::btree_map::BTreeMap; use sp_staking::PagedExposureMetadata; - use sp_std::collections::btree_map::BTreeMap; // Sanity check for the paged exposure of the active era. let mut exposures: BTreeMap>> = diff --git a/substrate/frame/staking/src/pallet/mod.rs b/substrate/frame/staking/src/pallet/mod.rs index a76e47edf38..79f9d298ada 100644 --- a/substrate/frame/staking/src/pallet/mod.rs +++ b/substrate/frame/staking/src/pallet/mod.rs @@ -17,6 +17,7 @@ //! Staking FRAME Pallet. +use alloc::vec::Vec; use codec::Codec; use frame_election_provider_support::{ ElectionProvider, ElectionProviderBase, SortedListProvider, VoteWeight, @@ -41,7 +42,6 @@ use sp_staking::{ StakingAccount::{self, Controller, Stash}, StakingInterface, }; -use sp_std::prelude::*; mod impls; @@ -101,7 +101,7 @@ pub mod pallet { + codec::FullCodec + Copy + MaybeSerializeDeserialize - + sp_std::fmt::Debug + + core::fmt::Debug + Default + From + TypeInfo diff --git a/substrate/frame/staking/src/slashing.rs b/substrate/frame/staking/src/slashing.rs index 1fe608cd335..9bc8197c50b 100644 --- a/substrate/frame/staking/src/slashing.rs +++ b/substrate/frame/staking/src/slashing.rs @@ -54,6 +54,7 @@ use crate::{ NominatorSlashInEra, Pallet, Perbill, SessionInterface, SpanSlash, UnappliedSlash, ValidatorSlashInEra, }; +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ ensure, @@ -65,7 +66,6 @@ use sp_runtime::{ DispatchResult, RuntimeDebug, }; use sp_staking::{EraIndex, StakingInterface}; -use sp_std::vec::Vec; /// The proportion of the slashing reward to be paid out on the first slashing detection. /// This is f_1 in the paper. @@ -148,7 +148,7 @@ impl SlashingSpans { SlashingSpan { index, start, length: Some(length) } }); - sp_std::iter::once(last).chain(prior) + core::iter::once(last).chain(prior) } /// Yields the era index where the most recent non-zero slash occurred. @@ -182,7 +182,7 @@ impl SlashingSpans { }; // readjust the ongoing span, if it started before the beginning of the window. - self.last_start = sp_std::cmp::max(self.last_start, window_start); + self.last_start = core::cmp::max(self.last_start, window_start); pruned } } @@ -408,7 +408,7 @@ struct InspectingSpans<'a, T: Config + 'a> { paid_out: &'a mut BalanceOf, slash_of: &'a mut BalanceOf, reward_proportion: Perbill, - _marker: sp_std::marker::PhantomData, + _marker: core::marker::PhantomData, } // fetches the slashing spans record for a stash account, initializing it if necessary. @@ -433,7 +433,7 @@ fn fetch_spans<'a, T: Config + 'a>( slash_of, paid_out, reward_proportion, - _marker: sp_std::marker::PhantomData, + _marker: core::marker::PhantomData, } } @@ -451,7 +451,7 @@ impl<'a, T: 'a + Config> InspectingSpans<'a, T> { // although `amount` may be zero, as it is only a difference. fn add_slash(&mut self, amount: BalanceOf, slash_era: EraIndex) { *self.slash_of += amount; - self.spans.last_nonzero_slash = sp_std::cmp::max(self.spans.last_nonzero_slash, slash_era); + self.spans.last_nonzero_slash = core::cmp::max(self.spans.last_nonzero_slash, slash_era); } // find the span index of the given era, if covered. diff --git a/substrate/frame/staking/src/testing_utils.rs b/substrate/frame/staking/src/testing_utils.rs index d4938ea43eb..65aaa5f09de 100644 --- a/substrate/frame/staking/src/testing_utils.rs +++ b/substrate/frame/staking/src/testing_utils.rs @@ -30,7 +30,6 @@ use sp_io::hashing::blake2_256; use frame_election_provider_support::SortedListProvider; use frame_support::{pallet_prelude::*, traits::Currency}; use sp_runtime::{traits::StaticLookup, Perbill}; -use sp_std::prelude::*; const SEED: u32 = 0; diff --git a/substrate/frame/staking/src/tests.rs b/substrate/frame/staking/src/tests.rs index 825b03b8eca..c35e5e8a06c 100644 --- a/substrate/frame/staking/src/tests.rs +++ b/substrate/frame/staking/src/tests.rs @@ -41,7 +41,6 @@ use sp_staking::{ offence::{OffenceDetails, OnOffenceHandler}, SessionIndex, }; -use sp_std::prelude::*; use substrate_test_utils::assert_eq_uvec; #[test] diff --git a/substrate/frame/state-trie-migration/Cargo.toml b/substrate/frame/state-trie-migration/Cargo.toml index 8bb4079715e..db8d10dabfd 100644 --- a/substrate/frame/state-trie-migration/Cargo.toml +++ b/substrate/frame/state-trie-migration/Cargo.toml @@ -28,7 +28,6 @@ remote-externalities = { optional = true, workspace = true, default-features = t sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } substrate-state-trie-migration-rpc = { optional = true, workspace = true, default-features = true } [dev-dependencies] @@ -50,7 +49,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-tracing/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/state-trie-migration/src/lib.rs b/substrate/frame/state-trie-migration/src/lib.rs index 22ad640d3bd..3fe5abb8103 100644 --- a/substrate/frame/state-trie-migration/src/lib.rs +++ b/substrate/frame/state-trie-migration/src/lib.rs @@ -55,6 +55,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub use pallet::*; pub mod weights; @@ -75,6 +77,8 @@ pub mod pallet { pub use crate::weights::WeightInfo; + use alloc::{vec, vec::Vec}; + use core::ops::Deref; use frame_support::{ dispatch::{DispatchErrorWithPostInfo, PostDispatchInfo}, ensure, @@ -93,7 +97,6 @@ pub mod pallet { self, traits::{Saturating, Zero}, }; - use sp_std::{ops::Deref, prelude::*}; pub(crate) type BalanceOf = <::Currency as Inspect<::AccountId>>::Balance; @@ -169,11 +172,11 @@ pub mod pallet { pub(crate) child_items: u32, #[codec(skip)] - pub(crate) _ph: sp_std::marker::PhantomData, + pub(crate) _ph: core::marker::PhantomData, } - impl> sp_std::fmt::Debug for Progress { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + impl> core::fmt::Debug for Progress { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { Progress::ToStart => f.write_str("To start"), Progress::LastKey(key) => write!(f, "Last: {:?}", HexDisplay::from(key.deref())), @@ -182,8 +185,8 @@ pub mod pallet { } } - impl sp_std::fmt::Debug for MigrationTask { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + impl core::fmt::Debug for MigrationTask { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { f.debug_struct("MigrationTask") .field("top", &self.progress_top) .field("child", &self.progress_child) @@ -953,8 +956,8 @@ pub mod pallet { #[cfg(feature = "runtime-benchmarks")] mod benchmarks { use super::{pallet::Pallet as StateTrieMigration, *}; + use alloc::vec; use frame_support::traits::fungible::{Inspect, Mutate}; - use sp_std::prelude::*; // The size of the key seemingly makes no difference in the read/write time, so we make it // constant. @@ -1080,7 +1083,7 @@ mod benchmarks { process_top_key { let v in 1 .. (4 * 1024 * 1024); - let value = sp_std::vec![1u8; v as usize]; + let value = alloc::vec![1u8; v as usize]; sp_io::storage::set(KEY, &value); }: { let data = sp_io::storage::get(KEY).unwrap(); @@ -1101,6 +1104,7 @@ mod benchmarks { mod mock { use super::*; use crate as pallet_state_trie_migration; + use alloc::{vec, vec::Vec}; use frame_support::{derive_impl, parameter_types, traits::Hooks, weights::Weight}; use frame_system::{EnsureRoot, EnsureSigned}; use sp_core::{ diff --git a/substrate/frame/statement/Cargo.toml b/substrate/frame/statement/Cargo.toml index 233b7255fc5..000e5033d8f 100644 --- a/substrate/frame/statement/Cargo.toml +++ b/substrate/frame/statement/Cargo.toml @@ -22,7 +22,6 @@ frame-system = { workspace = true } sp-statement-store = { workspace = true } sp-api = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-io = { workspace = true } sp-core = { workspace = true } log = { workspace = true } @@ -44,7 +43,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-statement-store/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/statement/src/lib.rs b/substrate/frame/statement/src/lib.rs index c68dac2d297..6a7f577ab08 100644 --- a/substrate/frame/statement/src/lib.rs +++ b/substrate/frame/statement/src/lib.rs @@ -92,7 +92,7 @@ pub mod pallet { } #[pallet::pallet] - pub struct Pallet(sp_std::marker::PhantomData); + pub struct Pallet(core::marker::PhantomData); #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] diff --git a/substrate/frame/sudo/Cargo.toml b/substrate/frame/sudo/Cargo.toml index 5d5d09d6923..1a94753728b 100644 --- a/substrate/frame/sudo/Cargo.toml +++ b/substrate/frame/sudo/Cargo.toml @@ -23,7 +23,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } docify = { workspace = true } @@ -41,7 +40,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/sudo/src/benchmarking.rs b/substrate/frame/sudo/src/benchmarking.rs index e64233fe748..dee7d09c9d0 100644 --- a/substrate/frame/sudo/src/benchmarking.rs +++ b/substrate/frame/sudo/src/benchmarking.rs @@ -19,6 +19,7 @@ use super::*; use crate::Pallet; +use alloc::{boxed::Box, vec}; use frame_benchmarking::v2::*; use frame_system::RawOrigin; diff --git a/substrate/frame/sudo/src/extension.rs b/substrate/frame/sudo/src/extension.rs index e90286e5a7c..fb7eaf78948 100644 --- a/substrate/frame/sudo/src/extension.rs +++ b/substrate/frame/sudo/src/extension.rs @@ -17,6 +17,7 @@ use crate::{Config, Key}; use codec::{Decode, Encode}; +use core::{fmt, marker::PhantomData}; use frame_support::{dispatch::DispatchInfo, ensure}; use scale_info::TypeInfo; use sp_runtime::{ @@ -26,7 +27,6 @@ use sp_runtime::{ UnknownTransaction, ValidTransaction, }, }; -use sp_std::{fmt, marker::PhantomData}; /// Ensure that signed transactions are only valid if they are signed by sudo account. /// diff --git a/substrate/frame/sudo/src/lib.rs b/substrate/frame/sudo/src/lib.rs index 63b68e69430..07296e90b64 100644 --- a/substrate/frame/sudo/src/lib.rs +++ b/substrate/frame/sudo/src/lib.rs @@ -121,8 +121,11 @@ #![deny(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::boxed::Box; + use sp_runtime::{traits::StaticLookup, DispatchResult}; -use sp_std::prelude::*; use frame_support::{dispatch::GetDispatchInfo, traits::UnfilteredDispatchable}; diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/inherent.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/inherent.rs index da483fa6cf0..c5fe8440d21 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/inherent.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/inherent.rs @@ -58,17 +58,17 @@ pub fn expand_outer_inherent( trait InherentDataExt { fn create_extrinsics(&self) -> - #scrate::__private::sp_std::vec::Vec<<#block as #scrate::sp_runtime::traits::Block>::Extrinsic>; + #scrate::__private::Vec<<#block as #scrate::sp_runtime::traits::Block>::Extrinsic>; fn check_extrinsics(&self, block: &#block) -> #scrate::inherent::CheckInherentsResult; } impl InherentDataExt for #scrate::inherent::InherentData { fn create_extrinsics(&self) -> - #scrate::__private::sp_std::vec::Vec<<#block as #scrate::sp_runtime::traits::Block>::Extrinsic> + #scrate::__private::Vec<<#block as #scrate::sp_runtime::traits::Block>::Extrinsic> { use #scrate::inherent::ProvideInherent; - let mut inherents = #scrate::__private::sp_std::vec::Vec::new(); + let mut inherents = #scrate::__private::Vec::new(); #( #pallet_attrs diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/metadata.rs index 0e76f9a9246..daef1b17161 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -111,7 +111,7 @@ pub fn expand_runtime_metadata( >(); #scrate::__private::metadata_ir::MetadataIR { - pallets: #scrate::__private::sp_std::vec![ #(#pallets),* ], + pallets: #scrate::__private::vec![ #(#pallets),* ], extrinsic: #scrate::__private::metadata_ir::ExtrinsicMetadataIR { ty, version: <#extrinsic as #scrate::sp_runtime::traits::ExtrinsicMetadata>::VERSION, @@ -156,7 +156,7 @@ pub fn expand_runtime_metadata( }) } - pub fn metadata_versions() -> #scrate::__private::sp_std::vec::Vec { + pub fn metadata_versions() -> #scrate::__private::Vec { #scrate::__private::metadata_ir::supported_versions() } } diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/origin.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/origin.rs index 83049919d01..4a14853c04e 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/origin.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/origin.rs @@ -105,25 +105,25 @@ pub fn expand_outer_origin( #[derive(Clone)] pub struct RuntimeOrigin { pub caller: OriginCaller, - filter: #scrate::__private::sp_std::rc::Rc::RuntimeCall) -> bool>>, + filter: #scrate::__private::Rc<#scrate::__private::Box::RuntimeCall) -> bool>>, } #[cfg(not(feature = "std"))] - impl #scrate::__private::sp_std::fmt::Debug for RuntimeOrigin { + impl core::fmt::Debug for RuntimeOrigin { fn fmt( &self, - fmt: &mut #scrate::__private::sp_std::fmt::Formatter, - ) -> #scrate::__private::sp_std::result::Result<(), #scrate::__private::sp_std::fmt::Error> { + fmt: &mut core::fmt::Formatter, + ) -> core::result::Result<(), core::fmt::Error> { fmt.write_str("") } } #[cfg(feature = "std")] - impl #scrate::__private::sp_std::fmt::Debug for RuntimeOrigin { + impl core::fmt::Debug for RuntimeOrigin { fn fmt( &self, - fmt: &mut #scrate::__private::sp_std::fmt::Formatter, - ) -> #scrate::__private::sp_std::result::Result<(), #scrate::__private::sp_std::fmt::Error> { + fmt: &mut core::fmt::Formatter, + ) -> core::result::Result<(), core::fmt::Error> { fmt.debug_struct("Origin") .field("caller", &self.caller) .field("filter", &"[function ptr]") @@ -139,7 +139,7 @@ pub fn expand_outer_origin( fn add_filter(&mut self, filter: impl Fn(&Self::Call) -> bool + 'static) { let f = self.filter.clone(); - self.filter = #scrate::__private::sp_std::rc::Rc::new(Box::new(move |call| { + self.filter = #scrate::__private::Rc::new(#scrate::__private::Box::new(move |call| { f(call) && filter(call) })); } @@ -150,7 +150,7 @@ pub fn expand_outer_origin( as #scrate::traits::Contains<<#runtime as #system_path::Config>::RuntimeCall> >::contains; - self.filter = #scrate::__private::sp_std::rc::Rc::new(Box::new(filter)); + self.filter = #scrate::__private::Rc::new(#scrate::__private::Box::new(filter)); } fn set_caller_from(&mut self, other: impl Into) { @@ -252,7 +252,7 @@ pub fn expand_outer_origin( impl TryFrom for #system_path::Origin<#runtime> { type Error = OriginCaller; fn try_from(x: OriginCaller) - -> #scrate::__private::sp_std::result::Result<#system_path::Origin<#runtime>, OriginCaller> + -> core::result::Result<#system_path::Origin<#runtime>, OriginCaller> { if let OriginCaller::system(l) = x { Ok(l) @@ -275,7 +275,7 @@ pub fn expand_outer_origin( fn from(x: OriginCaller) -> Self { let mut o = RuntimeOrigin { caller: x, - filter: #scrate::__private::sp_std::rc::Rc::new(Box::new(|_| true)), + filter: #scrate::__private::Rc::new(#scrate::__private::Box::new(|_| true)), }; #scrate::traits::OriginTrait::reset_filter(&mut o); @@ -284,7 +284,7 @@ pub fn expand_outer_origin( } } - impl From for #scrate::__private::sp_std::result::Result<#system_path::Origin<#runtime>, RuntimeOrigin> { + impl From for core::result::Result<#system_path::Origin<#runtime>, RuntimeOrigin> { /// NOTE: converting to pallet origin loses the origin filter information. fn from(val: RuntimeOrigin) -> Self { if let OriginCaller::system(l) = val.caller { @@ -349,7 +349,7 @@ fn expand_origin_caller_variant( } fn expand_origin_pallet_conversions( - scrate: &TokenStream, + _scrate: &TokenStream, runtime: &Ident, pallet: &Pallet, instance: Option<&Ident>, @@ -394,7 +394,7 @@ fn expand_origin_pallet_conversions( } #attr - impl From for #scrate::__private::sp_std::result::Result<#pallet_origin, RuntimeOrigin> { + impl From for core::result::Result<#pallet_origin, RuntimeOrigin> { /// NOTE: converting to pallet origin loses the origin filter information. fn from(val: RuntimeOrigin) -> Self { if let OriginCaller::#variant_name(l) = val.caller { @@ -410,7 +410,7 @@ fn expand_origin_pallet_conversions( type Error = OriginCaller; fn try_from( x: OriginCaller, - ) -> #scrate::__private::sp_std::result::Result<#pallet_origin, OriginCaller> { + ) -> core::result::Result<#pallet_origin, OriginCaller> { if let OriginCaller::#variant_name(l) = x { Ok(l) } else { @@ -424,7 +424,7 @@ fn expand_origin_pallet_conversions( type Error = (); fn try_from( x: &'a OriginCaller, - ) -> #scrate::__private::sp_std::result::Result<&'a #pallet_origin, ()> { + ) -> core::result::Result<&'a #pallet_origin, ()> { if let OriginCaller::#variant_name(l) = x { Ok(&l) } else { @@ -438,7 +438,7 @@ fn expand_origin_pallet_conversions( type Error = (); fn try_from( x: &'a RuntimeOrigin, - ) -> #scrate::__private::sp_std::result::Result<&'a #pallet_origin, ()> { + ) -> core::result::Result<&'a #pallet_origin, ()> { if let OriginCaller::#variant_name(l) = &x.caller { Ok(&l) } else { diff --git a/substrate/frame/support/procedural/src/construct_runtime/mod.rs b/substrate/frame/support/procedural/src/construct_runtime/mod.rs index 1505d158895..17042c24878 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/mod.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/mod.rs @@ -470,7 +470,7 @@ fn construct_runtime_final_expansion( #[doc(hidden)] trait InternalConstructRuntime { #[inline(always)] - fn runtime_metadata(&self) -> #scrate::__private::sp_std::vec::Vec<#scrate::__private::metadata_ir::RuntimeApiMetadataIR> { + fn runtime_metadata(&self) -> #scrate::__private::Vec<#scrate::__private::metadata_ir::RuntimeApiMetadataIR> { Default::default() } } @@ -669,10 +669,10 @@ pub(crate) fn decl_pallet_runtime_setup( impl #scrate::traits::PalletInfo for PalletInfo { fn index() -> Option { - let type_id = #scrate::__private::sp_std::any::TypeId::of::

    (); + let type_id = core::any::TypeId::of::

    (); #( #pallet_attrs - if type_id == #scrate::__private::sp_std::any::TypeId::of::<#names>() { + if type_id == core::any::TypeId::of::<#names>() { return Some(#indices) } )* @@ -681,10 +681,10 @@ pub(crate) fn decl_pallet_runtime_setup( } fn name() -> Option<&'static str> { - let type_id = #scrate::__private::sp_std::any::TypeId::of::

    (); + let type_id = core::any::TypeId::of::

    (); #( #pallet_attrs - if type_id == #scrate::__private::sp_std::any::TypeId::of::<#names>() { + if type_id == core::any::TypeId::of::<#names>() { return Some(#name_strings) } )* @@ -693,10 +693,10 @@ pub(crate) fn decl_pallet_runtime_setup( } fn name_hash() -> Option<[u8; 16]> { - let type_id = #scrate::__private::sp_std::any::TypeId::of::

    (); + let type_id = core::any::TypeId::of::

    (); #( #pallet_attrs - if type_id == #scrate::__private::sp_std::any::TypeId::of::<#names>() { + if type_id == core::any::TypeId::of::<#names>() { return Some(#name_hashes) } )* @@ -705,10 +705,10 @@ pub(crate) fn decl_pallet_runtime_setup( } fn module_name() -> Option<&'static str> { - let type_id = #scrate::__private::sp_std::any::TypeId::of::

    (); + let type_id = core::any::TypeId::of::

    (); #( #pallet_attrs - if type_id == #scrate::__private::sp_std::any::TypeId::of::<#names>() { + if type_id == core::any::TypeId::of::<#names>() { return Some(#module_names) } )* @@ -717,10 +717,10 @@ pub(crate) fn decl_pallet_runtime_setup( } fn crate_version() -> Option<#scrate::traits::CrateVersion> { - let type_id = #scrate::__private::sp_std::any::TypeId::of::

    (); + let type_id = core::any::TypeId::of::

    (); #( #pallet_attrs - if type_id == #scrate::__private::sp_std::any::TypeId::of::<#names>() { + if type_id == core::any::TypeId::of::<#names>() { return Some( <#pallet_structs as #scrate::traits::PalletInfoAccess>::crate_version() ) diff --git a/substrate/frame/support/procedural/src/pallet/expand/constants.rs b/substrate/frame/support/procedural/src/pallet/expand/constants.rs index d7fbb5a7189..a36df790bd2 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/constants.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/constants.rs @@ -88,7 +88,7 @@ pub fn expand_constants(def: &mut Def) -> proc_macro2::TokenStream { name: #ident_str, ty: #frame_support::__private::scale_info::meta_type::<#const_type>(), value: { #default_byte_impl }, - docs: #frame_support::__private::sp_std::vec![ #( #doc ),* ], + docs: #frame_support::__private::vec![ #( #doc ),* ], } }) }); @@ -98,9 +98,9 @@ pub fn expand_constants(def: &mut Def) -> proc_macro2::TokenStream { #[doc(hidden)] pub fn pallet_constants_metadata() - -> #frame_support::__private::sp_std::vec::Vec<#frame_support::__private::metadata_ir::PalletConstantMetadataIR> + -> #frame_support::__private::Vec<#frame_support::__private::metadata_ir::PalletConstantMetadataIR> { - #frame_support::__private::sp_std::vec![ #( #consts ),* ] + #frame_support::__private::vec![ #( #consts ),* ] } } ) diff --git a/substrate/frame/support/procedural/src/pallet/expand/documentation.rs b/substrate/frame/support/procedural/src/pallet/expand/documentation.rs index ec19f889a9f..e2c72ee921c 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/documentation.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/documentation.rs @@ -163,9 +163,9 @@ pub fn expand_documentation(def: &mut Def) -> proc_macro2::TokenStream { #[doc(hidden)] pub fn pallet_documentation_metadata() - -> #frame_support::__private::sp_std::vec::Vec<&'static str> + -> #frame_support::__private::Vec<&'static str> { - #frame_support::__private::sp_std::vec![ #( #docs ),* ] + #frame_support::__private::vec![ #( #docs ),* ] } } ) diff --git a/substrate/frame/support/procedural/src/pallet/expand/error.rs b/substrate/frame/support/procedural/src/pallet/expand/error.rs index b921d66ff9e..05478ee3908 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/error.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/error.rs @@ -66,7 +66,7 @@ pub fn expand_error(def: &mut Def) -> proc_macro2::TokenStream { #[doc(hidden)] #[codec(skip)] __Ignore( - #frame_support::__private::sp_std::marker::PhantomData<(#type_use_gen)>, + core::marker::PhantomData<(#type_use_gen)>, #frame_support::Never, ) ); @@ -124,11 +124,11 @@ pub fn expand_error(def: &mut Def) -> proc_macro2::TokenStream { } quote::quote_spanned!(error.attr_span => - impl<#type_impl_gen> #frame_support::__private::sp_std::fmt::Debug for #error_ident<#type_use_gen> + impl<#type_impl_gen> core::fmt::Debug for #error_ident<#type_use_gen> #config_where_clause { - fn fmt(&self, f: &mut #frame_support::__private::sp_std::fmt::Formatter<'_>) - -> #frame_support::__private::sp_std::fmt::Result + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) + -> core::fmt::Result { f.write_str(self.as_str()) } diff --git a/substrate/frame/support/procedural/src/pallet/expand/hooks.rs b/substrate/frame/support/procedural/src/pallet/expand/hooks.rs index 3623b595268..d7b1ca14f57 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/hooks.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/hooks.rs @@ -255,7 +255,7 @@ pub fn expand_hooks(def: &mut Def) -> proc_macro2::TokenStream { } #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result<#frame_support::__private::sp_std::vec::Vec, #frame_support::sp_runtime::TryRuntimeError> { + fn pre_upgrade() -> Result<#frame_support::__private::Vec, #frame_support::sp_runtime::TryRuntimeError> { < Self as @@ -264,7 +264,7 @@ pub fn expand_hooks(def: &mut Def) -> proc_macro2::TokenStream { } #[cfg(feature = "try-runtime")] - fn post_upgrade(state: #frame_support::__private::sp_std::vec::Vec) -> Result<(), #frame_support::sp_runtime::TryRuntimeError> { + fn post_upgrade(state: #frame_support::__private::Vec) -> Result<(), #frame_support::sp_runtime::TryRuntimeError> { #post_storage_version_check < diff --git a/substrate/frame/support/procedural/src/pallet/expand/pallet_struct.rs b/substrate/frame/support/procedural/src/pallet/expand/pallet_struct.rs index 7cdf6bde9de..7ebc4bb2e9d 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/pallet_struct.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/pallet_struct.rs @@ -54,7 +54,7 @@ pub fn expand_pallet_struct(def: &mut Def) -> proc_macro2::TokenStream { if let Some(field) = pallet_item.fields.iter_mut().next() { if field.ty == syn::parse_quote!(_) { field.ty = syn::parse_quote!( - #frame_support::__private::sp_std::marker::PhantomData<(#type_use_gen)> + core::marker::PhantomData<(#type_use_gen)> ); } } @@ -139,10 +139,10 @@ pub fn expand_pallet_struct(def: &mut Def) -> proc_macro2::TokenStream { #storages_where_clauses { fn storage_info() - -> #frame_support::__private::sp_std::vec::Vec<#frame_support::traits::StorageInfo> + -> #frame_support::__private::Vec<#frame_support::traits::StorageInfo> { #[allow(unused_mut)] - let mut res = #frame_support::__private::sp_std::vec![]; + let mut res = #frame_support::__private::vec![]; #( #(#storage_cfg_attrs)* @@ -179,8 +179,8 @@ pub fn expand_pallet_struct(def: &mut Def) -> proc_macro2::TokenStream { let whitelisted_storage_keys_impl = quote::quote![ use #frame_support::traits::{StorageInfoTrait, TrackedStorageKey, WhitelistedStorageKeys}; impl<#type_impl_gen> WhitelistedStorageKeys for #pallet_ident<#type_use_gen> #storages_where_clauses { - fn whitelisted_storage_keys() -> #frame_support::__private::sp_std::vec::Vec { - use #frame_support::__private::sp_std::vec; + fn whitelisted_storage_keys() -> #frame_support::__private::Vec { + use #frame_support::__private::vec; vec![#( TrackedStorageKey::new(#whitelisted_storage_idents::<#type_use_gen>::hashed_key().to_vec()) ),*] @@ -272,7 +272,7 @@ pub fn expand_pallet_struct(def: &mut Def) -> proc_macro2::TokenStream { #config_where_clause { fn count() -> usize { 1 } - fn infos() -> #frame_support::__private::sp_std::vec::Vec<#frame_support::traits::PalletInfoData> { + fn infos() -> #frame_support::__private::Vec<#frame_support::traits::PalletInfoData> { use #frame_support::traits::PalletInfoAccess; let item = #frame_support::traits::PalletInfoData { index: Self::index(), @@ -280,7 +280,7 @@ pub fn expand_pallet_struct(def: &mut Def) -> proc_macro2::TokenStream { module_name: Self::module_name(), crate_version: Self::crate_version(), }; - #frame_support::__private::sp_std::vec![item] + #frame_support::__private::vec![item] } } diff --git a/substrate/frame/support/procedural/src/pallet/expand/storage.rs b/substrate/frame/support/procedural/src/pallet/expand/storage.rs index 3cc8a843e3b..267b0f2dd3b 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/storage.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/storage.rs @@ -423,7 +423,7 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream { #(#cfg_attrs)* { <#full_ident as #frame_support::storage::StorageEntryMetadataBuilder>::build_metadata( - #frame_support::__private::sp_std::vec![ + #frame_support::__private::vec![ #( #docs, )* ], &mut entries, @@ -853,7 +853,7 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream { impl<#type_impl_gen> #frame_support::traits::TryDecodeEntireStorage for #pallet_ident<#type_use_gen> #completed_where_clause { - fn try_decode_entire_state() -> Result> { + fn try_decode_entire_state() -> Result> { let pallet_name = <::PalletInfo as #frame_support::traits::PalletInfo> ::name::<#pallet_ident<#type_use_gen>>() .expect("Every active pallet has a name in the runtime; qed"); @@ -861,7 +861,7 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream { #frame_support::__private::log::debug!(target: "runtime::try-decode-state", "trying to decode pallet: {pallet_name}"); // NOTE: for now, we have to exclude storage items that are feature gated. - let mut errors = #frame_support::__private::sp_std::vec::Vec::new(); + let mut errors = #frame_support::__private::Vec::new(); let mut decoded = 0usize; #( @@ -902,7 +902,7 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream { .expect("No name found for the pallet in the runtime! This usually means that the pallet wasn't added to `construct_runtime!`."), entries: { #[allow(unused_mut)] - let mut entries = #frame_support::__private::sp_std::vec![]; + let mut entries = #frame_support::__private::vec![]; #( #entries_builder )* entries }, diff --git a/substrate/frame/support/procedural/src/pallet/expand/tasks.rs b/substrate/frame/support/procedural/src/pallet/expand/tasks.rs index 6697e5c822a..7201c352d92 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/tasks.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/tasks.rs @@ -159,7 +159,6 @@ impl ToTokens for TasksDef { let task_fn_names = self.tasks.iter().map(|task| &task.item.sig.ident); let task_arg_names = self.tasks.iter().map(|task| &task.arg_names).collect::>(); - let sp_std = quote!(#scrate::__private::sp_std); let impl_generics = &self.item_impl.generics; tokens.extend(quote! { impl #impl_generics #enum_use @@ -169,13 +168,13 @@ impl ToTokens for TasksDef { impl #impl_generics #scrate::traits::Task for #enum_use { - type Enumeration = #sp_std::vec::IntoIter<#enum_use>; + type Enumeration = #scrate::__private::IntoIter<#enum_use>; fn iter() -> Self::Enumeration { - let mut all_tasks = #sp_std::vec![]; + let mut all_tasks = #scrate::__private::vec![]; #(all_tasks .extend(#task_iters.map(|(#(#task_arg_names),*)| #enum_ident::#task_fn_idents { #(#task_arg_names: #task_arg_names.clone()),* }) - .collect::<#sp_std::vec::Vec<_>>()); + .collect::<#scrate::__private::Vec<_>>()); )* all_tasks.into_iter() } diff --git a/substrate/frame/support/procedural/src/pallet/parse/tests/tasks.rs b/substrate/frame/support/procedural/src/pallet/parse/tests/tasks.rs index 9f143628404..7df91ae777d 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/tests/tasks.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/tests/tasks.rs @@ -124,10 +124,10 @@ fn test_parse_pallet_manual_tasks_impl_without_manual_tasks_enum() { where T: TypeInfo, { - type Enumeration = sp_std::vec::IntoIter>; + type Enumeration = alloc::vec::IntoIter>; fn iter() -> Self::Enumeration { - sp_std::vec![Task::increment, Task::decrement].into_iter() + alloc::vec![Task::increment, Task::decrement].into_iter() } } diff --git a/substrate/frame/support/procedural/src/runtime/expand/mod.rs b/substrate/frame/support/procedural/src/runtime/expand/mod.rs index 3cdfb06cb6e..f34ab1cef54 100644 --- a/substrate/frame/support/procedural/src/runtime/expand/mod.rs +++ b/substrate/frame/support/procedural/src/runtime/expand/mod.rs @@ -280,7 +280,7 @@ fn construct_runtime_final_expansion( #[doc(hidden)] trait InternalConstructRuntime { #[inline(always)] - fn runtime_metadata(&self) -> #scrate::__private::sp_std::vec::Vec<#scrate::__private::metadata_ir::RuntimeApiMetadataIR> { + fn runtime_metadata(&self) -> #scrate::__private::Vec<#scrate::__private::metadata_ir::RuntimeApiMetadataIR> { Default::default() } } diff --git a/substrate/frame/support/src/dispatch.rs b/substrate/frame/support/src/dispatch.rs index 4a313551aca..351ba3a15ef 100644 --- a/substrate/frame/support/src/dispatch.rs +++ b/substrate/frame/support/src/dispatch.rs @@ -20,6 +20,7 @@ use crate::traits::UnfilteredDispatchable; use codec::{Codec, Decode, Encode, EncodeLike, MaxEncodedLen}; +use core::fmt; use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; @@ -28,7 +29,6 @@ use sp_runtime::{ traits::SignedExtension, DispatchError, RuntimeDebug, }; -use sp_std::fmt; use sp_weights::Weight; /// The return type of a `Dispatchable` in frame. When returned explicitly from @@ -220,14 +220,14 @@ pub trait OneOrMany { } impl OneOrMany for DispatchClass { - type Iter = sp_std::iter::Once; + type Iter = core::iter::Once; fn into_iter(self) -> Self::Iter { - sp_std::iter::once(self) + core::iter::once(self) } } impl<'a> OneOrMany for &'a [DispatchClass] { - type Iter = sp_std::iter::Cloned>; + type Iter = core::iter::Cloned>; fn into_iter(self) -> Self::Iter { self.iter().cloned() } diff --git a/substrate/frame/support/src/dispatch_context.rs b/substrate/frame/support/src/dispatch_context.rs index 254302c8f14..b34c6bdada3 100644 --- a/substrate/frame/support/src/dispatch_context.rs +++ b/substrate/frame/support/src/dispatch_context.rs @@ -81,11 +81,11 @@ //! In your pallet you will only have to use [`with_context`], because as described above //! [`run_in_context`] will be handled by FRAME for you. -use sp_std::{ - any::{Any, TypeId}, +use alloc::{ boxed::Box, collections::btree_map::{BTreeMap, Entry}, }; +use core::any::{Any, TypeId}; environmental::environmental!(DISPATCH_CONTEXT: BTreeMap>); @@ -158,7 +158,7 @@ pub fn with_context(callback: impl FnOnce(&mut Value) -> R) -> if value.is_none() { log::error!( "Failed to downcast value for type {} in dispatch context!", - sp_std::any::type_name::(), + core::any::type_name::(), ); } diff --git a/substrate/frame/support/src/genesis_builder_helper.rs b/substrate/frame/support/src/genesis_builder_helper.rs index 7389c5a787d..662ea2cb186 100644 --- a/substrate/frame/support/src/genesis_builder_helper.rs +++ b/substrate/frame/support/src/genesis_builder_helper.rs @@ -41,7 +41,7 @@ pub fn build_state(json: Vec) -> BuildResult { /// to [`sp_genesis_builder::GenesisBuilder::get_preset`]. pub fn get_preset( name: &Option, - preset_for_name: impl FnOnce(&sp_genesis_builder::PresetId) -> Option>, + preset_for_name: impl FnOnce(&sp_genesis_builder::PresetId) -> Option>, ) -> Option> where GC: BuildGenesisConfig + Default, diff --git a/substrate/frame/support/src/hash.rs b/substrate/frame/support/src/hash.rs index 9c48f4b187a..a09890560c6 100644 --- a/substrate/frame/support/src/hash.rs +++ b/substrate/frame/support/src/hash.rs @@ -17,10 +17,10 @@ //! Hash utilities. +use alloc::vec::Vec; use codec::{Codec, MaxEncodedLen}; use sp_io::hashing::{blake2_128, blake2_256, twox_128, twox_256, twox_64}; use sp_metadata_ir as metadata_ir; -use sp_std::prelude::Vec; // This trait must be kept coherent with frame-support-procedural HasherKind usage pub trait Hashable: Sized { diff --git a/substrate/frame/support/src/lib.rs b/substrate/frame/support/src/lib.rs index 94f4b9dd4bd..3ad8c5fabaa 100644 --- a/substrate/frame/support/src/lib.rs +++ b/substrate/frame/support/src/lib.rs @@ -33,11 +33,20 @@ #[doc(hidden)] extern crate self as frame_support; +#[doc(hidden)] +extern crate alloc; + /// Private exports that are being used by macros. /// /// The exports are not stable and should not be relied on. #[doc(hidden)] pub mod __private { + pub use alloc::{ + boxed::Box, + rc::Rc, + vec, + vec::{IntoIter, Vec}, + }; pub use codec; pub use frame_metadata as metadata; pub use log; @@ -261,7 +270,7 @@ macro_rules! parameter_types { ) => ( $( #[ $attr ] )* $vis struct $name $( - < $($ty_params),* >( $($crate::__private::sp_std::marker::PhantomData<$ty_params>),* ) + < $($ty_params),* >( $(core::marker::PhantomData<$ty_params>),* ) )?; $crate::parameter_types!(IMPL_CONST $name , $type , $value $( $(, $ty_params)* )?); $crate::parameter_types!( $( $rest )* ); @@ -273,7 +282,7 @@ macro_rules! parameter_types { ) => ( $( #[ $attr ] )* $vis struct $name $( - < $($ty_params),* >( $($crate::__private::sp_std::marker::PhantomData<$ty_params>),* ) + < $($ty_params),* >( $(core::marker::PhantomData<$ty_params>),* ) )?; $crate::parameter_types!(IMPL $name, $type, $value $( $(, $ty_params)* )?); $crate::parameter_types!( $( $rest )* ); @@ -285,7 +294,7 @@ macro_rules! parameter_types { ) => ( $( #[ $attr ] )* $vis struct $name $( - < $($ty_params),* >( $($crate::__private::sp_std::marker::PhantomData<$ty_params>),* ) + < $($ty_params),* >( $(core::marker::PhantomData<$ty_params>),* ) )?; $crate::parameter_types!(IMPL_STORAGE $name, $type, $value $( $(, $ty_params)* )?); $crate::parameter_types!( $( $rest )* ); @@ -468,7 +477,7 @@ macro_rules! ord_parameter_types { (IMPL $name:ident , $type:ty , $value:expr) => { impl $crate::traits::SortedMembers<$type> for $name { fn contains(t: &$type) -> bool { &$value == t } - fn sorted_members() -> $crate::__private::sp_std::prelude::Vec<$type> { vec![$value] } + fn sorted_members() -> $crate::__private::Vec<$type> { vec![$value] } fn count() -> usize { 1 } #[cfg(feature = "runtime-benchmarks")] fn add(_: &$type) {} @@ -499,7 +508,7 @@ macro_rules! runtime_print { } /// Print out the debuggable type. -pub fn debug(data: &impl sp_std::fmt::Debug) { +pub fn debug(data: &impl core::fmt::Debug) { runtime_print!("{:?}", data); } @@ -926,6 +935,7 @@ pub mod pallet_prelude { pub use codec::{Decode, Encode, MaxEncodedLen}; pub use frame_support::pallet_macros::*; + pub use core::marker::PhantomData; /// The optional attribute `#[inject_runtime_type]` can be attached to `RuntimeCall`, /// `RuntimeEvent`, `RuntimeOrigin` or `PalletInfo` in an impl statement that has /// `#[register_default_impl]` attached to indicate that this item is generated by @@ -954,7 +964,6 @@ pub mod pallet_prelude { }, DispatchError, RuntimeDebug, MAX_MODULE_ERROR_ENCODED_SIZE, }; - pub use sp_std::marker::PhantomData; pub use sp_weights::Weight; } @@ -1285,7 +1294,7 @@ pub mod pallet_macros { /// # use frame_support::pallet_prelude::*; /// # use frame_support::inherent::IsFatalError; /// # use sp_timestamp::InherentError; - /// # use sp_std::result; + /// # use core::result; /// # /// // Example inherent identifier /// pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"timstap0"; @@ -1911,7 +1920,7 @@ pub mod pallet_macros { /// Field types in enum variants must also implement [`frame_support::PalletError`], /// otherwise the pallet will fail to compile. Rust primitive types have already /// implemented the [`frame_support::PalletError`] trait along with some commonly used - /// stdlib types such as [`Option`] and [`sp_std::marker::PhantomData`], and hence + /// stdlib types such as [`Option`] and [`core::marker::PhantomData`], and hence /// in most use cases, a manual implementation is not necessary and is discouraged. /// /// The generic `T` must not bound anything and a `where` clause is not allowed. That said, diff --git a/substrate/frame/support/src/migrations.rs b/substrate/frame/support/src/migrations.rs index fa018d74365..7f746146956 100644 --- a/substrate/frame/support/src/migrations.rs +++ b/substrate/frame/support/src/migrations.rs @@ -24,13 +24,14 @@ use crate::{ }, weights::{RuntimeDbWeight, Weight, WeightMeter}, }; +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; +use core::marker::PhantomData; use impl_trait_for_tuples::impl_for_tuples; use sp_arithmetic::traits::Bounded; use sp_core::Get; use sp_io::{hashing::twox_128, storage::clear_prefix, KillStorageResult}; use sp_runtime::traits::Zero; -use sp_std::{marker::PhantomData, vec::Vec}; /// Handles storage migration pallet versioning. /// @@ -71,7 +72,7 @@ use sp_std::{marker::PhantomData, vec::Vec}; /// /// - https://internals.rust-lang.org/t/lang-team-minutes-private-in-public-rules/4504/40 /// mod version_unchecked { /// use super::*; -/// pub struct VersionUncheckedMigrateV5ToV6(sp_std::marker::PhantomData); +/// pub struct VersionUncheckedMigrateV5ToV6(core::marker::PhantomData); /// impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateV5ToV6 { /// // `UncheckedOnRuntimeUpgrade` implementation... /// } @@ -102,7 +103,7 @@ pub struct VersionedMigration), + MigrationExecuted(alloc::vec::Vec), /// This migration is a noop, do not run post_upgrade checks. Noop, } @@ -125,7 +126,7 @@ impl< /// [`VersionedPostUpgradeData`] before passing them to post_upgrade, so it knows whether the /// migration ran or not. #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { let on_chain_version = Pallet::on_chain_storage_version(); if on_chain_version == FROM { Ok(VersionedPostUpgradeData::MigrationExecuted(Inner::pre_upgrade()?).encode()) @@ -175,7 +176,7 @@ impl< /// the migration ran, and [`VersionedPostUpgradeData::Noop`] otherwise. #[cfg(feature = "try-runtime")] fn post_upgrade( - versioned_post_upgrade_data_bytes: sp_std::vec::Vec, + versioned_post_upgrade_data_bytes: alloc::vec::Vec, ) -> Result<(), sp_runtime::TryRuntimeError> { use codec::DecodeAll; match ::decode_all(&mut &versioned_post_upgrade_data_bytes[..]) @@ -339,7 +340,7 @@ impl, DbWeight: Get> frame_support::traits } #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { use crate::storage::unhashed::contains_prefixed_key; let hashed_prefix = twox_128(P::get().as_bytes()); @@ -350,11 +351,11 @@ impl, DbWeight: Get> frame_support::traits P::get() ), }; - Ok(sp_std::vec::Vec::new()) + Ok(alloc::vec::Vec::new()) } #[cfg(feature = "try-runtime")] - fn post_upgrade(_state: sp_std::vec::Vec) -> Result<(), sp_runtime::TryRuntimeError> { + fn post_upgrade(_state: alloc::vec::Vec) -> Result<(), sp_runtime::TryRuntimeError> { use crate::storage::unhashed::contains_prefixed_key; let hashed_prefix = twox_128(P::get().as_bytes()); @@ -450,7 +451,7 @@ impl, S: Get<&'static str>, DbWeight: Get> } #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { use crate::storage::unhashed::contains_prefixed_key; let hashed_prefix = storage_prefix(P::get().as_bytes(), S::get().as_bytes()); @@ -466,7 +467,7 @@ impl, S: Get<&'static str>, DbWeight: Get> } #[cfg(feature = "try-runtime")] - fn post_upgrade(_state: sp_std::vec::Vec) -> Result<(), sp_runtime::TryRuntimeError> { + fn post_upgrade(_state: alloc::vec::Vec) -> Result<(), sp_runtime::TryRuntimeError> { use crate::storage::unhashed::contains_prefixed_key; let hashed_prefix = storage_prefix(P::get().as_bytes(), S::get().as_bytes()); diff --git a/substrate/frame/support/src/storage/bounded_btree_map.rs b/substrate/frame/support/src/storage/bounded_btree_map.rs index 91196be9e80..d3560dd5f0d 100644 --- a/substrate/frame/support/src/storage/bounded_btree_map.rs +++ b/substrate/frame/support/src/storage/bounded_btree_map.rs @@ -26,9 +26,9 @@ impl StorageDecodeLength for BoundedBTreeMap {} pub mod test { use super::*; use crate::Twox128; + use alloc::collections::btree_map::BTreeMap; use frame_support::traits::{ConstU32, Get}; use sp_io::TestExternalities; - use sp_std::collections::btree_map::BTreeMap; #[crate::storage_alias] type Foo = StorageValue>>; diff --git a/substrate/frame/support/src/storage/bounded_btree_set.rs b/substrate/frame/support/src/storage/bounded_btree_set.rs index cf801eb4787..70ab2304cab 100644 --- a/substrate/frame/support/src/storage/bounded_btree_set.rs +++ b/substrate/frame/support/src/storage/bounded_btree_set.rs @@ -26,9 +26,9 @@ impl StorageDecodeNonDedupLength for BoundedBTreeSet {} pub mod test { use super::*; use crate::Twox128; + use alloc::collections::btree_set::BTreeSet; use frame_support::traits::{ConstU32, Get}; use sp_io::TestExternalities; - use sp_std::collections::btree_set::BTreeSet; #[crate::storage_alias] type Foo = StorageValue>>; diff --git a/substrate/frame/support/src/storage/child.rs b/substrate/frame/support/src/storage/child.rs index 76e6f4ee402..5ebba269365 100644 --- a/substrate/frame/support/src/storage/child.rs +++ b/substrate/frame/support/src/storage/child.rs @@ -21,10 +21,10 @@ // NOTE: could replace unhashed by having only one kind of storage (top trie being the child info // of null length parent storage key). +use alloc::vec::Vec; use codec::{Codec, Decode, Encode}; pub use sp_core::storage::{ChildInfo, ChildType, StateVersion}; pub use sp_io::{KillStorageResult, MultiRemovalResults}; -use sp_std::prelude::*; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get(child_info: &ChildInfo, key: &[u8]) -> Option { diff --git a/substrate/frame/support/src/storage/generator/double_map.rs b/substrate/frame/support/src/storage/generator/double_map.rs index a4c1f58203e..b68f3fa495f 100644 --- a/substrate/frame/support/src/storage/generator/double_map.rs +++ b/substrate/frame/support/src/storage/generator/double_map.rs @@ -20,8 +20,8 @@ use crate::{ storage::{self, storage_prefix, unhashed, KeyPrefixIterator, PrefixIterator, StorageAppend}, Never, }; +use alloc::vec::Vec; use codec::{Decode, Encode, EncodeLike, FullCodec, FullEncode}; -use sp_std::prelude::*; /// Generator for `StorageDoubleMap` used by `decl_storage`. /// @@ -516,6 +516,7 @@ mod test_iterators { unhashed, }, }; + use alloc::vec; use codec::Encode; #[test] diff --git a/substrate/frame/support/src/storage/generator/map.rs b/substrate/frame/support/src/storage/generator/map.rs index 257aa7e7bcf..b41f9c71716 100644 --- a/substrate/frame/support/src/storage/generator/map.rs +++ b/substrate/frame/support/src/storage/generator/map.rs @@ -20,9 +20,8 @@ use crate::{ storage::{self, storage_prefix, unhashed, KeyPrefixIterator, PrefixIterator, StorageAppend}, Never, }; +use alloc::vec::Vec; use codec::{Decode, Encode, EncodeLike, FullCodec, FullEncode}; -#[cfg(not(feature = "std"))] -use sp_std::prelude::*; /// Generator for `StorageMap` used by `decl_storage`. /// @@ -80,7 +79,7 @@ pub struct StorageMapIterator { prefix: Vec, previous_key: Vec, drain: bool, - _phantom: ::sp_std::marker::PhantomData<(K, V, Hasher)>, + _phantom: ::core::marker::PhantomData<(K, V, Hasher)>, } impl Iterator @@ -370,6 +369,7 @@ mod test_iterators { unhashed, }, }; + use alloc::vec; use codec::Encode; #[test] diff --git a/substrate/frame/support/src/storage/generator/mod.rs b/substrate/frame/support/src/storage/generator/mod.rs index dd6d622852d..b0b1bda24bb 100644 --- a/substrate/frame/support/src/storage/generator/mod.rs +++ b/substrate/frame/support/src/storage/generator/mod.rs @@ -36,6 +36,7 @@ pub use value::StorageValue; #[cfg(test)] mod tests { + use alloc::vec::Vec; use codec::Encode; use sp_io::TestExternalities; use sp_runtime::{generic, traits::BlakeTwo256, BuildStorage}; diff --git a/substrate/frame/support/src/storage/generator/nmap.rs b/substrate/frame/support/src/storage/generator/nmap.rs index 4b49ad3eb38..0466583a279 100755 --- a/substrate/frame/support/src/storage/generator/nmap.rs +++ b/substrate/frame/support/src/storage/generator/nmap.rs @@ -40,9 +40,8 @@ use crate::{ }, Never, }; +use alloc::vec::Vec; use codec::{Decode, Encode, EncodeLike, FullCodec}; -#[cfg(not(feature = "std"))] -use sp_std::prelude::*; /// Generator for `StorageNMap` used by `decl_storage` and storage types. /// @@ -464,6 +463,7 @@ mod test_iterators { unhashed, }, }; + use alloc::vec; use codec::Encode; #[test] diff --git a/substrate/frame/support/src/storage/hashed.rs b/substrate/frame/support/src/storage/hashed.rs index 6633adce8ff..d823eb98879 100644 --- a/substrate/frame/support/src/storage/hashed.rs +++ b/substrate/frame/support/src/storage/hashed.rs @@ -18,8 +18,8 @@ //! Operation on runtime storage using hashed keys. use super::unhashed; +use alloc::vec::Vec; use codec::{Decode, Encode}; -use sp_std::prelude::*; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get(hash: &HashFn, key: &[u8]) -> Option diff --git a/substrate/frame/support/src/storage/migration.rs b/substrate/frame/support/src/storage/migration.rs index 252625cf4f7..1dd690c3ed6 100644 --- a/substrate/frame/support/src/storage/migration.rs +++ b/substrate/frame/support/src/storage/migration.rs @@ -22,8 +22,8 @@ use crate::{ storage::{storage_prefix, unhashed}, StorageHasher, Twox128, }; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; -use sp_std::prelude::*; use super::PrefixIterator; @@ -32,7 +32,7 @@ pub struct StorageIterator { prefix: Vec, previous_key: Vec, drain: bool, - _phantom: ::sp_std::marker::PhantomData, + _phantom: ::core::marker::PhantomData, } impl StorageIterator { @@ -95,7 +95,7 @@ pub struct StorageKeyIterator { prefix: Vec, previous_key: Vec, drain: bool, - _phantom: ::sp_std::marker::PhantomData<(K, T, H)>, + _phantom: ::core::marker::PhantomData<(K, T, H)>, } impl StorageKeyIterator { diff --git a/substrate/frame/support/src/storage/mod.rs b/substrate/frame/support/src/storage/mod.rs index f7d7447482d..7fb991d3779 100644 --- a/substrate/frame/support/src/storage/mod.rs +++ b/substrate/frame/support/src/storage/mod.rs @@ -24,10 +24,11 @@ use crate::{ ReversibleKeyGenerator, TupleToEncodedIter, }, }; +use alloc::{collections::btree_set::BTreeSet, vec::Vec}; use codec::{Decode, Encode, EncodeLike, FullCodec, FullEncode}; +use core::marker::PhantomData; use sp_core::storage::ChildInfo; use sp_runtime::generic::{Digest, DigestItem}; -use sp_std::{collections::btree_set::BTreeSet, marker::PhantomData, prelude::*}; pub use self::{ stream_iter::StorageStreamIter, diff --git a/substrate/frame/support/src/storage/storage_noop_guard.rs b/substrate/frame/support/src/storage/storage_noop_guard.rs index c4d40fa99a3..23201e58db5 100644 --- a/substrate/frame/support/src/storage/storage_noop_guard.rs +++ b/substrate/frame/support/src/storage/storage_noop_guard.rs @@ -38,7 +38,7 @@ /// ``` #[must_use] pub struct StorageNoopGuard<'a> { - storage_root: sp_std::vec::Vec, + storage_root: alloc::vec::Vec, error_message: &'a str, } @@ -71,7 +71,8 @@ impl<'a> StorageNoopGuard<'a> { impl<'a> Drop for StorageNoopGuard<'a> { fn drop(&mut self) { // No need to double panic, eg. inside a test assertion failure. - if sp_std::thread::panicking() { + #[cfg(feature = "std")] + if std::thread::panicking() { return } assert_eq!( @@ -85,9 +86,10 @@ impl<'a> Drop for StorageNoopGuard<'a> { #[cfg(test)] mod tests { - use super::*; use sp_io::TestExternalities; + use super::*; + #[test] #[should_panic(expected = "`StorageNoopGuard` detected an attempted storage change.")] fn storage_noop_guard_panics_on_changed() { @@ -112,7 +114,7 @@ mod tests { TestExternalities::default().execute_with(|| { let guard = StorageNoopGuard::default(); frame_support::storage::unhashed::put(b"key", b"value"); - sp_std::mem::drop(guard); + std::mem::drop(guard); frame_support::storage::unhashed::kill(b"key"); }); } @@ -122,7 +124,7 @@ mod tests { TestExternalities::default().execute_with(|| { let guard = StorageNoopGuard::default(); frame_support::storage::unhashed::put(b"key", b"value"); - sp_std::mem::forget(guard); + std::mem::forget(guard); }); } diff --git a/substrate/frame/support/src/storage/stream_iter.rs b/substrate/frame/support/src/storage/stream_iter.rs index 529b2f387c7..0d1e5582f84 100644 --- a/substrate/frame/support/src/storage/stream_iter.rs +++ b/substrate/frame/support/src/storage/stream_iter.rs @@ -16,8 +16,8 @@ // limitations under the License. use crate::{BoundedBTreeMap, BoundedBTreeSet, BoundedVec, WeakBoundedVec}; +use alloc::vec::Vec; use codec::Decode; -use sp_std::vec::Vec; /// Provides the sealed trait `StreamIter`. mod private { @@ -26,7 +26,7 @@ mod private { /// Used as marker trait for types that support stream iteration. pub trait StreamIter { /// The actual iterator implementation. - type Iterator: sp_std::iter::Iterator; + type Iterator: core::iter::Iterator; /// Create the stream iterator for the value found at `key`. fn stream_iter(key: Vec) -> Self::Iterator; @@ -40,7 +40,7 @@ mod private { } } - impl StreamIter for sp_std::collections::btree_set::BTreeSet { + impl StreamIter for alloc::collections::btree_set::BTreeSet { type Iterator = ScaleContainerStreamIter; fn stream_iter(key: Vec) -> Self::Iterator { @@ -49,7 +49,7 @@ mod private { } impl StreamIter - for sp_std::collections::btree_map::BTreeMap + for alloc::collections::btree_map::BTreeMap { type Iterator = ScaleContainerStreamIter<(K, V)>; @@ -116,14 +116,14 @@ impl(len) ++ data`. -/// This type provides an [`Iterator`](sp_std::iter::Iterator) implementation that decodes +/// This type provides an [`Iterator`](core::iter::Iterator) implementation that decodes /// one item after another with each call to [`next`](Self::next). The bytes representing /// the container are also not read at once into memory and instead being read in chunks. As long /// as individual items are smaller than these chunks the memory usage of this iterator should /// be constant. On decoding errors [`next`](Self::next) will return `None` to signal that the /// iterator is finished. pub struct ScaleContainerStreamIter { - marker: sp_std::marker::PhantomData, + marker: core::marker::PhantomData, input: StorageInput, length: u32, read: u32, @@ -156,7 +156,7 @@ impl ScaleContainerStreamIter { 0 }; - Self { marker: sp_std::marker::PhantomData, input, length, read: 0 } + Self { marker: core::marker::PhantomData, input, length, read: 0 } } /// Creates a new instance of the stream iterator. @@ -168,11 +168,11 @@ impl ScaleContainerStreamIter { let mut input = StorageInput::new(key); let length = if input.exists() { codec::Compact::::decode(&mut input)?.0 } else { 0 }; - Ok(Self { marker: sp_std::marker::PhantomData, input, length, read: 0 }) + Ok(Self { marker: core::marker::PhantomData, input, length, read: 0 }) } } -impl sp_std::iter::Iterator for ScaleContainerStreamIter { +impl core::iter::Iterator for ScaleContainerStreamIter { type Item = T; fn next(&mut self) -> Option { @@ -235,7 +235,7 @@ impl StorageInput { /// /// - `key`: The storage key of the storage item that this input will read. fn new(key: Vec) -> Self { - let mut buffer = sp_std::vec![0; STORAGE_INPUT_BUFFER_CAPACITY]; + let mut buffer = alloc::vec![0; STORAGE_INPUT_BUFFER_CAPACITY]; unsafe { buffer.set_len(buffer.capacity()); } @@ -270,7 +270,7 @@ impl StorageInput { sp_io::storage::read(&self.key, &mut self.buffer[present_bytes..], self.offset) { let bytes_read = - sp_std::cmp::min(length_minus_offset as usize, self.buffer.len() - present_bytes); + core::cmp::min(length_minus_offset as usize, self.buffer.len() - present_bytes); let buffer_len = present_bytes + bytes_read; unsafe { self.buffer.set_len(buffer_len); diff --git a/substrate/frame/support/src/storage/types/counted_map.rs b/substrate/frame/support/src/storage/types/counted_map.rs index 0444e269928..9adcb33ae07 100644 --- a/substrate/frame/support/src/storage/types/counted_map.rs +++ b/substrate/frame/support/src/storage/types/counted_map.rs @@ -29,11 +29,11 @@ use crate::{ traits::{Get, GetDefault, StorageInfo, StorageInfoTrait, StorageInstance}, Never, }; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode, EncodeLike, FullCodec, MaxEncodedLen, Ref}; use sp_io::MultiRemovalResults; use sp_metadata_ir::StorageEntryMetadataIR; use sp_runtime::traits::Saturating; -use sp_std::prelude::*; /// A wrapper around a [`StorageMap`] and a [`StorageValue`] (with the value being `u32`) to keep /// track of how many items are in a map, without needing to iterate all the values. diff --git a/substrate/frame/support/src/storage/types/counted_nmap.rs b/substrate/frame/support/src/storage/types/counted_nmap.rs index 51cde93f28c..13c1b10be39 100644 --- a/substrate/frame/support/src/storage/types/counted_nmap.rs +++ b/substrate/frame/support/src/storage/types/counted_nmap.rs @@ -28,10 +28,10 @@ use crate::{ traits::{Get, GetDefault, StorageInfo, StorageInstance}, Never, }; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode, EncodeLike, FullCodec, MaxEncodedLen, Ref}; use sp_metadata_ir::StorageEntryMetadataIR; use sp_runtime::traits::Saturating; -use sp_std::prelude::*; /// A wrapper around a [`StorageNMap`] and a [`StorageValue`] (with the value being `u32`) to keep /// track of how many items are in a map, without needing to iterate all the values. @@ -683,6 +683,7 @@ mod test { hash::{StorageHasher as _, *}, storage::types::{Key as NMapKey, ValueQuery}, }; + use alloc::boxed::Box; use sp_io::{hashing::twox_128, TestExternalities}; use sp_metadata_ir::{StorageEntryModifierIR, StorageEntryTypeIR, StorageHasherIR}; diff --git a/substrate/frame/support/src/storage/types/double_map.rs b/substrate/frame/support/src/storage/types/double_map.rs index 2a7af7a9846..3d227feb902 100644 --- a/substrate/frame/support/src/storage/types/double_map.rs +++ b/substrate/frame/support/src/storage/types/double_map.rs @@ -26,11 +26,11 @@ use crate::{ traits::{Get, GetDefault, StorageInfo, StorageInstance}, StorageHasher, Twox128, }; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode, EncodeLike, FullCodec, MaxEncodedLen}; use frame_support::storage::StorageDecodeNonDedupLength; use sp_arithmetic::traits::SaturatedConversion; use sp_metadata_ir::{StorageEntryMetadataIR, StorageEntryTypeIR}; -use sp_std::prelude::*; /// A type representing a *double map* in storage. This structure associates a pair of keys with a /// value of a specified type stored on-chain. diff --git a/substrate/frame/support/src/storage/types/key.rs b/substrate/frame/support/src/storage/types/key.rs index 90cf09dd1d3..b9b497b61d9 100755 --- a/substrate/frame/support/src/storage/types/key.rs +++ b/substrate/frame/support/src/storage/types/key.rs @@ -18,10 +18,10 @@ //! Storage key type. use crate::hash::{ReversibleStorageHasher, StorageHasher}; +use alloc::{boxed::Box, vec::Vec}; use codec::{Encode, EncodeLike, FullCodec, MaxEncodedLen}; use paste::paste; use scale_info::StaticTypeInfo; -use sp_std::prelude::*; /// A type used exclusively by storage maps as their key type. /// @@ -203,19 +203,19 @@ impl<'a, T: EncodeLike + EncodeLikeTuple, U: Encode> EncodeLikeTuple /// Trait to indicate that a tuple can be converted into an iterator of a vector of encoded bytes. pub trait TupleToEncodedIter { - fn to_encoded_iter(&self) -> sp_std::vec::IntoIter>; + fn to_encoded_iter(&self) -> alloc::vec::IntoIter>; } #[impl_trait_for_tuples::impl_for_tuples(1, 18)] #[tuple_types_custom_trait_bound(Encode)] impl TupleToEncodedIter for Tuple { - fn to_encoded_iter(&self) -> sp_std::vec::IntoIter> { + fn to_encoded_iter(&self) -> alloc::vec::IntoIter> { [for_tuples!( #(self.Tuple.encode()),* )].to_vec().into_iter() } } impl TupleToEncodedIter for &T { - fn to_encoded_iter(&self) -> sp_std::vec::IntoIter> { + fn to_encoded_iter(&self) -> alloc::vec::IntoIter> { (*self).to_encoded_iter() } } @@ -223,7 +223,7 @@ impl TupleToEncodedIter for &T { impl<'a, T: EncodeLike + TupleToEncodedIter, U: Encode> TupleToEncodedIter for codec::Ref<'a, T, U> { - fn to_encoded_iter(&self) -> sp_std::vec::IntoIter> { + fn to_encoded_iter(&self) -> alloc::vec::IntoIter> { use core::ops::Deref as _; self.deref().to_encoded_iter() } diff --git a/substrate/frame/support/src/storage/types/map.rs b/substrate/frame/support/src/storage/types/map.rs index b79a6ae9b84..b70026eea50 100644 --- a/substrate/frame/support/src/storage/types/map.rs +++ b/substrate/frame/support/src/storage/types/map.rs @@ -26,11 +26,11 @@ use crate::{ traits::{Get, GetDefault, StorageInfo, StorageInstance}, StorageHasher, Twox128, }; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode, EncodeLike, FullCodec, MaxEncodedLen}; use frame_support::storage::StorageDecodeNonDedupLength; use sp_arithmetic::traits::SaturatedConversion; use sp_metadata_ir::{StorageEntryMetadataIR, StorageEntryTypeIR}; -use sp_std::prelude::*; /// A type representing a *map* in storage. A *storage map* is a mapping of keys to values of a /// given type stored on-chain. diff --git a/substrate/frame/support/src/storage/types/mod.rs b/substrate/frame/support/src/storage/types/mod.rs index 631410f425d..b063e11621d 100644 --- a/substrate/frame/support/src/storage/types/mod.rs +++ b/substrate/frame/support/src/storage/types/mod.rs @@ -18,9 +18,9 @@ //! Storage types to build abstraction on storage, they implements storage traits such as //! StorageMap and others. +use alloc::vec::Vec; use codec::FullCodec; use sp_metadata_ir::{StorageEntryMetadataIR, StorageEntryModifierIR}; -use sp_std::prelude::*; mod counted_map; mod counted_nmap; @@ -93,7 +93,7 @@ where } /// Implements [`QueryKindTrait`] with `Query` type being `Result`. -pub struct ResultQuery(sp_std::marker::PhantomData); +pub struct ResultQuery(core::marker::PhantomData); impl QueryKindTrait for ResultQuery where Value: FullCodec + 'static, diff --git a/substrate/frame/support/src/storage/types/nmap.rs b/substrate/frame/support/src/storage/types/nmap.rs index 253f02a14f0..c3dfd5b3e48 100755 --- a/substrate/frame/support/src/storage/types/nmap.rs +++ b/substrate/frame/support/src/storage/types/nmap.rs @@ -28,10 +28,10 @@ use crate::{ }, traits::{Get, GetDefault, StorageInfo, StorageInstance}, }; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode, EncodeLike, FullCodec, MaxEncodedLen}; use sp_metadata_ir::{StorageEntryMetadataIR, StorageEntryTypeIR}; use sp_runtime::SaturatedConversion; -use sp_std::prelude::*; /// A type representing an *NMap* in storage. This structure associates an arbitrary number of keys /// with a value of a specified type stored on-chain. @@ -655,6 +655,7 @@ mod test { hash::{StorageHasher as _, *}, storage::types::{Key as NMapKey, ValueQuery}, }; + use alloc::boxed::Box; use sp_io::{hashing::twox_128, TestExternalities}; use sp_metadata_ir::{StorageEntryModifierIR, StorageHasherIR}; diff --git a/substrate/frame/support/src/storage/types/value.rs b/substrate/frame/support/src/storage/types/value.rs index a2d93a6a165..9cc985b36d8 100644 --- a/substrate/frame/support/src/storage/types/value.rs +++ b/substrate/frame/support/src/storage/types/value.rs @@ -25,11 +25,11 @@ use crate::{ }, traits::{Get, GetDefault, StorageInfo, StorageInstance}, }; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode, EncodeLike, FullCodec, MaxEncodedLen}; use frame_support::storage::StorageDecodeNonDedupLength; use sp_arithmetic::traits::SaturatedConversion; use sp_metadata_ir::{StorageEntryMetadataIR, StorageEntryTypeIR}; -use sp_std::prelude::*; /// A type representing a *value* in storage. A *storage value* is a single value of a given type /// stored on-chain. diff --git a/substrate/frame/support/src/storage/unhashed.rs b/substrate/frame/support/src/storage/unhashed.rs index 776c7d0f3c3..7f9bc93d7d8 100644 --- a/substrate/frame/support/src/storage/unhashed.rs +++ b/substrate/frame/support/src/storage/unhashed.rs @@ -17,8 +17,8 @@ //! Operation on unhashed runtime storage. +use alloc::vec::Vec; use codec::{Decode, Encode}; -use sp_std::prelude::*; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get(key: &[u8]) -> Option { diff --git a/substrate/frame/support/src/traits/dynamic_params.rs b/substrate/frame/support/src/traits/dynamic_params.rs index 32dae6799ea..3ef298fc5a5 100644 --- a/substrate/frame/support/src/traits/dynamic_params.rs +++ b/substrate/frame/support/src/traits/dynamic_params.rs @@ -85,7 +85,7 @@ impl AggregatedKeyValue for () { /// /// This concretization is useful when configuring pallets, since a pallet will require a parameter /// store for its own KV type and not the aggregated runtime-wide KV type. -pub struct ParameterStoreAdapter(sp_std::marker::PhantomData<(PS, KV)>); +pub struct ParameterStoreAdapter(core::marker::PhantomData<(PS, KV)>); impl ParameterStore for ParameterStoreAdapter where diff --git a/substrate/frame/support/src/traits/filter.rs b/substrate/frame/support/src/traits/filter.rs index 44f9f136cfc..ff62449847d 100644 --- a/substrate/frame/support/src/traits/filter.rs +++ b/substrate/frame/support/src/traits/filter.rs @@ -18,7 +18,7 @@ //! Traits and associated utilities for dealing with abstract constraint filters. pub use super::members::Contains; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Trait to add a constraint onto the filter. pub trait FilterStack: Contains { @@ -103,7 +103,7 @@ macro_rules! impl_filter_stack { mod $module { #[allow(unused_imports)] use super::*; - use $crate::__private::sp_std::{boxed::Box, cell::RefCell, mem::{swap, take}, vec::Vec}; + use std::{boxed::Box, cell::RefCell, mem::{swap, take}, vec::Vec}; use $crate::traits::filter::{Contains, FilterStack}; thread_local! { diff --git a/substrate/frame/support/src/traits/hooks.rs b/substrate/frame/support/src/traits/hooks.rs index 1a687cade79..012a74d0ae9 100644 --- a/substrate/frame/support/src/traits/hooks.rs +++ b/substrate/frame/support/src/traits/hooks.rs @@ -24,9 +24,10 @@ use crate::weights::Weight; use impl_trait_for_tuples::impl_for_tuples; use sp_runtime::traits::AtLeast32BitUnsigned; -use sp_std::prelude::*; use sp_weights::WeightMeter; +#[cfg(feature = "try-runtime")] +use alloc::vec::Vec; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; @@ -707,7 +708,7 @@ mod tests { #[test] fn on_idle_round_robin_works() { - static mut ON_IDLE_INVOCATION_ORDER: sp_std::vec::Vec<&str> = sp_std::vec::Vec::new(); + static mut ON_IDLE_INVOCATION_ORDER: alloc::vec::Vec<&str> = alloc::vec::Vec::new(); struct Test1; struct Test2; diff --git a/substrate/frame/support/src/traits/members.rs b/substrate/frame/support/src/traits/members.rs index 53de84ab224..89b6b6cdfad 100644 --- a/substrate/frame/support/src/traits/members.rs +++ b/substrate/frame/support/src/traits/members.rs @@ -17,10 +17,11 @@ //! Traits for dealing with the idea of membership. +use alloc::vec::Vec; +use core::marker::PhantomData; use impl_trait_for_tuples::impl_for_tuples; use sp_arithmetic::traits::AtLeast16BitUnsigned; use sp_runtime::DispatchResult; -use sp_std::{marker::PhantomData, prelude::*}; /// A trait for querying whether a type can be said to "contain" a value. pub trait Contains { diff --git a/substrate/frame/support/src/traits/messages.rs b/substrate/frame/support/src/traits/messages.rs index 3f8d80f5c6b..d2871623711 100644 --- a/substrate/frame/support/src/traits/messages.rs +++ b/substrate/frame/support/src/traits/messages.rs @@ -19,10 +19,10 @@ use super::storage::Footprint; use codec::{Decode, Encode, FullCodec, MaxEncodedLen}; +use core::{fmt::Debug, marker::PhantomData}; use scale_info::TypeInfo; use sp_core::{ConstU32, Get, TypedGet}; use sp_runtime::{traits::Convert, BoundedSlice, RuntimeDebug}; -use sp_std::{fmt::Debug, marker::PhantomData, prelude::*}; use sp_weights::{Weight, WeightMeter}; /// Errors that can happen when attempting to process a message with diff --git a/substrate/frame/support/src/traits/metadata.rs b/substrate/frame/support/src/traits/metadata.rs index 8bda4186bc9..1e46470a391 100644 --- a/substrate/frame/support/src/traits/metadata.rs +++ b/substrate/frame/support/src/traits/metadata.rs @@ -17,10 +17,11 @@ //! Traits for managing information attached to pallets and their constituents. +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; +use core::ops::Add; use impl_trait_for_tuples::impl_for_tuples; use sp_runtime::RuntimeDebug; -use sp_std::{ops::Add, prelude::*}; /// Provides information about the pallet itself and its setup in the runtime. /// @@ -146,16 +147,16 @@ impl CrateVersion { } } -impl sp_std::cmp::Ord for CrateVersion { - fn cmp(&self, other: &Self) -> sp_std::cmp::Ordering { +impl Ord for CrateVersion { + fn cmp(&self, other: &Self) -> core::cmp::Ordering { self.major .cmp(&other.major) .then_with(|| self.minor.cmp(&other.minor).then_with(|| self.patch.cmp(&other.patch))) } } -impl sp_std::cmp::PartialOrd for CrateVersion { - fn partial_cmp(&self, other: &Self) -> Option { +impl PartialOrd for CrateVersion { + fn partial_cmp(&self, other: &Self) -> Option { Some(::cmp(self, other)) } } @@ -248,7 +249,7 @@ impl PartialEq for StorageVersion { } impl PartialOrd for StorageVersion { - fn partial_cmp(&self, other: &u16) -> Option { + fn partial_cmp(&self, other: &u16) -> Option { Some(self.0.cmp(other)) } } diff --git a/substrate/frame/support/src/traits/misc.rs b/substrate/frame/support/src/traits/misc.rs index bc7407a7be6..7c8c22d1ae5 100644 --- a/substrate/frame/support/src/traits/misc.rs +++ b/substrate/frame/support/src/traits/misc.rs @@ -18,19 +18,20 @@ //! Smaller traits used in FRAME which don't need their own file. use crate::dispatch::{DispatchResult, Parameter}; +use alloc::{vec, vec::Vec}; use codec::{CompactLen, Decode, DecodeLimit, Encode, EncodeLike, Input, MaxEncodedLen}; use impl_trait_for_tuples::impl_for_tuples; use scale_info::{build::Fields, meta_type, Path, Type, TypeInfo, TypeParameter}; use sp_arithmetic::traits::{CheckedAdd, CheckedMul, CheckedSub, One, Saturating}; use sp_core::bounded::bounded_vec::TruncateFrom; +use core::cmp::Ordering; #[doc(hidden)] pub use sp_runtime::traits::{ ConstBool, ConstI128, ConstI16, ConstI32, ConstI64, ConstI8, ConstU128, ConstU16, ConstU32, ConstU64, ConstU8, Get, GetDefault, TryCollect, TypedGet, }; use sp_runtime::{traits::Block as BlockT, DispatchError}; -use sp_std::{cmp::Ordering, prelude::*}; #[doc(hidden)] pub const DEFENSIVE_OP_PUBLIC_ERROR: &str = "a defensive failure has been triggered; please report the block number at https://github.com/paritytech/substrate/issues"; @@ -48,7 +49,7 @@ impl VariantCount for () { } /// Adapter for `Get` to access `VARIANT_COUNT` from `trait pub trait VariantCount {`. -pub struct VariantCountOf(sp_std::marker::PhantomData); +pub struct VariantCountOf(core::marker::PhantomData); impl Get for VariantCountOf { fn get() -> u32 { T::VARIANT_COUNT @@ -190,10 +191,10 @@ pub trait DefensiveOption { /// Defensively transform this option to a result, mapping `None` to the return value of an /// error closure. - fn defensive_ok_or_else E>(self, err: F) -> Result; + fn defensive_ok_or_else E>(self, err: F) -> Result; /// Defensively transform this option to a result, mapping `None` to a default value. - fn defensive_ok_or(self, err: E) -> Result; + fn defensive_ok_or(self, err: E) -> Result; /// Exactly the same as `map`, but it prints the appropriate warnings if the value being mapped /// is `None`. @@ -252,7 +253,7 @@ impl Defensive for Option { } } -impl Defensive for Result { +impl Defensive for Result { fn defensive_unwrap_or(self, or: T) -> T { match self { Ok(inner) => inner, @@ -307,7 +308,7 @@ impl Defensive for Result { } } -impl DefensiveResult for Result { +impl DefensiveResult for Result { fn defensive_map_err F>(self, o: O) -> Result { self.map_err(|e| { defensive!(e); @@ -357,7 +358,7 @@ impl DefensiveOption for Option { ) } - fn defensive_ok_or_else E>(self, err: F) -> Result { + fn defensive_ok_or_else E>(self, err: F) -> Result { self.ok_or_else(|| { let err_value = err(); defensive!(err_value); @@ -365,7 +366,7 @@ impl DefensiveOption for Option { }) } - fn defensive_ok_or(self, err: E) -> Result { + fn defensive_ok_or(self, err: E) -> Result { self.ok_or_else(|| { defensive!(err); err @@ -416,11 +417,11 @@ impl DefensiveSatura } fn defensive_saturating_accrue(&mut self, other: Self) { // Use `replace` here since `take` would require `T: Default`. - *self = sp_std::mem::replace(self, One::one()).defensive_saturating_add(other); + *self = core::mem::replace(self, One::one()).defensive_saturating_add(other); } fn defensive_saturating_reduce(&mut self, other: Self) { // Use `replace` here since `take` would require `T: Default`. - *self = sp_std::mem::replace(self, One::one()).defensive_saturating_sub(other); + *self = core::mem::replace(self, One::one()).defensive_saturating_sub(other); } fn defensive_saturating_inc(&mut self) { self.defensive_saturating_accrue(One::one()); @@ -510,7 +511,7 @@ pub trait DefensiveMin { impl DefensiveMin for T where - T: sp_std::cmp::PartialOrd, + T: PartialOrd, { fn defensive_min(self, other: T) -> Self { if self <= other { @@ -574,7 +575,7 @@ pub trait DefensiveMax { impl DefensiveMax for T where - T: sp_std::cmp::PartialOrd, + T: PartialOrd, { fn defensive_max(self, other: T) -> Self { if self >= other { @@ -1050,7 +1051,7 @@ impl TypeInfo for WrapperOpaque { #[derive(Debug, Eq, PartialEq, Default, Clone)] pub struct WrapperKeepOpaque { data: Vec, - _phantom: sp_std::marker::PhantomData, + _phantom: core::marker::PhantomData, } impl WrapperKeepOpaque { @@ -1073,7 +1074,7 @@ impl WrapperKeepOpaque { /// Create from the given encoded `data`. pub fn from_encoded(data: Vec) -> Self { - Self { data, _phantom: sp_std::marker::PhantomData } + Self { data, _phantom: core::marker::PhantomData } } } @@ -1100,7 +1101,7 @@ impl Encode for WrapperKeepOpaque { impl Decode for WrapperKeepOpaque { fn decode(input: &mut I) -> Result { - Ok(Self { data: Vec::::decode(input)?, _phantom: sp_std::marker::PhantomData }) + Ok(Self { data: Vec::::decode(input)?, _phantom: core::marker::PhantomData }) } fn skip(input: &mut I) -> Result<(), codec::Error> { @@ -1212,8 +1213,8 @@ pub trait AccountTouch { #[cfg(test)] mod test { use super::*; + use core::marker::PhantomData; use sp_core::bounded::{BoundedSlice, BoundedVec}; - use sp_std::marker::PhantomData; #[test] fn defensive_assert_works() { diff --git a/substrate/frame/support/src/traits/preimages.rs b/substrate/frame/support/src/traits/preimages.rs index 647af029c16..80020d8d008 100644 --- a/substrate/frame/support/src/traits/preimages.rs +++ b/substrate/frame/support/src/traits/preimages.rs @@ -17,6 +17,7 @@ //! Stuff for dealing with hashed preimages. +use alloc::borrow::Cow; use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; use scale_info::TypeInfo; use sp_core::RuntimeDebug; @@ -24,7 +25,6 @@ use sp_runtime::{ traits::{ConstU32, Hash}, DispatchError, }; -use sp_std::borrow::Cow; pub type BoundedInline = crate::BoundedVec>; @@ -37,7 +37,7 @@ pub enum Bounded { /// A hash with no preimage length. We do not support creation of this except /// for transitioning from legacy state. In the future we will make this a pure /// `Dummy` item storing only the final `dummy` field. - Legacy { hash: H::Output, dummy: sp_std::marker::PhantomData }, + Legacy { hash: H::Output, dummy: core::marker::PhantomData }, /// A an bounded `Call`. Its encoding must be at most 128 bytes. Inline(BoundedInline), /// A hash of the call together with an upper limit for its size.` @@ -61,7 +61,7 @@ impl Bounded { { use Bounded::*; match self { - Legacy { hash, .. } => Legacy { hash, dummy: sp_std::marker::PhantomData }, + Legacy { hash, .. } => Legacy { hash, dummy: core::marker::PhantomData }, Inline(x) => Inline(x), Lookup { hash, len } => Lookup { hash, len }, } @@ -123,7 +123,7 @@ impl Bounded { /// Constructs a `Legacy` bounded item. #[deprecated = "This API is only for transitioning to Scheduler v3 API"] pub fn from_legacy_hash(hash: impl Into) -> Self { - Self::Legacy { hash: hash.into(), dummy: sp_std::marker::PhantomData } + Self::Legacy { hash: hash.into(), dummy: core::marker::PhantomData } } } diff --git a/substrate/frame/support/src/traits/schedule.rs b/substrate/frame/support/src/traits/schedule.rs index f41c73fe69a..a302e28d4ce 100644 --- a/substrate/frame/support/src/traits/schedule.rs +++ b/substrate/frame/support/src/traits/schedule.rs @@ -19,10 +19,11 @@ #[allow(deprecated)] use super::PreimageProvider; +use alloc::vec::Vec; use codec::{Codec, Decode, Encode, EncodeLike, MaxEncodedLen}; +use core::{fmt::Debug, result::Result}; use scale_info::TypeInfo; use sp_runtime::{traits::Saturating, DispatchError, RuntimeDebug}; -use sp_std::{fmt::Debug, prelude::*, result::Result}; /// Information relating to the period of a scheduled task. First item is the length of the /// period and the second is the number of times it should be executed in total before the task @@ -182,7 +183,7 @@ pub mod v1 { /// A type that can be used as a scheduler. pub trait Named { /// An address which can be used for removing a scheduled task. - type Address: Codec + Clone + Eq + EncodeLike + sp_std::fmt::Debug + MaxEncodedLen; + type Address: Codec + Clone + Eq + EncodeLike + core::fmt::Debug + MaxEncodedLen; /// Schedule a dispatch to happen at the beginning of some block in the future. /// @@ -353,7 +354,7 @@ pub mod v2 { /// A type that can be used as a scheduler. pub trait Named { /// An address which can be used for removing a scheduled task. - type Address: Codec + Clone + Eq + EncodeLike + sp_std::fmt::Debug + MaxEncodedLen; + type Address: Codec + Clone + Eq + EncodeLike + core::fmt::Debug + MaxEncodedLen; /// A means of expressing a call by the hash of its encoded data. type Hash; @@ -448,7 +449,7 @@ pub mod v3 { /// A type that can be used as a scheduler. pub trait Named { /// An address which can be used for removing a scheduled task. - type Address: Codec + MaxEncodedLen + Clone + Eq + EncodeLike + sp_std::fmt::Debug; + type Address: Codec + MaxEncodedLen + Clone + Eq + EncodeLike + core::fmt::Debug; /// The hasher used in the runtime. type Hasher: sp_runtime::traits::Hash; diff --git a/substrate/frame/support/src/traits/storage.rs b/substrate/frame/support/src/traits/storage.rs index 875ff56bea1..22fb28e4c0e 100644 --- a/substrate/frame/support/src/traits/storage.rs +++ b/substrate/frame/support/src/traits/storage.rs @@ -17,6 +17,7 @@ //! Traits for encoding data related to pallet's storage items. +use alloc::{collections::btree_set::BTreeSet, vec, vec::Vec}; use codec::{Encode, FullCodec, MaxEncodedLen}; use core::marker::PhantomData; use impl_trait_for_tuples::impl_for_tuples; @@ -27,7 +28,6 @@ use sp_runtime::{ traits::{Convert, Member, Saturating}, DispatchError, RuntimeDebug, }; -use sp_std::{collections::btree_set::BTreeSet, prelude::*}; /// An instance of a pallet in the storage. /// diff --git a/substrate/frame/support/src/traits/tasks.rs b/substrate/frame/support/src/traits/tasks.rs index 42b837e5597..0b5d0c08250 100644 --- a/substrate/frame/support/src/traits/tasks.rs +++ b/substrate/frame/support/src/traits/tasks.rs @@ -18,20 +18,22 @@ //! Contains the [`Task`] trait, which defines a general-purpose way for defining and executing //! service work, and supporting types. +use alloc::{vec, vec::IntoIter}; use codec::FullCodec; +use core::{fmt::Debug, iter::Iterator}; use scale_info::TypeInfo; use sp_runtime::DispatchError; -use sp_std::{fmt::Debug, iter::Iterator, vec, vec::IntoIter}; use sp_weights::Weight; /// Contain's re-exports of all the supporting types for the [`Task`] trait. Used in the macro /// expansion of `RuntimeTask`. #[doc(hidden)] pub mod __private { + pub use alloc::{vec, vec::IntoIter}; pub use codec::FullCodec; + pub use core::{fmt::Debug, iter::Iterator}; pub use scale_info::TypeInfo; pub use sp_runtime::DispatchError; - pub use sp_std::{fmt::Debug, iter::Iterator, vec, vec::IntoIter}; pub use sp_weights::Weight; } diff --git a/substrate/frame/support/src/traits/tokens/currency/reservable.rs b/substrate/frame/support/src/traits/tokens/currency/reservable.rs index ff8b0c6eea8..60ea9a71805 100644 --- a/substrate/frame/support/src/traits/tokens/currency/reservable.rs +++ b/substrate/frame/support/src/traits/tokens/currency/reservable.rs @@ -242,7 +242,7 @@ pub trait NamedReservableCurrency: ReservableCurrency { /// /// All "anonymous" operations are then implemented as their named counterparts with the given `Id`. pub struct WithName( - sp_std::marker::PhantomData<(NamedReservable, Id, AccountId)>, + core::marker::PhantomData<(NamedReservable, Id, AccountId)>, ); impl< NamedReservable: NamedReservableCurrency, diff --git a/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs b/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs index 020dffe28c8..41907b2aa00 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs @@ -26,9 +26,9 @@ use crate::traits::{ misc::{SameOrOther, TryDrop}, tokens::{AssetId, Balance}, }; +use core::marker::PhantomData; use frame_support_procedural::{EqNoBound, PartialEqNoBound, RuntimeDebugNoBound}; use sp_runtime::traits::Zero; -use sp_std::marker::PhantomData; /// Handler for when an imbalance gets dropped. This could handle either a credit (negative) or /// debt (positive) imbalance. @@ -93,7 +93,7 @@ impl, OppositeOnDrop: HandleImbalance /// Forget the imbalance without invoking the on-drop handler. pub(crate) fn forget(imbalance: Self) { - sp_std::mem::forget(imbalance); + core::mem::forget(imbalance); } } @@ -108,7 +108,7 @@ impl, OppositeOnDrop: HandleImbalance fn drop_zero(self) -> Result<(), Self> { if self.amount.is_zero() { - sp_std::mem::forget(self); + core::mem::forget(self); Ok(()) } else { Err(self) @@ -118,7 +118,7 @@ impl, OppositeOnDrop: HandleImbalance fn split(self, amount: B) -> (Self, Self) { let first = self.amount.min(amount); let second = self.amount - first; - sp_std::mem::forget(self); + core::mem::forget(self); (Imbalance::new(first), Imbalance::new(second)) } @@ -130,19 +130,19 @@ impl, OppositeOnDrop: HandleImbalance fn merge(mut self, other: Self) -> Self { self.amount = self.amount.saturating_add(other.amount); - sp_std::mem::forget(other); + core::mem::forget(other); self } fn subsume(&mut self, other: Self) { self.amount = self.amount.saturating_add(other.amount); - sp_std::mem::forget(other); + core::mem::forget(other); } fn offset( self, other: Imbalance, ) -> SameOrOther> { let (a, b) = (self.amount, other.amount); - sp_std::mem::forget((self, other)); + core::mem::forget((self, other)); if a == b { SameOrOther::None diff --git a/substrate/frame/support/src/traits/tokens/fungible/item_of.rs b/substrate/frame/support/src/traits/tokens/fungible/item_of.rs index 2aa53d622db..c9f366911a8 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/item_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/item_of.rs @@ -39,7 +39,7 @@ pub struct ItemOf< F: fungibles::Inspect, A: Get<>::AssetId>, AccountId, ->(sp_std::marker::PhantomData<(F, A, AccountId)>); +>(core::marker::PhantomData<(F, A, AccountId)>); impl< F: fungibles::Inspect, @@ -361,7 +361,7 @@ impl< } pub struct ConvertImbalanceDropHandler( - sp_std::marker::PhantomData<(AccountId, Balance, AssetIdType, AssetId, Handler)>, + core::marker::PhantomData<(AccountId, Balance, AssetIdType, AssetId, Handler)>, ); impl< diff --git a/substrate/frame/support/src/traits/tokens/fungible/mod.rs b/substrate/frame/support/src/traits/tokens/fungible/mod.rs index a113cb01c98..f40e494b930 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/mod.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/mod.rs @@ -65,7 +65,7 @@ //! "stack". This means that if an account has 3 freezes for 100 units, the account can spend its //! funds for any reason down to 100 units, at which point the freezes will start to come into //! play. -//! +//! //! It's important to note that the frozen balance can exceed the total balance of the account. //! This is useful, eg, in cases where you want to prevent a user from transferring any fund. In //! such a case, setting the frozen balance to `Balance::MAX` would serve that purpose @@ -161,9 +161,9 @@ mod regular; mod union_of; use codec::{Decode, Encode, MaxEncodedLen}; +use core::marker::PhantomData; use frame_support_procedural::{CloneNoBound, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound}; use scale_info::TypeInfo; -use sp_std::marker::PhantomData; use super::{ Fortitude::{Force, Polite}, diff --git a/substrate/frame/support/src/traits/tokens/fungible/regular.rs b/substrate/frame/support/src/traits/tokens/fungible/regular.rs index c46614be473..54a04444649 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/regular.rs @@ -36,9 +36,9 @@ use crate::{ SameOrOther, TryDrop, }, }; +use core::marker::PhantomData; use sp_arithmetic::traits::{CheckedAdd, CheckedSub, One}; use sp_runtime::{traits::Saturating, ArithmeticError, DispatchError, TokenError}; -use sp_std::marker::PhantomData; use super::{Credit, Debt, HandleImbalanceDrop, Imbalance}; diff --git a/substrate/frame/support/src/traits/tokens/fungible/union_of.rs b/substrate/frame/support/src/traits/tokens/fungible/union_of.rs index 63791b05223..3adbbdda314 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/union_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/union_of.rs @@ -21,6 +21,7 @@ //! See the [`crate::traits::fungible`] doc for more information about fungible traits. use codec::{Decode, Encode, MaxEncodedLen}; +use core::cmp::Ordering; use frame_support::traits::{ fungible::imbalance, tokens::{ @@ -36,7 +37,6 @@ use sp_runtime::{ Either::{Left, Right}, RuntimeDebug, }; -use sp_std::cmp::Ordering; /// The `NativeOrWithId` enum classifies an asset as either `Native` to the current chain or as an /// asset with a specific ID. @@ -101,7 +101,7 @@ impl Convert, Either<(), AssetId>> for Nat /// - `AssetKind` is a superset type encompassing asset kinds from `Left` and `Right` sets. /// - `AccountId` is an account identifier type. pub struct UnionOf( - sp_std::marker::PhantomData<(Left, Right, Criterion, AssetKind, AccountId)>, + core::marker::PhantomData<(Left, Right, Criterion, AssetKind, AccountId)>, ); impl< @@ -664,7 +664,7 @@ pub struct ConvertImbalanceDropHandler< Balance, AssetId, AccountId, ->(sp_std::marker::PhantomData<(Left, Right, Criterion, AssetKind, Balance, AssetId, AccountId)>); +>(core::marker::PhantomData<(Left, Right, Criterion, AssetKind, Balance, AssetId, AccountId)>); impl< Left: fungible::HandleImbalanceDrop, diff --git a/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs b/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs index bb0d83721a4..c3b213cc8fc 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs @@ -26,9 +26,9 @@ use crate::traits::{ misc::{SameOrOther, TryDrop}, tokens::{imbalance::Imbalance as ImbalanceT, AssetId, Balance}, }; +use core::marker::PhantomData; use frame_support_procedural::{EqNoBound, PartialEqNoBound, RuntimeDebugNoBound}; use sp_runtime::traits::Zero; -use sp_std::marker::PhantomData; /// Handler for when an imbalance gets dropped. This could handle either a credit (negative) or /// debt (positive) imbalance. @@ -98,12 +98,12 @@ impl< /// Forget the imbalance without invoking the on-drop handler. pub(crate) fn forget(imbalance: Self) { - sp_std::mem::forget(imbalance); + core::mem::forget(imbalance); } pub fn drop_zero(self) -> Result<(), Self> { if self.amount.is_zero() { - sp_std::mem::forget(self); + core::mem::forget(self); Ok(()) } else { Err(self) @@ -114,7 +114,7 @@ impl< let first = self.amount.min(amount); let second = self.amount - first; let asset = self.asset.clone(); - sp_std::mem::forget(self); + core::mem::forget(self); (Imbalance::new(asset.clone(), first), Imbalance::new(asset, second)) } @@ -129,7 +129,7 @@ impl< pub fn merge(mut self, other: Self) -> Result { if self.asset == other.asset { self.amount = self.amount.saturating_add(other.amount); - sp_std::mem::forget(other); + core::mem::forget(other); Ok(self) } else { Err((self, other)) @@ -138,7 +138,7 @@ impl< pub fn subsume(&mut self, other: Self) -> Result<(), Self> { if self.asset == other.asset { self.amount = self.amount.saturating_add(other.amount); - sp_std::mem::forget(other); + core::mem::forget(other); Ok(()) } else { Err(other) @@ -154,7 +154,7 @@ impl< if self.asset == other.asset { let (a, b) = (self.amount, other.amount); let asset = self.asset.clone(); - sp_std::mem::forget((self, other)); + core::mem::forget((self, other)); if a == b { Ok(SameOrOther::None) diff --git a/substrate/frame/support/src/traits/tokens/fungibles/metadata.rs b/substrate/frame/support/src/traits/tokens/fungibles/metadata.rs index ab722426dad..27f663e5750 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/metadata.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/metadata.rs @@ -20,7 +20,7 @@ //! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. use crate::dispatch::DispatchResult; -use sp_std::vec::Vec; +use alloc::vec::Vec; pub trait Inspect: super::Inspect { // Get name for an AssetId. diff --git a/substrate/frame/support/src/traits/tokens/fungibles/regular.rs b/substrate/frame/support/src/traits/tokens/fungibles/regular.rs index 946c4756cff..3985da7856d 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/regular.rs @@ -19,7 +19,7 @@ //! //! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. -use sp_std::marker::PhantomData; +use core::marker::PhantomData; use crate::{ ensure, diff --git a/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs b/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs index f4259a78f0a..77047150e00 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs @@ -41,7 +41,7 @@ use sp_runtime::{ /// - `AssetKind` is a superset type encompassing asset kinds from `Left` and `Right` sets. /// - `AccountId` is an account identifier type. pub struct UnionOf( - sp_std::marker::PhantomData<(Left, Right, Criterion, AssetKind, AccountId)>, + core::marker::PhantomData<(Left, Right, Criterion, AssetKind, AccountId)>, ); impl< @@ -622,7 +622,7 @@ pub struct ConvertImbalanceDropHandler< Balance, AccountId, >( - sp_std::marker::PhantomData<( + core::marker::PhantomData<( Left, Right, LeftAssetId, diff --git a/substrate/frame/support/src/traits/tokens/imbalance/on_unbalanced.rs b/substrate/frame/support/src/traits/tokens/imbalance/on_unbalanced.rs index ecb8de8841f..4bf9af3fbb1 100644 --- a/substrate/frame/support/src/traits/tokens/imbalance/on_unbalanced.rs +++ b/substrate/frame/support/src/traits/tokens/imbalance/on_unbalanced.rs @@ -17,9 +17,9 @@ //! Trait for handling imbalances. +use core::marker::PhantomData; use frame_support::traits::{fungible, fungibles, misc::TryDrop}; use sp_core::TypedGet; -use sp_std::marker::PhantomData; /// Handler for when some currency "account" decreased in balance for /// some reason. diff --git a/substrate/frame/support/src/traits/tokens/imbalance/signed_imbalance.rs b/substrate/frame/support/src/traits/tokens/imbalance/signed_imbalance.rs index 03e821b161b..eec892cc311 100644 --- a/substrate/frame/support/src/traits/tokens/imbalance/signed_imbalance.rs +++ b/substrate/frame/support/src/traits/tokens/imbalance/signed_imbalance.rs @@ -20,8 +20,8 @@ use super::super::imbalance::Imbalance; use crate::traits::misc::SameOrOther; use codec::FullCodec; +use core::fmt::Debug; use sp_runtime::traits::{AtLeast32BitUnsigned, MaybeSerializeDeserialize}; -use sp_std::fmt::Debug; /// Either a positive or a negative imbalance. pub enum SignedImbalance> { diff --git a/substrate/frame/support/src/traits/tokens/imbalance/split_two_ways.rs b/substrate/frame/support/src/traits/tokens/imbalance/split_two_ways.rs index 59a582389ba..d79ae562ec6 100644 --- a/substrate/frame/support/src/traits/tokens/imbalance/split_two_ways.rs +++ b/substrate/frame/support/src/traits/tokens/imbalance/split_two_ways.rs @@ -18,8 +18,8 @@ //! Means for splitting an imbalance into two and handling them differently. use super::super::imbalance::{Imbalance, OnUnbalanced}; +use core::{marker::PhantomData, ops::Div}; use sp_runtime::traits::Saturating; -use sp_std::{marker::PhantomData, ops::Div}; /// Split an unbalanced amount two ways between a common divisor. pub struct SplitTwoWays( diff --git a/substrate/frame/support/src/traits/tokens/misc.rs b/substrate/frame/support/src/traits/tokens/misc.rs index e1ff1e058ae..9fa1df86209 100644 --- a/substrate/frame/support/src/traits/tokens/misc.rs +++ b/substrate/frame/support/src/traits/tokens/misc.rs @@ -19,13 +19,13 @@ use crate::{traits::Contains, TypeInfo}; use codec::{Decode, Encode, FullCodec, MaxEncodedLen}; +use core::fmt::Debug; use sp_arithmetic::traits::{AtLeast32BitUnsigned, Zero}; use sp_core::RuntimeDebug; use sp_runtime::{ traits::{Convert, MaybeSerializeDeserialize}, ArithmeticError, DispatchError, TokenError, }; -use sp_std::fmt::Debug; /// The origin of funds to be used for a deposit operation. #[derive(Copy, Clone, RuntimeDebug, Eq, PartialEq)] @@ -351,7 +351,7 @@ pub trait GetSalary { } /// Adapter for a rank-to-salary `Convert` implementation into a `GetSalary` implementation. -pub struct ConvertRank(sp_std::marker::PhantomData); +pub struct ConvertRank(core::marker::PhantomData); impl> GetSalary for ConvertRank { fn get_salary(rank: R, _: &A) -> B { C::convert(rank) diff --git a/substrate/frame/support/src/traits/tokens/nonfungible.rs b/substrate/frame/support/src/traits/tokens/nonfungible.rs index e3fc84f1d57..249f84b2275 100644 --- a/substrate/frame/support/src/traits/tokens/nonfungible.rs +++ b/substrate/frame/support/src/traits/tokens/nonfungible.rs @@ -26,9 +26,9 @@ use super::nonfungibles; use crate::{dispatch::DispatchResult, traits::Get}; +use alloc::vec::Vec; use codec::{Decode, Encode}; use sp_runtime::TokenError; -use sp_std::prelude::*; /// Trait for providing an interface to a read-only NFT-like set of items. pub trait Inspect { @@ -125,7 +125,7 @@ pub struct ItemOf< F: nonfungibles::Inspect, A: Get<>::CollectionId>, AccountId, ->(sp_std::marker::PhantomData<(F, A, AccountId)>); +>(core::marker::PhantomData<(F, A, AccountId)>); impl< F: nonfungibles::Inspect, diff --git a/substrate/frame/support/src/traits/tokens/nonfungible_v2.rs b/substrate/frame/support/src/traits/tokens/nonfungible_v2.rs index 05f76e2859d..5775162e34e 100644 --- a/substrate/frame/support/src/traits/tokens/nonfungible_v2.rs +++ b/substrate/frame/support/src/traits/tokens/nonfungible_v2.rs @@ -29,9 +29,9 @@ use crate::{ dispatch::{DispatchResult, Parameter}, traits::Get, }; +use alloc::vec::Vec; use codec::{Decode, Encode}; use sp_runtime::TokenError; -use sp_std::prelude::*; /// Trait for providing an interface to a read-only NFT-like item. pub trait Inspect { @@ -207,7 +207,7 @@ pub struct ItemOf< F: nonfungibles::Inspect, A: Get<>::CollectionId>, AccountId, ->(sp_std::marker::PhantomData<(F, A, AccountId)>); +>(core::marker::PhantomData<(F, A, AccountId)>); impl< F: nonfungibles::Inspect, diff --git a/substrate/frame/support/src/traits/tokens/nonfungibles.rs b/substrate/frame/support/src/traits/tokens/nonfungibles.rs index 615e79c29c8..22358cf806f 100644 --- a/substrate/frame/support/src/traits/tokens/nonfungibles.rs +++ b/substrate/frame/support/src/traits/tokens/nonfungibles.rs @@ -28,9 +28,9 @@ //! `nonfungible` traits by using the `nonfungible::ItemOf` type adapter. use crate::dispatch::DispatchResult; +use alloc::vec::Vec; use codec::{Decode, Encode}; use sp_runtime::{DispatchError, TokenError}; -use sp_std::prelude::*; /// Trait for providing an interface to many read-only NFT-like sets of items. pub trait Inspect { diff --git a/substrate/frame/support/src/traits/tokens/nonfungibles_v2.rs b/substrate/frame/support/src/traits/tokens/nonfungibles_v2.rs index c0209b6d512..edf1c2b8023 100644 --- a/substrate/frame/support/src/traits/tokens/nonfungibles_v2.rs +++ b/substrate/frame/support/src/traits/tokens/nonfungibles_v2.rs @@ -28,9 +28,9 @@ //! `nonfungible` traits by using the `nonfungible::ItemOf` type adapter. use crate::dispatch::{DispatchResult, Parameter}; +use alloc::vec::Vec; use codec::{Decode, Encode}; use sp_runtime::{DispatchError, TokenError}; -use sp_std::prelude::*; /// Trait for providing an interface to many read-only NFT-like sets of items. pub trait Inspect { diff --git a/substrate/frame/support/src/traits/tokens/pay.rs b/substrate/frame/support/src/traits/tokens/pay.rs index 62d7a056a3f..5a7ed4d6aa1 100644 --- a/substrate/frame/support/src/traits/tokens/pay.rs +++ b/substrate/frame/support/src/traits/tokens/pay.rs @@ -18,10 +18,10 @@ //! The Pay trait and associated types. use codec::{Decode, Encode, FullCodec, MaxEncodedLen}; +use core::fmt::Debug; use scale_info::TypeInfo; use sp_core::{RuntimeDebug, TypedGet}; use sp_runtime::DispatchError; -use sp_std::fmt::Debug; use super::{fungible, fungibles, Balance, Preservation::Expendable}; diff --git a/substrate/frame/support/src/traits/try_runtime/decode_entire_state.rs b/substrate/frame/support/src/traits/try_runtime/decode_entire_state.rs index d5dc93fcf28..8dbeecd8e86 100644 --- a/substrate/frame/support/src/traits/try_runtime/decode_entire_state.rs +++ b/substrate/frame/support/src/traits/try_runtime/decode_entire_state.rs @@ -26,10 +26,10 @@ use crate::{ traits::{PartialStorageInfoTrait, StorageInfo}, StorageHasher, }; +use alloc::{vec, vec::Vec}; use codec::{Decode, DecodeAll, FullCodec}; use impl_trait_for_tuples::impl_for_tuples; use sp_core::Get; -use sp_std::prelude::*; /// Decode the entire data under the given storage type. /// @@ -82,8 +82,8 @@ impl core::fmt::Display for TryDecodeEntireStorageError { write!( f, "`{}::{}` key `{}` is undecodable", - &sp_std::str::from_utf8(&self.info.pallet_name).unwrap_or(""), - &sp_std::str::from_utf8(&self.info.storage_name).unwrap_or(""), + &alloc::str::from_utf8(&self.info.pallet_name).unwrap_or(""), + &alloc::str::from_utf8(&self.info.storage_name).unwrap_or(""), array_bytes::bytes2hex("0x", &self.key) ) } diff --git a/substrate/frame/support/src/traits/try_runtime/mod.rs b/substrate/frame/support/src/traits/try_runtime/mod.rs index c1bf1feb19e..09c33c01440 100644 --- a/substrate/frame/support/src/traits/try_runtime/mod.rs +++ b/substrate/frame/support/src/traits/try_runtime/mod.rs @@ -22,10 +22,10 @@ pub use decode_entire_state::{TryDecodeEntireStorage, TryDecodeEntireStorageErro use super::StorageInstance; +use alloc::vec::Vec; use impl_trait_for_tuples::impl_for_tuples; use sp_arithmetic::traits::AtLeast32BitUnsigned; use sp_runtime::TryRuntimeError; -use sp_std::prelude::*; /// Which state tests to execute. #[derive(codec::Encode, codec::Decode, Clone, scale_info::TypeInfo)] @@ -55,15 +55,15 @@ impl Default for Select { } } -impl sp_std::fmt::Debug for Select { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for Select { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { Select::RoundRobin(x) => write!(f, "RoundRobin({})", x), Select::Only(x) => write!( f, "Only({:?})", x.iter() - .map(|x| sp_std::str::from_utf8(x).unwrap_or("")) + .map(|x| alloc::str::from_utf8(x).unwrap_or("")) .collect::>(), ), Select::All => write!(f, "All"), @@ -73,7 +73,7 @@ impl sp_std::fmt::Debug for Select { } #[cfg(feature = "std")] -impl sp_std::str::FromStr for Select { +impl std::str::FromStr for Select { type Err = &'static str; fn from_str(s: &str) -> Result { match s { @@ -153,9 +153,7 @@ pub trait TryState { #[cfg_attr(all(not(feature = "tuples-96"), not(feature = "tuples-128")), impl_for_tuples(64))] #[cfg_attr(all(feature = "tuples-96", not(feature = "tuples-128")), impl_for_tuples(96))] #[cfg_attr(all(feature = "tuples-128"), impl_for_tuples(128))] -impl TryState - for Tuple -{ +impl TryState for Tuple { for_tuples!( where #( Tuple: crate::traits::PalletInfoAccess )* ); fn try_state(n: BlockNumber, targets: Select) -> Result<(), TryRuntimeError> { match targets { @@ -221,7 +219,7 @@ impl TryState { /// Initializes a new tally. @@ -74,7 +74,7 @@ impl PollStatus { } } -pub struct ClassCountOf(sp_std::marker::PhantomData<(P, T)>); +pub struct ClassCountOf(core::marker::PhantomData<(P, T)>); impl> sp_runtime::traits::Get for ClassCountOf { fn get() -> u32 { P::classes().len() as u32 diff --git a/substrate/frame/support/test/Cargo.toml b/substrate/frame/support/test/Cargo.toml index 697e14ae1d3..82ac1d2c747 100644 --- a/substrate/frame/support/test/Cargo.toml +++ b/substrate/frame/support/test/Cargo.toml @@ -28,7 +28,6 @@ frame-support = { features = ["experimental"], workspace = true } frame-benchmarking = { workspace = true } sp-runtime = { workspace = true } sp-core = { workspace = true } -sp-std = { workspace = true } sp-version = { workspace = true } sp-metadata-ir = { workspace = true } trybuild = { features = ["diff"], workspace = true } @@ -57,7 +56,6 @@ std = [ "sp-metadata-ir/std", "sp-runtime/std", "sp-state-machine/std", - "sp-std/std", "sp-version/std", "test-pallet/std", ] diff --git a/substrate/frame/support/test/src/lib.rs b/substrate/frame/support/test/src/lib.rs index a8a72337503..b080740b0a4 100644 --- a/substrate/frame/support/test/src/lib.rs +++ b/substrate/frame/support/test/src/lib.rs @@ -127,7 +127,7 @@ pub mod pallet_prelude { /// Provides an implementation of [`frame_support::traits::Randomness`] that should only be used in /// tests! -pub struct TestRandomness(sp_std::marker::PhantomData); +pub struct TestRandomness(core::marker::PhantomData); impl frame_support::traits::Randomness> for TestRandomness diff --git a/substrate/frame/support/test/tests/issue2219.rs b/substrate/frame/support/test/tests/issue2219.rs index 20c2773406f..7a2138d056a 100644 --- a/substrate/frame/support/test/tests/issue2219.rs +++ b/substrate/frame/support/test/tests/issue2219.rs @@ -139,7 +139,7 @@ mod module { pub enable_storage_role: bool, pub request_life_time: u64, #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] diff --git a/substrate/frame/support/test/tests/origin.rs b/substrate/frame/support/test/tests/origin.rs index 4f14bda184c..e6dd0cfc0e3 100644 --- a/substrate/frame/support/test/tests/origin.rs +++ b/substrate/frame/support/test/tests/origin.rs @@ -65,7 +65,7 @@ mod nested { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -135,7 +135,7 @@ pub mod module { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] diff --git a/substrate/frame/support/test/tests/pallet.rs b/substrate/frame/support/test/tests/pallet.rs index c441d4c371a..6f8af949cc3 100644 --- a/substrate/frame/support/test/tests/pallet.rs +++ b/substrate/frame/support/test/tests/pallet.rs @@ -446,7 +446,7 @@ pub mod pallet { T::AccountId: From + SomeAssociation1 + From, { #[serde(skip)] - _config: sp_std::marker::PhantomData, + _config: core::marker::PhantomData, _myfield: u32, } diff --git a/substrate/frame/support/test/tests/pallet_instance.rs b/substrate/frame/support/test/tests/pallet_instance.rs index dfe4caa476d..09a49617044 100644 --- a/substrate/frame/support/test/tests/pallet_instance.rs +++ b/substrate/frame/support/test/tests/pallet_instance.rs @@ -15,6 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +use core::any::TypeId; use frame_support::{ derive_impl, dispatch::{DispatchClass, DispatchInfo, GetDispatchInfo, Pays}, @@ -33,7 +34,6 @@ use sp_io::{ TestExternalities, }; use sp_runtime::{DispatchError, ModuleError}; -use sp_std::any::TypeId; #[frame_support::pallet(dev_mode)] pub mod pallet { @@ -194,7 +194,7 @@ pub mod pallet { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig, I: 'static = ()> { #[serde(skip)] - _config: sp_std::marker::PhantomData<(T, I)>, + _config: core::marker::PhantomData<(T, I)>, _myfield: u32, } diff --git a/substrate/frame/support/test/tests/runtime.rs b/substrate/frame/support/test/tests/runtime.rs index 1f4d9110a24..06c2b5b7071 100644 --- a/substrate/frame/support/test/tests/runtime.rs +++ b/substrate/frame/support/test/tests/runtime.rs @@ -169,7 +169,7 @@ mod nested { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -251,7 +251,7 @@ pub mod module3 { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -871,7 +871,7 @@ fn test_metadata() { PalletMetadata { name: "Module3", storage: Some(PalletStorageMetadata { - prefix: "Module3", + prefix: "Module3", entries: vec![ StorageEntryMetadata { name: "Storage", diff --git a/substrate/frame/support/test/tests/runtime_legacy_ordering.rs b/substrate/frame/support/test/tests/runtime_legacy_ordering.rs index 6330a138e2f..4233db21e20 100644 --- a/substrate/frame/support/test/tests/runtime_legacy_ordering.rs +++ b/substrate/frame/support/test/tests/runtime_legacy_ordering.rs @@ -169,7 +169,7 @@ mod nested { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -251,7 +251,7 @@ pub mod module3 { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -808,7 +808,7 @@ fn test_metadata() { PalletMetadata { name: "Module3", storage: Some(PalletStorageMetadata { - prefix: "Module3", + prefix: "Module3", entries: vec![ StorageEntryMetadata { name: "Storage", diff --git a/substrate/frame/support/test/tests/versioned_migration.rs b/substrate/frame/support/test/tests/versioned_migration.rs index c83dd6b71de..58c9e4ce93b 100644 --- a/substrate/frame/support/test/tests/versioned_migration.rs +++ b/substrate/frame/support/test/tests/versioned_migration.rs @@ -51,7 +51,7 @@ mod dummy_pallet { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { #[serde(skip)] - _config: sp_std::marker::PhantomData, + _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -90,7 +90,7 @@ pub(crate) fn new_test_ext() -> sp_io::TestExternalities { /// A dummy migration for testing the `VersionedMigration` trait. /// Sets SomeStorage to S. -struct SomeUnversionedMigration(sp_std::marker::PhantomData); +struct SomeUnversionedMigration(core::marker::PhantomData); parameter_types! { const UpgradeReads: u64 = 4; diff --git a/substrate/frame/system/benchmarking/Cargo.toml b/substrate/frame/system/benchmarking/Cargo.toml index 47a6721b93f..dec68d20b69 100644 --- a/substrate/frame/system/benchmarking/Cargo.toml +++ b/substrate/frame/system/benchmarking/Cargo.toml @@ -23,7 +23,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-core = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] sp-io = { workspace = true, default-features = true } @@ -42,7 +41,6 @@ std = [ "sp-externalities/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-version/std", ] diff --git a/substrate/frame/system/benchmarking/src/inner.rs b/substrate/frame/system/benchmarking/src/inner.rs index c1631b0a2e3..0fb592f3dbb 100644 --- a/substrate/frame/system/benchmarking/src/inner.rs +++ b/substrate/frame/system/benchmarking/src/inner.rs @@ -17,13 +17,13 @@ //! Frame System benchmarks. +use alloc::{vec, vec::Vec}; use codec::Encode; use frame_benchmarking::v2::*; use frame_support::{dispatch::DispatchClass, storage, traits::Get}; use frame_system::{Call, Pallet as System, RawOrigin}; use sp_core::storage::well_known_keys; use sp_runtime::traits::Hash; -use sp_std::{prelude::*, vec}; pub struct Pallet(System); pub trait Config: frame_system::Config { diff --git a/substrate/frame/system/benchmarking/src/lib.rs b/substrate/frame/system/benchmarking/src/lib.rs index e55038aeb95..f66d20ac8ae 100644 --- a/substrate/frame/system/benchmarking/src/lib.rs +++ b/substrate/frame/system/benchmarking/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "runtime-benchmarks")] pub mod inner; diff --git a/substrate/frame/system/src/extensions/check_genesis.rs b/substrate/frame/system/src/extensions/check_genesis.rs index 76a711a823e..000ec56da64 100644 --- a/substrate/frame/system/src/extensions/check_genesis.rs +++ b/substrate/frame/system/src/extensions/check_genesis.rs @@ -31,16 +31,16 @@ use sp_runtime::{ /// the extension does not affect any other fields of `TransactionValidity` directly. #[derive(Encode, Decode, Clone, Eq, PartialEq, TypeInfo)] #[scale_info(skip_type_params(T))] -pub struct CheckGenesis(sp_std::marker::PhantomData); +pub struct CheckGenesis(core::marker::PhantomData); -impl sp_std::fmt::Debug for CheckGenesis { +impl core::fmt::Debug for CheckGenesis { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "CheckGenesis") } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -48,7 +48,7 @@ impl sp_std::fmt::Debug for CheckGenesis { impl CheckGenesis { /// Creates new `SignedExtension` to check genesis hash. pub fn new() -> Self { - Self(sp_std::marker::PhantomData) + Self(core::marker::PhantomData) } } diff --git a/substrate/frame/system/src/extensions/check_mortality.rs b/substrate/frame/system/src/extensions/check_mortality.rs index 31fdbba5950..6666c4812fb 100644 --- a/substrate/frame/system/src/extensions/check_mortality.rs +++ b/substrate/frame/system/src/extensions/check_mortality.rs @@ -36,23 +36,23 @@ use sp_runtime::{ /// The extension affects `longevity` of the transaction according to the [`Era`] definition. #[derive(Encode, Decode, Clone, Eq, PartialEq, TypeInfo)] #[scale_info(skip_type_params(T))] -pub struct CheckMortality(pub Era, sp_std::marker::PhantomData); +pub struct CheckMortality(pub Era, core::marker::PhantomData); impl CheckMortality { /// utility constructor. Used only in client/factory code. pub fn from(era: Era) -> Self { - Self(era, sp_std::marker::PhantomData) + Self(era, core::marker::PhantomData) } } -impl sp_std::fmt::Debug for CheckMortality { +impl core::fmt::Debug for CheckMortality { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "CheckMortality({:?})", self.0) } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } diff --git a/substrate/frame/system/src/extensions/check_non_zero_sender.rs b/substrate/frame/system/src/extensions/check_non_zero_sender.rs index 92eed60fc66..06dc2bf177a 100644 --- a/substrate/frame/system/src/extensions/check_non_zero_sender.rs +++ b/substrate/frame/system/src/extensions/check_non_zero_sender.rs @@ -17,6 +17,7 @@ use crate::Config; use codec::{Decode, Encode}; +use core::marker::PhantomData; use frame_support::{dispatch::DispatchInfo, DefaultNoBound}; use scale_info::TypeInfo; use sp_runtime::{ @@ -25,21 +26,20 @@ use sp_runtime::{ InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, }, }; -use sp_std::{marker::PhantomData, prelude::*}; /// Check to ensure that the sender is not the zero address. #[derive(Encode, Decode, DefaultNoBound, Clone, Eq, PartialEq, TypeInfo)] #[scale_info(skip_type_params(T))] pub struct CheckNonZeroSender(PhantomData); -impl sp_std::fmt::Debug for CheckNonZeroSender { +impl core::fmt::Debug for CheckNonZeroSender { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "CheckNonZeroSender") } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -47,7 +47,7 @@ impl sp_std::fmt::Debug for CheckNonZeroSender { impl CheckNonZeroSender { /// Create new `SignedExtension` to check runtime version. pub fn new() -> Self { - Self(sp_std::marker::PhantomData) + Self(core::marker::PhantomData) } } @@ -61,7 +61,7 @@ where type Pre = (); const IDENTIFIER: &'static str = "CheckNonZeroSender"; - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { + fn additional_signed(&self) -> core::result::Result<(), TransactionValidityError> { Ok(()) } diff --git a/substrate/frame/system/src/extensions/check_nonce.rs b/substrate/frame/system/src/extensions/check_nonce.rs index 894ab72eb59..3535870d1b5 100644 --- a/substrate/frame/system/src/extensions/check_nonce.rs +++ b/substrate/frame/system/src/extensions/check_nonce.rs @@ -16,6 +16,7 @@ // limitations under the License. use crate::Config; +use alloc::vec; use codec::{Decode, Encode}; use frame_support::dispatch::DispatchInfo; use scale_info::TypeInfo; @@ -26,7 +27,6 @@ use sp_runtime::{ ValidTransaction, }, }; -use sp_std::vec; /// Nonce check and increment to give replay protection for transactions. /// @@ -46,14 +46,14 @@ impl CheckNonce { } } -impl sp_std::fmt::Debug for CheckNonce { +impl core::fmt::Debug for CheckNonce { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "CheckNonce({})", self.0) } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -68,7 +68,7 @@ where type Pre = (); const IDENTIFIER: &'static str = "CheckNonce"; - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { + fn additional_signed(&self) -> core::result::Result<(), TransactionValidityError> { Ok(()) } diff --git a/substrate/frame/system/src/extensions/check_spec_version.rs b/substrate/frame/system/src/extensions/check_spec_version.rs index 24d5ef9cafb..ee7e6f2efd0 100644 --- a/substrate/frame/system/src/extensions/check_spec_version.rs +++ b/substrate/frame/system/src/extensions/check_spec_version.rs @@ -31,16 +31,16 @@ use sp_runtime::{ /// is not affected in any other way. #[derive(Encode, Decode, Clone, Eq, PartialEq, TypeInfo)] #[scale_info(skip_type_params(T))] -pub struct CheckSpecVersion(sp_std::marker::PhantomData); +pub struct CheckSpecVersion(core::marker::PhantomData); -impl sp_std::fmt::Debug for CheckSpecVersion { +impl core::fmt::Debug for CheckSpecVersion { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "CheckSpecVersion") } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -48,7 +48,7 @@ impl sp_std::fmt::Debug for CheckSpecVersion { impl CheckSpecVersion { /// Create new `SignedExtension` to check runtime version. pub fn new() -> Self { - Self(sp_std::marker::PhantomData) + Self(core::marker::PhantomData) } } diff --git a/substrate/frame/system/src/extensions/check_tx_version.rs b/substrate/frame/system/src/extensions/check_tx_version.rs index 3f9d6a1903f..15983c2cd08 100644 --- a/substrate/frame/system/src/extensions/check_tx_version.rs +++ b/substrate/frame/system/src/extensions/check_tx_version.rs @@ -31,16 +31,16 @@ use sp_runtime::{ /// is not affected in any other way. #[derive(Encode, Decode, Clone, Eq, PartialEq, TypeInfo)] #[scale_info(skip_type_params(T))] -pub struct CheckTxVersion(sp_std::marker::PhantomData); +pub struct CheckTxVersion(core::marker::PhantomData); -impl sp_std::fmt::Debug for CheckTxVersion { +impl core::fmt::Debug for CheckTxVersion { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "CheckTxVersion") } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -48,7 +48,7 @@ impl sp_std::fmt::Debug for CheckTxVersion { impl CheckTxVersion { /// Create new `SignedExtension` to check transaction version. pub fn new() -> Self { - Self(sp_std::marker::PhantomData) + Self(core::marker::PhantomData) } } diff --git a/substrate/frame/system/src/extensions/check_weight.rs b/substrate/frame/system/src/extensions/check_weight.rs index d4705f200ef..22da2a5b987 100644 --- a/substrate/frame/system/src/extensions/check_weight.rs +++ b/substrate/frame/system/src/extensions/check_weight.rs @@ -37,7 +37,7 @@ use sp_weights::Weight; /// transaction is valid. #[derive(Encode, Decode, Clone, Eq, PartialEq, Default, TypeInfo)] #[scale_info(skip_type_params(T))] -pub struct CheckWeight(sp_std::marker::PhantomData); +pub struct CheckWeight(core::marker::PhantomData); impl CheckWeight where @@ -211,7 +211,7 @@ where type Pre = (); const IDENTIFIER: &'static str = "CheckWeight"; - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { + fn additional_signed(&self) -> core::result::Result<(), TransactionValidityError> { Ok(()) } @@ -281,14 +281,14 @@ where } } -impl sp_std::fmt::Debug for CheckWeight { +impl core::fmt::Debug for CheckWeight { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "CheckWeight") } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -300,8 +300,8 @@ mod tests { mock::{new_test_ext, System, Test, CALL}, AllExtrinsicsLen, BlockWeight, DispatchClass, }; + use core::marker::PhantomData; use frame_support::{assert_err, assert_ok, dispatch::Pays, weights::Weight}; - use sp_std::marker::PhantomData; fn block_weights() -> crate::limits::BlockWeights { ::BlockWeights::get() diff --git a/substrate/frame/system/src/lib.rs b/substrate/frame/system/src/lib.rs index 84d00a1e917..0c6ff2cb8dd 100644 --- a/substrate/frame/system/src/lib.rs +++ b/substrate/frame/system/src/lib.rs @@ -97,6 +97,10 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{boxed::Box, vec, vec::Vec}; +use core::{fmt::Debug, marker::PhantomData}; use pallet_prelude::{BlockNumberFor, HeaderFor}; #[cfg(feature = "std")] use serde::Serialize; @@ -118,7 +122,6 @@ use sp_runtime::{ }; #[cfg(any(feature = "std", test))] use sp_std::map; -use sp_std::{fmt::Debug, marker::PhantomData, prelude::*}; use sp_version::RuntimeVersion; use codec::{Decode, Encode, EncodeLike, FullCodec, MaxEncodedLen}; @@ -269,7 +272,7 @@ pub mod pallet { /// /// NOTE: Avoids overriding `BlockHashCount` when using `mocking::{MockBlock, MockBlockU32, /// MockBlockU128}`. - pub struct TestBlockHashCount>(sp_std::marker::PhantomData); + pub struct TestBlockHashCount>(core::marker::PhantomData); impl, C: Get> Get for TestBlockHashCount { fn get() -> I { C::get().into() @@ -511,7 +514,7 @@ pub mod pallet { + Default + Copy + CheckEqual - + sp_std::hash::Hash + + core::hash::Hash + AsRef<[u8]> + AsMut<[u8]> + MaxEncodedLen; @@ -1011,7 +1014,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] @@ -1153,7 +1156,7 @@ impl From for LastRuntimeUpgradeInfo { } /// Ensure the origin is Root. -pub struct EnsureRoot(sp_std::marker::PhantomData); +pub struct EnsureRoot(core::marker::PhantomData); impl, O>> + From>, AccountId> EnsureOrigin for EnsureRoot { @@ -1179,7 +1182,7 @@ impl_ensure_origin_with_arg_ignoring_arg! { /// Ensure the origin is Root and return the provided `Success` value. pub struct EnsureRootWithSuccess( - sp_std::marker::PhantomData<(AccountId, Success)>, + core::marker::PhantomData<(AccountId, Success)>, ); impl< O: Into, O>> + From>, @@ -1209,7 +1212,7 @@ impl_ensure_origin_with_arg_ignoring_arg! { /// Ensure the origin is provided `Ensure` origin and return the provided `Success` value. pub struct EnsureWithSuccess( - sp_std::marker::PhantomData<(Ensure, AccountId, Success)>, + core::marker::PhantomData<(Ensure, AccountId, Success)>, ); impl< @@ -1232,7 +1235,7 @@ impl< } /// Ensure the origin is any `Signed` origin. -pub struct EnsureSigned(sp_std::marker::PhantomData); +pub struct EnsureSigned(core::marker::PhantomData); impl, O>> + From>, AccountId: Decode> EnsureOrigin for EnsureSigned { @@ -1259,7 +1262,7 @@ impl_ensure_origin_with_arg_ignoring_arg! { } /// Ensure the origin is `Signed` origin from the given `AccountId`. -pub struct EnsureSignedBy(sp_std::marker::PhantomData<(Who, AccountId)>); +pub struct EnsureSignedBy(core::marker::PhantomData<(Who, AccountId)>); impl< O: Into, O>> + From>, Who: SortedMembers, @@ -1291,7 +1294,7 @@ impl_ensure_origin_with_arg_ignoring_arg! { } /// Ensure the origin is `None`. i.e. unsigned transaction. -pub struct EnsureNone(sp_std::marker::PhantomData); +pub struct EnsureNone(core::marker::PhantomData); impl, O>> + From>, AccountId> EnsureOrigin for EnsureNone { @@ -1316,7 +1319,7 @@ impl_ensure_origin_with_arg_ignoring_arg! { } /// Always fail. -pub struct EnsureNever(sp_std::marker::PhantomData); +pub struct EnsureNever(core::marker::PhantomData); impl EnsureOrigin for EnsureNever { type Success = Success; fn try_origin(o: O) -> Result { @@ -1906,7 +1909,7 @@ impl Pallet { /// Should only be called if you know what you are doing and outside of the runtime block /// execution else it can have a large impact on the PoV size of a block. pub fn read_events_no_consensus( - ) -> impl sp_std::iter::Iterator>> { + ) -> impl Iterator>> { Events::::stream_iter() } diff --git a/substrate/frame/system/src/migrations/mod.rs b/substrate/frame/system/src/migrations/mod.rs index 945bbc53955..7c69843d73f 100644 --- a/substrate/frame/system/src/migrations/mod.rs +++ b/substrate/frame/system/src/migrations/mod.rs @@ -24,7 +24,6 @@ use frame_support::{ pallet_prelude::ValueQuery, traits::PalletInfoAccess, weights::Weight, Blake2_128Concat, }; use sp_runtime::RuntimeDebug; -use sp_std::prelude::*; /// Type used to encode the number of references an account has. type RefCount = u32; diff --git a/substrate/frame/system/src/offchain.rs b/substrate/frame/system/src/offchain.rs index a64b3261964..1f72ea2d374 100644 --- a/substrate/frame/system/src/offchain.rs +++ b/substrate/frame/system/src/offchain.rs @@ -56,13 +56,13 @@ #![warn(missing_docs)] +use alloc::{boxed::Box, collections::btree_set::BTreeSet, vec::Vec}; use codec::Encode; use sp_runtime::{ app_crypto::RuntimeAppPublic, traits::{Extrinsic as ExtrinsicT, IdentifyAccount, One}, RuntimeDebug, }; -use sp_std::{collections::btree_set::BTreeSet, prelude::*}; /// Marker struct used to flag using all supported keys to sign a payload. pub struct ForAll {} @@ -76,7 +76,7 @@ pub struct ForAny {} /// utility function can be used. However, this struct is used by `Signer` /// to submit a signed transactions providing the signature along with the call. pub struct SubmitTransaction, OverarchingCall> { - _phantom: sp_std::marker::PhantomData<(T, OverarchingCall)>, + _phantom: core::marker::PhantomData<(T, OverarchingCall)>, } impl SubmitTransaction @@ -115,7 +115,7 @@ where #[derive(RuntimeDebug)] pub struct Signer, X = ForAny> { accounts: Option>, - _phantom: sp_std::marker::PhantomData<(X, C)>, + _phantom: core::marker::PhantomData<(X, C)>, } impl, X> Default for Signer { diff --git a/substrate/frame/timestamp/Cargo.toml b/substrate/frame/timestamp/Cargo.toml index 2da6e2d5a95..25aecea7b79 100644 --- a/substrate/frame/timestamp/Cargo.toml +++ b/substrate/frame/timestamp/Cargo.toml @@ -26,7 +26,6 @@ frame-system = { workspace = true } sp-inherents = { workspace = true } sp-io = { optional = true, workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-storage = { workspace = true } sp-timestamp = { workspace = true } @@ -49,7 +48,6 @@ std = [ "sp-inherents/std", "sp-io?/std", "sp-runtime/std", - "sp-std/std", "sp-storage/std", "sp-timestamp/std", ] diff --git a/substrate/frame/timestamp/src/lib.rs b/substrate/frame/timestamp/src/lib.rs index 6a22ab1cd5e..ca495c5e24e 100644 --- a/substrate/frame/timestamp/src/lib.rs +++ b/substrate/frame/timestamp/src/lib.rs @@ -133,9 +133,9 @@ mod mock; mod tests; pub mod weights; +use core::{cmp, result}; use frame_support::traits::{OnTimestampSet, Time, UnixTime}; use sp_runtime::traits::{AtLeast32Bit, SaturatedConversion, Scale, Zero}; -use sp_std::{cmp, result}; use sp_timestamp::{InherentError, InherentType, INHERENT_IDENTIFIER}; pub use weights::WeightInfo; @@ -367,14 +367,12 @@ impl UnixTime for Pallet { // now is duration since unix epoch in millisecond as documented in // `sp_timestamp::InherentDataProvider`. let now = Now::::get(); - sp_std::if_std! { - if now == T::Moment::zero() { - log::error!( - target: "runtime::timestamp", - "`pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0", - ); - } - } + + log::error!( + target: "runtime::timestamp", + "`pallet_timestamp::UnixTime::now` is called at genesis, invalid value returned: 0", + ); + core::time::Duration::from_millis(now.saturated_into::()) } } diff --git a/substrate/frame/tips/Cargo.toml b/substrate/frame/tips/Cargo.toml index abebaa19aed..bec2ce0a47b 100644 --- a/substrate/frame/tips/Cargo.toml +++ b/substrate/frame/tips/Cargo.toml @@ -27,7 +27,6 @@ pallet-treasury = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -48,7 +47,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-storage/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/tips/src/lib.rs b/substrate/frame/tips/src/lib.rs index a75aed89d0b..67bcdfa0685 100644 --- a/substrate/frame/tips/src/lib.rs +++ b/substrate/frame/tips/src/lib.rs @@ -60,12 +60,14 @@ mod tests; pub mod migrations; pub mod weights; +extern crate alloc; + use sp_runtime::{ traits::{AccountIdConversion, BadOrigin, Hash, StaticLookup, TrailingZeroInput, Zero}, Percent, RuntimeDebug, }; -use sp_std::prelude::*; +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; use frame_support::{ ensure, diff --git a/substrate/frame/tips/src/migrations/unreserve_deposits.rs b/substrate/frame/tips/src/migrations/unreserve_deposits.rs index 16cb1a80e81..afc424309bf 100644 --- a/substrate/frame/tips/src/migrations/unreserve_deposits.rs +++ b/substrate/frame/tips/src/migrations/unreserve_deposits.rs @@ -18,6 +18,7 @@ //! A migration that unreserves all deposit and unlocks all stake held in the context of this //! pallet. +use alloc::collections::btree_map::BTreeMap; use core::iter::Sum; use frame_support::{ pallet_prelude::OptionQuery, @@ -27,7 +28,6 @@ use frame_support::{ Parameter, Twox64Concat, }; use sp_runtime::{traits::Zero, Saturating}; -use sp_std::collections::btree_map::BTreeMap; #[cfg(feature = "try-runtime")] const LOG_TARGET: &str = "runtime::tips::migrations::unreserve_deposits"; @@ -85,7 +85,7 @@ type Tips, I: 'static> = StorageMap< /// The pallet should be made inoperable before or immediately after this migration is run. /// /// (See also the `RemovePallet` migration in `frame/support/src/migrations.rs`) -pub struct UnreserveDeposits, I: 'static>(sp_std::marker::PhantomData<(T, I)>); +pub struct UnreserveDeposits, I: 'static>(core::marker::PhantomData<(T, I)>); impl, I: 'static> UnreserveDeposits { /// Calculates and returns the total amount reserved by each account by this pallet from open @@ -133,7 +133,7 @@ where /// Fails with a `TryRuntimeError` if somehow the amount reserved by this pallet is greater than /// the actual total reserved amount for any accounts. #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { use codec::Encode; use frame_support::ensure; @@ -189,7 +189,7 @@ where /// Verifies that the account reserved balances were reduced by the actual expected amounts. #[cfg(feature = "try-runtime")] fn post_upgrade( - account_reserved_before_bytes: sp_std::vec::Vec, + account_reserved_before_bytes: alloc::vec::Vec, ) -> Result<(), sp_runtime::TryRuntimeError> { use codec::Decode; diff --git a/substrate/frame/transaction-payment/Cargo.toml b/substrate/frame/transaction-payment/Cargo.toml index 3e890a8f7b6..c405ea1e943 100644 --- a/substrate/frame/transaction-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/Cargo.toml @@ -26,7 +26,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] serde_json = { workspace = true, default-features = true } @@ -44,7 +43,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = [ "frame-support/try-runtime", diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml b/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml index 02ce212deb6..b87d780b967 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml @@ -18,7 +18,6 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # Substrate dependencies sp-runtime = { workspace = true } -sp-std = { workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } pallet-asset-conversion = { workspace = true } @@ -47,7 +46,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-storage/std", ] try-runtime = [ diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs index ed0ed56e6e0..538d88bfacf 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs @@ -42,7 +42,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::prelude::*; +extern crate alloc; use codec::{Decode, Encode}; use frame_support::{ @@ -214,13 +214,13 @@ where } } -impl sp_std::fmt::Debug for ChargeAssetTxPayment { +impl core::fmt::Debug for ChargeAssetTxPayment { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "ChargeAssetTxPayment<{:?}, {:?}>", self.tip, self.asset_id.encode()) } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -252,7 +252,7 @@ where Option>, ); - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { + fn additional_signed(&self) -> core::result::Result<(), TransactionValidityError> { Ok(()) } diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs index f2f2c57bb37..0ef3fb11114 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs @@ -17,6 +17,8 @@ use super::*; use crate::Config; +use alloc::vec; +use core::marker::PhantomData; use frame_support::{ ensure, traits::{fungible::Inspect, tokens::Balance}, @@ -28,7 +30,6 @@ use sp_runtime::{ transaction_validity::InvalidTransaction, Saturating, }; -use sp_std::marker::PhantomData; /// Handle withdrawing, refunding and depositing of transaction fees. pub trait OnChargeAssetTransaction { diff --git a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml index 1b92ecf53c0..ec8fb38dda3 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml @@ -20,7 +20,6 @@ targets = ["x86_64-unknown-linux-gnu"] sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } @@ -57,7 +56,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-storage/std", ] runtime-benchmarks = [ diff --git a/substrate/frame/transaction-payment/asset-tx-payment/src/lib.rs b/substrate/frame/transaction-payment/asset-tx-payment/src/lib.rs index 753fae747a3..97f1116993f 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/asset-tx-payment/src/lib.rs @@ -35,8 +35,6 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::prelude::*; - use codec::{Decode, Encode}; use frame_support::{ dispatch::{DispatchInfo, DispatchResult, PostDispatchInfo}, @@ -198,13 +196,13 @@ where } } -impl sp_std::fmt::Debug for ChargeAssetTxPayment { +impl core::fmt::Debug for ChargeAssetTxPayment { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "ChargeAssetTxPayment<{:?}, {:?}>", self.tip, self.asset_id.encode()) } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -232,7 +230,7 @@ where Option>, ); - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { + fn additional_signed(&self) -> core::result::Result<(), TransactionValidityError> { Ok(()) } diff --git a/substrate/frame/transaction-payment/asset-tx-payment/src/payment.rs b/substrate/frame/transaction-payment/asset-tx-payment/src/payment.rs index 717114ab6bd..2486474bad4 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/src/payment.rs +++ b/substrate/frame/transaction-payment/asset-tx-payment/src/payment.rs @@ -18,6 +18,7 @@ use super::*; use crate::Config; use codec::FullCodec; +use core::{fmt::Debug, marker::PhantomData}; use frame_support::{ traits::{ fungibles::{Balanced, Credit, Inspect}, @@ -33,7 +34,6 @@ use sp_runtime::{ traits::{DispatchInfoOf, MaybeSerializeDeserialize, One, PostDispatchInfoOf}, transaction_validity::InvalidTransaction, }; -use sp_std::{fmt::Debug, marker::PhantomData}; /// Handle withdrawing, refunding and depositing of transaction fees. pub trait OnChargeAssetTransaction { diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml b/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml index 7265979cedc..b5bc7719def 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml @@ -16,7 +16,6 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # Substrate dependencies sp-runtime = { workspace = true } -sp-std = { workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } @@ -33,7 +32,6 @@ std = [ "frame-system/std", "scale-info/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-support/runtime-benchmarks", diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs b/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs index 682fb320356..3ab38743baf 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs @@ -77,7 +77,7 @@ pub mod pallet { /// A [`SignedExtension`] that skips the wrapped extension if the dispatchable is feeless. #[derive(Encode, Decode, Clone, Eq, PartialEq)] -pub struct SkipCheckIfFeeless(pub S, sp_std::marker::PhantomData); +pub struct SkipCheckIfFeeless(pub S, core::marker::PhantomData); // Make this extension "invisible" from the outside (ie metadata type information) impl TypeInfo for SkipCheckIfFeeless { @@ -87,20 +87,20 @@ impl TypeInfo for SkipCheckIfFeeless { } } -impl sp_std::fmt::Debug for SkipCheckIfFeeless { +impl core::fmt::Debug for SkipCheckIfFeeless { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "SkipCheckIfFeeless<{:?}>", self.0.encode()) } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } impl From for SkipCheckIfFeeless { fn from(s: S) -> Self { - Self(s, sp_std::marker::PhantomData) + Self(s, core::marker::PhantomData) } } diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs b/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs index 4ddeae11fca..d6d600f24e7 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs @@ -45,7 +45,7 @@ impl SignedExtension for DummyExtension { type AdditionalSigned = (); type Pre = (); const IDENTIFIER: &'static str = "DummyExtension"; - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { + fn additional_signed(&self) -> core::result::Result<(), TransactionValidityError> { Ok(()) } diff --git a/substrate/frame/transaction-payment/src/lib.rs b/substrate/frame/transaction-payment/src/lib.rs index 0e440ee4e9f..69fad6e0e32 100644 --- a/substrate/frame/transaction-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/src/lib.rs @@ -69,7 +69,6 @@ use sp_runtime::{ }, FixedPointNumber, FixedU128, Perbill, Perquintill, RuntimeDebug, }; -use sp_std::prelude::*; pub use types::{FeeDetails, InclusionFee, RuntimeDispatchInfo}; #[cfg(test)] @@ -137,7 +136,7 @@ type BalanceOf = <::OnChargeTransaction as OnChargeTransaction -pub struct TargetedFeeAdjustment(sp_std::marker::PhantomData<(T, S, V, M, X)>); +pub struct TargetedFeeAdjustment(core::marker::PhantomData<(T, S, V, M, X)>); /// Something that can convert the current multiplier to the next one. pub trait MultiplierUpdate: Convert { @@ -264,7 +263,7 @@ where } /// A struct to make the fee multiplier a constant -pub struct ConstFeeMultiplier>(sp_std::marker::PhantomData); +pub struct ConstFeeMultiplier>(core::marker::PhantomData); impl> MultiplierUpdate for ConstFeeMultiplier { fn min() -> Multiplier { @@ -406,7 +405,7 @@ pub mod pallet { pub struct GenesisConfig { pub multiplier: Multiplier, #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } impl Default for GenesisConfig { @@ -806,13 +805,13 @@ where } } -impl sp_std::fmt::Debug for ChargeTransactionPayment { +impl core::fmt::Debug for ChargeTransactionPayment { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "ChargeTransactionPayment<{:?}>", self.0) } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -834,7 +833,7 @@ where // imbalance resulting from withdrawing the fee <::OnChargeTransaction as OnChargeTransaction>::LiquidityInfo, ); - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { + fn additional_signed(&self) -> core::result::Result<(), TransactionValidityError> { Ok(()) } diff --git a/substrate/frame/transaction-payment/src/types.rs b/substrate/frame/transaction-payment/src/types.rs index 25cecc58a63..67c7311d0ca 100644 --- a/substrate/frame/transaction-payment/src/types.rs +++ b/substrate/frame/transaction-payment/src/types.rs @@ -24,7 +24,6 @@ use serde::{Deserialize, Serialize}; use scale_info::TypeInfo; use sp_runtime::traits::{AtLeast32BitUnsigned, Zero}; -use sp_std::prelude::*; use frame_support::dispatch::DispatchClass; diff --git a/substrate/frame/transaction-storage/Cargo.toml b/substrate/frame/transaction-storage/Cargo.toml index 3bb97e0cd01..e57ee1e729c 100644 --- a/substrate/frame/transaction-storage/Cargo.toml +++ b/substrate/frame/transaction-storage/Cargo.toml @@ -27,7 +27,6 @@ pallet-balances = { workspace = true } sp-inherents = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-transaction-storage-proof = { workspace = true } log = { workspace = true } @@ -58,7 +57,6 @@ std = [ "sp-inherents/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "sp-transaction-storage-proof/std", ] try-runtime = [ diff --git a/substrate/frame/transaction-storage/src/benchmarking.rs b/substrate/frame/transaction-storage/src/benchmarking.rs index 8d485d9f3ca..f360e9847a1 100644 --- a/substrate/frame/transaction-storage/src/benchmarking.rs +++ b/substrate/frame/transaction-storage/src/benchmarking.rs @@ -20,11 +20,11 @@ #![cfg(feature = "runtime-benchmarks")] use super::*; +use alloc::{vec, vec::Vec}; use frame_benchmarking::v1::{benchmarks, whitelisted_caller}; use frame_support::traits::{Get, OnFinalize, OnInitialize}; use frame_system::{pallet_prelude::BlockNumberFor, EventRecord, Pallet as System, RawOrigin}; use sp_runtime::traits::{Bounded, CheckedDiv, One, Zero}; -use sp_std::*; use sp_transaction_storage_proof::TransactionStorageProof; use crate::Pallet as TransactionStorage; diff --git a/substrate/frame/transaction-storage/src/lib.rs b/substrate/frame/transaction-storage/src/lib.rs index 6e58ee3e585..68f24526300 100644 --- a/substrate/frame/transaction-storage/src/lib.rs +++ b/substrate/frame/transaction-storage/src/lib.rs @@ -28,7 +28,11 @@ mod mock; #[cfg(test)] mod tests; +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; +use core::result; use frame_support::{ dispatch::GetDispatchInfo, traits::{ @@ -38,7 +42,6 @@ use frame_support::{ }, }; use sp_runtime::traits::{BlakeTwo256, Dispatchable, Hash, One, Saturating, Zero}; -use sp_std::{prelude::*, result}; use sp_transaction_storage_proof::{ encode_index, random_chunk, InherentError, TransactionStorageProof, CHUNK_SIZE, INHERENT_IDENTIFIER, diff --git a/substrate/frame/treasury/Cargo.toml b/substrate/frame/treasury/Cargo.toml index 33e74b0a4aa..2727ab80932 100644 --- a/substrate/frame/treasury/Cargo.toml +++ b/substrate/frame/treasury/Cargo.toml @@ -29,7 +29,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } pallet-balances = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } sp-core = { optional = true, workspace = true } [dev-dependencies] @@ -51,7 +50,6 @@ std = [ "sp-core?/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "dep:sp-core", diff --git a/substrate/frame/treasury/src/lib.rs b/substrate/frame/treasury/src/lib.rs index b437e5ef137..3954489a2d1 100644 --- a/substrate/frame/treasury/src/lib.rs +++ b/substrate/frame/treasury/src/lib.rs @@ -81,14 +81,16 @@ use core::marker::PhantomData; #[cfg(feature = "runtime-benchmarks")] pub use benchmarking::ArgumentsFactory; +extern crate alloc; + use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; +use alloc::{boxed::Box, collections::btree_map::BTreeMap}; use sp_runtime::{ traits::{AccountIdConversion, CheckedAdd, Saturating, StaticLookup, Zero}, Permill, RuntimeDebug, }; -use sp_std::{collections::btree_map::BTreeMap, prelude::*}; use frame_support::{ dispatch::{DispatchResult, DispatchResultWithPostInfo}, @@ -326,7 +328,7 @@ pub mod pallet { #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig, I: 'static = ()> { #[serde(skip)] - _config: sp_std::marker::PhantomData<(T, I)>, + _config: core::marker::PhantomData<(T, I)>, } #[pallet::genesis_build] diff --git a/substrate/frame/try-runtime/Cargo.toml b/substrate/frame/try-runtime/Cargo.toml index 16e815975b5..228d96095ac 100644 --- a/substrate/frame/try-runtime/Cargo.toml +++ b/substrate/frame/try-runtime/Cargo.toml @@ -19,7 +19,6 @@ codec = { features = ["derive"], workspace = true } frame-support = { workspace = true } sp-api = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [features] default = ["std"] @@ -28,6 +27,5 @@ std = [ "frame-support/std", "sp-api/std", "sp-runtime/std", - "sp-std/std", ] try-runtime = ["frame-support/try-runtime", "sp-runtime/try-runtime"] diff --git a/substrate/frame/tx-pause/Cargo.toml b/substrate/frame/tx-pause/Cargo.toml index fbb71513c6a..861a85881f2 100644 --- a/substrate/frame/tx-pause/Cargo.toml +++ b/substrate/frame/tx-pause/Cargo.toml @@ -22,7 +22,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } scale-info = { features = ["derive"], workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } pallet-balances = { optional = true, workspace = true } pallet-utility = { optional = true, workspace = true } pallet-proxy = { optional = true, workspace = true } @@ -48,7 +47,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/tx-pause/src/benchmarking.rs b/substrate/frame/tx-pause/src/benchmarking.rs index 126c0837949..95ae250eff7 100644 --- a/substrate/frame/tx-pause/src/benchmarking.rs +++ b/substrate/frame/tx-pause/src/benchmarking.rs @@ -18,6 +18,7 @@ #![cfg(feature = "runtime-benchmarks")] use super::{Pallet as TxPause, *}; +use alloc::vec; use frame_benchmarking::v2::*; #[benchmarks] diff --git a/substrate/frame/tx-pause/src/lib.rs b/substrate/frame/tx-pause/src/lib.rs index 5904b5ed316..68f7a031255 100644 --- a/substrate/frame/tx-pause/src/lib.rs +++ b/substrate/frame/tx-pause/src/lib.rs @@ -79,6 +79,9 @@ pub mod mock; mod tests; pub mod weights; +extern crate alloc; + +use alloc::vec::Vec; use frame_support::{ dispatch::GetDispatchInfo, pallet_prelude::*, @@ -87,7 +90,6 @@ use frame_support::{ }; use frame_system::pallet_prelude::*; use sp_runtime::{traits::Dispatchable, DispatchResult}; -use sp_std::prelude::*; pub use pallet::*; pub use weights::*; diff --git a/substrate/frame/uniques/Cargo.toml b/substrate/frame/uniques/Cargo.toml index d41d322bb63..2b1794aa60f 100644 --- a/substrate/frame/uniques/Cargo.toml +++ b/substrate/frame/uniques/Cargo.toml @@ -23,7 +23,6 @@ frame-benchmarking = { optional = true, workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -44,7 +43,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/uniques/src/benchmarking.rs b/substrate/frame/uniques/src/benchmarking.rs index 80d02f13621..a8a83010c51 100644 --- a/substrate/frame/uniques/src/benchmarking.rs +++ b/substrate/frame/uniques/src/benchmarking.rs @@ -20,6 +20,7 @@ #![cfg(feature = "runtime-benchmarks")] use super::*; +use alloc::{vec, vec::Vec}; use frame_benchmarking::v1::{ account, benchmarks_instance_pallet, whitelist_account, whitelisted_caller, BenchmarkError, }; @@ -29,7 +30,6 @@ use frame_support::{ }; use frame_system::RawOrigin as SystemOrigin; use sp_runtime::traits::Bounded; -use sp_std::prelude::*; use crate::Pallet as Uniques; diff --git a/substrate/frame/uniques/src/impl_nonfungibles.rs b/substrate/frame/uniques/src/impl_nonfungibles.rs index 0ae055a98d8..8e4af723f80 100644 --- a/substrate/frame/uniques/src/impl_nonfungibles.rs +++ b/substrate/frame/uniques/src/impl_nonfungibles.rs @@ -18,13 +18,13 @@ //! Implementations for `nonfungibles` traits. use super::*; +use alloc::vec::Vec; use frame_support::{ storage::KeyPrefixIterator, traits::{tokens::nonfungibles::*, Get}, BoundedSlice, }; use sp_runtime::{DispatchError, DispatchResult}; -use sp_std::prelude::*; impl, I: 'static> Inspect<::AccountId> for Pallet { type ItemId = T::ItemId; diff --git a/substrate/frame/uniques/src/lib.rs b/substrate/frame/uniques/src/lib.rs index 2291d19de2b..dc27c335623 100644 --- a/substrate/frame/uniques/src/lib.rs +++ b/substrate/frame/uniques/src/lib.rs @@ -42,6 +42,9 @@ mod types; pub mod migration; pub mod weights; +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode}; use frame_support::traits::{ tokens::Locker, BalanceStatus::Reserved, Currency, EnsureOriginWithArg, ReservableCurrency, @@ -51,7 +54,6 @@ use sp_runtime::{ traits::{Saturating, StaticLookup, Zero}, ArithmeticError, RuntimeDebug, }; -use sp_std::prelude::*; pub use pallet::*; pub use types::*; diff --git a/substrate/frame/uniques/src/tests.rs b/substrate/frame/uniques/src/tests.rs index 5dfe43c9688..a8428c420b3 100644 --- a/substrate/frame/uniques/src/tests.rs +++ b/substrate/frame/uniques/src/tests.rs @@ -21,7 +21,6 @@ use crate::{mock::*, Event, *}; use frame_support::{assert_noop, assert_ok, traits::Currency}; use pallet_balances::Error as BalancesError; use sp_runtime::traits::Dispatchable; -use sp_std::prelude::*; fn items() -> Vec<(u64, u32, u32)> { let mut r: Vec<_> = Account::::iter().map(|x| x.0).collect(); diff --git a/substrate/frame/utility/Cargo.toml b/substrate/frame/utility/Cargo.toml index 0ccdac6be62..f08232de9cd 100644 --- a/substrate/frame/utility/Cargo.toml +++ b/substrate/frame/utility/Cargo.toml @@ -24,7 +24,6 @@ frame-system = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -48,7 +47,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/utility/src/benchmarking.rs b/substrate/frame/utility/src/benchmarking.rs index 78911fd310e..467055ecd80 100644 --- a/substrate/frame/utility/src/benchmarking.rs +++ b/substrate/frame/utility/src/benchmarking.rs @@ -20,6 +20,7 @@ #![cfg(feature = "runtime-benchmarks")] use super::*; +use alloc::{vec, vec::Vec}; use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller}; use frame_system::RawOrigin; diff --git a/substrate/frame/utility/src/lib.rs b/substrate/frame/utility/src/lib.rs index 7f963e3637d..3ce5b4ff864 100644 --- a/substrate/frame/utility/src/lib.rs +++ b/substrate/frame/utility/src/lib.rs @@ -56,6 +56,9 @@ mod benchmarking; mod tests; pub mod weights; +extern crate alloc; + +use alloc::{boxed::Box, vec::Vec}; use codec::{Decode, Encode}; use frame_support::{ dispatch::{extract_actual_weight, GetDispatchInfo, PostDispatchInfo}, @@ -64,7 +67,6 @@ use frame_support::{ use sp_core::TypeId; use sp_io::hashing::blake2_256; use sp_runtime::traits::{BadOrigin, Dispatchable, TrailingZeroInput}; -use sp_std::prelude::*; pub use weights::WeightInfo; pub use pallet::*; @@ -131,7 +133,7 @@ pub mod pallet { /// The limit on the number of batched calls. fn batched_calls_limit() -> u32 { let allocator_limit = sp_core::MAX_POSSIBLE_ALLOCATION; - let call_size = ((sp_std::mem::size_of::<::RuntimeCall>() as u32 + + let call_size = ((core::mem::size_of::<::RuntimeCall>() as u32 + CALL_ALIGN - 1) / CALL_ALIGN) * CALL_ALIGN; // The margin to take into account vec doubling capacity. @@ -146,7 +148,7 @@ pub mod pallet { fn integrity_test() { // If you hit this error, you need to try to `Box` big dispatchable parameters. assert!( - sp_std::mem::size_of::<::RuntimeCall>() as u32 <= CALL_ALIGN, + core::mem::size_of::<::RuntimeCall>() as u32 <= CALL_ALIGN, "Call enum size should be smaller than {} bytes.", CALL_ALIGN, ); diff --git a/substrate/frame/vesting/Cargo.toml b/substrate/frame/vesting/Cargo.toml index 3aca5683465..64c26174cfd 100644 --- a/substrate/frame/vesting/Cargo.toml +++ b/substrate/frame/vesting/Cargo.toml @@ -25,7 +25,6 @@ frame-benchmarking = { optional = true, workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -45,7 +44,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/substrate/frame/vesting/src/lib.rs b/substrate/frame/vesting/src/lib.rs index 3868f1a8592..bfc10efeed7 100644 --- a/substrate/frame/vesting/src/lib.rs +++ b/substrate/frame/vesting/src/lib.rs @@ -56,7 +56,11 @@ mod vesting_info; pub mod migrations; pub mod weights; +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; +use core::{fmt::Debug, marker::PhantomData}; use frame_support::{ dispatch::DispatchResult, ensure, @@ -76,7 +80,6 @@ use sp_runtime::{ }, DispatchError, RuntimeDebug, }; -use sp_std::{fmt::Debug, marker::PhantomData, prelude::*}; pub use pallet::*; pub use vesting_info::*; diff --git a/substrate/frame/vesting/src/migrations.rs b/substrate/frame/vesting/src/migrations.rs index 6fe82312b63..33fa5d0df88 100644 --- a/substrate/frame/vesting/src/migrations.rs +++ b/substrate/frame/vesting/src/migrations.rs @@ -18,6 +18,7 @@ //! Storage migrations for the vesting pallet. use super::*; +use alloc::vec; // Migration from single schedule to multiple schedules. pub mod v1 { diff --git a/substrate/frame/whitelist/Cargo.toml b/substrate/frame/whitelist/Cargo.toml index 922f9124d91..c48a15f2163 100644 --- a/substrate/frame/whitelist/Cargo.toml +++ b/substrate/frame/whitelist/Cargo.toml @@ -22,7 +22,6 @@ frame-support = { workspace = true } frame-system = { workspace = true } sp-api = { workspace = true } sp-runtime = { workspace = true } -sp-std = { workspace = true } [dev-dependencies] pallet-balances = { workspace = true, default-features = true } @@ -44,7 +43,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking", diff --git a/substrate/frame/whitelist/src/benchmarking.rs b/substrate/frame/whitelist/src/benchmarking.rs index 7fb5632fc00..cbe6ee4becd 100644 --- a/substrate/frame/whitelist/src/benchmarking.rs +++ b/substrate/frame/whitelist/src/benchmarking.rs @@ -73,7 +73,7 @@ mod benchmarks { ) -> Result<(), BenchmarkError> { let origin = T::DispatchWhitelistedOrigin::try_successful_origin() .map_err(|_| BenchmarkError::Weightless)?; - let remark = sp_std::vec![1u8; n as usize]; + let remark = alloc::vec![1u8; n as usize]; let call: ::RuntimeCall = frame_system::Call::remark { remark }.into(); let call_weight = call.get_dispatch_info().weight; let encoded_call = call.encode(); @@ -97,7 +97,7 @@ mod benchmarks { fn dispatch_whitelisted_call_with_preimage(n: Linear<1, 10_000>) -> Result<(), BenchmarkError> { let origin = T::DispatchWhitelistedOrigin::try_successful_origin() .map_err(|_| BenchmarkError::Weightless)?; - let remark = sp_std::vec![1u8; n as usize]; + let remark = alloc::vec![1u8; n as usize]; let call: ::RuntimeCall = frame_system::Call::remark { remark }.into(); let call_hash = T::Hashing::hash_of(&call); diff --git a/substrate/frame/whitelist/src/lib.rs b/substrate/frame/whitelist/src/lib.rs index 44551abd107..de16c2c2da8 100644 --- a/substrate/frame/whitelist/src/lib.rs +++ b/substrate/frame/whitelist/src/lib.rs @@ -40,6 +40,9 @@ mod tests; pub mod weights; pub use weights::WeightInfo; +extern crate alloc; + +use alloc::boxed::Box; use codec::{DecodeLimit, Encode, FullCodec}; use frame_support::{ dispatch::{GetDispatchInfo, PostDispatchInfo}, @@ -49,7 +52,6 @@ use frame_support::{ }; use scale_info::TypeInfo; use sp_runtime::traits::{Dispatchable, Hash}; -use sp_std::prelude::*; pub use pallet::*; diff --git a/substrate/primitives/api/Cargo.toml b/substrate/primitives/api/Cargo.toml index f8cbad8e31f..d6c64a0ada2 100644 --- a/substrate/primitives/api/Cargo.toml +++ b/substrate/primitives/api/Cargo.toml @@ -19,7 +19,6 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { workspace = true } sp-api-proc-macro = { workspace = true } sp-core = { workspace = true } -sp-std = { workspace = true } sp-runtime = { workspace = true } sp-runtime-interface = { workspace = true } sp-externalities = { optional = true, workspace = true } @@ -53,7 +52,6 @@ std = [ "sp-runtime-interface/std", "sp-runtime/std", "sp-state-machine/std", - "sp-std/std", "sp-test-primitives/std", "sp-trie/std", "sp-version/std", diff --git a/substrate/primitives/api/src/lib.rs b/substrate/primitives/api/src/lib.rs index cd8da8ba237..d254bf20601 100644 --- a/substrate/primitives/api/src/lib.rs +++ b/substrate/primitives/api/src/lib.rs @@ -70,6 +70,8 @@ // Make doc tests happy extern crate self as sp_api; +extern crate alloc; + /// Private exports used by the macros. /// /// This is seen as internal API and can change at any point. @@ -90,7 +92,9 @@ pub mod __private { pub use std_imports::*; pub use crate::*; + pub use alloc::vec; pub use codec::{self, Decode, DecodeLimit, Encode}; + pub use core::{mem, slice}; pub use scale_info; pub use sp_core::offchain; #[cfg(not(feature = "std"))] @@ -103,7 +107,6 @@ pub mod __private { transaction_validity::TransactionValidity, ExtrinsicInclusionMode, RuntimeString, TransactionOutcome, }; - pub use sp_std::{mem, slice, vec}; pub use sp_version::{create_apis_vec, ApiId, ApisVec, RuntimeVersion}; #[cfg(all(any(target_arch = "riscv32", target_arch = "riscv64"), substrate_runtime))] @@ -833,7 +836,7 @@ decl_runtime_apis! { /// Returns the supported metadata versions. /// /// This can be used to call `metadata_at_version`. - fn metadata_versions() -> sp_std::vec::Vec; + fn metadata_versions() -> alloc::vec::Vec; } } diff --git a/substrate/primitives/application-crypto/Cargo.toml b/substrate/primitives/application-crypto/Cargo.toml index fbf9def20fc..c0508d377f8 100644 --- a/substrate/primitives/application-crypto/Cargo.toml +++ b/substrate/primitives/application-crypto/Cargo.toml @@ -22,7 +22,6 @@ sp-core = { workspace = true } codec = { features = ["derive"], workspace = true } scale-info = { features = ["derive"], workspace = true } serde = { optional = true, features = ["alloc", "derive"], workspace = true } -sp-std = { workspace = true } sp-io = { workspace = true } [features] @@ -34,7 +33,6 @@ std = [ "serde/std", "sp-core/std", "sp-io/std", - "sp-std/std", ] # Serde support without relying on std features. diff --git a/substrate/primitives/application-crypto/src/bandersnatch.rs b/substrate/primitives/application-crypto/src/bandersnatch.rs index fc7383815d7..0e21e5d3bce 100644 --- a/substrate/primitives/application-crypto/src/bandersnatch.rs +++ b/substrate/primitives/application-crypto/src/bandersnatch.rs @@ -18,8 +18,8 @@ //! Bandersnatch VRF application crypto types. use crate::{KeyTypeId, RuntimePublic}; +use alloc::vec::Vec; pub use sp_core::bandersnatch::*; -use sp_std::vec::Vec; mod app { crate::app_crypto!(super, sp_core::testing::BANDERSNATCH); diff --git a/substrate/primitives/application-crypto/src/bls377.rs b/substrate/primitives/application-crypto/src/bls377.rs index 3bd01de139c..9d346ea6183 100644 --- a/substrate/primitives/application-crypto/src/bls377.rs +++ b/substrate/primitives/application-crypto/src/bls377.rs @@ -18,8 +18,8 @@ //! BLS12-377 crypto applications. use crate::{KeyTypeId, RuntimePublic}; +use alloc::vec::Vec; pub use sp_core::bls::bls377::*; -use sp_std::vec::Vec; mod app { crate::app_crypto!(super, sp_core::testing::BLS377); diff --git a/substrate/primitives/application-crypto/src/ecdsa.rs b/substrate/primitives/application-crypto/src/ecdsa.rs index 439b51dc604..94d5288584c 100644 --- a/substrate/primitives/application-crypto/src/ecdsa.rs +++ b/substrate/primitives/application-crypto/src/ecdsa.rs @@ -19,7 +19,7 @@ use crate::{KeyTypeId, RuntimePublic}; -use sp_std::vec::Vec; +use alloc::vec::Vec; pub use sp_core::ecdsa::*; diff --git a/substrate/primitives/application-crypto/src/ecdsa_bls377.rs b/substrate/primitives/application-crypto/src/ecdsa_bls377.rs index 8dee73095fb..443d214d677 100644 --- a/substrate/primitives/application-crypto/src/ecdsa_bls377.rs +++ b/substrate/primitives/application-crypto/src/ecdsa_bls377.rs @@ -18,7 +18,7 @@ //! ECDSA and BLS12-377 paired crypto applications. use crate::{KeyTypeId, RuntimePublic}; -use sp_std::vec::Vec; +use alloc::vec::Vec; pub use sp_core::paired_crypto::ecdsa_bls377::*; diff --git a/substrate/primitives/application-crypto/src/ed25519.rs b/substrate/primitives/application-crypto/src/ed25519.rs index addefe7daf6..6769de4e47c 100644 --- a/substrate/primitives/application-crypto/src/ed25519.rs +++ b/substrate/primitives/application-crypto/src/ed25519.rs @@ -19,7 +19,7 @@ use crate::{KeyTypeId, RuntimePublic}; -use sp_std::vec::Vec; +use alloc::vec::Vec; pub use sp_core::ed25519::*; diff --git a/substrate/primitives/application-crypto/src/lib.rs b/substrate/primitives/application-crypto/src/lib.rs index 2355f1ba527..37949d7c41d 100644 --- a/substrate/primitives/application-crypto/src/lib.rs +++ b/substrate/primitives/application-crypto/src/lib.rs @@ -20,6 +20,8 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub use sp_core::crypto::{key_types, CryptoTypeId, DeriveJunction, KeyTypeId, Ss58Codec}; #[doc(hidden)] pub use sp_core::crypto::{DeriveError, Pair, SecretStringError}; @@ -30,15 +32,17 @@ pub use sp_core::{ RuntimeDebug, }; +#[doc(hidden)] +pub use alloc::vec::Vec; #[doc(hidden)] pub use codec; #[doc(hidden)] +pub use core::ops::Deref; +#[doc(hidden)] pub use scale_info; #[doc(hidden)] #[cfg(feature = "serde")] pub use serde; -#[doc(hidden)] -pub use sp_std::{ops::Deref, vec::Vec}; #[cfg(feature = "bandersnatch-experimental")] pub mod bandersnatch; @@ -357,7 +361,7 @@ macro_rules! app_crypto_public_common { #[doc(hidden)] pub mod module_format_string_prelude { #[cfg(all(not(feature = "std"), feature = "serde"))] - pub use sp_std::alloc::{format, string::String}; + pub use alloc::{format, string::String}; #[cfg(feature = "std")] pub use std::{format, string::String}; } diff --git a/substrate/primitives/application-crypto/src/sr25519.rs b/substrate/primitives/application-crypto/src/sr25519.rs index d411cc253c0..ba6f0e3ae6b 100644 --- a/substrate/primitives/application-crypto/src/sr25519.rs +++ b/substrate/primitives/application-crypto/src/sr25519.rs @@ -19,7 +19,7 @@ use crate::{KeyTypeId, RuntimePublic}; -use sp_std::vec::Vec; +use alloc::vec::Vec; pub use sp_core::sr25519::*; diff --git a/substrate/primitives/application-crypto/src/traits.rs b/substrate/primitives/application-crypto/src/traits.rs index 0b59abf272d..1789d9b96fd 100644 --- a/substrate/primitives/application-crypto/src/traits.rs +++ b/substrate/primitives/application-crypto/src/traits.rs @@ -18,8 +18,9 @@ use codec::Codec; use scale_info::TypeInfo; +use alloc::vec::Vec; +use core::fmt::Debug; use sp_core::crypto::{CryptoType, CryptoTypeId, IsWrappedBy, KeyTypeId, Pair, Public}; -use sp_std::{fmt::Debug, vec::Vec}; /// Application-specific cryptographic object. /// @@ -47,8 +48,8 @@ pub trait AppCrypto: 'static + Sized + CryptoType { } /// Type which implements Hash in std, not when no-std (std variant). -pub trait MaybeHash: sp_std::hash::Hash {} -impl MaybeHash for T {} +pub trait MaybeHash: core::hash::Hash {} +impl MaybeHash for T {} /// Application-specific key pair. pub trait AppPair: diff --git a/substrate/primitives/arithmetic/Cargo.toml b/substrate/primitives/arithmetic/Cargo.toml index a0d80fc9b50..4a9d5ba234b 100644 --- a/substrate/primitives/arithmetic/Cargo.toml +++ b/substrate/primitives/arithmetic/Cargo.toml @@ -26,7 +26,6 @@ num-traits = { workspace = true } scale-info = { features = ["derive"], workspace = true } serde = { features = ["alloc", "derive"], optional = true, workspace = true } static_assertions = { workspace = true, default-features = true } -sp-std = { workspace = true } docify = { workspace = true } [dev-dependencies] @@ -43,7 +42,6 @@ std = [ "scale-info/std", "serde/std", "sp-crypto-hashing/std", - "sp-std/std", ] # Serde support without relying on std features. serde = ["dep:serde", "scale-info/serde"] diff --git a/substrate/primitives/core/src/address_uri.rs b/substrate/primitives/core/src/address_uri.rs index d44f3c0c87c..bbe31b7553b 100644 --- a/substrate/primitives/core/src/address_uri.rs +++ b/substrate/primitives/core/src/address_uri.rs @@ -18,8 +18,8 @@ //! Little util for parsing an address URI. Replaces regular expressions. #[cfg(not(feature = "std"))] -use sp_std::{ - alloc::string::{String, ToString}, +use alloc::{ + string::{String, ToString}, vec::Vec, }; @@ -97,10 +97,10 @@ impl InvalidCharacterInfo { } } -impl sp_std::fmt::Display for InvalidCharacterInfo { - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { +impl core::fmt::Display for InvalidCharacterInfo { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { let (s, pos) = escape_string(&self.0, self.1); - write!(f, "{s}\n{i}^", i = sp_std::iter::repeat(" ").take(pos).collect::()) + write!(f, "{s}\n{i}^", i = core::iter::repeat(" ").take(pos).collect::()) } } diff --git a/substrate/primitives/core/src/bandersnatch.rs b/substrate/primitives/core/src/bandersnatch.rs index 71ee2da5383..25bf4657030 100644 --- a/substrate/primitives/core/src/bandersnatch.rs +++ b/substrate/primitives/core/src/bandersnatch.rs @@ -31,7 +31,7 @@ use bandersnatch_vrfs::{CanonicalSerialize, SecretKey}; use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; use scale_info::TypeInfo; -use sp_std::{vec, vec::Vec}; +use alloc::{vec, vec::Vec}; /// Identifier used to match public keys against bandersnatch-vrf keys. pub const CRYPTO_ID: CryptoTypeId = CryptoTypeId(*b"band"); diff --git a/substrate/primitives/core/src/bls.rs b/substrate/primitives/core/src/bls.rs index bb04babb3f1..a86f67844da 100644 --- a/substrate/primitives/core/src/bls.rs +++ b/substrate/primitives/core/src/bls.rs @@ -28,7 +28,7 @@ use crate::crypto::{ SignatureBytes, UncheckedFrom, }; -use sp_std::vec::Vec; +use alloc::vec::Vec; use w3f_bls::{ DoublePublicKey, DoublePublicKeyScheme, DoubleSignature, EngineBLS, Keypair, Message, diff --git a/substrate/primitives/core/src/crypto.rs b/substrate/primitives/core/src/crypto.rs index b13899fff51..fd7fe776720 100644 --- a/substrate/primitives/core/src/crypto.rs +++ b/substrate/primitives/core/src/crypto.rs @@ -18,8 +18,14 @@ //! Cryptographic utilities. use crate::{ed25519, sr25519}; +#[cfg(all(not(feature = "std"), feature = "serde"))] +use alloc::{format, string::String, vec}; +use alloc::{str, vec::Vec}; use bip39::{Language, Mnemonic}; use codec::{Decode, Encode, MaxEncodedLen}; +use core::hash::Hash; +#[doc(hidden)] +pub use core::ops::Deref; #[cfg(feature = "std")] use itertools::Itertools; #[cfg(feature = "std")] @@ -27,14 +33,6 @@ use rand::{rngs::OsRng, RngCore}; use scale_info::TypeInfo; pub use secrecy::{ExposeSecret, SecretString}; use sp_runtime_interface::pass_by::PassByInner; -#[doc(hidden)] -pub use sp_std::ops::Deref; -#[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::{ - alloc::{format, string::String}, - vec, -}; -use sp_std::{hash::Hash, str, vec::Vec}; pub use ss58_registry::{from_known_address_format, Ss58AddressFormat, Ss58AddressFormatRegistry}; /// Trait to zeroize a memory buffer. pub use zeroize::Zeroize; @@ -245,8 +243,8 @@ pub enum PublicError { } #[cfg(feature = "std")] -impl sp_std::fmt::Debug for PublicError { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for PublicError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { // Just use the `Display` implementation write!(f, "{}", self) } @@ -587,8 +585,8 @@ impl std::fmt::Display for AccountId32 { } } -impl sp_std::fmt::Debug for AccountId32 { - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { +impl core::fmt::Debug for AccountId32 { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { #[cfg(feature = "serde")] { let s = self.to_ss58check(); @@ -624,7 +622,7 @@ impl<'de> serde::Deserialize<'de> for AccountId32 { } #[cfg(feature = "std")] -impl sp_std::str::FromStr for AccountId32 { +impl std::str::FromStr for AccountId32 { type Err = &'static str; fn from_str(s: &str) -> Result { @@ -786,7 +784,7 @@ pub struct SecretUri { pub junctions: Vec, } -impl sp_std::str::FromStr for SecretUri { +impl alloc::str::FromStr for SecretUri { type Err = SecretStringError; fn from_str(s: &str) -> Result { @@ -925,7 +923,7 @@ pub trait Pair: CryptoType + Sized { s: &str, password_override: Option<&str>, ) -> Result<(Self, Option), SecretStringError> { - use sp_std::str::FromStr; + use alloc::str::FromStr; let SecretUri { junctions, phrase, password } = SecretUri::from_str(s)?; let password = password_override.or_else(|| password.as_ref().map(|p| p.expose_secret().as_str())); diff --git a/substrate/primitives/core/src/crypto_bytes.rs b/substrate/primitives/core/src/crypto_bytes.rs index ee5f3482f74..e5130e6d500 100644 --- a/substrate/primitives/core/src/crypto_bytes.rs +++ b/substrate/primitives/core/src/crypto_bytes.rs @@ -34,7 +34,7 @@ use crate::crypto::Ss58Codec; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; #[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::{format, string::String}; +use alloc::{format, string::String}; pub use public_bytes::*; pub use signature_bytes::*; @@ -256,7 +256,7 @@ mod public_bytes { impl Public for PublicBytes where Self: CryptoType {} - impl sp_std::fmt::Debug for PublicBytes + impl core::fmt::Debug for PublicBytes where Self: CryptoType, { @@ -267,7 +267,7 @@ mod public_bytes { } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } @@ -362,17 +362,17 @@ mod signature_bytes { } } - impl sp_std::fmt::Debug for SignatureBytes + impl core::fmt::Debug for SignatureBytes where Self: CryptoType, { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "{}", crate::hexdisplay::HexDisplay::from(&&self.0[..])) } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } diff --git a/substrate/primitives/core/src/ecdsa.rs b/substrate/primitives/core/src/ecdsa.rs index 9cba8cc3d35..d11811ff2af 100644 --- a/substrate/primitives/core/src/ecdsa.rs +++ b/substrate/primitives/core/src/ecdsa.rs @@ -22,6 +22,8 @@ use crate::crypto::{ SecretStringError, SignatureBytes, }; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; #[cfg(not(feature = "std"))] use k256::ecdsa::{SigningKey as SecretKey, VerifyingKey}; #[cfg(feature = "std")] @@ -29,8 +31,6 @@ use secp256k1::{ ecdsa::{RecoverableSignature, RecoveryId}, Message, PublicKey, SecretKey, SECP256K1, }; -#[cfg(not(feature = "std"))] -use sp_std::vec::Vec; /// An identifier used to match public keys against ecdsa keys pub const CRYPTO_ID: CryptoTypeId = CryptoTypeId(*b"ecds"); diff --git a/substrate/primitives/core/src/ed25519.rs b/substrate/primitives/core/src/ed25519.rs index 269b6bfcd8d..401f9a39d56 100644 --- a/substrate/primitives/core/src/ed25519.rs +++ b/substrate/primitives/core/src/ed25519.rs @@ -24,7 +24,7 @@ use crate::crypto::{ use ed25519_zebra::{SigningKey, VerificationKey}; -use sp_std::vec::Vec; +use alloc::vec::Vec; /// An identifier used to match public keys against ed25519 keys pub const CRYPTO_ID: CryptoTypeId = CryptoTypeId(*b"ed25"); diff --git a/substrate/primitives/core/src/hexdisplay.rs b/substrate/primitives/core/src/hexdisplay.rs index 72bb24a186e..1902b8cca95 100644 --- a/substrate/primitives/core/src/hexdisplay.rs +++ b/substrate/primitives/core/src/hexdisplay.rs @@ -27,8 +27,8 @@ impl<'a> HexDisplay<'a> { } } -impl<'a> sp_std::fmt::Display for HexDisplay<'a> { - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> Result<(), sp_std::fmt::Error> { +impl<'a> core::fmt::Display for HexDisplay<'a> { + fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { if self.0.len() < 1027 { for byte in self.0 { f.write_fmt(format_args!("{:02x}", byte))?; @@ -46,8 +46,8 @@ impl<'a> sp_std::fmt::Display for HexDisplay<'a> { } } -impl<'a> sp_std::fmt::Debug for HexDisplay<'a> { - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> Result<(), sp_std::fmt::Error> { +impl<'a> core::fmt::Debug for HexDisplay<'a> { + fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { for byte in self.0 { f.write_fmt(format_args!("{:02x}", byte))?; } @@ -73,7 +73,7 @@ impl AsBytesRef for [u8] { } } -impl AsBytesRef for sp_std::vec::Vec { +impl AsBytesRef for alloc::vec::Vec { fn as_bytes_ref(&self) -> &[u8] { self } diff --git a/substrate/primitives/core/src/lib.rs b/substrate/primitives/core/src/lib.rs index 78ec92e4be9..46503921453 100644 --- a/substrate/primitives/core/src/lib.rs +++ b/substrate/primitives/core/src/lib.rs @@ -31,15 +31,18 @@ macro_rules! map { ); } +extern crate alloc; + +use alloc::vec::Vec; #[doc(hidden)] pub use codec::{Decode, Encode, MaxEncodedLen}; +use core::ops::Deref; use scale_info::TypeInfo; #[cfg(feature = "serde")] pub use serde; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use sp_runtime_interface::pass_by::{PassByEnum, PassByInner}; -use sp_std::{ops::Deref, prelude::*}; pub use sp_debug_derive::RuntimeDebug; @@ -137,7 +140,7 @@ impl codec::WrapperTypeDecode for Bytes { } #[cfg(feature = "std")] -impl sp_std::str::FromStr for Bytes { +impl alloc::str::FromStr for Bytes { type Err = bytes::FromHexError; fn from_str(s: &str) -> Result { @@ -156,7 +159,7 @@ impl OpaqueMetadata { } } -impl sp_std::ops::Deref for OpaqueMetadata { +impl Deref for OpaqueMetadata { type Target = Vec; fn deref(&self) -> &Self::Target { @@ -313,7 +316,7 @@ pub fn to_substrate_wasm_fn_return_value(value: &impl Encode) -> u64 { // Leak the output vector to avoid it being freed. // This is fine in a WASM context since the heap // will be discarded after the call. - sp_std::mem::forget(encoded); + core::mem::forget(encoded); res } @@ -456,7 +459,7 @@ macro_rules! generate_feature_enabled_macro { /// // Will add the code depending on the feature being enabled or not. #[doc = concat!(stringify!($macro_name), "!( println!(\"Hello\") )")] /// ``` - // https://github.com/rust-lang/rust/pull/52234 + // https://github.com/rust-lang/rust/pull/52234 pub use [<_ $macro_name>] as $macro_name; } }; diff --git a/substrate/primitives/core/src/offchain/mod.rs b/substrate/primitives/core/src/offchain/mod.rs index cef495dfaac..9be86e85d58 100644 --- a/substrate/primitives/core/src/offchain/mod.rs +++ b/substrate/primitives/core/src/offchain/mod.rs @@ -18,10 +18,10 @@ //! Offchain workers types use crate::{OpaquePeerId, RuntimeDebug}; +use alloc::{boxed::Box, vec::Vec}; use codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_runtime_interface::pass_by::{PassByCodec, PassByEnum, PassByInner}; -use sp_std::prelude::{Box, Vec}; pub use crate::crypto::KeyTypeId; diff --git a/substrate/primitives/core/src/paired_crypto.rs b/substrate/primitives/core/src/paired_crypto.rs index 260e86b6ff9..57bc5b00619 100644 --- a/substrate/primitives/core/src/paired_crypto.rs +++ b/substrate/primitives/core/src/paired_crypto.rs @@ -24,7 +24,7 @@ use crate::crypto::{ PublicBytes, SecretStringError, Signature as SignatureT, SignatureBytes, UncheckedFrom, }; -use sp_std::vec::Vec; +use alloc::vec::Vec; /// ECDSA and BLS12-377 paired crypto scheme #[cfg(feature = "bls-experimental")] diff --git a/substrate/primitives/core/src/sr25519.rs b/substrate/primitives/core/src/sr25519.rs index 54b9a98db3d..48780f2ccff 100644 --- a/substrate/primitives/core/src/sr25519.rs +++ b/substrate/primitives/core/src/sr25519.rs @@ -25,25 +25,25 @@ use crate::crypto::Ss58Codec; use crate::crypto::{ CryptoBytes, DeriveError, DeriveJunction, Pair as TraitPair, SecretStringError, }; +use alloc::vec::Vec; #[cfg(feature = "full_crypto")] use schnorrkel::signing_context; use schnorrkel::{ derive::{ChainCode, Derivation, CHAIN_CODE_LENGTH}, ExpansionMode, Keypair, MiniSecretKey, PublicKey, SecretKey, }; -use sp_std::vec::Vec; use crate::crypto::{CryptoType, CryptoTypeId, Derive, Public as TraitPublic, SignatureBytes}; use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; +#[cfg(all(not(feature = "std"), feature = "serde"))] +use alloc::{format, string::String}; use schnorrkel::keys::{MINI_SECRET_KEY_LENGTH, SECRET_KEY_LENGTH}; #[cfg(feature = "serde")] use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; #[cfg(feature = "std")] use sp_runtime_interface::pass_by::PassByInner; -#[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::{format, string::String}; // signing context const SIGNING_CTX: &[u8] = b"substrate"; @@ -100,15 +100,15 @@ impl std::fmt::Display for Public { } } -impl sp_std::fmt::Debug for Public { +impl core::fmt::Debug for Public { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { let s = self.to_ss58check(); write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(self.inner()), &s[0..8]) } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } diff --git a/substrate/primitives/io/Cargo.toml b/substrate/primitives/io/Cargo.toml index 6b58ea70b8e..923efc3b876 100644 --- a/substrate/primitives/io/Cargo.toml +++ b/substrate/primitives/io/Cargo.toml @@ -25,7 +25,6 @@ codec = { features = [ sp-core = { workspace = true } sp-crypto-hashing = { workspace = true } sp-keystore = { optional = true, workspace = true } -sp-std = { workspace = true } libsecp256k1 = { optional = true, workspace = true, default-features = true } sp-state-machine = { optional = true, workspace = true } sp-runtime-interface = { workspace = true } @@ -67,7 +66,6 @@ std = [ "sp-keystore/std", "sp-runtime-interface/std", "sp-state-machine/std", - "sp-std/std", "sp-tracing/std", "sp-trie/std", "tracing-core/std", diff --git a/substrate/primitives/io/src/lib.rs b/substrate/primitives/io/src/lib.rs index 67e822ba7e2..b39a06ed211 100644 --- a/substrate/primitives/io/src/lib.rs +++ b/substrate/primitives/io/src/lib.rs @@ -77,7 +77,9 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(enable_alloc_error_handler, feature(alloc_error_handler))] -use sp_std::vec::Vec; +extern crate alloc; + +use alloc::vec::Vec; #[cfg(feature = "std")] use tracing; @@ -1771,7 +1773,7 @@ pub fn unreachable() -> ! { #[panic_handler] #[no_mangle] pub fn panic(info: &core::panic::PanicInfo) -> ! { - let message = sp_std::alloc::format!("{}", info); + let message = alloc::format!("{}", info); #[cfg(feature = "improved_panic_error_reporting")] { panic_handler::abort_on_panic(&message); diff --git a/substrate/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs b/substrate/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs index 0d05dd9aa51..d0eb382cdc5 100644 --- a/substrate/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs +++ b/substrate/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs @@ -54,7 +54,7 @@ pub fn derive_impl(input: DeriveInput) -> Result { impl TryFrom for #ident { type Error = (); - fn try_from(inner: u8) -> #crate_::sp_std::result::Result { + fn try_from(inner: u8) -> core::result::Result { match inner { #( #try_from_variants, )* _ => Err(()), diff --git a/substrate/primitives/runtime-interface/src/impls.rs b/substrate/primitives/runtime-interface/src/impls.rs index 3530b62662a..daf5725e7f5 100644 --- a/substrate/primitives/runtime-interface/src/impls.rs +++ b/substrate/primitives/runtime-interface/src/impls.rs @@ -35,10 +35,12 @@ use sp_wasm_interface::{FunctionContext, Result}; use codec::{Decode, Encode}; -use sp_std::{any::TypeId, mem, vec::Vec}; +use core::{any::TypeId, mem}; + +use alloc::vec::Vec; #[cfg(feature = "std")] -use sp_std::borrow::Cow; +use alloc::borrow::Cow; // Make sure that our assumptions for storing a pointer + its size in `u64` is valid. #[cfg(all(not(feature = "std"), not(feature = "disable_target_static_assertions")))] @@ -337,7 +339,7 @@ impl IntoPreallocatedFFIValue for [u8; N] { } } -impl PassBy for sp_std::result::Result { +impl PassBy for core::result::Result { type PassBy = Codec; } diff --git a/substrate/primitives/runtime-interface/src/lib.rs b/substrate/primitives/runtime-interface/src/lib.rs index f6ef27789b3..d6dcb69958a 100644 --- a/substrate/primitives/runtime-interface/src/lib.rs +++ b/substrate/primitives/runtime-interface/src/lib.rs @@ -111,6 +111,8 @@ extern crate self as sp_runtime_interface; +extern crate alloc; + #[doc(hidden)] #[cfg(feature = "std")] pub use sp_wasm_interface; diff --git a/substrate/primitives/runtime-interface/src/pass_by.rs b/substrate/primitives/runtime-interface/src/pass_by.rs index 103e9c16220..dce0b8e4bdd 100644 --- a/substrate/primitives/runtime-interface/src/pass_by.rs +++ b/substrate/primitives/runtime-interface/src/pass_by.rs @@ -33,10 +33,10 @@ use crate::wasm::*; #[cfg(feature = "std")] use sp_wasm_interface::{FunctionContext, Pointer, Result}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; #[cfg(not(feature = "std"))] -use sp_std::vec::Vec; +use alloc::vec::Vec; /// Derive macro for implementing [`PassBy`] with the [`Codec`] strategy. /// diff --git a/substrate/primitives/runtime-interface/test-wasm/Cargo.toml b/substrate/primitives/runtime-interface/test-wasm/Cargo.toml index 759ab99ceac..77e77c707d9 100644 --- a/substrate/primitives/runtime-interface/test-wasm/Cargo.toml +++ b/substrate/primitives/runtime-interface/test-wasm/Cargo.toml @@ -20,7 +20,6 @@ bytes = { workspace = true } sp-core = { workspace = true } sp-io = { workspace = true } sp-runtime-interface = { workspace = true } -sp-std = { workspace = true } [build-dependencies] substrate-wasm-builder = { optional = true, workspace = true, default-features = true } @@ -32,6 +31,5 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime-interface/std", - "sp-std/std", "substrate-wasm-builder", ] diff --git a/substrate/primitives/runtime-interface/test-wasm/src/lib.rs b/substrate/primitives/runtime-interface/test-wasm/src/lib.rs index 2b3fc728f6f..545f1ff4a11 100644 --- a/substrate/primitives/runtime-interface/test-wasm/src/lib.rs +++ b/substrate/primitives/runtime-interface/test-wasm/src/lib.rs @@ -19,11 +19,14 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use sp_runtime_interface::runtime_interface; #[cfg(not(feature = "std"))] -use sp_std::{mem, prelude::*}; +use core::mem; +use alloc::{vec, vec::Vec}; use sp_core::{sr25519::Public, wasm_export_functions}; // Include the WASM binary @@ -229,7 +232,7 @@ wasm_export_functions! { fn test_invalid_utf8_data_should_return_an_error() { let data = vec![0, 159, 146, 150]; // I'm an evil hacker, trying to hack! - let data_str = unsafe { sp_std::str::from_utf8_unchecked(&data) }; + let data_str = unsafe { alloc::str::from_utf8_unchecked(&data) }; test_api::invalid_utf8_data(data_str); } diff --git a/substrate/primitives/runtime/src/generic/block.rs b/substrate/primitives/runtime/src/generic/block.rs index 05146e880cb..8ed79c7c8dc 100644 --- a/substrate/primitives/runtime/src/generic/block.rs +++ b/substrate/primitives/runtime/src/generic/block.rs @@ -31,8 +31,8 @@ use crate::{ }, Justifications, }; +use alloc::vec::Vec; use sp_core::RuntimeDebug; -use sp_std::prelude::*; /// Something to identify a block. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] diff --git a/substrate/primitives/runtime/src/generic/digest.rs b/substrate/primitives/runtime/src/generic/digest.rs index d7db0f91a48..c639576a286 100644 --- a/substrate/primitives/runtime/src/generic/digest.rs +++ b/substrate/primitives/runtime/src/generic/digest.rs @@ -17,12 +17,11 @@ //! Generic implementation of a digest. +#[cfg(all(not(feature = "std"), feature = "serde"))] +use alloc::format; +use alloc::vec::Vec; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; -#[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::format; - -use sp_std::prelude::*; use crate::{ codec::{Decode, Encode, Error, Input}, diff --git a/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs b/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs index df1f5645f04..499b7c5f583 100644 --- a/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs +++ b/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs @@ -26,12 +26,13 @@ use crate::{ transaction_validity::{InvalidTransaction, TransactionValidityError}, OpaqueExtrinsic, }; +#[cfg(all(not(feature = "std"), feature = "serde"))] +use alloc::format; +use alloc::{vec, vec::Vec}; use codec::{Compact, Decode, Encode, EncodeLike, Error, Input}; +use core::fmt; use scale_info::{build::Fields, meta_type, Path, StaticTypeInfo, Type, TypeInfo, TypeParameter}; use sp_io::hashing::blake2_256; -#[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::format; -use sp_std::{fmt, prelude::*}; /// Current version of the [`UncheckedExtrinsic`] encoded format. /// @@ -316,7 +317,7 @@ where Extra: SignedExtension, { fn encode(&self) -> Vec { - let mut tmp = Vec::with_capacity(sp_std::mem::size_of::()); + let mut tmp = Vec::with_capacity(core::mem::size_of::()); // 1 byte version id. match self.signature.as_ref() { @@ -437,7 +438,7 @@ mod tests { type AdditionalSigned = (); type Pre = (); - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { + fn additional_signed(&self) -> core::result::Result<(), TransactionValidityError> { Ok(()) } diff --git a/substrate/primitives/runtime/src/lib.rs b/substrate/primitives/runtime/src/lib.rs index 046909b9a38..d313d23395a 100644 --- a/substrate/primitives/runtime/src/lib.rs +++ b/substrate/primitives/runtime/src/lib.rs @@ -45,6 +45,11 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +#[doc(hidden)] +extern crate alloc; + +#[doc(hidden)] +pub use alloc::vec::Vec; #[doc(hidden)] pub use codec; #[doc(hidden)] @@ -73,12 +78,12 @@ use sp_core::{ hash::{H256, H512}, sr25519, }; -use sp_std::prelude::*; +#[cfg(all(not(feature = "std"), feature = "serde"))] +use alloc::format; +use alloc::vec; use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; -#[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::format; pub mod curve; pub mod generic; @@ -191,7 +196,7 @@ impl Justifications { impl IntoIterator for Justifications { type Item = Justification; - type IntoIter = sp_std::vec::IntoIter; + type IntoIter = alloc::vec::IntoIter; fn into_iter(self) -> Self::IntoIter { self.0.into_iter() @@ -508,11 +513,11 @@ impl From for DispatchOutcome { /// This is the legacy return type of `Dispatchable`. It is still exposed for compatibility reasons. /// The new return type is `DispatchResultWithInfo`. FRAME runtimes should use /// `frame_support::dispatch::DispatchResult`. -pub type DispatchResult = sp_std::result::Result<(), DispatchError>; +pub type DispatchResult = core::result::Result<(), DispatchError>; /// Return type of a `Dispatchable` which contains the `DispatchResult` and additional information /// about the `Dispatchable` that is only known post dispatch. -pub type DispatchResultWithInfo = sp_std::result::Result>; +pub type DispatchResultWithInfo = core::result::Result>; /// Reason why a pallet call failed. #[derive(Eq, Clone, Copy, Encode, Decode, Debug, TypeInfo, MaxEncodedLen)] @@ -911,14 +916,14 @@ impl OpaqueExtrinsic { } } -impl sp_std::fmt::Debug for OpaqueExtrinsic { +impl core::fmt::Debug for OpaqueExtrinsic { #[cfg(feature = "std")] - fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { write!(fmt, "{}", sp_core::hexdisplay::HexDisplay::from(&self.0)) } #[cfg(not(feature = "std"))] - fn fmt(&self, _fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result { Ok(()) } } diff --git a/substrate/primitives/runtime/src/multiaddress.rs b/substrate/primitives/runtime/src/multiaddress.rs index c435606312e..4382405a8eb 100644 --- a/substrate/primitives/runtime/src/multiaddress.rs +++ b/substrate/primitives/runtime/src/multiaddress.rs @@ -17,8 +17,8 @@ //! MultiAddress type is a wrapper for multiple downstream account formats. +use alloc::vec::Vec; use codec::{Decode, Encode}; -use sp_std::vec::Vec; /// A multi-format address wrapper for on-chain accounts. #[derive(Encode, Decode, PartialEq, Eq, Clone, crate::RuntimeDebug, scale_info::TypeInfo)] diff --git a/substrate/primitives/runtime/src/offchain/http.rs b/substrate/primitives/runtime/src/offchain/http.rs index bacc0073825..79899164540 100644 --- a/substrate/primitives/runtime/src/offchain/http.rs +++ b/substrate/primitives/runtime/src/offchain/http.rs @@ -48,15 +48,13 @@ //! assert_eq!(body.error(), &None); //! ``` +use alloc::{str, vec, vec::Vec}; use sp_core::{ offchain::{ HttpError, HttpRequestId as RequestId, HttpRequestStatus as RequestStatus, Timestamp, }, RuntimeDebug, }; -#[cfg(not(feature = "std"))] -use sp_std::prelude::vec; -use sp_std::{prelude::Vec, str}; /// Request method (HTTP verb) #[derive(Clone, PartialEq, Eq, RuntimeDebug)] diff --git a/substrate/primitives/runtime/src/runtime_logger.rs b/substrate/primitives/runtime/src/runtime_logger.rs index 6f1e738eb0e..79984b13567 100644 --- a/substrate/primitives/runtime/src/runtime_logger.rs +++ b/substrate/primitives/runtime/src/runtime_logger.rs @@ -53,7 +53,7 @@ impl log::Log for RuntimeLogger { } fn log(&self, record: &log::Record) { - use sp_std::fmt::Write; + use core::fmt::Write; let mut w = sp_std::Writer::default(); let _ = ::core::write!(&mut w, "{}", record.args()); diff --git a/substrate/primitives/runtime/src/runtime_string.rs b/substrate/primitives/runtime/src/runtime_string.rs index 607ae59db63..71aacf07a76 100644 --- a/substrate/primitives/runtime/src/runtime_string.rs +++ b/substrate/primitives/runtime/src/runtime_string.rs @@ -15,9 +15,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +use alloc::vec::Vec; use codec::{Decode, Encode}; use sp_core::RuntimeDebug; -use sp_std::vec::Vec; /// A string that wraps a `&'static str` in the runtime and `String`/`Vec` on decode. #[derive(Eq, RuntimeDebug, Clone)] @@ -50,7 +50,7 @@ macro_rules! format_runtime_string { } #[cfg(not(feature = "std"))] { - sp_runtime::RuntimeString::Owned(sp_std::alloc::format!($($args)*).as_bytes().to_vec()) + sp_runtime::RuntimeString::Owned(alloc::format!($($args)*).as_bytes().to_vec()) } }}; } diff --git a/substrate/primitives/runtime/src/traits.rs b/substrate/primitives/runtime/src/traits.rs index d023aa045db..25ef15eaf56 100644 --- a/substrate/primitives/runtime/src/traits.rs +++ b/substrate/primitives/runtime/src/traits.rs @@ -26,7 +26,10 @@ use crate::{ }, DispatchResult, }; +use alloc::vec::Vec; use codec::{Codec, Decode, Encode, EncodeLike, FullCodec, MaxEncodedLen}; +#[doc(hidden)] +pub use core::{fmt::Debug, marker::PhantomData}; use impl_trait_for_tuples::impl_for_tuples; #[cfg(feature = "serde")] use serde::{de::DeserializeOwned, Deserialize, Serialize}; @@ -44,9 +47,6 @@ pub use sp_core::{ parameter_types, ConstBool, ConstI128, ConstI16, ConstI32, ConstI64, ConstI8, ConstU128, ConstU16, ConstU32, ConstU64, ConstU8, Get, GetDefault, TryCollect, TypedGet, }; -#[doc(hidden)] -pub use sp_std::marker::PhantomData; -use sp_std::{self, fmt::Debug, prelude::*}; #[cfg(feature = "std")] use std::fmt::Display; #[cfg(feature = "std")] @@ -322,7 +322,7 @@ impl TryMorph for Identity { } /// Implementation of `Morph` which converts between types using `Into`. -pub struct MorphInto(sp_std::marker::PhantomData); +pub struct MorphInto(core::marker::PhantomData); impl> Morph for MorphInto { type Outcome = T; fn morph(a: A) -> T { @@ -331,7 +331,7 @@ impl> Morph for MorphInto { } /// Implementation of `TryMorph` which attempts to convert between types using `TryInto`. -pub struct TryMorphInto(sp_std::marker::PhantomData); +pub struct TryMorphInto(core::marker::PhantomData); impl> TryMorph for TryMorphInto { type Outcome = T; fn try_morph(a: A) -> Result { @@ -692,7 +692,7 @@ impl MaybeEquivalence for Tuple { /// Adapter which turns a [Get] implementation into a [Convert] implementation which always returns /// in the same value no matter the input. -pub struct ConvertToValue(sp_std::marker::PhantomData); +pub struct ConvertToValue(core::marker::PhantomData); impl> Convert for ConvertToValue { fn convert(_: X) -> Y { T::get() @@ -934,17 +934,17 @@ impl Clear for T { pub trait SimpleBitOps: Sized + Clear - + sp_std::ops::BitOr - + sp_std::ops::BitXor - + sp_std::ops::BitAnd + + core::ops::BitOr + + core::ops::BitXor + + core::ops::BitAnd { } impl< T: Sized + Clear - + sp_std::ops::BitOr - + sp_std::ops::BitXor - + sp_std::ops::BitAnd, + + core::ops::BitOr + + core::ops::BitXor + + core::ops::BitAnd, > SimpleBitOps for T { } @@ -988,7 +988,7 @@ pub trait HashOutput: + MaybeDisplay + MaybeFromStr + Debug - + sp_std::hash::Hash + + core::hash::Hash + AsRef<[u8]> + AsMut<[u8]> + Copy @@ -1008,7 +1008,7 @@ impl HashOutput for T where + MaybeDisplay + MaybeFromStr + Debug - + sp_std::hash::Hash + + core::hash::Hash + AsRef<[u8]> + AsMut<[u8]> + Copy @@ -1131,7 +1131,7 @@ sp_core::impl_maybe_marker!( trait MaybeFromStr: FromStr; /// A type that implements Hash when in std environment. - trait MaybeHash: sp_std::hash::Hash; + trait MaybeHash: core::hash::Hash; ); sp_core::impl_maybe_marker_std_or_serde!( @@ -1158,7 +1158,7 @@ pub trait BlockNumber: + MaybeSerializeDeserialize + MaybeFromStr + Debug - + sp_std::hash::Hash + + core::hash::Hash + Copy + MaybeDisplay + AtLeast32BitUnsigned @@ -1176,7 +1176,7 @@ impl< + MaybeSerializeDeserialize + MaybeFromStr + Debug - + sp_std::hash::Hash + + core::hash::Hash + Copy + MaybeDisplay + AtLeast32BitUnsigned @@ -1599,7 +1599,7 @@ pub trait SignedExtension: /// This method provides a default implementation that returns a vec containing a single /// [`SignedExtensionMetadata`]. fn metadata() -> Vec { - sp_std::vec![SignedExtensionMetadata { + alloc::vec![SignedExtensionMetadata { identifier: Self::IDENTIFIER, ty: scale_info::meta_type::(), additional_signed: scale_info::meta_type::() @@ -1702,7 +1702,7 @@ impl SignedExtension for () { type Call = (); type Pre = (); const IDENTIFIER: &'static str = "UnitSignedExtension"; - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { + fn additional_signed(&self) -> core::result::Result<(), TransactionValidityError> { Ok(()) } fn pre_dispatch( @@ -2035,7 +2035,7 @@ macro_rules! impl_opaque_keys_inner { /// The generated key pairs are stored in the keystore. /// /// Returns the concatenated SCALE encoded public keys. - pub fn generate(seed: Option<$crate::sp_std::vec::Vec>) -> $crate::sp_std::vec::Vec { + pub fn generate(seed: Option<$crate::Vec>) -> $crate::Vec { let keys = Self{ $( $field: < @@ -2051,7 +2051,7 @@ macro_rules! impl_opaque_keys_inner { /// Converts `Self` into a `Vec` of `(raw public key, KeyTypeId)`. pub fn into_raw_public_keys( self, - ) -> $crate::sp_std::vec::Vec<($crate::sp_std::vec::Vec, $crate::KeyTypeId)> { + ) -> $crate::Vec<($crate::Vec, $crate::KeyTypeId)> { let mut keys = Vec::new(); $( keys.push(( @@ -2073,7 +2073,7 @@ macro_rules! impl_opaque_keys_inner { /// Returns `None` when the decoding failed, otherwise `Some(_)`. pub fn decode_into_raw_public_keys( encoded: &[u8], - ) -> Option<$crate::sp_std::vec::Vec<($crate::sp_std::vec::Vec, $crate::KeyTypeId)>> { + ) -> Option<$crate::Vec<($crate::Vec, $crate::KeyTypeId)>> { ::decode(&mut &encoded[..]) .ok() .map(|s| s.into_raw_public_keys()) diff --git a/substrate/primitives/runtime/src/transaction_validity.rs b/substrate/primitives/runtime/src/transaction_validity.rs index 83694849382..ffff94e1746 100644 --- a/substrate/primitives/runtime/src/transaction_validity.rs +++ b/substrate/primitives/runtime/src/transaction_validity.rs @@ -21,8 +21,8 @@ use crate::{ codec::{Decode, Encode}, RuntimeDebug, }; +use alloc::{vec, vec::Vec}; use scale_info::TypeInfo; -use sp_std::prelude::*; /// Priority for a transaction. Additive. Higher is better. pub type TransactionPriority = u64; diff --git a/substrate/primitives/version/src/lib.rs b/substrate/primitives/version/src/lib.rs index 789c507742f..55dea364eef 100644 --- a/substrate/primitives/version/src/lib.rs +++ b/substrate/primitives/version/src/lib.rs @@ -33,6 +33,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; #[cfg(feature = "std")] @@ -40,6 +42,8 @@ use std::collections::HashSet; #[cfg(feature = "std")] use std::fmt; +#[doc(hidden)] +pub use alloc::borrow::Cow; use codec::{Decode, Encode, Input}; use scale_info::TypeInfo; use sp_runtime::RuntimeString; @@ -139,13 +143,13 @@ pub use sp_version_proc_macro::runtime_version; pub type ApiId = [u8; 8]; /// A vector of pairs of `ApiId` and a `u32` for version. -pub type ApisVec = sp_std::borrow::Cow<'static, [(ApiId, u32)]>; +pub type ApisVec = alloc::borrow::Cow<'static, [(ApiId, u32)]>; /// Create a vector of Api declarations. #[macro_export] macro_rules! create_apis_vec { ( $y:expr ) => { - $crate::sp_std::borrow::Cow::Borrowed(&$y) + $crate::Cow::Borrowed(&$y) }; } @@ -409,9 +413,9 @@ impl GetNativeVersion for std::sync::Arc { #[cfg(feature = "serde")] mod apis_serialize { use super::*; + use alloc::vec::Vec; use impl_serde::serialize as bytes; use serde::{de, ser::SerializeTuple, Serializer}; - use sp_std::vec::Vec; #[derive(Serialize)] struct ApiId<'a>(#[serde(serialize_with = "serialize_bytesref")] &'a super::ApiId, &'a u32); @@ -446,7 +450,7 @@ mod apis_serialize { impl<'de> de::Visitor<'de> for Visitor { type Value = ApisVec; - fn expecting(&self, formatter: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result { formatter.write_str("a sequence of api id and version tuples") } diff --git a/substrate/test-utils/runtime/src/lib.rs b/substrate/test-utils/runtime/src/lib.rs index a13441302e4..d1a3eaa2daa 100644 --- a/substrate/test-utils/runtime/src/lib.rs +++ b/substrate/test-utils/runtime/src/lib.rs @@ -27,7 +27,6 @@ pub mod extrinsic; pub mod genesismap; pub mod substrate_test_pallet; -use alloc::boxed::Box; #[cfg(not(feature = "std"))] use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; diff --git a/templates/minimal/runtime/src/lib.rs b/templates/minimal/runtime/src/lib.rs index 8c7867f4cc8..08ad537ecdd 100644 --- a/templates/minimal/runtime/src/lib.rs +++ b/templates/minimal/runtime/src/lib.rs @@ -23,6 +23,9 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +extern crate alloc; + +use alloc::{vec, vec::Vec}; use frame::{ deps::frame_support::{ genesis_builder_helper::{build_state, get_preset}, diff --git a/templates/parachain/runtime/src/lib.rs b/templates/parachain/runtime/src/lib.rs index 012ad1d097b..f53871bb185 100644 --- a/templates/parachain/runtime/src/lib.rs +++ b/templates/parachain/runtime/src/lib.rs @@ -13,7 +13,7 @@ mod configs; mod weights; extern crate alloc; -use alloc::{boxed::Box, vec::Vec}; +use alloc::vec::Vec; use smallvec::smallvec; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, diff --git a/templates/solochain/runtime/src/lib.rs b/templates/solochain/runtime/src/lib.rs index 936ecd1bd38..9de95ac9569 100644 --- a/templates/solochain/runtime/src/lib.rs +++ b/templates/solochain/runtime/src/lib.rs @@ -4,7 +4,7 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); extern crate alloc; -use alloc::{boxed::Box, vec, vec::Vec}; +use alloc::{vec, vec::Vec}; use pallet_grandpa::AuthorityId as GrandpaId; use sp_api::impl_runtime_apis; use sp_consensus_aura::sr25519::AuthorityId as AuraId; -- GitLab From c05b0b970942c2bc298f61be62cc2e2b5d46af19 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 15 Jul 2024 23:10:03 +0200 Subject: [PATCH 120/130] Updated substrate-relay version for tests (#5017) ## Testing Both Bridges zombienet tests passed, e.g.: https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/6698640 https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/6698641 https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/6700072 https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/6700073 --- docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile index 634b9f18829..60698de1d6a 100644 --- a/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile +++ b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile @@ -1,7 +1,7 @@ # this image is built on top of existing Zombienet image ARG ZOMBIENET_IMAGE # this image uses substrate-relay image built elsewhere -ARG SUBSTRATE_RELAY_IMAGE=docker.io/paritytech/substrate-relay:v1.6.5 +ARG SUBSTRATE_RELAY_IMAGE=docker.io/paritytech/substrate-relay:v1.6.6 # metadata ARG VCS_REF -- GitLab From 926c1b6adcaa767f4887b5774ef1fdde75156dd9 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Tue, 16 Jul 2024 00:57:08 +0200 Subject: [PATCH 121/130] rpc: add back rpc logger (#4952) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- substrate/client/rpc-servers/src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/substrate/client/rpc-servers/src/lib.rs b/substrate/client/rpc-servers/src/lib.rs index 619498b3333..0bae16b113d 100644 --- a/substrate/client/rpc-servers/src/lib.rs +++ b/substrate/client/rpc-servers/src/lib.rs @@ -224,8 +224,9 @@ where ), }; - let rpc_middleware = - RpcServiceBuilder::new().option_layer(middleware_layer.clone()); + let rpc_middleware = RpcServiceBuilder::new() + .rpc_logger(1024) + .option_layer(middleware_layer.clone()); let mut svc = service_builder.set_rpc_middleware(rpc_middleware).build(methods, stop_handle); -- GitLab From 8d392711f59d60104d0dafba4609d8985a2216e9 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Tue, 16 Jul 2024 11:23:26 +0300 Subject: [PATCH 122/130] net/litep2p: Propagate ValuePut events to the network backend (#5018) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `DhtEvent::ValuePut` was not propagated back to the higher levels. This PR ensures we'll send the ValuePut event similarly to `DhtEvent::ValuePutFailed` ### Next Steps - [ ] A bit more testing Thanks @alexggh for catching this 🙏 cc @paritytech/networking Signed-off-by: Alexandru Vasile --- substrate/client/network/src/litep2p/mod.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/substrate/client/network/src/litep2p/mod.rs b/substrate/client/network/src/litep2p/mod.rs index 824f62082ca..34ca5b71610 100644 --- a/substrate/client/network/src/litep2p/mod.rs +++ b/substrate/client/network/src/litep2p/mod.rs @@ -851,6 +851,10 @@ impl NetworkBackend for Litep2pNetworkBac "`PUT_VALUE` for {key:?} ({query_id:?}) succeeded", ); + self.event_streams.send(Event::Dht( + DhtEvent::ValuePut(libp2p::kad::RecordKey::new(&key)) + )); + if let Some(ref metrics) = self.metrics { metrics .kademlia_query_duration -- GitLab From d8d36a091c9f6387a448aaed0067406c9a2c6416 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Tue, 16 Jul 2024 10:49:11 +0200 Subject: [PATCH 123/130] command-action: added scoped permissions to the github tokens (#5016) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will ensure that malicious code can not access other parts of the project. Co-authored-by: Oliver Tale-Yazdi Co-authored-by: Bastian Köcher --- .github/workflows/command-bench-all.yml | 3 +++ .github/workflows/command-bench-overhead.yml | 3 +++ .github/workflows/command-bench.yml | 3 +++ .github/workflows/command-fmt.yml | 3 +++ .github/workflows/command-sync.yml | 3 +++ .github/workflows/command-update-ui.yml | 3 +++ 6 files changed, 18 insertions(+) diff --git a/.github/workflows/command-bench-all.yml b/.github/workflows/command-bench-all.yml index 6aa4f6f7ff0..4128f86fb7c 100644 --- a/.github/workflows/command-bench-all.yml +++ b/.github/workflows/command-bench-all.yml @@ -66,6 +66,9 @@ jobs: runs-on: arc-runners-polkadot-sdk-weights container: image: ${{ needs.set-image.outputs.IMAGE }} + permissions: + contents: write + pull-requests: write steps: - name: Download repo uses: actions/checkout@v4 diff --git a/.github/workflows/command-bench-overhead.yml b/.github/workflows/command-bench-overhead.yml index 16cbcefcf26..fec8d37bb9e 100644 --- a/.github/workflows/command-bench-overhead.yml +++ b/.github/workflows/command-bench-overhead.yml @@ -45,6 +45,9 @@ jobs: runs-on: arc-runners-polkadot-sdk-benchmark container: image: ${{ needs.set-image.outputs.IMAGE }} + permissions: + contents: write + pull-requests: write steps: - name: Download repo uses: actions/checkout@v4 diff --git a/.github/workflows/command-bench.yml b/.github/workflows/command-bench.yml index b23b06d1b3c..ac879f44375 100644 --- a/.github/workflows/command-bench.yml +++ b/.github/workflows/command-bench.yml @@ -91,6 +91,9 @@ jobs: runs-on: arc-runners-polkadot-sdk-benchmark container: image: ${{ needs.set-image.outputs.IMAGE }} + permissions: + contents: write + pull-requests: write steps: - name: Download repo uses: actions/checkout@v4 diff --git a/.github/workflows/command-fmt.yml b/.github/workflows/command-fmt.yml index c949d0768d7..586b8c77f27 100644 --- a/.github/workflows/command-fmt.yml +++ b/.github/workflows/command-fmt.yml @@ -23,6 +23,9 @@ jobs: timeout-minutes: 20 container: image: ${{ needs.set-image.outputs.IMAGE }} + permissions: + contents: write + pull-requests: write steps: - name: Download repo uses: actions/checkout@v4 diff --git a/.github/workflows/command-sync.yml b/.github/workflows/command-sync.yml index fa5bb9eaf91..c610f4066a8 100644 --- a/.github/workflows/command-sync.yml +++ b/.github/workflows/command-sync.yml @@ -38,6 +38,9 @@ jobs: runs-on: arc-runners-polkadot-sdk-warpsync container: image: ${{ needs.set-image.outputs.IMAGE }} + permissions: + contents: write + pull-requests: write steps: - name: Download repo uses: actions/checkout@v4 diff --git a/.github/workflows/command-update-ui.yml b/.github/workflows/command-update-ui.yml index b6b0420e786..860177adc87 100644 --- a/.github/workflows/command-update-ui.yml +++ b/.github/workflows/command-update-ui.yml @@ -26,6 +26,9 @@ jobs: timeout-minutes: 90 container: image: ${{ needs.set-image.outputs.IMAGE }} + permissions: + contents: write + pull-requests: write steps: - name: Download repo uses: actions/checkout@v4 -- GitLab From 0b3d7607d2f78e9b62d92ccf487f0984f921043e Mon Sep 17 00:00:00 2001 From: Parth Mittal <76661350+mittal-parth@users.noreply.github.com> Date: Tue, 16 Jul 2024 14:23:37 +0530 Subject: [PATCH 124/130] Remove `pallet-getter` usage from pallet-session (#4972) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As per #3326, removes usage of the `pallet::getter` macro from the `session` pallet. The syntax `StorageItem::::get()` should be used instead. Also, adds public functions for compatibility. NOTE: The `./historical` directory has not been modified. cc @muraca polkadot address: 5GsLutpKjbzsbTphebs9Uy4YK6gTN47MAaz6njPktidjR5cp --------- Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: Bastian Köcher --- prdoc/pr_4972.prdoc | 14 ++++ substrate/frame/session/README.md | 2 +- .../frame/session/benchmarking/src/inner.rs | 2 +- substrate/frame/session/src/lib.rs | 74 +++++++++++-------- substrate/frame/session/src/tests.rs | 44 +++++------ 5 files changed, 83 insertions(+), 53 deletions(-) create mode 100644 prdoc/pr_4972.prdoc diff --git a/prdoc/pr_4972.prdoc b/prdoc/pr_4972.prdoc new file mode 100644 index 00000000000..dd9f1b531aa --- /dev/null +++ b/prdoc/pr_4972.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Remove `pallet::getter` usage from pallet-session" + +doc: + - audience: Runtime Dev + description: | + This PR removes the `pallet::getter`s from `pallet-session`. + The syntax `StorageItem::::get()` should be used instead. + +crates: + - name: pallet-session + bump: minor diff --git a/substrate/frame/session/README.md b/substrate/frame/session/README.md index fa7c9b3f983..5a063bffee0 100644 --- a/substrate/frame/session/README.md +++ b/substrate/frame/session/README.md @@ -70,7 +70,7 @@ set. use pallet_session as session; fn validators() -> Vec<::ValidatorId> { - >::validators() + pallet_session::Validators::::get() } ``` diff --git a/substrate/frame/session/benchmarking/src/inner.rs b/substrate/frame/session/benchmarking/src/inner.rs index f08e10f0786..9ba47b34ed7 100644 --- a/substrate/frame/session/benchmarking/src/inner.rs +++ b/substrate/frame/session/benchmarking/src/inner.rs @@ -152,7 +152,7 @@ fn check_membership_proof_setup( Pallet::::on_initialize(frame_system::pallet_prelude::BlockNumberFor::::one()); // skip sessions until the new validator set is enacted - while Session::::validators().len() < n as usize { + while Validators::::get().len() < n as usize { Session::::rotate_session(); } diff --git a/substrate/frame/session/src/lib.rs b/substrate/frame/session/src/lib.rs index 45f70dfa258..e1a2a31911f 100644 --- a/substrate/frame/session/src/lib.rs +++ b/substrate/frame/session/src/lib.rs @@ -95,7 +95,7 @@ //! use pallet_session as session; //! //! fn validators() -> Vec<::ValidatorId> { -//! >::validators() +//! pallet_session::Validators::::get() //! } //! # fn main(){} //! ``` @@ -447,7 +447,7 @@ pub mod pallet { }); for (account, val, keys) in self.keys.iter().cloned() { - >::inner_set_keys(&val, keys) + Pallet::::inner_set_keys(&val, keys) .expect("genesis config must not contain duplicates; qed"); if frame_system::Pallet::::inc_consumers_without_limit(&account).is_err() { // This will leak a provider reference, however it only happens once (at @@ -479,7 +479,7 @@ pub mod pallet { T::SessionHandler::on_genesis_session::(&queued_keys); Validators::::put(initial_validators_0); - >::put(queued_keys); + QueuedKeys::::put(queued_keys); T::SessionManager::start_session(0); } @@ -487,12 +487,10 @@ pub mod pallet { /// The current set of validators. #[pallet::storage] - #[pallet::getter(fn validators)] pub type Validators = StorageValue<_, Vec, ValueQuery>; /// Current index of the session. #[pallet::storage] - #[pallet::getter(fn current_index)] pub type CurrentIndex = StorageValue<_, SessionIndex, ValueQuery>; /// True if the underlying economic identities or weighting behind the validators @@ -503,7 +501,6 @@ pub mod pallet { /// The queued keys for the next session. When the next session begins, these keys /// will be used to determine the validator's session keys. #[pallet::storage] - #[pallet::getter(fn queued_keys)] pub type QueuedKeys = StorageValue<_, Vec<(T::ValidatorId, T::Keys)>, ValueQuery>; /// Indices of disabled validators. @@ -512,7 +509,6 @@ pub mod pallet { /// disabled using binary search. It gets cleared when `on_session_ending` returns /// a new set of identities. #[pallet::storage] - #[pallet::getter(fn disabled_validators)] pub type DisabledValidators = StorageValue<_, Vec, ValueQuery>; /// The next session keys for a validator. @@ -609,33 +605,53 @@ pub mod pallet { } impl Pallet { + /// Public function to access the current set of validators. + pub fn validators() -> Vec { + Validators::::get() + } + + /// Public function to access the current session index. + pub fn current_index() -> SessionIndex { + CurrentIndex::::get() + } + + /// Public function to access the queued keys. + pub fn queued_keys() -> Vec<(T::ValidatorId, T::Keys)> { + QueuedKeys::::get() + } + + /// Public function to access the disabled validators. + pub fn disabled_validators() -> Vec { + DisabledValidators::::get() + } + /// Move on to next session. Register new validator set and session keys. Changes to the /// validator set have a session of delay to take effect. This allows for equivocation /// punishment after a fork. pub fn rotate_session() { - let session_index = >::get(); + let session_index = CurrentIndex::::get(); log::trace!(target: "runtime::session", "rotating session {:?}", session_index); - let changed = >::get(); + let changed = QueuedChanged::::get(); // Inform the session handlers that a session is going to end. T::SessionHandler::on_before_session_ending(); T::SessionManager::end_session(session_index); // Get queued session keys and validators. - let session_keys = >::get(); + let session_keys = QueuedKeys::::get(); let validators = session_keys.iter().map(|(validator, _)| validator.clone()).collect::>(); Validators::::put(&validators); if changed { // reset disabled validators if active set was changed - >::take(); + DisabledValidators::::take(); } // Increment session index. let session_index = session_index + 1; - >::put(session_index); + CurrentIndex::::put(session_index); T::SessionManager::start_session(session_index); @@ -683,8 +699,8 @@ impl Pallet { (queued_amalgamated, changed) }; - >::put(queued_amalgamated.clone()); - >::put(next_changed); + QueuedKeys::::put(queued_amalgamated.clone()); + QueuedChanged::::put(next_changed); // Record that this happened. Self::deposit_event(Event::NewSession { session_index }); @@ -699,7 +715,7 @@ impl Pallet { return false } - >::mutate(|disabled| { + DisabledValidators::::mutate(|disabled| { if let Err(index) = disabled.binary_search(&i) { disabled.insert(index, i); T::SessionHandler::on_disabled(i); @@ -716,7 +732,7 @@ impl Pallet { /// Returns `false` either if the validator could not be found or it was already /// disabled. pub fn disable(c: &T::ValidatorId) -> bool { - Self::validators() + Validators::::get() .iter() .position(|i| i == c) .map(|i| Self::disable_index(i as u32)) @@ -747,7 +763,7 @@ impl Pallet { let new_ids = T::Keys::key_ids(); // Translate NextKeys, and key ownership relations at the same time. - >::translate::(|val, old_keys| { + NextKeys::::translate::(|val, old_keys| { // Clear all key ownership relations. Typically the overlap should // stay the same, but no guarantees by the upgrade function. for i in old_ids.iter() { @@ -764,7 +780,7 @@ impl Pallet { Some(new_keys) }); - let _ = >::translate::, _>(|k| { + let _ = QueuedKeys::::translate::, _>(|k| { k.map(|k| { k.into_iter() .map(|(val, old_keys)| (val.clone(), upgrade(val, old_keys))) @@ -850,28 +866,28 @@ impl Pallet { } fn load_keys(v: &T::ValidatorId) -> Option { - >::get(v) + NextKeys::::get(v) } fn take_keys(v: &T::ValidatorId) -> Option { - >::take(v) + NextKeys::::take(v) } fn put_keys(v: &T::ValidatorId, keys: &T::Keys) { - >::insert(v, keys); + NextKeys::::insert(v, keys); } /// Query the owner of a session key by returning the owner's validator ID. pub fn key_owner(id: KeyTypeId, key_data: &[u8]) -> Option { - >::get((id, key_data)) + KeyOwner::::get((id, key_data)) } fn put_key_owner(id: KeyTypeId, key_data: &[u8], v: &T::ValidatorId) { - >::insert((id, key_data), v) + KeyOwner::::insert((id, key_data), v) } fn clear_key_owner(id: KeyTypeId, key_data: &[u8]) { - >::remove((id, key_data)); + KeyOwner::::remove((id, key_data)); } } @@ -886,11 +902,11 @@ impl ValidatorSet for Pallet { type ValidatorIdOf = T::ValidatorIdOf; fn session_index() -> sp_staking::SessionIndex { - Pallet::::current_index() + CurrentIndex::::get() } fn validators() -> Vec { - Pallet::::validators() + Validators::::get() } } @@ -908,11 +924,11 @@ impl EstimateNextNewSession> for Pallet { impl frame_support::traits::DisabledValidators for Pallet { fn is_disabled(index: u32) -> bool { - >::disabled_validators().binary_search(&index).is_ok() + DisabledValidators::::get().binary_search(&index).is_ok() } fn disabled_validators() -> Vec { - >::disabled_validators() + DisabledValidators::::get() } } @@ -930,7 +946,7 @@ impl> FindAuthor { let i = Inner::find_author(digests)?; - let validators = >::validators(); + let validators = Validators::::get(); validators.get(i as usize).cloned() } } diff --git a/substrate/frame/session/src/tests.rs b/substrate/frame/session/src/tests.rs index 69337e016ea..f392c2ab766 100644 --- a/substrate/frame/session/src/tests.rs +++ b/substrate/frame/session/src/tests.rs @@ -44,7 +44,7 @@ fn initialize_block(block: u64) { fn simple_setup_should_work() { new_test_ext().execute_with(|| { assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]); - assert_eq!(Session::validators(), vec![1, 2, 3]); + assert_eq!(Validators::::get(), vec![1, 2, 3]); }); } @@ -60,7 +60,7 @@ fn put_get_keys() { fn keys_cleared_on_kill() { let mut ext = new_test_ext(); ext.execute_with(|| { - assert_eq!(Session::validators(), vec![1, 2, 3]); + assert_eq!(Validators::::get(), vec![1, 2, 3]); assert_eq!(Session::load_keys(&1), Some(UintAuthorityId(1).into())); let id = DUMMY; @@ -79,7 +79,7 @@ fn keys_cleared_on_kill() { fn purge_keys_works_for_stash_id() { let mut ext = new_test_ext(); ext.execute_with(|| { - assert_eq!(Session::validators(), vec![1, 2, 3]); + assert_eq!(Validators::::get(), vec![1, 2, 3]); TestValidatorIdOf::set(vec![(10, 1), (20, 2), (3, 3)].into_iter().collect()); assert_eq!(Session::load_keys(&1), Some(UintAuthorityId(1).into())); assert_eq!(Session::load_keys(&2), Some(UintAuthorityId(2).into())); @@ -108,10 +108,10 @@ fn authorities_should_track_validators() { force_new_session(); initialize_block(1); assert_eq!( - Session::queued_keys(), + QueuedKeys::::get(), vec![(1, UintAuthorityId(1).into()), (2, UintAuthorityId(2).into()),] ); - assert_eq!(Session::validators(), vec![1, 2, 3]); + assert_eq!(Validators::::get(), vec![1, 2, 3]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]); assert!(before_session_end_called()); reset_before_session_end_called(); @@ -119,10 +119,10 @@ fn authorities_should_track_validators() { force_new_session(); initialize_block(2); assert_eq!( - Session::queued_keys(), + QueuedKeys::::get(), vec![(1, UintAuthorityId(1).into()), (2, UintAuthorityId(2).into()),] ); - assert_eq!(Session::validators(), vec![1, 2]); + assert_eq!(Validators::::get(), vec![1, 2]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2)]); assert!(before_session_end_called()); reset_before_session_end_called(); @@ -132,28 +132,28 @@ fn authorities_should_track_validators() { force_new_session(); initialize_block(3); assert_eq!( - Session::queued_keys(), + QueuedKeys::::get(), vec![ (1, UintAuthorityId(1).into()), (2, UintAuthorityId(2).into()), (4, UintAuthorityId(4).into()), ] ); - assert_eq!(Session::validators(), vec![1, 2]); + assert_eq!(Validators::::get(), vec![1, 2]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2)]); assert!(before_session_end_called()); force_new_session(); initialize_block(4); assert_eq!( - Session::queued_keys(), + QueuedKeys::::get(), vec![ (1, UintAuthorityId(1).into()), (2, UintAuthorityId(2).into()), (4, UintAuthorityId(4).into()), ] ); - assert_eq!(Session::validators(), vec![1, 2, 4]); + assert_eq!(Validators::::get(), vec![1, 2, 4]); assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(4)]); }); } @@ -164,20 +164,20 @@ fn should_work_with_early_exit() { set_session_length(10); initialize_block(1); - assert_eq!(Session::current_index(), 0); + assert_eq!(CurrentIndex::::get(), 0); initialize_block(2); - assert_eq!(Session::current_index(), 0); + assert_eq!(CurrentIndex::::get(), 0); force_new_session(); initialize_block(3); - assert_eq!(Session::current_index(), 1); + assert_eq!(CurrentIndex::::get(), 1); initialize_block(9); - assert_eq!(Session::current_index(), 1); + assert_eq!(CurrentIndex::::get(), 1); initialize_block(10); - assert_eq!(Session::current_index(), 2); + assert_eq!(CurrentIndex::::get(), 2); }); } @@ -402,7 +402,7 @@ fn upgrade_keys() { // Set `QueuedKeys`. { - let storage_key = >::hashed_key(); + let storage_key = super::QueuedKeys::::hashed_key(); assert!(storage::unhashed::exists(&storage_key)); storage::unhashed::put(&storage_key, &val_keys); } @@ -410,7 +410,7 @@ fn upgrade_keys() { // Set `NextKeys`. { for &(i, ref keys) in val_keys.iter() { - let storage_key = >::hashed_key_for(i); + let storage_key = super::NextKeys::::hashed_key_for(i); assert!(storage::unhashed::exists(&storage_key)); storage::unhashed::put(&storage_key, keys); } @@ -446,12 +446,12 @@ fn upgrade_keys() { // Check queued keys. assert_eq!( - Session::queued_keys(), + QueuedKeys::::get(), vec![(1, mock_keys_for(1)), (2, mock_keys_for(2)), (3, mock_keys_for(3)),], ); for i in 1u64..4 { - assert_eq!(>::get(&i), Some(mock_keys_for(i))); + assert_eq!(super::NextKeys::::get(&i), Some(mock_keys_for(i))); } }) } @@ -466,8 +466,8 @@ fn test_migration_v1() { use frame_support::traits::{PalletInfoAccess, StorageVersion}; new_test_ext().execute_with(|| { - assert!(>::iter_values().count() > 0); - assert!(>::exists()); + assert!(HistoricalSessions::::iter_values().count() > 0); + assert!(StoredRange::::exists()); let old_pallet = "Session"; let new_pallet = ::name(); -- GitLab From cde2eb42a6b4ed5e930e59ec4dc03b5fa5059bd5 Mon Sep 17 00:00:00 2001 From: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Date: Tue, 16 Jul 2024 12:51:09 +0300 Subject: [PATCH 125/130] [1 / 5] Optimize logic for gossiping assignments (#4848) This is part of the work to further optimize the approval subsystems, if you want to understand the full context start with reading https://github.com/paritytech/polkadot-sdk/pull/4849#issue-2364261568, however that's not necessary, as this change is self-contained and nodes would benefit from it regardless of subsequent changes landing or not. While testing with 1000 validators I found out that the logic for determining the validators an assignment should be gossiped to is taking a lot of time, because it always iterated through all the peers, to determine which are X and Y neighbours and to which we should randomly gossip(4 samples). This could be actually optimised, so we don't have to iterate through all peers for each new assignment, by fetching the list of X and Y peer ids from the topology first and then stopping the loop once we took the 4 random samples. With this improvements we reduce the total CPU time spent in approval-distribution with 15% on networks with 500 validators and 20% on networks with 1000 validators. ## Test coverage: `propagates_assignments_along_unshared_dimension` and `propagates_locally_generated_assignment_to_both_dimensions` cover already logic and they passed, confirm that there is no breaking change. Additionally, the approval voting benchmark measure the traffic sent to other peers, so I confirmed that for various network size there is no difference in the size of the traffic sent to other peers. --------- Signed-off-by: Alexandru Gheorghe --- .../network/approval-distribution/src/lib.rs | 30 +++++++++++++------ .../approval-distribution/src/tests.rs | 12 +++++--- .../network/protocol/src/grid_topology.rs | 22 ++++++++++++++ prdoc/pr_4848.prdoc | 14 +++++++++ 4 files changed, 65 insertions(+), 13 deletions(-) create mode 100644 prdoc/pr_4848.prdoc diff --git a/polkadot/node/network/approval-distribution/src/lib.rs b/polkadot/node/network/approval-distribution/src/lib.rs index 369d82b45b0..d48fb08a311 100644 --- a/polkadot/node/network/approval-distribution/src/lib.rs +++ b/polkadot/node/network/approval-distribution/src/lib.rs @@ -1431,6 +1431,21 @@ impl State { let required_routing = topology.map_or(RequiredRouting::PendingTopology, |t| { t.local_grid_neighbors().required_routing_by_index(validator_index, local) }); + // Peers that we will send the assignment to. + let mut peers = HashSet::new(); + + let peers_to_route_to = topology + .as_ref() + .map(|t| t.peers_to_route(required_routing)) + .unwrap_or_default(); + + for peer in peers_to_route_to { + if !entry.known_by.contains_key(&peer) { + continue + } + + peers.insert(peer); + } // All the peers that know the relay chain block. let peers_to_filter = entry.known_by(); @@ -1456,20 +1471,13 @@ impl State { let n_peers_total = self.peer_views.len(); let source_peer = source.peer_id(); - // Peers that we will send the assignment to. - let mut peers = Vec::new(); - // Filter destination peers for peer in peers_to_filter.into_iter() { if Some(peer) == source_peer { continue } - if let Some(true) = topology - .as_ref() - .map(|t| t.local_grid_neighbors().route_to_peer(required_routing, &peer)) - { - peers.push(peer); + if peers.contains(&peer) { continue } @@ -1485,7 +1493,11 @@ impl State { if route_random { approval_entry.routing_info_mut().mark_randomly_sent(peer); - peers.push(peer); + peers.insert(peer); + } + + if approval_entry.routing_info().random_routing.is_complete() { + break } } diff --git a/polkadot/node/network/approval-distribution/src/tests.rs b/polkadot/node/network/approval-distribution/src/tests.rs index 5ad03446476..2d08807f97b 100644 --- a/polkadot/node/network/approval-distribution/src/tests.rs +++ b/polkadot/node/network/approval-distribution/src/tests.rs @@ -2404,7 +2404,7 @@ fn propagates_locally_generated_assignment_to_both_dimensions() { let assignments = vec![(cert.clone(), candidate_index)]; let approvals = vec![approval.clone()]; - let assignment_sent_peers = assert_matches!( + let mut assignment_sent_peers = assert_matches!( overseer_recv(overseer).await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( sent_peers, @@ -2428,12 +2428,14 @@ fn propagates_locally_generated_assignment_to_both_dimensions() { assert_matches!( overseer_recv(overseer).await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( - sent_peers, + mut sent_peers, Versioned::V1(protocol_v1::ValidationProtocol::ApprovalDistribution( protocol_v1::ApprovalDistributionMessage::Approvals(sent_approvals) )) )) => { // Random sampling is reused from the assignment. + sent_peers.sort(); + assignment_sent_peers.sort(); assert_eq!(sent_peers, assignment_sent_peers); assert_eq!(sent_approvals, approvals); } @@ -2678,7 +2680,7 @@ fn propagates_to_required_after_connect() { let assignments = vec![(cert.clone(), candidate_index)]; let approvals = vec![approval.clone()]; - let assignment_sent_peers = assert_matches!( + let mut assignment_sent_peers = assert_matches!( overseer_recv(overseer).await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( sent_peers, @@ -2702,12 +2704,14 @@ fn propagates_to_required_after_connect() { assert_matches!( overseer_recv(overseer).await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( - sent_peers, + mut sent_peers, Versioned::V1(protocol_v1::ValidationProtocol::ApprovalDistribution( protocol_v1::ApprovalDistributionMessage::Approvals(sent_approvals) )) )) => { // Random sampling is reused from the assignment. + sent_peers.sort(); + assignment_sent_peers.sort(); assert_eq!(sent_peers, assignment_sent_peers); assert_eq!(sent_approvals, approvals); } diff --git a/polkadot/node/network/protocol/src/grid_topology.rs b/polkadot/node/network/protocol/src/grid_topology.rs index a14d2461072..4dd7d29fc25 100644 --- a/polkadot/node/network/protocol/src/grid_topology.rs +++ b/polkadot/node/network/protocol/src/grid_topology.rs @@ -313,6 +313,23 @@ impl SessionGridTopologyEntry { self.topology.is_validator(peer) } + /// Returns the list of peers to route based on the required routing. + pub fn peers_to_route(&self, required_routing: RequiredRouting) -> Vec { + match required_routing { + RequiredRouting::All => self.topology.peer_ids.iter().copied().collect(), + RequiredRouting::GridX => self.local_neighbors.peers_x.iter().copied().collect(), + RequiredRouting::GridY => self.local_neighbors.peers_y.iter().copied().collect(), + RequiredRouting::GridXY => self + .local_neighbors + .peers_x + .iter() + .chain(self.local_neighbors.peers_y.iter()) + .copied() + .collect(), + RequiredRouting::None | RequiredRouting::PendingTopology => Vec::new(), + } + } + /// Updates the known peer ids for the passed authorities ids. pub fn update_authority_ids( &mut self, @@ -524,6 +541,11 @@ impl RandomRouting { pub fn inc_sent(&mut self) { self.sent += 1 } + + /// Returns `true` if we already took all the necessary samples. + pub fn is_complete(&self) -> bool { + self.sent >= self.target + } } /// Routing mode diff --git a/prdoc/pr_4848.prdoc b/prdoc/pr_4848.prdoc new file mode 100644 index 00000000000..cbc0c8322d7 --- /dev/null +++ b/prdoc/pr_4848.prdoc @@ -0,0 +1,14 @@ +title: Optimize logic for gossiping assignments + +doc: + - audience: Node Dev + description: | + Optimize the logic for gossiping assignments by obtaining the list of peer ids + from the topology instead of iterating through all connected validators, this + gives us a 15% to 20% reduction in cpu usage. + +crates: +- name: polkadot-approval-distribution + bump: minor +- name: polkadot-node-network-protocol + bump: minor \ No newline at end of file -- GitLab From eac2a22a4801e1539a97a7fd5bf5fd3916a4339b Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Tue, 16 Jul 2024 13:15:53 +0200 Subject: [PATCH 126/130] [pallet_contracts] Add support for transient storage in contracts host functions (#4566) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce transient storage, which behaves identically to regular storage but is kept only in memory and discarded after every transaction. This functionality is similar to the `TSTORE` and `TLOAD` operations used in Ethereum. The following new host functions have been introduced: `get_transient_storage` `set_transient_storage` `take_transient_storage` `clear_transient_storage` `contains_transient_storage` Note: These functions are declared as `unstable` and thus are not activated. --------- Co-authored-by: command-bot <> Co-authored-by: PG Herveou Co-authored-by: Alexander Theißen --- .../contracts-rococo/src/contracts.rs | 1 + prdoc/pr_4566.prdoc | 23 + substrate/bin/node/runtime/src/lib.rs | 1 + .../create_transient_storage_and_call.rs | 56 ++ .../contracts/set_transient_storage.rs | 42 + .../fixtures/contracts/transient_storage.rs | 58 ++ .../src/benchmarking/call_builder.rs | 46 +- .../frame/contracts/src/benchmarking/mod.rs | 291 ++++++ substrate/frame/contracts/src/exec.rs | 319 ++++++ substrate/frame/contracts/src/lib.rs | 24 +- substrate/frame/contracts/src/storage.rs | 2 +- substrate/frame/contracts/src/tests.rs | 64 ++ .../frame/contracts/src/transient_storage.rs | 698 +++++++++++++ substrate/frame/contracts/src/wasm/mod.rs | 353 +++++++ substrate/frame/contracts/src/wasm/runtime.rs | 226 ++++- substrate/frame/contracts/src/weights.rs | 950 +++++++++++------- substrate/frame/contracts/uapi/src/host.rs | 84 +- .../frame/contracts/uapi/src/host/riscv32.rs | 20 + .../frame/contracts/uapi/src/host/wasm32.rs | 81 ++ 19 files changed, 2943 insertions(+), 396 deletions(-) create mode 100644 prdoc/pr_4566.prdoc create mode 100644 substrate/frame/contracts/fixtures/contracts/create_transient_storage_and_call.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/set_transient_storage.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/transient_storage.rs create mode 100644 substrate/frame/contracts/src/transient_storage.rs diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs index fcd786711bb..e8cc9d02fb0 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs @@ -65,6 +65,7 @@ impl Config for Runtime { type AddressGenerator = DefaultAddressGenerator; type MaxCodeLen = ConstU32<{ 123 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; + type MaxTransientStorageSize = ConstU32<{ 1 * 1024 * 1024 }>; type UnsafeUnstableInterface = ConstBool; type UploadOrigin = EnsureSigned; type InstantiateOrigin = EnsureSigned; diff --git a/prdoc/pr_4566.prdoc b/prdoc/pr_4566.prdoc new file mode 100644 index 00000000000..ea2979bb363 --- /dev/null +++ b/prdoc/pr_4566.prdoc @@ -0,0 +1,23 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[pallet_contracts] Add support for transient storage in contracts host functions" + +doc: + - audience: Runtime User + description: | + This PR implements transient storage, which behaves identically to regular storage + but is kept only in memory and discarded after every transaction. + This functionality is similar to the `TSTORE` and `TLOAD` operations used in Ethereum. + The following new host functions have been introduced: `get_transient_storage`, + `set_transient_storage`, `take_transient_storage`, `clear_transient_storage` and + `contains_transient_storage`. + These functions are declared as unstable and thus are not activated. + +crates: + - name: pallet-contracts + bump: major + - name: pallet-contracts-uapi + bump: major + - name: contracts-rococo-runtime + bump: minor diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 2d1f52066f8..a1896325ee9 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1373,6 +1373,7 @@ impl pallet_contracts::Config for Runtime { type UploadOrigin = EnsureSigned; type InstantiateOrigin = EnsureSigned; type MaxDebugBufferLen = ConstU32<{ 2 * 1024 * 1024 }>; + type MaxTransientStorageSize = ConstU32<{ 1 * 1024 * 1024 }>; type RuntimeHoldReason = RuntimeHoldReason; #[cfg(not(feature = "runtime-benchmarks"))] type Migrations = (); diff --git a/substrate/frame/contracts/fixtures/contracts/create_transient_storage_and_call.rs b/substrate/frame/contracts/fixtures/contracts/create_transient_storage_and_call.rs new file mode 100644 index 00000000000..6bafee55577 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/create_transient_storage_and_call.rs @@ -0,0 +1,56 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This calls another contract as passed as its account id. It also creates some transient storage. +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + buffer, + len: u32, + input: [u8; 4], + callee: [u8; 32], + ); + + let data = [0u8; 16 * 1024]; + let value = &data[..len as usize]; + #[allow(deprecated)] + api::set_transient_storage(buffer, value); + + // Call the callee + api::call_v2( + uapi::CallFlags::empty(), + callee, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + None, + &0u64.to_le_bytes(), // Value transferred to the contract. + input, + None, + ) + .unwrap(); +} diff --git a/substrate/frame/contracts/fixtures/contracts/set_transient_storage.rs b/substrate/frame/contracts/fixtures/contracts/set_transient_storage.rs new file mode 100644 index 00000000000..e4fde08314c --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/set_transient_storage.rs @@ -0,0 +1,42 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(len: u32, ); + + let buffer = [0u8; 16 * 1024]; + let data = &buffer[..len as usize]; + + // Place a garbage value in the transient storage, with the size specified by the call input. + let mut key = [0u8; 32]; + key[0] = 1; + + #[allow(deprecated)] + api::set_transient_storage(&key, data); +} diff --git a/substrate/frame/contracts/fixtures/contracts/transient_storage.rs b/substrate/frame/contracts/fixtures/contracts/transient_storage.rs new file mode 100644 index 00000000000..c797e17887b --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/transient_storage.rs @@ -0,0 +1,58 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This contract tests the transient storage APIs. +#![no_std] +#![no_main] + +use common::unwrap_output; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + const KEY: [u8; 32] = [1u8; 32]; + const VALUE_1: [u8; 4] = [1u8; 4]; + const VALUE_2: [u8; 4] = [2u8; 4]; + const VALUE_3: [u8; 4] = [3u8; 4]; + + #[allow(deprecated)] + { + let existing = api::set_transient_storage(&KEY, &VALUE_1); + assert_eq!(existing, None); + assert_eq!(api::contains_transient_storage(&KEY), Some(VALUE_1.len() as _)); + unwrap_output!(val, [0u8; 4], api::get_transient_storage, &KEY); + assert_eq!(**val, VALUE_1); + + let existing = api::set_transient_storage(&KEY, &VALUE_2); + assert_eq!(existing, Some(VALUE_1.len() as _)); + unwrap_output!(val, [0u8; 4], api::get_transient_storage, &KEY); + assert_eq!(**val, VALUE_2); + + api::clear_transient_storage(&KEY); + assert_eq!(api::contains_transient_storage(&KEY), None); + + let existing = api::set_transient_storage(&KEY, &VALUE_3); + assert_eq!(existing, None); + unwrap_output!(val, [0u8; 32], api::take_transient_storage, &KEY); + assert_eq!(**val, VALUE_3); + } +} diff --git a/substrate/frame/contracts/src/benchmarking/call_builder.rs b/substrate/frame/contracts/src/benchmarking/call_builder.rs index d87eaba7343..5833639d7ce 100644 --- a/substrate/frame/contracts/src/benchmarking/call_builder.rs +++ b/substrate/frame/contracts/src/benchmarking/call_builder.rs @@ -17,11 +17,12 @@ use crate::{ benchmarking::{Contract, WasmModule}, - exec::Stack, + exec::{Ext, Key, Stack}, storage::meter::Meter, + transient_storage::MeterEntry, wasm::Runtime, - BalanceOf, Config, DebugBufferVec, Determinism, ExecReturnValue, GasMeter, Origin, Schedule, - TypeInfo, WasmBlob, Weight, + BalanceOf, Config, DebugBufferVec, Determinism, Error, ExecReturnValue, GasMeter, Origin, + Schedule, TypeInfo, WasmBlob, Weight, }; use alloc::{vec, vec::Vec}; use codec::{Encode, HasCompact}; @@ -56,6 +57,7 @@ pub struct CallSetup { debug_message: Option>, determinism: Determinism, data: Vec, + transient_storage_size: u32, } impl Default for CallSetup @@ -103,6 +105,7 @@ where debug_message: None, determinism: Determinism::Enforced, data: vec![], + transient_storage_size: 0, } } @@ -126,6 +129,11 @@ where self.data = value; } + /// Set the transient storage size. + pub fn set_transient_storage_size(&mut self, size: u32) { + self.transient_storage_size = size; + } + /// Set the debug message. pub fn enable_debug_message(&mut self) { self.debug_message = Some(Default::default()); @@ -148,7 +156,7 @@ where /// Build the call stack. pub fn ext(&mut self) -> (StackExt<'_, T>, WasmBlob) { - StackExt::bench_new_call( + let mut ext = StackExt::bench_new_call( self.dest.clone(), self.origin.clone(), &mut self.gas_meter, @@ -157,7 +165,11 @@ where self.value, self.debug_message.as_mut(), self.determinism, - ) + ); + if self.transient_storage_size > 0 { + Self::with_transient_storage(&mut ext.0, self.transient_storage_size).unwrap(); + } + ext } /// Prepare a call to the module. @@ -169,6 +181,30 @@ where let (func, store) = module.bench_prepare_call(ext, input); PreparedCall { func, store } } + + /// Add transient_storage + fn with_transient_storage(ext: &mut StackExt, size: u32) -> Result<(), &'static str> { + let &MeterEntry { amount, limit } = ext.transient_storage().meter().current(); + ext.transient_storage().meter().current_mut().limit = size; + for i in 1u32.. { + let mut key_data = i.to_le_bytes().to_vec(); + while key_data.last() == Some(&0) { + key_data.pop(); + } + let key = Key::::try_from_var(key_data).unwrap(); + if let Err(e) = ext.set_transient_storage(&key, Some(Vec::new()), false) { + // Restore previous settings. + ext.transient_storage().meter().current_mut().limit = limit; + ext.transient_storage().meter().current_mut().amount = amount; + if e == Error::::OutOfTransientStorage.into() { + break; + } else { + return Err("Initialization of the transient storage failed"); + } + } + } + Ok(()) + } } #[macro_export] diff --git a/substrate/frame/contracts/src/benchmarking/mod.rs b/substrate/frame/contracts/src/benchmarking/mod.rs index 612f929e8b1..620e6544b08 100644 --- a/substrate/frame/contracts/src/benchmarking/mod.rs +++ b/substrate/frame/contracts/src/benchmarking/mod.rs @@ -31,6 +31,7 @@ use crate::{ migration::{ codegen::LATEST_MIGRATION_VERSION, v09, v10, v11, v12, v13, v14, v15, v16, MigrationStep, }, + storage::WriteOutcome, wasm::BenchEnv, Pallet as Contracts, *, }; @@ -1162,6 +1163,296 @@ mod benchmarks { Ok(()) } + // We use both full and empty benchmarks here instead of benchmarking transient_storage + // (BTreeMap) directly. This approach is necessary because benchmarking this BTreeMap is very + // slow. Additionally, we use linear regression for our benchmarks, and the BTreeMap's log(n) + // complexity can introduce approximation errors. + #[benchmark(pov_mode = Ignored)] + fn set_transient_storage_empty() -> Result<(), BenchmarkError> { + let max_value_len = T::Schedule::get().limits.payload_len; + let max_key_len = T::MaxStorageKeyLen::get(); + let key = Key::::try_from_var(vec![0u8; max_key_len as usize]) + .map_err(|_| "Key has wrong length")?; + let value = Some(vec![42u8; max_value_len as _]); + let mut setup = CallSetup::::default(); + let (mut ext, _) = setup.ext(); + let mut runtime = crate::wasm::Runtime::new(&mut ext, vec![]); + runtime.ext().transient_storage().meter().current_mut().limit = u32::MAX; + let result; + #[block] + { + result = runtime.ext().set_transient_storage(&key, value, false); + } + + assert_eq!(result, Ok(WriteOutcome::New)); + assert_eq!(runtime.ext().get_transient_storage(&key), Some(vec![42u8; max_value_len as _])); + Ok(()) + } + + #[benchmark(pov_mode = Ignored)] + fn set_transient_storage_full() -> Result<(), BenchmarkError> { + let max_value_len = T::Schedule::get().limits.payload_len; + let max_key_len = T::MaxStorageKeyLen::get(); + let key = Key::::try_from_var(vec![0u8; max_key_len as usize]) + .map_err(|_| "Key has wrong length")?; + let value = Some(vec![42u8; max_value_len as _]); + let mut setup = CallSetup::::default(); + setup.set_transient_storage_size(T::MaxTransientStorageSize::get()); + let (mut ext, _) = setup.ext(); + let mut runtime = crate::wasm::Runtime::new(&mut ext, vec![]); + runtime.ext().transient_storage().meter().current_mut().limit = u32::MAX; + let result; + #[block] + { + result = runtime.ext().set_transient_storage(&key, value, false); + } + + assert_eq!(result, Ok(WriteOutcome::New)); + assert_eq!(runtime.ext().get_transient_storage(&key), Some(vec![42u8; max_value_len as _])); + Ok(()) + } + + #[benchmark(pov_mode = Ignored)] + fn get_transient_storage_empty() -> Result<(), BenchmarkError> { + let max_value_len = T::Schedule::get().limits.payload_len; + let max_key_len = T::MaxStorageKeyLen::get(); + let key = Key::::try_from_var(vec![0u8; max_key_len as usize]) + .map_err(|_| "Key has wrong length")?; + + let mut setup = CallSetup::::default(); + let (mut ext, _) = setup.ext(); + let mut runtime = crate::wasm::Runtime::new(&mut ext, vec![]); + runtime.ext().transient_storage().meter().current_mut().limit = u32::MAX; + runtime + .ext() + .set_transient_storage(&key, Some(vec![42u8; max_value_len as _]), false) + .map_err(|_| "Failed to write to transient storage during setup.")?; + let result; + #[block] + { + result = runtime.ext().get_transient_storage(&key); + } + + assert_eq!(result, Some(vec![42u8; max_value_len as _])); + Ok(()) + } + + #[benchmark(pov_mode = Ignored)] + fn get_transient_storage_full() -> Result<(), BenchmarkError> { + let max_value_len = T::Schedule::get().limits.payload_len; + let max_key_len = T::MaxStorageKeyLen::get(); + let key = Key::::try_from_var(vec![0u8; max_key_len as usize]) + .map_err(|_| "Key has wrong length")?; + + let mut setup = CallSetup::::default(); + setup.set_transient_storage_size(T::MaxTransientStorageSize::get()); + let (mut ext, _) = setup.ext(); + let mut runtime = crate::wasm::Runtime::new(&mut ext, vec![]); + runtime.ext().transient_storage().meter().current_mut().limit = u32::MAX; + runtime + .ext() + .set_transient_storage(&key, Some(vec![42u8; max_value_len as _]), false) + .map_err(|_| "Failed to write to transient storage during setup.")?; + let result; + #[block] + { + result = runtime.ext().get_transient_storage(&key); + } + + assert_eq!(result, Some(vec![42u8; max_value_len as _])); + Ok(()) + } + + // The weight of journal rollbacks should be taken into account when setting storage. + #[benchmark(pov_mode = Ignored)] + fn rollback_transient_storage() -> Result<(), BenchmarkError> { + let max_value_len = T::Schedule::get().limits.payload_len; + let max_key_len = T::MaxStorageKeyLen::get(); + let key = Key::::try_from_var(vec![0u8; max_key_len as usize]) + .map_err(|_| "Key has wrong length")?; + + let mut setup = CallSetup::::default(); + setup.set_transient_storage_size(T::MaxTransientStorageSize::get()); + let (mut ext, _) = setup.ext(); + let mut runtime = crate::wasm::Runtime::new(&mut ext, vec![]); + runtime.ext().transient_storage().meter().current_mut().limit = u32::MAX; + runtime.ext().transient_storage().start_transaction(); + runtime + .ext() + .set_transient_storage(&key, Some(vec![42u8; max_value_len as _]), false) + .map_err(|_| "Failed to write to transient storage during setup.")?; + #[block] + { + runtime.ext().transient_storage().rollback_transaction(); + } + + assert_eq!(runtime.ext().get_transient_storage(&key), None); + Ok(()) + } + + // n: new byte size + // o: old byte size + #[benchmark(pov_mode = Measured)] + fn seal_set_transient_storage( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + o: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { + let max_key_len = T::MaxStorageKeyLen::get(); + let key = Key::::try_from_var(vec![0u8; max_key_len as usize]) + .map_err(|_| "Key has wrong length")?; + let value = vec![1u8; n as usize]; + build_runtime!(runtime, memory: [ key.to_vec(), value.clone(), ]); + runtime.ext().transient_storage().meter().current_mut().limit = u32::MAX; + runtime + .ext() + .set_transient_storage(&key, Some(vec![42u8; o as usize]), false) + .map_err(|_| "Failed to write to transient storage during setup.")?; + + let result; + #[block] + { + result = BenchEnv::seal0_set_transient_storage( + &mut runtime, + &mut memory, + 0, // key_ptr + max_key_len, // key_len + max_key_len, // value_ptr + n, // value_len + ); + } + + assert_ok!(result); + assert_eq!(runtime.ext().get_transient_storage(&key).unwrap(), value); + Ok(()) + } + + #[benchmark(pov_mode = Measured)] + fn seal_clear_transient_storage( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { + let max_key_len = T::MaxStorageKeyLen::get(); + let key = Key::::try_from_var(vec![0u8; max_key_len as usize]) + .map_err(|_| "Key has wrong length")?; + build_runtime!(runtime, memory: [ key.to_vec(), ]); + runtime.ext().transient_storage().meter().current_mut().limit = u32::MAX; + runtime + .ext() + .set_transient_storage(&key, Some(vec![42u8; n as usize]), false) + .map_err(|_| "Failed to write to transient storage during setup.")?; + + let result; + #[block] + { + result = + BenchEnv::seal0_clear_transient_storage(&mut runtime, &mut memory, 0, max_key_len); + } + + assert_ok!(result); + assert!(runtime.ext().get_transient_storage(&key).is_none()); + Ok(()) + } + + #[benchmark(pov_mode = Measured)] + fn seal_get_transient_storage( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { + let max_key_len = T::MaxStorageKeyLen::get(); + let key = Key::::try_from_var(vec![0u8; max_key_len as usize]) + .map_err(|_| "Key has wrong length")?; + build_runtime!(runtime, memory: [ key.to_vec(), n.to_le_bytes(), vec![0u8; n as _], ]); + runtime.ext().transient_storage().meter().current_mut().limit = u32::MAX; + runtime + .ext() + .set_transient_storage(&key, Some(vec![42u8; n as usize]), false) + .map_err(|_| "Failed to write to transient storage during setup.")?; + + let out_ptr = max_key_len + 4; + let result; + #[block] + { + result = BenchEnv::seal0_get_transient_storage( + &mut runtime, + &mut memory, + 0, // key_ptr + max_key_len, // key_len + out_ptr, // out_ptr + max_key_len, // out_len_ptr + ); + } + + assert_ok!(result); + assert_eq!( + &runtime.ext().get_transient_storage(&key).unwrap(), + &memory[out_ptr as usize..] + ); + Ok(()) + } + + #[benchmark(pov_mode = Measured)] + fn seal_contains_transient_storage( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { + let max_key_len = T::MaxStorageKeyLen::get(); + let key = Key::::try_from_var(vec![0u8; max_key_len as usize]) + .map_err(|_| "Key has wrong length")?; + build_runtime!(runtime, memory: [ key.to_vec(), ]); + runtime.ext().transient_storage().meter().current_mut().limit = u32::MAX; + runtime + .ext() + .set_transient_storage(&key, Some(vec![42u8; n as usize]), false) + .map_err(|_| "Failed to write to transient storage during setup.")?; + + let result; + #[block] + { + result = BenchEnv::seal0_contains_transient_storage( + &mut runtime, + &mut memory, + 0, + max_key_len, + ); + } + + assert_eq!(result.unwrap(), n); + Ok(()) + } + + #[benchmark(pov_mode = Measured)] + fn seal_take_transient_storage( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { + let n = T::Schedule::get().limits.payload_len; + let max_key_len = T::MaxStorageKeyLen::get(); + let key = Key::::try_from_var(vec![0u8; max_key_len as usize]) + .map_err(|_| "Key has wrong length")?; + build_runtime!(runtime, memory: [ key.to_vec(), n.to_le_bytes(), vec![0u8; n as _], ]); + runtime.ext().transient_storage().meter().current_mut().limit = u32::MAX; + let value = vec![42u8; n as usize]; + runtime + .ext() + .set_transient_storage(&key, Some(value.clone()), false) + .map_err(|_| "Failed to write to transient storage during setup.")?; + + let out_ptr = max_key_len + 4; + let result; + #[block] + { + result = BenchEnv::seal0_take_transient_storage( + &mut runtime, + &mut memory, + 0, // key_ptr + max_key_len, // key_len + out_ptr, // out_ptr + max_key_len, // out_len_ptr + ); + } + + assert_ok!(result); + assert!(&runtime.ext().get_transient_storage(&key).is_none()); + assert_eq!(&value, &memory[out_ptr as usize..]); + Ok(()) + } + // We transfer to unique accounts. #[benchmark(pov_mode = Measured)] fn seal_transfer() { diff --git a/substrate/frame/contracts/src/exec.rs b/substrate/frame/contracts/src/exec.rs index 0cc4844166f..31e0bf50b73 100644 --- a/substrate/frame/contracts/src/exec.rs +++ b/substrate/frame/contracts/src/exec.rs @@ -20,6 +20,7 @@ use crate::{ gas::GasMeter, primitives::{ExecReturnValue, StorageDeposit}, storage::{self, meter::Diff, WriteOutcome}, + transient_storage::TransientStorage, BalanceOf, CodeHash, CodeInfo, CodeInfoOf, Config, ContractInfo, ContractInfoOf, DebugBufferVec, Determinism, Error, Event, Nonce, Origin, Pallet as Contracts, Schedule, LOG_TARGET, @@ -210,6 +211,27 @@ pub trait Ext: sealing::Sealed { take_old: bool, ) -> Result; + /// Returns the transient storage entry of the executing account for the given `key`. + /// + /// Returns `None` if the `key` wasn't previously set by `set_transient_storage` or + /// was deleted. + fn get_transient_storage(&self, key: &Key) -> Option>; + + /// Returns `Some(len)` (in bytes) if a transient storage item exists at `key`. + /// + /// Returns `None` if the `key` wasn't previously set by `set_transient_storage` or + /// was deleted. + fn get_transient_storage_size(&self, key: &Key) -> Option; + + /// Sets the transient storage entry for the given key to the specified value. If `value` is + /// `None` then the storage entry is deleted. + fn set_transient_storage( + &mut self, + key: &Key, + value: Option>, + take_old: bool, + ) -> Result; + /// Returns the caller. fn caller(&self) -> Origin; @@ -308,6 +330,12 @@ pub trait Ext: sealing::Sealed { #[cfg(any(test, feature = "runtime-benchmarks"))] fn contract_info(&mut self) -> &mut ContractInfo; + /// Get a mutable reference to the transient storage. + /// Useful in benchmarks when it is sometimes necessary to modify and inspect the transient + /// storage directly. + #[cfg(feature = "runtime-benchmarks")] + fn transient_storage(&mut self) -> &mut TransientStorage; + /// Sets new code hash for existing contract. fn set_code_hash(&mut self, hash: CodeHash) -> DispatchResult; @@ -474,6 +502,8 @@ pub struct Stack<'a, T: Config, E> { debug_message: Option<&'a mut DebugBufferVec>, /// The determinism requirement of this call stack. determinism: Determinism, + /// Transient storage used to store data, which is kept for the duration of a transaction. + transient_storage: TransientStorage, /// No executable is held by the struct but influences its behaviour. _phantom: PhantomData, } @@ -797,6 +827,7 @@ where frames: Default::default(), debug_message, determinism, + transient_storage: TransientStorage::new(T::MaxTransientStorageSize::get()), _phantom: Default::default(), }; @@ -927,6 +958,9 @@ where let entry_point = frame.entry_point; let delegated_code_hash = if frame.delegate_caller.is_some() { Some(*executable.code_hash()) } else { None }; + + self.transient_storage.start_transaction(); + let do_transaction = || { // We need to charge the storage deposit before the initial transfer so that // it can create the account in case the initial transfer is < ed. @@ -1047,6 +1081,12 @@ where Err(error) => (false, Err(error.into())), }; + if success { + self.transient_storage.commit_transaction(); + } else { + self.transient_storage.rollback_transaction(); + } + self.pop_frame(success); output } @@ -1375,6 +1415,24 @@ where ) } + fn get_transient_storage(&self, key: &Key) -> Option> { + self.transient_storage.read(self.address(), key) + } + + fn get_transient_storage_size(&self, key: &Key) -> Option { + self.transient_storage.read(self.address(), key).map(|value| value.len() as _) + } + + fn set_transient_storage( + &mut self, + key: &Key, + value: Option>, + take_old: bool, + ) -> Result { + let account_id = self.address().clone(); + self.transient_storage.write(&account_id, key, value, take_old) + } + fn address(&self) -> &T::AccountId { &self.top_frame().account_id } @@ -1519,6 +1577,11 @@ where self.top_frame_mut().contract_info() } + #[cfg(feature = "runtime-benchmarks")] + fn transient_storage(&mut self) -> &mut TransientStorage { + &mut self.transient_storage + } + fn set_code_hash(&mut self, hash: CodeHash) -> DispatchResult { let frame = top_frame_mut!(self); if !E::from_storage(hash, &mut frame.nested_gas)?.is_deterministic() { @@ -3827,6 +3890,262 @@ mod tests { }); } + #[test] + fn set_transient_storage_works() { + let code_hash = MockLoader::insert(Call, |ctx, _| { + // Write + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([1; 32]), Some(vec![1, 2, 3]), false), + Ok(WriteOutcome::New) + ); + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([2; 32]), Some(vec![4, 5, 6]), true), + Ok(WriteOutcome::New) + ); + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([3; 32]), None, false), + Ok(WriteOutcome::New) + ); + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([4; 32]), None, true), + Ok(WriteOutcome::New) + ); + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([5; 32]), Some(vec![]), false), + Ok(WriteOutcome::New) + ); + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([6; 32]), Some(vec![]), true), + Ok(WriteOutcome::New) + ); + + // Overwrite + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([1; 32]), Some(vec![42]), false), + Ok(WriteOutcome::Overwritten(3)) + ); + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([2; 32]), Some(vec![48]), true), + Ok(WriteOutcome::Taken(vec![4, 5, 6])) + ); + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([3; 32]), None, false), + Ok(WriteOutcome::New) + ); + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([4; 32]), None, true), + Ok(WriteOutcome::New) + ); + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([5; 32]), Some(vec![]), false), + Ok(WriteOutcome::Overwritten(0)) + ); + assert_eq!( + ctx.ext.set_transient_storage(&Key::Fix([6; 32]), Some(vec![]), true), + Ok(WriteOutcome::Taken(vec![])) + ); + + exec_success() + }); + + ExtBuilder::default().build().execute_with(|| { + let schedule = ::Schedule::get(); + place_contract(&BOB, code_hash); + let contract_origin = Origin::from_account_id(ALICE); + let mut storage_meter = storage::meter::Meter::new(&contract_origin, None, 0).unwrap(); + assert_ok!(MockStack::run_call( + contract_origin, + BOB, + &mut GasMeter::::new(GAS_LIMIT), + &mut storage_meter, + &schedule, + 0, + vec![], + None, + Determinism::Enforced + )); + }); + } + + #[test] + fn get_transient_storage_works() { + // Call stack: BOB -> CHARLIE(success) -> BOB' (success) + let storage_key_1 = &Key::Fix([1; 32]); + let storage_key_2 = &Key::Fix([2; 32]); + let storage_key_3 = &Key::Fix([3; 32]); + let code_bob = MockLoader::insert(Call, |ctx, _| { + if ctx.input_data[0] == 0 { + assert_eq!( + ctx.ext.set_transient_storage(storage_key_1, Some(vec![1, 2]), false), + Ok(WriteOutcome::New) + ); + assert_eq!( + ctx.ext.call( + Weight::zero(), + BalanceOf::::zero(), + CHARLIE, + 0, + vec![], + true, + false, + ), + exec_success() + ); + assert_eq!(ctx.ext.get_transient_storage(storage_key_1), Some(vec![3])); + assert_eq!(ctx.ext.get_transient_storage(storage_key_2), Some(vec![])); + assert_eq!(ctx.ext.get_transient_storage(storage_key_3), None); + } else { + assert_eq!( + ctx.ext.set_transient_storage(storage_key_1, Some(vec![3]), true), + Ok(WriteOutcome::Taken(vec![1, 2])) + ); + assert_eq!( + ctx.ext.set_transient_storage(storage_key_2, Some(vec![]), false), + Ok(WriteOutcome::New) + ); + } + exec_success() + }); + let code_charlie = MockLoader::insert(Call, |ctx, _| { + assert!(ctx + .ext + .call(Weight::zero(), BalanceOf::::zero(), BOB, 0, vec![99], true, false) + .is_ok()); + // CHARLIE can not read BOB`s storage. + assert_eq!(ctx.ext.get_transient_storage(storage_key_1), None); + exec_success() + }); + + // This one tests passing the input data into a contract via call. + ExtBuilder::default().build().execute_with(|| { + let schedule = ::Schedule::get(); + place_contract(&BOB, code_bob); + place_contract(&CHARLIE, code_charlie); + let contract_origin = Origin::from_account_id(ALICE); + let mut storage_meter = + storage::meter::Meter::new(&contract_origin, Some(0), 0).unwrap(); + + let result = MockStack::run_call( + contract_origin, + BOB, + &mut GasMeter::::new(GAS_LIMIT), + &mut storage_meter, + &schedule, + 0, + vec![0], + None, + Determinism::Enforced, + ); + assert_matches!(result, Ok(_)); + }); + } + + #[test] + fn get_transient_storage_size_works() { + let storage_key_1 = &Key::Fix([1; 32]); + let storage_key_2 = &Key::Fix([2; 32]); + let storage_key_3 = &Key::Fix([3; 32]); + let code_hash = MockLoader::insert(Call, |ctx, _| { + assert_eq!( + ctx.ext.set_transient_storage(storage_key_1, Some(vec![1, 2, 3]), false), + Ok(WriteOutcome::New) + ); + assert_eq!( + ctx.ext.set_transient_storage(storage_key_2, Some(vec![]), false), + Ok(WriteOutcome::New) + ); + assert_eq!(ctx.ext.get_transient_storage_size(storage_key_1), Some(3)); + assert_eq!(ctx.ext.get_transient_storage_size(storage_key_2), Some(0)); + assert_eq!(ctx.ext.get_transient_storage_size(storage_key_3), None); + + exec_success() + }); + + ExtBuilder::default().build().execute_with(|| { + let schedule = ::Schedule::get(); + place_contract(&BOB, code_hash); + let contract_origin = Origin::from_account_id(ALICE); + let mut storage_meter = + storage::meter::Meter::new(&contract_origin, Some(0), 0).unwrap(); + assert_ok!(MockStack::run_call( + contract_origin, + BOB, + &mut GasMeter::::new(GAS_LIMIT), + &mut storage_meter, + &schedule, + 0, + vec![], + None, + Determinism::Enforced + )); + }); + } + + #[test] + fn rollback_transient_storage_works() { + // Call stack: BOB -> CHARLIE (trap) -> BOB' (success) + let storage_key = &Key::Fix([1; 32]); + let code_bob = MockLoader::insert(Call, |ctx, _| { + if ctx.input_data[0] == 0 { + assert_eq!( + ctx.ext.set_transient_storage(storage_key, Some(vec![1, 2]), false), + Ok(WriteOutcome::New) + ); + assert_eq!( + ctx.ext.call( + Weight::zero(), + BalanceOf::::zero(), + CHARLIE, + 0, + vec![], + true, + false + ), + exec_trapped() + ); + assert_eq!(ctx.ext.get_transient_storage(storage_key), Some(vec![1, 2])); + } else { + let overwritten_length = ctx.ext.get_transient_storage_size(storage_key).unwrap(); + assert_eq!( + ctx.ext.set_transient_storage(storage_key, Some(vec![3]), false), + Ok(WriteOutcome::Overwritten(overwritten_length)) + ); + assert_eq!(ctx.ext.get_transient_storage(storage_key), Some(vec![3])); + } + exec_success() + }); + let code_charlie = MockLoader::insert(Call, |ctx, _| { + assert!(ctx + .ext + .call(Weight::zero(), BalanceOf::::zero(), BOB, 0, vec![99], true, false) + .is_ok()); + exec_trapped() + }); + + // This one tests passing the input data into a contract via call. + ExtBuilder::default().build().execute_with(|| { + let schedule = ::Schedule::get(); + place_contract(&BOB, code_bob); + place_contract(&CHARLIE, code_charlie); + let contract_origin = Origin::from_account_id(ALICE); + let mut storage_meter = + storage::meter::Meter::new(&contract_origin, Some(0), 0).unwrap(); + + let result = MockStack::run_call( + contract_origin, + BOB, + &mut GasMeter::::new(GAS_LIMIT), + &mut storage_meter, + &schedule, + 0, + vec![0], + None, + Determinism::Enforced, + ); + assert_matches!(result, Ok(_)); + }); + } + #[test] fn ecdsa_to_eth_address_returns_proper_value() { let bob_ch = MockLoader::insert(Call, |ctx, _| { diff --git a/substrate/frame/contracts/src/lib.rs b/substrate/frame/contracts/src/lib.rs index ed00fdca62f..093adc07ab4 100644 --- a/substrate/frame/contracts/src/lib.rs +++ b/substrate/frame/contracts/src/lib.rs @@ -97,6 +97,7 @@ pub use primitives::*; mod schedule; mod storage; +mod transient_storage; mod wasm; pub mod chain_extension; @@ -388,6 +389,11 @@ pub mod pallet { #[pallet::constant] type MaxStorageKeyLen: Get; + /// The maximum size of the transient storage in bytes. + /// This includes keys, values, and previous entries used for storage rollback. + #[pallet::constant] + type MaxTransientStorageSize: Get; + /// The maximum number of delegate_dependencies that a contract can lock with /// [`chain_extension::Ext::lock_delegate_dependency`]. #[pallet::constant] @@ -554,6 +560,7 @@ pub mod pallet { type MaxDebugBufferLen = ConstU32<{ 2 * 1024 * 1024 }>; type MaxDelegateDependencies = MaxDelegateDependencies; type MaxStorageKeyLen = ConstU32<128>; + type MaxTransientStorageSize = ConstU32<{ 1 * 1024 * 1024 }>; type Migrations = (); type Time = Self; type Randomness = Self; @@ -605,7 +612,11 @@ pub mod pallet { // Max call depth is CallStack::size() + 1 let max_call_depth = u32::try_from(T::CallStack::size().saturating_add(1)) .expect("CallStack size is too big"); - + // Transient storage uses a BTreeMap, which has overhead compared to the raw size of + // key-value data. To ensure safety, a margin of 2x the raw key-value size is used. + let max_transient_storage_size = T::MaxTransientStorageSize::get() + .checked_mul(2) + .expect("MaxTransientStorageSize is too large"); // Check that given configured `MaxCodeLen`, runtime heap memory limit can't be broken. // // In worst case, the decoded Wasm contract code would be `x16` times larger than the @@ -615,7 +626,7 @@ pub mod pallet { // Next, the pallet keeps the Wasm blob for each // contract, hence we add up `MaxCodeLen` to the safety margin. // - // Finally, the inefficiencies of the freeing-bump allocator + // The inefficiencies of the freeing-bump allocator // being used in the client for the runtime memory allocations, could lead to possible // memory allocations for contract code grow up to `x4` times in some extreme cases, // which gives us total multiplier of `17*4` for `MaxCodeLen`. @@ -624,17 +635,20 @@ pub mod pallet { // memory should be available. Note that maximum allowed heap memory and stack size per // each contract (stack frame) should also be counted. // + // The pallet holds transient storage with a size up to `max_transient_storage_size`. + // // Finally, we allow 50% of the runtime memory to be utilized by the contracts call // stack, keeping the rest for other facilities, such as PoV, etc. // // This gives us the following formula: // - // `(MaxCodeLen * 17 * 4 + MAX_STACK_SIZE + max_heap_size) * max_call_depth < - // max_runtime_mem/2` + // `(MaxCodeLen * 17 * 4 + MAX_STACK_SIZE + max_heap_size) * max_call_depth + + // max_transient_storage_size < max_runtime_mem/2` // // Hence the upper limit for the `MaxCodeLen` can be defined as follows: let code_len_limit = max_runtime_mem .saturating_div(2) + .saturating_sub(max_transient_storage_size) .saturating_div(max_call_depth) .saturating_sub(max_heap_size) .saturating_sub(MAX_STACK_SIZE) @@ -1235,6 +1249,8 @@ pub mod pallet { DelegateDependencyAlreadyExists, /// Can not add a delegate dependency to the code hash of the contract itself. CannotAddSelfAsDelegateDependency, + /// Can not add more data to transient storage. + OutOfTransientStorage, } /// A reason for the pallet contracts placing a hold on funds. diff --git a/substrate/frame/contracts/src/storage.rs b/substrate/frame/contracts/src/storage.rs index 23b5a2514eb..65e7129cdf8 100644 --- a/substrate/frame/contracts/src/storage.rs +++ b/substrate/frame/contracts/src/storage.rs @@ -335,7 +335,7 @@ impl ContractInfo { } /// Information about what happened to the pre-existing value when calling [`ContractInfo::write`]. -#[cfg_attr(test, derive(Debug, PartialEq))] +#[cfg_attr(any(test, feature = "runtime-benchmarks"), derive(Debug, PartialEq))] pub enum WriteOutcome { /// No value existed at the specified key. New, diff --git a/substrate/frame/contracts/src/tests.rs b/substrate/frame/contracts/src/tests.rs index 3f608d90bea..cc2a69b5c41 100644 --- a/substrate/frame/contracts/src/tests.rs +++ b/substrate/frame/contracts/src/tests.rs @@ -411,6 +411,7 @@ parameter_types! { pub static DepositPerByte: BalanceOf = 1; pub const DepositPerItem: BalanceOf = 2; pub static MaxDelegateDependencies: u32 = 32; + pub static MaxTransientStorageSize: u32 = 4 * 1024; pub static CodeHashLockupDepositPercent: Perbill = Perbill::from_percent(0); // We need this one set high enough for running benchmarks. @@ -504,6 +505,7 @@ impl Config for Test { type Migrations = crate::migration::codegen::BenchMigrations; type CodeHashLockupDepositPercent = CodeHashLockupDepositPercent; type MaxDelegateDependencies = MaxDelegateDependencies; + type MaxTransientStorageSize = MaxTransientStorageSize; type Debug = TestDebug; } @@ -962,6 +964,68 @@ fn storage_max_value_limit() { }); } +#[test] +fn transient_storage_work() { + let (code, _code_hash) = compile_module::("transient_storage").unwrap(); + + ExtBuilder::default().build().execute_with(|| { + let _ = ::Currency::set_balance(&ALICE, 1_000_000); + let min_balance = Contracts::min_balance(); + let addr = builder::bare_instantiate(Code::Upload(code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); + + builder::bare_call(addr).build_and_unwrap_result(); + }); +} + +#[test] +fn transient_storage_limit_in_call() { + let (wasm_caller, _code_hash_caller) = + compile_module::("create_transient_storage_and_call").unwrap(); + let (wasm_callee, _code_hash_callee) = compile_module::("set_transient_storage").unwrap(); + ExtBuilder::default().build().execute_with(|| { + let _ = ::Currency::set_balance(&ALICE, 1_000_000); + let min_balance = Contracts::min_balance(); + + // Create both contracts: Constructors do nothing. + let addr_caller = builder::bare_instantiate(Code::Upload(wasm_caller)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); + let addr_callee = builder::bare_instantiate(Code::Upload(wasm_callee)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); + + let storage_value_size = 1000; + MaxTransientStorageSize::set(4 * 1024); + // Call contracts with storage values within the limit. + // Caller and Callee contracts each set a transient storage value of size 1000. + assert_ok!(builder::call(addr_caller.clone()) + .data((storage_value_size, storage_value_size, &addr_callee).encode()) + .build(),); + + MaxTransientStorageSize::set(512); + // Call a contract with a storage value that is too large. + // Limit exceeded in the caller contract. + assert_err_ignore_postinfo!( + builder::call(addr_caller.clone()) + .data((storage_value_size, storage_value_size, &addr_callee).encode()) + .build(), + >::OutOfTransientStorage, + ); + + MaxTransientStorageSize::set(1536); + // Call a contract with a storage value that is too large. + // Limit exceeded in the callee contract. + assert_err_ignore_postinfo!( + builder::call(addr_caller) + .data((storage_value_size, storage_value_size, &addr_callee).encode()) + .build(), + >::ContractTrapped + ); + }); +} + #[test] fn deploy_and_call_other_contract() { let (caller_wasm, _caller_code_hash) = compile_module::("caller_contract").unwrap(); diff --git a/substrate/frame/contracts/src/transient_storage.rs b/substrate/frame/contracts/src/transient_storage.rs new file mode 100644 index 00000000000..c795a966385 --- /dev/null +++ b/substrate/frame/contracts/src/transient_storage.rs @@ -0,0 +1,698 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This module contains routines for accessing and altering a contract transient storage. + +use crate::{ + exec::{AccountIdOf, Key}, + storage::WriteOutcome, + Config, Error, +}; +use codec::Encode; +use core::marker::PhantomData; +use frame_support::DefaultNoBound; +use sp_runtime::{DispatchError, DispatchResult, Saturating}; +use sp_std::{collections::btree_map::BTreeMap, mem, vec::Vec}; + +/// Meter entry tracks transaction allocations. +#[derive(Default, Debug)] +pub struct MeterEntry { + /// Allocations made in the current transaction. + pub amount: u32, + /// Allocations limit in the current transaction. + pub limit: u32, +} + +impl MeterEntry { + /// Create a new entry. + fn new(limit: u32) -> Self { + Self { limit, amount: Default::default() } + } + + /// Check if the allocated amount exceeds the limit. + fn exceeds_limit(&self, amount: u32) -> bool { + self.amount.saturating_add(amount) > self.limit + } + + /// Absorb the allocation amount of the nested entry into the current entry. + fn absorb(&mut self, rhs: Self) { + self.amount.saturating_accrue(rhs.amount) + } +} + +// The storage meter enforces a limit for each transaction, +// which is calculated as free_storage * (1 - 1/16) for each subsequent frame. +#[derive(DefaultNoBound)] +pub struct StorageMeter { + nested_meters: Vec, + root_meter: MeterEntry, + _phantom: PhantomData, +} + +impl StorageMeter { + const STORAGE_FRACTION_DENOMINATOR: u32 = 16; + /// Create a new storage allocation meter. + fn new(memory_limit: u32) -> Self { + Self { root_meter: MeterEntry::new(memory_limit), ..Default::default() } + } + + /// Charge the allocated amount of transaction storage from the meter. + fn charge(&mut self, amount: u32) -> DispatchResult { + let meter = self.current_mut(); + if meter.exceeds_limit(amount) { + return Err(Error::::OutOfTransientStorage.into()); + } + meter.amount.saturating_accrue(amount); + Ok(()) + } + + /// Revert a transaction meter. + fn revert(&mut self) { + self.nested_meters.pop().expect( + "A call to revert a meter must be preceded by a corresponding call to start a meter; + the code within this crate makes sure that this is always the case; qed", + ); + } + + /// Start a transaction meter. + fn start(&mut self) { + let meter = self.current(); + let mut transaction_limit = meter.limit.saturating_sub(meter.amount); + if !self.nested_meters.is_empty() { + // Allow use of (1 - 1/STORAGE_FRACTION_DENOMINATOR) of free storage for subsequent + // calls. + transaction_limit.saturating_reduce( + transaction_limit.saturating_div(Self::STORAGE_FRACTION_DENOMINATOR), + ); + } + + self.nested_meters.push(MeterEntry::new(transaction_limit)); + } + + /// Commit a transaction meter. + fn commit(&mut self) { + let transaction_meter = self.nested_meters.pop().expect( + "A call to commit a meter must be preceded by a corresponding call to start a meter; + the code within this crate makes sure that this is always the case; qed", + ); + self.current_mut().absorb(transaction_meter) + } + + /// The total allocated amount of memory. + #[cfg(test)] + fn total_amount(&self) -> u32 { + self.nested_meters + .iter() + .fold(self.root_meter.amount, |acc, e| acc.saturating_add(e.amount)) + } + + /// A mutable reference to the current meter entry. + pub fn current_mut(&mut self) -> &mut MeterEntry { + self.nested_meters.last_mut().unwrap_or(&mut self.root_meter) + } + + /// A reference to the current meter entry. + pub fn current(&self) -> &MeterEntry { + self.nested_meters.last().unwrap_or(&self.root_meter) + } +} + +/// An entry representing a journal change. +struct JournalEntry { + key: Vec, + prev_value: Option>, +} + +impl JournalEntry { + /// Create a new change. + fn new(key: Vec, prev_value: Option>) -> Self { + Self { key, prev_value } + } + + /// Revert the change. + fn revert(self, storage: &mut Storage) { + storage.write(&self.key, self.prev_value); + } +} + +/// A journal containing transient storage modifications. +struct Journal(Vec); + +impl Journal { + /// Create a new journal. + fn new() -> Self { + Self(Default::default()) + } + + /// Add a change to the journal. + fn push(&mut self, entry: JournalEntry) { + self.0.push(entry); + } + + /// Length of the journal. + fn len(&self) -> usize { + self.0.len() + } + + /// Roll back all journal changes until the chackpoint + fn rollback(&mut self, storage: &mut Storage, checkpoint: usize) { + self.0.drain(checkpoint..).rev().for_each(|entry| entry.revert(storage)); + } +} + +/// Storage for maintaining the current transaction state. +#[derive(Default)] +struct Storage(BTreeMap, Vec>); + +impl Storage { + /// Read the storage entry. + fn read(&self, key: &Vec) -> Option> { + self.0.get(key).cloned() + } + + /// Write the storage entry. + fn write(&mut self, key: &Vec, value: Option>) -> Option> { + if let Some(value) = value { + // Insert storage entry. + self.0.insert(key.clone(), value) + } else { + // Remove storage entry. + self.0.remove(key) + } + } +} + +/// Transient storage behaves almost identically to regular storage but is discarded after each +/// transaction. It consists of a `BTreeMap` for the current state, a journal of all changes, and a +/// list of checkpoints. On entry to the `start_transaction` function, a marker (checkpoint) is +/// added to the list. New values are written to the current state, and the previous value is +/// recorded in the journal (`write`). When the `commit_transaction` function is called, the marker +/// to the journal index (checkpoint) of when that call was entered is discarded. +/// On `rollback_transaction`, all entries are reverted up to the last checkpoint. +pub struct TransientStorage { + // The storage and journal size is limited by the storage meter. + storage: Storage, + journal: Journal, + // The size of the StorageMeter is limited by the stack depth. + meter: StorageMeter, + // The size of the checkpoints is limited by the stack depth. + checkpoints: Vec, +} + +impl TransientStorage { + /// Create new transient storage with the supplied memory limit. + pub fn new(memory_limit: u32) -> Self { + TransientStorage { + storage: Default::default(), + journal: Journal::new(), + checkpoints: Default::default(), + meter: StorageMeter::new(memory_limit), + } + } + + /// Read the storage value. If the entry does not exist, `None` is returned. + pub fn read(&self, account: &AccountIdOf, key: &Key) -> Option> { + self.storage.read(&Self::storage_key(&account.encode(), &key.hash())) + } + + /// Write a value to storage. + /// + /// If the `value` is `None`, then the entry is removed. If `take` is true, + /// a [`WriteOutcome::Taken`] is returned instead of a [`WriteOutcome::Overwritten`]. + /// If the entry did not exist, [`WriteOutcome::New`] is returned. + pub fn write( + &mut self, + account: &AccountIdOf, + key: &Key, + value: Option>, + take: bool, + ) -> Result { + let key = Self::storage_key(&account.encode(), &key.hash()); + let prev_value = self.storage.read(&key); + // Skip if the same value is being set. + if prev_value != value { + // Calculate the allocation size. + if let Some(value) = &value { + // Charge the key, value and journal entry. + // If a new value is written, a new journal entry is created. The previous value is + // moved to the journal along with its key, and the new value is written to + // storage. + let key_len = key.capacity(); + let mut amount = value + .capacity() + .saturating_add(key_len) + .saturating_add(mem::size_of::()); + if prev_value.is_none() { + // Charge a new storage entry. + // If there was no previous value, a new entry is added to storage (BTreeMap) + // containing a Vec for the key and a Vec for the value. The value was already + // included in the amount. + amount.saturating_accrue(key_len.saturating_add(mem::size_of::>())); + } + self.meter.charge(amount as _)?; + } + self.storage.write(&key, value); + // Update the journal. + self.journal.push(JournalEntry::new(key, prev_value.clone())); + } + + Ok(match (take, prev_value) { + (_, None) => WriteOutcome::New, + (false, Some(prev_value)) => WriteOutcome::Overwritten(prev_value.len() as _), + (true, Some(prev_value)) => WriteOutcome::Taken(prev_value), + }) + } + + /// Start a new nested transaction. + /// + /// This allows to either commit or roll back all changes that are made after this call. + /// For every transaction there must be a matching call to either `rollback_transaction` + /// or `commit_transaction`. + pub fn start_transaction(&mut self) { + self.meter.start(); + self.checkpoints.push(self.journal.len()); + } + + /// Rollback the last transaction started by `start_transaction`. + /// + /// Any changes made during that transaction are discarded. + /// + /// # Panics + /// + /// Will panic if there is no open transaction. + pub fn rollback_transaction(&mut self) { + let checkpoint = self + .checkpoints + .pop() + .expect( + "A call to rollback_transaction must be preceded by a corresponding call to start_transaction; + the code within this crate makes sure that this is always the case; qed" + ); + self.meter.revert(); + self.journal.rollback(&mut self.storage, checkpoint); + } + + /// Commit the last transaction started by `start_transaction`. + /// + /// Any changes made during that transaction are committed. + /// + /// # Panics + /// + /// Will panic if there is no open transaction. + pub fn commit_transaction(&mut self) { + self.checkpoints + .pop() + .expect( + "A call to commit_transaction must be preceded by a corresponding call to start_transaction; + the code within this crate makes sure that this is always the case; qed" + ); + self.meter.commit(); + } + + /// The storage allocation meter used for transaction metering. + #[cfg(any(test, feature = "runtime-benchmarks"))] + pub fn meter(&mut self) -> &mut StorageMeter { + return &mut self.meter + } + + fn storage_key(account: &[u8], key: &[u8]) -> Vec { + let mut storage_key = Vec::with_capacity(account.len() + key.len()); + storage_key.extend_from_slice(&account); + storage_key.extend_from_slice(&key); + storage_key + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + tests::{Test, ALICE, BOB, CHARLIE}, + Error, + }; + use core::u32::MAX; + + // Calculate the allocation size for the given entry. + fn allocation_size( + account: &AccountIdOf, + key: &Key, + value: Option>, + ) -> u32 { + let mut storage: TransientStorage = TransientStorage::::new(MAX); + storage + .write(account, key, value, false) + .expect("Could not write to transient storage."); + storage.meter().current().amount + } + + #[test] + fn read_write_works() { + let mut storage: TransientStorage = TransientStorage::::new(2048); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1]), false), + Ok(WriteOutcome::New) + ); + assert_eq!( + storage.write(&ALICE, &Key::Fix([2; 32]), Some(vec![2]), true), + Ok(WriteOutcome::New) + ); + assert_eq!( + storage.write(&BOB, &Key::Fix([3; 32]), Some(vec![3]), false), + Ok(WriteOutcome::New) + ); + assert_eq!(storage.read(&ALICE, &Key::Fix([1; 32])), Some(vec![1])); + assert_eq!(storage.read(&ALICE, &Key::Fix([2; 32])), Some(vec![2])); + assert_eq!(storage.read(&BOB, &Key::Fix([3; 32])), Some(vec![3])); + // Overwrite values. + assert_eq!( + storage.write(&ALICE, &Key::Fix([2; 32]), Some(vec![4, 5]), false), + Ok(WriteOutcome::Overwritten(1)) + ); + assert_eq!( + storage.write(&BOB, &Key::Fix([3; 32]), Some(vec![6, 7]), true), + Ok(WriteOutcome::Taken(vec![3])) + ); + assert_eq!(storage.read(&ALICE, &Key::Fix([1; 32])), Some(vec![1])); + assert_eq!(storage.read(&ALICE, &Key::Fix([2; 32])), Some(vec![4, 5])); + assert_eq!(storage.read(&BOB, &Key::Fix([3; 32])), Some(vec![6, 7])); + + // Check for an empty value. + assert_eq!( + storage.write(&BOB, &Key::Fix([3; 32]), Some(vec![]), true), + Ok(WriteOutcome::Taken(vec![6, 7])) + ); + assert_eq!(storage.read(&BOB, &Key::Fix([3; 32])), Some(vec![])); + + assert_eq!( + storage.write(&BOB, &Key::Fix([3; 32]), None, true), + Ok(WriteOutcome::Taken(vec![])) + ); + assert_eq!(storage.read(&BOB, &Key::Fix([3; 32])), None); + } + + #[test] + fn read_write_with_var_sized_keys_works() { + let mut storage = TransientStorage::::new(2048); + assert_eq!( + storage.write( + &ALICE, + &Key::::try_from_var([1; 64].to_vec()).unwrap(), + Some(vec![1]), + false + ), + Ok(WriteOutcome::New) + ); + assert_eq!( + storage.write( + &BOB, + &Key::::try_from_var([2; 64].to_vec()).unwrap(), + Some(vec![2, 3]), + false + ), + Ok(WriteOutcome::New) + ); + assert_eq!( + storage.read(&ALICE, &Key::::try_from_var([1; 64].to_vec()).unwrap()), + Some(vec![1]) + ); + assert_eq!( + storage.read(&BOB, &Key::::try_from_var([2; 64].to_vec()).unwrap()), + Some(vec![2, 3]) + ); + // Overwrite values. + assert_eq!( + storage.write( + &ALICE, + &Key::::try_from_var([1; 64].to_vec()).unwrap(), + Some(vec![4, 5]), + false + ), + Ok(WriteOutcome::Overwritten(1)) + ); + assert_eq!( + storage.read(&ALICE, &Key::::try_from_var([1; 64].to_vec()).unwrap()), + Some(vec![4, 5]) + ); + } + + #[test] + fn rollback_transaction_works() { + let mut storage = TransientStorage::::new(1024); + + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1]), false), + Ok(WriteOutcome::New) + ); + storage.rollback_transaction(); + assert_eq!(storage.read(&ALICE, &Key::Fix([1; 32])), None) + } + + #[test] + fn commit_transaction_works() { + let mut storage = TransientStorage::::new(1024); + + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1]), false), + Ok(WriteOutcome::New) + ); + storage.commit_transaction(); + assert_eq!(storage.read(&ALICE, &Key::Fix([1; 32])), Some(vec![1])) + } + + #[test] + fn overwrite_and_commmit_transaction_works() { + let mut storage = TransientStorage::::new(1024); + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1]), false), + Ok(WriteOutcome::New) + ); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1, 2]), false), + Ok(WriteOutcome::Overwritten(1)) + ); + storage.commit_transaction(); + assert_eq!(storage.read(&ALICE, &Key::Fix([1; 32])), Some(vec![1, 2])) + } + + #[test] + fn rollback_in_nested_transaction_works() { + let mut storage = TransientStorage::::new(1024); + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1]), false), + Ok(WriteOutcome::New) + ); + storage.start_transaction(); + assert_eq!( + storage.write(&BOB, &Key::Fix([1; 32]), Some(vec![1]), false), + Ok(WriteOutcome::New) + ); + storage.rollback_transaction(); + storage.commit_transaction(); + assert_eq!(storage.read(&ALICE, &Key::Fix([1; 32])), Some(vec![1])); + assert_eq!(storage.read(&BOB, &Key::Fix([1; 32])), None) + } + + #[test] + fn commit_in_nested_transaction_works() { + let mut storage = TransientStorage::::new(1024); + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1]), false), + Ok(WriteOutcome::New) + ); + storage.start_transaction(); + assert_eq!( + storage.write(&BOB, &Key::Fix([1; 32]), Some(vec![2]), false), + Ok(WriteOutcome::New) + ); + storage.start_transaction(); + assert_eq!( + storage.write(&CHARLIE, &Key::Fix([1; 32]), Some(vec![3]), false), + Ok(WriteOutcome::New) + ); + storage.commit_transaction(); + storage.commit_transaction(); + storage.commit_transaction(); + assert_eq!(storage.read(&ALICE, &Key::Fix([1; 32])), Some(vec![1])); + assert_eq!(storage.read(&BOB, &Key::Fix([1; 32])), Some(vec![2])); + assert_eq!(storage.read(&CHARLIE, &Key::Fix([1; 32])), Some(vec![3])); + } + + #[test] + fn rollback_all_transactions_works() { + let mut storage = TransientStorage::::new(1024); + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1]), false), + Ok(WriteOutcome::New) + ); + storage.start_transaction(); + assert_eq!( + storage.write(&BOB, &Key::Fix([1; 32]), Some(vec![2]), false), + Ok(WriteOutcome::New) + ); + storage.start_transaction(); + assert_eq!( + storage.write(&CHARLIE, &Key::Fix([1; 32]), Some(vec![3]), false), + Ok(WriteOutcome::New) + ); + storage.commit_transaction(); + storage.commit_transaction(); + storage.rollback_transaction(); + assert_eq!(storage.read(&ALICE, &Key::Fix([1; 32])), None); + assert_eq!(storage.read(&BOB, &Key::Fix([1; 32])), None); + assert_eq!(storage.read(&CHARLIE, &Key::Fix([1; 32])), None); + } + + #[test] + fn metering_transactions_works() { + let size = allocation_size(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096])); + let mut storage = TransientStorage::::new(size * 2); + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096]), false), + Ok(WriteOutcome::New) + ); + let limit = storage.meter().current().limit; + storage.commit_transaction(); + + storage.start_transaction(); + assert_eq!(storage.meter().current().limit, limit - size); + assert_eq!(storage.meter().current().limit - storage.meter().current().amount, size); + assert_eq!( + storage.write(&ALICE, &Key::Fix([2; 32]), Some(vec![1u8; 4096]), false), + Ok(WriteOutcome::New) + ); + assert_eq!(storage.meter().current().amount, size); + storage.commit_transaction(); + assert_eq!(storage.meter().total_amount(), size * 2); + } + + #[test] + fn metering_nested_transactions_works() { + let size = allocation_size(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096])); + let mut storage = TransientStorage::::new(size * 3); + + storage.start_transaction(); + let limit = storage.meter().current().limit; + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096]), false), + Ok(WriteOutcome::New) + ); + storage.start_transaction(); + assert_eq!(storage.meter().total_amount(), size); + assert!(storage.meter().current().limit < limit - size); + assert_eq!( + storage.write(&ALICE, &Key::Fix([2; 32]), Some(vec![1u8; 4096]), false), + Ok(WriteOutcome::New) + ); + storage.commit_transaction(); + assert_eq!(storage.meter().current().limit, limit); + assert_eq!(storage.meter().total_amount(), storage.meter().current().amount); + storage.commit_transaction(); + } + + #[test] + fn metering_transaction_fails() { + let size = allocation_size(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096])); + let mut storage = TransientStorage::::new(size - 1); + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096]), false), + Err(Error::::OutOfTransientStorage.into()) + ); + assert_eq!(storage.meter.current().amount, 0); + storage.commit_transaction(); + assert_eq!(storage.meter.total_amount(), 0); + } + + #[test] + fn metering_nested_transactions_fails() { + let size = allocation_size(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096])); + let mut storage = TransientStorage::::new(size * 2); + + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096]), false), + Ok(WriteOutcome::New) + ); + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([2; 32]), Some(vec![1u8; 4096]), false), + Err(Error::::OutOfTransientStorage.into()) + ); + storage.commit_transaction(); + storage.commit_transaction(); + assert_eq!(storage.meter.total_amount(), size); + } + + #[test] + fn metering_nested_transaction_with_rollback_works() { + let size = allocation_size(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096])); + let mut storage = TransientStorage::::new(size * 2); + + storage.start_transaction(); + let limit = storage.meter.current().limit; + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([2; 32]), Some(vec![1u8; 4096]), false), + Ok(WriteOutcome::New) + ); + storage.rollback_transaction(); + + assert_eq!(storage.meter.total_amount(), 0); + assert_eq!(storage.meter.current().limit, limit); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096]), false), + Ok(WriteOutcome::New) + ); + let amount = storage.meter().current().amount; + assert_eq!(storage.meter().total_amount(), amount); + storage.commit_transaction(); + } + + #[test] + fn metering_with_rollback_works() { + let size = allocation_size(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096])); + let mut storage = TransientStorage::::new(size * 5); + + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([1; 32]), Some(vec![1u8; 4096]), false), + Ok(WriteOutcome::New) + ); + let amount = storage.meter.total_amount(); + storage.start_transaction(); + assert_eq!( + storage.write(&ALICE, &Key::Fix([2; 32]), Some(vec![1u8; 4096]), false), + Ok(WriteOutcome::New) + ); + storage.start_transaction(); + assert_eq!( + storage.write(&BOB, &Key::Fix([1; 32]), Some(vec![1u8; 4096]), false), + Ok(WriteOutcome::New) + ); + storage.commit_transaction(); + storage.rollback_transaction(); + assert_eq!(storage.meter.total_amount(), amount); + storage.commit_transaction(); + } +} diff --git a/substrate/frame/contracts/src/wasm/mod.rs b/substrate/frame/contracts/src/wasm/mod.rs index 2fef07f8b7a..f4ee76459c4 100644 --- a/substrate/frame/contracts/src/wasm/mod.rs +++ b/substrate/frame/contracts/src/wasm/mod.rs @@ -506,6 +506,7 @@ mod tests { primitives::ExecReturnValue, storage::WriteOutcome, tests::{RuntimeCall, Test, ALICE, BOB}, + transient_storage::TransientStorage, BalanceOf, CodeHash, Error, Origin, Pallet as Contracts, }; use assert_matches::assert_matches; @@ -563,6 +564,7 @@ mod tests { pub struct MockExt { storage: HashMap, Vec>, + transient_storage: TransientStorage, instantiates: Vec, terminations: Vec, calls: Vec, @@ -591,6 +593,7 @@ mod tests { Self { code_hashes: Default::default(), storage: Default::default(), + transient_storage: TransientStorage::new(1024 * 1024), instantiates: Default::default(), terminations: Default::default(), calls: Default::default(), @@ -691,6 +694,21 @@ mod tests { } Ok(result) } + fn get_transient_storage(&self, key: &Key) -> Option> { + self.transient_storage.read(self.address(), key) + } + fn get_transient_storage_size(&self, key: &Key) -> Option { + self.transient_storage.read(self.address(), key).map(|value| value.len() as _) + } + fn set_transient_storage( + &mut self, + key: &Key, + value: Option>, + take_old: bool, + ) -> Result { + let account_id = self.address().clone(); + self.transient_storage.write(&account_id, key, value, take_old) + } fn caller(&self) -> Origin { self.caller.clone() } @@ -784,6 +802,10 @@ mod tests { fn contract_info(&mut self) -> &mut crate::ContractInfo { unimplemented!() } + #[cfg(feature = "runtime-benchmarks")] + fn transient_storage(&mut self) -> &mut TransientStorage { + unimplemented!() + } fn ecdsa_to_eth_address(&self, _pk: &[u8; 33]) -> Result<[u8; 20], ()> { Ok([2u8; 20]) } @@ -3046,6 +3068,337 @@ mod tests { assert_eq!(&result.data[4..], &[0u8; 0]); } + #[test] + fn set_transient_storage_works() { + const CODE: &str = r#" +(module + (import "seal0" "seal_input" (func $seal_input (param i32 i32))) + (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) + (import "seal0" "set_transient_storage" (func $set_transient_storage (param i32 i32 i32 i32) (result i32))) + (import "env" "memory" (memory 1 1)) + + ;; [0, 4) size of input buffer + ;; 4k in little endian + (data (i32.const 0) "\00\10") + + ;; [4, 4100) input buffer + + (func (export "call") + ;; Receive (key ++ value_to_write) + (call $seal_input + (i32.const 4) ;; Pointer to the input buffer + (i32.const 0) ;; Size of the input buffer + ) + ;; Store the passed value to the passed key and store result to memory + (i32.store (i32.const 168) + (call $set_transient_storage + (i32.const 8) ;; key_ptr + (i32.load (i32.const 4)) ;; key_len + (i32.add ;; value_ptr = 8 + key_len + (i32.const 8) + (i32.load (i32.const 4))) + (i32.sub ;; value_len (input_size - (key_len + key_len_len)) + (i32.load (i32.const 0)) + (i32.add + (i32.load (i32.const 4)) + (i32.const 4) + ) + ) + ) + ) + (call $seal_return + (i32.const 0) ;; flags + (i32.const 168) ;; ptr to returned value + (i32.const 4) ;; length of returned value + ) + ) + + (func (export "deploy")) +) +"#; + + let mut ext = MockExt::default(); + + // value did not exist before -> sentinel returned + let input = (32, [1u8; 32], [42u8, 48]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + assert_eq!(u32::from_le_bytes(result.data.try_into().unwrap()), crate::SENTINEL); + assert_eq!( + ext.get_transient_storage(&Key::::try_from_var([1u8; 32].to_vec()).unwrap()), + Some(vec![42, 48]) + ); + + // value do exist -> length of old value returned + let input = (32, [1u8; 32], [0u8; 0]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + assert_eq!(u32::from_le_bytes(result.data.try_into().unwrap()), 2); + assert_eq!( + ext.get_transient_storage(&Key::::try_from_var([1u8; 32].to_vec()).unwrap()), + Some(vec![]) + ); + + // value do exist -> length of old value returned (test for zero sized val) + let input = (32, [1u8; 32], [99u8]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + assert_eq!(u32::from_le_bytes(result.data.try_into().unwrap()), 0); + assert_eq!( + ext.get_transient_storage(&Key::::try_from_var([1u8; 32].to_vec()).unwrap()), + Some(vec![99]) + ); + } + + #[test] + fn get_transient_storage_works() { + const CODE: &str = r#" +(module + (import "seal0" "seal_input" (func $seal_input (param i32 i32))) + (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) + (import "seal0" "get_transient_storage" (func $get_transient_storage (param i32 i32 i32 i32) (result i32))) + (import "env" "memory" (memory 1 1)) + + ;; [0, 4) size of input buffer (160 bytes as we copy the key+len here) + (data (i32.const 0) "\A0") + + ;; [4, 8) size of output buffer + ;; 4k in little endian + (data (i32.const 4) "\00\10") + + ;; [8, 168) input buffer + ;; [168, 4264) output buffer + + (func (export "call") + ;; Receive (key ++ value_to_write) + (call $seal_input + (i32.const 8) ;; Pointer to the input buffer + (i32.const 0) ;; Size of the input buffer + ) + ;; Load a storage value and result of this call into the output buffer + (i32.store (i32.const 168) + (call $get_transient_storage + (i32.const 12) ;; key_ptr + (i32.load (i32.const 8)) ;; key_len + (i32.const 172) ;; Pointer to the output buffer + (i32.const 4) ;; Pointer to the size of the buffer + ) + ) + (call $seal_return + (i32.const 0) ;; flags + (i32.const 168) ;; output buffer ptr + (i32.add ;; length: output size + 4 (retval) + (i32.load (i32.const 4)) + (i32.const 4) + ) + ) + ) + + (func (export "deploy")) +) +"#; + + let mut ext = MockExt::default(); + + assert_ok!(ext.set_transient_storage( + &Key::::try_from_var([1u8; 64].to_vec()).unwrap(), + Some(vec![42u8]), + false + )); + assert_ok!(ext.set_transient_storage( + &Key::::try_from_var([2u8; 19].to_vec()).unwrap(), + Some(vec![]), + false + )); + + // value does not exist + let input = (63, [1u8; 64]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + assert_eq!( + u32::from_le_bytes(result.data[0..4].try_into().unwrap()), + ReturnErrorCode::KeyNotFound as u32 + ); + + // value exists + let input = (64, [1u8; 64]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + assert_eq!( + u32::from_le_bytes(result.data[0..4].try_into().unwrap()), + ReturnErrorCode::Success as u32 + ); + assert_eq!(&result.data[4..], &[42u8]); + + // value exists (test for 0 sized) + let input = (19, [2u8; 19]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + assert_eq!( + u32::from_le_bytes(result.data[0..4].try_into().unwrap()), + ReturnErrorCode::Success as u32 + ); + assert_eq!(&result.data[4..], &([] as [u8; 0])); + } + + #[test] + fn clear_transient_storage_works() { + const CODE: &str = r#" +(module + (import "seal0" "seal_input" (func $seal_input (param i32 i32))) + (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) + (import "seal0" "clear_transient_storage" (func $clear_transient_storage (param i32 i32) (result i32))) + (import "env" "memory" (memory 1 1)) + + ;; size of input buffer + ;; [0, 4) size of input buffer (128+32 = 160 bytes = 0xA0) + (data (i32.const 0) "\A0") + + ;; [4, 164) input buffer + + (func (export "call") + ;; Receive key + (call $seal_input + (i32.const 4) ;; Where we take input and store it + (i32.const 0) ;; Where we take and store the length of thedata + ) + ;; Call seal_clear_storage and save what it returns at 0 + (i32.store (i32.const 0) + (call $clear_transient_storage + (i32.const 8) ;; key_ptr + (i32.load (i32.const 4)) ;; key_len + ) + ) + (call $seal_return + (i32.const 0) ;; flags + (i32.const 0) ;; returned value + (i32.const 4) ;; length of returned value + ) + ) + + (func (export "deploy")) +) +"#; + + let mut ext = MockExt::default(); + + assert_ok!(ext.set_transient_storage( + &Key::::try_from_var([1u8; 64].to_vec()).unwrap(), + Some(vec![42u8]), + false + )); + + // value did not exist + let input = (32, [3u8; 32]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + // sentinel returned + assert_eq!(u32::from_le_bytes(result.data.try_into().unwrap()), crate::SENTINEL); + + // value did exist + let input = (64, [1u8; 64]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + // length returned + assert_eq!(u32::from_le_bytes(result.data.try_into().unwrap()), 1); + // value cleared + assert_eq!( + ext.get_transient_storage(&Key::::try_from_var([1u8; 64].to_vec()).unwrap()), + None + ); + } + + #[test] + fn take_transient_storage_works() { + const CODE: &str = r#" +(module + (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) + (import "seal0" "seal_input" (func $seal_input (param i32 i32))) + (import "seal0" "take_transient_storage" (func $take_transient_storage (param i32 i32 i32 i32) (result i32))) + (import "env" "memory" (memory 1 1)) + + ;; [0, 4) size of input buffer (160 bytes as we copy the key+len here) + (data (i32.const 0) "\A0") + + ;; [4, 8) size of output buffer + ;; 4k in little endian + (data (i32.const 4) "\00\10") + + ;; [8, 168) input buffer + ;; [168, 4264) output buffer + + (func (export "call") + ;; Receive key + (call $seal_input + (i32.const 8) ;; Pointer to the input buffer + (i32.const 0) ;; Size of the length buffer + ) + + ;; Load a storage value and result of this call into the output buffer + (i32.store (i32.const 168) + (call $take_transient_storage + (i32.const 12) ;; key_ptr + (i32.load (i32.const 8)) ;; key_len + (i32.const 172) ;; Pointer to the output buffer + (i32.const 4) ;; Pointer to the size of the buffer + ) + ) + + ;; Return the contents of the buffer + (call $seal_return + (i32.const 0) ;; flags + (i32.const 168) ;; output buffer ptr + (i32.add ;; length: storage size + 4 (retval) + (i32.load (i32.const 4)) + (i32.const 4) + ) + ) + ) + + (func (export "deploy")) +) +"#; + + let mut ext = MockExt::default(); + + assert_ok!(ext.set_transient_storage( + &Key::::try_from_var([1u8; 64].to_vec()).unwrap(), + Some(vec![42u8]), + false + )); + assert_ok!(ext.set_transient_storage( + &Key::::try_from_var([2u8; 19].to_vec()).unwrap(), + Some(vec![]), + false + )); + + // value does not exist -> error returned + let input = (63, [1u8; 64]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + assert_eq!( + u32::from_le_bytes(result.data[0..4].try_into().unwrap()), + ReturnErrorCode::KeyNotFound as u32 + ); + + // value did exist -> value returned + let input = (64, [1u8; 64]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + assert_eq!( + u32::from_le_bytes(result.data[0..4].try_into().unwrap()), + ReturnErrorCode::Success as u32 + ); + assert_eq!( + ext.get_transient_storage(&Key::::try_from_var([1u8; 64].to_vec()).unwrap()), + None + ); + assert_eq!(&result.data[4..], &[42u8]); + + // value did exist -> length returned (test for 0 sized) + let input = (19, [2u8; 19]).encode(); + let result = execute(CODE, input, &mut ext).unwrap(); + assert_eq!( + u32::from_le_bytes(result.data[0..4].try_into().unwrap()), + ReturnErrorCode::Success as u32 + ); + assert_eq!( + ext.get_transient_storage(&Key::::try_from_var([2u8; 19].to_vec()).unwrap()), + None + ); + assert_eq!(&result.data[4..], &[0u8; 0]); + } + #[test] fn is_contract_works() { const CODE_IS_CONTRACT: &str = r#" diff --git a/substrate/frame/contracts/src/wasm/runtime.rs b/substrate/frame/contracts/src/wasm/runtime.rs index 50b06de080c..982d28540ec 100644 --- a/substrate/frame/contracts/src/wasm/runtime.rs +++ b/substrate/frame/contracts/src/wasm/runtime.rs @@ -199,6 +199,16 @@ pub enum RuntimeCosts { GetStorage(u32), /// Weight of calling `seal_take_storage` for the given size. TakeStorage(u32), + /// Weight of calling `seal_set_transient_storage` for the given storage item sizes. + SetTransientStorage { old_bytes: u32, new_bytes: u32 }, + /// Weight of calling `seal_clear_transient_storage` per cleared byte. + ClearTransientStorage(u32), + /// Weight of calling `seal_contains_transient_storage` per byte of the checked item. + ContainsTransientStorage(u32), + /// Weight of calling `seal_get_transient_storage` with the specified size in storage. + GetTransientStorage(u32), + /// Weight of calling `seal_take_transient_storage` for the given size. + TakeTransientStorage(u32), /// Weight of calling `seal_transfer`. Transfer, /// Base weight of calling `seal_call`. @@ -245,6 +255,34 @@ pub enum RuntimeCosts { UnlockDelegateDependency, } +// For the function that modifies the storage, the benchmarks are done with one item in the +// transient_storage (BTreeMap). To consider the worst-case scenario, the weight of the overhead of +// writing to a full BTreeMap should be included. On top of that, the rollback weight is added, +// which is the worst scenario. +macro_rules! cost_write { + // cost_write!(name, a, b, c) -> T::WeightInfo::name(a, b, c).saturating_add(T::WeightInfo::rollback_transient_storage()) + // .saturating_add(T::WeightInfo::set_transient_storage_full().saturating_sub(T::WeightInfo::set_transient_storage_empty()) + ($name:ident $(, $arg:expr )*) => { + (T::WeightInfo::$name($( $arg ),*).saturating_add(T::WeightInfo::rollback_transient_storage()).saturating_add(cost_write!(@cost_storage))) + }; + + (@cost_storage) => { + T::WeightInfo::set_transient_storage_full().saturating_sub(T::WeightInfo::set_transient_storage_empty()) + }; +} + +macro_rules! cost_read { + // cost_read!(name, a, b, c) -> T::WeightInfo::name(a, b, c).saturating_add(T::WeightInfo::get_transient_storage_full() + // .saturating_sub(T::WeightInfo::get_transient_storage_empty()) + ($name:ident $(, $arg:expr )*) => { + (T::WeightInfo::$name($( $arg ),*).saturating_add(cost_read!(@cost_storage))) + }; + + (@cost_storage) => { + T::WeightInfo::get_transient_storage_full().saturating_sub(T::WeightInfo::get_transient_storage_empty()) + }; +} + macro_rules! cost_args { // cost_args!(name, a, b, c) -> T::WeightInfo::name(a, b, c).saturating_sub(T::WeightInfo::name(0, 0, 0)) ($name:ident, $( $arg: expr ),+) => { @@ -296,6 +334,12 @@ impl Token for RuntimeCosts { ContainsStorage(len) => T::WeightInfo::seal_contains_storage(len), GetStorage(len) => T::WeightInfo::seal_get_storage(len), TakeStorage(len) => T::WeightInfo::seal_take_storage(len), + SetTransientStorage { new_bytes, old_bytes } => + cost_write!(seal_set_transient_storage, new_bytes, old_bytes), + ClearTransientStorage(len) => cost_write!(seal_clear_transient_storage, len), + ContainsTransientStorage(len) => cost_read!(seal_contains_transient_storage, len), + GetTransientStorage(len) => cost_read!(seal_get_transient_storage, len), + TakeTransientStorage(len) => cost_write!(seal_take_transient_storage, len), Transfer => T::WeightInfo::seal_transfer(), CallBase => T::WeightInfo::seal_call(0, 0), DelegateCallBase => T::WeightInfo::seal_delegate_call(), @@ -792,10 +836,129 @@ impl<'a, E: Ext + 'a> Runtime<'a, E> { let key = self.decode_key(memory, key_type, key_ptr)?; let outcome = self.ext.get_storage_size(&key); - self.adjust_gas(charged, RuntimeCosts::ClearStorage(outcome.unwrap_or(0))); + self.adjust_gas(charged, RuntimeCosts::ContainsStorage(outcome.unwrap_or(0))); Ok(outcome.unwrap_or(SENTINEL)) } + fn set_transient_storage( + &mut self, + memory: &[u8], + key_type: KeyType, + key_ptr: u32, + value_ptr: u32, + value_len: u32, + ) -> Result { + let max_size = self.ext.max_value_size(); + let charged = self.charge_gas(RuntimeCosts::SetTransientStorage { + new_bytes: value_len, + old_bytes: max_size, + })?; + if value_len > max_size { + return Err(Error::::ValueTooLarge.into()) + } + let key = self.decode_key(memory, key_type, key_ptr)?; + let value = Some(self.read_sandbox_memory(memory, value_ptr, value_len)?); + let write_outcome = self.ext.set_transient_storage(&key, value, false)?; + self.adjust_gas( + charged, + RuntimeCosts::SetTransientStorage { + new_bytes: value_len, + old_bytes: write_outcome.old_len(), + }, + ); + Ok(write_outcome.old_len_with_sentinel()) + } + + fn clear_transient_storage( + &mut self, + memory: &[u8], + key_type: KeyType, + key_ptr: u32, + ) -> Result { + let charged = + self.charge_gas(RuntimeCosts::ClearTransientStorage(self.ext.max_value_size()))?; + let key = self.decode_key(memory, key_type, key_ptr)?; + let outcome = self.ext.set_transient_storage(&key, None, false)?; + + self.adjust_gas(charged, RuntimeCosts::ClearTransientStorage(outcome.old_len())); + Ok(outcome.old_len_with_sentinel()) + } + + fn get_transient_storage( + &mut self, + memory: &mut [u8], + key_type: KeyType, + key_ptr: u32, + out_ptr: u32, + out_len_ptr: u32, + ) -> Result { + let charged = + self.charge_gas(RuntimeCosts::GetTransientStorage(self.ext.max_value_size()))?; + let key = self.decode_key(memory, key_type, key_ptr)?; + let outcome = self.ext.get_transient_storage(&key); + + if let Some(value) = outcome { + self.adjust_gas(charged, RuntimeCosts::GetTransientStorage(value.len() as u32)); + self.write_sandbox_output( + memory, + out_ptr, + out_len_ptr, + &value, + false, + already_charged, + )?; + Ok(ReturnErrorCode::Success) + } else { + self.adjust_gas(charged, RuntimeCosts::GetTransientStorage(0)); + Ok(ReturnErrorCode::KeyNotFound) + } + } + + fn contains_transient_storage( + &mut self, + memory: &[u8], + key_type: KeyType, + key_ptr: u32, + ) -> Result { + let charged = + self.charge_gas(RuntimeCosts::ContainsTransientStorage(self.ext.max_value_size()))?; + let key = self.decode_key(memory, key_type, key_ptr)?; + let outcome = self.ext.get_transient_storage_size(&key); + + self.adjust_gas(charged, RuntimeCosts::ContainsTransientStorage(outcome.unwrap_or(0))); + Ok(outcome.unwrap_or(SENTINEL)) + } + + fn take_transient_storage( + &mut self, + memory: &mut [u8], + key_type: KeyType, + key_ptr: u32, + out_ptr: u32, + out_len_ptr: u32, + ) -> Result { + let charged = + self.charge_gas(RuntimeCosts::TakeTransientStorage(self.ext.max_value_size()))?; + let key = self.decode_key(memory, key_type, key_ptr)?; + if let crate::storage::WriteOutcome::Taken(value) = + self.ext.set_transient_storage(&key, None, true)? + { + self.adjust_gas(charged, RuntimeCosts::TakeTransientStorage(value.len() as u32)); + self.write_sandbox_output( + memory, + out_ptr, + out_len_ptr, + &value, + false, + already_charged, + )?; + Ok(ReturnErrorCode::Success) + } else { + self.adjust_gas(charged, RuntimeCosts::TakeTransientStorage(0)); + Ok(ReturnErrorCode::KeyNotFound) + } + } + fn call( &mut self, memory: &mut [u8], @@ -1099,6 +1262,67 @@ pub mod env { } } + /// Set the value at the given key in the contract transient storage. + #[unstable] + fn set_transient_storage( + ctx: _, + memory: _, + key_ptr: u32, + key_len: u32, + value_ptr: u32, + value_len: u32, + ) -> Result { + ctx.set_transient_storage(memory, KeyType::Var(key_len), key_ptr, value_ptr, value_len) + } + + /// Clear the value at the given key in the contract storage. + #[unstable] + fn clear_transient_storage( + ctx: _, + memory: _, + key_ptr: u32, + key_len: u32, + ) -> Result { + ctx.clear_transient_storage(memory, KeyType::Var(key_len), key_ptr) + } + + /// Retrieve the value under the given key from transient storage. + #[unstable] + fn get_transient_storage( + ctx: _, + memory: _, + key_ptr: u32, + key_len: u32, + out_ptr: u32, + out_len_ptr: u32, + ) -> Result { + ctx.get_transient_storage(memory, KeyType::Var(key_len), key_ptr, out_ptr, out_len_ptr) + } + + /// Checks whether there is a value stored under the given key in transient storage. + #[unstable] + fn contains_transient_storage( + ctx: _, + memory: _, + key_ptr: u32, + key_len: u32, + ) -> Result { + ctx.contains_transient_storage(memory, KeyType::Var(key_len), key_ptr) + } + + /// Retrieve and remove the value under the given key from transient storage. + #[unstable] + fn take_transient_storage( + ctx: _, + memory: _, + key_ptr: u32, + key_len: u32, + out_ptr: u32, + out_len_ptr: u32, + ) -> Result { + ctx.take_transient_storage(memory, KeyType::Var(key_len), key_ptr, out_ptr, out_len_ptr) + } + /// Transfer some value to another account. /// See [`pallet_contracts_uapi::HostFn::transfer`]. #[prefixed_alias] diff --git a/substrate/frame/contracts/src/weights.rs b/substrate/frame/contracts/src/weights.rs index 0404a9d3d8e..dc10a8aee77 100644 --- a/substrate/frame/contracts/src/weights.rs +++ b/substrate/frame/contracts/src/weights.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for `pallet_contracts` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-06-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-07-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-1pho9goo-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-yaoqqom-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -98,6 +98,16 @@ pub trait WeightInfo { fn seal_get_storage(n: u32, ) -> Weight; fn seal_contains_storage(n: u32, ) -> Weight; fn seal_take_storage(n: u32, ) -> Weight; + fn set_transient_storage_empty() -> Weight; + fn set_transient_storage_full() -> Weight; + fn get_transient_storage_empty() -> Weight; + fn get_transient_storage_full() -> Weight; + fn rollback_transient_storage() -> Weight; + fn seal_set_transient_storage(n: u32, o: u32, ) -> Weight; + fn seal_clear_transient_storage(n: u32, ) -> Weight; + fn seal_get_transient_storage(n: u32, ) -> Weight; + fn seal_contains_transient_storage(n: u32, ) -> Weight; + fn seal_take_transient_storage(n: u32, ) -> Weight; fn seal_transfer() -> Weight; fn seal_call(t: u32, i: u32, ) -> Weight; fn seal_delegate_call() -> Weight; @@ -127,8 +137,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1627` - // Minimum execution time: 1_896_000 picoseconds. - Weight::from_parts(1_990_000, 1627) + // Minimum execution time: 1_921_000 picoseconds. + Weight::from_parts(2_003_000, 1627) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -138,10 +148,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `452 + k * (69 ±0)` // Estimated: `442 + k * (70 ±0)` - // Minimum execution time: 11_142_000 picoseconds. - Weight::from_parts(11_578_000, 442) - // Standard Error: 1_557 - .saturating_add(Weight::from_parts(1_165_198, 0).saturating_mul(k.into())) + // Minimum execution time: 11_364_000 picoseconds. + Weight::from_parts(11_463_000, 442) + // Standard Error: 2_141 + .saturating_add(Weight::from_parts(1_149_944, 0).saturating_mul(k.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(T::DbWeight::get().writes(2_u64)) @@ -155,10 +165,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `211 + c * (1 ±0)` // Estimated: `6149 + c * (1 ±0)` - // Minimum execution time: 7_649_000 picoseconds. - Weight::from_parts(4_827_445, 6149) + // Minimum execution time: 7_565_000 picoseconds. + Weight::from_parts(5_041_009, 6149) // Standard Error: 5 - .saturating_add(Weight::from_parts(1_630, 0).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(1_640, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) @@ -171,8 +181,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `510` // Estimated: `6450` - // Minimum execution time: 16_096_000 picoseconds. - Weight::from_parts(16_937_000, 6450) + // Minimum execution time: 15_894_000 picoseconds. + Weight::from_parts(16_618_000, 6450) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -185,10 +195,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `171 + k * (1 ±0)` // Estimated: `3635 + k * (1 ±0)` - // Minimum execution time: 3_131_000 picoseconds. - Weight::from_parts(3_209_000, 3635) - // Standard Error: 481 - .saturating_add(Weight::from_parts(1_087_506, 0).saturating_mul(k.into())) + // Minimum execution time: 3_077_000 picoseconds. + Weight::from_parts(3_144_000, 3635) + // Standard Error: 650 + .saturating_add(Weight::from_parts(1_095_835, 0).saturating_mul(k.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(k.into()))) @@ -207,10 +217,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `325 + c * (1 ±0)` // Estimated: `6263 + c * (1 ±0)` - // Minimum execution time: 15_289_000 picoseconds. - Weight::from_parts(16_157_168, 6263) + // Minimum execution time: 14_960_000 picoseconds. + Weight::from_parts(15_778_951, 6263) // Standard Error: 1 - .saturating_add(Weight::from_parts(395, 0).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(443, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) @@ -221,8 +231,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `440` // Estimated: `6380` - // Minimum execution time: 12_312_000 picoseconds. - Weight::from_parts(12_650_000, 6380) + // Minimum execution time: 11_849_000 picoseconds. + Weight::from_parts(12_273_000, 6380) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -236,8 +246,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `352` // Estimated: `6292` - // Minimum execution time: 47_239_000 picoseconds. - Weight::from_parts(48_617_000, 6292) + // Minimum execution time: 47_862_000 picoseconds. + Weight::from_parts(48_879_000, 6292) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -249,8 +259,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `594` // Estimated: `6534` - // Minimum execution time: 52_084_000 picoseconds. - Weight::from_parts(53_838_000, 6534) + // Minimum execution time: 50_754_000 picoseconds. + Weight::from_parts(52_720_000, 6534) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -260,8 +270,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `409` // Estimated: `6349` - // Minimum execution time: 11_785_000 picoseconds. - Weight::from_parts(12_284_000, 6349) + // Minimum execution time: 11_459_000 picoseconds. + Weight::from_parts(11_921_000, 6349) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -271,8 +281,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1627` - // Minimum execution time: 2_136_000 picoseconds. - Weight::from_parts(2_233_000, 1627) + // Minimum execution time: 2_135_000 picoseconds. + Weight::from_parts(2_247_000, 1627) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -284,8 +294,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `166` // Estimated: `3631` - // Minimum execution time: 10_957_000 picoseconds. - Weight::from_parts(11_314_000, 3631) + // Minimum execution time: 10_645_000 picoseconds. + Weight::from_parts(11_107_000, 3631) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -295,8 +305,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 4_354_000 picoseconds. - Weight::from_parts(4_613_000, 3607) + // Minimum execution time: 4_353_000 picoseconds. + Weight::from_parts(4_628_000, 3607) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) @@ -307,8 +317,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `167` // Estimated: `3632` - // Minimum execution time: 5_541_000 picoseconds. - Weight::from_parts(5_790_000, 3632) + // Minimum execution time: 5_432_000 picoseconds. + Weight::from_parts(5_624_000, 3632) .saturating_add(T::DbWeight::get().reads(2_u64)) } /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) @@ -319,8 +329,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 5_502_000 picoseconds. - Weight::from_parts(5_701_000, 3607) + // Minimum execution time: 5_371_000 picoseconds. + Weight::from_parts(5_794_000, 3607) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -339,12 +349,12 @@ impl WeightInfo for SubstrateWeight { /// The range of component `c` is `[0, 125952]`. fn call_with_code_per_byte(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `801 + c * (1 ±0)` - // Estimated: `4264 + c * (1 ±0)` - // Minimum execution time: 247_884_000 picoseconds. - Weight::from_parts(265_795_781, 4264) + // Measured: `800 + c * (1 ±0)` + // Estimated: `4266 + c * (1 ±0)` + // Minimum execution time: 247_157_000 picoseconds. + Weight::from_parts(269_252_698, 4266) // Standard Error: 4 - .saturating_add(Weight::from_parts(724, 0).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(729, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) @@ -372,14 +382,14 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `323` // Estimated: `6262` - // Minimum execution time: 4_500_184_000 picoseconds. - Weight::from_parts(160_729_258, 6262) - // Standard Error: 143 - .saturating_add(Weight::from_parts(52_809, 0).saturating_mul(c.into())) - // Standard Error: 17 - .saturating_add(Weight::from_parts(2_173, 0).saturating_mul(i.into())) - // Standard Error: 17 - .saturating_add(Weight::from_parts(2_165, 0).saturating_mul(s.into())) + // Minimum execution time: 4_575_784_000 picoseconds. + Weight::from_parts(207_379_459, 6262) + // Standard Error: 124 + .saturating_add(Weight::from_parts(52_392, 0).saturating_mul(c.into())) + // Standard Error: 15 + .saturating_add(Weight::from_parts(2_257, 0).saturating_mul(i.into())) + // Standard Error: 15 + .saturating_add(Weight::from_parts(2_263, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } @@ -404,13 +414,13 @@ impl WeightInfo for SubstrateWeight { fn instantiate(i: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `560` - // Estimated: `4029` - // Minimum execution time: 2_219_163_000 picoseconds. - Weight::from_parts(2_236_918_000, 4029) - // Standard Error: 32 - .saturating_add(Weight::from_parts(937, 0).saturating_mul(i.into())) - // Standard Error: 32 - .saturating_add(Weight::from_parts(938, 0).saturating_mul(s.into())) + // Estimated: `4017` + // Minimum execution time: 2_306_770_000 picoseconds. + Weight::from_parts(2_462_908_000, 4017) + // Standard Error: 33 + .saturating_add(Weight::from_parts(898, 0).saturating_mul(i.into())) + // Standard Error: 33 + .saturating_add(Weight::from_parts(859, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -430,8 +440,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `826` // Estimated: `4291` - // Minimum execution time: 164_801_000 picoseconds. - Weight::from_parts(167_250_000, 4291) + // Minimum execution time: 165_499_000 picoseconds. + Weight::from_parts(169_903_000, 4291) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -448,10 +458,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 225_207_000 picoseconds. - Weight::from_parts(263_665_658, 3607) - // Standard Error: 47 - .saturating_add(Weight::from_parts(50_732, 0).saturating_mul(c.into())) + // Minimum execution time: 227_590_000 picoseconds. + Weight::from_parts(260_045_588, 3607) + // Standard Error: 52 + .saturating_add(Weight::from_parts(51_305, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -468,10 +478,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 230_718_000 picoseconds. - Weight::from_parts(258_359_271, 3607) - // Standard Error: 47 - .saturating_add(Weight::from_parts(51_014, 0).saturating_mul(c.into())) + // Minimum execution time: 239_634_000 picoseconds. + Weight::from_parts(262_040_831, 3607) + // Standard Error: 103 + .saturating_add(Weight::from_parts(51_590, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -487,8 +497,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `315` // Estimated: `3780` - // Minimum execution time: 39_668_000 picoseconds. - Weight::from_parts(41_031_000, 3780) + // Minimum execution time: 39_152_000 picoseconds. + Weight::from_parts(39_970_000, 3780) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -502,8 +512,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `552` // Estimated: `6492` - // Minimum execution time: 25_890_000 picoseconds. - Weight::from_parts(26_603_000, 6492) + // Minimum execution time: 25_143_000 picoseconds. + Weight::from_parts(26_103_000, 6492) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -512,17 +522,17 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_269_000 picoseconds. - Weight::from_parts(9_227_069, 0) - // Standard Error: 74 - .saturating_add(Weight::from_parts(51_396, 0).saturating_mul(r.into())) + // Minimum execution time: 8_406_000 picoseconds. + Weight::from_parts(9_056_753, 0) + // Standard Error: 98 + .saturating_add(Weight::from_parts(53_110, 0).saturating_mul(r.into())) } fn seal_caller() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 602_000 picoseconds. - Weight::from_parts(664_000, 0) + // Minimum execution time: 659_000 picoseconds. + Weight::from_parts(705_000, 0) } /// Storage: `Contracts::ContractInfoOf` (r:1 w:0) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) @@ -530,8 +540,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `354` // Estimated: `3819` - // Minimum execution time: 6_131_000 picoseconds. - Weight::from_parts(6_468_000, 3819) + // Minimum execution time: 6_165_000 picoseconds. + Weight::from_parts(6_340_000, 3819) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: `Contracts::ContractInfoOf` (r:1 w:0) @@ -540,79 +550,79 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `447` // Estimated: `3912` - // Minimum execution time: 7_557_000 picoseconds. - Weight::from_parts(7_704_000, 3912) + // Minimum execution time: 7_398_000 picoseconds. + Weight::from_parts(7_661_000, 3912) .saturating_add(T::DbWeight::get().reads(1_u64)) } fn seal_own_code_hash() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 783_000 picoseconds. - Weight::from_parts(848_000, 0) + // Minimum execution time: 723_000 picoseconds. + Weight::from_parts(793_000, 0) } fn seal_caller_is_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 397_000 picoseconds. - Weight::from_parts(435_000, 0) + // Minimum execution time: 398_000 picoseconds. + Weight::from_parts(428_000, 0) } fn seal_caller_is_root() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 351_000 picoseconds. - Weight::from_parts(372_000, 0) + // Minimum execution time: 329_000 picoseconds. + Weight::from_parts(364_000, 0) } fn seal_address() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 608_000 picoseconds. - Weight::from_parts(645_000, 0) + // Minimum execution time: 592_000 picoseconds. + Weight::from_parts(624_000, 0) } fn seal_gas_left() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 661_000 picoseconds. - Weight::from_parts(729_000, 0) + // Minimum execution time: 665_000 picoseconds. + Weight::from_parts(714_000, 0) } fn seal_balance() -> Weight { // Proof Size summary in bytes: // Measured: `140` // Estimated: `0` - // Minimum execution time: 4_545_000 picoseconds. - Weight::from_parts(4_663_000, 0) + // Minimum execution time: 4_486_000 picoseconds. + Weight::from_parts(4_668_000, 0) } fn seal_value_transferred() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 614_000 picoseconds. - Weight::from_parts(641_000, 0) + // Minimum execution time: 548_000 picoseconds. + Weight::from_parts(590_000, 0) } fn seal_minimum_balance() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 583_000 picoseconds. - Weight::from_parts(618_000, 0) + // Minimum execution time: 536_000 picoseconds. + Weight::from_parts(578_000, 0) } fn seal_block_number() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 583_000 picoseconds. - Weight::from_parts(617_000, 0) + // Minimum execution time: 552_000 picoseconds. + Weight::from_parts(599_000, 0) } fn seal_now() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 607_000 picoseconds. - Weight::from_parts(638_000, 0) + // Minimum execution time: 556_000 picoseconds. + Weight::from_parts(600_000, 0) } /// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0) /// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `Measured`) @@ -620,8 +630,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `67` // Estimated: `1552` - // Minimum execution time: 4_172_000 picoseconds. - Weight::from_parts(4_408_000, 1552) + // Minimum execution time: 4_084_000 picoseconds. + Weight::from_parts(4_321_000, 1552) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// The range of component `n` is `[0, 1048572]`. @@ -629,20 +639,20 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 475_000 picoseconds. - Weight::from_parts(515_000, 0) + // Minimum execution time: 468_000 picoseconds. + Weight::from_parts(492_000, 0) // Standard Error: 3 - .saturating_add(Weight::from_parts(298, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(310, 0).saturating_mul(n.into())) } /// The range of component `n` is `[0, 1048572]`. fn seal_return(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 289_000 picoseconds. - Weight::from_parts(357_000, 0) - // Standard Error: 10 - .saturating_add(Weight::from_parts(405, 0).saturating_mul(n.into())) + // Minimum execution time: 377_000 picoseconds. + Weight::from_parts(396_000, 0) + // Standard Error: 9 + .saturating_add(Weight::from_parts(431, 0).saturating_mul(n.into())) } /// Storage: `Contracts::DeletionQueueCounter` (r:1 w:1) /// Proof: `Contracts::DeletionQueueCounter` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) @@ -655,10 +665,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `319 + n * (78 ±0)` // Estimated: `3784 + n * (2553 ±0)` - // Minimum execution time: 13_316_000 picoseconds. - Weight::from_parts(15_855_821, 3784) - // Standard Error: 7_274 - .saturating_add(Weight::from_parts(3_447_246, 0).saturating_mul(n.into())) + // Minimum execution time: 13_028_000 picoseconds. + Weight::from_parts(15_330_917, 3784) + // Standard Error: 8_260 + .saturating_add(Weight::from_parts(3_594_893, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(3_u64)) @@ -671,8 +681,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 3_468_000 picoseconds. - Weight::from_parts(3_608_000, 1561) + // Minimum execution time: 3_367_000 picoseconds. + Weight::from_parts(3_555_000, 1561) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: `System::EventTopics` (r:4 w:4) @@ -683,12 +693,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `990 + t * (2475 ±0)` - // Minimum execution time: 3_777_000 picoseconds. - Weight::from_parts(4_028_191, 990) - // Standard Error: 5_907 - .saturating_add(Weight::from_parts(2_183_733, 0).saturating_mul(t.into())) + // Minimum execution time: 3_779_000 picoseconds. + Weight::from_parts(4_003_836, 990) + // Standard Error: 5_409 + .saturating_add(Weight::from_parts(2_082_176, 0).saturating_mul(t.into())) // Standard Error: 1 - .saturating_add(Weight::from_parts(18, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(14, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(t.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(t.into()))) .saturating_add(Weight::from_parts(0, 2475).saturating_mul(t.into())) @@ -698,10 +708,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 400_000 picoseconds. - Weight::from_parts(423_000, 0) + // Minimum execution time: 409_000 picoseconds. + Weight::from_parts(447_000, 0) // Standard Error: 10 - .saturating_add(Weight::from_parts(1_209, 0).saturating_mul(i.into())) + .saturating_add(Weight::from_parts(1_219, 0).saturating_mul(i.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -711,12 +721,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `250 + o * (1 ±0)` // Estimated: `249 + o * (1 ±0)` - // Minimum execution time: 9_033_000 picoseconds. - Weight::from_parts(8_797_934, 249) + // Minimum execution time: 9_176_000 picoseconds. + Weight::from_parts(9_121_191, 249) // Standard Error: 1 - .saturating_add(Weight::from_parts(257, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(292, 0).saturating_mul(n.into())) // Standard Error: 1 - .saturating_add(Weight::from_parts(51, 0).saturating_mul(o.into())) + .saturating_add(Weight::from_parts(31, 0).saturating_mul(o.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(o.into())) @@ -728,10 +738,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `248 + n * (1 ±0)` // Estimated: `248 + n * (1 ±0)` - // Minimum execution time: 7_167_000 picoseconds. - Weight::from_parts(8_012_194, 248) + // Minimum execution time: 7_294_000 picoseconds. + Weight::from_parts(7_963_151, 248) // Standard Error: 1 - .saturating_add(Weight::from_parts(90, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(92, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) @@ -743,10 +753,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `248 + n * (1 ±0)` // Estimated: `248 + n * (1 ±0)` - // Minimum execution time: 6_868_000 picoseconds. - Weight::from_parts(7_801_811, 248) + // Minimum execution time: 6_978_000 picoseconds. + Weight::from_parts(7_741_355, 248) // Standard Error: 1 - .saturating_add(Weight::from_parts(605, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(654, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } @@ -757,10 +767,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `248 + n * (1 ±0)` // Estimated: `248 + n * (1 ±0)` - // Minimum execution time: 6_322_000 picoseconds. - Weight::from_parts(7_103_552, 248) + // Minimum execution time: 6_286_000 picoseconds. + Weight::from_parts(7_026_923, 248) // Standard Error: 1 - .saturating_add(Weight::from_parts(79, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(86, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } @@ -771,20 +781,106 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `248 + n * (1 ±0)` // Estimated: `248 + n * (1 ±0)` - // Minimum execution time: 7_702_000 picoseconds. - Weight::from_parts(8_746_305, 248) - // Standard Error: 2 - .saturating_add(Weight::from_parts(604, 0).saturating_mul(n.into())) + // Minimum execution time: 7_597_000 picoseconds. + Weight::from_parts(8_706_785, 248) + // Standard Error: 1 + .saturating_add(Weight::from_parts(653, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } + fn set_transient_storage_empty() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_497_000 picoseconds. + Weight::from_parts(1_564_000, 0) + } + fn set_transient_storage_full() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_670_000 picoseconds. + Weight::from_parts(2_807_000, 0) + } + fn get_transient_storage_empty() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_836_000 picoseconds. + Weight::from_parts(3_878_000, 0) + } + fn get_transient_storage_full() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_537_000 picoseconds. + Weight::from_parts(4_665_000, 0) + } + fn rollback_transient_storage() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_592_000 picoseconds. + Weight::from_parts(1_742_000, 0) + } + /// The range of component `n` is `[0, 16384]`. + /// The range of component `o` is `[0, 16384]`. + fn seal_set_transient_storage(n: u32, o: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_101_000 picoseconds. + Weight::from_parts(2_481_218, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(242, 0).saturating_mul(n.into())) + // Standard Error: 0 + .saturating_add(Weight::from_parts(300, 0).saturating_mul(o.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_clear_transient_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_059_000 picoseconds. + Weight::from_parts(2_426_609, 0) + // Standard Error: 2 + .saturating_add(Weight::from_parts(307, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_get_transient_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_918_000 picoseconds. + Weight::from_parts(2_114_837, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(302, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_contains_transient_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_759_000 picoseconds. + Weight::from_parts(1_959_995, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(147, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_take_transient_storage(_n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_759_000 picoseconds. + Weight::from_parts(9_952_099, 0) + } fn seal_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `140` // Estimated: `0` - // Minimum execution time: 8_851_000 picoseconds. - Weight::from_parts(9_083_000, 0) + // Minimum execution time: 8_700_000 picoseconds. + Weight::from_parts(8_903_000, 0) } /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) @@ -800,12 +896,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `620 + t * (280 ±0)` // Estimated: `4085 + t * (2182 ±0)` - // Minimum execution time: 121_148_000 picoseconds. - Weight::from_parts(119_605_377, 4085) - // Standard Error: 208_337 - .saturating_add(Weight::from_parts(43_153_338, 0).saturating_mul(t.into())) + // Minimum execution time: 123_399_000 picoseconds. + Weight::from_parts(120_909_821, 4085) + // Standard Error: 166_830 + .saturating_add(Weight::from_parts(43_853_642, 0).saturating_mul(t.into())) // Standard Error: 0 - .saturating_add(Weight::from_parts(5, 0).saturating_mul(i.into())) + .saturating_add(Weight::from_parts(6, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(t.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -820,8 +916,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `430` // Estimated: `3895` - // Minimum execution time: 108_159_000 picoseconds. - Weight::from_parts(110_027_000, 3895) + // Minimum execution time: 112_350_000 picoseconds. + Weight::from_parts(116_003_000, 3895) .saturating_add(T::DbWeight::get().reads(2_u64)) } /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) @@ -839,13 +935,13 @@ impl WeightInfo for SubstrateWeight { fn seal_instantiate(i: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `676` - // Estimated: `4127` - // Minimum execution time: 1_861_874_000 picoseconds. - Weight::from_parts(1_872_926_000, 4127) - // Standard Error: 23 - .saturating_add(Weight::from_parts(557, 0).saturating_mul(i.into())) - // Standard Error: 23 - .saturating_add(Weight::from_parts(920, 0).saturating_mul(s.into())) + // Estimated: `4132` + // Minimum execution time: 1_972_276_000 picoseconds. + Weight::from_parts(1_977_872_000, 4132) + // Standard Error: 24 + .saturating_add(Weight::from_parts(623, 0).saturating_mul(i.into())) + // Standard Error: 24 + .saturating_add(Weight::from_parts(917, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -854,64 +950,64 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 878_000 picoseconds. - Weight::from_parts(10_993_950, 0) + // Minimum execution time: 899_000 picoseconds. + Weight::from_parts(10_963_972, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_325, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(1_355, 0).saturating_mul(n.into())) } /// The range of component `n` is `[0, 1048576]`. fn seal_hash_keccak_256(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_261_000 picoseconds. - Weight::from_parts(9_759_497, 0) + // Minimum execution time: 1_396_000 picoseconds. + Weight::from_parts(9_404_986, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(3_594, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(3_627, 0).saturating_mul(n.into())) } /// The range of component `n` is `[0, 1048576]`. fn seal_hash_blake2_256(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 726_000 picoseconds. - Weight::from_parts(9_795_728, 0) + // Minimum execution time: 834_000 picoseconds. + Weight::from_parts(9_749_716, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_455, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(1_500, 0).saturating_mul(n.into())) } /// The range of component `n` is `[0, 1048576]`. fn seal_hash_blake2_128(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 739_000 picoseconds. - Weight::from_parts(9_701_202, 0) + // Minimum execution time: 756_000 picoseconds. + Weight::from_parts(8_995_036, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_459, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(1_495, 0).saturating_mul(n.into())) } /// The range of component `n` is `[0, 125697]`. fn seal_sr25519_verify(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 43_309_000 picoseconds. - Weight::from_parts(41_405_949, 0) + // Minimum execution time: 45_800_000 picoseconds. + Weight::from_parts(44_676_829, 0) // Standard Error: 8 - .saturating_add(Weight::from_parts(5_336, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(5_315, 0).saturating_mul(n.into())) } fn seal_ecdsa_recover() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 47_880_000 picoseconds. - Weight::from_parts(49_025_000, 0) + // Minimum execution time: 47_415_000 picoseconds. + Weight::from_parts(48_743_000, 0) } fn seal_ecdsa_to_eth_address() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_462_000 picoseconds. - Weight::from_parts(13_631_000, 0) + // Minimum execution time: 13_437_000 picoseconds. + Weight::from_parts(13_588_000, 0) } /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) @@ -921,8 +1017,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `430` // Estimated: `3895` - // Minimum execution time: 17_978_000 picoseconds. - Weight::from_parts(18_578_000, 3895) + // Minimum execution time: 17_775_000 picoseconds. + Weight::from_parts(18_332_000, 3895) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -932,8 +1028,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `355` // Estimated: `3820` - // Minimum execution time: 8_384_000 picoseconds. - Weight::from_parts(8_687_000, 3820) + // Minimum execution time: 8_326_000 picoseconds. + Weight::from_parts(8_656_000, 3820) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -943,8 +1039,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `355` // Estimated: `3558` - // Minimum execution time: 7_547_000 picoseconds. - Weight::from_parts(7_935_000, 3558) + // Minimum execution time: 7_276_000 picoseconds. + Weight::from_parts(7_630_000, 3558) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -952,15 +1048,15 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 331_000 picoseconds. - Weight::from_parts(363_000, 0) + // Minimum execution time: 330_000 picoseconds. + Weight::from_parts(373_000, 0) } fn seal_account_reentrance_count() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 349_000 picoseconds. - Weight::from_parts(365_000, 0) + // Minimum execution time: 381_000 picoseconds. + Weight::from_parts(418_000, 0) } /// Storage: `Contracts::Nonce` (r:1 w:0) /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) @@ -968,8 +1064,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `219` // Estimated: `1704` - // Minimum execution time: 2_814_000 picoseconds. - Weight::from_parts(3_038_000, 1704) + // Minimum execution time: 2_711_000 picoseconds. + Weight::from_parts(2_941_000, 1704) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// The range of component `r` is `[0, 5000]`. @@ -977,10 +1073,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 693_000 picoseconds. - Weight::from_parts(665_431, 0) - // Standard Error: 12 - .saturating_add(Weight::from_parts(7_030, 0).saturating_mul(r.into())) + // Minimum execution time: 720_000 picoseconds. + Weight::from_parts(389_111, 0) + // Standard Error: 16 + .saturating_add(Weight::from_parts(7_278, 0).saturating_mul(r.into())) } } @@ -992,8 +1088,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1627` - // Minimum execution time: 1_896_000 picoseconds. - Weight::from_parts(1_990_000, 1627) + // Minimum execution time: 1_921_000 picoseconds. + Weight::from_parts(2_003_000, 1627) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -1003,10 +1099,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `452 + k * (69 ±0)` // Estimated: `442 + k * (70 ±0)` - // Minimum execution time: 11_142_000 picoseconds. - Weight::from_parts(11_578_000, 442) - // Standard Error: 1_557 - .saturating_add(Weight::from_parts(1_165_198, 0).saturating_mul(k.into())) + // Minimum execution time: 11_364_000 picoseconds. + Weight::from_parts(11_463_000, 442) + // Standard Error: 2_141 + .saturating_add(Weight::from_parts(1_149_944, 0).saturating_mul(k.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(RocksDbWeight::get().writes(2_u64)) @@ -1020,10 +1116,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `211 + c * (1 ±0)` // Estimated: `6149 + c * (1 ±0)` - // Minimum execution time: 7_649_000 picoseconds. - Weight::from_parts(4_827_445, 6149) + // Minimum execution time: 7_565_000 picoseconds. + Weight::from_parts(5_041_009, 6149) // Standard Error: 5 - .saturating_add(Weight::from_parts(1_630, 0).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(1_640, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) @@ -1036,8 +1132,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `510` // Estimated: `6450` - // Minimum execution time: 16_096_000 picoseconds. - Weight::from_parts(16_937_000, 6450) + // Minimum execution time: 15_894_000 picoseconds. + Weight::from_parts(16_618_000, 6450) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1050,10 +1146,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `171 + k * (1 ±0)` // Estimated: `3635 + k * (1 ±0)` - // Minimum execution time: 3_131_000 picoseconds. - Weight::from_parts(3_209_000, 3635) - // Standard Error: 481 - .saturating_add(Weight::from_parts(1_087_506, 0).saturating_mul(k.into())) + // Minimum execution time: 3_077_000 picoseconds. + Weight::from_parts(3_144_000, 3635) + // Standard Error: 650 + .saturating_add(Weight::from_parts(1_095_835, 0).saturating_mul(k.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(k.into()))) @@ -1072,10 +1168,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `325 + c * (1 ±0)` // Estimated: `6263 + c * (1 ±0)` - // Minimum execution time: 15_289_000 picoseconds. - Weight::from_parts(16_157_168, 6263) + // Minimum execution time: 14_960_000 picoseconds. + Weight::from_parts(15_778_951, 6263) // Standard Error: 1 - .saturating_add(Weight::from_parts(395, 0).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(443, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) @@ -1086,8 +1182,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `440` // Estimated: `6380` - // Minimum execution time: 12_312_000 picoseconds. - Weight::from_parts(12_650_000, 6380) + // Minimum execution time: 11_849_000 picoseconds. + Weight::from_parts(12_273_000, 6380) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1101,8 +1197,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `352` // Estimated: `6292` - // Minimum execution time: 47_239_000 picoseconds. - Weight::from_parts(48_617_000, 6292) + // Minimum execution time: 47_862_000 picoseconds. + Weight::from_parts(48_879_000, 6292) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1114,8 +1210,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `594` // Estimated: `6534` - // Minimum execution time: 52_084_000 picoseconds. - Weight::from_parts(53_838_000, 6534) + // Minimum execution time: 50_754_000 picoseconds. + Weight::from_parts(52_720_000, 6534) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -1125,8 +1221,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `409` // Estimated: `6349` - // Minimum execution time: 11_785_000 picoseconds. - Weight::from_parts(12_284_000, 6349) + // Minimum execution time: 11_459_000 picoseconds. + Weight::from_parts(11_921_000, 6349) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1136,8 +1232,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1627` - // Minimum execution time: 2_136_000 picoseconds. - Weight::from_parts(2_233_000, 1627) + // Minimum execution time: 2_135_000 picoseconds. + Weight::from_parts(2_247_000, 1627) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1149,8 +1245,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `166` // Estimated: `3631` - // Minimum execution time: 10_957_000 picoseconds. - Weight::from_parts(11_314_000, 3631) + // Minimum execution time: 10_645_000 picoseconds. + Weight::from_parts(11_107_000, 3631) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -1160,8 +1256,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 4_354_000 picoseconds. - Weight::from_parts(4_613_000, 3607) + // Minimum execution time: 4_353_000 picoseconds. + Weight::from_parts(4_628_000, 3607) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) @@ -1172,8 +1268,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `167` // Estimated: `3632` - // Minimum execution time: 5_541_000 picoseconds. - Weight::from_parts(5_790_000, 3632) + // Minimum execution time: 5_432_000 picoseconds. + Weight::from_parts(5_624_000, 3632) .saturating_add(RocksDbWeight::get().reads(2_u64)) } /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) @@ -1184,8 +1280,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 5_502_000 picoseconds. - Weight::from_parts(5_701_000, 3607) + // Minimum execution time: 5_371_000 picoseconds. + Weight::from_parts(5_794_000, 3607) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1204,12 +1300,12 @@ impl WeightInfo for () { /// The range of component `c` is `[0, 125952]`. fn call_with_code_per_byte(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `801 + c * (1 ±0)` - // Estimated: `4264 + c * (1 ±0)` - // Minimum execution time: 247_884_000 picoseconds. - Weight::from_parts(265_795_781, 4264) + // Measured: `800 + c * (1 ±0)` + // Estimated: `4266 + c * (1 ±0)` + // Minimum execution time: 247_157_000 picoseconds. + Weight::from_parts(269_252_698, 4266) // Standard Error: 4 - .saturating_add(Weight::from_parts(724, 0).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(729, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) @@ -1237,14 +1333,14 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `323` // Estimated: `6262` - // Minimum execution time: 4_500_184_000 picoseconds. - Weight::from_parts(160_729_258, 6262) - // Standard Error: 143 - .saturating_add(Weight::from_parts(52_809, 0).saturating_mul(c.into())) - // Standard Error: 17 - .saturating_add(Weight::from_parts(2_173, 0).saturating_mul(i.into())) - // Standard Error: 17 - .saturating_add(Weight::from_parts(2_165, 0).saturating_mul(s.into())) + // Minimum execution time: 4_575_784_000 picoseconds. + Weight::from_parts(207_379_459, 6262) + // Standard Error: 124 + .saturating_add(Weight::from_parts(52_392, 0).saturating_mul(c.into())) + // Standard Error: 15 + .saturating_add(Weight::from_parts(2_257, 0).saturating_mul(i.into())) + // Standard Error: 15 + .saturating_add(Weight::from_parts(2_263, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } @@ -1269,13 +1365,13 @@ impl WeightInfo for () { fn instantiate(i: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `560` - // Estimated: `4029` - // Minimum execution time: 2_219_163_000 picoseconds. - Weight::from_parts(2_236_918_000, 4029) - // Standard Error: 32 - .saturating_add(Weight::from_parts(937, 0).saturating_mul(i.into())) - // Standard Error: 32 - .saturating_add(Weight::from_parts(938, 0).saturating_mul(s.into())) + // Estimated: `4017` + // Minimum execution time: 2_306_770_000 picoseconds. + Weight::from_parts(2_462_908_000, 4017) + // Standard Error: 33 + .saturating_add(Weight::from_parts(898, 0).saturating_mul(i.into())) + // Standard Error: 33 + .saturating_add(Weight::from_parts(859, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -1295,8 +1391,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `826` // Estimated: `4291` - // Minimum execution time: 164_801_000 picoseconds. - Weight::from_parts(167_250_000, 4291) + // Minimum execution time: 165_499_000 picoseconds. + Weight::from_parts(169_903_000, 4291) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -1313,10 +1409,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 225_207_000 picoseconds. - Weight::from_parts(263_665_658, 3607) - // Standard Error: 47 - .saturating_add(Weight::from_parts(50_732, 0).saturating_mul(c.into())) + // Minimum execution time: 227_590_000 picoseconds. + Weight::from_parts(260_045_588, 3607) + // Standard Error: 52 + .saturating_add(Weight::from_parts(51_305, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -1333,10 +1429,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 230_718_000 picoseconds. - Weight::from_parts(258_359_271, 3607) - // Standard Error: 47 - .saturating_add(Weight::from_parts(51_014, 0).saturating_mul(c.into())) + // Minimum execution time: 239_634_000 picoseconds. + Weight::from_parts(262_040_831, 3607) + // Standard Error: 103 + .saturating_add(Weight::from_parts(51_590, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -1352,8 +1448,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `315` // Estimated: `3780` - // Minimum execution time: 39_668_000 picoseconds. - Weight::from_parts(41_031_000, 3780) + // Minimum execution time: 39_152_000 picoseconds. + Weight::from_parts(39_970_000, 3780) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -1367,8 +1463,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `552` // Estimated: `6492` - // Minimum execution time: 25_890_000 picoseconds. - Weight::from_parts(26_603_000, 6492) + // Minimum execution time: 25_143_000 picoseconds. + Weight::from_parts(26_103_000, 6492) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -1377,17 +1473,17 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_269_000 picoseconds. - Weight::from_parts(9_227_069, 0) - // Standard Error: 74 - .saturating_add(Weight::from_parts(51_396, 0).saturating_mul(r.into())) + // Minimum execution time: 8_406_000 picoseconds. + Weight::from_parts(9_056_753, 0) + // Standard Error: 98 + .saturating_add(Weight::from_parts(53_110, 0).saturating_mul(r.into())) } fn seal_caller() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 602_000 picoseconds. - Weight::from_parts(664_000, 0) + // Minimum execution time: 659_000 picoseconds. + Weight::from_parts(705_000, 0) } /// Storage: `Contracts::ContractInfoOf` (r:1 w:0) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) @@ -1395,8 +1491,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `354` // Estimated: `3819` - // Minimum execution time: 6_131_000 picoseconds. - Weight::from_parts(6_468_000, 3819) + // Minimum execution time: 6_165_000 picoseconds. + Weight::from_parts(6_340_000, 3819) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: `Contracts::ContractInfoOf` (r:1 w:0) @@ -1405,79 +1501,79 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `447` // Estimated: `3912` - // Minimum execution time: 7_557_000 picoseconds. - Weight::from_parts(7_704_000, 3912) + // Minimum execution time: 7_398_000 picoseconds. + Weight::from_parts(7_661_000, 3912) .saturating_add(RocksDbWeight::get().reads(1_u64)) } fn seal_own_code_hash() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 783_000 picoseconds. - Weight::from_parts(848_000, 0) + // Minimum execution time: 723_000 picoseconds. + Weight::from_parts(793_000, 0) } fn seal_caller_is_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 397_000 picoseconds. - Weight::from_parts(435_000, 0) + // Minimum execution time: 398_000 picoseconds. + Weight::from_parts(428_000, 0) } fn seal_caller_is_root() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 351_000 picoseconds. - Weight::from_parts(372_000, 0) + // Minimum execution time: 329_000 picoseconds. + Weight::from_parts(364_000, 0) } fn seal_address() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 608_000 picoseconds. - Weight::from_parts(645_000, 0) + // Minimum execution time: 592_000 picoseconds. + Weight::from_parts(624_000, 0) } fn seal_gas_left() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 661_000 picoseconds. - Weight::from_parts(729_000, 0) + // Minimum execution time: 665_000 picoseconds. + Weight::from_parts(714_000, 0) } fn seal_balance() -> Weight { // Proof Size summary in bytes: // Measured: `140` // Estimated: `0` - // Minimum execution time: 4_545_000 picoseconds. - Weight::from_parts(4_663_000, 0) + // Minimum execution time: 4_486_000 picoseconds. + Weight::from_parts(4_668_000, 0) } fn seal_value_transferred() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 614_000 picoseconds. - Weight::from_parts(641_000, 0) + // Minimum execution time: 548_000 picoseconds. + Weight::from_parts(590_000, 0) } fn seal_minimum_balance() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 583_000 picoseconds. - Weight::from_parts(618_000, 0) + // Minimum execution time: 536_000 picoseconds. + Weight::from_parts(578_000, 0) } fn seal_block_number() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 583_000 picoseconds. - Weight::from_parts(617_000, 0) + // Minimum execution time: 552_000 picoseconds. + Weight::from_parts(599_000, 0) } fn seal_now() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 607_000 picoseconds. - Weight::from_parts(638_000, 0) + // Minimum execution time: 556_000 picoseconds. + Weight::from_parts(600_000, 0) } /// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0) /// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `Measured`) @@ -1485,8 +1581,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `67` // Estimated: `1552` - // Minimum execution time: 4_172_000 picoseconds. - Weight::from_parts(4_408_000, 1552) + // Minimum execution time: 4_084_000 picoseconds. + Weight::from_parts(4_321_000, 1552) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// The range of component `n` is `[0, 1048572]`. @@ -1494,20 +1590,20 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 475_000 picoseconds. - Weight::from_parts(515_000, 0) + // Minimum execution time: 468_000 picoseconds. + Weight::from_parts(492_000, 0) // Standard Error: 3 - .saturating_add(Weight::from_parts(298, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(310, 0).saturating_mul(n.into())) } /// The range of component `n` is `[0, 1048572]`. fn seal_return(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 289_000 picoseconds. - Weight::from_parts(357_000, 0) - // Standard Error: 10 - .saturating_add(Weight::from_parts(405, 0).saturating_mul(n.into())) + // Minimum execution time: 377_000 picoseconds. + Weight::from_parts(396_000, 0) + // Standard Error: 9 + .saturating_add(Weight::from_parts(431, 0).saturating_mul(n.into())) } /// Storage: `Contracts::DeletionQueueCounter` (r:1 w:1) /// Proof: `Contracts::DeletionQueueCounter` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) @@ -1520,10 +1616,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `319 + n * (78 ±0)` // Estimated: `3784 + n * (2553 ±0)` - // Minimum execution time: 13_316_000 picoseconds. - Weight::from_parts(15_855_821, 3784) - // Standard Error: 7_274 - .saturating_add(Weight::from_parts(3_447_246, 0).saturating_mul(n.into())) + // Minimum execution time: 13_028_000 picoseconds. + Weight::from_parts(15_330_917, 3784) + // Standard Error: 8_260 + .saturating_add(Weight::from_parts(3_594_893, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes(3_u64)) @@ -1536,8 +1632,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 3_468_000 picoseconds. - Weight::from_parts(3_608_000, 1561) + // Minimum execution time: 3_367_000 picoseconds. + Weight::from_parts(3_555_000, 1561) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: `System::EventTopics` (r:4 w:4) @@ -1548,12 +1644,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `990 + t * (2475 ±0)` - // Minimum execution time: 3_777_000 picoseconds. - Weight::from_parts(4_028_191, 990) - // Standard Error: 5_907 - .saturating_add(Weight::from_parts(2_183_733, 0).saturating_mul(t.into())) + // Minimum execution time: 3_779_000 picoseconds. + Weight::from_parts(4_003_836, 990) + // Standard Error: 5_409 + .saturating_add(Weight::from_parts(2_082_176, 0).saturating_mul(t.into())) // Standard Error: 1 - .saturating_add(Weight::from_parts(18, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(14, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(t.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(t.into()))) .saturating_add(Weight::from_parts(0, 2475).saturating_mul(t.into())) @@ -1563,10 +1659,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 400_000 picoseconds. - Weight::from_parts(423_000, 0) + // Minimum execution time: 409_000 picoseconds. + Weight::from_parts(447_000, 0) // Standard Error: 10 - .saturating_add(Weight::from_parts(1_209, 0).saturating_mul(i.into())) + .saturating_add(Weight::from_parts(1_219, 0).saturating_mul(i.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -1576,12 +1672,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `250 + o * (1 ±0)` // Estimated: `249 + o * (1 ±0)` - // Minimum execution time: 9_033_000 picoseconds. - Weight::from_parts(8_797_934, 249) + // Minimum execution time: 9_176_000 picoseconds. + Weight::from_parts(9_121_191, 249) // Standard Error: 1 - .saturating_add(Weight::from_parts(257, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(292, 0).saturating_mul(n.into())) // Standard Error: 1 - .saturating_add(Weight::from_parts(51, 0).saturating_mul(o.into())) + .saturating_add(Weight::from_parts(31, 0).saturating_mul(o.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(o.into())) @@ -1593,10 +1689,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `248 + n * (1 ±0)` // Estimated: `248 + n * (1 ±0)` - // Minimum execution time: 7_167_000 picoseconds. - Weight::from_parts(8_012_194, 248) + // Minimum execution time: 7_294_000 picoseconds. + Weight::from_parts(7_963_151, 248) // Standard Error: 1 - .saturating_add(Weight::from_parts(90, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(92, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) @@ -1608,10 +1704,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `248 + n * (1 ±0)` // Estimated: `248 + n * (1 ±0)` - // Minimum execution time: 6_868_000 picoseconds. - Weight::from_parts(7_801_811, 248) + // Minimum execution time: 6_978_000 picoseconds. + Weight::from_parts(7_741_355, 248) // Standard Error: 1 - .saturating_add(Weight::from_parts(605, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(654, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } @@ -1622,10 +1718,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `248 + n * (1 ±0)` // Estimated: `248 + n * (1 ±0)` - // Minimum execution time: 6_322_000 picoseconds. - Weight::from_parts(7_103_552, 248) + // Minimum execution time: 6_286_000 picoseconds. + Weight::from_parts(7_026_923, 248) // Standard Error: 1 - .saturating_add(Weight::from_parts(79, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(86, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } @@ -1636,20 +1732,106 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `248 + n * (1 ±0)` // Estimated: `248 + n * (1 ±0)` - // Minimum execution time: 7_702_000 picoseconds. - Weight::from_parts(8_746_305, 248) - // Standard Error: 2 - .saturating_add(Weight::from_parts(604, 0).saturating_mul(n.into())) + // Minimum execution time: 7_597_000 picoseconds. + Weight::from_parts(8_706_785, 248) + // Standard Error: 1 + .saturating_add(Weight::from_parts(653, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } + fn set_transient_storage_empty() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_497_000 picoseconds. + Weight::from_parts(1_564_000, 0) + } + fn set_transient_storage_full() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_670_000 picoseconds. + Weight::from_parts(2_807_000, 0) + } + fn get_transient_storage_empty() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_836_000 picoseconds. + Weight::from_parts(3_878_000, 0) + } + fn get_transient_storage_full() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_537_000 picoseconds. + Weight::from_parts(4_665_000, 0) + } + fn rollback_transient_storage() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_592_000 picoseconds. + Weight::from_parts(1_742_000, 0) + } + /// The range of component `n` is `[0, 16384]`. + /// The range of component `o` is `[0, 16384]`. + fn seal_set_transient_storage(n: u32, o: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_101_000 picoseconds. + Weight::from_parts(2_481_218, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(242, 0).saturating_mul(n.into())) + // Standard Error: 0 + .saturating_add(Weight::from_parts(300, 0).saturating_mul(o.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_clear_transient_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_059_000 picoseconds. + Weight::from_parts(2_426_609, 0) + // Standard Error: 2 + .saturating_add(Weight::from_parts(307, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_get_transient_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_918_000 picoseconds. + Weight::from_parts(2_114_837, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(302, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_contains_transient_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_759_000 picoseconds. + Weight::from_parts(1_959_995, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(147, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_take_transient_storage(_n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_759_000 picoseconds. + Weight::from_parts(9_952_099, 0) + } fn seal_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `140` // Estimated: `0` - // Minimum execution time: 8_851_000 picoseconds. - Weight::from_parts(9_083_000, 0) + // Minimum execution time: 8_700_000 picoseconds. + Weight::from_parts(8_903_000, 0) } /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) @@ -1665,12 +1847,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `620 + t * (280 ±0)` // Estimated: `4085 + t * (2182 ±0)` - // Minimum execution time: 121_148_000 picoseconds. - Weight::from_parts(119_605_377, 4085) - // Standard Error: 208_337 - .saturating_add(Weight::from_parts(43_153_338, 0).saturating_mul(t.into())) + // Minimum execution time: 123_399_000 picoseconds. + Weight::from_parts(120_909_821, 4085) + // Standard Error: 166_830 + .saturating_add(Weight::from_parts(43_853_642, 0).saturating_mul(t.into())) // Standard Error: 0 - .saturating_add(Weight::from_parts(5, 0).saturating_mul(i.into())) + .saturating_add(Weight::from_parts(6, 0).saturating_mul(i.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(t.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) @@ -1685,8 +1867,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `430` // Estimated: `3895` - // Minimum execution time: 108_159_000 picoseconds. - Weight::from_parts(110_027_000, 3895) + // Minimum execution time: 112_350_000 picoseconds. + Weight::from_parts(116_003_000, 3895) .saturating_add(RocksDbWeight::get().reads(2_u64)) } /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) @@ -1704,13 +1886,13 @@ impl WeightInfo for () { fn seal_instantiate(i: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `676` - // Estimated: `4127` - // Minimum execution time: 1_861_874_000 picoseconds. - Weight::from_parts(1_872_926_000, 4127) - // Standard Error: 23 - .saturating_add(Weight::from_parts(557, 0).saturating_mul(i.into())) - // Standard Error: 23 - .saturating_add(Weight::from_parts(920, 0).saturating_mul(s.into())) + // Estimated: `4132` + // Minimum execution time: 1_972_276_000 picoseconds. + Weight::from_parts(1_977_872_000, 4132) + // Standard Error: 24 + .saturating_add(Weight::from_parts(623, 0).saturating_mul(i.into())) + // Standard Error: 24 + .saturating_add(Weight::from_parts(917, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -1719,64 +1901,64 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 878_000 picoseconds. - Weight::from_parts(10_993_950, 0) + // Minimum execution time: 899_000 picoseconds. + Weight::from_parts(10_963_972, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_325, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(1_355, 0).saturating_mul(n.into())) } /// The range of component `n` is `[0, 1048576]`. fn seal_hash_keccak_256(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_261_000 picoseconds. - Weight::from_parts(9_759_497, 0) + // Minimum execution time: 1_396_000 picoseconds. + Weight::from_parts(9_404_986, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(3_594, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(3_627, 0).saturating_mul(n.into())) } /// The range of component `n` is `[0, 1048576]`. fn seal_hash_blake2_256(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 726_000 picoseconds. - Weight::from_parts(9_795_728, 0) + // Minimum execution time: 834_000 picoseconds. + Weight::from_parts(9_749_716, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_455, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(1_500, 0).saturating_mul(n.into())) } /// The range of component `n` is `[0, 1048576]`. fn seal_hash_blake2_128(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 739_000 picoseconds. - Weight::from_parts(9_701_202, 0) + // Minimum execution time: 756_000 picoseconds. + Weight::from_parts(8_995_036, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_459, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(1_495, 0).saturating_mul(n.into())) } /// The range of component `n` is `[0, 125697]`. fn seal_sr25519_verify(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 43_309_000 picoseconds. - Weight::from_parts(41_405_949, 0) + // Minimum execution time: 45_800_000 picoseconds. + Weight::from_parts(44_676_829, 0) // Standard Error: 8 - .saturating_add(Weight::from_parts(5_336, 0).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(5_315, 0).saturating_mul(n.into())) } fn seal_ecdsa_recover() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 47_880_000 picoseconds. - Weight::from_parts(49_025_000, 0) + // Minimum execution time: 47_415_000 picoseconds. + Weight::from_parts(48_743_000, 0) } fn seal_ecdsa_to_eth_address() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_462_000 picoseconds. - Weight::from_parts(13_631_000, 0) + // Minimum execution time: 13_437_000 picoseconds. + Weight::from_parts(13_588_000, 0) } /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) @@ -1786,8 +1968,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `430` // Estimated: `3895` - // Minimum execution time: 17_978_000 picoseconds. - Weight::from_parts(18_578_000, 3895) + // Minimum execution time: 17_775_000 picoseconds. + Weight::from_parts(18_332_000, 3895) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1797,8 +1979,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `355` // Estimated: `3820` - // Minimum execution time: 8_384_000 picoseconds. - Weight::from_parts(8_687_000, 3820) + // Minimum execution time: 8_326_000 picoseconds. + Weight::from_parts(8_656_000, 3820) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1808,8 +1990,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `355` // Estimated: `3558` - // Minimum execution time: 7_547_000 picoseconds. - Weight::from_parts(7_935_000, 3558) + // Minimum execution time: 7_276_000 picoseconds. + Weight::from_parts(7_630_000, 3558) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1817,15 +1999,15 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 331_000 picoseconds. - Weight::from_parts(363_000, 0) + // Minimum execution time: 330_000 picoseconds. + Weight::from_parts(373_000, 0) } fn seal_account_reentrance_count() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 349_000 picoseconds. - Weight::from_parts(365_000, 0) + // Minimum execution time: 381_000 picoseconds. + Weight::from_parts(418_000, 0) } /// Storage: `Contracts::Nonce` (r:1 w:0) /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) @@ -1833,8 +2015,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `219` // Estimated: `1704` - // Minimum execution time: 2_814_000 picoseconds. - Weight::from_parts(3_038_000, 1704) + // Minimum execution time: 2_711_000 picoseconds. + Weight::from_parts(2_941_000, 1704) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// The range of component `r` is `[0, 5000]`. @@ -1842,9 +2024,9 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 693_000 picoseconds. - Weight::from_parts(665_431, 0) - // Standard Error: 12 - .saturating_add(Weight::from_parts(7_030, 0).saturating_mul(r.into())) + // Minimum execution time: 720_000 picoseconds. + Weight::from_parts(389_111, 0) + // Standard Error: 16 + .saturating_add(Weight::from_parts(7_278, 0).saturating_mul(r.into())) } } diff --git a/substrate/frame/contracts/uapi/src/host.rs b/substrate/frame/contracts/uapi/src/host.rs index 92065eda5d6..51f0cd7eb2d 100644 --- a/substrate/frame/contracts/uapi/src/host.rs +++ b/substrate/frame/contracts/uapi/src/host.rs @@ -67,7 +67,7 @@ fn ptr_or_sentinel(data: &Option<&[u8]>) -> *const u8 { pub enum HostFnImpl {} /// Defines all the host apis implemented by both wasm and RISC-V vms. -pub trait HostFn { +pub trait HostFn: private::Sealed { /// Returns the number of times specified contract exists on the call stack. Delegated calls are /// not counted as separate calls. /// @@ -292,6 +292,20 @@ pub trait HostFn { /// Returns the size of the pre-existing value at the specified key if any. fn clear_storage_v1(key: &[u8]) -> Option; + /// Clear the value at the given key in the contract transient storage. + /// + /// # Parameters + /// + /// - `key`: The storage key. + /// + /// # Return + /// + /// Returns the size of the pre-existing value at the specified key if any. + #[deprecated( + note = "Unstable function. Behaviour can change without further notice. Use only for testing." + )] + fn clear_transient_storage(key: &[u8]) -> Option; + /// Retrieve the code hash for a specified contract address. /// /// # Parameters @@ -324,6 +338,21 @@ pub trait HostFn { /// Returns the size of the pre-existing value at the specified key if any. fn contains_storage_v1(key: &[u8]) -> Option; + /// Checks whether there is a value stored under the given key in transient storage. + /// + /// The key length must not exceed the maximum defined by the contracts module parameter. + /// + /// # Parameters + /// - `key`: The storage key. + /// + /// # Return + /// + /// Returns the size of the pre-existing value at the specified key if any. + #[deprecated( + note = "Unstable function. Behaviour can change without further notice. Use only for testing." + )] + fn contains_transient_storage(key: &[u8]) -> Option; + /// Emit a custom debug message. /// /// No newlines are added to the supplied message. @@ -453,6 +482,22 @@ pub trait HostFn { /// [KeyNotFound][`crate::ReturnErrorCode::KeyNotFound] fn get_storage_v1(key: &[u8], output: &mut &mut [u8]) -> Result; + /// Retrieve the value under the given key from transient storage. + /// + /// The key length must not exceed the maximum defined by the contracts module parameter. + /// + /// # Parameters + /// - `key`: The storage key. + /// - `output`: A reference to the output data buffer to write the storage entry. + /// + /// # Errors + /// + /// [KeyNotFound][`crate::ReturnErrorCode::KeyNotFound] + #[deprecated( + note = "Unstable function. Behaviour can change without further notice. Use only for testing." + )] + fn get_transient_storage(key: &[u8], output: &mut &mut [u8]) -> Result; + hash_fn!(sha2_256, 32); hash_fn!(keccak_256, 32); hash_fn!(blake2_256, 32); @@ -673,6 +718,24 @@ pub trait HostFn { /// Returns the size of the pre-existing value at the specified key if any. fn set_storage_v2(key: &[u8], value: &[u8]) -> Option; + /// Set the value at the given key in the contract transient storage. + /// + /// The key and value lengths must not exceed the maximums defined by the contracts module + /// parameters. + /// + /// # Parameters + /// + /// - `key`: The storage key. + /// - `encoded_value`: The storage value. + /// + /// # Return + /// + /// Returns the size of the pre-existing value at the specified key if any. + #[deprecated( + note = "Unstable function. Behaviour can change without further notice. Use only for testing." + )] + fn set_transient_storage(key: &[u8], value: &[u8]) -> Option; + /// Verify a sr25519 signature /// /// # Parameters @@ -696,6 +759,20 @@ pub trait HostFn { /// [KeyNotFound][`crate::ReturnErrorCode::KeyNotFound] fn take_storage(key: &[u8], output: &mut &mut [u8]) -> Result; + /// Retrieve and remove the value under the given key from transient storage. + /// + /// # Parameters + /// - `key`: The storage key. + /// - `output`: A reference to the output data buffer to write the storage entry. + /// + /// # Errors + /// + /// [KeyNotFound][`crate::ReturnErrorCode::KeyNotFound] + #[deprecated( + note = "Unstable function. Behaviour can change without further notice. Use only for testing." + )] + fn take_transient_storage(key: &[u8], output: &mut &mut [u8]) -> Result; + /// Transfer some amount of funds into the specified account. /// /// # Parameters @@ -804,3 +881,8 @@ pub trait HostFn { )] fn xcm_send(dest: &[u8], msg: &[u8], output: &mut [u8; 32]) -> Result; } + +mod private { + pub trait Sealed {} + impl Sealed for super::HostFnImpl {} +} diff --git a/substrate/frame/contracts/uapi/src/host/riscv32.rs b/substrate/frame/contracts/uapi/src/host/riscv32.rs index 561ab28747d..35552023321 100644 --- a/substrate/frame/contracts/uapi/src/host/riscv32.rs +++ b/substrate/frame/contracts/uapi/src/host/riscv32.rs @@ -172,6 +172,10 @@ impl HostFn for HostFnImpl { todo!() } + fn set_transient_storage(key: &[u8], encoded_value: &[u8]) -> Option { + todo!() + } + fn clear_storage(key: &[u8]) { todo!() } @@ -180,13 +184,25 @@ impl HostFn for HostFnImpl { todo!() } + fn clear_transient_storage(key: &[u8]) -> Option { + todo!() + } + impl_get_storage!(get_storage, sys::get_storage); impl_get_storage!(get_storage_v1, sys::v1::get_storage); + fn get_transient_storage(key: &[u8], output: &mut &mut [u8]) -> Result { + todo!() + } + fn take_storage(key: &[u8], output: &mut &mut [u8]) -> Result { todo!() } + fn take_transient_storage(key: &[u8], output: &mut &mut [u8]) -> Result { + todo!() + } + fn contains_storage(key: &[u8]) -> Option { todo!() } @@ -195,6 +211,10 @@ impl HostFn for HostFnImpl { todo!() } + fn contains_transient_storage(key: &[u8]) -> Option { + todo!() + } + fn terminate(beneficiary: &[u8]) -> ! { todo!() } diff --git a/substrate/frame/contracts/uapi/src/host/wasm32.rs b/substrate/frame/contracts/uapi/src/host/wasm32.rs index cb5435bfc01..55600bc3201 100644 --- a/substrate/frame/contracts/uapi/src/host/wasm32.rs +++ b/substrate/frame/contracts/uapi/src/host/wasm32.rs @@ -61,6 +61,8 @@ mod sys { pub fn clear_storage(key_ptr: *const u8); + pub fn clear_transient_storage(key_ptr: *const u8, key_len: u32) -> ReturnCode; + pub fn code_hash( account_id_ptr: *const u8, output_ptr: *mut u8, @@ -69,6 +71,8 @@ mod sys { pub fn contains_storage(key_ptr: *const u8) -> ReturnCode; + pub fn contains_transient_storage(key_ptr: *const u8, key_len: u32) -> ReturnCode; + pub fn debug_message(str_ptr: *const u8, str_len: u32) -> ReturnCode; pub fn delegate_call( @@ -103,6 +107,13 @@ mod sys { out_len_ptr: *mut u32, ) -> ReturnCode; + pub fn get_transient_storage( + key_ptr: *const u8, + key_len: u32, + out_ptr: *mut u8, + out_len_ptr: *mut u32, + ) -> ReturnCode; + pub fn hash_blake2_128(input_ptr: *const u8, input_len: u32, output_ptr: *mut u8); pub fn hash_blake2_256(input_ptr: *const u8, input_len: u32, output_ptr: *mut u8); @@ -133,6 +144,13 @@ mod sys { pub fn set_storage(key_ptr: *const u8, value_ptr: *const u8, value_len: u32); + pub fn set_transient_storage( + key_ptr: *const u8, + key_len: u32, + value_ptr: *const u8, + value_len: u32, + ) -> ReturnCode; + pub fn sr25519_verify( signature_ptr: *const u8, public_key_ptr: *const u8, @@ -147,6 +165,13 @@ mod sys { out_len_ptr: *mut u32, ) -> ReturnCode; + pub fn take_transient_storage( + key_ptr: *const u8, + key_len: u32, + out_ptr: *mut u8, + out_len_ptr: *mut u32, + ) -> ReturnCode; + pub fn terminate(beneficiary_ptr: *const u8) -> !; pub fn transfer( @@ -598,6 +623,18 @@ impl HostFn for HostFnImpl { ret_code.into() } + fn set_transient_storage(key: &[u8], encoded_value: &[u8]) -> Option { + let ret_code = unsafe { + sys::set_transient_storage( + key.as_ptr(), + key.len() as u32, + encoded_value.as_ptr(), + encoded_value.len() as u32, + ) + }; + ret_code.into() + } + fn clear_storage(key: &[u8]) { unsafe { sys::clear_storage(key.as_ptr()) }; } @@ -607,6 +644,11 @@ impl HostFn for HostFnImpl { ret_code.into() } + fn clear_transient_storage(key: &[u8]) -> Option { + let ret_code = unsafe { sys::clear_transient_storage(key.as_ptr(), key.len() as u32) }; + ret_code.into() + } + #[inline(always)] fn get_storage(key: &[u8], output: &mut &mut [u8]) -> Result { let mut output_len = output.len() as u32; @@ -633,6 +675,23 @@ impl HostFn for HostFnImpl { ret_code.into() } + #[inline(always)] + fn get_transient_storage(key: &[u8], output: &mut &mut [u8]) -> Result { + let mut output_len = output.len() as u32; + let ret_code = { + unsafe { + sys::get_transient_storage( + key.as_ptr(), + key.len() as u32, + output.as_mut_ptr(), + &mut output_len, + ) + } + }; + extract_from_slice(output, output_len as usize); + ret_code.into() + } + #[inline(always)] fn take_storage(key: &[u8], output: &mut &mut [u8]) -> Result { let mut output_len = output.len() as u32; @@ -650,6 +709,23 @@ impl HostFn for HostFnImpl { ret_code.into() } + #[inline(always)] + fn take_transient_storage(key: &[u8], output: &mut &mut [u8]) -> Result { + let mut output_len = output.len() as u32; + let ret_code = { + unsafe { + sys::take_transient_storage( + key.as_ptr(), + key.len() as u32, + output.as_mut_ptr(), + &mut output_len, + ) + } + }; + extract_from_slice(output, output_len as usize); + ret_code.into() + } + fn debug_message(str: &[u8]) -> Result { let ret_code = unsafe { sys::debug_message(str.as_ptr(), str.len() as u32) }; ret_code.into() @@ -665,6 +741,11 @@ impl HostFn for HostFnImpl { ret_code.into() } + fn contains_transient_storage(key: &[u8]) -> Option { + let ret_code = unsafe { sys::contains_transient_storage(key.as_ptr(), key.len() as u32) }; + ret_code.into() + } + fn terminate(beneficiary: &[u8]) -> ! { unsafe { sys::terminate(beneficiary.as_ptr()) } } -- GitLab From 79a3d6c294430a52f00563f8a5e59984680b889f Mon Sep 17 00:00:00 2001 From: Andrei Eres Date: Tue, 16 Jul 2024 13:31:51 +0200 Subject: [PATCH 127/130] Adjust base value for statement-distribution regression tests (#5028) A baseline for the statement-distribution regression test was set only in the beginning and now we see that the actual values a bit lower. image [Source](https://paritytech.github.io/polkadot-sdk/bench/statement-distribution-regression-bench) --- .../benches/statement-distribution-regression-bench.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polkadot/node/network/statement-distribution/benches/statement-distribution-regression-bench.rs b/polkadot/node/network/statement-distribution/benches/statement-distribution-regression-bench.rs index 9cbe385e3f4..4e7206e0a36 100644 --- a/polkadot/node/network/statement-distribution/benches/statement-distribution-regression-bench.rs +++ b/polkadot/node/network/statement-distribution/benches/statement-distribution-regression-bench.rs @@ -63,7 +63,7 @@ fn main() -> Result<(), String> { ("Received from peers", 106.4000, 0.001), ("Sent to peers", 127.9100, 0.001), ])); - messages.extend(average_usage.check_cpu_usage(&[("statement-distribution", 0.0390, 0.1)])); + messages.extend(average_usage.check_cpu_usage(&[("statement-distribution", 0.0374, 0.1)])); if messages.is_empty() { Ok(()) -- GitLab From 66baa2fb307fe72cb9ddc7c3be16ba57fcb2670a Mon Sep 17 00:00:00 2001 From: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:48:42 +0200 Subject: [PATCH 128/130] [ci] Update forklift in CI image (#5032) cc https://github.com/paritytech/ci_cd/issues/939 --- .github/env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/env b/.github/env index 162ce8af7c0..2e4d5b48100 100644 --- a/.github/env +++ b/.github/env @@ -1 +1 @@ -IMAGE="docker.io/paritytech/ci-unified:bullseye-1.77.0-2024-04-10-v20240408" \ No newline at end of file +IMAGE="docker.io/paritytech/ci-unified:bullseye-1.77.0-2024-04-10-v202407161507" -- GitLab From 975e04bbb59b643362f918e8521f0cde5c27fbc8 Mon Sep 17 00:00:00 2001 From: Andrei Eres Date: Tue, 16 Jul 2024 19:56:25 +0200 Subject: [PATCH 129/130] Send PeerViewChange with high priority (#4755) Closes https://github.com/paritytech/polkadot-sdk/issues/577 ### Changed - `orchestra` updated to 0.4.0 - `PeerViewChange` sent with high priority and should be processed first in a queue. - To count them in tests added tracker to TestSender and TestOverseer. It acts more like a smoke test though. ### Testing on Versi The changes were tested on Versi with two objectives: 1. Make sure the node functionality does not change. 2. See how the changes affect performance. Test setup: - 2.5 hours for each case - 100 validators - 50 parachains - validatorsPerCore = 2 - neededApprovals = 100 - nDelayTranches = 89 - relayVrfModuloSamples = 50 During the test period, all nodes ran without any crashes, which satisfies the first objective. To estimate the change in performance we used ToF charts. The graphs show that there are no spikes in the top as before. This proves that our hypothesis is correct. ### Normalized charts with ToF ![image](https://github.com/user-attachments/assets/0d49d0db-8302-4a8c-a557-501856805ff5) [Before](https://grafana.teleport.parity.io/goto/ZoR53ClSg?orgId=1) ![image](https://github.com/user-attachments/assets/9cc73784-7e45-49d9-8212-152373c05880) [After](https://grafana.teleport.parity.io/goto/6ux5qC_IR?orgId=1) ### Conclusion The prioritization of subsystem messages reduces the ToF of the networking subsystem, which helps faster propagation of gossip messages. --- Cargo.lock | 24 ++++++-- Cargo.toml | 2 +- polkadot/node/malus/src/interceptor.rs | 13 +++- .../src/tests/state.rs | 2 +- polkadot/node/network/bridge/src/rx/mod.rs | 32 ++++++++-- polkadot/node/network/bridge/src/rx/tests.rs | 17 ++++++ polkadot/node/overseer/src/lib.rs | 17 +++--- .../node/subsystem-test-helpers/src/lib.rs | 61 +++++++++++++++++-- prdoc/pr_4755.prdoc | 24 ++++++++ 9 files changed, 165 insertions(+), 27 deletions(-) create mode 100644 prdoc/pr_4755.prdoc diff --git a/Cargo.lock b/Cargo.lock index 9972285780f..3866a74b3f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5376,12 +5376,14 @@ dependencies = [ [[package]] name = "expander" -version = "2.0.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f86a749cf851891866c10515ef6c299b5c69661465e9c3bbe7e07a2b77fb0f7" +checksum = "e2c470c71d91ecbd179935b24170459e926382eaaa86b590b78814e180d8a8e2" dependencies = [ "blake2 0.10.6", + "file-guard", "fs-err", + "prettyplease 0.2.12", "proc-macro2 1.0.82", "quote 1.0.35", "syn 2.0.61", @@ -5514,6 +5516,16 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +[[package]] +name = "file-guard" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21ef72acf95ec3d7dbf61275be556299490a245f017cf084bd23b4f68cf9407c" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "file-per-thread-logger" version = "0.1.6" @@ -9554,9 +9566,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "orchestra" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92829eef0328a3d1cd22a02c0e51deb92a5362df3e7d21a4e9bdc38934694e66" +checksum = "41f6bbacc8c189a3f2e45e0fd0436e5d97f194db888e721bdbc3973e7dbed4c2" dependencies = [ "async-trait", "dyn-clonable", @@ -9571,9 +9583,9 @@ dependencies = [ [[package]] name = "orchestra-proc-macro" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1344346d5af32c95bbddea91b18a88cc83eac394192d20ef2fc4c40a74332355" +checksum = "f7b1d40dd8f367db3c65bec8d3dd47d4a604ee8874480738f93191bddab4e0e0" dependencies = [ "expander", "indexmap 2.2.3", diff --git a/Cargo.toml b/Cargo.toml index 5c2677fffeb..0999d630401 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -855,7 +855,7 @@ num-rational = { version = "0.4.1" } num-traits = { version = "0.2.17", default-features = false } num_cpus = { version = "1.13.1" } once_cell = { version = "1.19.0" } -orchestra = { version = "0.3.5", default-features = false } +orchestra = { version = "0.4.0", default-features = false } pallet-alliance = { path = "substrate/frame/alliance", default-features = false } pallet-asset-conversion = { path = "substrate/frame/asset-conversion", default-features = false } pallet-asset-conversion-ops = { path = "substrate/frame/asset-conversion/ops", default-features = false } diff --git a/polkadot/node/malus/src/interceptor.rs b/polkadot/node/malus/src/interceptor.rs index b44ffc8956b..2181118646d 100644 --- a/polkadot/node/malus/src/interceptor.rs +++ b/polkadot/node/malus/src/interceptor.rs @@ -90,6 +90,10 @@ where >::Error: std::fmt::Debug, { async fn send_message(&mut self, msg: OutgoingMessage) { + self.send_message_with_priority::(msg).await; + } + + async fn send_message_with_priority(&mut self, msg: OutgoingMessage) { let msg = < <>::Message as overseer::AssociateOutgoing >::OutgoingMessages as From>::from(msg); @@ -103,7 +107,14 @@ where } } - fn try_send_message(&mut self, msg: OutgoingMessage) -> Result<(), TrySendError> { + fn try_send_message( + &mut self, + msg: OutgoingMessage, + ) -> Result<(), polkadot_node_subsystem_util::metered::TrySendError> { + self.try_send_message_with_priority::(msg) + } + + fn try_send_message_with_priority(&mut self, msg: OutgoingMessage) -> Result<(), TrySendError> { let msg = < <>::Message as overseer::AssociateOutgoing >::OutgoingMessages as From>::from(msg); diff --git a/polkadot/node/network/availability-distribution/src/tests/state.rs b/polkadot/node/network/availability-distribution/src/tests/state.rs index befbff0a2f2..97e616f79fb 100644 --- a/polkadot/node/network/availability-distribution/src/tests/state.rs +++ b/polkadot/node/network/availability-distribution/src/tests/state.rs @@ -216,7 +216,7 @@ impl TestState { // Test will fail if this does not happen until timeout. let mut remaining_stores = self.valid_chunks.len(); - let TestSubsystemContextHandle { tx, mut rx } = harness.virtual_overseer; + let TestSubsystemContextHandle { tx, mut rx, .. } = harness.virtual_overseer; // Spawning necessary as incoming queue can only hold a single item, we don't want to dead // lock ;-) diff --git a/polkadot/node/network/bridge/src/rx/mod.rs b/polkadot/node/network/bridge/src/rx/mod.rs index 84e935366d0..56965ce6ba4 100644 --- a/polkadot/node/network/bridge/src/rx/mod.rs +++ b/polkadot/node/network/bridge/src/rx/mod.rs @@ -1135,13 +1135,33 @@ async fn dispatch_validation_events_to_all( I: IntoIterator>, I::IntoIter: Send, { + macro_rules! send_message { + ($event:expr, $message:ident) => { + if let Ok(event) = $event.focus() { + let has_high_priority = matches!( + event, + // NetworkBridgeEvent::OurViewChange(..) must also be here, + // but it is sent via an unbounded channel. + // See https://github.com/paritytech/polkadot-sdk/issues/824 + NetworkBridgeEvent::PeerConnected(..) | + NetworkBridgeEvent::PeerDisconnected(..) | + NetworkBridgeEvent::PeerViewChange(..) + ); + let message = $message::from(event); + if has_high_priority { + sender.send_message_with_priority::(message).await; + } else { + sender.send_message(message).await; + } + } + }; + } + for event in events { - sender - .send_messages(event.focus().map(StatementDistributionMessage::from)) - .await; - sender.send_messages(event.focus().map(BitfieldDistributionMessage::from)).await; - sender.send_messages(event.focus().map(ApprovalDistributionMessage::from)).await; - sender.send_messages(event.focus().map(GossipSupportMessage::from)).await; + send_message!(event, StatementDistributionMessage); + send_message!(event, BitfieldDistributionMessage); + send_message!(event, ApprovalDistributionMessage); + send_message!(event, GossipSupportMessage); } } diff --git a/polkadot/node/network/bridge/src/rx/tests.rs b/polkadot/node/network/bridge/src/rx/tests.rs index 6182bf3d883..392ff7391a1 100644 --- a/polkadot/node/network/bridge/src/rx/tests.rs +++ b/polkadot/node/network/bridge/src/rx/tests.rs @@ -880,6 +880,8 @@ fn peer_view_updates_sent_via_overseer() { &mut virtual_overseer, ) .await; + + assert_eq!(virtual_overseer.message_counter.with_high_priority(), 8); } network_handle @@ -895,6 +897,7 @@ fn peer_view_updates_sent_via_overseer() { &mut virtual_overseer, ) .await; + assert_eq!(virtual_overseer.message_counter.with_high_priority(), 12); virtual_overseer }); } @@ -930,6 +933,8 @@ fn peer_messages_sent_via_overseer() { &mut virtual_overseer, ) .await; + + assert_eq!(virtual_overseer.message_counter.with_high_priority(), 8); } let approval_distribution_message = @@ -970,6 +975,7 @@ fn peer_messages_sent_via_overseer() { &mut virtual_overseer, ) .await; + assert_eq!(virtual_overseer.message_counter.with_high_priority(), 12); virtual_overseer }); } @@ -1008,6 +1014,8 @@ fn peer_disconnect_from_just_one_peerset() { &mut virtual_overseer, ) .await; + + assert_eq!(virtual_overseer.message_counter.with_high_priority(), 8); } { @@ -1036,6 +1044,7 @@ fn peer_disconnect_from_just_one_peerset() { &mut virtual_overseer, ) .await; + assert_eq!(virtual_overseer.message_counter.with_high_priority(), 12); // to show that we're still connected on the collation protocol, send a view update. @@ -1094,6 +1103,8 @@ fn relays_collation_protocol_messages() { &mut virtual_overseer, ) .await; + + assert_eq!(virtual_overseer.message_counter.with_high_priority(), 8); } { @@ -1201,6 +1212,8 @@ fn different_views_on_different_peer_sets() { &mut virtual_overseer, ) .await; + + assert_eq!(virtual_overseer.message_counter.with_high_priority(), 8); } { @@ -1247,6 +1260,8 @@ fn different_views_on_different_peer_sets() { ) .await; + assert_eq!(virtual_overseer.message_counter.with_high_priority(), 12); + assert_sends_collation_event_to_all( NetworkBridgeEvent::PeerViewChange(peer, view_b.clone()), &mut virtual_overseer, @@ -1481,6 +1496,8 @@ fn network_protocol_versioning_subsystem_msg() { &mut virtual_overseer, ) .await; + + assert_eq!(virtual_overseer.message_counter.with_high_priority(), 8); } let approval_distribution_message = diff --git a/polkadot/node/overseer/src/lib.rs b/polkadot/node/overseer/src/lib.rs index 24985a99913..4e13d5eda76 100644 --- a/polkadot/node/overseer/src/lib.rs +++ b/polkadot/node/overseer/src/lib.rs @@ -105,10 +105,11 @@ pub use polkadot_node_metrics::{ pub use orchestra as gen; pub use orchestra::{ - contextbounds, orchestra, subsystem, FromOrchestra, MapSubsystem, MessagePacket, - OrchestraError as OverseerError, SignalsReceived, Spawner, Subsystem, SubsystemContext, - SubsystemIncomingMessages, SubsystemInstance, SubsystemMeterReadouts, SubsystemMeters, - SubsystemSender, TimeoutExt, ToOrchestra, TrySendError, + contextbounds, orchestra, subsystem, FromOrchestra, HighPriority, MapSubsystem, MessagePacket, + NormalPriority, OrchestraError as OverseerError, Priority, PriorityLevel, SignalsReceived, + Spawner, Subsystem, SubsystemContext, SubsystemIncomingMessages, SubsystemInstance, + SubsystemMeterReadouts, SubsystemMeters, SubsystemSender, TimeoutExt, ToOrchestra, + TrySendError, }; #[cfg(any(target_os = "linux", feature = "jemalloc-allocator"))] @@ -495,7 +496,7 @@ pub struct Overseer { RuntimeApiMessage, ProspectiveParachainsMessage, ChainApiMessage, - ])] + ], can_receive_priority_messages)] statement_distribution: StatementDistribution, #[subsystem(AvailabilityDistributionMessage, sends: [ @@ -524,7 +525,7 @@ pub struct Overseer { RuntimeApiMessage, NetworkBridgeTxMessage, ProvisionerMessage, - ])] + ], can_receive_priority_messages)] bitfield_distribution: BitfieldDistribution, #[subsystem(ProvisionerMessage, sends: [ @@ -580,7 +581,7 @@ pub struct Overseer { #[subsystem(blocking, message_capacity: 64000, ApprovalDistributionMessage, sends: [ NetworkBridgeTxMessage, ApprovalVotingMessage, - ])] + ], can_receive_priority_messages)] approval_distribution: ApprovalDistribution, #[subsystem(blocking, ApprovalVotingMessage, sends: [ @@ -599,7 +600,7 @@ pub struct Overseer { NetworkBridgeRxMessage, // TODO RuntimeApiMessage, ChainSelectionMessage, - ])] + ], can_receive_priority_messages)] gossip_support: GossipSupport, #[subsystem(blocking, message_capacity: 32000, DisputeCoordinatorMessage, sends: [ diff --git a/polkadot/node/subsystem-test-helpers/src/lib.rs b/polkadot/node/subsystem-test-helpers/src/lib.rs index 375121c3746..bdb0647fee6 100644 --- a/polkadot/node/subsystem-test-helpers/src/lib.rs +++ b/polkadot/node/subsystem-test-helpers/src/lib.rs @@ -36,7 +36,7 @@ use std::{ convert::Infallible, future::Future, pin::Pin, - sync::Arc, + sync::{atomic::AtomicUsize, Arc}, task::{Context, Poll, Waker}, time::Duration, }; @@ -146,12 +146,13 @@ pub fn single_item_sink() -> (SingleItemSink, SingleItemStream) { #[derive(Clone)] pub struct TestSubsystemSender { tx: mpsc::UnboundedSender, + message_counter: MessageCounter, } /// Construct a sender/receiver pair. pub fn sender_receiver() -> (TestSubsystemSender, mpsc::UnboundedReceiver) { let (tx, rx) = mpsc::unbounded(); - (TestSubsystemSender { tx }, rx) + (TestSubsystemSender { tx, message_counter: MessageCounter::default() }, rx) } #[async_trait::async_trait] @@ -161,6 +162,11 @@ where OutgoingMessage: Send + 'static, { async fn send_message(&mut self, msg: OutgoingMessage) { + self.send_message_with_priority::(msg).await; + } + + async fn send_message_with_priority(&mut self, msg: OutgoingMessage) { + self.message_counter.increment(P::priority()); self.tx.send(msg.into()).await.expect("test overseer no longer live"); } @@ -168,6 +174,14 @@ where &mut self, msg: OutgoingMessage, ) -> Result<(), TrySendError> { + self.try_send_message_with_priority::(msg) + } + + fn try_send_message_with_priority( + &mut self, + msg: OutgoingMessage, + ) -> Result<(), TrySendError> { + self.message_counter.increment(P::priority()); self.tx.unbounded_send(msg.into()).expect("test overseer no longer live"); Ok(()) } @@ -277,6 +291,9 @@ pub struct TestSubsystemContextHandle { /// Direct access to the receiver. pub rx: mpsc::UnboundedReceiver, + + /// Message counter over subsystems. + pub message_counter: MessageCounter, } impl TestSubsystemContextHandle { @@ -322,6 +339,34 @@ pub fn make_subsystem_context( make_buffered_subsystem_context(spawner, 0) } +/// Message counter over subsystems. +#[derive(Default, Clone)] +pub struct MessageCounter { + total: Arc, + with_high_priority: Arc, +} + +impl MessageCounter { + /// Increment the message counter. + pub fn increment(&mut self, priority_level: overseer::PriorityLevel) { + self.total.fetch_add(1, std::sync::atomic::Ordering::SeqCst); + if matches!(priority_level, overseer::PriorityLevel::High) { + self.with_high_priority.fetch_add(1, std::sync::atomic::Ordering::SeqCst); + } + } + + /// Reset the message counter. + pub fn reset(&mut self) { + self.total.store(0, std::sync::atomic::Ordering::SeqCst); + self.with_high_priority.store(0, std::sync::atomic::Ordering::SeqCst); + } + + /// Get the messages with high priority count. + pub fn with_high_priority(&self) -> usize { + self.with_high_priority.load(std::sync::atomic::Ordering::SeqCst) + } +} + /// Make a test subsystem context with buffered overseer channel. Some tests (e.g. /// `dispute-coordinator`) create too many parallel operations and deadlock unless /// the channel is buffered. Usually `buffer_size=1` is enough. @@ -331,15 +376,23 @@ pub fn make_buffered_subsystem_context( ) -> (TestSubsystemContext>, TestSubsystemContextHandle) { let (overseer_tx, overseer_rx) = mpsc::channel(buffer_size); let (all_messages_tx, all_messages_rx) = mpsc::unbounded(); + let message_counter = MessageCounter::default(); ( TestSubsystemContext { - tx: TestSubsystemSender { tx: all_messages_tx }, + tx: TestSubsystemSender { + tx: all_messages_tx, + message_counter: message_counter.clone(), + }, rx: overseer_rx, spawn: SpawnGlue(spawner), message_buffer: VecDeque::new(), }, - TestSubsystemContextHandle { tx: overseer_tx, rx: all_messages_rx }, + TestSubsystemContextHandle { + tx: overseer_tx, + rx: all_messages_rx, + message_counter: message_counter.clone(), + }, ) } diff --git a/prdoc/pr_4755.prdoc b/prdoc/pr_4755.prdoc new file mode 100644 index 00000000000..1018446cb67 --- /dev/null +++ b/prdoc/pr_4755.prdoc @@ -0,0 +1,24 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Send PeerViewChange with high priority + +doc: + - audience: Node Dev + description: | + - orchestra updated to 0.4.0, which introduces support for prioritizing system messages. + - PeerViewChange sent with high priority and should be processed first in a queue. + - To count them in tests added tracker to TestSender and TestOverseer. It acts more like a smoke test though. + + +crates: + - name: polkadot-overseer + bump: minor + - name: polkadot-network-bridge + bump: patch + - name: polkadot-availability-distribution + bump: patch + - name: polkadot-test-malus + bump: patch + - name: polkadot-node-subsystem-test-helpers + bump: patch -- GitLab From 0db509263c18ff011dcb64af0b0e87f6f68a7c16 Mon Sep 17 00:00:00 2001 From: Alin Dima Date: Wed, 17 Jul 2024 12:27:11 +0300 Subject: [PATCH 130/130] add elastic scaling MVP guide (#4663) Resolves https://github.com/paritytech/polkadot-sdk/issues/4468 Gives instructions on how to enable elastic scaling MVP to parachain teams. Still a draft because it depends on further changes we make to the slot-based collator: https://github.com/paritytech/polkadot-sdk/pull/4097 Parachains cannot use this yet because the collator was not released and no relay chain network has been configured for elastic scaling yet --- Cargo.lock | 1 + cumulus/polkadot-parachain/Cargo.toml | 1 + cumulus/polkadot-parachain/src/service.rs | 71 ++++++--- .../src/guides/enable_elastic_scaling_mvp.rs | 142 ++++++++++++++++++ docs/sdk/src/guides/mod.rs | 3 + prdoc/pr_4663.prdoc | 14 ++ 6 files changed, 215 insertions(+), 17 deletions(-) create mode 100644 docs/sdk/src/guides/enable_elastic_scaling_mvp.rs create mode 100644 prdoc/pr_4663.prdoc diff --git a/Cargo.lock b/Cargo.lock index 3866a74b3f2..ad75224fefd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13766,6 +13766,7 @@ dependencies = [ "cumulus-primitives-aura", "cumulus-primitives-core", "cumulus-relay-chain-interface", + "docify", "frame-benchmarking", "frame-benchmarking-cli", "frame-support", diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 7085211dad2..b20d2a28fa7 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -24,6 +24,7 @@ hex-literal = { workspace = true, default-features = true } log = { workspace = true, default-features = true } serde = { features = ["derive"], workspace = true, default-features = true } serde_json = { workspace = true, default-features = true } +docify = { workspace = true } # Local rococo-parachain-runtime = { workspace = true } diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index f5f6189d1f0..6a6cf15635e 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -15,13 +15,16 @@ // along with Cumulus. If not, see . use cumulus_client_cli::{CollatorOptions, ExportGenesisHeadCommand}; -use cumulus_client_collator::service::CollatorService; -use cumulus_client_consensus_aura::collators::{ - lookahead::{self as aura, Params as AuraParams}, - slot_based::{self as slot_based, Params as SlotBasedParams}, +use cumulus_client_collator::service::{ + CollatorService, ServiceInterface as CollatorServiceInterface, +}; +use cumulus_client_consensus_aura::collators::lookahead::{self as aura, Params as AuraParams}; +#[docify::export(slot_based_colator_import)] +use cumulus_client_consensus_aura::collators::slot_based::{ + self as slot_based, Params as SlotBasedParams, }; use cumulus_client_consensus_common::ParachainBlockImport as TParachainBlockImport; -use cumulus_client_consensus_proposer::Proposer; +use cumulus_client_consensus_proposer::{Proposer, ProposerInterface}; use cumulus_client_consensus_relay_chain::Verifier as RelayChainVerifier; #[allow(deprecated)] use cumulus_client_service::old_consensus; @@ -62,6 +65,7 @@ use sc_sysinfo::HwBench; use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; use sc_transaction_pool::FullPool; use sp_api::ProvideRuntimeApi; +use sp_inherents::CreateInherentDataProviders; use sp_keystore::KeystorePtr; use sp_runtime::{app_crypto::AppCrypto, traits::Header as HeaderT}; use std::{marker::PhantomData, pin::Pin, sync::Arc, time::Duration}; @@ -623,6 +627,48 @@ pub(crate) struct StartSlotBasedAuraConsensus( PhantomData<(RuntimeApi, AuraId)>, ); +impl StartSlotBasedAuraConsensus +where + RuntimeApi: ConstructNodeRuntimeApi>, + RuntimeApi::RuntimeApi: AuraRuntimeApi, + AuraId: AuraIdT + Sync, +{ + #[docify::export_content] + fn launch_slot_based_collator( + params: SlotBasedParams< + ParachainBlockImport, + CIDP, + ParachainClient, + ParachainBackend, + Arc, + CHP, + Proposer, + CS, + >, + task_manager: &TaskManager, + ) where + CIDP: CreateInherentDataProviders + 'static, + CIDP::InherentDataProviders: Send, + CHP: cumulus_client_consensus_common::ValidationCodeHashProvider + Send + 'static, + Proposer: ProposerInterface + Send + Sync + 'static, + CS: CollatorServiceInterface + Send + Sync + Clone + 'static, + { + let (collation_future, block_builder_future) = + slot_based::run::::Pair, _, _, _, _, _, _, _, _>(params); + + task_manager.spawn_essential_handle().spawn( + "collation-task", + Some("parachain-block-authoring"), + collation_future, + ); + task_manager.spawn_essential_handle().spawn( + "block-builder-task", + Some("parachain-block-authoring"), + block_builder_future, + ); + } +} + impl StartConsensus for StartSlotBasedAuraConsensus where @@ -683,19 +729,10 @@ where slot_drift: Duration::from_secs(1), }; - let (collation_future, block_builder_future) = - slot_based::run::::Pair, _, _, _, _, _, _, _, _>(params); + // We have a separate function only to be able to use `docify::export` on this piece of + // code. + Self::launch_slot_based_collator(params, task_manager); - task_manager.spawn_essential_handle().spawn( - "collation-task", - Some("parachain-block-authoring"), - collation_future, - ); - task_manager.spawn_essential_handle().spawn( - "block-builder-task", - Some("parachain-block-authoring"), - block_builder_future, - ); Ok(()) } } diff --git a/docs/sdk/src/guides/enable_elastic_scaling_mvp.rs b/docs/sdk/src/guides/enable_elastic_scaling_mvp.rs new file mode 100644 index 00000000000..bc4f36c271f --- /dev/null +++ b/docs/sdk/src/guides/enable_elastic_scaling_mvp.rs @@ -0,0 +1,142 @@ +//! # Enable elastic scaling MVP for a parachain +//! +//!

    +//! +//! ## Quick introduction to elastic scaling +//! +//! [Elastic scaling](https://polkadot.network/blog/elastic-scaling-streamling-growth-on-polkadot) +//! is a feature that will enable parachains to seamlessly scale up/down the number of used cores. +//! This can be desirable in order to increase the compute or storage throughput of a parachain or +//! to lower the latency between a transaction being submitted and it getting built in a parachain +//! block. +//! +//! At present, with Asynchronous Backing enabled, a parachain can only include a block on the relay +//! chain every 6 seconds, irregardless of how many cores the parachain acquires. Elastic scaling +//! builds further on the 10x throughput increase of Async Backing, enabling collators to submit up +//! to 3 parachain blocks per relay chain block, resulting in a further 3x throughput increase. +//! +//! ## Current limitations of the MVP +//! +//! The full implementation of elastic scaling spans across the entire relay/parachain stack and is +//! still [work in progress](https://github.com/paritytech/polkadot-sdk/issues/1829). +//! The MVP is still considered experimental software, so stability is not guaranteed. +//! If you encounter any problems, +//! [please open an issue](https://github.com/paritytech/polkadot-sdk/issues). +//! Below are described the current limitations of the MVP: +//! +//! 1. **Limited core count**. Parachain block authoring is sequential, so the second block will +//! start being built only after the previous block is imported. The current block production is +//! capped at 2 seconds of execution. Therefore, assuming the full 2 seconds are used, a +//! parachain can only utilise at most 3 cores in a relay chain slot of 6 seconds. If the full +//! execution time is not being used, higher core counts can be achieved. +//! 2. **Single collator requirement for consistently scaling beyond a core at full authorship +//! duration of 2 seconds per block.** Using the current implementation with multiple collators +//! adds additional latency to the block production pipeline. Assuming block execution takes +//! about the same as authorship, the additional overhead is equal the duration of the authorship +//! plus the block announcement. Each collator must first import the previous block before +//! authoring a new one, so it is clear that the highest throughput can be achieved using a +//! single collator. Experiments show that the peak performance using more than one collator +//! (measured up to 10 collators) is utilising 2 cores with authorship time of 1.3 seconds per +//! block, which leaves 400ms for networking overhead. This would allow for 2.6 seconds of +//! execution, compared to the 2 seconds async backing enabled. +//! [More experiments](https://github.com/paritytech/polkadot-sdk/issues/4696) are being +//! conducted in this space. +//! 3. **Trusted collator set.** The collator set needs to be trusted until there’s a mitigation +//! that would prevent or deter multiple collators from submitting the same collation to multiple +//! backing groups. A solution is being discussed +//! [here](https://github.com/polkadot-fellows/RFCs/issues/92). +//! 4. **Fixed scaling.** For true elasticity, the parachain must be able to seamlessly acquire or +//! sell coretime as the user demand grows and shrinks over time, in an automated manner. This is +//! currently lacking - a parachain can only scale up or down by “manually” acquiring coretime. +//! This is not in the scope of the relay chain functionality. Parachains can already start +//! implementing such autoscaling, but we aim to provide a framework/examples for developing +//! autoscaling strategies. +//! +//! Another hard limitation that is not envisioned to ever be lifted is that parachains which create +//! forks will generally not be able to utilise the full number of cores they acquire. +//! +//! ## Using elastic scaling MVP +//! +//! ### Prerequisites +//! +//! - Ensure Asynchronous Backing is enabled on the network and you have enabled it on the parachain +//! using [`crate::guides::async_backing_guide`]. +//! - Ensure the `AsyncBackingParams.max_candidate_depth` value is configured to a value that is at +//! least double the maximum targeted parachain velocity. For example, if the parachain will build +//! at most 3 candidates per relay chain block, the `max_candidate_depth` should be at least 6. +//! - Use a trusted single collator for maximum throughput. +//! - Ensure enough coretime is assigned to the parachain. For maximum throughput the upper bound is +//! 3 cores. +//! +//!
    Phase 1 is not needed if using the `polkadot-parachain` binary built +//! from the latest polkadot-sdk release! Simply pass the `--experimental-use-slot-based` parameter +//! to the command line and jump to Phase 2.
    +//! +//! The following steps assume using the cumulus parachain template. +//! +//! ### Phase 1 - (For custom parachain node) Update Parachain Node +//! +//! This assumes you are using +//! [the latest parachain template](https://github.com/paritytech/polkadot-sdk/tree/master/templates/parachain). +//! +//! This phase consists of plugging in the new slot-based collator. +//! +//! 1. In `node/src/service.rs` import the slot based collator instead of the lookahead collator. +#![doc = docify::embed!("../../cumulus/polkadot-parachain/src/service.rs", slot_based_colator_import)] +//! +//! 2. In `start_consensus()` +//! - Remove the `overseer_handle` param (also remove the +//! `OverseerHandle` type import if it’s not used elsewhere). +//! - Rename `AuraParams` to `SlotBasedParams`, remove the `overseer_handle` field and add a +//! `slot_drift` field with a value of `Duration::from_secs(1)`. +//! - Replace the single future returned by `aura::run` with the two futures returned by it and +//! spawn them as separate tasks: +#![doc = docify::embed!("../../cumulus/polkadot-parachain/src/service.rs", launch_slot_based_collator)] +//! +//! 3. In `start_parachain_node()` remove the `overseer_handle` param passed to `start_consensus`. +//! +//! ### Phase 2 - Activate fixed factor scaling in the runtime +//! +//! This phase consists of a couple of changes needed to be made to the parachain’s runtime in order +//! to utilise fixed factor scaling. +//! +//! First of all, you need to decide the upper limit to how many parachain blocks you need to +//! produce per relay chain block (in direct correlation with the number of acquired cores). This +//! should be either 1 (no scaling), 2 or 3. This is called the parachain velocity. +//! +//! If you configure a velocity which is different from the number of assigned cores, the measured +//! velocity in practice will be the minimum of these two. +//! +//! The chosen velocity will also be used to compute: +//! - The slot duration, by dividing the 6000 ms duration of the relay chain slot duration by the +//! velocity. +//! - The unincluded segment capacity, by multiplying the velocity with 2 and adding 1 to +//! it. +//! +//! Let’s assume a desired maximum velocity of 3 parachain blocks per relay chain block. The needed +//! changes would all be done in `runtime/src/lib.rs`: +//! +//! 1. Rename `BLOCK_PROCESSING_VELOCITY` to `MAX_BLOCK_PROCESSING_VELOCITY` and increase it to the +//! desired value. In this example, 3. +//! +//! ```ignore +//! const MAX_BLOCK_PROCESSING_VELOCITY: u32 = 3; +//! ``` +//! +//! 2. Set the `MILLISECS_PER_BLOCK` to the desired value. +//! +//! ```ignore +//! const MILLISECS_PER_BLOCK: u32 = +//! RELAY_CHAIN_SLOT_DURATION_MILLIS / MAX_BLOCK_PROCESSING_VELOCITY; +//! ``` +//! Note: for a parachain which measures time in terms of its own block number, changing block +//! time may cause complications, requiring additional changes. See here more information: +//! [`crate::guides::async_backing_guide#timing-by-block-number`]. +//! +//! 3. Increase the `UNINCLUDED_SEGMENT_CAPACITY` to the desired value. +//! +//! ```ignore +//! const UNINCLUDED_SEGMENT_CAPACITY: u32 = 2 * MAX_BLOCK_PROCESSING_VELOCITY + 1; +//! ``` diff --git a/docs/sdk/src/guides/mod.rs b/docs/sdk/src/guides/mod.rs index 8296ed447e1..9384f4c82ab 100644 --- a/docs/sdk/src/guides/mod.rs +++ b/docs/sdk/src/guides/mod.rs @@ -41,3 +41,6 @@ pub mod async_backing_guide; /// How to enable metadata hash verification in the runtime. pub mod enable_metadata_hash; + +/// How to enable elastic scaling MVP on a parachain. +pub mod enable_elastic_scaling_mvp; diff --git a/prdoc/pr_4663.prdoc b/prdoc/pr_4663.prdoc new file mode 100644 index 00000000000..74b1274828d --- /dev/null +++ b/prdoc/pr_4663.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Add elastic scaling MVP guide + +doc: + - audience: Node Operator + description: | + Adds a guide for parachains that want to use the experimental elastic scaling MVP. + Will be viewable at: https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/guides/enable_elastic_scaling_mvp/index.html + +crates: + - name: polkadot-parachain-bin + bump: none -- GitLab
  • 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⋧{Z|< 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