From a3ed7fc4a681148e6a4f41d0a3b8b3866bfa80ab Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Wed, 18 Oct 2023 12:12:14 +0200 Subject: [PATCH 01/21] Switch Collectives Slash Handler to Use Limited Teleport Assets (#46) * change teleport_assets to limited_teleport_assets * changelog --- CHANGELOG.md | 5 ++++- .../collectives/collectives-polkadot/src/impls.rs | 5 +++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90381d8168..79372a480d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,4 +39,7 @@ Changelog for the runtimes governed by the Polkadot Fellowship. - XCM: Fix issue with RequestUnlock ([paritytech/polkadot#7278](https://github.com/paritytech/polkadot/pull/7278)) - Clear Existing HRMP Channel Request When Force Opening ([paritytech/polkadot#7389](https://github.com/paritytech/polkadot/pull/7389)) - Prune upgrade cooldowns ([paritytech/polkadot#7470](https://github.com/paritytech/polkadot/pull/7470)) -- Assets `destroy_accounts` releases the deposit ([paritytech/substrate#14443](https://github.com/paritytech/substrate/pull/14443)) +- Assets `destroy_accounts` releases the deposit + ([paritytech/substrate#14443](https://github.com/paritytech/substrate/pull/14443)) +- Update Polkadot Collectives to use `limited_teleport_assets` for automatic slash handling, as + `teleport_assets` is deprecated and caused a failing integration test. ([polkadot-fellows/runtimes#46](https://github.com/polkadot-fellows/runtimes/pull/46)) diff --git a/system-parachains/collectives/collectives-polkadot/src/impls.rs b/system-parachains/collectives/collectives-polkadot/src/impls.rs index c970d82cfe..12ea0f5798 100644 --- a/system-parachains/collectives/collectives-polkadot/src/impls.rs +++ b/system-parachains/collectives/collectives-polkadot/src/impls.rs @@ -24,7 +24,7 @@ use pallet_alliance::{ProposalIndex, ProposalProvider}; use parachains_common::impls::NegativeImbalance; use sp_runtime::DispatchError; use sp_std::{cmp::Ordering, marker::PhantomData, prelude::*}; -use xcm::latest::{Fungibility, Junction, Parent}; +use xcm::latest::{Fungibility, Junction, Parent, WeightLimit}; type AccountIdOf = ::AccountId; @@ -63,7 +63,7 @@ where >::resolve_creating(&pallet_acc, amount); - let result = >::teleport_assets( + let result = >::limited_teleport_assets( <::RuntimeOrigin>::signed(pallet_acc.into()), Box::new(Parent.into()), Box::new( @@ -73,6 +73,7 @@ where ), Box::new((Parent, imbalance).into()), 0, + WeightLimit::Unlimited, ); if let Err(err) = result { From b641df58fecd5f478cbaf894896177f422cb529d Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Wed, 18 Oct 2023 12:16:06 +0200 Subject: [PATCH 02/21] upgraded review bot to v2.1.0 (#64) Upgraded to version 2.1.0 which has paritytech/review-bot#94, a change in the logic of the action to overcome some problems with permissions coming from PRs from forks For this, we needed to divide the actions into two files: - A first action that triggers on PRs and reviews and uploads the PR number. - A second action which is triggered under the completion of the first one and runs as the action normally runs (but won't have any problems regarding permissions because it is triggered from the master branch) --- .github/workflows/review-bot.yml | 24 +++++++++++---------- .github/workflows/review-trigger.yml | 31 ++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/review-trigger.yml diff --git a/.github/workflows/review-bot.yml b/.github/workflows/review-bot.yml index 75f7a1d192..b9ffd43f9e 100644 --- a/.github/workflows/review-bot.yml +++ b/.github/workflows/review-bot.yml @@ -1,23 +1,24 @@ -name: Review PR +name: Review Bot + on: - pull_request_target: + workflow_run: + workflows: + - Review-Trigger types: - - opened - - reopened - - synchronize - - review_requested - - review_request_removed - - ready_for_review - pull_request_review: + - completed permissions: contents: read - checks: write jobs: review-approvals: runs-on: ubuntu-latest steps: + - name: Extract content of artifact + id: number + uses: Bullrich/extract-text-from-artifact@v1.0.0 + with: + artifact-name: pr_number - name: Generate token id: team_token uses: tibdex/github-app-token@v1 @@ -25,8 +26,9 @@ jobs: app_id: ${{ secrets.REVIEW_APP_ID }} private_key: ${{ secrets.REVIEW_APP_KEY }} - name: "Evaluates PR reviews and assigns reviewers" - uses: paritytech/review-bot@v2.0.0 + uses: paritytech/review-bot@v2.1.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} team-token: ${{ steps.team_token.outputs.token }} checks-token: ${{ steps.team_token.outputs.token }} + pr-number: ${{ steps.number.outputs.content }} diff --git a/.github/workflows/review-trigger.yml b/.github/workflows/review-trigger.yml new file mode 100644 index 0000000000..40e2918df2 --- /dev/null +++ b/.github/workflows/review-trigger.yml @@ -0,0 +1,31 @@ +name: Review-Trigger + +on: + pull_request_target: + types: + - opened + - reopened + - synchronize + - review_requested + - review_request_removed + - ready_for_review + pull_request_review: + +jobs: + trigger-review-bot: + runs-on: ubuntu-latest + name: trigger review bot + steps: + - name: Get PR number + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + echo "Saving PR number: $PR_NUMBER" + mkdir -p ./pr + echo $PR_NUMBER > ./pr/pr_number + - uses: actions/upload-artifact@v3 + name: Save PR number + with: + name: pr_number + path: pr/ + retention-days: 5 From 1dc04eb954eadf8aadb5d83990b89662dbb5a074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 18 Oct 2023 23:37:55 +0200 Subject: [PATCH 03/21] Improve release process (#63) * Improve release process This pull request introduces the `changelog-processor.py`. A small script for getting some information out of the `CHANGELOG.md` file for improving the release process. The script supports to get the latest version in the `CHANGELOG.md` file, aka the version top of the file. (This could also be `Unreleased`) The other command is for printing if there should be done a release or not. This is decided based on the latest version and if there exists a tag for it. * Use correct syntax * Single quotes.. * Integer? * :facepalm: * This? * AHH * Some last improvements * Update .github/changelog-processor.py Co-authored-by: Oliver Tale-Yazdi * Apply suggestions from code review * Make the arguments mutally exclusive --------- Co-authored-by: Oliver Tale-Yazdi --- .github/changelog-processor.py | 65 ++++++++++++++++++++++++++++++++++ .github/workflows/release.yml | 29 ++++++++++----- CHANGELOG.md | 4 ++- README.md | 11 ++++++ 4 files changed, 100 insertions(+), 9 deletions(-) create mode 100755 .github/changelog-processor.py diff --git a/.github/changelog-processor.py b/.github/changelog-processor.py new file mode 100755 index 0000000000..b005c620d8 --- /dev/null +++ b/.github/changelog-processor.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +import os +import sys +import argparse + +parser = argparse.ArgumentParser(description="Process the CHANGELOG.md") +parser.add_argument( + "changelog", + metavar="CHANGELOG", + help="Path to the CHANGELOG.md file", + default="CHANGELOG.md", + nargs='?' +) + +group = parser.add_mutually_exclusive_group() +group.add_argument( + "--print-latest-version", + dest="print_latest_version", + help="Print the latest version (first in the file) found in the CHANGELOG.md", + action="store_true" +) +group.add_argument( + "--should-release", + dest="should_release", + help="Should a release be made? Prints `1` or `0`.", + action="store_true" +) + +args = parser.parse_args() + +with open(args.changelog, "r") as changelog: + lines = changelog.readlines() + + # Find the latest version + for line in lines: + if not line.startswith("## ["): + continue + + version = line.strip().removeprefix("## [").split("]")[0] + break + + if args.print_latest_version: + print(version, end = "") + sys.exit(0) + elif args.should_release: + if version.lower() == "unreleased": + print("0", end = "") + sys.exit(-1) + elif version.count(".") != 2: + print("0", end = "") + sys.exit(-1) + + stream = os.popen("git tag -l v" + version) + output = stream.read() + + # Empty output means that the tag doesn't exist and that we should release. + if output.strip() == "": + print("1", end = "") + else: + print("0", end = "") + + sys.exit(0) + else: + parser.print_help() diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2b31d3608a..72b361b62e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,21 @@ on: workflow_dispatch: jobs: + collect-release-information: + runs-on: ubuntu-latest + outputs: + should-release: ${{ steps.run.outputs.should-release }} + version: ${{ steps.run.outputs.version }} + steps: + - uses: actions/checkout@v2 + - id: run + run: | + echo "should-release=$(.github/changelog-processor.py CHANGELOG.md --should-release)" >> $GITHUB_OUTPUT + echo "version=$(.github/changelog-processor.py CHANGELOG.md --print-latest-version)" >> $GITHUB_OUTPUT + cat $GITHUB_OUTPUT runtime-matrix: + needs: [ collect-release-information ] + if: needs.collect-release-information.outputs.should-release == '1' runs-on: ubuntu-latest outputs: runtime: ${{ steps.runtime.outputs.runtime }} @@ -66,9 +80,9 @@ jobs: path: | ${{ steps.srtool_build.outputs.wasm_compressed }} - publish-draft-release: + publish-release: runs-on: ubuntu-latest - needs: [ build-runtimes ] + needs: [ build-runtimes, collect-release-information ] outputs: release_url: ${{ steps.create-release.outputs.html_url }} asset_upload_url: ${{ steps.create-release.outputs.upload_url }} @@ -92,7 +106,6 @@ jobs: SRTOOL() { <$(<<<$CONTEXT head -n1) jq -r .$1; } WASM() { <${JSON} jq -r ".runtimes.compressed.subwasm.$1"; } tee -a DRAFT <<-EOF - ## Changelog EOF tee -a DRAFT Date: Sat, 21 Oct 2023 23:31:09 +0100 Subject: [PATCH 04/21] Update Polkadot ideal staking rate (#26) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update Polkadot inflation * fmr * add test to dispatch all proposals * Update relay/polkadot/src/lib.rs Co-authored-by: Gonçalo Pestana * Bump spec versions * Update changelog and make it release * Bump Kusama `transaction_version` The new society is at the same index as the old one, but has different `calls`. * Update `xcm-builder` * Update relay/polkadot/src/lib.rs Co-authored-by: Oliver Tale-Yazdi * Be optimistic!! * Upgrade staging xcm to get the fix for the metadata * Add a test * Adds custom paras scheduler migration This is a backport from polkadot-sdk master that includes some fixes. * Also copy the migration over to Kusama * Update CHANGELOG --------- Co-authored-by: Gonçalo Pestana Co-authored-by: Bastian Köcher Co-authored-by: Bastian Köcher Co-authored-by: Oliver Tale-Yazdi --- CHANGELOG.md | 3 +- Cargo.lock | 17 +- relay/kusama/Cargo.toml | 4 +- relay/kusama/src/lib.rs | 8 +- relay/kusama/src/paras_scheduler_migration.rs | 218 ++++++++++++++++++ relay/polkadot/Cargo.toml | 6 +- relay/polkadot/src/lib.rs | 144 ++++++++++-- .../polkadot/src/paras_scheduler_migration.rs | 218 ++++++++++++++++++ .../asset-hubs/asset-hub-kusama/Cargo.toml | 4 +- .../asset-hubs/asset-hub-kusama/src/lib.rs | 4 +- .../asset-hubs/asset-hub-polkadot/Cargo.toml | 4 +- .../asset-hubs/asset-hub-polkadot/src/lib.rs | 2 +- .../bridge-hubs/bridge-hub-kusama/Cargo.toml | 4 +- .../bridge-hubs/bridge-hub-kusama/src/lib.rs | 2 +- .../bridge-hub-polkadot/Cargo.toml | 4 +- .../bridge-hub-polkadot/src/lib.rs | 2 +- .../collectives-polkadot/Cargo.toml | 4 +- .../collectives-polkadot/src/lib.rs | 2 +- .../gluttons/glutton-kusama/Cargo.toml | 4 +- .../gluttons/glutton-kusama/src/lib.rs | 2 +- 20 files changed, 604 insertions(+), 52 deletions(-) create mode 100644 relay/kusama/src/paras_scheduler_migration.rs create mode 100644 relay/polkadot/src/paras_scheduler_migration.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index cbc6143dc8..bcfa459650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,11 @@ Changelog for the runtimes governed by the Polkadot Fellowship. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -## [Unreleased] +## [1.0.0] 22.10.2023 ### Changed +- Update Polkadot ideal staking rate ([polkadot-fellows/runtimes#26](https://github.com/polkadot-fellows/runtimes/pull/26)) - Treasury deprecate `propose_spend` dispatchable ([paritytech/substrate#14538](https://github.com/paritytech/substrate/pull/14538)) - Use benchmarked weights for `XCM` ([paritytech/polkadot#7077](https://github.com/paritytech/polkadot/pull/7077)) - Put HRMP Channel Management on General Admin Track ([paritytech/polkadot#7477](https://github.com/paritytech/polkadot/pull/7477)) diff --git a/Cargo.lock b/Cargo.lock index 9ce4f24cb9..c9865981cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7865,6 +7865,7 @@ dependencies = [ "pallet-session-benchmarking", "pallet-staking", "pallet-staking-reward-curve", + "pallet-staking-reward-fn", "pallet-staking-runtime-api", "pallet-timestamp", "pallet-tips", @@ -9789,9 +9790,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" dependencies = [ "bitvec", "cfg-if", @@ -9803,9 +9804,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11236,9 +11237,9 @@ dependencies = [ [[package]] name = "staging-xcm" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1712d3ab65f9f09c2f7c281106d45589182e71950279b98db83ce89125067d26" +checksum = "eec456fd5fcbc4dffe9c6042b452c1930eb1d5af5534d6ef36b8238b4517c9b7" dependencies = [ "bounded-collections", "derivative", @@ -11254,9 +11255,9 @@ dependencies = [ [[package]] name = "staging-xcm-builder" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd00b720a97ad1304684c07eea14fb3615dd2e26569d29876e9b40ff9c334eca" +checksum = "07c1ca6d8f2b7fcbfe8866c1a1cb8105b62c72a74e727dd8c9943e8ac0c410eb" dependencies = [ "frame-support", "frame-system", diff --git a/relay/kusama/Cargo.toml b/relay/kusama/Cargo.toml index 76eb17ea5e..7911a54974 100644 --- a/relay/kusama/Cargo.toml +++ b/relay/kusama/Cargo.toml @@ -109,9 +109,9 @@ runtime-common = { package = "polkadot-runtime-common", default-features = false runtime-parachains = { package = "polkadot-runtime-parachains", default-features = false , version = "2.0.0" } primitives = { package = "polkadot-primitives", default-features = false , version = "2.0.0" } -xcm = { package = "staging-xcm", default-features = false , version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false , version = "2.0.1" } xcm-executor = { package = "staging-xcm-executor", default-features = false , version = "2.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "2.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "2.0.1" } [dev-dependencies] tiny-keccak = { version = "2.0.2", features = ["keccak"] } diff --git a/relay/kusama/src/lib.rs b/relay/kusama/src/lib.rs index 659a7052d2..8900d60d0b 100644 --- a/relay/kusama/src/lib.rs +++ b/relay/kusama/src/lib.rs @@ -109,6 +109,8 @@ mod weights; // Voter bag threshold definitions. mod bag_thresholds; +mod paras_scheduler_migration; + // Historical information of society finances. mod past_payouts; @@ -137,10 +139,10 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 9430, + spec_version: 1_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 23, + transaction_version: 24, state_version: 1, }; @@ -1734,7 +1736,7 @@ pub mod migrations { >, pallet_im_online::migration::v1::Migration, parachains_configuration::migration::v7::MigrateToV7, - parachains_scheduler::migration::v1::MigrateToV1, + paras_scheduler_migration::v1::MigrateToV1, parachains_configuration::migration::v8::MigrateToV8, // Unlock/unreserve balances from Gov v1 pallets that hold them diff --git a/relay/kusama/src/paras_scheduler_migration.rs b/relay/kusama/src/paras_scheduler_migration.rs new file mode 100644 index 0000000000..d294861843 --- /dev/null +++ b/relay/kusama/src/paras_scheduler_migration.rs @@ -0,0 +1,218 @@ +//! A copy of the migration found in the polkadot sdk repo. +//! +//! It is copied as the version of the migration found in the crate used by this runtime is broken. + +use frame_support::{ + migrations::VersionedMigration, pallet_prelude::ValueQuery, storage_alias, + traits::OnRuntimeUpgrade, weights::Weight, +}; +use frame_system::pallet_prelude::BlockNumberFor; +use parity_scale_codec::{Decode, Encode}; +use primitives::{ + v5::{Assignment, ParasEntry}, + CoreIndex, CoreOccupied, GroupIndex, Id as ParaId, +}; +use runtime_parachains::scheduler::*; +use scale_info::TypeInfo; +use sp_core::{Get, RuntimeDebug}; +use sp_std::{ + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + prelude::*, +}; + +const LOG_TARGET: &str = "runtime::parachains::scheduler"; + +mod v0 { + use super::*; + + use primitives::{CollatorId, Id}; + + #[storage_alias] + pub(super) type Scheduled = StorageValue, Vec, ValueQuery>; + + #[derive(Clone, Encode, Decode)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub struct ParathreadClaim(pub Id, pub CollatorId); + + #[derive(Clone, Encode, Decode)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub struct ParathreadEntry { + /// The claim. + pub claim: ParathreadClaim, + /// Number of retries. + pub retries: u32, + } + + /// What is occupying a specific availability core. + #[derive(Clone, Encode, Decode)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub enum CoreOccupied { + /// A parathread. + Parathread(ParathreadEntry), + /// A parachain. + Parachain, + } + + /// The actual type isn't important, as we only delete the key in the state. + #[storage_alias] + pub(crate) type AvailabilityCores = + StorageValue, Vec>, ValueQuery>; + + /// The actual type isn't important, as we only delete the key in the state. + #[storage_alias] + pub(super) type ParathreadQueue = StorageValue, (), ValueQuery>; + + #[storage_alias] + pub(super) type ParathreadClaimIndex = StorageValue, (), ValueQuery>; + + /// The assignment type. + #[derive(Clone, Encode, Decode, TypeInfo, RuntimeDebug)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub enum AssignmentKind { + /// A parachain. + Parachain, + /// A parathread. + Parathread(CollatorId, u32), + } + + /// How a free core is scheduled to be assigned. + #[derive(Clone, Encode, Decode, TypeInfo, RuntimeDebug)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub struct CoreAssignment { + /// The core that is assigned. + pub core: CoreIndex, + /// The unique ID of the para that is assigned to the core. + pub para_id: ParaId, + /// The kind of the assignment. + pub kind: AssignmentKind, + /// The index of the validator group assigned to the core. + pub group_idx: GroupIndex, + } +} + +pub mod v1 { + use super::*; + + #[storage_alias] + pub(crate) type AvailabilityCores = + StorageValue, Vec>>, ValueQuery>; + + #[storage_alias] + pub(crate) type ClaimQueue = StorageValue< + Pallet, + BTreeMap>>>>, + ValueQuery, + >; + + #[allow(deprecated)] + pub type MigrateToV1 = VersionedMigration< + 0, + 1, + UncheckedMigrateToV1, + Pallet, + ::DbWeight, + >; + + #[deprecated(note = "Use MigrateToV1 instead")] + pub struct UncheckedMigrateToV1(sp_std::marker::PhantomData); + #[allow(deprecated)] + impl OnRuntimeUpgrade for UncheckedMigrateToV1 { + fn on_runtime_upgrade() -> Weight { + let weight_consumed = migrate_to_v1::(); + + log::info!(target: LOG_TARGET, "Migrating para scheduler storage to v1"); + + weight_consumed + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::DispatchError> { + let n: u32 = v0::Scheduled::::get().len() as u32 + + v0::AvailabilityCores::::get().iter().filter(|c| c.is_some()).count() as u32; + + log::info!( + target: LOG_TARGET, + "Number of scheduled and waiting for availability before: {n}", + ); + + Ok(n.encode()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), sp_runtime::DispatchError> { + log::info!(target: LOG_TARGET, "Running post_upgrade()"); + + frame_support::ensure!( + v0::Scheduled::::get().is_empty(), + "Scheduled should be empty after the migration" + ); + + let expected_len = u32::decode(&mut &state[..]).unwrap(); + let availability_cores_waiting = AvailabilityCores::::get() + .iter() + .filter(|c| !matches!(c, CoreOccupied::Free)) + .count(); + + frame_support::ensure!( + ClaimQueue::::get().iter().map(|la_vec| la_vec.1.len()).sum::() as u32 + + availability_cores_waiting as u32 == + expected_len, + "ClaimQueue and AvailabilityCores should have the correct length", + ); + + Ok(()) + } + } +} + +pub fn migrate_to_v1() -> Weight { + let mut weight: Weight = Weight::zero(); + + v0::ParathreadQueue::::kill(); + v0::ParathreadClaimIndex::::kill(); + + let now = >::block_number(); + let scheduled = v0::Scheduled::::take(); + let sched_len = scheduled.len() as u64; + for core_assignment in scheduled { + let core_idx = core_assignment.core; + let assignment = Assignment::new(core_assignment.para_id); + let pe = ParasEntry::new(assignment, now); + + v1::ClaimQueue::::mutate(|la| { + la.entry(core_idx).or_default().push_back(Some(pe)); + }); + } + + let parachains = runtime_parachains::paras::Pallet::::parachains(); + let availability_cores = v0::AvailabilityCores::::take(); + let mut new_availability_cores = Vec::new(); + + for (core_index, core) in availability_cores.into_iter().enumerate() { + let new_core = if let Some(core) = core { + match core { + v0::CoreOccupied::Parachain => CoreOccupied::Paras(ParasEntry::new( + Assignment::new(parachains[core_index]), + now, + )), + v0::CoreOccupied::Parathread(entry) => + CoreOccupied::Paras(ParasEntry::new(Assignment::new(entry.claim.0), now)), + } + } else { + CoreOccupied::Free + }; + + new_availability_cores.push(new_core); + } + + v1::AvailabilityCores::::set(new_availability_cores); + + // 2x as once for Scheduled and once for Claimqueue + weight = weight.saturating_add(T::DbWeight::get().reads_writes(2 * sched_len, 2 * sched_len)); + // reading parachains + availability_cores, writing AvailabilityCores + weight = weight.saturating_add(T::DbWeight::get().reads_writes(2, 1)); + // 2x kill + weight = weight.saturating_add(T::DbWeight::get().writes(2)); + + weight +} diff --git a/relay/polkadot/Cargo.toml b/relay/polkadot/Cargo.toml index f8e7ded089..3c72f30e09 100644 --- a/relay/polkadot/Cargo.toml +++ b/relay/polkadot/Cargo.toml @@ -71,6 +71,7 @@ pallet-scheduler = { default-features = false , version = "24.0.0" } pallet-session = { default-features = false , version = "23.0.0" } frame-support = { default-features = false , version = "23.0.0" } pallet-staking = { default-features = false , version = "23.0.0" } +pallet-staking-reward-fn = { default-features = false, version = "14.0.0" } pallet-staking-reward-curve = { version = "8.0.0" } pallet-staking-runtime-api = { default-features = false , version = "9.0.0" } frame-system = { default-features = false , version = "23.0.0" } @@ -99,9 +100,9 @@ runtime-common = { package = "polkadot-runtime-common", default-features = false runtime-parachains = { package = "polkadot-runtime-parachains", default-features = false , version = "2.0.0" } primitives = { package = "polkadot-primitives", default-features = false , version = "2.0.0" } -xcm = { package = "staging-xcm", default-features = false , version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false , version = "2.0.1" } xcm-executor = { package = "staging-xcm-executor", default-features = false , version = "2.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "2.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "2.0.1" } [dev-dependencies] hex-literal = "0.4.1" @@ -171,6 +172,7 @@ std = [ "pallet-session-benchmarking?/std", "pallet-session/std", "pallet-staking-runtime-api/std", + "pallet-staking-reward-fn/std", "pallet-staking/std", "pallet-timestamp/std", "pallet-tips/std", diff --git a/relay/polkadot/src/lib.rs b/relay/polkadot/src/lib.rs index 45ea561b33..97ceedb0cd 100644 --- a/relay/polkadot/src/lib.rs +++ b/relay/polkadot/src/lib.rs @@ -106,6 +106,8 @@ mod weights; mod bag_thresholds; +mod paras_scheduler_migration; + // Governance configurations. pub mod governance; use governance::{ @@ -115,6 +117,8 @@ use governance::{ pub mod xcm_config; +pub const LOG_TARGET: &'static str = "runtime::polkadot"; + impl_runtime_weights!(polkadot_runtime_constants); // Make the WASM binary available. @@ -128,7 +132,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 9430, + spec_version: 1_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 24, @@ -537,6 +541,54 @@ parameter_types! { pub const MaxNominations: u32 = ::LIMIT as u32; } +/// Custom version of `runtime_commong::era_payout` somewhat tailored for Polkadot's crowdloan +/// unlock history. The only tweak should be +/// +/// ```diff +/// - let auction_proportion = Perquintill::from_rational(auctioned_slots.min(60), 200u64); +/// + let auction_proportion = Perquintill::from_rational(auctioned_slots.min(60), 300u64); +/// ``` +/// +/// See . +fn polkadot_era_payout( + total_staked: Balance, + total_stakable: Balance, + max_annual_inflation: Perquintill, + period_fraction: Perquintill, + auctioned_slots: u64, +) -> (Balance, Balance) { + use pallet_staking_reward_fn::compute_inflation; + use sp_runtime::traits::Saturating; + + let min_annual_inflation = Perquintill::from_rational(25u64, 1000u64); + let delta_annual_inflation = max_annual_inflation.saturating_sub(min_annual_inflation); + + // 20% reserved for up to 60 slots. + let auction_proportion = Perquintill::from_rational(auctioned_slots.min(60), 300u64); + + // Therefore the ideal amount at stake (as a percentage of total issuance) is 75% less the + // amount that we expect to be taken up with auctions. + let ideal_stake = Perquintill::from_percent(75).saturating_sub(auction_proportion); + + let stake = Perquintill::from_rational(total_staked, total_stakable); + let falloff = Perquintill::from_percent(5); + let adjustment = compute_inflation(stake, ideal_stake, falloff); + let staking_inflation = + min_annual_inflation.saturating_add(delta_annual_inflation * adjustment); + + let max_payout = period_fraction * max_annual_inflation * total_stakable; + let staking_payout = (period_fraction * staking_inflation) * total_stakable; + let rest = max_payout.saturating_sub(staking_payout); + + let other_issuance = total_stakable.saturating_sub(total_staked); + if total_staked > other_issuance { + let _cap_rest = Perquintill::from_rational(other_issuance, total_staked) * staking_payout; + // We don't do anything with this, but if we wanted to, we could introduce a cap on the + // treasury amount with: `rest = rest.min(cap_rest);` + } + (staking_payout, rest) +} + pub struct EraPayout; impl pallet_staking::EraPayout for EraPayout { fn era_payout( @@ -555,7 +607,7 @@ impl pallet_staking::EraPayout for EraPayout { const MAX_ANNUAL_INFLATION: Perquintill = Perquintill::from_percent(10); const MILLISECONDS_PER_YEAR: u64 = 1000 * 3600 * 24 * 36525 / 100; - runtime_common::impls::era_payout( + polkadot_era_payout( total_staked, total_issuance, MAX_ANNUAL_INFLATION, @@ -795,7 +847,7 @@ where ); let raw_payload = SignedPayload::new(call, extra) .map_err(|e| { - log::warn!("Unable to create signed payload: {:?}", e); + log::warn!(target: LOG_TARGET, "Unable to create signed payload: {:?}", e); }) .ok()?; let signature = raw_payload.using_encoded(|payload| C::sign(payload, public))?; @@ -1311,10 +1363,10 @@ impl frame_support::traits::OnRuntimeUpgrade for InitiateNominationPools { pallet_nomination_pools::MaxPoolMembersPerPool::::put(0); pallet_nomination_pools::MaxPoolMembers::::put(0); - log::info!(target: "runtime::polkadot", "pools config initiated 🎉"); + log::info!(target: LOG_TARGET, "pools config initiated 🎉"); ::DbWeight::get().reads_writes(1, 5) } else { - log::info!(target: "runtime::polkadot", "pools config already initiated 😏"); + log::info!(target: LOG_TARGET, "pools config already initiated 😏"); ::DbWeight::get().reads(1) } } @@ -1521,7 +1573,7 @@ pub mod migrations { pub type Unreleased = ( pallet_im_online::migration::v1::Migration, parachains_configuration::migration::v7::MigrateToV7, - parachains_scheduler::migration::v1::MigrateToV1, + crate::paras_scheduler_migration::v1::MigrateToV1, parachains_configuration::migration::v8::MigrateToV8, // Gov v1 storage migrations @@ -2045,7 +2097,7 @@ sp_api::impl_runtime_apis! { #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - log::info!("try-runtime::on_runtime_upgrade polkadot."); + log::info!(target: LOG_TARGET, "try-runtime::on_runtime_upgrade polkadot."); let weight = Executive::try_runtime_upgrade(checks).unwrap(); (weight, BlockWeights::get().max_block) } @@ -2408,6 +2460,7 @@ mod multiplier_tests { use super::*; use frame_support::{dispatch::DispatchInfo, traits::OnFinalize}; use runtime_common::{MinimumMultiplier, TargetBlockFullness}; + use scale_info::TypeInfo; use separator::Separatable; use sp_runtime::traits::Convert; @@ -2530,6 +2583,13 @@ mod multiplier_tests { blocks += 1; } } + + #[test] + fn ensure_xcm_metadata_is_correct() { + let path = xcm::VersionedXcm::<()>::type_info().path; + // Ensure that the name doesn't include `staging` (from the pallet name) + assert_eq!(vec!["xcm", "VersionedXcm"], path.segments); + } } #[cfg(all(test, feature = "try-runtime"))] @@ -2537,21 +2597,15 @@ mod remote_tests { use super::*; use frame_try_runtime::{runtime_decl_for_try_runtime::TryRuntime, UpgradeCheckSelect}; use remote_externalities::{ - Builder, Mode, OfflineConfig, OnlineConfig, SnapshotConfig, Transport, + Builder, Mode, OfflineConfig, OnlineConfig, RemoteExternalities, SnapshotConfig, Transport, }; use std::env::var; - #[tokio::test] - async fn run_migrations() { - if var("RUN_MIGRATION_TESTS").is_err() { - return - } - - sp_tracing::try_init_simple(); + async fn remote_ext_test_setup() -> RemoteExternalities { let transport: Transport = var("WS").unwrap_or("wss://rpc.polkadot.io:443".to_string()).into(); let maybe_state_snapshot: Option = var("SNAP").map(|s| s.into()).ok(); - let mut ext = Builder::::default() + Builder::::default() .mode(if let Some(state_snapshot) = maybe_state_snapshot { Mode::OfflineOrElseOnline( OfflineConfig { state_snapshot: state_snapshot.clone() }, @@ -2566,7 +2620,63 @@ mod remote_tests { }) .build() .await - .unwrap(); + .unwrap() + } + + #[tokio::test] + async fn dispatch_all_proposals() { + if var("RUN_OPENGOV_TEST").is_err() { + return + } + + sp_tracing::try_init_simple(); + let mut ext = remote_ext_test_setup().await; + ext.execute_with(|| { + type Ref = pallet_referenda::ReferendumInfoOf; + type RefStatus = pallet_referenda::ReferendumStatusOf; + use sp_runtime::traits::Dispatchable; + let all_refs: Vec<(u32, RefStatus)> = + pallet_referenda::ReferendumInfoFor::::iter() + .filter_map(|(idx, reff): (_, Ref)| { + if let Ref::Ongoing(ref_status) = reff { + Some((idx, ref_status)) + } else { + None + } + }) + .collect::>(); + + for (ref_index, referenda) in all_refs { + log::info!(target: LOG_TARGET, "🚀 executing referenda #{}", ref_index); + let RefStatus { origin, proposal, .. } = referenda; + // we do more or less what the scheduler will do under the hood, as best as we can + // imitate: + let (call, _len) = match < + ::Preimages + as + frame_support::traits::QueryPreimage + >::peek(&proposal) { + Ok(x) => x, + Err(e) => { + log::error!(target: LOG_TARGET, "failed to get preimage: {:?}", e); + continue; + } + }; + + let dispatch_result = call.dispatch(origin.clone().into()); + log::info!(target: LOG_TARGET, "outcome of dispatch with origin {:?}: {:?}", origin, dispatch_result); + } + }); + } + + #[tokio::test] + async fn run_migrations() { + if var("RUN_MIGRATION_TESTS").is_err() { + return + } + + sp_tracing::try_init_simple(); + let mut ext = remote_ext_test_setup().await; ext.execute_with(|| Runtime::on_runtime_upgrade(UpgradeCheckSelect::PreAndPost)); } diff --git a/relay/polkadot/src/paras_scheduler_migration.rs b/relay/polkadot/src/paras_scheduler_migration.rs new file mode 100644 index 0000000000..d294861843 --- /dev/null +++ b/relay/polkadot/src/paras_scheduler_migration.rs @@ -0,0 +1,218 @@ +//! A copy of the migration found in the polkadot sdk repo. +//! +//! It is copied as the version of the migration found in the crate used by this runtime is broken. + +use frame_support::{ + migrations::VersionedMigration, pallet_prelude::ValueQuery, storage_alias, + traits::OnRuntimeUpgrade, weights::Weight, +}; +use frame_system::pallet_prelude::BlockNumberFor; +use parity_scale_codec::{Decode, Encode}; +use primitives::{ + v5::{Assignment, ParasEntry}, + CoreIndex, CoreOccupied, GroupIndex, Id as ParaId, +}; +use runtime_parachains::scheduler::*; +use scale_info::TypeInfo; +use sp_core::{Get, RuntimeDebug}; +use sp_std::{ + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + prelude::*, +}; + +const LOG_TARGET: &str = "runtime::parachains::scheduler"; + +mod v0 { + use super::*; + + use primitives::{CollatorId, Id}; + + #[storage_alias] + pub(super) type Scheduled = StorageValue, Vec, ValueQuery>; + + #[derive(Clone, Encode, Decode)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub struct ParathreadClaim(pub Id, pub CollatorId); + + #[derive(Clone, Encode, Decode)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub struct ParathreadEntry { + /// The claim. + pub claim: ParathreadClaim, + /// Number of retries. + pub retries: u32, + } + + /// What is occupying a specific availability core. + #[derive(Clone, Encode, Decode)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub enum CoreOccupied { + /// A parathread. + Parathread(ParathreadEntry), + /// A parachain. + Parachain, + } + + /// The actual type isn't important, as we only delete the key in the state. + #[storage_alias] + pub(crate) type AvailabilityCores = + StorageValue, Vec>, ValueQuery>; + + /// The actual type isn't important, as we only delete the key in the state. + #[storage_alias] + pub(super) type ParathreadQueue = StorageValue, (), ValueQuery>; + + #[storage_alias] + pub(super) type ParathreadClaimIndex = StorageValue, (), ValueQuery>; + + /// The assignment type. + #[derive(Clone, Encode, Decode, TypeInfo, RuntimeDebug)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub enum AssignmentKind { + /// A parachain. + Parachain, + /// A parathread. + Parathread(CollatorId, u32), + } + + /// How a free core is scheduled to be assigned. + #[derive(Clone, Encode, Decode, TypeInfo, RuntimeDebug)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub struct CoreAssignment { + /// The core that is assigned. + pub core: CoreIndex, + /// The unique ID of the para that is assigned to the core. + pub para_id: ParaId, + /// The kind of the assignment. + pub kind: AssignmentKind, + /// The index of the validator group assigned to the core. + pub group_idx: GroupIndex, + } +} + +pub mod v1 { + use super::*; + + #[storage_alias] + pub(crate) type AvailabilityCores = + StorageValue, Vec>>, ValueQuery>; + + #[storage_alias] + pub(crate) type ClaimQueue = StorageValue< + Pallet, + BTreeMap>>>>, + ValueQuery, + >; + + #[allow(deprecated)] + pub type MigrateToV1 = VersionedMigration< + 0, + 1, + UncheckedMigrateToV1, + Pallet, + ::DbWeight, + >; + + #[deprecated(note = "Use MigrateToV1 instead")] + pub struct UncheckedMigrateToV1(sp_std::marker::PhantomData); + #[allow(deprecated)] + impl OnRuntimeUpgrade for UncheckedMigrateToV1 { + fn on_runtime_upgrade() -> Weight { + let weight_consumed = migrate_to_v1::(); + + log::info!(target: LOG_TARGET, "Migrating para scheduler storage to v1"); + + weight_consumed + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::DispatchError> { + let n: u32 = v0::Scheduled::::get().len() as u32 + + v0::AvailabilityCores::::get().iter().filter(|c| c.is_some()).count() as u32; + + log::info!( + target: LOG_TARGET, + "Number of scheduled and waiting for availability before: {n}", + ); + + Ok(n.encode()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), sp_runtime::DispatchError> { + log::info!(target: LOG_TARGET, "Running post_upgrade()"); + + frame_support::ensure!( + v0::Scheduled::::get().is_empty(), + "Scheduled should be empty after the migration" + ); + + let expected_len = u32::decode(&mut &state[..]).unwrap(); + let availability_cores_waiting = AvailabilityCores::::get() + .iter() + .filter(|c| !matches!(c, CoreOccupied::Free)) + .count(); + + frame_support::ensure!( + ClaimQueue::::get().iter().map(|la_vec| la_vec.1.len()).sum::() as u32 + + availability_cores_waiting as u32 == + expected_len, + "ClaimQueue and AvailabilityCores should have the correct length", + ); + + Ok(()) + } + } +} + +pub fn migrate_to_v1() -> Weight { + let mut weight: Weight = Weight::zero(); + + v0::ParathreadQueue::::kill(); + v0::ParathreadClaimIndex::::kill(); + + let now = >::block_number(); + let scheduled = v0::Scheduled::::take(); + let sched_len = scheduled.len() as u64; + for core_assignment in scheduled { + let core_idx = core_assignment.core; + let assignment = Assignment::new(core_assignment.para_id); + let pe = ParasEntry::new(assignment, now); + + v1::ClaimQueue::::mutate(|la| { + la.entry(core_idx).or_default().push_back(Some(pe)); + }); + } + + let parachains = runtime_parachains::paras::Pallet::::parachains(); + let availability_cores = v0::AvailabilityCores::::take(); + let mut new_availability_cores = Vec::new(); + + for (core_index, core) in availability_cores.into_iter().enumerate() { + let new_core = if let Some(core) = core { + match core { + v0::CoreOccupied::Parachain => CoreOccupied::Paras(ParasEntry::new( + Assignment::new(parachains[core_index]), + now, + )), + v0::CoreOccupied::Parathread(entry) => + CoreOccupied::Paras(ParasEntry::new(Assignment::new(entry.claim.0), now)), + } + } else { + CoreOccupied::Free + }; + + new_availability_cores.push(new_core); + } + + v1::AvailabilityCores::::set(new_availability_cores); + + // 2x as once for Scheduled and once for Claimqueue + weight = weight.saturating_add(T::DbWeight::get().reads_writes(2 * sched_len, 2 * sched_len)); + // reading parachains + availability_cores, writing AvailabilityCores + weight = weight.saturating_add(T::DbWeight::get().reads_writes(2, 1)); + // 2x kill + weight = weight.saturating_add(T::DbWeight::get().writes(2)); + + weight +} diff --git a/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml b/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml index fc0402a46c..13d150bc87 100644 --- a/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml +++ b/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml @@ -64,8 +64,8 @@ pallet-xcm-benchmarks = { default-features = false, optional = true , version = polkadot-core-primitives = { default-features = false, version = "2.0.0" } polkadot-parachain-primitives = { default-features = false, version = "1.0.0" } polkadot-runtime-common = { default-features = false, version = "2.0.0" } -xcm = { package = "staging-xcm", default-features = false, version = "2.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } # Cumulus diff --git a/system-parachains/asset-hubs/asset-hub-kusama/src/lib.rs b/system-parachains/asset-hubs/asset-hub-kusama/src/lib.rs index 12633ce5b9..7d2fafbafa 100644 --- a/system-parachains/asset-hubs/asset-hub-kusama/src/lib.rs +++ b/system-parachains/asset-hubs/asset-hub-kusama/src/lib.rs @@ -111,7 +111,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 10000, + spec_version: 1_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 13, @@ -127,7 +127,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 10000, + spec_version: 1_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 13, diff --git a/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml b/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml index 4898564c6c..973f527540 100644 --- a/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml +++ b/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml @@ -59,8 +59,8 @@ polkadot-core-primitives = { default-features = false, version = "2.0.0" } polkadot-parachain-primitives = { default-features = false, version = "1.0.0" } polkadot-runtime-common = { default-features = false, version = "2.0.0" } polkadot-runtime-constants = { path = "../../../relay/polkadot/constants", default-features = false} -xcm = { package = "staging-xcm", default-features = false, version = "2.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } # Cumulus diff --git a/system-parachains/asset-hubs/asset-hub-polkadot/src/lib.rs b/system-parachains/asset-hubs/asset-hub-polkadot/src/lib.rs index f5117490dd..2498ce7cc4 100644 --- a/system-parachains/asset-hubs/asset-hub-polkadot/src/lib.rs +++ b/system-parachains/asset-hubs/asset-hub-polkadot/src/lib.rs @@ -137,7 +137,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemint"), impl_name: create_runtime_str!("statemint"), authoring_version: 1, - spec_version: 10000, + spec_version: 1_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 13, diff --git a/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml b/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml index 03d82da68c..11225c620b 100644 --- a/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -57,8 +57,8 @@ pallet-xcm-benchmarks = { default-features = false, optional = true , version = polkadot-core-primitives = { default-features = false, version = "2.0.0" } polkadot-parachain-primitives = { default-features = false, version = "1.0.0" } polkadot-runtime-common = { default-features = false, version = "2.0.0" } -xcm = { package = "staging-xcm", default-features = false, version = "2.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } # Cumulus diff --git a/system-parachains/bridge-hubs/bridge-hub-kusama/src/lib.rs b/system-parachains/bridge-hubs/bridge-hub-kusama/src/lib.rs index 7a95e2e6b9..206f306843 100644 --- a/system-parachains/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/system-parachains/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -154,7 +154,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-kusama"), impl_name: create_runtime_str!("bridge-hub-kusama"), authoring_version: 1, - spec_version: 10000, + spec_version: 1_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 3, diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml index 587595bc98..cac2fcc358 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -57,8 +57,8 @@ pallet-xcm-benchmarks = { default-features = false, optional = true , version = polkadot-core-primitives = { default-features = false, version = "2.0.0" } polkadot-parachain-primitives = { default-features = false, version = "1.0.0" } polkadot-runtime-common = { default-features = false, version = "2.0.0" } -xcm = { package = "staging-xcm", default-features = false, version = "2.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } # Cumulus diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs index dbfdc249a3..48d0744ff0 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -129,7 +129,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-polkadot"), impl_name: create_runtime_str!("bridge-hub-polkadot"), authoring_version: 1, - spec_version: 10000, + spec_version: 1_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 2, diff --git a/system-parachains/collectives/collectives-polkadot/Cargo.toml b/system-parachains/collectives/collectives-polkadot/Cargo.toml index f36b68a646..5af3c75bed 100644 --- a/system-parachains/collectives/collectives-polkadot/Cargo.toml +++ b/system-parachains/collectives/collectives-polkadot/Cargo.toml @@ -61,8 +61,8 @@ polkadot-core-primitives = { default-features = false, version = "2.0.0" } polkadot-parachain-primitives = { default-features = false, version = "1.0.0" } polkadot-runtime-common = { default-features = false, version = "2.0.0" } polkadot-runtime-constants = { path = "../../../relay/polkadot/constants", default-features = false} -xcm = { package = "staging-xcm", default-features = false, version = "2.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } # Cumulus diff --git a/system-parachains/collectives/collectives-polkadot/src/lib.rs b/system-parachains/collectives/collectives-polkadot/src/lib.rs index e79a5bb15b..31c6923e85 100644 --- a/system-parachains/collectives/collectives-polkadot/src/lib.rs +++ b/system-parachains/collectives/collectives-polkadot/src/lib.rs @@ -105,7 +105,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("collectives"), impl_name: create_runtime_str!("collectives"), authoring_version: 1, - spec_version: 10000, + spec_version: 1_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/system-parachains/gluttons/glutton-kusama/Cargo.toml b/system-parachains/gluttons/glutton-kusama/Cargo.toml index 9bf6646ea6..c7552d0e2c 100644 --- a/system-parachains/gluttons/glutton-kusama/Cargo.toml +++ b/system-parachains/gluttons/glutton-kusama/Cargo.toml @@ -35,8 +35,8 @@ sp-transaction-pool = { default-features = false, version = "21.0.0" } sp-version = { default-features = false, version = "24.0.0" } # Polkadot -xcm = { package = "staging-xcm", default-features = false, version = "2.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } # Cumulus diff --git a/system-parachains/gluttons/glutton-kusama/src/lib.rs b/system-parachains/gluttons/glutton-kusama/src/lib.rs index dde8f747d4..a6153952de 100644 --- a/system-parachains/gluttons/glutton-kusama/src/lib.rs +++ b/system-parachains/gluttons/glutton-kusama/src/lib.rs @@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("glutton"), impl_name: create_runtime_str!("glutton"), authoring_version: 1, - spec_version: 10000, + spec_version: 1_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From 94b2798b69ba6779764e20a50f056e48db78ebef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 23 Oct 2023 12:08:03 +0200 Subject: [PATCH 05/21] Fixup some release issues edition 2 (#72) * Use correct job name * Rename workflow * Adds missing item to the CHANGELOG * Remove tx version --- .github/workflows/release.yml | 9 ++++----- CHANGELOG.md | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 72b361b62e..d2a2afb641 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Create Draft Release +name: Create Release on: push: @@ -161,14 +161,13 @@ jobs: run: | >>$GITHUB_ENV echo ASSET=$(find ${{ matrix.runtime.name }} -name '*.compact.compressed.wasm') >>$GITHUB_ENV echo SPEC=$(<${JSON} jq -r .runtimes.compact.subwasm.core_version.specVersion) - >>$GITHUB_ENV echo TXVER=$(<${JSON} jq -r .runtimes.compact.subwasm.core_version.transactionVersion) - - name: Upload compressed ${{ matrix.runtime.name }} v${{ env.SPEC }} tx${{ env.TXVER }} wasm + - name: Upload compressed ${{ matrix.runtime.name }} v${{ env.SPEC }} wasm uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: ${{ needs.publish-draft-release.outputs.asset_upload_url }} + upload_url: ${{ needs.publish-release.outputs.asset_upload_url }} asset_path: ${{ env.ASSET }} - asset_name: ${{ matrix.runtime.name }}_runtime-v${{ env.SPEC }}.tx${{ env.TXVER }}.compact.compressed.wasm + asset_name: ${{ matrix.runtime.name }}_runtime-v${{ env.SPEC }}.compact.compressed.wasm asset_content_type: application/wasm diff --git a/CHANGELOG.md b/CHANGELOG.md index bcfa459650..52211be6e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Stabilize Metadata V15 ([paritytech/substrate#14481](https://github.com/paritytech/substrate/pull/14481)) - Add Ability to Add/Remove Invulnerable Collators ([paritytech/cumulus#2596](https://github.com/paritytech/cumulus/pull/2596)) - Polkadot Fellowship promotion/demotion periods, members activity and salaries ([paritytech/cumulus#2607](https://github.com/paritytech/cumulus/pull/2607)) +- Add asset conversion to asset hub Kusama ([paritytech/cumulus#2935](https://github.com/paritytech/cumulus/pull/2935)) ### Fixed From dd7f86f0d50064481ed0b7c0218494a5cfad997e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 30 Oct 2023 10:12:34 +0100 Subject: [PATCH 06/21] Explain approval rights (#42) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This also adds a tutorial on how to add the github name to the on-chain identity. --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: Przemek Rzad Co-authored-by: André Silva --- .github/review-bot.yml | 16 ++++++---------- README.md | 10 ++++++++++ docs/on-chain-identity-process.png | Bin 0 -> 365121 bytes docs/on-chain-identity.md | 15 +++++++++++++++ relay/polkadot/README.adoc | 5 ----- 5 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 docs/on-chain-identity-process.png create mode 100644 docs/on-chain-identity.md delete mode 100644 relay/polkadot/README.adoc diff --git a/.github/review-bot.yml b/.github/review-bot.yml index 230f2d0ca5..7f81f6a3c4 100644 --- a/.github/review-bot.yml +++ b/.github/review-bot.yml @@ -9,12 +9,9 @@ rules: - name: Relay and system files condition: include: - - ^relay\/kusama\/.* - - ^relay\/polkadot\/.* + - ^relay\/.* - ^system-parachains\/.* - - ^CHANGELOG$ - exclude: - - ^relay\/.+\.adoc$ + - ^CHANGELOG.md$ type: fellows minRank: 3 minApprovals: 4 @@ -22,11 +19,10 @@ rules: condition: include: - '.*' - exclude: - - ^relay\/kusama\/.* - - ^relay\/polkadot\/.* - - ^\.github/.* + exclude: + - ^relay\/.* - ^system-parachains\/.* - - ^target\/.* + - ^\.github/.* + - ^CHANGELOG.md$ type: fellows minRank: 2 diff --git a/README.md b/README.md index 8b01afe128..e24a7e40db 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,16 @@ Each leaf folder contains one runtime crate: └── glutton-kusama ``` +## Approval rights + +The approval rights are configured in [`review-bot.yml`](.github/review-bot.yml). The rights are configured as: + +- All files in `.github` require two approvals from Fellowship members of rank 4 or higher. +- `CHANGELOG.md`, `relay/*` or `system-parachains/*` require four approvals from Fellowship members of rank 3 or higher. +- All other files require the approval from one Fellowship member of rank 2 or higher. + +The review-bot uses the on-chain identity to map from a GitHub account to a Fellowship member. This requires that each Fellowship member add their GitHub handle to their on-chain identity. Check [here](docs/on-chain-identity.md) for instructions. + # Working on Pull Requests To merge a pull request, we use [Auto Merge Bot](https://github.com/paritytech/auto-merge-bot). diff --git a/docs/on-chain-identity-process.png b/docs/on-chain-identity-process.png new file mode 100644 index 0000000000000000000000000000000000000000..fb08c7e6c19a73079ab71f850d2f4f22d21e6a4d GIT binary patch literal 365121 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≫c*VdRrR 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
3RsVgTMbo>g-zzrV&@ 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 Extrinsics`. Select your fellowship member account and pick the extrinsic `identity.setIdentity`. Below is an example screenshot of what it should look like including the `github` field. + +![Example extrinsic to set on-chain identity](on-chain-identity-process.png) + +Keep in mind that when filling in the data with `Raw` type only ASCII is accepted, therefore if you need to use UTF-8 characters (e.g. diacritics or emojis), you should convert the data to hex beforehand. For example, my legal name is "André Silva", which I need to submit as `0x416e6472c3a92053696c7661`. You can use [this](https://onlinehextools.com/convert-utf8-to-hex) tool to do the conversion, just disable the options `Add Hex Base` and `Space Between Hex Values`, after the conversion you should prepend the result with a single `0x` and submit as `Raw`. + +After submitting the extrinsic you won't be able to see the `github` field in the polkadot.js UI (custom fields aren't shown). You can confirm that everything was set correctly by checking the state (`Developer > Chain State > identity.identityOf`), or by using a block explorer like [Statescan](https://polkadot.statescan.io) which shows custom fields. + +## Getting a judgment on your identity + +After your identity is properly set you can get a judgment on it from one of the existing registrars. For instructions on how to get a judgment from the W3F registrar check [this](https://registrar.web3.foundation/) page which contains links to instructions. Due to the custom field in your identity the automated verification process won't work and you'll need to join the support channel on matrix to complete the verification. diff --git a/relay/polkadot/README.adoc b/relay/polkadot/README.adoc deleted file mode 100644 index 3337331081..0000000000 --- a/relay/polkadot/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Runtime - -placeholder -//TODO Write content :) (https://github.com/paritytech/polkadot/issues/159) From 5d98c2efcdb61a90e5a325c80b6c5d2b2c1d6625 Mon Sep 17 00:00:00 2001 From: asynchronous rob Date: Tue, 14 Nov 2023 14:45:42 -0600 Subject: [PATCH 07/21] Restore governance lock periods to 7 days in Polkadot (#86) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a revert of https://github.com/paritytech/polkadot/commit/d73503cc2351ffec047a4912ecdb3e1eab5f46aa which has not been released. Deploying without this change would lead to referendum participants and delegates having their tokens locked for 4 times longer than expected. Participants in any referendums ending after the runtime upgrade is applied would be affected. Even more of an issue is delegates, where all current delegates would be affected by 4 times longer lock up issues. The affected user-base is enormous, and there is little to no possibility of reaching all these users to get them to adapt in time. Although a 7 Day lock multiplier wasn't the originally intended target for Polkadot, breaking user expectations with this change is an even larger issue. --------- Co-authored-by: Bastian Köcher Co-authored-by: Bastian Köcher --- CHANGELOG.md | 6 ++++++ relay/polkadot/src/governance/mod.rs | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52211be6e2..918e6c6df7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ Changelog for the runtimes governed by the Polkadot Fellowship. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [1.0.1] 22.10.2023 + +### Changed + +- Restore governance lock periods to 7 days in Polkadot ([polkadot-fellows/runtimes#86](https://github.com/polkadot-fellows/runtimes/pull/86)) + ## [1.0.0] 22.10.2023 ### Changed diff --git a/relay/polkadot/src/governance/mod.rs b/relay/polkadot/src/governance/mod.rs index 79c904622d..39a7188954 100644 --- a/relay/polkadot/src/governance/mod.rs +++ b/relay/polkadot/src/governance/mod.rs @@ -32,7 +32,7 @@ mod tracks; pub use tracks::TracksInfo; parameter_types! { - pub const VoteLockingPeriod: BlockNumber = prod_or_fast!(28 * DAYS, 1); + pub const VoteLockingPeriod: BlockNumber = prod_or_fast!(7 * DAYS, 1); } impl pallet_conviction_voting::Config for Runtime { From 643dfd812b2ab96ee69eea5a467dc3d764bc70f4 Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Thu, 16 Nov 2023 21:06:34 +0100 Subject: [PATCH 08/21] Change Version for 1.0.1 Release (#89) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make runtime version match release version. --------- Co-authored-by: Bastian Köcher --- relay/polkadot/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relay/polkadot/src/lib.rs b/relay/polkadot/src/lib.rs index 97ceedb0cd..d74def520c 100644 --- a/relay/polkadot/src/lib.rs +++ b/relay/polkadot/src/lib.rs @@ -132,7 +132,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 1_000_000, + spec_version: 1_000_001, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 24, From 7652cb6d242ae4a4d0fc98fe988c3efda73216c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 17 Nov 2023 15:28:07 +0100 Subject: [PATCH 09/21] Lower approval requirements (#92) This pull requests lowers the approval requirements until we have a more sophisticated tool. So, that we could do assign a voting power per rank and then require that X amount of voting power. This would then mean that may 3 rank II approvals having the same voting power as rank III. --- .github/review-bot.yml | 8 +-- .github/workflows/review-trigger.yml | 2 +- relay/kusama/Cargo.toml | 2 +- .../constants/src/weights/paritydb_weights.rs | 52 +++++++++---------- .../constants/src/weights/rocksdb_weights.rs | 52 +++++++++---------- 5 files changed, 58 insertions(+), 58 deletions(-) diff --git a/.github/review-bot.yml b/.github/review-bot.yml index 7f81f6a3c4..a1a4c1f059 100644 --- a/.github/review-bot.yml +++ b/.github/review-bot.yml @@ -4,7 +4,7 @@ rules: include: - ^\.github/.* type: fellows - minRank: 4 + minRank: 3 minApprovals: 2 - name: Relay and system files condition: @@ -13,8 +13,8 @@ rules: - ^system-parachains\/.* - ^CHANGELOG.md$ type: fellows - minRank: 3 - minApprovals: 4 + minRank: 2 + minApprovals: 3 - name: General Files condition: include: @@ -25,4 +25,4 @@ rules: - ^\.github/.* - ^CHANGELOG.md$ type: fellows - minRank: 2 + minRank: 1 diff --git a/.github/workflows/review-trigger.yml b/.github/workflows/review-trigger.yml index 40e2918df2..0edbc7c9a9 100644 --- a/.github/workflows/review-trigger.yml +++ b/.github/workflows/review-trigger.yml @@ -1,6 +1,6 @@ name: Review-Trigger -on: +on: pull_request_target: types: - opened diff --git a/relay/kusama/Cargo.toml b/relay/kusama/Cargo.toml index 7911a54974..f6e6fd995a 100644 --- a/relay/kusama/Cargo.toml +++ b/relay/kusama/Cargo.toml @@ -119,7 +119,7 @@ keyring = { package = "sp-keyring", version = "26.0.0" } sp-trie = { version = "24.0.0" } separator = "0.4.1" serde_json = "1.0.96" -remote-externalities = { package = "frame-remote-externalities" , version = "0.30.0" } +remote-externalities = { package = "frame-remote-externalities", version = "0.30.0" } tokio = { version = "1.24.2", features = ["macros"] } sp-tracing = { default-features = false , version = "12.0.0" } diff --git a/relay/polkadot/constants/src/weights/paritydb_weights.rs b/relay/polkadot/constants/src/weights/paritydb_weights.rs index ae7bedc394..f9995399f8 100644 --- a/relay/polkadot/constants/src/weights/paritydb_weights.rs +++ b/relay/polkadot/constants/src/weights/paritydb_weights.rs @@ -44,34 +44,34 @@ pub mod constants { /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights /// are available for brave runtime engineers who may want to try this out as default. pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - /// Time to read one storage item. - /// Calculated by multiplying the *Average* of all values with `1.1` and adding `0`. - /// - /// Stats [NS]: - /// Min, Max: 4_611, 13_478_005 - /// Average: 10_750 - /// Median: 10_655 - /// Std-Dev: 12214.49 - /// - /// Percentiles [NS]: - /// 99th: 14_451 - /// 95th: 12_588 - /// 75th: 11_200 + // Time to read one storage item. + // Calculated by multiplying the *Average* of all values with `1.1` and adding `0`. + // + // Stats [NS]: + // Min, Max: 4_611, 13_478_005 + // Average: 10_750 + // Median: 10_655 + // Std-Dev: 12214.49 + // + // Percentiles [NS]: + // 99th: 14_451 + // 95th: 12_588 + // 75th: 11_200 read: 11_826 * constants::WEIGHT_REF_TIME_PER_NANOS, - /// Time to write one storage item. - /// Calculated by multiplying the *Average* of all values with `1.1` and adding `0`. - /// - /// Stats [NS]: - /// Min, Max: 8_023, 47_367_740 - /// Average: 34_592 - /// Median: 32_703 - /// Std-Dev: 49417.24 - /// - /// Percentiles [NS]: - /// 99th: 69_379 - /// 95th: 47_168 - /// 75th: 35_252 + // Time to write one storage item. + // Calculated by multiplying the *Average* of all values with `1.1` and adding `0`. + // + // Stats [NS]: + // Min, Max: 8_023, 47_367_740 + // Average: 34_592 + // Median: 32_703 + // Std-Dev: 49417.24 + // + // Percentiles [NS]: + // 99th: 69_379 + // 95th: 47_168 + // 75th: 35_252 write: 38_052 * constants::WEIGHT_REF_TIME_PER_NANOS, }; } diff --git a/relay/polkadot/constants/src/weights/rocksdb_weights.rs b/relay/polkadot/constants/src/weights/rocksdb_weights.rs index 029f892b01..c5cf0457b7 100644 --- a/relay/polkadot/constants/src/weights/rocksdb_weights.rs +++ b/relay/polkadot/constants/src/weights/rocksdb_weights.rs @@ -43,34 +43,34 @@ pub mod constants { /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout /// the runtime. pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - /// Time to read one storage item. - /// Calculated by multiplying the *Average* of all values with `1.1` and adding `0`. - /// - /// Stats [NS]: - /// Min, Max: 5_015, 1_441_022 - /// Average: 18_635 - /// Median: 17_795 - /// Std-Dev: 4829.75 - /// - /// Percentiles [NS]: - /// 99th: 32_074 - /// 95th: 26_658 - /// 75th: 19_363 + // Time to read one storage item. + // Calculated by multiplying the *Average* of all values with `1.1` and adding `0`. + // + // Stats [NS]: + // Min, Max: 5_015, 1_441_022 + // Average: 18_635 + // Median: 17_795 + // Std-Dev: 4829.75 + // + // Percentiles [NS]: + // 99th: 32_074 + // 95th: 26_658 + // 75th: 19_363 read: 20_499 * constants::WEIGHT_REF_TIME_PER_NANOS, - /// Time to write one storage item. - /// Calculated by multiplying the *Average* of all values with `1.1` and adding `0`. - /// - /// Stats [NS]: - /// Min, Max: 16_368, 34_500_937 - /// Average: 75_882 - /// Median: 74_236 - /// Std-Dev: 64706.41 - /// - /// Percentiles [NS]: - /// 99th: 111_151 - /// 95th: 92_666 - /// 75th: 80_297 + // Time to write one storage item. + // Calculated by multiplying the *Average* of all values with `1.1` and adding `0`. + // + // Stats [NS]: + // Min, Max: 16_368, 34_500_937 + // Average: 75_882 + // Median: 74_236 + // Std-Dev: 64706.41 + // + // Percentiles [NS]: + // 99th: 111_151 + // 95th: 92_666 + // 75th: 80_297 write: 83_471 * constants::WEIGHT_REF_TIME_PER_NANOS, }; } From 2c6b1bff391c91b92f620eb06887b59f26913fc4 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Fri, 17 Nov 2023 15:52:35 +0100 Subject: [PATCH 10/21] use github app for auto-merge-bot (#94) This changes the credentials for auto-merge-bot With this it stops using a GitHub action but instead it uses a GitHub app, by using a GitHub app, PRs merged by it will trigger GitHub actions. This is to circumvent a security measure set up by GitHub to stop recursive action executions. This supersedes #88 --- .github/workflows/auto-merge.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml index 3cd5079778..f0d46448a8 100644 --- a/.github/workflows/auto-merge.yml +++ b/.github/workflows/auto-merge.yml @@ -5,6 +5,8 @@ on: issue_comment: types: [created] +env: master + jobs: set-auto-merge: runs-on: ubuntu-latest @@ -14,9 +16,15 @@ jobs: - name: Get the GitHub handle of the fellows uses: paritytech/get-fellows-action@v1.0.0 id: fellows + - name: Generate token + id: merge_token + uses: tibdex/github-app-token@v1 + with: + app_id: ${{ secrets.REVIEW_APP_ID }} + private_key: ${{ secrets.REVIEW_APP_KEY }} - name: Set auto merge uses: paritytech/auto-merge-bot@v1.0.0 with: - GITHUB_TOKEN: '${{ github.token }}' + GITHUB_TOKEN: ${{ steps.merge_token.outputs.token }} MERGE_METHOD: "SQUASH" ALLOWLIST: ${{ steps.fellows.outputs.github-handles }} From eb5e3f3af5d720271ddcc273662004d0c39da389 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Mon, 20 Nov 2023 15:18:09 +0100 Subject: [PATCH 11/21] fixed auto-merge-bot (#97) I confused `env` which is used for environment variables for `environment` which is the key word to fetch environment secrets when doing #94. This will fix that mistake. --- .github/workflows/auto-merge.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml index f0d46448a8..66325807b1 100644 --- a/.github/workflows/auto-merge.yml +++ b/.github/workflows/auto-merge.yml @@ -5,11 +5,10 @@ on: issue_comment: types: [created] -env: master - jobs: set-auto-merge: runs-on: ubuntu-latest + environment: master # Important! This forces the job to run only on comments on Pull Requests that starts with '/merge' if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, '/merge') }} steps: From bdcd03911980e4d49e19e6b7f9ce1f3883cfd8c7 Mon Sep 17 00:00:00 2001 From: Muharem Date: Mon, 20 Nov 2023 22:56:22 +0100 Subject: [PATCH 12/21] upgrade to v1.2 (#56) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the PR we bump versions for all dependacy crates from `polkadot-sdk` and apply all required changes Changes: - `parachains_runtime_api_impl` `v5` -> `v7`, - from https://github.com/paritytech/polkadot-sdk/pull/1543; - `Consideration` setup for preimage pallet instances, - from https://github.com/paritytech/polkadot-sdk/pull/1363; - `experimental` feature removed for `pallet-society`, `pallet-xcm`, `runtime-common` crates, - from https://github.com/paritytech/polkadot-sdk/pull/1503; - `pallet_election_provider_multi_phase::Config::SignedDepositBase` set to `GeometricDepositBase`, - from https://github.com/paritytech/polkadot-sdk/pull/1547; - support `open_outbound_hrmp_channel_for_benchmarks_or_tests` func rename, - from https://github.com/paritytech/polkadot-sdk/pull/1422; - missing weight functions added for `runtime_parachains_hrmp` and `pallet_preimage`; TODO: - [x] Deleted the Copy&paste para scheduler migration from https://github.com/polkadot-fellows/runtimes/pull/26 in b6666134d288374838fb4e47c7bdb0b9d92c0eed. This should be applied in the next runtime upgrade, but i did not properly check yet. --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: Oliver Tale-Yazdi Co-authored-by: Bastian Köcher Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- CHANGELOG.md | 13 + Cargo.lock | 1158 ++++++++--------- relay/kusama/Cargo.toml | 184 +-- relay/kusama/constants/Cargo.toml | 12 +- relay/kusama/src/lib.rs | 32 +- relay/kusama/src/paras_scheduler_migration.rs | 218 ---- relay/kusama/src/weights/pallet_preimage.rs | 21 + .../src/weights/runtime_parachains_hrmp.rs | 42 + relay/polkadot/Cargo.toml | 168 +-- relay/polkadot/constants/Cargo.toml | 12 +- relay/polkadot/src/lib.rs | 34 +- .../polkadot/src/paras_scheduler_migration.rs | 218 ---- relay/polkadot/src/weights/pallet_preimage.rs | 21 + .../src/weights/runtime_parachains_hrmp.rs | 42 + .../asset-hubs/asset-hub-kusama/Cargo.toml | 120 +- .../asset-hubs/asset-hub-polkadot/Cargo.toml | 114 +- .../bridge-hubs/bridge-hub-kusama/Cargo.toml | 100 +- .../bridge-hub-polkadot/Cargo.toml | 100 +- .../collectives-polkadot/Cargo.toml | 116 +- .../collectives-polkadot/src/impls.rs | 2 +- .../collectives-polkadot/src/lib.rs | 17 +- .../src/weights/pallet_preimage.rs | 21 + .../gluttons/glutton-kusama/Cargo.toml | 58 +- 23 files changed, 1276 insertions(+), 1547 deletions(-) delete mode 100644 relay/kusama/src/paras_scheduler_migration.rs delete mode 100644 relay/polkadot/src/paras_scheduler_migration.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 918e6c6df7..60daaed988 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ Changelog for the runtimes governed by the Polkadot Fellowship. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [Unreleased] + +### Changed + +- Upgrade parachains runtime API from v5 to v7 in Polkadot and Kusama ([polkadot-fellows/runtimes#56](https://github.com/polkadot-fellows/runtimes/pull/56)) +- Upgrade Preimage pallet's config implementations to adapt the new `Consideration` API ([polkadot-fellows/runtimes#56](https://github.com/polkadot-fellows/runtimes/pull/56)) +- Remove `experimental` feature flag for `pallet-society`, `pallet-xcm`, and `runtime-common` crates imports ([polkadot-fellows/runtimes#56](https://github.com/polkadot-fellows/runtimes/pull/56)) +- Election provider: use a geometric deposit base calculation for EPM signed submissions in Polkadot and Kusama ([polkadot-fellows/runtimes#56](https://github.com/polkadot-fellows/runtimes/pull/56)) + +### Fixed + +- Add missing weight functions for `runtime_parachains_hrmp` and `preimage` pallets ([polkadot-fellows/runtimes#56](https://github.com/polkadot-fellows/runtimes/pull/56)) + ## [1.0.1] 22.10.2023 ### Changed diff --git a/Cargo.lock b/Cargo.lock index c9865981cf..b777934cda 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -205,9 +205,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.5.0" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", @@ -243,9 +243,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "2.1.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", "windows-sys 0.48.0", @@ -273,7 +273,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df752953c49ce90719c7bf1fc587bc8227aed04732ea0c0f85e5397d7fdbd1a1" dependencies = [ "include_dir", - "itertools", + "itertools 0.10.5", "proc-macro-error", "proc-macro2", "quote", @@ -527,9 +527,9 @@ dependencies = [ [[package]] name = "asset-test-utils" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8c54a703225defe6b87f7b715bf72723342ef1ecf9a5e96d02c55a5bc31959" +checksum = "61cffdf2b648c1621ab71f24dbb08758d23709c72b7f0bd6795f16eef45579fe" dependencies = [ "assets-common", "cumulus-pallet-dmp-queue", @@ -562,9 +562,9 @@ dependencies = [ [[package]] name = "assets-common" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29b1f6400a746207ff6e077b13103427c646914d49cc459977090a966908ff91" +checksum = "ed19c72a730ac55e147d8f3204468f3dfb50d53c4c4e285d05cacd0c71bdecee" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -633,7 +633,7 @@ checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -644,7 +644,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -745,9 +745,9 @@ dependencies = [ [[package]] name = "binary-merkle-tree" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc86c4514675732c8bdc8a8bfc78b2e1b50dcce1a4aa5baea3338c9f2c3c1790" +checksum = "ef1ea0c49f8a41e530d4cbb7c81651d9d085d5f1470f4e4ea8c8c9c59b67a1bf" dependencies = [ "hash-db", "log", @@ -780,7 +780,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -930,9 +930,9 @@ dependencies = [ [[package]] name = "bp-bridge-hub-cumulus" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f657204b8e931d9c9b78139e661b7b58b005f627f0caf5c98257df0b81a97b" +checksum = "4ce716fc5e1c4b8201edf2e606e7ad16575b2bbc2bf0d47c79c613847bc78841" dependencies = [ "bp-messages", "bp-polkadot-core", @@ -946,9 +946,9 @@ dependencies = [ [[package]] name = "bp-bridge-hub-rococo" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6819a3f7a5c6c48ca4796ba70a586b5736baeb2e7542907f1c675d986141b20" +checksum = "717a65501207b3228c7b43dd41bded921145a2576c826d46983ac5e212d48fd3" dependencies = [ "bp-bridge-hub-cumulus", "bp-messages", @@ -961,9 +961,9 @@ dependencies = [ [[package]] name = "bp-bridge-hub-wococo" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5145dec4dbeb78e65f44b0f2a4953d5f276f8db140906b9831aee1434c9988e" +checksum = "a9954fcb7b2d22c528eb5ce2fe8d4fd0ec9ba4f61e110416f82e09c5420b8f01" dependencies = [ "bp-bridge-hub-cumulus", "bp-messages", @@ -976,9 +976,9 @@ dependencies = [ [[package]] name = "bp-header-chain" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "842dd43f5229669efb74cdc909c0e9315a7cdbe4513b6225dc0ab0ec21e4a1b8" +checksum = "29e5f1fc28d625ae266e8cb75e755e2d975009b81d2acaa3ca491de8649c10a3" dependencies = [ "bp-runtime", "finality-grandpa", @@ -994,9 +994,9 @@ dependencies = [ [[package]] name = "bp-messages" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb9128928257331dfb41c4c283549a7795447ca5dc5bc5b6753ee6118912651" +checksum = "20c772d4a9622e851363b140621846d77a7c4723b89f40cff03f20ddc8021e2f" dependencies = [ "bp-header-chain", "bp-runtime", @@ -1010,9 +1010,9 @@ dependencies = [ [[package]] name = "bp-parachains" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a2ffaab775e6e0295d52bd9b768862e522823ef8ecb1a0f05f87953b496239" +checksum = "489e6393ed00e33fe1dac88208488a05d8b4394bcacfb7d534f001174680df30" dependencies = [ "bp-header-chain", "bp-polkadot-core", @@ -1028,9 +1028,9 @@ dependencies = [ [[package]] name = "bp-polkadot-core" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953c2ec80269860053085ac259da9ed7b1ad3b8985435255f7635000dbd3c440" +checksum = "7bf1cd48449dc78e78dc2521242221a2c122af237dcb0590015b3daf378d3e6b" dependencies = [ "bp-messages", "bp-runtime", @@ -1047,9 +1047,9 @@ dependencies = [ [[package]] name = "bp-relayers" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4c6316868f49602c4a011d850444181d2f1b837a238214f1e287a0e6d74710" +checksum = "f95ab06bd8ce8fe01bd6d2d4aacb6b0cd3a5b4bec33f8bb9b24fcaf0c9de6afd" dependencies = [ "bp-messages", "bp-runtime", @@ -1062,9 +1062,9 @@ dependencies = [ [[package]] name = "bp-runtime" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6356e28b2d80b622e95914d130db0a4a9d2deb27863930228eb53b29bc6f28a5" +checksum = "41088b5a0ea0a7d6de116872637e0da0b8aba00845825d199d63d3cd6b10f7ad" dependencies = [ "frame-support", "frame-system", @@ -1086,15 +1086,15 @@ dependencies = [ [[package]] name = "bp-test-utils" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb045c0076d4f12de4ada37b5a30df377eb69988b577c98fe2c311da34b531" +checksum = "9bc1a2e7117843f44c4eab10af8ae89beacfa5331be70ff65580770e952742c3" dependencies = [ "bp-header-chain", "bp-parachains", "bp-polkadot-core", "bp-runtime", - "ed25519-dalek 1.0.1", + "ed25519-dalek", "finality-grandpa", "parity-scale-codec", "sp-application-crypto", @@ -1107,9 +1107,9 @@ dependencies = [ [[package]] name = "bp-xcm-bridge-hub-router" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e48a83f01c1469df3803773535052444c25ac050b070b1c18b48a378d913c8" +checksum = "33da9fb48f8dbfaa418098f81fb342b7fc71cbf4a3e4154e73da3ddc5c6e8eec" dependencies = [ "parity-scale-codec", "scale-info", @@ -1245,9 +1245,9 @@ dependencies = [ [[package]] name = "bridge-hub-test-utils" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3840cd4df9976e371b178033469cdcf1f68ab34f5e5fa43675bc1c5374d97786" +checksum = "e7eaec22f9b8e9c273ad81967b667601136dce45556ffb20c1a58ce05b1daa30" dependencies = [ "assert_matches", "asset-test-utils", @@ -1294,9 +1294,9 @@ dependencies = [ [[package]] name = "bridge-runtime-common" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87df6d2289a3ab0699d97b40ac3ef83f944b0db738e326327c267fdeca92b3a6" +checksum = "97cad9f78ab42138deed67edc3b5123b3db390675d129b781e305424d6ee8e29" dependencies = [ "bp-header-chain", "bp-messages", @@ -1472,9 +1472,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40ccee03b5175c18cde8f37e7d2a33bcef6f8ec8f7cc0d81090d1bb380949c9" +checksum = "03915af431787e6ffdcc74c645077518c6b6e01f80b761e0fbbfa288536311b3" dependencies = [ "smallvec", ] @@ -1594,9 +1594,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.2" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" +checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" dependencies = [ "clap_builder", "clap_derive", @@ -1604,9 +1604,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.2" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08" +checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" dependencies = [ "anstream", "anstyle", @@ -1616,21 +1616,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.2" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "coarsetime" @@ -1938,7 +1938,7 @@ dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", - "itertools", + "itertools 0.10.5", "log", "smallvec", "wasmparser", @@ -2103,9 +2103,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-aura-ext" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc007c63cdec6ce1f8e51cb98cce4631889881b9b9b763823164d362621afa0" +checksum = "b220a1c3071a088217c0a23020b17baba60e2685f13ae08396e10b3c62e197a5" dependencies = [ "cumulus-pallet-parachain-system", "frame-support", @@ -2122,9 +2122,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-dmp-queue" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320bbaf34d68a20f48c20b751df15aad015d43f8089994761ff0234cdfc40e9a" +checksum = "c63f5595db891c0b05c846a1fd7d0f49ad8b4b19e5f79f015e125853b6a519e1" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -2140,9 +2140,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0328425da88d976f122d28fdf23b094b6171b3c33adda8789495bb84ff0cece" +checksum = "8848c0ce4e55777b621703ef62224d5b8e2c250ccc03fb34c5372d995b86fa16" dependencies = [ "bytes", "cumulus-pallet-parachain-system-proc-macro", @@ -2171,21 +2171,21 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system-proc-macro" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7dde6ab318d17f36551556bed0f525cb7c823ab8da06ecd7b65140932da3a4" +checksum = "e1235a0c8b242349a41d84c07774e17acf942e9fee383dda31c021ccaea9eedb" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "cumulus-pallet-session-benchmarking" -version = "4.0.0" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c5345c0370ae667404209f674b0d1e40c6a476ba4d8fce2cd645fa224394d35" +checksum = "30bf028e8349229271e07d4ce99d8ada205a27de52d849bdd08e89a8271df424" dependencies = [ "frame-benchmarking", "frame-support", @@ -2198,9 +2198,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcm" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45dc968dcf8a41f72b1035f1ba1dc43d3577192e612bf4f19bbc6c34b73c8a1a" +checksum = "9848582a0748e29ab06faf9b1448b7039da1f90f6400b384c391c5831cb5fd7c" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -2215,9 +2215,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcmp-queue" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c6c8e354bcfc7ca04f316e1d4ef8e33b17efaae8f15af3ed8d360fb2bf0589" +checksum = "e0ac74a0c55c7ed27a51ce618b864e9d4a7f39de8ea03a4bd65ccff55145b5fa" dependencies = [ "cumulus-primitives-core", "frame-benchmarking", @@ -2237,9 +2237,9 @@ dependencies = [ [[package]] name = "cumulus-primitives-core" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63861b6bfd937c5eaf60058147c036caf07c4462d3f5098af24a4a757b64fe29" +checksum = "1aed2ae9917749ad77ca62acf65826a0f5e725a920ff1cab01d9bb020d59cdbf" dependencies = [ "parity-scale-codec", "polkadot-core-primitives", @@ -2255,9 +2255,9 @@ dependencies = [ [[package]] name = "cumulus-primitives-parachain-inherent" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffef2e14f1dc33bd098050209d75c9ab12512498bb498bc8f252f05e3b425853" +checksum = "87d8d415d8748df234bf0415576648fa529fbffa9de802959db7851f5e43d4dc" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2279,9 +2279,9 @@ dependencies = [ [[package]] name = "cumulus-primitives-utility" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e444b76437537a1e045b3d5e20b10117389eb865c60ce044c88dfd59261bff2" +checksum = "926a72124a351594cfdce41d7762e668d442e08c193d909d9f69fbe22e95414e" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -2298,9 +2298,9 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-interface" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e11d8ee7a514ba2bc309f5b52da520c719250a9622189f40256268db38c9db" +checksum = "642e7e83e5b3162cb2bf5b160e11443f5aabf11c5fd3c1deaf116d907ae79716" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2317,9 +2317,9 @@ dependencies = [ [[package]] name = "cumulus-test-relay-sproof-builder" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0100a89d8a8924934f861c427cc0e6ec8e5255f79ee8aab5faa87888e2d5b91" +checksum = "4fba4a4d5de5f68bde4aff857194efcaae44e874b6947d9aac9ea02bcda4382c" dependencies = [ "cumulus-primitives-core", "parity-scale-codec", @@ -2381,7 +2381,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -2408,7 +2408,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -2425,7 +2425,7 @@ checksum = "50c49547d73ba8dcfd4ad7325d64c6d5391ff4224d498fc39a6f3f49825a530d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -2648,9 +2648,9 @@ dependencies = [ [[package]] name = "directories" -version = "4.0.1" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" dependencies = [ "dirs-sys", ] @@ -2667,13 +2667,14 @@ dependencies = [ [[package]] name = "dirs-sys" -version = "0.3.7" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ "libc", + "option-ext", "redox_users", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -2695,23 +2696,23 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "docify" -version = "0.2.1" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029de870d175d11969524d91a3fb2cbf6d488b853bff99d41cf65e533ac7d9d2" +checksum = "4235e9b248e2ba4b92007fe9c646f3adf0ffde16dc74713eacc92b8bc58d8d2f" dependencies = [ "docify_macros", ] [[package]] name = "docify_macros" -version = "0.2.1" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac43324656a1b05eb0186deb51f27d2d891c704c37f34de281ef6297ba193e5" +checksum = "47020e12d7c7505670d1363dd53d6c23724f71a90a3ae32ff8eba40de8404626" dependencies = [ "common-path", "derive-syn-parse", @@ -2719,7 +2720,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.31", + "syn 2.0.38", "termcolor", "toml 0.7.6", "walkdir", @@ -2790,15 +2791,6 @@ dependencies = [ "spki 0.7.2", ] -[[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" @@ -2809,20 +2801,6 @@ dependencies = [ "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", -] - [[package]] name = "ed25519-dalek" version = "2.0.0" @@ -2830,7 +2808,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" dependencies = [ "curve25519-dalek 4.0.0", - "ed25519 2.2.2", + "ed25519", "rand_core 0.6.4", "serde", "sha2 0.10.7", @@ -2933,7 +2911,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -2944,7 +2922,7 @@ checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -3047,18 +3025,6 @@ dependencies = [ "quote", ] -[[package]] -name = "expander" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3774182a5df13c3d1690311ad32fbe913feef26baba609fa2dd5f72042bd2ab6" -dependencies = [ - "blake2", - "fs-err", - "proc-macro2", - "quote", -] - [[package]] name = "expander" version = "2.0.0" @@ -3069,7 +3035,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -3243,9 +3209,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4797e9270d3315a1724880ca63eaaab8f11cccbd76943a0f5c6ace9621016b47" +checksum = "a6d54d3a638f0279210c924f4a44e6548bf6345670f5af059a874a5006af4eca" dependencies = [ "parity-scale-codec", ] @@ -3267,9 +3233,9 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949ba5b5c9d552c37d7ad39bd837394c1d21727281ef32882539bc2ec6687b2d" +checksum = "a01af5751a0e4492dc979c57586976403e7ab63641add1a9fd804cad4169f4f6" dependencies = [ "frame-support", "frame-support-procedural", @@ -3293,21 +3259,21 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad4e68676c4d0160a7d9134f2376c29fd927844bff2aee1b35dd10d295d2856" +checksum = "35d1461dc3a49bbd9bdf8955eca27f54cdcc6b38373bbd636e011a8594d23f3f" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "frame-election-provider-support" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e605b5c5ce6abeba8db09dda9ad74a6d781e5c5e722670096df48917f0a33d26" +checksum = "f9fe9b8322a08a8a52ed3a7a7f7ca90827aa3bace41dc060c5b32d2ff0cd25c3" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3323,9 +3289,9 @@ dependencies = [ [[package]] name = "frame-executive" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382016f6286f2b05a1f65dd97509bc70afd59e26dc8c7ab0126e4220c19abb58" +checksum = "da12a8c223d6991bd7f9aae542d3d7c9fadde3a81b6f16c2550b808f3b21ecd5" dependencies = [ "frame-support", "frame-system", @@ -3354,9 +3320,9 @@ dependencies = [ [[package]] name = "frame-remote-externalities" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e4661884c0ac3f2391cfaf4b210af3fdf89216e8e245c843798de23d182a62" +checksum = "b8b26379217d223364e6715ed12cdfdc9f368c6afcb15fd8771e387ab7b0265f" dependencies = [ "async-recursion", "futures", @@ -3377,9 +3343,9 @@ dependencies = [ [[package]] name = "frame-support" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609125451f5ffb1675998e07e64e05e4b3dad330b1537952ace5897d6ed24f0a" +checksum = "c0dc5640279221fbd316a3a652963c1cb9d51630ea3f62a08a5ad7fa402f23a4" dependencies = [ "aquamarine", "bitflags 1.3.2", @@ -3418,52 +3384,52 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "18.0.0" +version = "19.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd22a1ed96e765ec763bbaef2089ed8bb5f8539df40181ddac57be7be74685c7" +checksum = "f22719c65353a0010a084cb2040e2e6569aff34562e59119cb66ddd7ecfa588c" dependencies = [ "Inflector", "cfg-expr", "derive-syn-parse", "expander 2.0.0", "frame-support-procedural-tools", - "itertools", + "itertools 0.10.5", "macro_magic", "proc-macro-warning", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "frame-support-procedural-tools" -version = "7.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82858452d9332de312f5ff411fd8aecee2323a344b241078f565b8c3c2e47d38" +checksum = "e046ecdc04dd66f17d760525631f553ddcbea6f09423f78fcf52b47c97656cd0" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "frame-support-procedural-tools-derive" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c7a09be6bd676fc01c5dd5ba057ba1f7e492e071d4a5fd7c579d99a96093d6" +checksum = "4034ebf9ca7497fa3893191fe3e81adcd3d7cd1c232e60ef41ef58ea0c445ae9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "frame-system" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40dc2f4182ad4c05275b0d3f38e3e74bd1cd17231f28ce1e879177fd9829887c" +checksum = "dc19d4d4037b695805385d56983da173bbb969f68e0e4e6a1240bb30118e87d7" dependencies = [ "cfg-if", "frame-support", @@ -3481,9 +3447,9 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "097cc1f91dc52a648c6b983ebf7aa75bf395b038354772b47e190ecd4caac9a8" +checksum = "bb79e630dc8fbed5601e58c1b8d84ec3900a511f105140b5bbb6c18c476488d2" dependencies = [ "frame-benchmarking", "frame-support", @@ -3497,9 +3463,9 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27a0f4c5811e962938b8f93787ae907eacf8312f6797d5efd53fd9d1f4590562" +checksum = "a13ed2be7e4ad2cf140d16b94194595d3b2fea0b60a46832945c497924c2d0d0" dependencies = [ "parity-scale-codec", "sp-api", @@ -3507,9 +3473,9 @@ dependencies = [ [[package]] name = "frame-try-runtime" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6becaab3f4648f9c5eeb8eb270614b7e4b5fd7d1deccab1d4a86cb41f8fb06d4" +checksum = "a9eceb53c4efa82dd7dd08f0770abfaa9587c592a015b21dc29ce4c24422de13" dependencies = [ "frame-support", "parity-scale-codec", @@ -3612,7 +3578,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -4354,6 +4320,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" @@ -4559,9 +4534,9 @@ dependencies = [ [[package]] name = "kusama-runtime-constants" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87fa26eba25489f17e493dd50a8b8f49448432bfd98ec06f730c83034a154e" +checksum = "7fd5fda44486f7b352e8199e091d80371b1b9fdd9b3c117e5e25ec28477220a5" dependencies = [ "frame-support", "polkadot-primitives", @@ -4762,7 +4737,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "276bb57e7af15d8f100d3c11cbdd32c6752b7eef4ba7a18ecf464972c07abcce" dependencies = [ "bs58 0.4.0", - "ed25519-dalek 2.0.0", + "ed25519-dalek", "log", "multiaddr", "multihash", @@ -5264,7 +5239,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -5278,7 +5253,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -5289,7 +5264,7 @@ checksum = "c12469fc165526520dff2807c2975310ab47cf7190a45b99b49a7dc8befab17b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -5300,7 +5275,7 @@ checksum = "b8fb85ec1620619edf2984a7693497d4ec88a9665d8b87e942856884c92dbf2a" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -5847,11 +5822,17 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "orchestra" -version = "0.0.5" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "227585216d05ba65c7ab0a0450a3cf2cbd81a98862a54c4df8e14d5ac6adb015" +checksum = "46d78e1deb2a8d54fc1f063a544130db4da31dfe4d5d3b493186424910222a76" dependencies = [ "async-trait", "dyn-clonable", @@ -5866,12 +5847,13 @@ dependencies = [ [[package]] name = "orchestra-proc-macro" -version = "0.0.5" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2871aadd82a2c216ee68a69837a526dfe788ecbe74c4c5038a6acdbff6653066" +checksum = "d035b1f968d91a826f2e34a9d6d02cb2af5aa7ca39ebd27922d850ab4b2dd2c6" dependencies = [ - "expander 0.0.6", - "itertools", + "expander 2.0.0", + "indexmap 2.0.0", + "itertools 0.11.0", "petgraph", "proc-macro-crate", "proc-macro2", @@ -5912,9 +5894,9 @@ dependencies = [ [[package]] name = "pallet-alliance" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e332ac5e332a88494488e502425aab59fbb8aaa96068c5ec75020b0ddd5eecc8" +checksum = "8aa981568b2cfe63b62b09c09d369d69283d54395ba94be3669dbe38ec6da95d" dependencies = [ "array-bytes", "frame-benchmarking", @@ -5934,9 +5916,9 @@ dependencies = [ [[package]] name = "pallet-asset-conversion" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1661ad646244fd155fae26799b9f12246aac8a18ed785550ceea6e4ac25cfbdc" +checksum = "f3e13819a9db7afbe281394b31f73a797bac08688c9aa43fc7114dd448742e05" dependencies = [ "frame-benchmarking", "frame-support", @@ -5953,9 +5935,9 @@ dependencies = [ [[package]] name = "pallet-asset-conversion-tx-payment" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47e76551d0029aa4e8d28d0108c4575fae812ff2c9e7a7fd79890a4c7a8223f" +checksum = "cec5f8b0d20b9967345e4177e30afbe3584ecf502be767e45d57b13550c8e9e0" dependencies = [ "frame-support", "frame-system", @@ -5969,9 +5951,9 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b0aea073ae2b627ddb7e775abb7872df8efb7fabd7c50dd05d3ca6ef0c72a4" +checksum = "0a7e58838852ea75ab55a57316d5a81344d8e7917da4490abffbb3a81ffb8872" dependencies = [ "frame-benchmarking", "frame-support", @@ -5988,9 +5970,9 @@ dependencies = [ [[package]] name = "pallet-assets" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2efdbd9727983844e1b82da41870829c0fd5d47ccb700fb27d734b3823d44ae" +checksum = "d704075c2b504c1f66263440cf97af860efd7e7919f25ccebdeeeb255313c261" dependencies = [ "frame-benchmarking", "frame-support", @@ -6005,9 +5987,9 @@ dependencies = [ [[package]] name = "pallet-aura" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2cf20aa88b42b71e70d254db752673e0a67f4cefd070b33c1e42d8b7d25d9a" +checksum = "d7e2b1cf20dbd9fe630c69b4b0d3bb0d5fa1223ee728b0fc0064ef65698918c2" dependencies = [ "frame-support", "frame-system", @@ -6023,9 +6005,9 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a335fdce40d450adf27def590d1f1c1f42a49f6f91420063ae2391b9eb88b4d4" +checksum = "8bdc251538bcec9340337a1624372561e6d8e6ae4eeb1adb1d7b1af13b349cda" dependencies = [ "frame-support", "frame-system", @@ -6040,9 +6022,9 @@ dependencies = [ [[package]] name = "pallet-authorship" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cda9086337d01cdb509422cbe7290aa17edab7bf5677218faae30dab23205a6" +checksum = "ae682e78744224150298730dfa1e2c39220e600dce17e42d2c77e49af3d9c59f" dependencies = [ "frame-support", "frame-system", @@ -6055,9 +6037,9 @@ dependencies = [ [[package]] name = "pallet-babe" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d7e474e0f5e9987b315dabe11269520cec98b44131e51a342e6a9d3a3d3f36" +checksum = "eebab5b1891cc12c13348509831703bea1f160eff60fa7b76b94097cf13b7dcc" dependencies = [ "frame-benchmarking", "frame-support", @@ -6080,9 +6062,9 @@ dependencies = [ [[package]] name = "pallet-bags-list" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd87d03bd1aee46275df25838fc5ba8c01fdb8df8a6860daa3d0f0b973a74ace" +checksum = "fd175d6ac024054b5fb41ce899a656e2e3972b0c4a2cbbe030b8d79fe25dc892" dependencies = [ "aquamarine", "docify", @@ -6103,9 +6085,9 @@ dependencies = [ [[package]] name = "pallet-balances" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0486a52507072bd738dc851acf7b42def3645db10777f93dccdaa5933e41269b" +checksum = "7c17ec19ad23b26866ad7d60cdf8b613f653db7f44232aa25009811441908e2b" dependencies = [ "frame-benchmarking", "frame-support", @@ -6119,9 +6101,9 @@ dependencies = [ [[package]] name = "pallet-beefy" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7b81cbf5d642ee2881f7860390e70a290e1f94afbc3b27d59f137e8fdeb69" +checksum = "6272fe91e3d0e5ea20dd82bc0ea8b0f104fe5eb10c66cadc19f7460586b94ff3" dependencies = [ "frame-support", "frame-system", @@ -6140,9 +6122,9 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60cca2fe7df196e41e2d43fcb97a76f68ff76dae38861b60e837d1a86ea9aa1a" +checksum = "bbf6226868b86de0cb2bc795223ff02f9955329409ac61b71cd193582800872b" dependencies = [ "array-bytes", "binary-merkle-tree", @@ -6166,9 +6148,9 @@ dependencies = [ [[package]] name = "pallet-bounties" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf8df1ab55bac70ea7a99794d7bace2a311cc3049654aef3965516b181654b88" +checksum = "e99eb21766e941ca1d92350da602ca618959c0917f216e124f2838d0e50b6c03" dependencies = [ "frame-benchmarking", "frame-support", @@ -6185,9 +6167,9 @@ dependencies = [ [[package]] name = "pallet-bridge-grandpa" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15ac3a6a500cf11ec838450054d26c330ea9dc792a5a7c2fc469d69e31e8816" +checksum = "d97671efddf3f78817a968de41c0b831c71bdc109eee5f173922596761dbf779" dependencies = [ "bp-header-chain", "bp-runtime", @@ -6207,9 +6189,9 @@ dependencies = [ [[package]] name = "pallet-bridge-messages" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6c4b5a64fd5ea73836f03c04c290ec66b53aca8f5c714bd805508a6e84ef904" +checksum = "167e0760c481a396d2219e0d25ea45230d21acf96f3e65419e91d53264332b7a" dependencies = [ "bp-messages", "bp-runtime", @@ -6227,9 +6209,9 @@ dependencies = [ [[package]] name = "pallet-bridge-parachains" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c179f0b5b698b0f643c7eac740a9e3bdea6561a3539aa45930f074f1bc1c8c" +checksum = "a4d6cf6236d9a49396d99a66500b28d80719ebc8bb06320307a5ad50fe79e71c" dependencies = [ "bp-header-chain", "bp-parachains", @@ -6249,9 +6231,9 @@ dependencies = [ [[package]] name = "pallet-bridge-relayers" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81ec236d325f1d9c5d24023088181449ca9f41e9351a2be25b2f82796be16450" +checksum = "c7097304f3a7e57a704b29bca87276e711d3d297bf37201be36c6f67b0d7c78f" dependencies = [ "bp-messages", "bp-relayers", @@ -6270,9 +6252,9 @@ dependencies = [ [[package]] name = "pallet-child-bounties" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03417c311cb707b1f0994397856e9a3611dd358f0caf67ccff91ac4ae45a005b" +checksum = "6b29f699677ce3e509f12a61529286373534948097f139944ef390add34fece5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6290,9 +6272,9 @@ dependencies = [ [[package]] name = "pallet-collator-selection" -version = "4.0.0" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2716f12bd4d379080b8d6de82c8293f6ba2a4b4268fdf690dd71e68d52ad4ab9" +checksum = "01abb1abe8297d0a7c571b609d923ada973999b63702049343612325eb29c622" dependencies = [ "frame-benchmarking", "frame-support", @@ -6310,9 +6292,9 @@ dependencies = [ [[package]] name = "pallet-collective" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2afbe5f8793d4d01e88e39ad02c656333bafabd86f87e5699f2b4022d8057eaa" +checksum = "06d2dcd4a78c11068eafd20df2bf0cbbfda8743ec5434170644c7f0eec7d7615" dependencies = [ "frame-benchmarking", "frame-support", @@ -6328,9 +6310,9 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520968f141a44b3dfd73ce4be80de07010c3847460bfbc5fb726d329f765f903" +checksum = "5d2bbed9f775d59346703efc5e1d8a3ee3f04aa73c39f733ca80edaf02907380" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6346,9 +6328,9 @@ dependencies = [ [[package]] name = "pallet-core-fellowship" -version = "7.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13aeaa8fe18020ff64792b883e1be6cadf695556e44279893216cb48bc0d7270" +checksum = "293bfe7b2bdd064de7c86d34c8e844a9abeddde8ad2be7964f4e6be6831fca7e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6365,9 +6347,9 @@ dependencies = [ [[package]] name = "pallet-democracy" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d44914750d93d466020b7d90c1170ce3e3b1fe3876df428749f4896a37bb5a" +checksum = "676fa85ebbe8ac31aef51c08cdf6422690f71d277c0369e630129b96d3ae9541" dependencies = [ "frame-benchmarking", "frame-support", @@ -6384,9 +6366,9 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40f39a03e6734c60d760e6b7ad5f1e115ac1d36f02a3111e60421b9ba0d2e" +checksum = "394d978de9611f3b23fc499369f86d5d82e64800959a5701d66907737e779406" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6408,9 +6390,9 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b31f394ea662fa9199c89c5712046fbd18e52211937332016b359ac81aef69" +checksum = "3a23b0dec60fd7a0c98234a4b04ef5e1f682bdf7ff3266ca499d85e1aac7bbec" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6423,9 +6405,9 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1373439465e6110ed0ab60905660d097df2d05736e008d6bc1d415b5fdb2386a" +checksum = "23776772408c7fd612ee11c17071b1f5d93cbd8d0e0aadc16d112aca2711028d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6443,9 +6425,9 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87789ed95833afcface11a8048708dafa35951308d7de5e9aed666e8044b3cc6" +checksum = "c41338a9d75f9c4c656d5d5ff15d8154edd7de61a97361e2d0ddc552baf6e944" dependencies = [ "docify", "frame-benchmarking", @@ -6463,9 +6445,9 @@ dependencies = [ [[package]] name = "pallet-glutton" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e705170005c5ebf054dae6252aea11082231e1d45ef4f54794313183b71bbc" +checksum = "3e08c402cb7f7b7fee476d99099da04acbd3ee05b21c5e15c39455cc24683960" dependencies = [ "blake2", "frame-benchmarking", @@ -6482,9 +6464,9 @@ dependencies = [ [[package]] name = "pallet-grandpa" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b77a81a40b8f2cf6dcd49eaa69b882c1ebb651a381e959a62a875d782cac856a" +checksum = "977d01d5ce3f06fa17adf2ffa55ebaea765efa23bc11a242773a28955ee1d02b" dependencies = [ "frame-benchmarking", "frame-support", @@ -6506,9 +6488,9 @@ dependencies = [ [[package]] name = "pallet-identity" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c9a8b0a02ae7650a8fd188b26fa0852152021fafb5da6d69e1d17f9d03e714" +checksum = "ffae303f4ecd1da950d4e27417ee4e3bbe3b8eb33776ded6184c40ed97dc5430" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6523,9 +6505,9 @@ dependencies = [ [[package]] name = "pallet-im-online" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70314914e290dbdb52adea50bf3e15965ca7b72c5a02d35dd6b9ded60bfb4877" +checksum = "7c30d7b90763c186d63e3f3f7e102c34df17917f6aeb24c4b6503356a886c16e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6544,9 +6526,9 @@ dependencies = [ [[package]] name = "pallet-indices" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b23c5b95f9ef2fd17c01cc6948c88aa9e263a49a90e1a5665798d744e5f8956" +checksum = "44159982fa42f9ec453d07bc9bbd41f0d51a710a58616b437700c87113e917cc" dependencies = [ "frame-benchmarking", "frame-support", @@ -6562,9 +6544,9 @@ dependencies = [ [[package]] name = "pallet-membership" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a055f189d360aca0919b65b91ab0b701e6bac2143ac46a285a9faf9ec7208e" +checksum = "6f4ff96fb2e4e126c96933e7a38e765b0bc30c8de0a66e3680d6a0d38356638e" dependencies = [ "frame-benchmarking", "frame-support", @@ -6580,9 +6562,9 @@ dependencies = [ [[package]] name = "pallet-message-queue" -version = "26.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa98dc8e920cf04f55c8d5ee878477a5be826952b99fe106e72c847c3391d0e" +checksum = "13771c5cba1de8dd9b0492ab8923a8dd6b76a657f6eed6265db65c169b5f9111" dependencies = [ "frame-benchmarking", "frame-support", @@ -6600,9 +6582,9 @@ dependencies = [ [[package]] name = "pallet-mmr" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7596f59b17e1ee05040d4fc0070d3ae781de34e847be95423d7f5310c3a9d63" +checksum = "224a83531b4a748a06501e033b09a22d51c70b8a58ae03794e7d3df4865ea49a" dependencies = [ "frame-benchmarking", "frame-support", @@ -6619,9 +6601,9 @@ dependencies = [ [[package]] name = "pallet-multisig" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e44176821dc2c2caface4303cfac8e8aa18ecf2bb15504f4a460abd2cb52dcd" +checksum = "f777e13b1d99233df1b4a6d7cf50d8c8214389be249467d8616983491ebdb537" dependencies = [ "frame-benchmarking", "frame-support", @@ -6636,9 +6618,9 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3160a1cbdc2a28363bd2ff4cba72ccb96a98cbb86a81ab694b4e99b79a62fcee" +checksum = "77610d09fae9ffb9a8cd147cad6eb7dd5225576bc3a60689fda221e620c06282" dependencies = [ "frame-benchmarking", "frame-support", @@ -6654,9 +6636,9 @@ dependencies = [ [[package]] name = "pallet-nfts" -version = "17.0.0" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3650227e8678336e93b679e9eeafdb1e0ff04bffcca148c00e3fb906ff5b08" +checksum = "d83c46a08a715439995b204e19267bc84066cb70e659f58604ba6621a67c7847" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6673,9 +6655,9 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de7f6a1613d3391121afd73548f4f37bea22cd7d5ce269db83a497ccc286c86" +checksum = "f7869cbe7277155d30c3ff7f9cb4752eb22d54370480bfd8c144e5a088eba498" dependencies = [ "pallet-nfts", "parity-scale-codec", @@ -6684,9 +6666,9 @@ dependencies = [ [[package]] name = "pallet-nis" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422715b4239456d73a78bae69a7411836c54bda35f69753524eff601ca910102" +checksum = "c0f288d37549f0cc09c719577b21dab288785e95f91ff69e8916f7f92f438f94" dependencies = [ "frame-benchmarking", "frame-support", @@ -6701,9 +6683,9 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" -version = "20.0.0" +version = "21.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ab7e472a983273ad52af65ac431769fda82a272e54631e451a47ea99c24b15" +checksum = "61cd64134f94f4ce7ff594d15ad6599d50abde54e94fd923366855b5bf0835c7" dependencies = [ "frame-support", "frame-system", @@ -6721,9 +6703,9 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f6f692dd7cab2ab8aeafe3a9dce645afe818712df62ac3ae432696731bb509" +checksum = "889d4929272cb67bdd444700a343f142816ebb5bbae65e771e70f52decb5931f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6742,9 +6724,9 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" -version = "18.0.0" +version = "19.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f5eb57e511e2d084b4d3b00b70cb36d0b8474222a86b2195da6b61503ac6f8" +checksum = "6c3a6ba161ed6b04be29ce4b6f1e9a2b0d8ab8f3708a95c39e0e0f334aa0954a" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6754,9 +6736,9 @@ dependencies = [ [[package]] name = "pallet-offences" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa80a36a4d7d42d2aab354242dbd37c1d253f30255be2b3edc357dc9f2ad7916" +checksum = "6dee74e6484d9dc2787baa8687b0b27115167848d2f821ca4e57826af4af50c6" dependencies = [ "frame-support", "frame-system", @@ -6772,9 +6754,9 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b4aabb1ea386486bd4a42ab3a067fdffae6716876d59c0e3fa1cf3e1040201" +checksum = "e534be39e87f22945af557c5fcb3b4e22d57a881af4966a0ac15f6f3f9feb2c7" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6797,9 +6779,9 @@ dependencies = [ [[package]] name = "pallet-preimage" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00ea296ac3f7f543a409e177b771459b14c76b33145d1374eabf984ebc34f14" +checksum = "50fdee12172aeac7a8c3292c559cf59947c71e37630b43d4f27f5b0f7845725c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6815,9 +6797,9 @@ dependencies = [ [[package]] name = "pallet-proxy" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186b0aa4c542217f8c6e0afaa1f5d9aea257019af6d426f591c2764e7b71d3c8" +checksum = "092eaf774e2ddf8974137fa2970835e421280fb637ddb06ebdfe47fefe29419b" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,9 +6813,9 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c8cf8915fcdb60a6dffd6cc20eb4bf2f95bd1f9424f598d1e99d47be0d84fa0" +checksum = "d16d59a6c2169cc28de2eafd24bf9f26d68291fff19186e8dfec88577517723c" dependencies = [ "frame-benchmarking", "frame-support", @@ -6850,9 +6832,9 @@ dependencies = [ [[package]] name = "pallet-recovery" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8c78735503c504465acf94b6ea3174f1a046bbbd8246d357fee0ed422e8a26b" +checksum = "a1ee085c026d20ce52d431b8ebe3283f6047fd411953c4cd003239154211c6e5" dependencies = [ "frame-benchmarking", "frame-support", @@ -6866,9 +6848,9 @@ dependencies = [ [[package]] name = "pallet-referenda" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99bdb6d7fcdda9c4a85efbbc5ea5499e07e339491d25ac913649c196a78b6d31" +checksum = "1b78ae2f740127ca4689066c8dce9aa79e2d7273bda0ab6db06a884892055b89" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6886,9 +6868,9 @@ dependencies = [ [[package]] name = "pallet-salary" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "477ba8329b1984377cd94d62b869ce976de2176c3126f58aa6efdcec808b236c" +checksum = "253502cbe69e79840cd04c7a1313ce55ef99cabcc96f7d686e08a022309ff82d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6905,9 +6887,9 @@ dependencies = [ [[package]] name = "pallet-scheduler" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cfdb4f02689fb9c4f22190f60be1acc5e6553d1c89b44272509bea2ebd1855a" +checksum = "148b54bb7364da5b95dd34a1ce5d2d89d6a4a28a07e46019cef27e0e3042605b" dependencies = [ "docify", "frame-benchmarking", @@ -6924,9 +6906,9 @@ dependencies = [ [[package]] name = "pallet-session" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f6f04ae97b311aa20a91a8b0bf92f7e231cff993547d3e874c3e60020cfa96" +checksum = "2f8482f465a73688a7d58e20dea4b10c9a0425995975b2a43d9ce4fe9a21a491" dependencies = [ "frame-support", "frame-system", @@ -6947,9 +6929,9 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a370a07dbfaa94bcc5e01f4e9cda1ad6fbca019bcb0a172a2ee26f61e736dbab" +checksum = "e688d5db25f47ede6cc0d6f8a76a08e07bf2d017935f2d9e7c78c40aac53089b" dependencies = [ "frame-benchmarking", "frame-support", @@ -6965,9 +6947,9 @@ dependencies = [ [[package]] name = "pallet-society" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "548b95cf82dd9caa346469a679cdef63a34d7105a009e33eb3930f41a70b2b64" +checksum = "587e0dfc3b03d940b1168ac9b0c0d9da26ad35ebe49b198d022d9f2f97ad26fb" dependencies = [ "frame-benchmarking", "frame-support", @@ -6984,9 +6966,9 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b9b137b78565e4012edf20a3c9fd10fa03e3b857dd3999239454da5d4d2431" +checksum = "7a1b649d9b95f842258b2e811960bf5e08285180e912303bee6b13c256a466c4" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -7008,21 +6990,21 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b1438535c3430a1c3de1d4c92d9a2c0cb664deb8433c8bf4c5298012ab50c3" +checksum = "9d99ab20edb6dec19370dbda0a627739dde9cdfea9b4310e28b8a0a0ea0e83fc" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "pallet-staking-reward-fn" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d48988f4264ff9a8088d40e4f4bfdee9606a9abef1e432987f6e40aec76da6" +checksum = "a280ef9dfb602b5f39e448d1c7d5922c154b1aee20e42c0740ffef8e2a58f8d1" dependencies = [ "log", "sp-arithmetic", @@ -7030,9 +7012,9 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a3b908034f3c688deacd672a0c838826edb5a3c980c04faf8f5b84edabbc8a6" +checksum = "7eb64deb42c5725b257bd2d73fbe64f191e1e5378698f06c15951d43cddd13a5" dependencies = [ "parity-scale-codec", "sp-api", @@ -7040,9 +7022,9 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb8084d2091a88147c1caad25bc03b15f3f7320c18087cfe037b8e21b13bd068" +checksum = "102e4426ca996a007026ac39eded61f62c4222fef8840d0a1617b5c41cb1c38b" dependencies = [ "frame-benchmarking", "frame-support", @@ -7058,10 +7040,11 @@ dependencies = [ [[package]] name = "pallet-sudo" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f10e6b5329062c8d78a9d845ebd1201b9b505e2a4b5aa6b4fdceeeccde0c323c" +checksum = "679c265de3a128714d43a7e2edf5ea29f2a39df65e4c44e216c04d6bb5dd5be7" dependencies = [ + "docify", "frame-benchmarking", "frame-support", "frame-system", @@ -7074,10 +7057,11 @@ dependencies = [ [[package]] name = "pallet-timestamp" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924bc62e043df933e6067a2a70a71a16823253e46765e36800f0dc60a0a59018" +checksum = "dac4e66316d53673471420fb887b6a74e2507df169ced62584507ff0fb065c6b" dependencies = [ + "docify", "frame-benchmarking", "frame-support", "frame-system", @@ -7094,9 +7078,9 @@ dependencies = [ [[package]] name = "pallet-tips" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8874f39912e560ea6de9c1e51d50dcd8e9fe7a68f2f9b89e5bf42bfc637cdf36" +checksum = "4a540f30c552ab0dcf32bb378a5f19c9c98dec74647dff93cbe55186aaa6159c" dependencies = [ "frame-benchmarking", "frame-support", @@ -7114,9 +7098,9 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eeaaeaf89f80fe3d19ff9ed60430423a7ea70ca91747b04be830499334d55d3" +checksum = "f4cbb78b8499af1d338072950e4aef6acf3cc630afdb8e19b00306e5252d0386" dependencies = [ "frame-support", "frame-system", @@ -7131,9 +7115,9 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8ee4c219399d7353548641d31aea760007f88223d6de72048fd9d13a9a6601" +checksum = "402155004abb33b7f2eedfa60ba77fb6f898e62db979a796e013714d18a1c9c2" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7144,9 +7128,9 @@ dependencies = [ [[package]] name = "pallet-treasury" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f099cd65be6adbd3602e5b3df680a5ab868b79c990c5c7b3977e849728632e" +checksum = "9dd64a50b82946d4ccf2178b7f3927ebac562b2ef31cecda53d31f3ff53a57c4" dependencies = [ "frame-benchmarking", "frame-support", @@ -7162,9 +7146,9 @@ dependencies = [ [[package]] name = "pallet-uniques" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6615e1af20293b33ec6c2bb30b9e1a9b4e0420c78b5f2aeed8afe244d9cdc6a" +checksum = "2c489508f7a29895417289850744050305387af0c066e080840f7f4d7e1e40fd" dependencies = [ "frame-benchmarking", "frame-support", @@ -7178,9 +7162,9 @@ dependencies = [ [[package]] name = "pallet-utility" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78c463bcdbe9b5f84b816ea4095d1aea776acd7bae0e9f6fe074acd84094ace" +checksum = "06465e88266b5ed015fdb1ad7345f5008a96d8fa9e012e869b6eb49a8069e809" dependencies = [ "frame-benchmarking", "frame-support", @@ -7195,9 +7179,9 @@ dependencies = [ [[package]] name = "pallet-vesting" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9fdc85285a6ced9b1ce722d4e7681b6b97ccf3a9ee439eeaf6bfc33c2022cbb" +checksum = "1da7d0e09ddc3decc4abe6adca41a24325a458040b1ecdd246143796af2d47b8" dependencies = [ "frame-benchmarking", "frame-support", @@ -7211,9 +7195,9 @@ dependencies = [ [[package]] name = "pallet-whitelist" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a09403cca331027032f2ba9a992e8b6bcd27d95255dfc30f1f6da5fd32ef57bc" +checksum = "997468b98ea225e8aed84cdb78503e3d35d0c997c2977503732c05afb626e5d9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7227,9 +7211,9 @@ dependencies = [ [[package]] name = "pallet-xcm" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b913e408dfd2e3b1a1834aa03965b1616bf2d4c24c635a1cdd3ae10335c97e48" +checksum = "430a62e82af99a697fabe583b85bf5797ef5d9996b8dec5bc2d195e94b4da3e3" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7249,9 +7233,9 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e49d6f43940cf0146a59ce21a495f32edb746ec16ec67f41d8a4ad4ada79afe1" +checksum = "23c7213029f113604b5799b6a126239d096427cdb678a377827eaf6928fde182" dependencies = [ "frame-benchmarking", "frame-support", @@ -7269,15 +7253,15 @@ dependencies = [ [[package]] name = "parachains-common" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f61ccf16fd574bc10480b1a106bb8536b5dddd38a44de0ce20e6f44b0cb4e1" +checksum = "63b13d76e1e40c002836b4f12cd771466440d92973f19cd093ff21b79eb12fc9" dependencies = [ "cumulus-primitives-core", "cumulus-primitives-utility", "frame-support", "frame-system", - "kusama-runtime-constants 2.0.0", + "kusama-runtime-constants 3.0.0", "log", "num-traits", "pallet-asset-tx-payment", @@ -7288,7 +7272,7 @@ dependencies = [ "parity-scale-codec", "polkadot-core-primitives", "polkadot-primitives", - "polkadot-runtime-constants 2.0.0", + "polkadot-runtime-constants 3.0.0", "rococo-runtime-constants", "scale-info", "smallvec", @@ -7306,9 +7290,9 @@ dependencies = [ [[package]] name = "parachains-runtimes-test-utils" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f653770c9ad5b9209e76bee456c2979a46a2a0245a8488b70311e005b68d80" +checksum = "7a0455cbf5e12a29f12b487d82c32524d8273ab2044e4845249d189800a752db" dependencies = [ "assets-common", "cumulus-pallet-dmp-queue", @@ -7568,7 +7552,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -7623,9 +7607,9 @@ checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" [[package]] name = "polkadot-core-primitives" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960aeac8618063cd9eca2a3551a92234a4c9007a970df7bf61d6fc2f9b4b85ff" +checksum = "209cc9c9f7ed951bb11a2ff2f592e6b5cd79d6f50311e4f702adce0fcc577152" dependencies = [ "parity-scale-codec", "scale-info", @@ -7636,9 +7620,9 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edffd01480c2a68452ea585cd5316447b236eb9c02bc95dba5c9654f8f4a15b1" +checksum = "3e67dbaac90484bad44e91812f8bd698cc87587728e570e33ce77c90a7c3cce8" dependencies = [ "lazy_static", "log", @@ -7655,9 +7639,9 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b08e1c66cc711d6f5c04be591021c6dedaad1e074f66f3b8bd06553c7f8e5ba2" +checksum = "4b40316be4e77cc63d4fa95236ef4b188b4eb7304918ce6ca5e10aeb568a21bd" dependencies = [ "bs58 0.5.0", "futures", @@ -7675,9 +7659,9 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f269984611861c4a5297234b4b649a483a5428194790dbea8b711b6e16ea93" +checksum = "d872b0f84734ef355d73e4492fc59c3e755d7232cd465bf0ed68679fb3291868" dependencies = [ "async-channel", "async-trait", @@ -7700,9 +7684,9 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883c5f3b51182a2f2f560230bd8e395bafa231dbc50335a4cc7eb3049860fcb4" +checksum = "b18e1dfcc68fd13a87fb2e06d6c8ec3cb83d6914140b9de3e191cf495089d63e" dependencies = [ "bounded-vec", "futures", @@ -7723,9 +7707,9 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07bd4e5a7e83b15fea91d92767e5c2a6a3e280a55d21f9bed9e96c25019cfb" +checksum = "306c61acfa9ba62eb36c238236321e2dc2ffe51698555b361a52e5f2f3c1470b" dependencies = [ "async-trait", "derive_more", @@ -7736,6 +7720,7 @@ dependencies = [ "polkadot-node-primitives", "polkadot-primitives", "polkadot-statement-table", + "sc-client-api", "sc-network", "sc-transaction-pool-api", "smallvec", @@ -7748,9 +7733,9 @@ dependencies = [ [[package]] name = "polkadot-overseer" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2012254af68764032245239030ffdfca0c2b0d126de84c0abb3f62a02dba3b68" +checksum = "f2a68991609f78f18243c24b53cbb895147e9001967ef64ab5dbdf60e1ec5aef" dependencies = [ "async-trait", "futures", @@ -7772,9 +7757,9 @@ dependencies = [ [[package]] name = "polkadot-parachain-primitives" -version = "1.0.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be23c13fd44bab7ed83eea35e1b68bcd21d61cbc6bb15451a8b0a00e627f0ab" +checksum = "864de6d7b7ed9c955aa1da6c53585ad75c73618307b569447dd0559f8f9baef9" dependencies = [ "bounded-collections", "derive_more", @@ -7790,9 +7775,9 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2c1568c0e0e40b24e8aa149c9194f692c9f9d1f999ab2024974bf47b9323bb" +checksum = "9de3d7ae1191401fe2476a69dece0853011d2c9fdcb7eb194cdead641f395abb" dependencies = [ "bitvec", "hex-literal", @@ -7922,9 +7907,9 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92ab9a0a68d66e0541a150e00e90480e94992d5d7e0494248a4661b1f355ee8" +checksum = "ac922a958e3e1435d7adffe49c1528b6396baf668ab45f635b79bff750053543" dependencies = [ "bitvec", "frame-benchmarking", @@ -7982,9 +7967,9 @@ dependencies = [ [[package]] name = "polkadot-runtime-constants" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9006804184f3f06e5c513d125aebb7764ab8116a340d71ff07ea266c2ae5b159" +checksum = "1d4a7abfe0dff335456790ac8edc342737dffbd67013a38b7bec2f6b523cc175" dependencies = [ "frame-support", "polkadot-primitives", @@ -7997,9 +7982,9 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4bb4e450cc3683d3e583067549c292db2c153a80da0af9717e41549a0a9979" +checksum = "93dbff21f9ce253f4cd976a972c5b4b18150cecb6fdae195a975e51cf3c797df" dependencies = [ "bs58 0.5.0", "frame-benchmarking", @@ -8011,9 +7996,9 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b7d429eda889f6511ff5d1a1a86765978e59f4dc9b9b692d5d5dfa22a7436b" +checksum = "0ffa4bade116bef54be48bb1ead3917d84478f43184d5f9ae001ec333d7d7d66" dependencies = [ "bitflags 1.3.2", "bitvec", @@ -8033,6 +8018,7 @@ dependencies = [ "pallet-timestamp", "pallet-vesting", "parity-scale-codec", + "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-primitives", "polkadot-runtime-metrics", @@ -8059,9 +8045,9 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b55bf808133addad3d826c344681cf6272acba60a2b9a007f4e4076c2e77eda" +checksum = "857b4c83022e353c48f38e4db15542e5da4d778e81058e533c44d559c72b5a51" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -8139,7 +8125,7 @@ checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" dependencies = [ "difflib", "float-cmp", - "itertools", + "itertools 0.10.5", "normalize-line-endings", "predicates-core", "regex", @@ -8178,7 +8164,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ "proc-macro2", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -8198,9 +8184,9 @@ dependencies = [ [[package]] name = "prioritized-metered-channel" -version = "0.2.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382698e48a268c832d0b181ed438374a6bb708a82a8ca273bb0f61c74cf209c4" +checksum = "e99f0c89bd88f393aab44a4ab949351f7bc7e7e1179d11ecbfe50cbe4c47e342" dependencies = [ "coarsetime", "crossbeam-queue", @@ -8260,14 +8246,14 @@ checksum = "3d1eaa7fa0aa1929ffdf7eeb6eac234dde6268914a14ad44d23521ab6a9b258e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] @@ -8306,7 +8292,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -8327,7 +8313,7 @@ checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" dependencies = [ "bytes", "heck", - "itertools", + "itertools 0.10.5", "lazy_static", "log", "multimap", @@ -8348,7 +8334,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.5", "proc-macro2", "quote", "syn 1.0.109", @@ -8623,7 +8609,7 @@ checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -8750,9 +8736,9 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f5a684888cc4995b2916f22014e0356f0a81fd8086079b4c1c11aaf62a8965" +checksum = "3fef0b660c7a725559c6be97a47511be63561c137da105ee13b07d9c7a462e43" dependencies = [ "frame-support", "polkadot-primitives", @@ -9022,9 +9008,9 @@ dependencies = [ [[package]] name = "sc-allocator" -version = "18.0.0" +version = "19.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75d11155f65cf4e548b916a95fd3c1193d3fa89cbece489e3627cb5cd93e77c" +checksum = "2bd6e58990dcb1eae76db49c456ded9a7906ee194857cf1dfb00da8bbc8cf73d" dependencies = [ "log", "sp-core", @@ -9034,9 +9020,9 @@ dependencies = [ [[package]] name = "sc-authority-discovery" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1903c35451b28ef27e5fd7cd07f4cb906fa368626e733b6b7315c285d8c3079f" +checksum = "eb85aa27916c2262aef532e6fc12d9654ce4717689cd25c75a88c5cc36609d18" dependencies = [ "async-trait", "futures", @@ -9063,9 +9049,9 @@ dependencies = [ [[package]] name = "sc-block-builder" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5dc368497d940a5744cf427253a4b2f8d2a2cad9b2fbb897a270a939e54b5f" +checksum = "4653cc3665319f76451f651bc5e3eb84965802293daeaf2def5bfe9c1310171b" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -9079,9 +9065,9 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26e51780635e06b9ff2c41a953c57dcc83d86c9459ee432f24775a44b61f2bd3" +checksum = "e5fae1616d342e570fb4770c9f1a73ab8e1aecb9c5b71020404f8e45db458260" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -9099,21 +9085,21 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b01ae962b09bc4c95661eed1d6c4996cf72b54f522d0e41d81ae1da65d7bd3c" +checksum = "88a074891d17c03c58b1314c9add361a5a7fb28d4d3addd7a32dca8b119bd877" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "sc-cli" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0e347f8c3fe530de1e8e3f735cc826d46fb9b53bd41604f1b82159a2186c6af" +checksum = "bc423e21a22adc4f6056ccb5e19fca9ddc6cce1a49cd9aa44c53d6b2338fbeb3" dependencies = [ "array-bytes", "chrono", @@ -9151,9 +9137,9 @@ dependencies = [ [[package]] name = "sc-client-api" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c17ac3b6dcc569998527e9228f6370d22ba84136f4c1753f6ba4d07c41a3f1" +checksum = "d49efb455b1b276557ba3cac01c2e42811148cc73149858296e4ae96707dc70e" dependencies = [ "fnv", "futures", @@ -9173,14 +9159,15 @@ dependencies = [ "sp-state-machine", "sp-statement-store", "sp-storage", + "sp-trie", "substrate-prometheus-endpoint", ] [[package]] name = "sc-client-db" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c292bad8f2f55772953fc6d0b6970089eb3b1782862799828413b0db847473" +checksum = "a1062af3e43f09e0080714382ee3e7dd850037908938323eefdcd4f4b61bdd6b" dependencies = [ "hash-db", "kvdb", @@ -9205,9 +9192,9 @@ dependencies = [ [[package]] name = "sc-consensus" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc2effbf5b5be7e7b5a0d448d6b83f446cd2425b9be0ab55b97bde8f60a8f46" +checksum = "f5f8da1ef0f036209b80d8bde5c8990ea1a86241532d84b5fd15f5e721da849c" dependencies = [ "async-trait", "futures", @@ -9231,9 +9218,9 @@ dependencies = [ [[package]] name = "sc-executor" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6b38c64210870649f89b476295ccd7c078ed7c2b9a3c82f413ad2c9396b63a" +checksum = "5cfeaa8dc2a70ed5820667d3251266ed156f38d8062c2f976aa7c618411f1776" dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", @@ -9254,9 +9241,9 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7023e1d9c86b817995a72e294b98f196cc3eb9c162f0b69ba95c3b0bd841ef32" +checksum = "5d404519f2a636d5977b1ac16c90aeb4129fe4609a5b284960a2dcb005c08da6" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -9267,9 +9254,9 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61689d40f3840a20d8987cb2a86d3841f2c3ab851a5cea0c6f466a062abbcd" +checksum = "a82515a0cb74a2acb58f6ced20fae56eeb87ba4d813e60e46cf190a53d44c931" dependencies = [ "anyhow", "cfg-if", @@ -9285,9 +9272,9 @@ dependencies = [ [[package]] name = "sc-informant" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da26c939c308d9bad95a7489a64c84863149451f6b6f5d77be1f8acbba0aa9e8" +checksum = "233ece6736217208ffac94f84de2d15465f80f676f881dacd0a9b3411b476951" dependencies = [ "ansi_term", "futures", @@ -9302,9 +9289,9 @@ dependencies = [ [[package]] name = "sc-keystore" -version = "20.0.0" +version = "21.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a26be641a4d25ec382a340f90c26f5422644269422d2f6e8390073a26d9023" +checksum = "1c15cc8b79eb0832cac48fde41e9ecd011df5d57dad7608f2b89fe721e97012c" dependencies = [ "array-bytes", "parking_lot 0.12.1", @@ -9317,9 +9304,9 @@ dependencies = [ [[package]] name = "sc-network" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0d414c9e17d563a0c0dce01c6b6f10aa50d9ba0e904c2fe5e6b2aaf845f5de" +checksum = "3edad0e7930c2572d6920dc257bc03af6f40ba272bc45602edd0a045d94e5e59" dependencies = [ "array-bytes", "async-channel", @@ -9359,9 +9346,9 @@ dependencies = [ [[package]] name = "sc-network-bitswap" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d188183e28b77d7cdfbd07cc251d9e6c6b1c9960405d92943cfc642be1758ef" +checksum = "e6a0d247f576989cb2fe49df0511cbbd826f1e47b444848971e2bddec8f18a65" dependencies = [ "async-channel", "cid", @@ -9380,9 +9367,9 @@ dependencies = [ [[package]] name = "sc-network-common" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d09f99d3845d5bb325641a3de1db8049bccca29e8272e65b8ea415c1153b01" +checksum = "b418c79cea8ab5b43f5bbe7ee95da7d6490bdfedbe92a9b07a714ca4f09a2426" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -9398,9 +9385,9 @@ dependencies = [ [[package]] name = "sc-network-light" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f0d6072d48cc9ae8ce06ee8790eccb5268c9af083a9029ff8d38d0e3eb541d" +checksum = "e36fc98d43aa75eb0d0690af6a8c6a929318f6cb4bf1fc039410ece56c8bb5a9" dependencies = [ "array-bytes", "async-channel", @@ -9420,9 +9407,9 @@ dependencies = [ [[package]] name = "sc-network-sync" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58b26c047661612e72321a1df53d76e79aad99b0846d795ea3807d9b25baf6d1" +checksum = "1d049b008a7353fc46cb45a1f6f68e5e5128442b6726cfd82da09cb676443e73" dependencies = [ "array-bytes", "async-channel", @@ -9455,9 +9442,9 @@ dependencies = [ [[package]] name = "sc-network-transactions" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940233816ec996869ca47c2153d4e66c9df376cf32e62b6c78630f418705fd62" +checksum = "7ef6606f7705bc9c038c9e11715b7ddbdb2a5b43c12d8e3cc346e0b9927218e4" dependencies = [ "array-bytes", "futures", @@ -9474,9 +9461,9 @@ dependencies = [ [[package]] name = "sc-rpc" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f86ce48d8c8c6b4ebaf4775955cc79985732db5407e4893e0976be8f6b28eb5b" +checksum = "ede50e654b3e0c076bb9beb041612af80f07dfb883cc05d8aaae1c7a1bb72761" dependencies = [ "futures", "jsonrpsee", @@ -9506,9 +9493,9 @@ dependencies = [ [[package]] name = "sc-rpc-api" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60585da26d11aefb112d3a6925cc75fd76bee1961b2de615e6207df2b86a459c" +checksum = "1cac4149b7427beed423006c78e0b75c0193ac01d6e66ff0dd8a1909747cf593" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -9526,9 +9513,9 @@ dependencies = [ [[package]] name = "sc-rpc-server" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc99b691cc6a88afc9c64b40e50cdef64920f7b3c3e2d752aa8dfe192a4c2f0" +checksum = "9a62b9c5bf359cd4923ce10d294532936aa68d0cd59e890a0414f6434397180b" dependencies = [ "http", "jsonrpsee", @@ -9542,9 +9529,9 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d4a55644ca962d4a094b54bb0e2a30bcbe12c17385096650c771c14f7318c8e" +checksum = "2e770646ab839fb33dfeb7cbde94d98cdaf78526c70b10aa59ec5810953ff2a5" dependencies = [ "array-bytes", "futures", @@ -9571,9 +9558,9 @@ dependencies = [ [[package]] name = "sc-service" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58550b3ee0bba7beec7d2ce5612b712a34d3326ff68fa95799f6c328f5bb8dd" +checksum = "b9c7fa14eaf48c44edff226ce9b18dc984c122e9deebbf825a8945be7c046ade" dependencies = [ "async-trait", "directories", @@ -9636,9 +9623,9 @@ dependencies = [ [[package]] name = "sc-state-db" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b72de87b85342d40852e2dd8b17c07a47406ffe8f1ce97acb2605769df7ed7" +checksum = "43bc9266fdec30b59857e794fc329aa600aaa6ed46799f9df859a7e30c0ec34b" dependencies = [ "log", "parity-scale-codec", @@ -9648,9 +9635,9 @@ dependencies = [ [[package]] name = "sc-sysinfo" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca1dc4ea7ab8b96f0c948d26b2af7e540a8d182ba13f7b81930c119dc50f7087" +checksum = "4ff97437e564c0e7483d7e32384e3f6571f656728ea03a6e1b07a6325e064a76" dependencies = [ "futures", "libc", @@ -9668,9 +9655,9 @@ dependencies = [ [[package]] name = "sc-telemetry" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba96178e1d0286ecc4a37fbf39a4660d8d10640baedffb58ff18de7162d117cb" +checksum = "4b46193a2979c86da75fc43276d222359757ea257b512fe6e4128e7a50b0bb22" dependencies = [ "chrono", "futures", @@ -9688,9 +9675,9 @@ dependencies = [ [[package]] name = "sc-tracing" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e86aa30a30596a5ca9e0492474d907edff1e5e569a121bb4eb178f4a262b8d1" +checksum = "4fcb4398268e83957ebbc84e6290307198e817caa47386135d3de6ba3316203a" dependencies = [ "ansi_term", "atty", @@ -9718,21 +9705,21 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f602d1fa418385ed0e25be1305c9b03f68ff7ccb3b5df88a2145e7e1fb9117e" +checksum = "71bd05d3f24c0c2489c57b90a76db883c23c25577718ca05c9b0181fd427f501" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "sc-transaction-pool" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1787f18283fa7714203a705ff3b7bcb288eb85149e3679db0197f09319503f9" +checksum = "a6af477c0e8a2698aabf442a3918313e8f096eb6695ceaaa7e12679c496d2826" dependencies = [ "async-trait", "futures", @@ -9757,9 +9744,9 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "792c4841d8fba48d4a61e03db45854d8273dee31ae0d4ffb98af5176d0e31a03" +checksum = "c4f1b864d0ae8f1891eb310672c12fc160d24e37ef297d5ef0db257558fe13b1" dependencies = [ "async-trait", "futures", @@ -9774,9 +9761,9 @@ dependencies = [ [[package]] name = "sc-utils" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "563bde62fa4681746c8960d434fa65e7ea40c7fab46692b26998132f43e1e100" +checksum = "e8b01c8eed623f999d402e44679d42ad42586afd4638aaed38708a307b59f4d7" dependencies = [ "async-channel", "futures", @@ -10021,14 +10008,14 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", @@ -10194,9 +10181,9 @@ checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "slot-range-helper" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25d332388412dc3ccbd1c4332876984736ee46b8f4a0ae6ea626d8ebf24ac312" +checksum = "5109eff24021551c130973a924318728720e6c74fc98d206b4f42b7763978fdc" dependencies = [ "enumn", "parity-scale-codec", @@ -10273,9 +10260,9 @@ dependencies = [ [[package]] name = "sp-api" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86901915aaf9c73f9a8588fae10072c6082e7bf169edae175950410b77ad8103" +checksum = "ddc5213210472ba2becdc094fbb9d30c4455753b1a608962797e1e971c3e5ec4" dependencies = [ "hash-db", "log", @@ -10295,9 +10282,9 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "972809a3e3a583423bca2ee6d08eb5397814ef6b265abf43e888c4ed9916ff83" +checksum = "20e7f093302d30b9d35436db024376459bdc9da7530abcacf5d87c32a67d94fd" dependencies = [ "Inflector", "blake2", @@ -10305,14 +10292,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "sp-application-crypto" -version = "25.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fa730e4f3a2aec3f4ee777410599a86eb17067ee5410c58ab496e88d7bb840c" +checksum = "b74454c936a45ac55c8de95b9fd8b5e38f8b43d97df8f4274dd6777b20d95569" dependencies = [ "parity-scale-codec", "scale-info", @@ -10324,9 +10311,9 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "18.0.0" +version = "19.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3d3ff6d6d717d7563659e9e47e958d33ebd2d0b3d8b1a9961cf9832944375e" +checksum = "e41f710a77e9debd1c9b80f862709dce648e50f0904cde4117488e7d11d4796d" dependencies = [ "integer-sqrt", "num-traits", @@ -10339,9 +10326,9 @@ dependencies = [ [[package]] name = "sp-authority-discovery" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06a92d2af502f53c11c4656f58a1f49856b633f455433c6e0c94e59039f560f0" +checksum = "3259fe9bf2e48eba37067f464a3db79ef20e25f1297cbad310c11738757c5c6a" dependencies = [ "parity-scale-codec", "scale-info", @@ -10353,9 +10340,9 @@ dependencies = [ [[package]] name = "sp-block-builder" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "149acca1cfe20a2fc888e2e04b2811f7fd04a5bc47630a5d6191664f4ed7b224" +checksum = "6c6a066e310d4c0c240829d7bb5d6bd01dde55d03e15b665f0372b40952f37e6" dependencies = [ "sp-api", "sp-inherents", @@ -10365,9 +10352,9 @@ dependencies = [ [[package]] name = "sp-blockchain" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4d1f97e0cb623f919b6c6dbcd1d6438b8d8c456df4d045fb2778251d9d7803" +checksum = "f506119858f25a73ed9d61a2ead0d5b97b5141055b3b4a12b9b82e530b06c673" dependencies = [ "futures", "log", @@ -10384,9 +10371,9 @@ dependencies = [ [[package]] name = "sp-consensus" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e74272780c5c6ea026b3e66cdd7b369b90e1e94c17d91c41e2359224f2439ea" +checksum = "04e142e27f140d50701e613d925f61482fafccb7d90933ee30d7bae54d293ea3" dependencies = [ "async-trait", "futures", @@ -10400,9 +10387,9 @@ dependencies = [ [[package]] name = "sp-consensus-aura" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564b98aa33315f542ba0ace2bb5f94a1a0503608b125edbd6537420fcf03a47" +checksum = "0dcc6df7a006a55651d0e7bdf2d8d4583d5b917cb4b7b6a1331398e96307a883" dependencies = [ "async-trait", "parity-scale-codec", @@ -10418,9 +10405,9 @@ dependencies = [ [[package]] name = "sp-consensus-babe" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53de79497a7ac68e7f414c2fea712b255b129991fbf6cbd63002fab9314437fe" +checksum = "572374a1260687fa18481ccac58c4a64611df379fb1aa65389ce96c6661b3b05" dependencies = [ "async-trait", "parity-scale-codec", @@ -10438,9 +10425,9 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cd87757ce886d92502d11b84022ee42d268ba3a63703c273c1f31f536b01b7b" +checksum = "1969665f2c07bd7403810c3e1180ef03e388f74be04a1362fe4471d14a7cda14" dependencies = [ "lazy_static", "parity-scale-codec", @@ -10458,9 +10445,9 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c750af0e64f19a5c364748c49339900e12f6ecd577f71879052604fd7f9312c4" +checksum = "04d20516ed05a6a17f712050d6be385ca53c16b2d49938a29ca05e07f7aa5118" dependencies = [ "finality-grandpa", "log", @@ -10477,9 +10464,9 @@ dependencies = [ [[package]] name = "sp-consensus-slots" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9edd2b6ac697a55075e3a4c5697f1142cd59de015f93aaf0aa843d1194ae268" +checksum = "9ebe1c46246a76af1105639c7434c1383d376fd45a8548fc18ed66dbf86f803c" dependencies = [ "parity-scale-codec", "scale-info", @@ -10490,12 +10477,11 @@ dependencies = [ [[package]] name = "sp-core" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "412e2ec53b1bc63778e2d70c347224e6cd2e25c4bacb509585db85f0788747b7" +checksum = "7921d278ed2aebbb21a644c96e09663dc49a6139d1e2e063c059dc9f866e149b" dependencies = [ "array-bytes", - "arrayvec 0.7.4", "bitflags 1.3.2", "blake2", "bounded-collections", @@ -10537,9 +10523,9 @@ dependencies = [ [[package]] name = "sp-core-hashing" -version = "11.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558116d02341b6f28b033c19a2a5fa555afa3c52628639170087e7685d51e743" +checksum = "a7cb5c31aa385d6997a5b73fdc9837c1c0145559205198555c3000739a474767" dependencies = [ "blake2b_simd", "byteorder", @@ -10551,20 +10537,20 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" -version = "11.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8681fa136cf504ba2b722fcb10d78df147c15d201b997e06c4c8c72258001a" +checksum = "3a4327a220777a8d492ed3d0bcd4c769cbb030301e7d4a2d9e09513d690c313b" dependencies = [ "quote", "sp-core-hashing", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "sp-database" -version = "7.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac16ca1b4f309dd51a7a06b1843b73e6e81ff70a05dac17d3c8f9c86e4fba5da" +checksum = "ab25f79468af89010a8eb84e6bf56068b59929a55291c03519f47208360f3ebe" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -10572,20 +10558,20 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b235a0ad7124d58e6f0a728c8354da5b185b77bcf18b131b3a480cdaa23d95" +checksum = "16f7d375610590566e11882bf5b5a4b8d0666a96ba86808b2650bbbd9be50bf8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "sp-externalities" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "588cf40c36de918f545d712ad1a70631ae71653e4a321506dfcd8fa6fd26453c" +checksum = "ede074871514ca7c5d2eca9563515d858c6220b47ae815714ed4393a4e99db4a" dependencies = [ "environmental", "parity-scale-codec", @@ -10595,9 +10581,9 @@ dependencies = [ [[package]] name = "sp-genesis-builder" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ae51f8a24e1be6593be94581f3465a10d7c86ce403cbf9dcf703d14f35309d1" +checksum = "10b9f0251a09b578393f3297abe54a29abdb7e93c17e89a88dc1cabb8e2d5a2d" dependencies = [ "serde_json", "sp-api", @@ -10607,9 +10593,9 @@ dependencies = [ [[package]] name = "sp-inherents" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4355b6a68001ff5308a09fe069c778c184030ee3b95271dd44841d056ecadf13" +checksum = "439882da80e9bcfd1ba53df7ec5070d4d7f2a9a93f988aa3598f99ee5bfc76eb" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -10622,12 +10608,12 @@ dependencies = [ [[package]] name = "sp-io" -version = "25.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9926dba7d67d87e40f49e18ff6cfc01373d5be13e3d373f02182bb5ec8ab37b" +checksum = "88fb6e281de5054565f07a9f79504d21133e115db549993c99f1b21236c677a5" dependencies = [ "bytes", - "ed25519-dalek 2.0.0", + "ed25519-dalek", "libsecp256k1", "log", "parity-scale-codec", @@ -10647,9 +10633,9 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "26.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dfcca2fad349d5fd197a56b4deef229b872c9172a8267d77c81a9f45a38f18a" +checksum = "05f09927534d2233e135e4b4a0c758554d0ff66178f6e9cfba2e151dfeac97b3" dependencies = [ "lazy_static", "sp-core", @@ -10659,9 +10645,9 @@ dependencies = [ [[package]] name = "sp-keystore" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f0f9546dd151881c60e75355806f1cbbc893f64aa465fc5bf87a47de59467b" +checksum = "8b9f19e773319d96223ce8dba960267e6cb977907537a8f738746ceb86592413" dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", @@ -10672,9 +10658,9 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" -version = "7.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cb1a26782e618f26b43ec8c6ecd799657134cd12af1902ceddaf1fad8031a1b" +checksum = "377a0e22a104a1a83804562fba6702537af6a36df9ee2049c89c3be9148b42b1" dependencies = [ "thiserror", "zstd 0.12.4", @@ -10682,9 +10668,9 @@ dependencies = [ [[package]] name = "sp-metadata-ir" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d493f8324241f20d80cbc920fa0ab7a173907d0bf1a10812098a924cdff48d7" +checksum = "eb0dec8af38c68358600da59cf14424e1230fe9ae1d4b4f64a098288145c0775" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -10694,9 +10680,9 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74488c6296d65190b67a3945ef2f5cc8ac0f8b92023dcfc6e88164380654b6a0" +checksum = "f616a1e1f731d027808d06d6b10de8d1e401397571e8f8e4ba84c1e74afc334c" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -10713,9 +10699,9 @@ dependencies = [ [[package]] name = "sp-npos-elections" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234e5bf197f5232cd00aeab2dc0b4c69b9fc2179d4ea67abd11fdea00a54bddf" +checksum = "ec60b253bf9097e8ffe103563c515ef80550556ab3b2ec5513ed17a4ad7de520" dependencies = [ "parity-scale-codec", "scale-info", @@ -10728,9 +10714,9 @@ dependencies = [ [[package]] name = "sp-offchain" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e1b9996004e6a39c06e6d66bd7684c8a07e73dd9137a2b6f2bbfde675d636a" +checksum = "50b1501eb4ede6471162ff48c85ccabb21434b698c8b61e2651f85c00bc1656f" dependencies = [ "sp-api", "sp-core", @@ -10739,9 +10725,9 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261572cc0db4b41cf7587b4f7bdc15b8f83f748f17ae1c3c2f56a3e8e62ee913" +checksum = "cd099ba2d6c1bfe5d0c79aa56e440fa3c9257eadfc0c782c09cdc2122b1e60ed" dependencies = [ "backtrace", "lazy_static", @@ -10750,9 +10736,9 @@ dependencies = [ [[package]] name = "sp-rpc" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5828020dd51228aeee12a571720f3354deb95bc159f5edf4b7f2ffb3e023a12e" +checksum = "1d8534ae0a6043f70a93054bf0d3da27436637a8134ed44667c360e7a955cb3d" dependencies = [ "rustc-hash", "serde", @@ -10761,9 +10747,9 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "26.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f645e9e2c82d052ea48ed987a8789daca1c03f9b5ed1aa49cd080092eda85330" +checksum = "46c0641e1a9d340960b562bcceea1457680fd0e109fc1040f8f5364fd7bc2506" dependencies = [ "either", "hash256-std-hasher", @@ -10784,9 +10770,9 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "19.0.0" +version = "20.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef767d6e400ee54a420bcbc570030741420c2d938a6e379d21cab9875a339c5" +checksum = "17a4030ad93f05c93f2cc294c74bc5fea227f90fb3d1426d4a6f165e017fb7ea" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -10803,22 +10789,22 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "13.0.0" +version = "14.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd795a4a2205b64d95da897f85b7c83a0044f30df22b0ea282f8387dc6ca428" +checksum = "b232943ee7ca83a6d56face33b8af12e9fb470a15a53835f4e12a6e452a41c1c" dependencies = [ "Inflector", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "sp-session" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff5d53ba296b793574fc12b6ebf49d6755d24439979290682ca58d759db5bb73" +checksum = "bfd062688577cc54493ba6f58383bfed89c66d5ef7b7c3747293b0da06c7f795" dependencies = [ "parity-scale-codec", "scale-info", @@ -10832,9 +10818,9 @@ dependencies = [ [[package]] name = "sp-staking" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb11c6a7765d2df277110fe25bba075f697aba999b29a6c9b55eb2b95401b0" +checksum = "1d3b2a4a7aa67a9adb2a8f49ed516f6694b5fa70792ab9b0125934b1c8cdc2e3" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -10847,9 +10833,9 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771dce7d78335718ab8475984b6dbc1f374777049ed1c308186679e611333be2" +checksum = "2bf4c76bea1a9e4a2e79afe70f42f1d368a8a45308e58f19bfd755c5ddb2b4a3" dependencies = [ "hash-db", "log", @@ -10869,13 +10855,13 @@ dependencies = [ [[package]] name = "sp-statement-store" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49c431b349889565a6b7f13eaa8216af8f826b015cbe1c9ef21999a44edd61d7" +checksum = "a11bbdc403457dd7a850078936aa7cc753c617b7bbeba5f5766ce5a55b2bf124" dependencies = [ "aes-gcm 0.10.2", "curve25519-dalek 4.0.0", - "ed25519-dalek 2.0.0", + "ed25519-dalek", "hkdf", "parity-scale-codec", "rand 0.8.5", @@ -10894,15 +10880,15 @@ dependencies = [ [[package]] name = "sp-std" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed09ef1760e8be9b64b7f739f1cf9a94528130be475d8e4f2d1be1e690c9f9c" +checksum = "8c91d32e165d08a14098ce5ec923eaec59d1d0583758a18a770beec1b780b0d0" [[package]] name = "sp-storage" -version = "15.0.0" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20f503280c004d94033a32cb84274ede30ef0b4b634770b1e7d595f8245bda4" +checksum = "ac9660ecd48314443e73ad0f44d58b76426666a1343d72f6f65664e174da9244" dependencies = [ "impl-serde", "parity-scale-codec", @@ -10914,9 +10900,9 @@ dependencies = [ [[package]] name = "sp-timestamp" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00d60953f7fc9b4f51bbcbac8f0cd8d6e6266a7cc18f661330308bbcec1eb053" +checksum = "3b0ab4b6b2d31db93e7da68894ccb7c5a305524cea051109820b958361d162be" dependencies = [ "async-trait", "parity-scale-codec", @@ -10928,9 +10914,9 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "12.0.0" +version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebabec43485ebdb2fdb5c6f9b388590d4797a3888024d74724ada2f16b2113b8" +checksum = "69a61948986d2a9f8d67d60884ff0277d910df09ebe08d0e1f309da777516453" dependencies = [ "parity-scale-codec", "sp-std", @@ -10941,9 +10927,9 @@ dependencies = [ [[package]] name = "sp-transaction-pool" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa16493e2b8f84b03167c901f4ef7af8fe3e58c4c3426d41cc48dc10597d255d" +checksum = "42ea9c85f85f52e0a49c3f2ec6cff952fdc3ffe8392bebe21ed30eddd8d059c5" dependencies = [ "sp-api", "sp-runtime", @@ -10951,9 +10937,9 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a926dbe30a0af60eae24ff01c532e545b9093eda36f520f2a744e40112e62b" +checksum = "30a2d2d676a4c8e9ff18cb43782ed557d00de28ee9fb090842a8510e4a7ce0a7" dependencies = [ "async-trait", "parity-scale-codec", @@ -10967,9 +10953,9 @@ dependencies = [ [[package]] name = "sp-trie" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78585a84d02d1c71e8eb8c00ed586c22a46ad4e773d9ff65c8ed3b8e98b9f51" +checksum = "4bb2d292eb90452dcb0909fb44e74bf04395e3ffa37a66c0f1635a00600382a4" dependencies = [ "ahash 0.8.3", "hash-db", @@ -10991,9 +10977,9 @@ dependencies = [ [[package]] name = "sp-version" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a8d11b816cd2c68467c697aecca868ab5828af02ef093681a88554d045b878" +checksum = "125da59ea46ecb23860e7d895f6f2882f596b71ffca0ae4887558aac541f4342" dependencies = [ "impl-serde", "parity-scale-codec", @@ -11009,21 +10995,21 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6de7bbf860de93bb9b0ccd8e4a74e0dc40089e7192c397bac2b357d4da74e20c" +checksum = "92897ffa04436cbd100c49ea1f8b637cb68e2a9fe144115f4b545b5ace2f47e2" dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] name = "sp-wasm-interface" -version = "16.0.0" +version = "17.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee009ac79098027f5990984e0c5ee2fd4883b16bbd6ab97931f28c2148aaa3ea" +checksum = "bf43bb0c8eb76dc41057ce0fb6b744b94c9aec28b31dff53a1efc4f04ef25384" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -11035,9 +11021,9 @@ dependencies = [ [[package]] name = "sp-weights" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86566cae93412e40bea0db9e6b110a7379105412a9aed1af73b5d2fb69cb7000" +checksum = "4e1cef0aad13ed8a8522a6e86ace16fb97ab220c16d2357e628352b528582693" dependencies = [ "parity-scale-codec", "scale-info", @@ -11222,9 +11208,9 @@ dependencies = [ [[package]] name = "staging-parachain-info" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1938a5d4938701c5a1ffd9c6cac6e906e219d85557f061f55f9f41e8d886c6" +checksum = "1a5bab12d15197074042e4f63034a58a1fad1abca3c779b9623696e163f549b5" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -11237,9 +11223,9 @@ dependencies = [ [[package]] name = "staging-xcm" -version = "2.0.1" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eec456fd5fcbc4dffe9c6042b452c1930eb1d5af5534d6ef36b8238b4517c9b7" +checksum = "5b199be791bd630ec9edc78b3896826d802f59202739a73cca5d0cd4d95b6088" dependencies = [ "bounded-collections", "derivative", @@ -11255,9 +11241,9 @@ dependencies = [ [[package]] name = "staging-xcm-builder" -version = "2.0.1" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c1ca6d8f2b7fcbfe8866c1a1cb8105b62c72a74e727dd8c9943e8ac0c410eb" +checksum = "855a422587cd951cae29249a6011c18c55486e6f4ae44f1dad1e971413eac880" dependencies = [ "frame-support", "frame-system", @@ -11278,9 +11264,9 @@ dependencies = [ [[package]] name = "staging-xcm-executor" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2ab1d434de75fb698d07d863ebede9745bd500d0284c659055201024627ca" +checksum = "a50ece4a1d0651af4ccb78170e8008a44cd119ee4fdf5190d997c78e24e46a03" dependencies = [ "environmental", "frame-benchmarking", @@ -11393,9 +11379,9 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "055e4661d7d20f68388a26419216035df64a06f34506b947c8a6e2db49d85461" +checksum = "7e99fe4e955b8d7c25bd3a88a6907933867d11ef6194ef935e865a9e87c320ff" dependencies = [ "hyper", "log", @@ -11406,9 +11392,9 @@ dependencies = [ [[package]] name = "substrate-rpc-client" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c3d8512f21a03e4eda6b3bb6da45c6840266c66f82a31b57eb183b33d67c7f2" +checksum = "624257055386482adba21684a4af2cebdbaf0a8dd0e1b7cd9eec05b564afa5db" dependencies = [ "async-trait", "jsonrpsee", @@ -11420,9 +11406,9 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" -version = "12.0.0" +version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e792ccae135d69e0bc0eaeafc649e356cc9844017502496364d6b13db09e18" +checksum = "3a23975404eca6d81818f3f3d4ecde9635dae3e616f366dbc1a0d510c86f02a2" dependencies = [ "ansi_term", "build-helper", @@ -11465,9 +11451,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.31" +version = "2.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" dependencies = [ "proc-macro2", "quote", @@ -11564,7 +11550,7 @@ checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -11739,7 +11725,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -11895,7 +11881,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -11920,9 +11906,9 @@ dependencies = [ [[package]] name = "tracing-gum" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d0644282db9729b5e373c01e8c8ba6d239e18989749c8aead177fe293eb5ca" +checksum = "388d505e3d23a34f23f4093937252f9a3a874184083680292a3c80f16c2937a7" dependencies = [ "coarsetime", "polkadot-node-jaeger", @@ -11933,15 +11919,15 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599cd79d4843008763dd613a19ca7d28e12e6c43ab69fc5089b7ce587dd8e021" +checksum = "e0f4ac73c340c95608556d9a52545c227be6b262ab3f3039a4dc005aad449bff" dependencies = [ "expander 2.0.0", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -11990,9 +11976,9 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.27.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "767abe6ffed88a1889671a102c2861ae742726f52e0a5a425b92c9fbfa7e9c85" +checksum = "ff28e0f815c2fea41ebddf148e008b077d2faddb026c9555b29696114d602642" dependencies = [ "hash-db", "hashbrown 0.13.2", @@ -12311,7 +12297,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", "wasm-bindgen-shared", ] @@ -12345,7 +12331,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -12889,9 +12875,9 @@ dependencies = [ [[package]] name = "westend-runtime-constants" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c4085403f25dda1eb8ce8859a118f9681c35687e893a8a2511179f7436643a" +checksum = "281a188361cdcd28ade41bfca74d1b52f28bb6eb8f51bfd15ca3be721396ab75" dependencies = [ "frame-support", "polkadot-primitives", @@ -13234,14 +13220,14 @@ dependencies = [ [[package]] name = "xcm-procedural" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bde452a547dd6926f94539b113171419b10d2b642a59cad296754259733bca6" +checksum = "5d69991e802386307acc13e9d67004da522d083fe338111fe79c4317878445e4" dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] @@ -13284,7 +13270,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.31", + "syn 2.0.38", ] [[package]] diff --git a/relay/kusama/Cargo.toml b/relay/kusama/Cargo.toml index f6e6fd995a..f458a0676e 100644 --- a/relay/kusama/Cargo.toml +++ b/relay/kusama/Cargo.toml @@ -19,112 +19,112 @@ serde_derive = { version = "1.0.117", optional = true } static_assertions = "1.1.0" smallvec = "1.8.0" -authority-discovery-primitives = { package = "sp-authority-discovery", default-features = false , version = "21.0.0" } -babe-primitives = { package = "sp-consensus-babe", default-features = false , version = "0.27.0" } -beefy-primitives = { package = "sp-consensus-beefy", default-features = false , version = "8.0.0" } -binary-merkle-tree = { default-features = false , version = "8.0.0" } +authority-discovery-primitives = { package = "sp-authority-discovery", default-features = false , version = "22.0.0" } +babe-primitives = { package = "sp-consensus-babe", default-features = false , version = "0.28.0" } +beefy-primitives = { package = "sp-consensus-beefy", default-features = false , version = "9.0.0" } +binary-merkle-tree = { default-features = false , version = "9.0.0" } kusama-runtime-constants = { package = "kusama-runtime-constants", path = "constants", default-features = false } -sp-api = { default-features = false , version = "21.0.0" } -inherents = { package = "sp-inherents", default-features = false , version = "21.0.0" } -offchain-primitives = { package = "sp-offchain", default-features = false , version = "21.0.0" } -sp-std = { package = "sp-std", default-features = false , version = "10.0.0" } -sp-application-crypto = { default-features = false , version = "25.0.0" } -sp-arithmetic = { default-features = false , version = "18.0.0" } -sp-io = { default-features = false , version = "25.0.0" } -sp-mmr-primitives = { default-features = false , version = "21.0.0" } -sp-runtime = { default-features = false , version = "26.0.0" } -sp-staking = { default-features = false , version = "21.0.0" } -sp-core = { default-features = false , version = "23.0.0" } -sp-session = { default-features = false , version = "22.0.0" } -sp-storage = { default-features = false , version = "15.0.0" } -sp-version = { default-features = false , version = "24.0.0" } -tx-pool-api = { package = "sp-transaction-pool", default-features = false , version = "21.0.0" } -block-builder-api = { package = "sp-block-builder", default-features = false , version = "21.0.0" } -sp-npos-elections = { default-features = false , version = "21.0.0" } +sp-api = { default-features = false , version = "22.0.0" } +inherents = { package = "sp-inherents", default-features = false , version = "22.0.0" } +offchain-primitives = { package = "sp-offchain", default-features = false , version = "22.0.0" } +sp-std = { package = "sp-std", default-features = false , version = "11.0.0" } +sp-application-crypto = { default-features = false , version = "26.0.0" } +sp-arithmetic = { default-features = false , version = "19.0.0" } +sp-io = { default-features = false , version = "26.0.0" } +sp-mmr-primitives = { default-features = false , version = "22.0.0" } +sp-runtime = { default-features = false , version = "27.0.0" } +sp-staking = { default-features = false , version = "22.0.0" } +sp-core = { default-features = false , version = "24.0.0" } +sp-session = { default-features = false , version = "23.0.0" } +sp-storage = { default-features = false , version = "16.0.0" } +sp-version = { default-features = false , version = "25.0.0" } +tx-pool-api = { package = "sp-transaction-pool", default-features = false , version = "22.0.0" } +block-builder-api = { package = "sp-block-builder", default-features = false , version = "22.0.0" } +sp-npos-elections = { default-features = false , version = "22.0.0" } -pallet-authority-discovery = { default-features = false , version = "23.0.0" } -pallet-authorship = { default-features = false , version = "23.0.0" } -pallet-babe = { default-features = false , version = "23.0.0" } -pallet-bags-list = { default-features = false , version = "22.0.0" } -pallet-balances = { default-features = false , version = "23.0.0" } -pallet-beefy = { default-features = false , version = "23.0.0" } -pallet-beefy-mmr = { default-features = false , version = "23.0.0" } -pallet-bounties = { default-features = false , version = "22.0.0" } -pallet-child-bounties = { default-features = false , version = "22.0.0" } -pallet-transaction-payment = { default-features = false , version = "23.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false , version = "23.0.0" } -pallet-nomination-pools-runtime-api = { default-features = false , version = "18.0.0" } -pallet-collective = { default-features = false , version = "23.0.0" } -pallet-conviction-voting = { default-features = false , version = "23.0.0" } -pallet-democracy = { default-features = false , version = "23.0.0" } -pallet-elections-phragmen = { default-features = false , version = "24.0.0" } -pallet-election-provider-multi-phase = { default-features = false , version = "22.0.0" } -pallet-fast-unstake = { default-features = false , version = "22.0.0" } -frame-executive = { default-features = false , version = "23.0.0" } -pallet-grandpa = { default-features = false , version = "23.0.0" } -pallet-nis = { default-features = false , version = "23.0.0" } -pallet-identity = { default-features = false , version = "23.0.0" } -pallet-im-online = { default-features = false , version = "22.0.0" } -pallet-indices = { default-features = false , version = "23.0.0" } -pallet-membership = { default-features = false , version = "23.0.0" } -pallet-message-queue = { default-features = false , version = "26.0.0" } -pallet-mmr = { default-features = false , version = "22.0.0" } -pallet-multisig = { default-features = false , version = "23.0.0" } -pallet-nomination-pools = { default-features = false , version = "20.0.0" } -pallet-offences = { default-features = false , version = "22.0.0" } -pallet-preimage = { default-features = false , version = "23.0.0" } -pallet-proxy = { default-features = false , version = "23.0.0" } -pallet-ranked-collective = { default-features = false , version = "23.0.0" } -pallet-recovery = { default-features = false , version = "23.0.0" } -pallet-referenda = { default-features = false , version = "23.0.0" } -pallet-scheduler = { default-features = false , version = "24.0.0" } -pallet-session = { default-features = false , version = "23.0.0" } -pallet-society = { default-features = false, features = ["experimental"] , version = "23.0.0" } -frame-support = { default-features = false , version = "23.0.0" } -pallet-staking = { default-features = false , version = "23.0.0" } -pallet-state-trie-migration = { default-features = false , version = "24.0.0" } -pallet-staking-runtime-api = { default-features = false , version = "9.0.0" } -frame-system = { default-features = false , version = "23.0.0" } -frame-system-rpc-runtime-api = { default-features = false , version = "21.0.0" } -pallet-timestamp = { default-features = false , version = "22.0.0" } -pallet-tips = { default-features = false , version = "22.0.0" } -pallet-treasury = { default-features = false , version = "22.0.0" } -pallet-utility = { default-features = false , version = "23.0.0" } -pallet-vesting = { default-features = false , version = "23.0.0" } -pallet-whitelist = { default-features = false , version = "22.0.0" } -pallet-xcm = { default-features = false , version = "2.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "2.0.0" } -frame-election-provider-support = { default-features = false , version = "23.0.0" } +pallet-authority-discovery = { default-features = false , version = "24.0.0" } +pallet-authorship = { default-features = false , version = "24.0.0" } +pallet-babe = { default-features = false , version = "24.0.0" } +pallet-bags-list = { default-features = false , version = "23.0.0" } +pallet-balances = { default-features = false , version = "24.0.0" } +pallet-beefy = { default-features = false , version = "24.0.0" } +pallet-beefy-mmr = { default-features = false , version = "24.0.0" } +pallet-bounties = { default-features = false , version = "23.0.0" } +pallet-child-bounties = { default-features = false , version = "23.0.0" } +pallet-transaction-payment = { default-features = false , version = "24.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false , version = "24.0.0" } +pallet-nomination-pools-runtime-api = { default-features = false , version = "19.0.0" } +pallet-collective = { default-features = false , version = "24.0.0" } +pallet-conviction-voting = { default-features = false , version = "24.0.0" } +pallet-democracy = { default-features = false , version = "24.0.0" } +pallet-elections-phragmen = { default-features = false , version = "25.0.0" } +pallet-election-provider-multi-phase = { default-features = false , version = "23.0.0" } +pallet-fast-unstake = { default-features = false , version = "23.0.0" } +frame-executive = { default-features = false , version = "24.0.0" } +pallet-grandpa = { default-features = false , version = "24.0.0" } +pallet-nis = { default-features = false , version = "24.0.0" } +pallet-identity = { default-features = false , version = "24.0.0" } +pallet-im-online = { default-features = false , version = "23.0.0" } +pallet-indices = { default-features = false , version = "24.0.0" } +pallet-membership = { default-features = false , version = "24.0.0" } +pallet-message-queue = { default-features = false , version = "27.0.0" } +pallet-mmr = { default-features = false , version = "23.0.0" } +pallet-multisig = { default-features = false , version = "24.0.0" } +pallet-nomination-pools = { default-features = false , version = "21.0.0" } +pallet-offences = { default-features = false , version = "23.0.0" } +pallet-preimage = { default-features = false , version = "24.0.0" } +pallet-proxy = { default-features = false , version = "24.0.0" } +pallet-ranked-collective = { default-features = false , version = "24.0.0" } +pallet-recovery = { default-features = false , version = "24.0.0" } +pallet-referenda = { default-features = false , version = "24.0.0" } +pallet-scheduler = { default-features = false , version = "25.0.0" } +pallet-session = { default-features = false , version = "24.0.0" } +pallet-society = { default-features = false, version = "24.0.0" } +frame-support = { default-features = false , version = "24.0.0" } +pallet-staking = { default-features = false , version = "24.0.0" } +pallet-state-trie-migration = { default-features = false , version = "25.0.0" } +pallet-staking-runtime-api = { default-features = false , version = "10.0.0" } +frame-system = { default-features = false , version = "24.0.0" } +frame-system-rpc-runtime-api = { default-features = false , version = "22.0.0" } +pallet-timestamp = { default-features = false , version = "23.0.0" } +pallet-tips = { default-features = false , version = "23.0.0" } +pallet-treasury = { default-features = false , version = "23.0.0" } +pallet-utility = { default-features = false , version = "24.0.0" } +pallet-vesting = { default-features = false , version = "24.0.0" } +pallet-whitelist = { default-features = false , version = "23.0.0" } +pallet-xcm = { default-features = false , version = "3.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } +frame-election-provider-support = { default-features = false , version = "24.0.0" } -frame-benchmarking = { default-features = false, optional = true , version = "23.0.0" } -frame-try-runtime = { default-features = false, optional = true , version = "0.29.0" } -pallet-offences-benchmarking = { default-features = false, optional = true , version = "23.0.0" } -pallet-session-benchmarking = { default-features = false, optional = true , version = "23.0.0" } -pallet-nomination-pools-benchmarking = { default-features = false, optional = true , version = "21.0.0" } -frame-system-benchmarking = { default-features = false, optional = true , version = "23.0.0" } -pallet-election-provider-support-benchmarking = { default-features = false, optional = true , version = "22.0.0" } +frame-benchmarking = { default-features = false, optional = true , version = "24.0.0" } +frame-try-runtime = { default-features = false, optional = true , version = "0.30.0" } +pallet-offences-benchmarking = { default-features = false, optional = true , version = "24.0.0" } +pallet-session-benchmarking = { default-features = false, optional = true , version = "24.0.0" } +pallet-nomination-pools-benchmarking = { default-features = false, optional = true , version = "22.0.0" } +frame-system-benchmarking = { default-features = false, optional = true , version = "24.0.0" } +pallet-election-provider-support-benchmarking = { default-features = false, optional = true , version = "23.0.0" } hex-literal = "0.4.1" -runtime-common = { package = "polkadot-runtime-common", default-features = false, features = ["experimental"] , version = "2.0.0" } -runtime-parachains = { package = "polkadot-runtime-parachains", default-features = false , version = "2.0.0" } -primitives = { package = "polkadot-primitives", default-features = false , version = "2.0.0" } +runtime-common = { package = "polkadot-runtime-common", default-features = false, version = "3.0.0" } +runtime-parachains = { package = "polkadot-runtime-parachains", default-features = false , version = "3.0.0" } +primitives = { package = "polkadot-primitives", default-features = false , version = "3.0.0" } -xcm = { package = "staging-xcm", default-features = false , version = "2.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false , version = "2.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "2.0.1" } +xcm = { package = "staging-xcm", default-features = false , version = "3.0.1" } +xcm-executor = { package = "staging-xcm-executor", default-features = false , version = "3.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "3.0.1" } [dev-dependencies] tiny-keccak = { version = "2.0.2", features = ["keccak"] } -keyring = { package = "sp-keyring", version = "26.0.0" } -sp-trie = { version = "24.0.0" } +keyring = { package = "sp-keyring", version = "27.0.0" } +sp-trie = { version = "25.0.0" } separator = "0.4.1" serde_json = "1.0.96" -remote-externalities = { package = "frame-remote-externalities", version = "0.30.0" } +remote-externalities = { package = "frame-remote-externalities" , version = "0.31.0" } tokio = { version = "1.24.2", features = ["macros"] } -sp-tracing = { default-features = false , version = "12.0.0" } +sp-tracing = { default-features = false , version = "13.0.0" } [build-dependencies] -substrate-wasm-builder = { version = "12.0.0" } +substrate-wasm-builder = { version = "13.0.0" } [features] default = [ "std" ] diff --git a/relay/kusama/constants/Cargo.toml b/relay/kusama/constants/Cargo.toml index d2f32861a1..5ac1bca49a 100644 --- a/relay/kusama/constants/Cargo.toml +++ b/relay/kusama/constants/Cargo.toml @@ -9,12 +9,12 @@ license.workspace = true [dependencies] smallvec = "1.8.0" -frame-support = { default-features = false , version = "23.0.0" } -primitives = { package = "polkadot-primitives", default-features = false , version = "2.0.0" } -runtime-common = { package = "polkadot-runtime-common", default-features = false , version = "2.0.0" } -sp-runtime = { default-features = false , version = "26.0.0" } -sp-weights = { default-features = false , version = "22.0.0" } -sp-core = { default-features = false , version = "23.0.0" } +frame-support = { default-features = false , version = "24.0.0" } +primitives = { package = "polkadot-primitives", default-features = false , version = "3.0.0" } +runtime-common = { package = "polkadot-runtime-common", default-features = false , version = "3.0.0" } +sp-runtime = { default-features = false , version = "27.0.0" } +sp-weights = { default-features = false , version = "23.0.0" } +sp-core = { default-features = false , version = "24.0.0" } [features] default = [ "std" ] diff --git a/relay/kusama/src/lib.rs b/relay/kusama/src/lib.rs index 8900d60d0b..8c98d1475c 100644 --- a/relay/kusama/src/lib.rs +++ b/relay/kusama/src/lib.rs @@ -46,7 +46,7 @@ use runtime_parachains::{ inclusion::{AggregateMessageOrigin, UmpQueueId}, initializer as parachains_initializer, origin as parachains_origin, paras as parachains_paras, paras_inherent as parachains_paras_inherent, reward_points as parachains_reward_points, - runtime_api_impl::v5 as parachains_runtime_api_impl, + runtime_api_impl::v7 as parachains_runtime_api_impl, scheduler as parachains_scheduler, session_info as parachains_session_info, shared as parachains_shared, }; @@ -63,8 +63,9 @@ use frame_election_provider_support::{ use frame_support::{ construct_runtime, parameter_types, traits::{ - ConstU32, Contains, EitherOf, EitherOfDiverse, InstanceFilter, KeyOwnerProofSystem, - PrivilegeCmp, ProcessMessage, ProcessMessageError, StorageMapShim, WithdrawReasons, + fungible::HoldConsideration, ConstU32, Contains, EitherOf, EitherOfDiverse, InstanceFilter, + KeyOwnerProofSystem, LinearStoragePrice, PrivilegeCmp, ProcessMessage, ProcessMessageError, + StorageMapShim, WithdrawReasons, }, weights::{ConstantMultiplier, WeightMeter}, PalletId, @@ -92,7 +93,7 @@ use xcm::latest::Junction; pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; -pub use pallet_election_provider_multi_phase::Call as EPMCall; +pub use pallet_election_provider_multi_phase::{Call as EPMCall, GeometricDepositBase}; #[cfg(feature = "std")] pub use pallet_staking::StakerStatus; use pallet_staking::UseValidatorsMap; @@ -109,8 +110,6 @@ mod weights; // Voter bag threshold definitions. mod bag_thresholds; -mod paras_scheduler_migration; - // Historical information of society finances. mod past_payouts; @@ -241,6 +240,8 @@ impl pallet_scheduler::Config for Runtime { parameter_types! { pub const PreimageBaseDeposit: Balance = deposit(2, 64); pub const PreimageByteDeposit: Balance = deposit(0, 1); + pub const PreimageHoldReason: RuntimeHoldReason = + RuntimeHoldReason::Preimage(pallet_preimage::HoldReason::Preimage); } impl pallet_preimage::Config for Runtime { @@ -248,8 +249,12 @@ impl pallet_preimage::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; type ManagerOrigin = EnsureRoot; - type BaseDeposit = PreimageBaseDeposit; - type ByteDeposit = PreimageByteDeposit; + type Consideration = HoldConsideration< + AccountId, + Balances, + PreimageHoldReason, + LinearStoragePrice, + >; } parameter_types! { @@ -507,7 +512,8 @@ parameter_types! { // signed config pub const SignedMaxSubmissions: u32 = 16; pub const SignedMaxRefunds: u32 = 16 / 4; - pub const SignedDepositBase: Balance = deposit(2, 0); + pub const SignedFixedDeposit: Balance = deposit(2, 0); + pub const SignedDepositIncreaseFactor: Percent = Percent::from_percent(10); pub const SignedDepositByte: Balance = deposit(0, 10) / 1024; // Each good submission will get 1/10 KSM as reward pub SignedRewardBase: Balance = UNITS / 10; @@ -580,7 +586,8 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type SignedMaxSubmissions = SignedMaxSubmissions; type SignedMaxRefunds = SignedMaxRefunds; type SignedRewardBase = SignedRewardBase; - type SignedDepositBase = SignedDepositBase; + type SignedDepositBase = + GeometricDepositBase; type SignedDepositByte = SignedDepositByte; type SignedDepositWeight = (); type SignedMaxWeight = @@ -1562,7 +1569,7 @@ construct_runtime! { Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 31, // Preimage registrar. - Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 32, + Preimage: pallet_preimage::{Pallet, Call, Storage, Event, HoldReason} = 32, // Bounties modules. Bounties: pallet_bounties::{Pallet, Call, Storage, Event} = 35, @@ -1736,7 +1743,6 @@ pub mod migrations { >, pallet_im_online::migration::v1::Migration, parachains_configuration::migration::v7::MigrateToV7, - paras_scheduler_migration::v1::MigrateToV1, parachains_configuration::migration::v8::MigrateToV8, // Unlock/unreserve balances from Gov v1 pallets that hold them @@ -2480,7 +2486,7 @@ mod fees_tests { fn signed_deposit_is_sensible() { // ensure this number does not change, or that it is checked after each change. // a 1 MB solution should need around 0.16 KSM deposit - let deposit = SignedDepositBase::get() + (SignedDepositByte::get() * 1024 * 1024); + let deposit = SignedFixedDeposit::get() + (SignedDepositByte::get() * 1024 * 1024); assert_eq_error_rate!(deposit, UNITS * 167 / 100, UNITS / 100); } } diff --git a/relay/kusama/src/paras_scheduler_migration.rs b/relay/kusama/src/paras_scheduler_migration.rs deleted file mode 100644 index d294861843..0000000000 --- a/relay/kusama/src/paras_scheduler_migration.rs +++ /dev/null @@ -1,218 +0,0 @@ -//! A copy of the migration found in the polkadot sdk repo. -//! -//! It is copied as the version of the migration found in the crate used by this runtime is broken. - -use frame_support::{ - migrations::VersionedMigration, pallet_prelude::ValueQuery, storage_alias, - traits::OnRuntimeUpgrade, weights::Weight, -}; -use frame_system::pallet_prelude::BlockNumberFor; -use parity_scale_codec::{Decode, Encode}; -use primitives::{ - v5::{Assignment, ParasEntry}, - CoreIndex, CoreOccupied, GroupIndex, Id as ParaId, -}; -use runtime_parachains::scheduler::*; -use scale_info::TypeInfo; -use sp_core::{Get, RuntimeDebug}; -use sp_std::{ - collections::{btree_map::BTreeMap, vec_deque::VecDeque}, - prelude::*, -}; - -const LOG_TARGET: &str = "runtime::parachains::scheduler"; - -mod v0 { - use super::*; - - use primitives::{CollatorId, Id}; - - #[storage_alias] - pub(super) type Scheduled = StorageValue, Vec, ValueQuery>; - - #[derive(Clone, Encode, Decode)] - #[cfg_attr(feature = "std", derive(PartialEq))] - pub struct ParathreadClaim(pub Id, pub CollatorId); - - #[derive(Clone, Encode, Decode)] - #[cfg_attr(feature = "std", derive(PartialEq))] - pub struct ParathreadEntry { - /// The claim. - pub claim: ParathreadClaim, - /// Number of retries. - pub retries: u32, - } - - /// What is occupying a specific availability core. - #[derive(Clone, Encode, Decode)] - #[cfg_attr(feature = "std", derive(PartialEq))] - pub enum CoreOccupied { - /// A parathread. - Parathread(ParathreadEntry), - /// A parachain. - Parachain, - } - - /// The actual type isn't important, as we only delete the key in the state. - #[storage_alias] - pub(crate) type AvailabilityCores = - StorageValue, Vec>, ValueQuery>; - - /// The actual type isn't important, as we only delete the key in the state. - #[storage_alias] - pub(super) type ParathreadQueue = StorageValue, (), ValueQuery>; - - #[storage_alias] - pub(super) type ParathreadClaimIndex = StorageValue, (), ValueQuery>; - - /// The assignment type. - #[derive(Clone, Encode, Decode, TypeInfo, RuntimeDebug)] - #[cfg_attr(feature = "std", derive(PartialEq))] - pub enum AssignmentKind { - /// A parachain. - Parachain, - /// A parathread. - Parathread(CollatorId, u32), - } - - /// How a free core is scheduled to be assigned. - #[derive(Clone, Encode, Decode, TypeInfo, RuntimeDebug)] - #[cfg_attr(feature = "std", derive(PartialEq))] - pub struct CoreAssignment { - /// The core that is assigned. - pub core: CoreIndex, - /// The unique ID of the para that is assigned to the core. - pub para_id: ParaId, - /// The kind of the assignment. - pub kind: AssignmentKind, - /// The index of the validator group assigned to the core. - pub group_idx: GroupIndex, - } -} - -pub mod v1 { - use super::*; - - #[storage_alias] - pub(crate) type AvailabilityCores = - StorageValue, Vec>>, ValueQuery>; - - #[storage_alias] - pub(crate) type ClaimQueue = StorageValue< - Pallet, - BTreeMap>>>>, - ValueQuery, - >; - - #[allow(deprecated)] - pub type MigrateToV1 = VersionedMigration< - 0, - 1, - UncheckedMigrateToV1, - Pallet, - ::DbWeight, - >; - - #[deprecated(note = "Use MigrateToV1 instead")] - pub struct UncheckedMigrateToV1(sp_std::marker::PhantomData); - #[allow(deprecated)] - impl OnRuntimeUpgrade for UncheckedMigrateToV1 { - fn on_runtime_upgrade() -> Weight { - let weight_consumed = migrate_to_v1::(); - - log::info!(target: LOG_TARGET, "Migrating para scheduler storage to v1"); - - weight_consumed - } - - #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::DispatchError> { - let n: u32 = v0::Scheduled::::get().len() as u32 + - v0::AvailabilityCores::::get().iter().filter(|c| c.is_some()).count() as u32; - - log::info!( - target: LOG_TARGET, - "Number of scheduled and waiting for availability before: {n}", - ); - - Ok(n.encode()) - } - - #[cfg(feature = "try-runtime")] - fn post_upgrade(state: Vec) -> Result<(), sp_runtime::DispatchError> { - log::info!(target: LOG_TARGET, "Running post_upgrade()"); - - frame_support::ensure!( - v0::Scheduled::::get().is_empty(), - "Scheduled should be empty after the migration" - ); - - let expected_len = u32::decode(&mut &state[..]).unwrap(); - let availability_cores_waiting = AvailabilityCores::::get() - .iter() - .filter(|c| !matches!(c, CoreOccupied::Free)) - .count(); - - frame_support::ensure!( - ClaimQueue::::get().iter().map(|la_vec| la_vec.1.len()).sum::() as u32 + - availability_cores_waiting as u32 == - expected_len, - "ClaimQueue and AvailabilityCores should have the correct length", - ); - - Ok(()) - } - } -} - -pub fn migrate_to_v1() -> Weight { - let mut weight: Weight = Weight::zero(); - - v0::ParathreadQueue::::kill(); - v0::ParathreadClaimIndex::::kill(); - - let now = >::block_number(); - let scheduled = v0::Scheduled::::take(); - let sched_len = scheduled.len() as u64; - for core_assignment in scheduled { - let core_idx = core_assignment.core; - let assignment = Assignment::new(core_assignment.para_id); - let pe = ParasEntry::new(assignment, now); - - v1::ClaimQueue::::mutate(|la| { - la.entry(core_idx).or_default().push_back(Some(pe)); - }); - } - - let parachains = runtime_parachains::paras::Pallet::::parachains(); - let availability_cores = v0::AvailabilityCores::::take(); - let mut new_availability_cores = Vec::new(); - - for (core_index, core) in availability_cores.into_iter().enumerate() { - let new_core = if let Some(core) = core { - match core { - v0::CoreOccupied::Parachain => CoreOccupied::Paras(ParasEntry::new( - Assignment::new(parachains[core_index]), - now, - )), - v0::CoreOccupied::Parathread(entry) => - CoreOccupied::Paras(ParasEntry::new(Assignment::new(entry.claim.0), now)), - } - } else { - CoreOccupied::Free - }; - - new_availability_cores.push(new_core); - } - - v1::AvailabilityCores::::set(new_availability_cores); - - // 2x as once for Scheduled and once for Claimqueue - weight = weight.saturating_add(T::DbWeight::get().reads_writes(2 * sched_len, 2 * sched_len)); - // reading parachains + availability_cores, writing AvailabilityCores - weight = weight.saturating_add(T::DbWeight::get().reads_writes(2, 1)); - // 2x kill - weight = weight.saturating_add(T::DbWeight::get().writes(2)); - - weight -} diff --git a/relay/kusama/src/weights/pallet_preimage.rs b/relay/kusama/src/weights/pallet_preimage.rs index ddb39cc858..1240693cd9 100644 --- a/relay/kusama/src/weights/pallet_preimage.rs +++ b/relay/kusama/src/weights/pallet_preimage.rs @@ -210,4 +210,25 @@ impl pallet_preimage::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `Preimage::StatusFor` (r:1024 w:1024) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:0 w:1024) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 1024]`. + fn ensure_updated(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `193 + n * (91 ±0)` + // Estimated: `3593 + n * (2566 ±0)` + // Minimum execution time: 2_452_000 picoseconds. + Weight::from_parts(2_641_000, 3593) + // Standard Error: 19_797 + .saturating_add(Weight::from_parts(15_620_946, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes(1_u64)) + .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2566).saturating_mul(n.into())) + } } diff --git a/relay/kusama/src/weights/runtime_parachains_hrmp.rs b/relay/kusama/src/weights/runtime_parachains_hrmp.rs index a8853e8a55..84e9b99080 100644 --- a/relay/kusama/src/weights/runtime_parachains_hrmp.rs +++ b/relay/kusama/src/weights/runtime_parachains_hrmp.rs @@ -275,4 +275,46 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(8)) } + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:1 w:0) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn establish_system_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `417` + // Estimated: `6357` + // Minimum execution time: 629_674_000 picoseconds. + Weight::from_parts(640_174_000, 0) + .saturating_add(Weight::from_parts(0, 6357)) + .saturating_add(T::DbWeight::get().reads(12)) + .saturating_add(T::DbWeight::get().writes(8)) + } + /// Storage: `Hrmp::HrmpChannels` (r:1 w:1) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn poke_channel_deposits() -> Weight { + // Proof Size summary in bytes: + // Measured: `263` + // Estimated: `3728` + // Minimum execution time: 173_371_000 picoseconds. + Weight::from_parts(175_860_000, 0) + .saturating_add(Weight::from_parts(0, 3728)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/relay/polkadot/Cargo.toml b/relay/polkadot/Cargo.toml index 3c72f30e09..65c31fd197 100644 --- a/relay/polkadot/Cargo.toml +++ b/relay/polkadot/Cargo.toml @@ -18,105 +18,105 @@ serde_derive = { version = "1.0.117", optional = true } static_assertions = "1.1.0" smallvec = "1.8.0" -authority-discovery-primitives = { package = "sp-authority-discovery", default-features = false , version = "21.0.0" } -babe-primitives = { package = "sp-consensus-babe", default-features = false , version = "0.27.0" } -beefy-primitives = { package = "sp-consensus-beefy", default-features = false , version = "8.0.0" } -block-builder-api = { package = "sp-block-builder", default-features = false , version = "21.0.0" } -inherents = { package = "sp-inherents", default-features = false , version = "21.0.0" } -offchain-primitives = { package = "sp-offchain", default-features = false , version = "21.0.0" } -tx-pool-api = { package = "sp-transaction-pool", default-features = false , version = "21.0.0" } -sp-arithmetic = { default-features = false , version = "18.0.0" } -sp-api = { default-features = false , version = "21.0.0" } -sp-std = { default-features = false , version = "10.0.0" } -sp-io = { default-features = false , version = "25.0.0" } -sp-mmr-primitives = { default-features = false , version = "21.0.0" } -sp-runtime = { default-features = false , version = "26.0.0" } -sp-staking = { default-features = false , version = "21.0.0" } -sp-core = { default-features = false , version = "23.0.0" } -sp-session = { default-features = false , version = "22.0.0" } -sp-storage = { default-features = false , version = "15.0.0" } -sp-version = { default-features = false , version = "24.0.0" } -sp-npos-elections = { default-features = false , version = "21.0.0" } +authority-discovery-primitives = { package = "sp-authority-discovery", default-features = false , version = "22.0.0" } +babe-primitives = { package = "sp-consensus-babe", default-features = false , version = "0.28.0" } +beefy-primitives = { package = "sp-consensus-beefy", default-features = false , version = "9.0.0" } +block-builder-api = { package = "sp-block-builder", default-features = false , version = "22.0.0" } +inherents = { package = "sp-inherents", default-features = false , version = "22.0.0" } +offchain-primitives = { package = "sp-offchain", default-features = false , version = "22.0.0" } +tx-pool-api = { package = "sp-transaction-pool", default-features = false , version = "22.0.0" } +sp-arithmetic = { default-features = false , version = "19.0.0" } +sp-api = { default-features = false , version = "22.0.0" } +sp-std = { default-features = false , version = "11.0.0" } +sp-io = { default-features = false , version = "26.0.0" } +sp-mmr-primitives = { default-features = false , version = "22.0.0" } +sp-runtime = { default-features = false , version = "27.0.0" } +sp-staking = { default-features = false , version = "22.0.0" } +sp-core = { default-features = false , version = "24.0.0" } +sp-session = { default-features = false , version = "23.0.0" } +sp-storage = { default-features = false , version = "16.0.0" } +sp-version = { default-features = false , version = "25.0.0" } +sp-npos-elections = { default-features = false , version = "22.0.0" } -pallet-authority-discovery = { default-features = false , version = "23.0.0" } -pallet-authorship = { default-features = false , version = "23.0.0" } -pallet-babe = { default-features = false , version = "23.0.0" } -pallet-bags-list = { default-features = false , version = "22.0.0" } -pallet-balances = { default-features = false , version = "23.0.0" } -pallet-bounties = { default-features = false , version = "22.0.0" } -pallet-child-bounties = { default-features = false , version = "22.0.0" } -pallet-transaction-payment = { default-features = false , version = "23.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false , version = "23.0.0" } -pallet-collective = { default-features = false , version = "23.0.0" } -pallet-conviction-voting = { default-features = false , version = "23.0.0" } -pallet-democracy = { default-features = false , version = "23.0.0" } -pallet-elections-phragmen = { default-features = false , version = "24.0.0" } -pallet-election-provider-multi-phase = { default-features = false , version = "22.0.0" } -pallet-fast-unstake = { default-features = false , version = "22.0.0" } -frame-executive = { default-features = false , version = "23.0.0" } -pallet-grandpa = { default-features = false , version = "23.0.0" } -pallet-identity = { default-features = false , version = "23.0.0" } -pallet-im-online = { default-features = false , version = "22.0.0" } -pallet-indices = { default-features = false , version = "23.0.0" } -pallet-membership = { default-features = false , version = "23.0.0" } -pallet-message-queue = { default-features = false , version = "26.0.0" } -pallet-multisig = { default-features = false , version = "23.0.0" } -pallet-nomination-pools = { default-features = false , version = "20.0.0" } -pallet-nomination-pools-runtime-api = { default-features = false , version = "18.0.0" } -pallet-offences = { default-features = false , version = "22.0.0" } -pallet-preimage = { default-features = false , version = "23.0.0" } -pallet-proxy = { default-features = false , version = "23.0.0" } -pallet-referenda = { default-features = false , version = "23.0.0" } -pallet-scheduler = { default-features = false , version = "24.0.0" } -pallet-session = { default-features = false , version = "23.0.0" } -frame-support = { default-features = false , version = "23.0.0" } -pallet-staking = { default-features = false , version = "23.0.0" } -pallet-staking-reward-fn = { default-features = false, version = "14.0.0" } -pallet-staking-reward-curve = { version = "8.0.0" } -pallet-staking-runtime-api = { default-features = false , version = "9.0.0" } -frame-system = { default-features = false , version = "23.0.0" } -frame-system-rpc-runtime-api = { default-features = false , version = "21.0.0" } +pallet-authority-discovery = { default-features = false , version = "24.0.0" } +pallet-authorship = { default-features = false , version = "24.0.0" } +pallet-babe = { default-features = false , version = "24.0.0" } +pallet-bags-list = { default-features = false , version = "23.0.0" } +pallet-balances = { default-features = false , version = "24.0.0" } +pallet-bounties = { default-features = false , version = "23.0.0" } +pallet-child-bounties = { default-features = false , version = "23.0.0" } +pallet-transaction-payment = { default-features = false , version = "24.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false , version = "24.0.0" } +pallet-collective = { default-features = false , version = "24.0.0" } +pallet-conviction-voting = { default-features = false , version = "24.0.0" } +pallet-democracy = { default-features = false , version = "24.0.0" } +pallet-elections-phragmen = { default-features = false , version = "25.0.0" } +pallet-election-provider-multi-phase = { default-features = false , version = "23.0.0" } +pallet-fast-unstake = { default-features = false , version = "23.0.0" } +frame-executive = { default-features = false , version = "24.0.0" } +pallet-grandpa = { default-features = false , version = "24.0.0" } +pallet-identity = { default-features = false , version = "24.0.0" } +pallet-im-online = { default-features = false , version = "23.0.0" } +pallet-indices = { default-features = false , version = "24.0.0" } +pallet-membership = { default-features = false , version = "24.0.0" } +pallet-message-queue = { default-features = false , version = "27.0.0" } +pallet-multisig = { default-features = false , version = "24.0.0" } +pallet-nomination-pools = { default-features = false , version = "21.0.0" } +pallet-nomination-pools-runtime-api = { default-features = false , version = "19.0.0" } +pallet-offences = { default-features = false , version = "23.0.0" } +pallet-preimage = { default-features = false , version = "24.0.0" } +pallet-proxy = { default-features = false , version = "24.0.0" } +pallet-referenda = { default-features = false , version = "24.0.0" } +pallet-scheduler = { default-features = false , version = "25.0.0" } +pallet-session = { default-features = false , version = "24.0.0" } +frame-support = { default-features = false , version = "24.0.0" } +pallet-staking = { default-features = false , version = "24.0.0" } +pallet-staking-reward-curve = { version = "9.0.0" } +pallet-staking-reward-fn = { default-features = false, version = "15.0.0" } +pallet-staking-runtime-api = { default-features = false , version = "10.0.0" } +frame-system = { default-features = false , version = "24.0.0" } +frame-system-rpc-runtime-api = { default-features = false , version = "22.0.0" } polkadot-runtime-constants = { package = "polkadot-runtime-constants", path = "constants", default-features = false } -pallet-timestamp = { default-features = false , version = "22.0.0" } -pallet-tips = { default-features = false , version = "22.0.0" } -pallet-treasury = { default-features = false , version = "22.0.0" } -pallet-whitelist = { default-features = false , version = "22.0.0" } -pallet-vesting = { default-features = false , version = "23.0.0" } -pallet-utility = { default-features = false , version = "23.0.0" } -frame-election-provider-support = { default-features = false , version = "23.0.0" } -pallet-xcm = { default-features = false, features=["experimental"] , version = "2.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "2.0.0" } +pallet-timestamp = { default-features = false , version = "23.0.0" } +pallet-tips = { default-features = false , version = "23.0.0" } +pallet-treasury = { default-features = false , version = "23.0.0" } +pallet-whitelist = { default-features = false , version = "23.0.0" } +pallet-vesting = { default-features = false , version = "24.0.0" } +pallet-utility = { default-features = false , version = "24.0.0" } +frame-election-provider-support = { default-features = false , version = "24.0.0" } +pallet-xcm = { default-features = false, version = "3.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } -frame-benchmarking = { default-features = false, optional = true , version = "23.0.0" } -frame-try-runtime = { default-features = false, optional = true , version = "0.29.0" } -frame-system-benchmarking = { default-features = false, optional = true , version = "23.0.0" } -pallet-election-provider-support-benchmarking = { default-features = false, optional = true , version = "22.0.0" } -pallet-offences-benchmarking = { default-features = false, optional = true , version = "23.0.0" } -pallet-session-benchmarking = { default-features = false, optional = true , version = "23.0.0" } -pallet-nomination-pools-benchmarking = { default-features = false, optional = true , version = "21.0.0" } +frame-benchmarking = { default-features = false, optional = true , version = "24.0.0" } +frame-try-runtime = { default-features = false, optional = true , version = "0.30.0" } +frame-system-benchmarking = { default-features = false, optional = true , version = "24.0.0" } +pallet-election-provider-support-benchmarking = { default-features = false, optional = true , version = "23.0.0" } +pallet-offences-benchmarking = { default-features = false, optional = true , version = "24.0.0" } +pallet-session-benchmarking = { default-features = false, optional = true , version = "24.0.0" } +pallet-nomination-pools-benchmarking = { default-features = false, optional = true , version = "22.0.0" } hex-literal = { version = "0.4.1", optional = true } -runtime-common = { package = "polkadot-runtime-common", default-features = false, features = ["experimental"] , version = "2.0.0" } -runtime-parachains = { package = "polkadot-runtime-parachains", default-features = false , version = "2.0.0" } -primitives = { package = "polkadot-primitives", default-features = false , version = "2.0.0" } +runtime-common = { package = "polkadot-runtime-common", default-features = false , version = "3.0.0" } +runtime-parachains = { package = "polkadot-runtime-parachains", default-features = false , version = "3.0.0" } +primitives = { package = "polkadot-primitives", default-features = false , version = "3.0.0" } -xcm = { package = "staging-xcm", default-features = false , version = "2.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false , version = "2.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "2.0.1" } +xcm = { package = "staging-xcm", default-features = false , version = "3.0.1" } +xcm-executor = { package = "staging-xcm-executor", default-features = false , version = "3.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "3.0.1" } [dev-dependencies] hex-literal = "0.4.1" tiny-keccak = { version = "2.0.2", features = ["keccak"] } -keyring = { package = "sp-keyring", version = "26.0.0" } -sp-trie = { version = "24.0.0" } +keyring = { package = "sp-keyring", version = "27.0.0" } +sp-trie = { version = "25.0.0" } serde_json = "1.0.96" separator = "0.4.1" -remote-externalities = { package = "frame-remote-externalities" , version = "0.30.0" } +remote-externalities = { package = "frame-remote-externalities" , version = "0.31.0" } tokio = { version = "1.24.2", features = ["macros"] } -sp-tracing = { default-features = false , version = "12.0.0" } +sp-tracing = { default-features = false , version = "13.0.0" } [build-dependencies] -substrate-wasm-builder = { version = "12.0.0" } +substrate-wasm-builder = { version = "13.0.0" } [features] default = [ "std" ] diff --git a/relay/polkadot/constants/Cargo.toml b/relay/polkadot/constants/Cargo.toml index d5d580cf3d..0b77ef424f 100644 --- a/relay/polkadot/constants/Cargo.toml +++ b/relay/polkadot/constants/Cargo.toml @@ -9,12 +9,12 @@ license.workspace = true [dependencies] smallvec = "1.8.0" -frame-support = { default-features = false , version = "23.0.0" } -primitives = { package = "polkadot-primitives", default-features = false , version = "2.0.0" } -runtime-common = { package = "polkadot-runtime-common", default-features = false , version = "2.0.0" } -sp-runtime = { default-features = false , version = "26.0.0" } -sp-weights = { default-features = false , version = "22.0.0" } -sp-core = { default-features = false , version = "23.0.0" } +frame-support = { default-features = false , version = "24.0.0" } +primitives = { package = "polkadot-primitives", default-features = false , version = "3.0.0" } +runtime-common = { package = "polkadot-runtime-common", default-features = false , version = "3.0.0" } +sp-runtime = { default-features = false , version = "27.0.0" } +sp-weights = { default-features = false , version = "23.0.0" } +sp-core = { default-features = false , version = "24.0.0" } [features] default = [ "std" ] diff --git a/relay/polkadot/src/lib.rs b/relay/polkadot/src/lib.rs index d74def520c..a276d45d89 100644 --- a/relay/polkadot/src/lib.rs +++ b/relay/polkadot/src/lib.rs @@ -34,7 +34,7 @@ use runtime_parachains::{ inclusion::{AggregateMessageOrigin, UmpQueueId}, initializer as parachains_initializer, origin as parachains_origin, paras as parachains_paras, paras_inherent as parachains_paras_inherent, reward_points as parachains_reward_points, - runtime_api_impl::v5 as parachains_runtime_api_impl, + runtime_api_impl::v7 as parachains_runtime_api_impl, scheduler as parachains_scheduler, session_info as parachains_session_info, shared as parachains_shared, }; @@ -47,8 +47,9 @@ use frame_election_provider_support::{ use frame_support::{ construct_runtime, parameter_types, traits::{ - ConstU32, Contains, EitherOf, EitherOfDiverse, InstanceFilter, KeyOwnerProofSystem, - PrivilegeCmp, ProcessMessage, ProcessMessageError, WithdrawReasons, + fungible::HoldConsideration, ConstU32, Contains, EitherOf, EitherOfDiverse, InstanceFilter, + KeyOwnerProofSystem, LinearStoragePrice, PrivilegeCmp, ProcessMessage, ProcessMessageError, + WithdrawReasons, }, weights::{ConstantMultiplier, WeightMeter}, PalletId, @@ -89,7 +90,7 @@ use xcm::latest::Junction; pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; -pub use pallet_election_provider_multi_phase::Call as EPMCall; +pub use pallet_election_provider_multi_phase::{Call as EPMCall, GeometricDepositBase}; #[cfg(feature = "std")] pub use pallet_staking::StakerStatus; use pallet_staking::UseValidatorsMap; @@ -106,8 +107,6 @@ mod weights; mod bag_thresholds; -mod paras_scheduler_migration; - // Governance configurations. pub mod governance; use governance::{ @@ -225,9 +224,10 @@ impl pallet_scheduler::Config for Runtime { } parameter_types! { - pub const PreimageMaxSize: u32 = 4096 * 1024; pub const PreimageBaseDeposit: Balance = deposit(2, 64); pub const PreimageByteDeposit: Balance = deposit(0, 1); + pub const PreimageHoldReason: RuntimeHoldReason = + RuntimeHoldReason::Preimage(pallet_preimage::HoldReason::Preimage); } impl pallet_preimage::Config for Runtime { @@ -235,8 +235,12 @@ impl pallet_preimage::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; type ManagerOrigin = EnsureRoot; - type BaseDeposit = PreimageBaseDeposit; - type ByteDeposit = PreimageByteDeposit; + type Consideration = HoldConsideration< + AccountId, + Balances, + PreimageHoldReason, + LinearStoragePrice, + >; } parameter_types! { @@ -381,8 +385,8 @@ parameter_types! { // signed config pub const SignedMaxSubmissions: u32 = 16; pub const SignedMaxRefunds: u32 = 16 / 4; - // 40 DOTs fixed deposit.. - pub const SignedDepositBase: Balance = deposit(2, 0); + pub const SignedFixedDeposit: Balance = deposit(2, 0); + pub const SignedDepositIncreaseFactor: Percent = Percent::from_percent(10); // 0.01 DOT per KB of solution data. pub const SignedDepositByte: Balance = deposit(0, 10) / 1024; // Each good submission will get 1 DOT as reward @@ -455,7 +459,8 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type SignedMaxSubmissions = SignedMaxSubmissions; type SignedMaxRefunds = SignedMaxRefunds; type SignedRewardBase = SignedRewardBase; - type SignedDepositBase = SignedDepositBase; + type SignedDepositBase = + GeometricDepositBase; type SignedDepositByte = SignedDepositByte; type SignedDepositWeight = (); type SignedMaxWeight = @@ -1378,7 +1383,7 @@ construct_runtime! { // Basic stuff; balances is uncallable initially. System: frame_system::{Pallet, Call, Storage, Config, Event} = 0, Scheduler: pallet_scheduler::{Pallet, Call, Storage, Event} = 1, - Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 10, + Preimage: pallet_preimage::{Pallet, Call, Storage, Event, HoldReason} = 10, // Babe must be before session. Babe: pallet_babe::{Pallet, Call, Storage, Config, ValidateUnsigned} = 2, @@ -1573,7 +1578,6 @@ pub mod migrations { pub type Unreleased = ( pallet_im_online::migration::v1::Migration, parachains_configuration::migration::v7::MigrateToV7, - crate::paras_scheduler_migration::v1::MigrateToV1, parachains_configuration::migration::v8::MigrateToV8, // Gov v1 storage migrations @@ -2399,7 +2403,7 @@ mod test_fees { fn signed_deposit_is_sensible() { // ensure this number does not change, or that it is checked after each change. // a 1 MB solution should take (40 + 10) DOTs of deposit. - let deposit = SignedDepositBase::get() + (SignedDepositByte::get() * 1024 * 1024); + let deposit = SignedFixedDeposit::get() + (SignedDepositByte::get() * 1024 * 1024); assert_eq_error_rate!(deposit, 50 * DOLLARS, DOLLARS); } } diff --git a/relay/polkadot/src/paras_scheduler_migration.rs b/relay/polkadot/src/paras_scheduler_migration.rs deleted file mode 100644 index d294861843..0000000000 --- a/relay/polkadot/src/paras_scheduler_migration.rs +++ /dev/null @@ -1,218 +0,0 @@ -//! A copy of the migration found in the polkadot sdk repo. -//! -//! It is copied as the version of the migration found in the crate used by this runtime is broken. - -use frame_support::{ - migrations::VersionedMigration, pallet_prelude::ValueQuery, storage_alias, - traits::OnRuntimeUpgrade, weights::Weight, -}; -use frame_system::pallet_prelude::BlockNumberFor; -use parity_scale_codec::{Decode, Encode}; -use primitives::{ - v5::{Assignment, ParasEntry}, - CoreIndex, CoreOccupied, GroupIndex, Id as ParaId, -}; -use runtime_parachains::scheduler::*; -use scale_info::TypeInfo; -use sp_core::{Get, RuntimeDebug}; -use sp_std::{ - collections::{btree_map::BTreeMap, vec_deque::VecDeque}, - prelude::*, -}; - -const LOG_TARGET: &str = "runtime::parachains::scheduler"; - -mod v0 { - use super::*; - - use primitives::{CollatorId, Id}; - - #[storage_alias] - pub(super) type Scheduled = StorageValue, Vec, ValueQuery>; - - #[derive(Clone, Encode, Decode)] - #[cfg_attr(feature = "std", derive(PartialEq))] - pub struct ParathreadClaim(pub Id, pub CollatorId); - - #[derive(Clone, Encode, Decode)] - #[cfg_attr(feature = "std", derive(PartialEq))] - pub struct ParathreadEntry { - /// The claim. - pub claim: ParathreadClaim, - /// Number of retries. - pub retries: u32, - } - - /// What is occupying a specific availability core. - #[derive(Clone, Encode, Decode)] - #[cfg_attr(feature = "std", derive(PartialEq))] - pub enum CoreOccupied { - /// A parathread. - Parathread(ParathreadEntry), - /// A parachain. - Parachain, - } - - /// The actual type isn't important, as we only delete the key in the state. - #[storage_alias] - pub(crate) type AvailabilityCores = - StorageValue, Vec>, ValueQuery>; - - /// The actual type isn't important, as we only delete the key in the state. - #[storage_alias] - pub(super) type ParathreadQueue = StorageValue, (), ValueQuery>; - - #[storage_alias] - pub(super) type ParathreadClaimIndex = StorageValue, (), ValueQuery>; - - /// The assignment type. - #[derive(Clone, Encode, Decode, TypeInfo, RuntimeDebug)] - #[cfg_attr(feature = "std", derive(PartialEq))] - pub enum AssignmentKind { - /// A parachain. - Parachain, - /// A parathread. - Parathread(CollatorId, u32), - } - - /// How a free core is scheduled to be assigned. - #[derive(Clone, Encode, Decode, TypeInfo, RuntimeDebug)] - #[cfg_attr(feature = "std", derive(PartialEq))] - pub struct CoreAssignment { - /// The core that is assigned. - pub core: CoreIndex, - /// The unique ID of the para that is assigned to the core. - pub para_id: ParaId, - /// The kind of the assignment. - pub kind: AssignmentKind, - /// The index of the validator group assigned to the core. - pub group_idx: GroupIndex, - } -} - -pub mod v1 { - use super::*; - - #[storage_alias] - pub(crate) type AvailabilityCores = - StorageValue, Vec>>, ValueQuery>; - - #[storage_alias] - pub(crate) type ClaimQueue = StorageValue< - Pallet, - BTreeMap>>>>, - ValueQuery, - >; - - #[allow(deprecated)] - pub type MigrateToV1 = VersionedMigration< - 0, - 1, - UncheckedMigrateToV1, - Pallet, - ::DbWeight, - >; - - #[deprecated(note = "Use MigrateToV1 instead")] - pub struct UncheckedMigrateToV1(sp_std::marker::PhantomData); - #[allow(deprecated)] - impl OnRuntimeUpgrade for UncheckedMigrateToV1 { - fn on_runtime_upgrade() -> Weight { - let weight_consumed = migrate_to_v1::(); - - log::info!(target: LOG_TARGET, "Migrating para scheduler storage to v1"); - - weight_consumed - } - - #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::DispatchError> { - let n: u32 = v0::Scheduled::::get().len() as u32 + - v0::AvailabilityCores::::get().iter().filter(|c| c.is_some()).count() as u32; - - log::info!( - target: LOG_TARGET, - "Number of scheduled and waiting for availability before: {n}", - ); - - Ok(n.encode()) - } - - #[cfg(feature = "try-runtime")] - fn post_upgrade(state: Vec) -> Result<(), sp_runtime::DispatchError> { - log::info!(target: LOG_TARGET, "Running post_upgrade()"); - - frame_support::ensure!( - v0::Scheduled::::get().is_empty(), - "Scheduled should be empty after the migration" - ); - - let expected_len = u32::decode(&mut &state[..]).unwrap(); - let availability_cores_waiting = AvailabilityCores::::get() - .iter() - .filter(|c| !matches!(c, CoreOccupied::Free)) - .count(); - - frame_support::ensure!( - ClaimQueue::::get().iter().map(|la_vec| la_vec.1.len()).sum::() as u32 + - availability_cores_waiting as u32 == - expected_len, - "ClaimQueue and AvailabilityCores should have the correct length", - ); - - Ok(()) - } - } -} - -pub fn migrate_to_v1() -> Weight { - let mut weight: Weight = Weight::zero(); - - v0::ParathreadQueue::::kill(); - v0::ParathreadClaimIndex::::kill(); - - let now = >::block_number(); - let scheduled = v0::Scheduled::::take(); - let sched_len = scheduled.len() as u64; - for core_assignment in scheduled { - let core_idx = core_assignment.core; - let assignment = Assignment::new(core_assignment.para_id); - let pe = ParasEntry::new(assignment, now); - - v1::ClaimQueue::::mutate(|la| { - la.entry(core_idx).or_default().push_back(Some(pe)); - }); - } - - let parachains = runtime_parachains::paras::Pallet::::parachains(); - let availability_cores = v0::AvailabilityCores::::take(); - let mut new_availability_cores = Vec::new(); - - for (core_index, core) in availability_cores.into_iter().enumerate() { - let new_core = if let Some(core) = core { - match core { - v0::CoreOccupied::Parachain => CoreOccupied::Paras(ParasEntry::new( - Assignment::new(parachains[core_index]), - now, - )), - v0::CoreOccupied::Parathread(entry) => - CoreOccupied::Paras(ParasEntry::new(Assignment::new(entry.claim.0), now)), - } - } else { - CoreOccupied::Free - }; - - new_availability_cores.push(new_core); - } - - v1::AvailabilityCores::::set(new_availability_cores); - - // 2x as once for Scheduled and once for Claimqueue - weight = weight.saturating_add(T::DbWeight::get().reads_writes(2 * sched_len, 2 * sched_len)); - // reading parachains + availability_cores, writing AvailabilityCores - weight = weight.saturating_add(T::DbWeight::get().reads_writes(2, 1)); - // 2x kill - weight = weight.saturating_add(T::DbWeight::get().writes(2)); - - weight -} diff --git a/relay/polkadot/src/weights/pallet_preimage.rs b/relay/polkadot/src/weights/pallet_preimage.rs index 3e95c87cb5..e7576d9147 100644 --- a/relay/polkadot/src/weights/pallet_preimage.rs +++ b/relay/polkadot/src/weights/pallet_preimage.rs @@ -210,4 +210,25 @@ impl pallet_preimage::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `Preimage::StatusFor` (r:1024 w:1024) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:0 w:1024) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 1024]`. + fn ensure_updated(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `193 + n * (91 ±0)` + // Estimated: `3593 + n * (2566 ±0)` + // Minimum execution time: 2_452_000 picoseconds. + Weight::from_parts(2_641_000, 3593) + // Standard Error: 19_797 + .saturating_add(Weight::from_parts(15_620_946, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes(1_u64)) + .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2566).saturating_mul(n.into())) + } } diff --git a/relay/polkadot/src/weights/runtime_parachains_hrmp.rs b/relay/polkadot/src/weights/runtime_parachains_hrmp.rs index e0af408e88..05540b6ade 100644 --- a/relay/polkadot/src/weights/runtime_parachains_hrmp.rs +++ b/relay/polkadot/src/weights/runtime_parachains_hrmp.rs @@ -275,4 +275,46 @@ impl runtime_parachains::hrmp::WeightInfo for WeightInf .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(8)) } + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannels` (r:1 w:0) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1) + /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:2 w:2) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:1 w:0) + /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:1 w:1) + /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn establish_system_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `417` + // Estimated: `6357` + // Minimum execution time: 629_674_000 picoseconds. + Weight::from_parts(640_174_000, 0) + .saturating_add(Weight::from_parts(0, 6357)) + .saturating_add(T::DbWeight::get().reads(12)) + .saturating_add(T::DbWeight::get().writes(8)) + } + /// Storage: `Hrmp::HrmpChannels` (r:1 w:1) + /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn poke_channel_deposits() -> Weight { + // Proof Size summary in bytes: + // Measured: `263` + // Estimated: `3728` + // Minimum execution time: 173_371_000 picoseconds. + Weight::from_parts(175_860_000, 0) + .saturating_add(Weight::from_parts(0, 3728)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml b/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml index 13d150bc87..0b9e2dd906 100644 --- a/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml +++ b/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml @@ -16,77 +16,77 @@ scale-info = { version = "2.9.0", default-features = false, features = ["derive" smallvec = "1.11.0" # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-executive = { default-features = false, version = "23.0.0" } -frame-support = { default-features = false, version = "23.0.0" } -frame-system = { default-features = false, version = "23.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "21.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.29.0" } -pallet-asset-conversion-tx-payment = { default-features = false, version = "5.0.0" } -pallet-assets = { default-features = false, version = "24.0.0" } -pallet-asset-conversion = { default-features = false, version = "5.0.0" } -pallet-aura = { default-features = false, version = "22.0.0" } -pallet-authorship = { default-features = false, version = "23.0.0" } -pallet-balances = { default-features = false, version = "23.0.0" } -pallet-multisig = { default-features = false, version = "23.0.0" } -pallet-nft-fractionalization = { default-features = false, version = "5.0.0" } -pallet-nfts = { default-features = false, version = "17.0.0" } -pallet-nfts-runtime-api = { default-features = false, version = "9.0.0" } -pallet-proxy = { default-features = false, version = "23.0.0" } -pallet-session = { default-features = false, version = "23.0.0" } -pallet-state-trie-migration = { default-features = false, optional = true , version = "24.0.0" } -pallet-timestamp = { default-features = false, version = "22.0.0" } -pallet-transaction-payment = { default-features = false, version = "23.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "23.0.0" } -pallet-uniques = { default-features = false, version = "23.0.0" } -pallet-utility = { default-features = false, version = "23.0.0" } -sp-api = { default-features = false, version = "21.0.0" } -sp-block-builder = { default-features = false, version = "21.0.0" } -sp-consensus-aura = { default-features = false, version = "0.27.0" } -sp-core = { default-features = false, version = "23.0.0" } -sp-inherents = { default-features = false, version = "21.0.0" } -sp-offchain = { default-features = false, version = "21.0.0" } -sp-runtime = { default-features = false, version = "26.0.0" } -sp-session = { default-features = false, version = "22.0.0" } -sp-std = { default-features = false, version = "10.0.0" } -sp-storage = { default-features = false, version = "15.0.0" } -sp-transaction-pool = { default-features = false, version = "21.0.0" } -sp-version = { default-features = false, version = "24.0.0" } -sp-weights = { default-features = false, version = "22.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-executive = { default-features = false, version = "24.0.0" } +frame-support = { default-features = false, version = "24.0.0" } +frame-system = { default-features = false, version = "24.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } +pallet-asset-conversion-tx-payment = { default-features = false, version = "6.0.0" } +pallet-assets = { default-features = false, version = "25.0.0" } +pallet-asset-conversion = { default-features = false, version = "6.0.0" } +pallet-aura = { default-features = false, version = "23.0.0" } +pallet-authorship = { default-features = false, version = "24.0.0" } +pallet-balances = { default-features = false, version = "24.0.0" } +pallet-multisig = { default-features = false, version = "24.0.0" } +pallet-nft-fractionalization = { default-features = false, version = "6.0.0" } +pallet-nfts = { default-features = false, version = "18.0.0" } +pallet-nfts-runtime-api = { default-features = false, version = "10.0.0" } +pallet-proxy = { default-features = false, version = "24.0.0" } +pallet-session = { default-features = false, version = "24.0.0" } +pallet-state-trie-migration = { default-features = false, optional = true , version = "25.0.0" } +pallet-timestamp = { default-features = false, version = "23.0.0" } +pallet-transaction-payment = { default-features = false, version = "24.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "24.0.0" } +pallet-uniques = { default-features = false, version = "24.0.0" } +pallet-utility = { default-features = false, version = "24.0.0" } +sp-api = { default-features = false, version = "22.0.0" } +sp-block-builder = { default-features = false, version = "22.0.0" } +sp-consensus-aura = { default-features = false, version = "0.28.0" } +sp-core = { default-features = false, version = "24.0.0" } +sp-inherents = { default-features = false, version = "22.0.0" } +sp-offchain = { default-features = false, version = "22.0.0" } +sp-runtime = { default-features = false, version = "27.0.0" } +sp-session = { default-features = false, version = "23.0.0" } +sp-std = { default-features = false, version = "11.0.0" } +sp-storage = { default-features = false, version = "16.0.0" } +sp-transaction-pool = { default-features = false, version = "22.0.0" } +sp-version = { default-features = false, version = "25.0.0" } +sp-weights = { default-features = false, version = "23.0.0" } # num-traits feature needed for dex integer sq root: primitive-types = { version = "0.12.1", default-features = false, features = ["codec", "scale-info", "num-traits"] } # Polkadot kusama-runtime-constants = { path = "../../../relay/kusama/constants", default-features = false} -pallet-xcm = { default-features = false, version = "2.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "2.0.0" } -polkadot-core-primitives = { default-features = false, version = "2.0.0" } -polkadot-parachain-primitives = { default-features = false, version = "1.0.0" } -polkadot-runtime-common = { default-features = false, version = "2.0.0" } -xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } +pallet-xcm = { default-features = false, version = "3.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } +polkadot-core-primitives = { default-features = false, version = "3.0.0" } +polkadot-parachain-primitives = { default-features = false, version = "2.0.0" } +polkadot-runtime-common = { default-features = false, version = "3.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "3.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } # Cumulus -cumulus-pallet-aura-ext = { default-features = false , version = "0.2.0" } -cumulus-pallet-dmp-queue = { default-features = false , version = "0.2.0" } -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.2.0" } -cumulus-pallet-session-benchmarking = { default-features = false, version = "4.0.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.2.0" } -cumulus-pallet-xcmp-queue = { default-features = false , version = "0.2.0" } -cumulus-primitives-core = { default-features = false , version = "0.2.0" } -cumulus-primitives-utility = { default-features = false , version = "0.2.0" } -pallet-collator-selection = { default-features = false , version = "4.0.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.2.0" } -parachains-common = { default-features = false , version = "2.0.0" } -assets-common = { default-features = false , version = "0.2.0" } +cumulus-pallet-aura-ext = { default-features = false , version = "0.3.0" } +cumulus-pallet-dmp-queue = { default-features = false , version = "0.3.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } +cumulus-pallet-session-benchmarking = { default-features = false, version = "5.0.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } +cumulus-pallet-xcmp-queue = { default-features = false , version = "0.3.0" } +cumulus-primitives-core = { default-features = false , version = "0.3.0" } +cumulus-primitives-utility = { default-features = false , version = "0.3.0" } +pallet-collator-selection = { default-features = false , version = "5.0.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } +parachains-common = { default-features = false , version = "3.0.0" } +assets-common = { default-features = false , version = "0.3.0" } [dev-dependencies] -asset-test-utils = { version = "2.0.0" } +asset-test-utils = { version = "3.0.0" } [build-dependencies] -substrate-wasm-builder = { optional = true , version = "12.0.0" } +substrate-wasm-builder = { optional = true , version = "13.0.0" } [features] default = [ "std" ] diff --git a/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml b/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml index 973f527540..7e218ca8ee 100644 --- a/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml +++ b/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml @@ -16,73 +16,73 @@ scale-info = { version = "2.9.0", default-features = false, features = ["derive" smallvec = "1.11.0" # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-executive = { default-features = false, version = "23.0.0" } -frame-support = { default-features = false, version = "23.0.0" } -frame-system = { default-features = false, version = "23.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "21.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.29.0" } -pallet-asset-tx-payment = { default-features = false , version = "23.0.0" } -pallet-assets = { default-features = false, version = "24.0.0" } -pallet-aura = { default-features = false, version = "22.0.0" } -pallet-authorship = { default-features = false, version = "23.0.0" } -pallet-balances = { default-features = false, version = "23.0.0" } -pallet-multisig = { default-features = false, version = "23.0.0" } -pallet-nfts = { default-features = false, version = "17.0.0" } -pallet-nfts-runtime-api = { default-features = false, version = "9.0.0" } -pallet-proxy = { default-features = false, version = "23.0.0" } -pallet-session = { default-features = false, version = "23.0.0" } -pallet-timestamp = { default-features = false, version = "22.0.0" } -pallet-transaction-payment = { default-features = false, version = "23.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "23.0.0" } -pallet-uniques = { default-features = false, version = "23.0.0" } -pallet-utility = { default-features = false, version = "23.0.0" } -sp-api = { default-features = false, version = "21.0.0" } -sp-block-builder = { default-features = false, version = "21.0.0" } -sp-consensus-aura = { default-features = false, version = "0.27.0" } -sp-core = { default-features = false, version = "23.0.0" } -sp-inherents = { default-features = false, version = "21.0.0" } -sp-offchain = { default-features = false, version = "21.0.0" } -sp-runtime = { default-features = false, version = "26.0.0" } -sp-session = { default-features = false, version = "22.0.0" } -sp-std = { default-features = false, version = "10.0.0" } -sp-storage = { default-features = false, version = "15.0.0" } -sp-transaction-pool = { default-features = false, version = "21.0.0" } -sp-version = { default-features = false, version = "24.0.0" } -sp-weights = { default-features = false, version = "22.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-executive = { default-features = false, version = "24.0.0" } +frame-support = { default-features = false, version = "24.0.0" } +frame-system = { default-features = false, version = "24.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } +pallet-asset-tx-payment = { default-features = false , version = "24.0.0" } +pallet-assets = { default-features = false, version = "25.0.0" } +pallet-aura = { default-features = false, version = "23.0.0" } +pallet-authorship = { default-features = false, version = "24.0.0" } +pallet-balances = { default-features = false, version = "24.0.0" } +pallet-multisig = { default-features = false, version = "24.0.0" } +pallet-nfts = { default-features = false, version = "18.0.0" } +pallet-nfts-runtime-api = { default-features = false, version = "10.0.0" } +pallet-proxy = { default-features = false, version = "24.0.0" } +pallet-session = { default-features = false, version = "24.0.0" } +pallet-timestamp = { default-features = false, version = "23.0.0" } +pallet-transaction-payment = { default-features = false, version = "24.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "24.0.0" } +pallet-uniques = { default-features = false, version = "24.0.0" } +pallet-utility = { default-features = false, version = "24.0.0" } +sp-api = { default-features = false, version = "22.0.0" } +sp-block-builder = { default-features = false, version = "22.0.0" } +sp-consensus-aura = { default-features = false, version = "0.28.0" } +sp-core = { default-features = false, version = "24.0.0" } +sp-inherents = { default-features = false, version = "22.0.0" } +sp-offchain = { default-features = false, version = "22.0.0" } +sp-runtime = { default-features = false, version = "27.0.0" } +sp-session = { default-features = false, version = "23.0.0" } +sp-std = { default-features = false, version = "11.0.0" } +sp-storage = { default-features = false, version = "16.0.0" } +sp-transaction-pool = { default-features = false, version = "22.0.0" } +sp-version = { default-features = false, version = "25.0.0" } +sp-weights = { default-features = false, version = "23.0.0" } # Polkadot -pallet-xcm = { default-features = false, version = "2.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "2.0.0" } -polkadot-core-primitives = { default-features = false, version = "2.0.0" } -polkadot-parachain-primitives = { default-features = false, version = "1.0.0" } -polkadot-runtime-common = { default-features = false, version = "2.0.0" } +pallet-xcm = { default-features = false, version = "3.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } +polkadot-core-primitives = { default-features = false, version = "3.0.0" } +polkadot-parachain-primitives = { default-features = false, version = "2.0.0" } +polkadot-runtime-common = { default-features = false, version = "3.0.0" } polkadot-runtime-constants = { path = "../../../relay/polkadot/constants", default-features = false} -xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "3.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } # Cumulus -cumulus-pallet-aura-ext = { default-features = false , version = "0.2.0" } -cumulus-pallet-dmp-queue = { default-features = false , version = "0.2.0" } -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.2.0" } -cumulus-pallet-session-benchmarking = { default-features = false, version = "4.0.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.2.0" } -cumulus-pallet-xcmp-queue = { default-features = false , version = "0.2.0" } -cumulus-primitives-core = { default-features = false , version = "0.2.0" } -cumulus-primitives-utility = { default-features = false , version = "0.2.0" } -pallet-collator-selection = { default-features = false , version = "4.0.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.2.0" } -parachains-common = { default-features = false , version = "2.0.0" } -assets-common = { default-features = false , version = "0.2.0" } +cumulus-pallet-aura-ext = { default-features = false , version = "0.3.0" } +cumulus-pallet-dmp-queue = { default-features = false , version = "0.3.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } +cumulus-pallet-session-benchmarking = { default-features = false, version = "5.0.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } +cumulus-pallet-xcmp-queue = { default-features = false , version = "0.3.0" } +cumulus-primitives-core = { default-features = false , version = "0.3.0" } +cumulus-primitives-utility = { default-features = false , version = "0.3.0" } +pallet-collator-selection = { default-features = false , version = "5.0.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } +parachains-common = { default-features = false , version = "3.0.0" } +assets-common = { default-features = false , version = "0.3.0" } [dev-dependencies] hex-literal = "0.4.1" -asset-test-utils = { version = "2.0.0" } +asset-test-utils = { version = "3.0.0" } [build-dependencies] -substrate-wasm-builder = { optional = true , version = "12.0.0" } +substrate-wasm-builder = { optional = true , version = "13.0.0" } [features] default = [ "std" ] diff --git a/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml b/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml index 11225c620b..5f608342a1 100644 --- a/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -9,7 +9,7 @@ repository.workspace = true version.workspace = true [build-dependencies] -substrate-wasm-builder = { optional = true , version = "12.0.0" } +substrate-wasm-builder = { optional = true , version = "13.0.0" } [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } @@ -20,62 +20,62 @@ serde = { version = "1.0.188", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-executive = { default-features = false, version = "23.0.0" } -frame-support = { default-features = false, version = "23.0.0" } -frame-system = { default-features = false, version = "23.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "21.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.29.0" } -pallet-aura = { default-features = false, version = "22.0.0" } -pallet-authorship = { default-features = false, version = "23.0.0" } -pallet-balances = { default-features = false, version = "23.0.0" } -pallet-multisig = { default-features = false, version = "23.0.0" } -pallet-session = { default-features = false, version = "23.0.0" } -pallet-timestamp = { default-features = false, version = "22.0.0" } -pallet-transaction-payment = { default-features = false, version = "23.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "23.0.0" } -pallet-utility = { default-features = false, version = "23.0.0" } -sp-api = { default-features = false, version = "21.0.0" } -sp-block-builder = { default-features = false, version = "21.0.0" } -sp-consensus-aura = { default-features = false, version = "0.27.0" } -sp-core = { default-features = false, version = "23.0.0" } -sp-inherents = { default-features = false, version = "21.0.0" } -sp-io = { default-features = false, version = "25.0.0" } -sp-offchain = { default-features = false, version = "21.0.0" } -sp-runtime = { default-features = false, version = "26.0.0" } -sp-session = { default-features = false, version = "22.0.0" } -sp-std = { default-features = false, version = "10.0.0" } -sp-storage = { default-features = false, version = "15.0.0" } -sp-transaction-pool = { default-features = false, version = "21.0.0" } -sp-version = { default-features = false, version = "24.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-executive = { default-features = false, version = "24.0.0" } +frame-support = { default-features = false, version = "24.0.0" } +frame-system = { default-features = false, version = "24.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } +pallet-aura = { default-features = false, version = "23.0.0" } +pallet-authorship = { default-features = false, version = "24.0.0" } +pallet-balances = { default-features = false, version = "24.0.0" } +pallet-multisig = { default-features = false, version = "24.0.0" } +pallet-session = { default-features = false, version = "24.0.0" } +pallet-timestamp = { default-features = false, version = "23.0.0" } +pallet-transaction-payment = { default-features = false, version = "24.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "24.0.0" } +pallet-utility = { default-features = false, version = "24.0.0" } +sp-api = { default-features = false, version = "22.0.0" } +sp-block-builder = { default-features = false, version = "22.0.0" } +sp-consensus-aura = { default-features = false, version = "0.28.0" } +sp-core = { default-features = false, version = "24.0.0" } +sp-inherents = { default-features = false, version = "22.0.0" } +sp-io = { default-features = false, version = "26.0.0" } +sp-offchain = { default-features = false, version = "22.0.0" } +sp-runtime = { default-features = false, version = "27.0.0" } +sp-session = { default-features = false, version = "23.0.0" } +sp-std = { default-features = false, version = "11.0.0" } +sp-storage = { default-features = false, version = "16.0.0" } +sp-transaction-pool = { default-features = false, version = "22.0.0" } +sp-version = { default-features = false, version = "25.0.0" } # Polkadot kusama-runtime-constants = { path = "../../../relay/kusama/constants", default-features = false} -pallet-xcm = { default-features = false, version = "2.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "2.0.0" } -polkadot-core-primitives = { default-features = false, version = "2.0.0" } -polkadot-parachain-primitives = { default-features = false, version = "1.0.0" } -polkadot-runtime-common = { default-features = false, version = "2.0.0" } -xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } +pallet-xcm = { default-features = false, version = "3.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } +polkadot-core-primitives = { default-features = false, version = "3.0.0" } +polkadot-parachain-primitives = { default-features = false, version = "2.0.0" } +polkadot-runtime-common = { default-features = false, version = "3.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "3.0.1" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } # Cumulus -cumulus-pallet-aura-ext = { default-features = false , version = "0.2.0" } -cumulus-pallet-dmp-queue = { default-features = false , version = "0.2.0" } -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.2.0" } -cumulus-pallet-session-benchmarking = { default-features = false, version = "4.0.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.2.0" } -cumulus-pallet-xcmp-queue = { default-features = false , version = "0.2.0" } -cumulus-primitives-core = { default-features = false , version = "0.2.0" } -cumulus-primitives-utility = { default-features = false , version = "0.2.0" } -pallet-collator-selection = { default-features = false , version = "4.0.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.2.0" } -parachains-common = { default-features = false , version = "2.0.0" } +cumulus-pallet-aura-ext = { default-features = false , version = "0.3.0" } +cumulus-pallet-dmp-queue = { default-features = false , version = "0.3.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } +cumulus-pallet-session-benchmarking = { default-features = false, version = "5.0.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } +cumulus-pallet-xcmp-queue = { default-features = false , version = "0.3.0" } +cumulus-primitives-core = { default-features = false , version = "0.3.0" } +cumulus-primitives-utility = { default-features = false , version = "0.3.0" } +pallet-collator-selection = { default-features = false , version = "5.0.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } +parachains-common = { default-features = false , version = "3.0.0" } [dev-dependencies] -bridge-hub-test-utils = { version = "0.2.0" } +bridge-hub-test-utils = { version = "0.3.0" } [features] default = [ "std" ] diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml index cac2fcc358..d0384b967f 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -9,7 +9,7 @@ repository.workspace = true version.workspace = true [build-dependencies] -substrate-wasm-builder = { optional = true , version = "12.0.0" } +substrate-wasm-builder = { optional = true , version = "13.0.0" } [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } @@ -20,62 +20,62 @@ serde = { version = "1.0.188", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-executive = { default-features = false, version = "23.0.0" } -frame-support = { default-features = false, version = "23.0.0" } -frame-system = { default-features = false, version = "23.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "21.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.29.0" } -pallet-aura = { default-features = false, version = "22.0.0" } -pallet-authorship = { default-features = false, version = "23.0.0" } -pallet-balances = { default-features = false, version = "23.0.0" } -pallet-multisig = { default-features = false, version = "23.0.0" } -pallet-session = { default-features = false, version = "23.0.0" } -pallet-timestamp = { default-features = false, version = "22.0.0" } -pallet-transaction-payment = { default-features = false, version = "23.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "23.0.0" } -pallet-utility = { default-features = false, version = "23.0.0" } -sp-api = { default-features = false, version = "21.0.0" } -sp-block-builder = { default-features = false, version = "21.0.0" } -sp-consensus-aura = { default-features = false, version = "0.27.0" } -sp-core = { default-features = false, version = "23.0.0" } -sp-inherents = { default-features = false, version = "21.0.0" } -sp-io = { default-features = false, version = "25.0.0" } -sp-offchain = { default-features = false, version = "21.0.0" } -sp-runtime = { default-features = false, version = "26.0.0" } -sp-session = { default-features = false, version = "22.0.0" } -sp-std = { default-features = false, version = "10.0.0" } -sp-storage = { default-features = false, version = "15.0.0" } -sp-transaction-pool = { default-features = false, version = "21.0.0" } -sp-version = { default-features = false, version = "24.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-executive = { default-features = false, version = "24.0.0" } +frame-support = { default-features = false, version = "24.0.0" } +frame-system = { default-features = false, version = "24.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } +pallet-aura = { default-features = false, version = "23.0.0" } +pallet-authorship = { default-features = false, version = "24.0.0" } +pallet-balances = { default-features = false, version = "24.0.0" } +pallet-multisig = { default-features = false, version = "24.0.0" } +pallet-session = { default-features = false, version = "24.0.0" } +pallet-timestamp = { default-features = false, version = "23.0.0" } +pallet-transaction-payment = { default-features = false, version = "24.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "24.0.0" } +pallet-utility = { default-features = false, version = "24.0.0" } +sp-api = { default-features = false, version = "22.0.0" } +sp-block-builder = { default-features = false, version = "22.0.0" } +sp-consensus-aura = { default-features = false, version = "0.28.0" } +sp-core = { default-features = false, version = "24.0.0" } +sp-inherents = { default-features = false, version = "22.0.0" } +sp-io = { default-features = false, version = "26.0.0" } +sp-offchain = { default-features = false, version = "22.0.0" } +sp-runtime = { default-features = false, version = "27.0.0" } +sp-session = { default-features = false, version = "23.0.0" } +sp-std = { default-features = false, version = "11.0.0" } +sp-storage = { default-features = false, version = "16.0.0" } +sp-transaction-pool = { default-features = false, version = "22.0.0" } +sp-version = { default-features = false, version = "25.0.0" } # Polkadot polkadot-runtime-constants = { path = "../../../relay/polkadot/constants", default-features = false} -pallet-xcm = { default-features = false, version = "2.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "2.0.0" } -polkadot-core-primitives = { default-features = false, version = "2.0.0" } -polkadot-parachain-primitives = { default-features = false, version = "1.0.0" } -polkadot-runtime-common = { default-features = false, version = "2.0.0" } -xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } +pallet-xcm = { default-features = false, version = "3.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } +polkadot-core-primitives = { default-features = false, version = "3.0.0" } +polkadot-parachain-primitives = { default-features = false, version = "2.0.0" } +polkadot-runtime-common = { default-features = false, version = "3.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "3.0.1" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } # Cumulus -cumulus-pallet-aura-ext = { default-features = false , version = "0.2.0" } -cumulus-pallet-dmp-queue = { default-features = false , version = "0.2.0" } -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.2.0" } -cumulus-pallet-session-benchmarking = { default-features = false, version = "4.0.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.2.0" } -cumulus-pallet-xcmp-queue = { default-features = false , version = "0.2.0" } -cumulus-primitives-core = { default-features = false , version = "0.2.0" } -cumulus-primitives-utility = { default-features = false , version = "0.2.0" } -pallet-collator-selection = { default-features = false , version = "4.0.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.2.0" } -parachains-common = { default-features = false , version = "2.0.0" } +cumulus-pallet-aura-ext = { default-features = false , version = "0.3.0" } +cumulus-pallet-dmp-queue = { default-features = false , version = "0.3.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } +cumulus-pallet-session-benchmarking = { default-features = false, version = "5.0.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } +cumulus-pallet-xcmp-queue = { default-features = false , version = "0.3.0" } +cumulus-primitives-core = { default-features = false , version = "0.3.0" } +cumulus-primitives-utility = { default-features = false , version = "0.3.0" } +pallet-collator-selection = { default-features = false , version = "5.0.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } +parachains-common = { default-features = false , version = "3.0.0" } [dev-dependencies] -bridge-hub-test-utils = { version = "0.2.0" } +bridge-hub-test-utils = { version = "0.3.0" } [features] default = [ "std" ] diff --git a/system-parachains/collectives/collectives-polkadot/Cargo.toml b/system-parachains/collectives/collectives-polkadot/Cargo.toml index 5af3c75bed..a3a42e0896 100644 --- a/system-parachains/collectives/collectives-polkadot/Cargo.toml +++ b/system-parachains/collectives/collectives-polkadot/Cargo.toml @@ -16,73 +16,73 @@ scale-info = { version = "2.9.0", default-features = false, features = ["derive" smallvec = "1.11.0" # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-executive = { default-features = false, version = "23.0.0" } -frame-support = { default-features = false, version = "23.0.0" } -frame-system = { default-features = false, version = "23.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "21.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.29.0" } -pallet-alliance = { default-features = false, version = "22.0.0" } -pallet-aura = { default-features = false, version = "22.0.0" } -pallet-authorship = { default-features = false, version = "23.0.0" } -pallet-balances = { default-features = false, version = "23.0.0" } -pallet-collective = { default-features = false, version = "23.0.0" } -pallet-multisig = { default-features = false, version = "23.0.0" } -pallet-preimage = { default-features = false , version = "23.0.0" } -pallet-proxy = { default-features = false, version = "23.0.0" } -pallet-scheduler = { default-features = false , version = "24.0.0" } -pallet-session = { default-features = false, version = "23.0.0" } -pallet-timestamp = { default-features = false, version = "22.0.0" } -pallet-transaction-payment = { default-features = false, version = "23.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "23.0.0" } -pallet-utility = { default-features = false, version = "23.0.0" } -pallet-referenda = { default-features = false, version = "23.0.0" } -pallet-ranked-collective = { default-features = false, version = "23.0.0" } -pallet-core-fellowship = { default-features = false, version = "7.0.0" } -pallet-salary = { default-features = false, version = "8.0.0" } -sp-api = { default-features = false, version = "21.0.0" } -sp-arithmetic = { default-features = false , version = "18.0.0" } -sp-block-builder = { default-features = false, version = "21.0.0" } -sp-consensus-aura = { default-features = false, version = "0.27.0" } -sp-core = { default-features = false, version = "23.0.0" } -sp-inherents = { default-features = false, version = "21.0.0" } -sp-offchain = { default-features = false, version = "21.0.0" } -sp-runtime = { default-features = false, version = "26.0.0" } -sp-session = { default-features = false, version = "22.0.0" } -sp-std = { default-features = false, version = "10.0.0" } -sp-storage = { default-features = false, version = "15.0.0" } -sp-transaction-pool = { default-features = false, version = "21.0.0" } -sp-version = { default-features = false, version = "24.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-executive = { default-features = false, version = "24.0.0" } +frame-support = { default-features = false, version = "24.0.0" } +frame-system = { default-features = false, version = "24.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } +pallet-alliance = { default-features = false, version = "23.0.0" } +pallet-aura = { default-features = false, version = "23.0.0" } +pallet-authorship = { default-features = false, version = "24.0.0" } +pallet-balances = { default-features = false, version = "24.0.0" } +pallet-collective = { default-features = false, version = "24.0.0" } +pallet-multisig = { default-features = false, version = "24.0.0" } +pallet-preimage = { default-features = false , version = "24.0.0" } +pallet-proxy = { default-features = false, version = "24.0.0" } +pallet-scheduler = { default-features = false , version = "25.0.0" } +pallet-session = { default-features = false, version = "24.0.0" } +pallet-timestamp = { default-features = false, version = "23.0.0" } +pallet-transaction-payment = { default-features = false, version = "24.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "24.0.0" } +pallet-utility = { default-features = false, version = "24.0.0" } +pallet-referenda = { default-features = false, version = "24.0.0" } +pallet-ranked-collective = { default-features = false, version = "24.0.0" } +pallet-core-fellowship = { default-features = false, version = "8.0.0" } +pallet-salary = { default-features = false, version = "9.0.0" } +sp-api = { default-features = false, version = "22.0.0" } +sp-arithmetic = { default-features = false , version = "19.0.0" } +sp-block-builder = { default-features = false, version = "22.0.0" } +sp-consensus-aura = { default-features = false, version = "0.28.0" } +sp-core = { default-features = false, version = "24.0.0" } +sp-inherents = { default-features = false, version = "22.0.0" } +sp-offchain = { default-features = false, version = "22.0.0" } +sp-runtime = { default-features = false, version = "27.0.0" } +sp-session = { default-features = false, version = "23.0.0" } +sp-std = { default-features = false, version = "11.0.0" } +sp-storage = { default-features = false, version = "16.0.0" } +sp-transaction-pool = { default-features = false, version = "22.0.0" } +sp-version = { default-features = false, version = "25.0.0" } # Polkadot -pallet-xcm = { default-features = false, version = "2.0.0" } -polkadot-core-primitives = { default-features = false, version = "2.0.0" } -polkadot-parachain-primitives = { default-features = false, version = "1.0.0" } -polkadot-runtime-common = { default-features = false, version = "2.0.0" } +pallet-xcm = { default-features = false, version = "3.0.0" } +polkadot-core-primitives = { default-features = false, version = "3.0.0" } +polkadot-parachain-primitives = { default-features = false, version = "2.0.0" } +polkadot-runtime-common = { default-features = false, version = "3.0.0" } polkadot-runtime-constants = { path = "../../../relay/polkadot/constants", default-features = false} -xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "3.0.1" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } # Cumulus -cumulus-pallet-aura-ext = { default-features = false , version = "0.2.0" } -cumulus-pallet-dmp-queue = { default-features = false , version = "0.2.0" } -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.2.0" } -cumulus-pallet-session-benchmarking = { default-features = false, version = "4.0.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.2.0" } -cumulus-pallet-xcmp-queue = { default-features = false , version = "0.2.0" } -cumulus-primitives-core = { default-features = false , version = "0.2.0" } -cumulus-primitives-utility = { default-features = false , version = "0.2.0" } -pallet-collator-selection = { default-features = false , version = "4.0.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.2.0" } -parachains-common = { default-features = false , version = "2.0.0" } +cumulus-pallet-aura-ext = { default-features = false , version = "0.3.0" } +cumulus-pallet-dmp-queue = { default-features = false , version = "0.3.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } +cumulus-pallet-session-benchmarking = { default-features = false, version = "5.0.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } +cumulus-pallet-xcmp-queue = { default-features = false , version = "0.3.0" } +cumulus-primitives-core = { default-features = false , version = "0.3.0" } +cumulus-primitives-utility = { default-features = false , version = "0.3.0" } +pallet-collator-selection = { default-features = false , version = "5.0.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } +parachains-common = { default-features = false , version = "3.0.0" } [build-dependencies] -substrate-wasm-builder = { optional = true , version = "12.0.0" } +substrate-wasm-builder = { optional = true , version = "13.0.0" } [dev-dependencies] -sp-io = { default-features = false, version = "25.0.0" } +sp-io = { default-features = false, version = "26.0.0" } [features] default = [ "std" ] diff --git a/system-parachains/collectives/collectives-polkadot/src/impls.rs b/system-parachains/collectives/collectives-polkadot/src/impls.rs index 12ea0f5798..fb2feb63ec 100644 --- a/system-parachains/collectives/collectives-polkadot/src/impls.rs +++ b/system-parachains/collectives/collectives-polkadot/src/impls.rs @@ -185,7 +185,7 @@ pub mod benchmarks { impl> EnsureSuccessful for OpenHrmpChannel { fn ensure_successful() { if let ChannelStatus::Closed = ParachainSystem::get_channel_status(I::get().into()) { - ParachainSystem::open_outbound_hrmp_channel_for_benchmarks(I::get().into()) + ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests(I::get().into()) } } } diff --git a/system-parachains/collectives/collectives-polkadot/src/lib.rs b/system-parachains/collectives/collectives-polkadot/src/lib.rs index 31c6923e85..a51e65fc81 100644 --- a/system-parachains/collectives/collectives-polkadot/src/lib.rs +++ b/system-parachains/collectives/collectives-polkadot/src/lib.rs @@ -64,7 +64,10 @@ use frame_support::{ construct_runtime, dispatch::DispatchClass, parameter_types, - traits::{ConstBool, ConstU16, ConstU32, ConstU64, ConstU8, EitherOfDiverse, InstanceFilter}, + traits::{ + fungible::HoldConsideration, ConstBool, ConstU16, ConstU32, ConstU64, ConstU8, + EitherOfDiverse, InstanceFilter, LinearStoragePrice, + }, weights::{ConstantMultiplier, Weight}, PalletId, }; @@ -542,6 +545,8 @@ impl pallet_scheduler::Config for Runtime { parameter_types! { pub const PreimageBaseDeposit: Balance = deposit(2, 64); pub const PreimageByteDeposit: Balance = deposit(0, 1); + pub const PreimageHoldReason: RuntimeHoldReason = + RuntimeHoldReason::Preimage(pallet_preimage::HoldReason::Preimage); } impl pallet_preimage::Config for Runtime { @@ -549,8 +554,12 @@ impl pallet_preimage::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; type ManagerOrigin = EnsureRoot; - type BaseDeposit = PreimageBaseDeposit; - type ByteDeposit = PreimageByteDeposit; + type Consideration = HoldConsideration< + AccountId, + Balances, + PreimageHoldReason, + LinearStoragePrice, + >; } // Create the runtime by composing the FRAME pallets that were previously configured. @@ -586,7 +595,7 @@ construct_runtime!( Utility: pallet_utility::{Pallet, Call, Event} = 40, Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, - Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 43, + Preimage: pallet_preimage::{Pallet, Call, Storage, Event, HoldReason} = 43, Scheduler: pallet_scheduler::{Pallet, Call, Storage, Event} = 44, // The main stage. diff --git a/system-parachains/collectives/collectives-polkadot/src/weights/pallet_preimage.rs b/system-parachains/collectives/collectives-polkadot/src/weights/pallet_preimage.rs index 71e91699fd..0e50acf71b 100644 --- a/system-parachains/collectives/collectives-polkadot/src/weights/pallet_preimage.rs +++ b/system-parachains/collectives/collectives-polkadot/src/weights/pallet_preimage.rs @@ -210,4 +210,25 @@ impl pallet_preimage::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `Preimage::StatusFor` (r:1024 w:1024) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:0 w:1024) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 1024]`. + fn ensure_updated(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `193 + n * (91 ±0)` + // Estimated: `3593 + n * (2566 ±0)` + // Minimum execution time: 2_452_000 picoseconds. + Weight::from_parts(2_641_000, 3593) + // Standard Error: 19_797 + .saturating_add(Weight::from_parts(15_620_946, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes(1_u64)) + .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2566).saturating_mul(n.into())) + } } diff --git a/system-parachains/gluttons/glutton-kusama/Cargo.toml b/system-parachains/gluttons/glutton-kusama/Cargo.toml index c7552d0e2c..9fec42b5b8 100644 --- a/system-parachains/gluttons/glutton-kusama/Cargo.toml +++ b/system-parachains/gluttons/glutton-kusama/Cargo.toml @@ -13,41 +13,41 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-executive = { default-features = false, version = "23.0.0" } -frame-support = { default-features = false, version = "23.0.0" } -frame-system = { default-features = false, version = "23.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "21.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "23.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.29.0" } -pallet-glutton = { default-features = false, optional = true, version = "9.0.0" } -pallet-sudo = { default-features = false, optional = true, version = "23.0.0" } -sp-api = { default-features = false, version = "21.0.0" } -sp-block-builder = { default-features = false, version = "21.0.0" } -sp-core = { default-features = false, version = "23.0.0" } -sp-inherents = { default-features = false, version = "21.0.0" } -sp-offchain = { default-features = false, version = "21.0.0" } -sp-runtime = { default-features = false, version = "26.0.0" } -sp-session = { default-features = false, version = "22.0.0" } -sp-std = { default-features = false, version = "10.0.0" } -sp-storage = { default-features = false, version = "15.0.0" } -sp-transaction-pool = { default-features = false, version = "21.0.0" } -sp-version = { default-features = false, version = "24.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-executive = { default-features = false, version = "24.0.0" } +frame-support = { default-features = false, version = "24.0.0" } +frame-system = { default-features = false, version = "24.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } +pallet-glutton = { default-features = false, optional = true, version = "10.0.0" } +pallet-sudo = { default-features = false, optional = true, version = "24.0.0" } +sp-api = { default-features = false, version = "22.0.0" } +sp-block-builder = { default-features = false, version = "22.0.0" } +sp-core = { default-features = false, version = "24.0.0" } +sp-inherents = { default-features = false, version = "22.0.0" } +sp-offchain = { default-features = false, version = "22.0.0" } +sp-runtime = { default-features = false, version = "27.0.0" } +sp-session = { default-features = false, version = "23.0.0" } +sp-std = { default-features = false, version = "11.0.0" } +sp-storage = { default-features = false, version = "16.0.0" } +sp-transaction-pool = { default-features = false, version = "22.0.0" } +sp-version = { default-features = false, version = "25.0.0" } # Polkadot -xcm = { package = "staging-xcm", default-features = false, version = "2.0.1" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "2.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "2.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "3.0.1" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } # Cumulus -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.2.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.2.0" } -cumulus-primitives-core = { default-features = false , version = "0.2.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.2.0" } -parachains-common = { default-features = false , version = "2.0.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } +cumulus-primitives-core = { default-features = false , version = "0.3.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } +parachains-common = { default-features = false , version = "3.0.0" } [build-dependencies] -substrate-wasm-builder = { version = "12.0.0" } +substrate-wasm-builder = { version = "13.0.0" } [features] default = [ "std" ] From 41d3ca6050c6dfbb509764193dce11ff9ccef141 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Wed, 22 Nov 2023 12:15:37 +0100 Subject: [PATCH 13/21] auto-merge: replaced review bot for merge bot (#98) When adapted the code from #88 I forgot to update the location of the credentials, so it was using review-bot which can only enable auto-merge but can not merge a ready to merge PR. Follow up to #97 --- .github/workflows/auto-merge.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml index 66325807b1..32cb12fb49 100644 --- a/.github/workflows/auto-merge.yml +++ b/.github/workflows/auto-merge.yml @@ -19,8 +19,8 @@ jobs: id: merge_token uses: tibdex/github-app-token@v1 with: - app_id: ${{ secrets.REVIEW_APP_ID }} - private_key: ${{ secrets.REVIEW_APP_KEY }} + app_id: ${{ secrets.MERGE_APP_ID }} + private_key: ${{ secrets.MERGE_APP_KEY }} - name: Set auto merge uses: paritytech/auto-merge-bot@v1.0.0 with: From 569787c83bc1ce11fed52381219921d66c1e9491 Mon Sep 17 00:00:00 2001 From: Liam Aharon Date: Thu, 23 Nov 2023 01:56:43 +0400 Subject: [PATCH 14/21] Fix migrations and add migration CI checks (#75) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #70 The error with Asset Hub Kusama will be fixed when [this commit](https://github.com/paritytech/polkadot-sdk/commit/db3fd687262c68b115ab6724dfaa6a71d4a48a59) lands in the runtime. --------- Co-authored-by: Oliver Tale-Yazdi Co-authored-by: ordian Co-authored-by: Bastian Köcher --- .github/workflows/check-migrations.yml | 80 ++++++++++++++++++++++++++ .github/workflows/release-matrix.json | 10 ---- .github/workflows/release.yml | 2 +- .github/workflows/runtimes-matrix.json | 57 ++++++++++++++++++ relay/kusama/src/lib.rs | 69 +++++++++++++--------- relay/polkadot/src/lib.rs | 2 + 6 files changed, 181 insertions(+), 39 deletions(-) create mode 100644 .github/workflows/check-migrations.yml delete mode 100644 .github/workflows/release-matrix.json create mode 100644 .github/workflows/runtimes-matrix.json diff --git a/.github/workflows/check-migrations.yml b/.github/workflows/check-migrations.yml new file mode 100644 index 0000000000..75a0d14db1 --- /dev/null +++ b/.github/workflows/check-migrations.yml @@ -0,0 +1,80 @@ +name: Check Migrations + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + workflow_dispatch: + +# Cancel a currently running workflow from the same PR, branch or tag when a new workflow is +# triggered (ref https://stackoverflow.com/a/72408109) +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + runtime-matrix: + runs-on: ubuntu-latest + outputs: + runtime: ${{ steps.runtime.outputs.runtime }} + name: Extract tasks from matrix + steps: + - uses: actions/checkout@v2 + - id: runtime + run: | + # Filter out runtimes that don't have a URI + TASKS=$(jq '[.[] | select(.uri != null)]' .github/workflows/runtimes-matrix.json) + SKIPPED_TASKS=$(jq '[.[] | select(.uri == null)]' .github/workflows/runtimes-matrix.json) + echo --- Running the following tasks --- + echo $TASKS + echo --- Skipping the following tasks due to not having a uri field --- + echo $SKIPPED_TASKS + # Strip whitespace from Tasks now that we've logged it + TASKS=$(echo $TASKS | jq -c .) + echo "runtime=$TASKS" >> $GITHUB_OUTPUT + + check-migrations: + needs: [runtime-matrix] + continue-on-error: true + runs-on: ubuntu-latest + strategy: + matrix: + runtime: ${{ fromJSON(needs.runtime-matrix.outputs.runtime) }} + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Download try-runtime-cli + run: | + curl -sL https://github.com/paritytech/try-runtime-cli/releases/download/v0.5.0/try-runtime-x86_64-unknown-linux-musl -o try-runtime + chmod +x ./try-runtime + + - name: Install Protoc + uses: arduino/setup-protoc@v1 + with: + version: "3.6.1" + + - name: Add wasm32-unknown-unknown target + run: rustup target add wasm32-unknown-unknown + + - name: Build ${{ matrix.runtime.name }} + run: | + cargo build --profile production -p ${{ matrix.runtime.package }} --features try-runtime + + - name: Check migrations + run: | + PACKAGE_NAME=${{ matrix.runtime.package }} + RUNTIME_BLOB_NAME=$(echo $PACKAGE_NAME | sed 's/-/_/g').compact.compressed.wasm + # When running on relay, we don't need weight checks. + NO_WEIGHT_WARNINGS_FLAG="" + if [[ "${{ matrix.runtime.is_relay }}" == "true" ]]; then + NO_WEIGHT_WARNINGS_FLAG="--no-weight-warnings" + fi + # Disable idempotency checks for now because the Scheduler pallet MigrateToV1 migration is + # non-idempotent at its root in Polkadot SDK V1.2.0. In V1.3.0 we can re-enable + # idempotency checks. + EXTRA_ARGS="--disable-spec-version-check --disable-idempotency-checks" + ./try-runtime \ + --runtime ./target/production/wbuild/$PACKAGE_NAME/$RUNTIME_BLOB_NAME \ + on-runtime-upgrade --checks=pre-and-post $EXTRA_ARGS $NO_WEIGHT_WARNINGS_FLAG live --uri ${{ matrix.runtime.uri }} diff --git a/.github/workflows/release-matrix.json b/.github/workflows/release-matrix.json deleted file mode 100644 index fa20957212..0000000000 --- a/.github/workflows/release-matrix.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - { "name": "polkadot", "package": "polkadot-runtime", "path": "relay/polkadot" }, - { "name": "kusama", "package": "staging-kusama-runtime", "path": "relay/kusama" }, - { "name": "glutton-kusama", "package": "glutton-kusama-runtime", "path": "system-parachains/gluttons/glutton-kusama" }, - { "name": "asset-hub-kusama", "package": "asset-hub-kusama-runtime", "path": "system-parachains/asset-hubs/asset-hub-kusama" }, - { "name": "asset-hub-polkadot", "package": "asset-hub-polkadot-runtime", "path": "system-parachains/asset-hubs/asset-hub-polkadot" }, - { "name": "bridge-hub-kusama", "package": "bridge-hub-kusama-runtime", "path": "system-parachains/bridge-hubs/bridge-hub-kusama" }, - { "name": "bridge-hub-polkadot", "package": "bridge-hub-polkadot-runtime", "path": "system-parachains/bridge-hubs/bridge-hub-polkadot" }, - { "name": "collectives-polkadot", "package": "collectives-polkadot-runtime", "path": "system-parachains/collectives/collectives-polkadot" } -] diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d2a2afb641..373d14f949 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,7 +29,7 @@ jobs: - uses: actions/checkout@v2 - id: runtime run: | - TASKS=$(echo $(cat .github/workflows/release-matrix.json) | sed 's/ //g' ) + TASKS=$(echo $(cat .github/workflows/runtimes-matrix.json) | sed 's/ //g' ) echo $TASKS echo "runtime=$TASKS" >> $GITHUB_OUTPUT build-runtimes: diff --git a/.github/workflows/runtimes-matrix.json b/.github/workflows/runtimes-matrix.json new file mode 100644 index 0000000000..ffe99af042 --- /dev/null +++ b/.github/workflows/runtimes-matrix.json @@ -0,0 +1,57 @@ +[ + { + "name": "polkadot", + "package": "polkadot-runtime", + "path": "relay/polkadot", + "uri": "wss://polkadot-try-runtime-node.parity-chains.parity.io:443", + "is_relay": true + }, + { + "name": "kusama", + "package": "staging-kusama-runtime", + "path": "relay/kusama", + "uri": "wss://kusama-try-runtime-node.parity-chains.parity.io:443", + "is_relay": true + }, + { + "name": "glutton-kusama", + "package": "glutton-kusama-runtime", + "path": "system-parachains/gluttons/glutton-kusama", + "is_relay": false + }, + { + "name": "asset-hub-kusama", + "package": "asset-hub-kusama-runtime", + "path": "system-parachains/asset-hubs/asset-hub-kusama", + "uri": "wss://kusama-asset-hub-rpc.polkadot.io:443", + "is_relay": false + }, + { + "name": "asset-hub-polkadot", + "package": "asset-hub-polkadot-runtime", + "path": "system-parachains/asset-hubs/asset-hub-polkadot", + "uri": "wss://polkadot-asset-hub-rpc.polkadot.io:443", + "is_relay": false + }, + { + "name": "bridge-hub-kusama", + "package": "bridge-hub-kusama-runtime", + "path": "system-parachains/bridge-hubs/bridge-hub-kusama", + "uri": "wss://kusama-bridge-hub-rpc.polkadot.io:443", + "is_relay": false + }, + { + "name": "bridge-hub-polkadot", + "package": "bridge-hub-polkadot-runtime", + "path": "system-parachains/bridge-hubs/bridge-hub-polkadot", + "uri": "wss://polkadot-bridge-hub-rpc.polkadot.io:443", + "is_relay": false + }, + { + "name": "collectives-polkadot", + "package": "collectives-polkadot-runtime", + "path": "system-parachains/collectives/collectives-polkadot", + "uri": "wss://polkadot-collectives-rpc.polkadot.io:443", + "is_relay": false + } +] diff --git a/relay/kusama/src/lib.rs b/relay/kusama/src/lib.rs index 8c98d1475c..d1fc659abd 100644 --- a/relay/kusama/src/lib.rs +++ b/relay/kusama/src/lib.rs @@ -138,7 +138,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 1_000_000, + spec_version: 1_000_001, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 24, @@ -2692,8 +2692,6 @@ mod init_state_migration { use super::Runtime; use frame_support::traits::OnRuntimeUpgrade; use pallet_state_trie_migration::{AutoLimits, MigrationLimits, MigrationProcess}; - #[cfg(feature = "try-runtime")] - use sp_runtime::DispatchError; #[cfg(not(feature = "std"))] use sp_std::prelude::*; @@ -2701,37 +2699,52 @@ mod init_state_migration { pub struct InitMigrate; impl OnRuntimeUpgrade for InitMigrate { #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, DispatchError> { - frame_support::ensure!( - AutoLimits::::get().is_none(), - DispatchError::Other("Automigration already started.") - ); - Ok(Default::default()) + fn pre_upgrade() -> Result, sp_runtime::DispatchError> { + use parity_scale_codec::Encode; + let migration_should_start = AutoLimits::::get().is_none() && + MigrationProcess::::get() == Default::default(); + Ok(migration_should_start.encode()) } fn on_runtime_upgrade() -> frame_support::weights::Weight { - if MigrationProcess::::get() == Default::default() && - AutoLimits::::get().is_none() - { - // We use limits to target 600ko proofs per block and - // avg 800_000_000_000 of weight per block. - // See spreadsheet 4800_400 in - // https://raw.githubusercontent.com/cheme/substrate/try-runtime-mig/ksm.ods - AutoLimits::::put(Some(MigrationLimits { item: 4_800, size: 204800 * 2 })); - log::info!("Automatic trie migration started."); - ::DbWeight::get().reads_writes(2, 1) - } else { - log::info!("Automatic trie migration not started."); - ::DbWeight::get().reads(2) - } + if AutoLimits::::get().is_some() { + log::warn!("Automatic trie migration already started, not proceeding."); + return ::DbWeight::get().reads(1) + }; + + if MigrationProcess::::get() != Default::default() { + log::warn!("MigrationProcess is not Default. Not proceeding."); + return ::DbWeight::get().reads(2) + }; + + // Migration is not already running and `MigraitonProcess` is Default. Ready to run + // migrations. + // + // We use limits to target 600ko proofs per block and + // avg 800_000_000_000 of weight per block. + // See spreadsheet 4800_400 in + // https://raw.githubusercontent.com/cheme/substrate/try-runtime-mig/ksm.ods + AutoLimits::::put(Some(MigrationLimits { item: 4_800, size: 204800 * 2 })); + log::info!("Automatic trie migration started."); + ::DbWeight::get().reads_writes(2, 1) } #[cfg(feature = "try-runtime")] - fn post_upgrade(_state: Vec) -> Result<(), DispatchError> { - frame_support::ensure!( - AutoLimits::::get().is_some(), - DispatchError::Other("Automigration started.") - ); + fn post_upgrade( + migration_should_start_bytes: Vec, + ) -> Result<(), sp_runtime::DispatchError> { + use parity_scale_codec::Decode; + let migration_should_start: bool = + Decode::decode(&mut migration_should_start_bytes.as_slice()) + .expect("failed to decode migration should start"); + + if migration_should_start { + frame_support::ensure!( + AutoLimits::::get().is_some(), + sp_runtime::DispatchError::Other("Automigration did not start as expected.") + ); + } + Ok(()) } } diff --git a/relay/polkadot/src/lib.rs b/relay/polkadot/src/lib.rs index a276d45d89..247034be8f 100644 --- a/relay/polkadot/src/lib.rs +++ b/relay/polkadot/src/lib.rs @@ -1597,6 +1597,8 @@ pub mod migrations { parachains_configuration::migration::v9::MigrateToV9, // Migrate parachain info format paras_registrar::migration::VersionCheckedMigrateToV1, + + runtime_parachains::scheduler::migration::v1::MigrateToV1 ); } From 01817cc05a53e5a1bab1b94d7eed8f57b9096bc8 Mon Sep 17 00:00:00 2001 From: Muharem Date: Fri, 24 Nov 2023 12:23:25 +0100 Subject: [PATCH 15/21] Polkadot Collectives: remove fellowship import migration (#54) Remove fellowship import migration. Executed and not needed anymore. --- Cargo.lock | 1 - .../collectives-polkadot/Cargo.toml | 4 - .../src/fellowship/migration.rs | 261 ------------------ .../src/fellowship/mod.rs | 1 - 4 files changed, 267 deletions(-) delete mode 100644 system-parachains/collectives/collectives-polkadot/src/fellowship/migration.rs diff --git a/Cargo.lock b/Cargo.lock index b777934cda..b6405364aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1709,7 +1709,6 @@ dependencies = [ "sp-consensus-aura", "sp-core", "sp-inherents", - "sp-io", "sp-offchain", "sp-runtime", "sp-session", diff --git a/system-parachains/collectives/collectives-polkadot/Cargo.toml b/system-parachains/collectives/collectives-polkadot/Cargo.toml index a3a42e0896..cdd13b081e 100644 --- a/system-parachains/collectives/collectives-polkadot/Cargo.toml +++ b/system-parachains/collectives/collectives-polkadot/Cargo.toml @@ -81,9 +81,6 @@ parachains-common = { default-features = false , version = "3.0.0" } [build-dependencies] substrate-wasm-builder = { optional = true , version = "13.0.0" } -[dev-dependencies] -sp-io = { default-features = false, version = "26.0.0" } - [features] default = [ "std" ] runtime-benchmarks = [ @@ -199,7 +196,6 @@ std = [ "sp-consensus-aura/std", "sp-core/std", "sp-inherents/std", - "sp-io/std", "sp-offchain/std", "sp-runtime/std", "sp-session/std", diff --git a/system-parachains/collectives/collectives-polkadot/src/fellowship/migration.rs b/system-parachains/collectives/collectives-polkadot/src/fellowship/migration.rs deleted file mode 100644 index 95449868df..0000000000 --- a/system-parachains/collectives/collectives-polkadot/src/fellowship/migration.rs +++ /dev/null @@ -1,261 +0,0 @@ -// 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 . - -//! Migrations. - -use frame_support::{pallet_prelude::*, traits::OnRuntimeUpgrade, weights::Weight}; -use log; - -/// Initial import of the Kusama Technical Fellowship. -pub(crate) mod import_kusama_fellowship { - use super::*; - use frame_support::{parameter_types, traits::RankedMembers}; - use pallet_ranked_collective::{Config, MemberCount, Pallet as RankedCollective, Rank}; - #[cfg(feature = "try-runtime")] - use sp_std::vec::Vec; - - const TARGET: &str = "runtime::migration::import_fellowship"; - - parameter_types! { - // The Fellowship addresses from Kusama state. - pub const FellowshipAddresses: [(Rank, [u8; 32]); 47] = [ - (6, hex_literal::hex!("f0673d30606ee26672707e4fd2bc8b58d3becb7aba2d5f60add64abb5fea4710"),), - (6, hex_literal::hex!("3c235e80e35082b668682531b9b062fda39a46edb94f884d9122d86885fd5f1b"),), - (6, hex_literal::hex!("7628a5be63c4d3c8dbb96c2904b1a9682e02831a1af836c7efc808020b92fa63"),), - (5, hex_literal::hex!("9c84f75e0b1b92f6b003bde6212a8b2c9b776f3720f942b33fed8709f103a268"),), - (5, hex_literal::hex!("bc64065524532ed9e805fb0d39a5c0199216b52871168e5e4d0ab612f8797d61"),), - (5, hex_literal::hex!("2e1884c53071526483b14004e894415f02b55fc2e2aef8e1df8ccf7ce5bd5570"),), - (5, hex_literal::hex!("5c5062779d44ea2ab0469e155b8cf3e004fce71b3b3d38263cd9fa9478f12f28"),), - (4, hex_literal::hex!("4adf51a47b72795366d52285e329229c836ea7bbfe139dbe8fa0700c4f86fc56"),), - (4, hex_literal::hex!("1c90e3dabd3fd0f6bc648045018f78fcee8fe24122c22d8d2a14e9905073d10f"),), - (4, hex_literal::hex!("8e851ed992228f2268ee8c614fe6075d3800060ae14098e0309413a0a81c4470"),), - (3, hex_literal::hex!("720d807d46b941703ffe0278e8b173dc6738c5af8af812ceffc90c69390bbf1f"),), - (3, hex_literal::hex!("c4965f7fe7be8174717a24ffddf684986d122c7e293ddf875cdf9700a07b6812"),), - (3, hex_literal::hex!("beae5bcad1a8c156291b7ddf46b38b0c61a6aaacebd57b21c75627bfe7f9ab71"),), - (3, hex_literal::hex!("ccd87fa65729f7bdaa8305581a7a499aa24c118e83f5714152c0e22617c6fc63"),), - (3, hex_literal::hex!("e0f0f94962fc0a8c1a0f0527dc8e592c67939c46c903b6016cc0a8515da0044d"),), - (3, hex_literal::hex!("984e16482c99cfad1436111e321a86d87d0fac203bf64538f888e45d793b5413"),), - (3, hex_literal::hex!("44a3efb5bfa9023d4ef27b7d31d76f531b4d7772b1679b7fb32b6263ac39100e"),), - (2, hex_literal::hex!("2eba9a39dbfdd5f3cba964355d45e27319f0271023c0353d97dc6df2401b0e3d"),), - (2, hex_literal::hex!("ba3e9b87792bcfcc237fa8181185b8883c77f3e24f45e4a92ab31d07a4703520"),), - (2, hex_literal::hex!("9e6eb74b0a6b39de36fb58d1fab20bc2b3fea96023ce5a47941c20480d99f92e"),), - (2, hex_literal::hex!("ee3d9d8c48ee88dce78fd7bafe3ce2052900eb465085b9324d4f5da26b145f2b"),), - (2, hex_literal::hex!("d8290537d6e31fe1ff165eaa62b63f6f3556dcc720b0d3a6d7eab96275617304"),), - (2, hex_literal::hex!("5a090c88f0438b46b451026597cee760a7bac9d396c9c7b529b68fb78aec5f43"),), - (2, hex_literal::hex!("18d30040a8245c5ff17afc9a8169d7d0771fe7ab4135a64a022c254117340720"),), - (1, hex_literal::hex!("b4f7f03bebc56ebe96bc52ea5ed3159d45a0ce3a8d7f082983c33ef133274747"),), - (1, hex_literal::hex!("caafae0aaa6333fcf4dc193146945fe8e4da74aa6c16d481eef0ca35b8279d73"),), - (1, hex_literal::hex!("a66e0f4e1a121cc83fddf3096e8ec8c9e9c85989f276e39e951fb0e4a5398763"),), - (1, hex_literal::hex!("f65f3cade8f68e8f34c6266b0d37e58a754059ca96816e964f98e17c79505073"),), - (1, hex_literal::hex!("8c232c91ef2a9983ba65c4b75bb86fcbae4d909900ea8aa06c3644ca1161db48"),), - (1, hex_literal::hex!("78e4813814891bd48bc745b79254a978833d41fbe0f387df93cd87eae2468926"),), - (1, hex_literal::hex!("d44824ac8d1edecca67639ca74d208bd2044a10e67c9677e288080191e3fec13"),), - (1, hex_literal::hex!("585e982d74da4f4290d20a73800cfd705cf59e1f5880aaee5506b5eaaf544f49"),), - (1, hex_literal::hex!("d851f44a6f0d0d2f3439a51f2f75f66f4ea1a8e6c33c32f9af75fc188afb7546"),), - (1, hex_literal::hex!("dca89b135d1a6aee0a498610a70eeaed056727c8a4d220da245842e540a54a74"),), - (1, hex_literal::hex!("aa91fc0201f26b713a018669bcd269babf25368eee2493323b1ce0190a178a27"),), - (1, hex_literal::hex!("dc20836f2e4b88c1858d1e3f918e7358043b4a8abcd2874e74d91d26c52eca2a"),), - (1, hex_literal::hex!("145d6c503d0cf97f4c7725ca773741bd02e1760bfb52e021af5a9f2de283012c"),), - (1, hex_literal::hex!("307183930b2264c5165f4a210a99520c5f1672b0413d57769fabc19e6866fb25"),), - (1, hex_literal::hex!("6201961514cf5ad87f1c4dd0c392ee28231f805f77975147bf2c33bd671b9822"),), - (1, hex_literal::hex!("c6f57237cd4abfbeed99171495fc784e45a9d5d2814d435de40de00991a73c06"),), - (1, hex_literal::hex!("c1df5c7e8ca56037450c58734326ebe34aec8f7d1928322a12164856365fea73"),), - (1, hex_literal::hex!("12c039004da5e1e846aae808277098c719cef1f4985aed00161a42ac4f0e002f"),), - (1, hex_literal::hex!("7460ac178015d2a7c289bb68ef9fdaac071596ab4425c276a0040aaac7055566"),), - (1, hex_literal::hex!("eec4bd650a277342ebba0954ac786df2623bd6a9d6d3e69b484482336c549f79"),), - (1, hex_literal::hex!("e287c7494655d636a846f5c3347ad2cb3c462a8d46e0832be70fcc0ab54ee62d"),), - (1, hex_literal::hex!("82bf733f44a840f0a5c1935a002d4e541d81298fad6d1da8124073485983860e"),), - (1, hex_literal::hex!("d5b89078eed9b9dfec5c7d8413bac0b720bad3bd4078c4d8c894325713192502"),), - ]; - } - - /// Implements `OnRuntimeUpgrade` trait. - pub struct Migration(PhantomData<(T, I)>); - - impl, I: 'static> OnRuntimeUpgrade for Migration - where - ::AccountId: From<[u8; 32]>, - { - #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { - let onchain_version = RankedCollective::::on_chain_storage_version(); - ensure!(onchain_version == 0, "the storage version must be 0."); - let member_count = MemberCount::::get(0); - ensure!(member_count == 0, "the collective must be uninitialized."); - - Ok(Vec::new()) - } - - fn on_runtime_upgrade() -> Weight { - let current_version = RankedCollective::::current_storage_version(); - let onchain_version = RankedCollective::::on_chain_storage_version(); - let mut weight = T::DbWeight::get().reads(1); - log::info!( - target: TARGET, - "running migration with current storage version {:?} / onchain {:?}.", - current_version, - onchain_version - ); - if onchain_version != 0 { - log::warn!( - target: TARGET, - "unsupported storage version, skipping import_fellowship migration." - ); - return weight - } - let member_count = MemberCount::::get(0); - weight.saturating_accrue(T::DbWeight::get().reads(1)); - if member_count != 0 { - log::warn!( - target: TARGET, - "the collective already initialized, skipping import_fellowship migration." - ); - return weight - } - - for (rank, account_id32) in FellowshipAddresses::get() { - let who: T::AccountId = account_id32.into(); - let _ = as RankedMembers>::induct(&who); - for _ in 0..rank { - let _ = as RankedMembers>::promote(&who); - // 1 write to `IdToIndex` and `IndexToId` per member on each rank. - weight.saturating_accrue(T::DbWeight::get().writes(2)); - } - // 1 write to `IdToIndex` and `IndexToId` per member on each rank. - weight.saturating_accrue(T::DbWeight::get().writes(2)); - // 1 read and 1 write to `Members` and `MemberCount` per member. - weight.saturating_accrue(T::DbWeight::get().reads_writes(2, 2)); - } - weight - } - - #[cfg(feature = "try-runtime")] - fn post_upgrade(_state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { - ensure!(MemberCount::::get(0) == 47, "invalid members count at rank 0."); - ensure!(MemberCount::::get(1) == 47, "invalid members count at rank 1."); - ensure!(MemberCount::::get(2) == 24, "invalid members count at rank 2."); - ensure!(MemberCount::::get(3) == 17, "invalid members count at rank 3."); - ensure!(MemberCount::::get(4) == 10, "invalid members count at rank 4."); - ensure!(MemberCount::::get(5) == 7, "invalid members count at rank 5."); - ensure!(MemberCount::::get(6) == 3, "invalid members count at rank 6."); - ensure!(MemberCount::::get(7) == 0, "invalid members count at rank 7."); - Ok(()) - } - } -} - -#[cfg(test)] -pub mod tests { - use super::import_kusama_fellowship::FellowshipAddresses; - use crate::{fellowship::FellowshipCollectiveInstance as Fellowship, Runtime, System}; - use frame_support::traits::OnRuntimeUpgrade; - use pallet_ranked_collective::Rank; - use parachains_common::AccountId; - use sp_core::crypto::Ss58Codec; - use sp_runtime::{AccountId32, BuildStorage}; - - #[test] - fn check_fellowship_addresses() { - let fellowship_addresses = FellowshipAddresses::get(); - let kusama_fellowship_ss58: [(Rank, _); 47] = [ - (6, "16SDAKg9N6kKAbhgDyxBXdHEwpwHUHs2CNEiLNGeZV55qHna"), /* proof https://kusama.subscan.io/extrinsic/16832707-4 */ - (6, "12MrP337azmkTdfCUKe5XLnSQrbgEKqqfZ4PQC7CZTJKAWR3"), /* proof https://kusama.subscan.io/extrinsic/16967809-2 */ - (6, "FFFF3gBSSDFSvK2HBq4qgLH75DHqXWPHeCnR1BSksAMacBs"), - (5, "G7YVCdxZb8JLpAm9WMnJdNuojNT84AzU62zmvx5P1FMNtg2"), - (5, "15G1iXDLgFyfnJ51FKq1ts44TduMyUtekvzQi9my4hgYt2hs"), /* proof https://kusama.subscan.io/extrinsic/16917610-2 */ - (5, "Dcm1BqR4N7nHuV43TXdET7pNibt1Nzm42FggPHpxKRven53"), - (5, "1363HWTPzDrzAQ6ChFiMU6mP4b6jmQid2ae55JQcKtZnpLGv"), /* proof https://kusama.subscan.io/extrinsic/16961180-2 */ - (4, "EGVQCe73TpFyAZx5uKfE1222XfkT3BSKozjgcqzLBnc5eYo"), - (4, "1eTPAR2TuqLyidmPT9rMmuycHVm9s9czu78sePqg2KHMDrE"), /* proof https://kusama.subscan.io/extrinsic/16921712-3 */ - (4, "14DsLzVyTUTDMm2eP3czwPbH53KgqnQRp3CJJZS9GR7yxGDP"), /* proof https://kusama.subscan.io/extrinsic/16917519-2 */ - (3, "13aYUFHB3umoPoxBEAHSv451iR3RpsNi3t5yBZjX2trCtTp6"), /* proof https://kusama.subscan.io/extrinsic/16917832-3 */ - (3, "H25aCspunTUqAt4D1gC776vKZ8FX3MvQJ3Jde6qDXPQaFxk"), - (3, "GtLQoW4ZqcjExMPq6qB22bYc6NaX1yMzRuGWpSRiHqnzRb9"), - (3, "15db5ksZgmhWE9U8MDq4wLKUdFivLVBybztWV8nmaJvv3NU1"), /* proof https://kusama.subscan.io/extrinsic/16876631-2 */ - (3, "HfFpz4QUxfbocHudf8UU7cMgHqkHpf855Me5X846PZAsAYE"), - (3, "14ShUZUYUR35RBZW6uVVt1zXDxmSQddkeDdXf1JkMA6P721N"), /* proof https://kusama.subscan.io/extrinsic/16918890-8 */ - (3, "12YzxR5TvGzfMVZNnhAJ5Hwi5zExpRWMKv2MuMwZTrddvgoi"), /* proof https://kusama.subscan.io/extrinsic/16924324-3 */ - (2, "Ddb9puChKMHq4gM6o47E551wAmaNeu6kHngX1jzNNqAw782"), - (2, "15DCWHQknBjc5YPFoVj8Pn2KoqrqYywJJ95BYNYJ4Fj3NLqz"), /* proof https://kusama.subscan.io/extrinsic/16834952-2 */ - (2, "14ajTQdrtCA8wZmC4PgD8Y1B2Gy8L4Z3oi2fodxq9FehcFrM"), /* proof https://kusama.subscan.io/extrinsic/16944257-2 */ - (2, "HxhDbS3grLurk1dhDgPiuDaRowHY1xHCU8Vu8on3fdg85tx"), - (2, "HTk3eccL7WBkiyxz1gBcqQRghsJigoDMD7mnQaz1UAbMpQV"), - (2, "EcNWrSPSDcVBRymwr26kk4JVFg92PdoU5Xwp87W2FgFSt9c"), - (2, "D8sM6vKjWaeKy2zCPYWGkLLbWdUtWQrXBTQqr4dSYnVQo21"), - (1, "GfbnnEgRU94n9ed4RFZ6Z9dBAWs5obykigJSwXKU9hsT2uU"), - (1, "HA5NtttvyZsxo4wGxGoJJSMaWtdEFZAuGUMFHVWD7fgenPv"), - (1, "14mDeKZ7qp9hqBjjDg51c8BFrf9o69om8piSSRwj2fT5Yb1i"), /* proof https://kusama.subscan.io/extrinsic/16919020-4 */ - (1, "16a357f5Sxab3V2ne4emGQvqJaCLeYpTMx3TCjnQhmJQ71DX"), /* proof https://kusama.subscan.io/extrinsic/16836396-5 */ - (1, "14Ak9rrF6RKHHoLLRUYMnzcvvi1t8E1yAMa7tcmiwUfaqzYK"), /* proof https://kusama.subscan.io/extrinsic/16921990-3 */ - (1, "FJq9JpA9P7EXbmfsN9YiewJaDbQyL6vQyksGtJvzfbn6zf8"), - (1, "15oLanodWWweiZJSoDTEBtrX7oGfq6e8ct5y5E6fVRDPhUgj"), /* proof https://kusama.subscan.io/extrinsic/16876423-7 */ - (1, "EaBqDJJNsZmYdQ4xn1vomPJVNh7fjA6UztZeEjn7ZzdeT7V"), - (1, "HTxCvXKVvUZ7PQq175kCRRLu7XkGfTfErrdNXr1ZuuwVZWv"), - (1, "HZe91A6a1xqbKaw6ofx3GFepJjhVXHrwHEwn6YUDDFphpX9"), - (1, "GRy2P3kBEzSHCbmDJfquku1cyUyhZaAqojRcNE4A4U3MnLd"), - (1, "HYwiBo7Mcv7uUDg4MUoKm2fxzv4dMLAtmmNfzHV8qcQJpAE"), - (1, "1ThiBx5DDxFhoD9GY6tz5Fp4Y7Xn1xfLmDddcoFQghDvvjg"), /* proof https://kusama.subscan.io/extrinsic/16918130-2 */ - (1, "DfqY6XQUSETTszBQ1juocTcG9iiDoXhvq1CoVadBSUqTGJS"), - (1, "EnpgVWGGQVrFdSB2qeXRVdtccV6U5ZscNELBoERbkFD8Wi6"), - (1, "H5BuqCmucJhUUuvjAzPazeVwVCtUSXVQdc5Dnx2q5zD7rVn"), - (1, "GxX7S1pTDdeaGUjpEPPF2we6tgHDhbatFG25pVmVFtGHLH6"), - (1, "CzuUtvKhZNZBjyAXeYviaRXwrLhVrsupJ9PrWmdq7BJTjGR"), - (1, "FCunn2Rx8JqfT5g6noUKKazph4jLDba5rUee7o3ZmJ362Ju"), - (1, "HyPMjWRHCpJS7x2SZ2R6M2XG5ZiCiZag4U4r7gBHRsE5mTc"), - (1, "1682A5hxfiS1Kn1jrUnMYv14T9EuEnsgnBbujGfYbeEbSK3w"), /* proof https://kusama.subscan.io/extrinsic/16919077-2 */ - (1, "13xS6fK6MHjApLnjdX7TJYw1niZmiXasSN91bNtiXQjgEtNx"), /* proof https://kusama.subscan.io/extrinsic/16918212-7 */ - (1, "15qE2YAQCs5Y962RHE7RzNjQxU6Pei21nhkkSM9Sojq1hHps"), /* https://kusama.subscan.io/extrinsic/17352973-2 */ - ]; - - for (index, val) in kusama_fellowship_ss58.iter().enumerate() { - let account: AccountId32 = ::from_string(val.1).unwrap(); - let account32: [u8; 32] = account.clone().into(); - assert_eq!( - fellowship_addresses[index].0, kusama_fellowship_ss58[index].0, - "ranks must be equal." - ); - assert_eq!(fellowship_addresses[index].1, account32, "accounts must be equal."); - } - } - - #[test] - fn test_fellowship_import() { - use super::import_kusama_fellowship::Migration; - use pallet_ranked_collective::{IdToIndex, IndexToId, MemberCount, MemberRecord, Members}; - - let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - let mut ext = sp_io::TestExternalities::new(t); - ext.execute_with(|| System::set_block_number(1)); - ext.execute_with(|| { - assert_eq!(MemberCount::::get(0), 0); - Migration::::on_runtime_upgrade(); - assert_eq!(MemberCount::::get(0), 47); - assert_eq!(MemberCount::::get(6), 3); - assert_eq!(MemberCount::::get(7), 0); - for (rank, account_id32) in FellowshipAddresses::get() { - let who = ::AccountId::from(account_id32); - assert!(IdToIndex::::get(0, &who).is_some()); - assert!(IdToIndex::::get(rank + 1, &who).is_none()); - let index = IdToIndex::::get(rank, &who).unwrap(); - assert_eq!(IndexToId::::get(rank, index).unwrap(), who); - assert_eq!( - Members::::get(&who).unwrap(), - MemberRecord::new(rank) - ); - } - }); - } -} diff --git a/system-parachains/collectives/collectives-polkadot/src/fellowship/mod.rs b/system-parachains/collectives/collectives-polkadot/src/fellowship/mod.rs index b97e44dda1..f8abba46e2 100644 --- a/system-parachains/collectives/collectives-polkadot/src/fellowship/mod.rs +++ b/system-parachains/collectives/collectives-polkadot/src/fellowship/mod.rs @@ -16,7 +16,6 @@ //! The Polkadot Technical Fellowship. -pub(crate) mod migration; mod origins; mod tracks; use crate::{ From 473498cb352d9dcae8792ca31d0184da1ab55529 Mon Sep 17 00:00:00 2001 From: Adrian Catangiu Date: Fri, 24 Nov 2023 16:01:04 +0200 Subject: [PATCH 16/21] Kusama: remove migrations applied by `spec_version: 1_000_000` (#73) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Runtimes 1.0.0 has been released: https://github.com/polkadot-fellows/runtimes/releases/tag/v1.0.0 and Kusama has now successfully updated on-chain to spec: `1_000_000`. This PR removes migrations that have been applied by the successful update of the Kusama runtime to above version. --------- Co-authored-by: Bastian Köcher --- relay/kusama/src/lib.rs | 140 +--------------------------------------- 1 file changed, 1 insertion(+), 139 deletions(-) diff --git a/relay/kusama/src/lib.rs b/relay/kusama/src/lib.rs index d1fc659abd..8e4360d502 100644 --- a/relay/kusama/src/lib.rs +++ b/relay/kusama/src/lib.rs @@ -429,17 +429,6 @@ impl pallet_authorship::Config for Runtime { type EventHandler = (Staking, ImOnline); } -impl_opaque_keys! { - pub struct OldSessionKeys { - pub grandpa: Grandpa, - pub babe: Babe, - pub im_online: ImOnline, - pub para_validator: Initializer, - pub para_assignment: ParaSessionInfo, - pub authority_discovery: AuthorityDiscovery, - } -} - impl_opaque_keys! { pub struct SessionKeys { pub grandpa: Grandpa, @@ -452,32 +441,6 @@ impl_opaque_keys! { } } -// remove this when removing `OldSessionKeys` -fn transform_session_keys(v: AccountId, old: OldSessionKeys) -> SessionKeys { - SessionKeys { - grandpa: old.grandpa, - babe: old.babe, - im_online: old.im_online, - para_validator: old.para_validator, - para_assignment: old.para_assignment, - authority_discovery: old.authority_discovery, - beefy: { - // From Session::upgrade_keys(): - // - // Care should be taken that the raw versions of the - // added keys are unique for every `ValidatorId, KeyTypeId` combination. - // This is an invariant that the session pallet typically maintains internally. - // - // So, produce a dummy value that's unique for the `ValidatorId, KeyTypeId` combination. - let mut id: BeefyId = sp_application_crypto::ecdsa::Public::from_raw([0u8; 33]).into(); - let id_raw: &mut [u8] = id.as_mut(); - id_raw[1..33].copy_from_slice(v.as_ref()); - id_raw[0..4].copy_from_slice(b"beef"); - id - }, - } -} - impl pallet_session::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ValidatorId = AccountId; @@ -1663,109 +1626,8 @@ pub type Migrations = migrations::Unreleased; /// The runtime migrations per release. #[allow(deprecated, missing_docs)] pub mod migrations { - use super::*; - use frame_support::traits::LockIdentifier; - use frame_system::pallet_prelude::BlockNumberFor; - - parameter_types! { - pub const DemocracyPalletName: &'static str = "Democracy"; - pub const CouncilPalletName: &'static str = "Council"; - pub const TechnicalCommitteePalletName: &'static str = "TechnicalCommittee"; - pub const PhragmenElectionPalletName: &'static str = "PhragmenElection"; - pub const TechnicalMembershipPalletName: &'static str = "TechnicalMembership"; - pub const TipsPalletName: &'static str = "Tips"; - pub const PhragmenElectionPalletId: LockIdentifier = *b"phrelect"; - } - - // Special Config for Gov V1 pallets, allowing us to run migrations for them without - // implementing their configs on [`Runtime`]. - pub struct UnlockConfig; - impl pallet_democracy::migrations::unlock_and_unreserve_all_funds::UnlockConfig for UnlockConfig { - type Currency = Balances; - type MaxVotes = ConstU32<100>; - type MaxDeposits = ConstU32<100>; - type AccountId = AccountId; - type BlockNumber = BlockNumberFor; - type DbWeight = ::DbWeight; - type PalletName = DemocracyPalletName; - } - impl pallet_elections_phragmen::migrations::unlock_and_unreserve_all_funds::UnlockConfig - for UnlockConfig - { - type Currency = Balances; - type MaxVotesPerVoter = ConstU32<16>; - type PalletId = PhragmenElectionPalletId; - type AccountId = AccountId; - type DbWeight = ::DbWeight; - type PalletName = PhragmenElectionPalletName; - } - impl pallet_tips::migrations::unreserve_deposits::UnlockConfig<()> for UnlockConfig { - type Currency = Balances; - type Hash = Hash; - type DataDepositPerByte = DataDepositPerByte; - type TipReportDepositBase = TipReportDepositBase; - type AccountId = AccountId; - type BlockNumber = BlockNumberFor; - type DbWeight = ::DbWeight; - type PalletName = TipsPalletName; - } - - /// Upgrade Session keys to include BEEFY key. - /// When this is removed, should also remove `OldSessionKeys`. - pub struct UpgradeSessionKeys; - impl frame_support::traits::OnRuntimeUpgrade for UpgradeSessionKeys { - fn on_runtime_upgrade() -> Weight { - Session::upgrade_keys::(transform_session_keys); - Perbill::from_percent(50) * BlockWeights::get().max_block - } - } - - pub struct ParachainsToUnlock; - impl Contains for ParachainsToUnlock { - fn contains(id: &ParaId) -> bool { - let id: u32 = (*id).into(); - // ksuama parachains/parathreads that are locked and never produced block - match id { - 2003 | 2008 | 2018 | 2077 | 2089 | 2111 | 2112 | 2120 | 2126 | 2127 | 2130 | - 2226 | 2227 | 2231 | 2233 | 2237 | 2256 | 2257 | 2261 | 2268 | 2275 => true, - _ => false, - } - } - } - /// Unreleased migrations. Add new ones here: - pub type Unreleased = ( - init_state_migration::InitMigrate, - pallet_society::migrations::VersionCheckedMigrateToV2< - Runtime, - (), - past_payouts::PastPayouts, - >, - pallet_im_online::migration::v1::Migration, - parachains_configuration::migration::v7::MigrateToV7, - parachains_configuration::migration::v8::MigrateToV8, - - // Unlock/unreserve balances from Gov v1 pallets that hold them - // https://github.com/paritytech/polkadot/issues/6749 - pallet_elections_phragmen::migrations::unlock_and_unreserve_all_funds::UnlockAndUnreserveAllFunds, - pallet_democracy::migrations::unlock_and_unreserve_all_funds::UnlockAndUnreserveAllFunds, - pallet_tips::migrations::unreserve_deposits::UnreserveDeposits, - - // Delete storage key/values from all Gov v1 pallets - frame_support::migrations::RemovePallet::DbWeight>, - frame_support::migrations::RemovePallet::DbWeight>, - frame_support::migrations::RemovePallet::DbWeight>, - frame_support::migrations::RemovePallet::DbWeight>, - frame_support::migrations::RemovePallet::DbWeight>, - frame_support::migrations::RemovePallet::DbWeight>, - - // Upgrade SessionKeys to include BEEFY key - UpgradeSessionKeys, - - parachains_configuration::migration::v9::MigrateToV9, - // Migrate parachain info format - paras_registrar::migration::VersionCheckedMigrateToV1, - ); + pub type Unreleased = (); } /// Unchecked extrinsic type as expected by this runtime. From 0a15ee663f1bc1f7e2828c936fa926a0f060b1c9 Mon Sep 17 00:00:00 2001 From: Javier Bullrich Date: Thu, 30 Nov 2023 00:41:25 +0100 Subject: [PATCH 17/21] upgraded review bot to 2.3.0 (#105) Upgraded to version 2.3.0 which includes: - paritytech/review-bot#103 - paritytech/review-bot#102 --- .github/workflows/review-bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/review-bot.yml b/.github/workflows/review-bot.yml index b9ffd43f9e..62ddb42ffd 100644 --- a/.github/workflows/review-bot.yml +++ b/.github/workflows/review-bot.yml @@ -26,7 +26,7 @@ jobs: app_id: ${{ secrets.REVIEW_APP_ID }} private_key: ${{ secrets.REVIEW_APP_KEY }} - name: "Evaluates PR reviews and assigns reviewers" - uses: paritytech/review-bot@v2.1.0 + uses: paritytech/review-bot@v2.3.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} team-token: ${{ steps.team_token.outputs.token }} From 4e4da0850716fe61747a80cb2b85e157a3fc4ff9 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Thu, 30 Nov 2023 08:40:38 +0300 Subject: [PATCH 18/21] Upgrade from v1.2 to v1.3 (#87) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Opening PR mostly for visibility - I expect #56 to be finished before, which would bump everything to v1.2 and then I'll convert this PR to v1.2 -> v1.3. In its current state, this PR does v1.0 -> v1.3 bump, although I've only been looking at [v1.2 -> v1.3 changelog](https://github.com/paritytech/polkadot-sdk/releases/tag/polkadot-v1.3.0), so everything else just compiles. TODOs left in this PR (which I'd like to address after #56 is finished): - [x] revert `[cargo upgrade --pinned --incompatible](https://github.com/polkadot-fellows/runtimes/commit/8df27a586b598d2f783b53cd62b127b8f8ac846a)` and only leave sdk crates bump; - [x] rebase on top of #56; - [x] ensure that remaining PRs from v1.2 -> v1.3 are either not required for P/K or shall be added later (https://github.com/paritytech/polkadot-sdk/pull/1344, https://github.com/paritytech/polkadot-sdk/pull/1333); - [x] update weights - [x] ~(maybe worth a separate PR) there's a lot of unused weight files in this repo - I'd like to remove it~ will do it in a separate PR - tracked here: https://github.com/svyatonik/runtimes/tree/remove-unused-weight-files @liamaharon Can you, please, confirm that the https://github.com/paritytech/polkadot-sdk/pull/1344 was necessary only for sdk CI fixes - that PR caught my eye when I was looking at 1.3 CHANGELOG and I was wondering if we need to do the same for Polkadot, Kusama and system parachains? --------- Co-authored-by: Branislav Kontur Co-authored-by: muharem Co-authored-by: Bastian Köcher Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: Adrian Catangiu --- CHANGELOG.md | 10 + Cargo.lock | 1493 ++++++++++------- relay/kusama/Cargo.toml | 190 ++- relay/kusama/constants/Cargo.toml | 15 +- relay/kusama/constants/src/lib.rs | 29 + relay/kusama/src/lib.rs | 146 +- relay/kusama/src/weights/mod.rs | 1 + relay/kusama/src/weights/pallet_asset_rate.rs | 86 + .../src/weights/pallet_nomination_pools.rs | 19 + relay/kusama/src/weights/pallet_treasury.rs | 106 +- relay/kusama/src/weights/xcm/mod.rs | 1 - relay/kusama/src/xcm_config.rs | 36 +- relay/polkadot/Cargo.toml | 176 +- relay/polkadot/constants/Cargo.toml | 15 +- relay/polkadot/constants/src/lib.rs | 25 +- relay/polkadot/src/lib.rs | 123 +- relay/polkadot/src/weights/mod.rs | 1 + .../polkadot/src/weights/pallet_asset_rate.rs | 86 + .../src/weights/pallet_nomination_pools.rs | 18 + relay/polkadot/src/weights/pallet_treasury.rs | 106 +- relay/polkadot/src/weights/xcm/mod.rs | 1 - relay/polkadot/src/xcm_config.rs | 32 +- .../asset-hubs/asset-hub-kusama/Cargo.toml | 125 +- .../asset-hubs/asset-hub-kusama/src/lib.rs | 47 +- .../asset-hub-kusama/src/weights/xcm/mod.rs | 17 +- .../asset-hub-kusama/src/xcm_config.rs | 80 +- .../asset-hubs/asset-hub-polkadot/Cargo.toml | 117 +- .../asset-hubs/asset-hub-polkadot/src/lib.rs | 52 +- .../asset-hub-polkadot/src/weights/xcm/mod.rs | 17 +- .../asset-hub-polkadot/src/xcm_config.rs | 76 +- .../bridge-hubs/bridge-hub-kusama/Cargo.toml | 103 +- .../bridge-hubs/bridge-hub-kusama/src/lib.rs | 47 +- .../bridge-hub-kusama/src/weights/xcm/mod.rs | 17 +- .../bridge-hub-kusama/src/xcm_config.rs | 53 +- .../bridge-hub-polkadot/Cargo.toml | 103 +- .../bridge-hub-polkadot/src/lib.rs | 47 +- .../src/weights/xcm/mod.rs | 22 +- .../bridge-hub-polkadot/src/xcm_config.rs | 55 +- .../collectives-polkadot/Cargo.toml | 116 +- .../collectives-polkadot/src/lib.rs | 40 +- .../collectives-polkadot/src/xcm_config.rs | 54 +- .../gluttons/glutton-kusama/Cargo.toml | 61 +- .../gluttons/glutton-kusama/src/lib.rs | 13 +- 43 files changed, 2659 insertions(+), 1318 deletions(-) create mode 100644 relay/kusama/src/weights/pallet_asset_rate.rs create mode 100644 relay/polkadot/src/weights/pallet_asset_rate.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 60daaed988..759067cc9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Upgrade Preimage pallet's config implementations to adapt the new `Consideration` API ([polkadot-fellows/runtimes#56](https://github.com/polkadot-fellows/runtimes/pull/56)) - Remove `experimental` feature flag for `pallet-society`, `pallet-xcm`, and `runtime-common` crates imports ([polkadot-fellows/runtimes#56](https://github.com/polkadot-fellows/runtimes/pull/56)) - Election provider: use a geometric deposit base calculation for EPM signed submissions in Polkadot and Kusama ([polkadot-fellows/runtimes#56](https://github.com/polkadot-fellows/runtimes/pull/56)) +- Make `IdentityInfo` generic in `pallet-identity` ([polkadot-fellows/runtimes#87](https://github.com/polkadot-fellows/runtimes/pull/87)). Context: https://github.com/paritytech/polkadot-sdk/pull/1661 + +### Added + +- Enable async backing on Kusama ([polkadot-fellows/runtimes#87](https://github.com/polkadot-fellows/runtimes/pull/87)). Context: https://github.com/paritytech/polkadot-sdk/pull/1543 +- Implemented GenesisBuilder API for all runtimes ([polkadot-fellows/runtimes#87](https://github.com/polkadot-fellows/runtimes/pull/87)). Context: https://github.com/paritytech/polkadot-sdk/pull/1492 +- XCM transport fees are now exponential and are sent to a treasury account ([polkadot-fellows/runtimes#87](https://github.com/polkadot-fellows/runtimes/pull/87)). Context: https://github.com/paritytech/polkadot-sdk/pull/1234 +- System parachains are now trusted teleporters of each other ([polkadot-fellows/runtimes#87](https://github.com/polkadot-fellows/runtimes/pull/87)). Context: https://github.com/paritytech/polkadot-sdk/pull/1368 +- Treasury is able to spend various asset kinds ([polkadot-fellows/runtimes#87](https://github.com/polkadot-fellows/runtimes/pull/87)) ### Fixed - Add missing weight functions for `runtime_parachains_hrmp` and `preimage` pallets ([polkadot-fellows/runtimes#56](https://github.com/polkadot-fellows/runtimes/pull/56)) +- Fix for Reward Deficit in the pool ([polkadot-fellows/runtimes#87](https://github.com/polkadot-fellows/runtimes/pull/87)). Context: https://github.com/paritytech/polkadot-sdk/pull/1255 ## [1.0.1] 22.10.2023 diff --git a/Cargo.lock b/Cargo.lock index b6405364aa..b007446808 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -110,7 +110,7 @@ dependencies = [ "cipher 0.3.0", "ctr 0.8.0", "ghash 0.4.4", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -124,7 +124,7 @@ dependencies = [ "cipher 0.4.4", "ctr 0.9.2", "ghash 0.5.0", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -179,6 +179,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -286,6 +292,141 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +[[package]] +name = "ark-bls12-377" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb00293ba84f51ce3bd026bd0de55899c4e68f0a39a5728cebae3a73ffdc0a4f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "array-bytes" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" + [[package]] name = "array-bytes" version = "6.1.0" @@ -405,7 +546,7 @@ dependencies = [ "frame-system-rpc-runtime-api", "frame-try-runtime", "hex-literal", - "kusama-runtime-constants 1.0.0", + "kusama-runtime-constants", "log", "pallet-asset-conversion", "pallet-asset-conversion-tx-payment", @@ -440,6 +581,7 @@ dependencies = [ "sp-block-builder", "sp-consensus-aura", "sp-core", + "sp-genesis-builder", "sp-inherents", "sp-offchain", "sp-runtime", @@ -502,13 +644,14 @@ dependencies = [ "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-runtime-common", - "polkadot-runtime-constants 1.0.0", + "polkadot-runtime-constants", "scale-info", "smallvec", "sp-api", "sp-block-builder", "sp-consensus-aura", "sp-core", + "sp-genesis-builder", "sp-inherents", "sp-offchain", "sp-runtime", @@ -527,9 +670,9 @@ dependencies = [ [[package]] name = "asset-test-utils" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cffdf2b648c1621ab71f24dbb08758d23709c72b7f0bd6795f16eef45579fe" +checksum = "de674aa0b8f0c31a00fd99a4003751c788c7023ed62527097a1286dd530fbe60" dependencies = [ "assets-common", "cumulus-pallet-dmp-queue", @@ -545,6 +688,7 @@ dependencies = [ "pallet-collator-selection", "pallet-session", "pallet-xcm", + "pallet-xcm-bridge-hub-router", "parachains-common", "parachains-runtimes-test-utils", "parity-scale-codec", @@ -556,15 +700,16 @@ dependencies = [ "sp-std", "staging-parachain-info", "staging-xcm", + "staging-xcm-builder", "staging-xcm-executor", "substrate-wasm-builder", ] [[package]] name = "assets-common" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed19c72a730ac55e147d8f3204468f3dfb50d53c4c4e285d05cacd0c71bdecee" +checksum = "f8b8aa1c485e12af4a0a2b48402fa85d382ab4962731e71f5edc0f85c4cba28c" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -625,17 +770,6 @@ dependencies = [ "event-listener", ] -[[package]] -name = "async-recursion" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "async-trait" version = "0.1.73" @@ -745,9 +879,9 @@ dependencies = [ [[package]] name = "binary-merkle-tree" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1ea0c49f8a41e530d4cbb7c81651d9d085d5f1470f4e4ea8c8c9c59b67a1bf" +checksum = "a399848a68a5196a04c19db5bfc4dca3cd0989a3165150f06c1ad1bc8882aa34" dependencies = [ "hash-db", "log", @@ -807,6 +941,18 @@ dependencies = [ "wyz", ] +[[package]] +name = "blake2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" +dependencies = [ + "byte-tools", + "crypto-mac 0.7.0", + "digest 0.8.1", + "opaque-debug 0.2.3", +] + [[package]] name = "blake2" version = "0.10.6" @@ -930,9 +1076,9 @@ dependencies = [ [[package]] name = "bp-bridge-hub-cumulus" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ce716fc5e1c4b8201edf2e606e7ad16575b2bbc2bf0d47c79c613847bc78841" +checksum = "9b18aaf9ed9ecffade4d56bb1a63cd70b9e61ea4ef69023f2dcd0fd54d18f280" dependencies = [ "bp-messages", "bp-polkadot-core", @@ -946,9 +1092,9 @@ dependencies = [ [[package]] name = "bp-bridge-hub-rococo" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "717a65501207b3228c7b43dd41bded921145a2576c826d46983ac5e212d48fd3" +checksum = "7dcb3425030c446f51c0d9bc71605b42dc96acff94b2feff51cd09a5e58dc0dd" dependencies = [ "bp-bridge-hub-cumulus", "bp-messages", @@ -961,9 +1107,9 @@ dependencies = [ [[package]] name = "bp-bridge-hub-wococo" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9954fcb7b2d22c528eb5ce2fe8d4fd0ec9ba4f61e110416f82e09c5420b8f01" +checksum = "0ecd2e53fcb7b489a544e27474839586b662bd0c5eea0a9bd21d5eaeae8e6b0b" dependencies = [ "bp-bridge-hub-cumulus", "bp-messages", @@ -976,9 +1122,9 @@ dependencies = [ [[package]] name = "bp-header-chain" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e5f1fc28d625ae266e8cb75e755e2d975009b81d2acaa3ca491de8649c10a3" +checksum = "fb057324305f7cacce9d87a82d0e6e8de8ec2ff40fd2df707f97f74ddd0631f9" dependencies = [ "bp-runtime", "finality-grandpa", @@ -994,9 +1140,9 @@ dependencies = [ [[package]] name = "bp-messages" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c772d4a9622e851363b140621846d77a7c4723b89f40cff03f20ddc8021e2f" +checksum = "c4df7b23c2c5cdfb7260c0c88835e554f857b0a80e4c1cfa48dd1194e6fb6c6d" dependencies = [ "bp-header-chain", "bp-runtime", @@ -1010,9 +1156,9 @@ dependencies = [ [[package]] name = "bp-parachains" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489e6393ed00e33fe1dac88208488a05d8b4394bcacfb7d534f001174680df30" +checksum = "16a644c3fa5ac2233dd2de94ebe2a4aa98c7cca36b34d96e6604f4d34b0758b4" dependencies = [ "bp-header-chain", "bp-polkadot-core", @@ -1028,9 +1174,9 @@ dependencies = [ [[package]] name = "bp-polkadot-core" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bf1cd48449dc78e78dc2521242221a2c122af237dcb0590015b3daf378d3e6b" +checksum = "34f0342d051a3b07fecbcabc7efca35880865ede7ef5b2b49ca323c94bdb6d53" dependencies = [ "bp-messages", "bp-runtime", @@ -1047,9 +1193,9 @@ dependencies = [ [[package]] name = "bp-relayers" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f95ab06bd8ce8fe01bd6d2d4aacb6b0cd3a5b4bec33f8bb9b24fcaf0c9de6afd" +checksum = "e11ea832eedd3bb19a13f77474b4eced1782914527fc54404a423d6259095bdb" dependencies = [ "bp-messages", "bp-runtime", @@ -1062,9 +1208,9 @@ dependencies = [ [[package]] name = "bp-runtime" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41088b5a0ea0a7d6de116872637e0da0b8aba00845825d199d63d3cd6b10f7ad" +checksum = "8c4fd30d6814b73c245c40c760ffbadec3f834865ddd681161ef33672a766e50" dependencies = [ "frame-support", "frame-system", @@ -1086,9 +1232,9 @@ dependencies = [ [[package]] name = "bp-test-utils" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bc1a2e7117843f44c4eab10af8ae89beacfa5331be70ff65580770e952742c3" +checksum = "e625f0def0740566ca053a7b7076c301992eed132b3821a07e835bb8062fb79a" dependencies = [ "bp-header-chain", "bp-parachains", @@ -1107,9 +1253,9 @@ dependencies = [ [[package]] name = "bp-xcm-bridge-hub-router" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33da9fb48f8dbfaa418098f81fb342b7fc71cbf4a3e4154e73da3ddc5c6e8eec" +checksum = "be3b4fafc31f17da1b4ea403c4118e4f4f1d9a5a696729b374551d582e48633b" dependencies = [ "parity-scale-codec", "scale-info", @@ -1138,7 +1284,7 @@ dependencies = [ "frame-system-rpc-runtime-api", "frame-try-runtime", "hex-literal", - "kusama-runtime-constants 1.0.0", + "kusama-runtime-constants", "log", "pallet-aura", "pallet-authorship", @@ -1164,6 +1310,7 @@ dependencies = [ "sp-block-builder", "sp-consensus-aura", "sp-core", + "sp-genesis-builder", "sp-inherents", "sp-io", "sp-offchain", @@ -1219,7 +1366,7 @@ dependencies = [ "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-runtime-common", - "polkadot-runtime-constants 1.0.0", + "polkadot-runtime-constants", "scale-info", "serde", "smallvec", @@ -1227,6 +1374,7 @@ dependencies = [ "sp-block-builder", "sp-consensus-aura", "sp-core", + "sp-genesis-builder", "sp-inherents", "sp-io", "sp-offchain", @@ -1245,11 +1393,10 @@ dependencies = [ [[package]] name = "bridge-hub-test-utils" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7eaec22f9b8e9c273ad81967b667601136dce45556ffb20c1a58ce05b1daa30" +checksum = "a3598ffa3d0c5f5651dee8aea016b69c5a3be48ab01fb83f773c93af0cf77c68" dependencies = [ - "assert_matches", "asset-test-utils", "bp-bridge-hub-rococo", "bp-bridge-hub-wococo", @@ -1286,6 +1433,7 @@ dependencies = [ "sp-io", "sp-keyring", "sp-runtime", + "sp-tracing", "staging-parachain-info", "staging-xcm", "staging-xcm-builder", @@ -1294,9 +1442,9 @@ dependencies = [ [[package]] name = "bridge-runtime-common" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97cad9f78ab42138deed67edc3b5123b3db390675d129b781e305424d6ee8e29" +checksum = "a585d0a58356e3a6131a2cb77a69af5580af278075cac46a85d54e5f6ea1b982" dependencies = [ "bp-header-chain", "bp-messages", @@ -1408,6 +1556,16 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "c2-chacha" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27dae93fe7b1e0424dc57179ac396908c26b035a87234809f5c4dfd1b47dc80" +dependencies = [ + "cipher 0.2.5", + "ppv-lite86", +] + [[package]] name = "camino" version = "1.1.6" @@ -1458,7 +1616,7 @@ checksum = "5aca1a8fbc20b50ac9673ff014abfb2b5f4085ee1a850d408f14a159c5853ac7" dependencies = [ "aead 0.3.2", "cipher 0.2.5", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -1491,6 +1649,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +[[package]] +name = "chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf3c081b5fba1e5615640aae998e0fbd10c24cbd897ee39ed754a77601a4862" +dependencies = [ + "byteorder", + "keystream", +] + [[package]] name = "chacha20" version = "0.8.2" @@ -1700,7 +1868,7 @@ dependencies = [ "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-runtime-common", - "polkadot-runtime-constants 1.0.0", + "polkadot-runtime-constants", "scale-info", "smallvec", "sp-api", @@ -1708,6 +1876,7 @@ dependencies = [ "sp-block-builder", "sp-consensus-aura", "sp-core", + "sp-genesis-builder", "sp-inherents", "sp-offchain", "sp-runtime", @@ -1797,6 +1966,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "constcat" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" + [[package]] name = "convert_case" version = "0.4.0" @@ -2035,7 +2210,7 @@ checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", - "subtle", + "subtle 2.4.1", "zeroize", ] @@ -2047,7 +2222,7 @@ checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", - "subtle", + "subtle 2.4.1", "zeroize", ] @@ -2062,6 +2237,16 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-mac" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +dependencies = [ + "generic-array 0.12.4", + "subtle 1.0.0", +] + [[package]] name = "crypto-mac" version = "0.8.0" @@ -2069,7 +2254,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ "generic-array 0.14.7", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -2079,7 +2264,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" dependencies = [ "generic-array 0.14.7", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -2102,9 +2287,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-aura-ext" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b220a1c3071a088217c0a23020b17baba60e2685f13ae08396e10b3c62e197a5" +checksum = "071cdddd31e2b0d47a74249675de828857f61eb5f6afa36cfcf63ea6ee2b60f2" dependencies = [ "cumulus-pallet-parachain-system", "frame-support", @@ -2121,9 +2306,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-dmp-queue" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c63f5595db891c0b05c846a1fd7d0f49ad8b4b19e5f79f015e125853b6a519e1" +checksum = "5d1cb9d43cdfeedea19b4f6b8386e5b6264a97938b29f5c711a84e9dc7105ff7" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -2139,9 +2324,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8848c0ce4e55777b621703ef62224d5b8e2c250ccc03fb34c5372d995b86fa16" +checksum = "d20d2280051998fcf113f04d25d4b39f27b449570b6350fdfb7e92541cb0aae7" dependencies = [ "bytes", "cumulus-pallet-parachain-system-proc-macro", @@ -2154,6 +2339,7 @@ dependencies = [ "log", "parity-scale-codec", "polkadot-parachain-primitives", + "polkadot-runtime-parachains", "scale-info", "sp-core", "sp-externalities", @@ -2170,9 +2356,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system-proc-macro" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1235a0c8b242349a41d84c07774e17acf942e9fee383dda31c021ccaea9eedb" +checksum = "84baea20d10325b2501b6fa06d4a7902a43d6a6c62c71b5309e75c3ad8ae1441" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2182,9 +2368,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-session-benchmarking" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bf028e8349229271e07d4ce99d8ada205a27de52d849bdd08e89a8271df424" +checksum = "0bf9aaa60ed60ee9cbfc55535a6e2a01353c8308135e24d6c50ba989e518f17d" dependencies = [ "frame-benchmarking", "frame-support", @@ -2197,9 +2383,9 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcm" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9848582a0748e29ab06faf9b1448b7039da1f90f6400b384c391c5831cb5fd7c" +checksum = "4ff03e14a0f5847bdee67a673ee945d3acd5c1d7238d46993208dcbfb774e27f" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -2214,10 +2400,11 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcmp-queue" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ac74a0c55c7ed27a51ce618b864e9d4a7f39de8ea03a4bd65ccff55145b5fa" +checksum = "b6af9816dd6564149729ba133c2c984c88fb15c4a2cb66f57be06b9147744e51" dependencies = [ + "bp-xcm-bridge-hub-router", "cumulus-primitives-core", "frame-benchmarking", "frame-support", @@ -2225,8 +2412,10 @@ dependencies = [ "log", "parity-scale-codec", "polkadot-runtime-common", + "polkadot-runtime-parachains", "rand_chacha 0.3.1", "scale-info", + "sp-core", "sp-io", "sp-runtime", "sp-std", @@ -2236,9 +2425,9 @@ dependencies = [ [[package]] name = "cumulus-primitives-core" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aed2ae9917749ad77ca62acf65826a0f5e725a920ff1cab01d9bb020d59cdbf" +checksum = "d40f62add2352287be4cb58b0017a91f61d953e2c6d2777c20d93185558196e1" dependencies = [ "parity-scale-codec", "polkadot-core-primitives", @@ -2254,9 +2443,9 @@ dependencies = [ [[package]] name = "cumulus-primitives-parachain-inherent" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87d8d415d8748df234bf0415576648fa529fbffa9de802959db7851f5e43d4dc" +checksum = "9d0b1e0e6dcf393dbf05b31122a8c4739acf407a96ec8fd707886f36ee95c355" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2278,15 +2467,17 @@ dependencies = [ [[package]] name = "cumulus-primitives-utility" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "926a72124a351594cfdce41d7762e668d442e08c193d909d9f69fbe22e95414e" +checksum = "6b4ef704f5a346711d0448f82e57dc5784b186f4bf5e3efbbca0df814b203539" dependencies = [ "cumulus-primitives-core", "frame-support", "log", + "pallet-xcm-benchmarks", "parity-scale-codec", "polkadot-runtime-common", + "polkadot-runtime-parachains", "sp-io", "sp-runtime", "sp-std", @@ -2297,9 +2488,9 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-interface" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642e7e83e5b3162cb2bf5b160e11443f5aabf11c5fd3c1deaf116d907ae79716" +checksum = "af081ef8885042e7ae96e9d1cf32ec6f0616fe4cb78f0325ed7c5accded687fb" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2316,9 +2507,9 @@ dependencies = [ [[package]] name = "cumulus-test-relay-sproof-builder" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fba4a4d5de5f68bde4aff857194efcaae44e874b6947d9aac9ea02bcda4382c" +checksum = "59b921a9cb6758faa1c739f135fd87aa1e10a4e86a1c1db3119b396a62287cf2" dependencies = [ "cumulus-primitives-core", "parity-scale-codec", @@ -2338,7 +2529,7 @@ dependencies = [ "byteorder", "digest 0.8.1", "rand_core 0.5.1", - "subtle", + "subtle 2.4.1", "zeroize", ] @@ -2351,7 +2542,7 @@ dependencies = [ "byteorder", "digest 0.9.0", "rand_core 0.5.1", - "subtle", + "subtle 2.4.1", "zeroize", ] @@ -2368,7 +2559,7 @@ dependencies = [ "fiat-crypto", "platforms", "rustc_version", - "subtle", + "subtle 2.4.1", "zeroize", ] @@ -2642,7 +2833,7 @@ dependencies = [ "block-buffer 0.10.4", "const-oid", "crypto-common", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -2852,7 +3043,7 @@ dependencies = [ "pkcs8 0.9.0", "rand_core 0.6.4", "sec1 0.3.0", - "subtle", + "subtle 2.4.1", "zeroize", ] @@ -2871,7 +3062,7 @@ dependencies = [ "pkcs8 0.10.2", "rand_core 0.6.4", "sec1 0.7.3", - "subtle", + "subtle 2.4.1", "zeroize", ] @@ -3030,7 +3221,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f86a749cf851891866c10515ef6c299b5c69661465e9c3bbe7e07a2b77fb0f7" dependencies = [ - "blake2", + "blake2 0.10.6", "fs-err", "proc-macro2", "quote", @@ -3105,7 +3296,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ "rand_core 0.6.4", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -3115,7 +3306,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "rand_core 0.6.4", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -3208,9 +3399,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6d54d3a638f0279210c924f4a44e6548bf6345670f5af059a874a5006af4eca" +checksum = "1c2d0a4310dcf0e5cce78e35e60dc2fda80ef61c8f8fc382e685dfc24fcf5db9" dependencies = [ "parity-scale-codec", ] @@ -3232,9 +3423,9 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01af5751a0e4492dc979c57586976403e7ab63641add1a9fd804cad4169f4f6" +checksum = "3dd4946d63eab00d899f08a7e74e965cc6785c2298efaea6a2752905f4810407" dependencies = [ "frame-support", "frame-support-procedural", @@ -3258,9 +3449,9 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" -version = "11.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35d1461dc3a49bbd9bdf8955eca27f54cdcc6b38373bbd636e011a8594d23f3f" +checksum = "03911cf3675af64252a6de7b4f383eafa80d5ea5830184e7a0739aeb0b95272d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3270,9 +3461,9 @@ dependencies = [ [[package]] name = "frame-election-provider-support" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fe9b8322a08a8a52ed3a7a7f7ca90827aa3bace41dc060c5b32d2ff0cd25c3" +checksum = "ebad507fb038db2f7ce982d30bd9828a59785c9a4780348d59cd6cceaee80d1a" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -3288,9 +3479,9 @@ dependencies = [ [[package]] name = "frame-executive" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da12a8c223d6991bd7f9aae542d3d7c9fadde3a81b6f16c2550b808f3b21ecd5" +checksum = "2dda2c20ea3267ee20c9a5482f320236510c4ade6aec1dd930cb57dc5651c64f" dependencies = [ "frame-support", "frame-system", @@ -3319,11 +3510,10 @@ dependencies = [ [[package]] name = "frame-remote-externalities" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b26379217d223364e6715ed12cdfdc9f368c6afcb15fd8771e387ab7b0265f" +checksum = "a30013df51f4d4e58472c4fecdbfeb141234ece5f6355e5b3a3e51d3f87d452d" dependencies = [ - "async-recursion", "futures", "indicatif", "jsonrpsee", @@ -3342,9 +3532,9 @@ dependencies = [ [[package]] name = "frame-support" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0dc5640279221fbd316a3a652963c1cb9d51630ea3f62a08a5ad7fa402f23a4" +checksum = "023504bbdd0e8d1ebe3d9d289b009337cdb9a24c5e74615ffd7b188aa1664c2d" dependencies = [ "aquamarine", "bitflags 1.3.2", @@ -3383,9 +3573,9 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "19.0.0" +version = "20.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f22719c65353a0010a084cb2040e2e6569aff34562e59119cb66ddd7ecfa588c" +checksum = "1d6bc383298353ff2790ac1a301262c21ac196dbc26ef67a2213c46524a06dd1" dependencies = [ "Inflector", "cfg-expr", @@ -3397,14 +3587,15 @@ dependencies = [ "proc-macro-warning", "proc-macro2", "quote", + "sp-core-hashing", "syn 2.0.38", ] [[package]] name = "frame-support-procedural-tools" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e046ecdc04dd66f17d760525631f553ddcbea6f09423f78fcf52b47c97656cd0" +checksum = "b3ac1266522a8c9a2d2d26d205ec3028b88582d5f3cd5cbc75d0ec8271d197b7" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -3415,9 +3606,9 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4034ebf9ca7497fa3893191fe3e81adcd3d7cd1c232e60ef41ef58ea0c445ae9" +checksum = "d9c078db2242ea7265faa486004e7fd8daaf1a577cfcac0070ce55d926922883" dependencies = [ "proc-macro2", "quote", @@ -3426,9 +3617,9 @@ dependencies = [ [[package]] name = "frame-system" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc19d4d4037b695805385d56983da173bbb969f68e0e4e6a1240bb30118e87d7" +checksum = "57e316407c45a5093c833966a906301aa0dcbd05048061cd9cde2548d017bfd9" dependencies = [ "cfg-if", "frame-support", @@ -3446,9 +3637,9 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb79e630dc8fbed5601e58c1b8d84ec3900a511f105140b5bbb6c18c476488d2" +checksum = "b5b1388055d29a7a1c4d41b1623d3fcbc9d7f31d17abe04500b270b26901d926" dependencies = [ "frame-benchmarking", "frame-support", @@ -3462,9 +3653,9 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13ed2be7e4ad2cf140d16b94194595d3b2fea0b60a46832945c497924c2d0d0" +checksum = "17572a34fd866ad6cab6977a2c30b38645e0a499b3486de00ae9103f7002d6d3" dependencies = [ "parity-scale-codec", "sp-api", @@ -3472,9 +3663,9 @@ dependencies = [ [[package]] name = "frame-try-runtime" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9eceb53c4efa82dd7dd08f0770abfaa9587c592a015b21dc29ce4c24422de13" +checksum = "f082e770275f9b46ddf46b09bc7a993f84db691c39d9e4d038ac07443cb17a18" dependencies = [ "frame-support", "parity-scale-codec", @@ -3756,6 +3947,7 @@ dependencies = [ "sp-api", "sp-block-builder", "sp-core", + "sp-genesis-builder", "sp-inherents", "sp-offchain", "sp-runtime", @@ -3779,7 +3971,7 @@ checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff 0.12.1", "rand_core 0.6.4", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -3790,7 +3982,7 @@ checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff 0.13.0", "rand_core 0.6.4", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -3850,6 +4042,19 @@ name = "hashbrown" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash 0.8.3", + "allocator-api2", +] + +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.0", +] [[package]] name = "heck" @@ -4518,6 +4723,12 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keystream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33070833c9ee02266356de0c43f723152bd38bd96ddf52c82b3af10c9138b28" + [[package]] name = "kusama-runtime-constants" version = "1.0.0" @@ -4529,21 +4740,7 @@ dependencies = [ "sp-core", "sp-runtime", "sp-weights", -] - -[[package]] -name = "kusama-runtime-constants" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd5fda44486f7b352e8199e091d80371b1b9fdd9b3c117e5e25ec28477220a5" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", + "staging-xcm", ] [[package]] @@ -4607,6 +4804,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "libp2p" version = "0.51.3" @@ -5074,7 +5277,7 @@ checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" dependencies = [ "crunchy", "digest 0.9.0", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -5157,6 +5360,18 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +[[package]] +name = "lioness" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae926706ba42c425c9457121178330d75e273df2e82e28b758faf3de3a9acb9" +dependencies = [ + "arrayref", + "blake2 0.8.1", + "chacha", + "keystream", +] + [[package]] name = "lock_api" version = "0.4.10" @@ -5231,9 +5446,9 @@ dependencies = [ [[package]] name = "macro_magic" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aee866bfee30d2d7e83835a4574aad5b45adba4cc807f2a3bbba974e5d4383c9" +checksum = "e03844fc635e92f3a0067e25fa4bf3e3dbf3f2927bf3aa01bb7bc8f1c428949d" dependencies = [ "macro_magic_core", "macro_magic_macros", @@ -5243,9 +5458,9 @@ dependencies = [ [[package]] name = "macro_magic_core" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e766a20fd9c72bab3e1e64ed63f36bd08410e75803813df210d1ce297d7ad00" +checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d" dependencies = [ "const-random", "derive-syn-parse", @@ -5257,9 +5472,9 @@ dependencies = [ [[package]] name = "macro_magic_core_macros" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c12469fc165526520dff2807c2975310ab47cf7190a45b99b49a7dc8befab17b" +checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" dependencies = [ "proc-macro2", "quote", @@ -5268,9 +5483,9 @@ dependencies = [ [[package]] name = "macro_magic_macros" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fb85ec1620619edf2984a7693497d4ec88a9665d8b87e942856884c92dbf2a" +checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" dependencies = [ "macro_magic_core", "quote", @@ -5432,6 +5647,31 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mixnet" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa3eb39495d8e2e2947a1d862852c90cc6a4a8845f8b41c8829cb9fcc047f4a" +dependencies = [ + "arrayref", + "arrayvec 0.7.4", + "bitflags 1.3.2", + "blake2 0.10.6", + "c2-chacha", + "curve25519-dalek 4.0.0", + "either", + "hashlink", + "lioness", + "log", + "parking_lot 0.12.1", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_distr", + "subtle 2.4.1", + "thiserror", + "zeroize", +] + [[package]] name = "mockall" version = "0.11.4" @@ -5740,6 +5980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -5893,11 +6134,11 @@ dependencies = [ [[package]] name = "pallet-alliance" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aa981568b2cfe63b62b09c09d369d69283d54395ba94be3669dbe38ec6da95d" +checksum = "a3526a94a8aca9d98f06eb8ee76e1bf65f80fd23c278b25e6537a23b51392a85" dependencies = [ - "array-bytes", + "array-bytes 6.1.0", "frame-benchmarking", "frame-support", "frame-system", @@ -5915,9 +6156,9 @@ dependencies = [ [[package]] name = "pallet-asset-conversion" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e13819a9db7afbe281394b31f73a797bac08688c9aa43fc7114dd448742e05" +checksum = "dd7f0ae643c877d9a36d7335bcda6614861b846a60f448da8cf3276d4042ef33" dependencies = [ "frame-benchmarking", "frame-support", @@ -5934,9 +6175,9 @@ dependencies = [ [[package]] name = "pallet-asset-conversion-tx-payment" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cec5f8b0d20b9967345e4177e30afbe3584ecf502be767e45d57b13550c8e9e0" +checksum = "64952179a5a409dead964a387c86a29d16d40a34cf54bf88e4d74ffdcdddf7a6" dependencies = [ "frame-support", "frame-system", @@ -5948,11 +6189,27 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-asset-rate" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740aebbcfefe8528f56ff8a339f810520a28df3ec159d016ef719aaa9f131af4" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-asset-tx-payment" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7e58838852ea75ab55a57316d5a81344d8e7917da4490abffbb3a81ffb8872" +checksum = "028e30633114612160fc4e7add46504790abb3780db79eae1efae98c034dca0b" dependencies = [ "frame-benchmarking", "frame-support", @@ -5969,9 +6226,9 @@ dependencies = [ [[package]] name = "pallet-assets" -version = "25.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d704075c2b504c1f66263440cf97af860efd7e7919f25ccebdeeeb255313c261" +checksum = "09b91035c82dc9e64eaf52f3f6a39f4674bcb56333553882d6ff5d12500a9182" dependencies = [ "frame-benchmarking", "frame-support", @@ -5986,9 +6243,9 @@ dependencies = [ [[package]] name = "pallet-aura" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e2b1cf20dbd9fe630c69b4b0d3bb0d5fa1223ee728b0fc0064ef65698918c2" +checksum = "04fbef67cf62445b7fd8e68241e6b71d9fb8c77abb3d52259eebf525a4cd5586" dependencies = [ "frame-support", "frame-system", @@ -6004,9 +6261,9 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bdc251538bcec9340337a1624372561e6d8e6ae4eeb1adb1d7b1af13b349cda" +checksum = "fda272a66bbf1602579efcede67606ac43cda6d462ad551c527d8cadc871813d" dependencies = [ "frame-support", "frame-system", @@ -6021,9 +6278,9 @@ dependencies = [ [[package]] name = "pallet-authorship" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae682e78744224150298730dfa1e2c39220e600dce17e42d2c77e49af3d9c59f" +checksum = "2d38eab59f7d15fe43c81fc3cd92f4c1f895ca6d0efb74fc2a6d6d7d3d34d413" dependencies = [ "frame-support", "frame-system", @@ -6036,9 +6293,9 @@ dependencies = [ [[package]] name = "pallet-babe" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebab5b1891cc12c13348509831703bea1f160eff60fa7b76b94097cf13b7dcc" +checksum = "6b12430ca4b79b27231acb1ff3f99d33d6503fbeba40bfc8380e42d59b6d52b0" dependencies = [ "frame-benchmarking", "frame-support", @@ -6061,9 +6318,9 @@ dependencies = [ [[package]] name = "pallet-bags-list" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd175d6ac024054b5fb41ce899a656e2e3972b0c4a2cbbe030b8d79fe25dc892" +checksum = "5d49c4448e51a5c64d63a4263aebeb2dfb90dabb48746e178b337fb7f533d45f" dependencies = [ "aquamarine", "docify", @@ -6084,9 +6341,9 @@ dependencies = [ [[package]] name = "pallet-balances" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c17ec19ad23b26866ad7d60cdf8b613f653db7f44232aa25009811441908e2b" +checksum = "9de2915b425ae77d63ba25c194780599b7be25307454a138cfb316c16d001e68" dependencies = [ "frame-benchmarking", "frame-support", @@ -6100,9 +6357,9 @@ dependencies = [ [[package]] name = "pallet-beefy" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6272fe91e3d0e5ea20dd82bc0ea8b0f104fe5eb10c66cadc19f7460586b94ff3" +checksum = "8563fce9fdb0e557015c0b58ed7ea7d5c1a4a1ddb1d27bf56e040d6bbf5c79e9" dependencies = [ "frame-support", "frame-system", @@ -6121,11 +6378,11 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf6226868b86de0cb2bc795223ff02f9955329409ac61b71cd193582800872b" +checksum = "ee3ed75c348ba23064cea40dab623719ef348bfe67ea39f195f82e2e7a7d0115" dependencies = [ - "array-bytes", + "array-bytes 6.1.0", "binary-merkle-tree", "frame-support", "frame-system", @@ -6147,9 +6404,9 @@ dependencies = [ [[package]] name = "pallet-bounties" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e99eb21766e941ca1d92350da602ca618959c0917f216e124f2838d0e50b6c03" +checksum = "74c0fb83c88f217e5bfe07a69a6d8a6c32d01241159ab81705ba5d4c3e24aaab" dependencies = [ "frame-benchmarking", "frame-support", @@ -6166,9 +6423,9 @@ dependencies = [ [[package]] name = "pallet-bridge-grandpa" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97671efddf3f78817a968de41c0b831c71bdc109eee5f173922596761dbf779" +checksum = "1fc5083b92333f5ad64eb97d7e54978bd53c9ac8de8ac3c4056585fd236254d0" dependencies = [ "bp-header-chain", "bp-runtime", @@ -6188,9 +6445,9 @@ dependencies = [ [[package]] name = "pallet-bridge-messages" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167e0760c481a396d2219e0d25ea45230d21acf96f3e65419e91d53264332b7a" +checksum = "c8e61922a3b67f17508e27ab2bba9dd03d4b2e6878d8c0819f7e155544443cfd" dependencies = [ "bp-messages", "bp-runtime", @@ -6208,9 +6465,9 @@ dependencies = [ [[package]] name = "pallet-bridge-parachains" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4d6cf6236d9a49396d99a66500b28d80719ebc8bb06320307a5ad50fe79e71c" +checksum = "88703f22433e3bc5ba69f89b6002fd28c74753a1ab425117f103e91fec05696a" dependencies = [ "bp-header-chain", "bp-parachains", @@ -6230,9 +6487,9 @@ dependencies = [ [[package]] name = "pallet-bridge-relayers" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7097304f3a7e57a704b29bca87276e711d3d297bf37201be36c6f67b0d7c78f" +checksum = "04af803c4fb3e48a83325bb4781505fc5268e364f488116cf6718ddbbe57937d" dependencies = [ "bp-messages", "bp-relayers", @@ -6251,9 +6508,9 @@ dependencies = [ [[package]] name = "pallet-child-bounties" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b29f699677ce3e509f12a61529286373534948097f139944ef390add34fece5" +checksum = "2246ce705aee37f9b6ad818e3646910d31ef4191e1c234bff054a710ef8d8a38" dependencies = [ "frame-benchmarking", "frame-support", @@ -6271,9 +6528,9 @@ dependencies = [ [[package]] name = "pallet-collator-selection" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01abb1abe8297d0a7c571b609d923ada973999b63702049343612325eb29c622" +checksum = "66c093c8867dbdb540da33076566605320b2eda78da5062d3d954f05862db18d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6291,9 +6548,9 @@ dependencies = [ [[package]] name = "pallet-collective" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d2dcd4a78c11068eafd20df2bf0cbbfda8743ec5434170644c7f0eec7d7615" +checksum = "dddb120b5ee520146617a8c49b4d4c980ba9188918d43085539bf78815e7ec1d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6309,9 +6566,9 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d2bbed9f775d59346703efc5e1d8a3ee3f04aa73c39f733ca80edaf02907380" +checksum = "1c8ff7512a377b708f71772e5169550cebc8f74bc8c26553015698eaa0975356" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6327,9 +6584,9 @@ dependencies = [ [[package]] name = "pallet-core-fellowship" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293bfe7b2bdd064de7c86d34c8e844a9abeddde8ad2be7964f4e6be6831fca7e" +checksum = "0c52f9f5ce35127f55972845c49604309e8df81facbc34560abc680df5515383" dependencies = [ "frame-benchmarking", "frame-support", @@ -6346,9 +6603,9 @@ dependencies = [ [[package]] name = "pallet-democracy" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "676fa85ebbe8ac31aef51c08cdf6422690f71d277c0369e630129b96d3ae9541" +checksum = "ed9f24ad18db2eeae0f03ba1743a82aaf300e0bbd6cdcb1119b0da93eef3d77f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6365,9 +6622,9 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "394d978de9611f3b23fc499369f86d5d82e64800959a5701d66907737e779406" +checksum = "481178ef558a9409d9c12fc01279b517e3a0a7797664e89761447dba3a182ce6" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6389,9 +6646,9 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a23b0dec60fd7a0c98234a4b04ef5e1f682bdf7ff3266ca499d85e1aac7bbec" +checksum = "b5ab6413ec88b64acf849a202795c67940dc3bcc846ce03bd0893b90e2119ecf" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6404,9 +6661,9 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" -version = "25.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23776772408c7fd612ee11c17071b1f5d93cbd8d0e0aadc16d112aca2711028d" +checksum = "021da1d28b604b3654f895987dcb1ccb47d73102b31bc84c8f784bed261f01d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6424,9 +6681,9 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41338a9d75f9c4c656d5d5ff15d8154edd7de61a97361e2d0ddc552baf6e944" +checksum = "05634a197738c999a3032393916182fedccce13cb063fc330ee9bf810cd53b49" dependencies = [ "docify", "frame-benchmarking", @@ -6444,11 +6701,11 @@ dependencies = [ [[package]] name = "pallet-glutton" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e08c402cb7f7b7fee476d99099da04acbd3ee05b21c5e15c39455cc24683960" +checksum = "9c3686506ac15f9b0442f5dffe496b68fca391116acfb6baef65524bb08c94f4" dependencies = [ - "blake2", + "blake2 0.10.6", "frame-benchmarking", "frame-support", "frame-system", @@ -6463,9 +6720,9 @@ dependencies = [ [[package]] name = "pallet-grandpa" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "977d01d5ce3f06fa17adf2ffa55ebaea765efa23bc11a242773a28955ee1d02b" +checksum = "b87c7f4cd94a526054dfebf7a84fbcaf6385033defa246ad83e321e71f8c5a92" dependencies = [ "frame-benchmarking", "frame-support", @@ -6487,9 +6744,9 @@ dependencies = [ [[package]] name = "pallet-identity" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffae303f4ecd1da950d4e27417ee4e3bbe3b8eb33776ded6184c40ed97dc5430" +checksum = "735bf6c19d30299e2d448797170a67d41c6a8ba593fb3a71ce4e11d3b85c60e9" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6504,9 +6761,9 @@ dependencies = [ [[package]] name = "pallet-im-online" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c30d7b90763c186d63e3f3f7e102c34df17917f6aeb24c4b6503356a886c16e" +checksum = "59eb1c68cc6b4700ad1d2a81ba847ff7b37406aa0326b7716825155d3f985762" dependencies = [ "frame-benchmarking", "frame-support", @@ -6525,9 +6782,9 @@ dependencies = [ [[package]] name = "pallet-indices" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44159982fa42f9ec453d07bc9bbd41f0d51a710a58616b437700c87113e917cc" +checksum = "0893ae7f2211010e92bf57fe31f18e2223a2f97f6d6393aa7192e283ec520beb" dependencies = [ "frame-benchmarking", "frame-support", @@ -6543,9 +6800,9 @@ dependencies = [ [[package]] name = "pallet-membership" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f4ff96fb2e4e126c96933e7a38e765b0bc30c8de0a66e3680d6a0d38356638e" +checksum = "2e1504034588eb733f8ce98b77757e9a7390662313aa133ef1e3b9fbb94359c7" dependencies = [ "frame-benchmarking", "frame-support", @@ -6561,9 +6818,9 @@ dependencies = [ [[package]] name = "pallet-message-queue" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13771c5cba1de8dd9b0492ab8923a8dd6b76a657f6eed6265db65c169b5f9111" +checksum = "0776bf51d03bd746159063fa1357234feb85114273d40ef3aa3efba65d091eb4" dependencies = [ "frame-benchmarking", "frame-support", @@ -6581,9 +6838,9 @@ dependencies = [ [[package]] name = "pallet-mmr" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224a83531b4a748a06501e033b09a22d51c70b8a58ae03794e7d3df4865ea49a" +checksum = "e2b9789cac80b48e9427724d0b400f984fb844fc711fc2dd2d0cdccdedda7169" dependencies = [ "frame-benchmarking", "frame-support", @@ -6600,9 +6857,9 @@ dependencies = [ [[package]] name = "pallet-multisig" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f777e13b1d99233df1b4a6d7cf50d8c8214389be249467d8616983491ebdb537" +checksum = "fea2785a0bfb1884a8283bf65010bb7189c8fce958ced9947a8c71c148ef199f" dependencies = [ "frame-benchmarking", "frame-support", @@ -6617,9 +6874,9 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77610d09fae9ffb9a8cd147cad6eb7dd5225576bc3a60689fda221e620c06282" +checksum = "959fb2e68e4421650538d9b64a3243f0a0cdc8962f35f749af18bf9b70f7253d" dependencies = [ "frame-benchmarking", "frame-support", @@ -6635,9 +6892,9 @@ dependencies = [ [[package]] name = "pallet-nfts" -version = "18.0.0" +version = "19.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83c46a08a715439995b204e19267bc84066cb70e659f58604ba6621a67c7847" +checksum = "999a30c5861a83a6ab38a564df99f976f0bc6bf54b03620abc568bba5f7b4834" dependencies = [ "enumflags2", "frame-benchmarking", @@ -6654,9 +6911,9 @@ dependencies = [ [[package]] name = "pallet-nfts-runtime-api" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7869cbe7277155d30c3ff7f9cb4752eb22d54370480bfd8c144e5a088eba498" +checksum = "f1a64c725e28fdf7d2512c1ce8eab8ba05fc7211fb864ee6c3d2300a2b3bd381" dependencies = [ "pallet-nfts", "parity-scale-codec", @@ -6665,9 +6922,9 @@ dependencies = [ [[package]] name = "pallet-nis" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f288d37549f0cc09c719577b21dab288785e95f91ff69e8916f7f92f438f94" +checksum = "7aa7ec891b7f1801a405095a2ad2c70eef94d2abe86792eee54794de23cbd035" dependencies = [ "frame-benchmarking", "frame-support", @@ -6682,9 +6939,9 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cd64134f94f4ce7ff594d15ad6599d50abde54e94fd923366855b5bf0835c7" +checksum = "1896f33fff0c41934532fb492078d78b784f301ddd81e5041dd8e8279e652c49" dependencies = [ "frame-support", "frame-system", @@ -6702,9 +6959,9 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "889d4929272cb67bdd444700a343f142816ebb5bbae65e771e70f52decb5931f" +checksum = "b27cbf4a47cc79862d254f16b38c68fd2dda087ce58e7c0021859d89718e865a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6723,9 +6980,9 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" -version = "19.0.0" +version = "20.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c3a6ba161ed6b04be29ce4b6f1e9a2b0d8ab8f3708a95c39e0e0f334aa0954a" +checksum = "65c256cc530a19ff614f2af9b5c95ae9aa777a2bf1542aa455ae65e842f8c924" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -6735,9 +6992,9 @@ dependencies = [ [[package]] name = "pallet-offences" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dee74e6484d9dc2787baa8687b0b27115167848d2f821ca4e57826af4af50c6" +checksum = "f3fd14c02ed4b689652826aa93284aada5a2cf859df3cc34ad88b2fd410a8c50" dependencies = [ "frame-support", "frame-system", @@ -6753,9 +7010,9 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e534be39e87f22945af557c5fcb3b4e22d57a881af4966a0ac15f6f3f9feb2c7" +checksum = "b1b3ae77cfb16f0495372853d42a44e34ab7b183bd8996a8cee91715f783ff49" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6778,9 +7035,9 @@ dependencies = [ [[package]] name = "pallet-preimage" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50fdee12172aeac7a8c3292c559cf59947c71e37630b43d4f27f5b0f7845725c" +checksum = "a1ed40405c758b52375cfc75aac74f10ff9bb9480569e5cfca42682e2db6c387" dependencies = [ "frame-benchmarking", "frame-support", @@ -6796,9 +7053,9 @@ dependencies = [ [[package]] name = "pallet-proxy" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092eaf774e2ddf8974137fa2970835e421280fb637ddb06ebdfe47fefe29419b" +checksum = "0fbc0b550f5cbbad51f9daf795cc7046d40bbff256dae8d6072fd710ab40fd3a" dependencies = [ "frame-benchmarking", "frame-support", @@ -6812,9 +7069,9 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16d59a6c2169cc28de2eafd24bf9f26d68291fff19186e8dfec88577517723c" +checksum = "8181da7fd6b9adf4f8641c5bcb156cd209e3226eea87ee9f9b1ac41f8e37c714" dependencies = [ "frame-benchmarking", "frame-support", @@ -6831,9 +7088,9 @@ dependencies = [ [[package]] name = "pallet-recovery" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ee085c026d20ce52d431b8ebe3283f6047fd411953c4cd003239154211c6e5" +checksum = "889fddd16cfdea09c2ae4dc8e9f67a1ec4b8ac680412cffb772fa572489ec687" dependencies = [ "frame-benchmarking", "frame-support", @@ -6847,9 +7104,9 @@ dependencies = [ [[package]] name = "pallet-referenda" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b78ae2f740127ca4689066c8dce9aa79e2d7273bda0ab6db06a884892055b89" +checksum = "592ff9873af379bf55e835072afd787cd6435204213ac484e86345b026f4ae4e" dependencies = [ "assert_matches", "frame-benchmarking", @@ -6867,9 +7124,9 @@ dependencies = [ [[package]] name = "pallet-salary" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "253502cbe69e79840cd04c7a1313ce55ef99cabcc96f7d686e08a022309ff82d" +checksum = "22ac035a8cccd7297ad03ad8ebe372b01f451aaafa9b243f5ce59b061d0806b1" dependencies = [ "frame-benchmarking", "frame-support", @@ -6886,9 +7143,9 @@ dependencies = [ [[package]] name = "pallet-scheduler" -version = "25.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "148b54bb7364da5b95dd34a1ce5d2d89d6a4a28a07e46019cef27e0e3042605b" +checksum = "3508a51d359c6640577feead9dc00667f38cec385baad77b636c61ff746ffe24" dependencies = [ "docify", "frame-benchmarking", @@ -6905,9 +7162,9 @@ dependencies = [ [[package]] name = "pallet-session" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f8482f465a73688a7d58e20dea4b10c9a0425995975b2a43d9ce4fe9a21a491" +checksum = "768a6fb5333efc2bd2a3538c1d6ffa4178398660d4e3be89f2eb82d4e9088ae6" dependencies = [ "frame-support", "frame-system", @@ -6928,9 +7185,9 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e688d5db25f47ede6cc0d6f8a76a08e07bf2d017935f2d9e7c78c40aac53089b" +checksum = "5401cee669394e86a15851ace4ad60ef1b4d656f11ff22c83d8004051279ea59" dependencies = [ "frame-benchmarking", "frame-support", @@ -6946,9 +7203,9 @@ dependencies = [ [[package]] name = "pallet-society" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "587e0dfc3b03d940b1168ac9b0c0d9da26ad35ebe49b198d022d9f2f97ad26fb" +checksum = "36959be2c7f810ba6b8ece8cfe2ee515774c1c776f1ed0bebf3b9e8068f6a435" dependencies = [ "frame-benchmarking", "frame-support", @@ -6965,9 +7222,9 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a1b649d9b95f842258b2e811960bf5e08285180e912303bee6b13c256a466c4" +checksum = "bed335abd32d357dd9750dae7fb87b01dfd8fe69faadcb94a6e0e0a43057d923" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6989,9 +7246,9 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d99ab20edb6dec19370dbda0a627739dde9cdfea9b4310e28b8a0a0ea0e83fc" +checksum = "df8878e29f3d001ac1b1b714621f462e41a9d1fa8f385657f955e8a1ec0684d7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7001,9 +7258,9 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" -version = "15.0.0" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a280ef9dfb602b5f39e448d1c7d5922c154b1aee20e42c0740ffef8e2a58f8d1" +checksum = "45b6f832653badb5f70bdfecc1ded64b02b8159b27f18515af03f8b80f1b023b" dependencies = [ "log", "sp-arithmetic", @@ -7011,9 +7268,9 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb64deb42c5725b257bd2d73fbe64f191e1e5378698f06c15951d43cddd13a5" +checksum = "773c0d24ad4da4b505e47b43e91c8c0af4e835f16104bc770732a4796c174748" dependencies = [ "parity-scale-codec", "sp-api", @@ -7021,9 +7278,9 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" -version = "25.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "102e4426ca996a007026ac39eded61f62c4222fef8840d0a1617b5c41cb1c38b" +checksum = "550292d79f281fd1bfbbf2643f10cef3d67068075d46374295f2efe7f7113da0" dependencies = [ "frame-benchmarking", "frame-support", @@ -7039,9 +7296,9 @@ dependencies = [ [[package]] name = "pallet-sudo" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "679c265de3a128714d43a7e2edf5ea29f2a39df65e4c44e216c04d6bb5dd5be7" +checksum = "fcec9f73ecb8d0439a13043a253a9fd90aa6bf5aece6470194bbfc7f79256d88" dependencies = [ "docify", "frame-benchmarking", @@ -7056,9 +7313,9 @@ dependencies = [ [[package]] name = "pallet-timestamp" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac4e66316d53673471420fb887b6a74e2507df169ced62584507ff0fb065c6b" +checksum = "b25ec8749cf3f481b5e5199be701bac0dea835851b83fc7c455192762711858d" dependencies = [ "docify", "frame-benchmarking", @@ -7077,9 +7334,9 @@ dependencies = [ [[package]] name = "pallet-tips" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a540f30c552ab0dcf32bb378a5f19c9c98dec74647dff93cbe55186aaa6159c" +checksum = "81b17cf8b964e5533f1f5ac1f087f3f69adfead754cb5dd25abe395ec1e7abc9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7097,9 +7354,9 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4cbb78b8499af1d338072950e4aef6acf3cc630afdb8e19b00306e5252d0386" +checksum = "87ef7ceaac786e41613731e3bc48284f1aa3ec260934abda2daed949de6e5ada" dependencies = [ "frame-support", "frame-system", @@ -7114,9 +7371,9 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402155004abb33b7f2eedfa60ba77fb6f898e62db979a796e013714d18a1c9c2" +checksum = "07d87fdc4028155367c6ea98143054a6c00b38bfd77ec08681e289e429e35505" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -7127,10 +7384,11 @@ dependencies = [ [[package]] name = "pallet-treasury" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd64a50b82946d4ccf2178b7f3927ebac562b2ef31cecda53d31f3ff53a57c4" +checksum = "8dd462af11574485864023849e0622916b611dbc88111192fb39b1e6d7e666ba" dependencies = [ + "docify", "frame-benchmarking", "frame-support", "frame-system", @@ -7139,15 +7397,16 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", + "sp-core", "sp-runtime", "sp-std", ] [[package]] name = "pallet-uniques" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c489508f7a29895417289850744050305387af0c066e080840f7f4d7e1e40fd" +checksum = "8010c79bac1b78fb35b3ee17b40469dec3fcf2eaa6fd863c5be5d96f2ad46bfd" dependencies = [ "frame-benchmarking", "frame-support", @@ -7161,9 +7420,9 @@ dependencies = [ [[package]] name = "pallet-utility" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06465e88266b5ed015fdb1ad7345f5008a96d8fa9e012e869b6eb49a8069e809" +checksum = "85a8a6941da32837e4297e0d8abe0a5c94f348a119cccbf27b0f99ee01246c0e" dependencies = [ "frame-benchmarking", "frame-support", @@ -7178,9 +7437,9 @@ dependencies = [ [[package]] name = "pallet-vesting" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1da7d0e09ddc3decc4abe6adca41a24325a458040b1ecdd246143796af2d47b8" +checksum = "fd29411ef24eb6a856adf1bc33b37ead4835a25dafb1c4c8c95b13fa5247748f" dependencies = [ "frame-benchmarking", "frame-support", @@ -7194,9 +7453,9 @@ dependencies = [ [[package]] name = "pallet-whitelist" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "997468b98ea225e8aed84cdb78503e3d35d0c997c2977503732c05afb626e5d9" +checksum = "d37304829099cfec7d17df70cfe11ccf6cb7bd624eab80e8e79e895859454540" dependencies = [ "frame-benchmarking", "frame-support", @@ -7210,9 +7469,9 @@ dependencies = [ [[package]] name = "pallet-xcm" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "430a62e82af99a697fabe583b85bf5797ef5d9996b8dec5bc2d195e94b4da3e3" +checksum = "04d5e5404d9dadb39390949aadc2c641c16ce4cb0f47ed7a7ff584ab914c2984" dependencies = [ "bounded-collections", "frame-benchmarking", @@ -7232,9 +7491,9 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c7213029f113604b5799b6a126239d096427cdb678a377827eaf6928fde182" +checksum = "e6bfdc94e39541b111db7d2c2a95a18a3c3bb42dd37c20b8705727e617ce00c9" dependencies = [ "frame-benchmarking", "frame-support", @@ -7250,17 +7509,36 @@ dependencies = [ "staging-xcm-executor", ] +[[package]] +name = "pallet-xcm-bridge-hub-router" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e2d8a783510d2fb4c0e81f591baad76fa8ebbed0f77852bf23720b299539b61" +dependencies = [ + "bp-xcm-bridge-hub-router", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std", + "staging-xcm", + "staging-xcm-builder", +] + [[package]] name = "parachains-common" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b13d76e1e40c002836b4f12cd771466440d92973f19cd093ff21b79eb12fc9" +checksum = "c7ab598917585ae55b892dbfb6fa5073eb40454c47504a0d0db2634505538632" dependencies = [ "cumulus-primitives-core", "cumulus-primitives-utility", "frame-support", "frame-system", - "kusama-runtime-constants 3.0.0", "log", "num-traits", "pallet-asset-tx-payment", @@ -7271,7 +7549,6 @@ dependencies = [ "parity-scale-codec", "polkadot-core-primitives", "polkadot-primitives", - "polkadot-runtime-constants 3.0.0", "rococo-runtime-constants", "scale-info", "smallvec", @@ -7280,18 +7557,18 @@ dependencies = [ "sp-io", "sp-runtime", "sp-std", + "staging-parachain-info", "staging-xcm", "staging-xcm-builder", - "staging-xcm-executor", "substrate-wasm-builder", "westend-runtime-constants", ] [[package]] name = "parachains-runtimes-test-utils" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0455cbf5e12a29f12b487d82c32524d8273ab2044e4845249d189800a752db" +checksum = "4473cc6319cada74f52b4c0b35a7a8b248e0db661aed4e65bd3a4cf676c9d4ff" dependencies = [ "assets-common", "cumulus-pallet-dmp-queue", @@ -7328,7 +7605,7 @@ version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78f19d20a0d2cc52327a88d131fa1c4ea81ea4a04714aedcfeca2dd410049cf8" dependencies = [ - "blake2", + "blake2 0.10.6", "crc32fast", "fs2", "hex", @@ -7606,9 +7883,9 @@ checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" [[package]] name = "polkadot-core-primitives" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209cc9c9f7ed951bb11a2ff2f592e6b5cd79d6f50311e4f702adce0fcc577152" +checksum = "b08d1d6ca24e1b13f8069e015cfab794344212dd7436aadd61de8086a82664ef" dependencies = [ "parity-scale-codec", "scale-info", @@ -7619,9 +7896,9 @@ dependencies = [ [[package]] name = "polkadot-node-jaeger" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e67dbaac90484bad44e91812f8bd698cc87587728e570e33ce77c90a7c3cce8" +checksum = "2cfe6d4769181dce55b1b8fc53f0bd85bb4aa20473702fbce95a94abafa19379" dependencies = [ "lazy_static", "log", @@ -7638,9 +7915,9 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b40316be4e77cc63d4fa95236ef4b188b4eb7304918ce6ca5e10aeb568a21bd" +checksum = "c51a586fc3ef87c685588a650c18882b4cf069d8adc0d7d9bd2670749cb4e82b" dependencies = [ "bs58 0.5.0", "futures", @@ -7658,9 +7935,9 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d872b0f84734ef355d73e4492fc59c3e755d7232cd465bf0ed68679fb3291868" +checksum = "f6de513655bf71400299cda1ccaebfa612fd3965e7ce5a9120b4ff37bfc80931" dependencies = [ "async-channel", "async-trait", @@ -7683,9 +7960,9 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b18e1dfcc68fd13a87fb2e06d6c8ec3cb83d6914140b9de3e191cf495089d63e" +checksum = "3e82ee5edac871310bd1ce16a035ad2fc901d6ddd69ea0bbabc7f0a70a02770a" dependencies = [ "bounded-vec", "futures", @@ -7706,9 +7983,9 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306c61acfa9ba62eb36c238236321e2dc2ffe51698555b361a52e5f2f3c1470b" +checksum = "8e1013b3bac6e9b76bbd71433c3eba36b5c0fa9306bfc473ec02e3a104e156d2" dependencies = [ "async-trait", "derive_more", @@ -7732,9 +8009,9 @@ dependencies = [ [[package]] name = "polkadot-overseer" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2a68991609f78f18243c24b53cbb895147e9001967ef64ab5dbdf60e1ec5aef" +checksum = "e2f547e981cbd72357ba30952193844d30de5063e9d304c117c9b941f12b5f84" dependencies = [ "async-trait", "futures", @@ -7747,7 +8024,6 @@ dependencies = [ "polkadot-node-subsystem-types", "polkadot-primitives", "sc-client-api", - "schnellru", "sp-api", "sp-core", "tikv-jemalloc-ctl", @@ -7756,9 +8032,9 @@ dependencies = [ [[package]] name = "polkadot-parachain-primitives" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864de6d7b7ed9c955aa1da6c53585ad75c73618307b569447dd0559f8f9baef9" +checksum = "42265630c0c48e25d7ee5a9f4bdcafd003be65c0a44deeb6541620ca169fa519" dependencies = [ "bounded-collections", "derive_more", @@ -7774,9 +8050,9 @@ dependencies = [ [[package]] name = "polkadot-primitives" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de3d7ae1191401fe2476a69dece0853011d2c9fdcb7eb194cdead641f395abb" +checksum = "ee4508ff6b035edc08c54bb61238500179963f6f1eb8266dce6a5625509124bc" dependencies = [ "bitvec", "hex-literal", @@ -7815,6 +8091,7 @@ dependencies = [ "frame-try-runtime", "hex-literal", "log", + "pallet-asset-rate", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", @@ -7864,7 +8141,7 @@ dependencies = [ "parity-scale-codec", "polkadot-primitives", "polkadot-runtime-common", - "polkadot-runtime-constants 1.0.0", + "polkadot-runtime-constants", "polkadot-runtime-parachains", "rustc-hex", "scale-info", @@ -7880,6 +8157,7 @@ dependencies = [ "sp-consensus-babe", "sp-consensus-beefy", "sp-core", + "sp-genesis-builder", "sp-inherents", "sp-io", "sp-keyring", @@ -7906,9 +8184,9 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac922a958e3e1435d7adffe49c1528b6396baf668ab45f635b79bff750053543" +checksum = "a788f8ed8b33262c33f72d78e3416c5991e40d333178ae43000a92181ee44bca" dependencies = [ "bitvec", "frame-benchmarking", @@ -7918,6 +8196,7 @@ dependencies = [ "impl-trait-for-tuples", "libsecp256k1", "log", + "pallet-asset-rate", "pallet-authorship", "pallet-babe", "pallet-balances", @@ -7930,6 +8209,7 @@ dependencies = [ "pallet-transaction-payment", "pallet-treasury", "pallet-vesting", + "pallet-xcm-benchmarks", "parity-scale-codec", "polkadot-primitives", "polkadot-runtime-parachains", @@ -7948,6 +8228,8 @@ dependencies = [ "sp-staking", "sp-std", "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", "static_assertions", ] @@ -7962,28 +8244,14 @@ dependencies = [ "sp-core", "sp-runtime", "sp-weights", -] - -[[package]] -name = "polkadot-runtime-constants" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d4a7abfe0dff335456790ac8edc342737dffbd67013a38b7bec2f6b523cc175" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", + "staging-xcm", ] [[package]] name = "polkadot-runtime-metrics" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93dbff21f9ce253f4cd976a972c5b4b18150cecb6fdae195a975e51cf3c797df" +checksum = "bfe45b01d9d621174c9c0eef0871aeead5986393838206fe58df3ae414bcb8d2" dependencies = [ "bs58 0.5.0", "frame-benchmarking", @@ -7995,9 +8263,9 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa4bade116bef54be48bb1ead3917d84478f43184d5f9ae001ec333d7d7d66" +checksum = "936dbae8a7a88dba07da726d779126716e05364d8475ced1c313f32755050a02" dependencies = [ "bitflags 1.3.2", "bitvec", @@ -8044,9 +8312,9 @@ dependencies = [ [[package]] name = "polkadot-statement-table" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "857b4c83022e353c48f38e4db15542e5da4d778e81058e533c44d559c72b5a51" +checksum = "22b2a11cb8871f7e30a8f5e455c92d19a186065644ee00f9acda550ff89dacce" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -8168,9 +8436,9 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", @@ -8239,9 +8507,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro-warning" -version = "0.4.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1eaa7fa0aa1929ffdf7eeb6eac234dde6268914a14ad44d23521ab6a9b258e" +checksum = "9b698b0b09d40e9b7c1a47b132d66a8b54bcd20583d9b6d06e4535e383b4405c" dependencies = [ "proc-macro2", "quote", @@ -8491,6 +8759,16 @@ dependencies = [ "getrandom 0.2.10", ] +[[package]] +name = "rand_distr" +version = "0.4.3" +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" @@ -8695,7 +8973,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ "hmac 0.12.1", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -8735,9 +9013,9 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fef0b660c7a725559c6be97a47511be63561c137da105ee13b07d9c7a462e43" +checksum = "272eaa4f1b4b5357d89d1f8f504cb5ee81a105bf7e5c295f053c6e521f2a199b" dependencies = [ "frame-support", "polkadot-primitives", @@ -8746,6 +9024,7 @@ dependencies = [ "sp-core", "sp-runtime", "sp-weights", + "staging-xcm", ] [[package]] @@ -9007,9 +9286,9 @@ dependencies = [ [[package]] name = "sc-allocator" -version = "19.0.0" +version = "20.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd6e58990dcb1eae76db49c456ded9a7906ee194857cf1dfb00da8bbc8cf73d" +checksum = "66b4c5976a9cff7fcf24c946276a62ea7837862b6f3bf9f8011f08faf4f08474" dependencies = [ "log", "sp-core", @@ -9019,9 +9298,9 @@ dependencies = [ [[package]] name = "sc-authority-discovery" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb85aa27916c2262aef532e6fc12d9654ce4717689cd25c75a88c5cc36609d18" +checksum = "fb7e0e8a4ea5304b65d49c0085a458ed2e43394f95457689875d3e0c6e118dee" dependencies = [ "async-trait", "futures", @@ -9048,9 +9327,9 @@ dependencies = [ [[package]] name = "sc-block-builder" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4653cc3665319f76451f651bc5e3eb84965802293daeaf2def5bfe9c1310171b" +checksum = "9d3999b9b758c09a6c1155e481b683ee87712f071cc5a0679f9ee4906a14a404" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -9064,9 +9343,9 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5fae1616d342e570fb4770c9f1a73ab8e1aecb9c5b71020404f8e45db458260" +checksum = "ec7e711ea9870d3fb8e2a3ea5b601a9e20c63d0d2f457f40146407721e246a77" dependencies = [ "memmap2", "sc-chain-spec-derive", @@ -9084,9 +9363,9 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a074891d17c03c58b1314c9add361a5a7fb28d4d3addd7a32dca8b119bd877" +checksum = "1f25158f791eb48715da9322375598b541cadd1f193674e8a4d77c79ffa3d95d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9096,11 +9375,11 @@ dependencies = [ [[package]] name = "sc-cli" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc423e21a22adc4f6056ccb5e19fca9ddc6cce1a49cd9aa44c53d6b2338fbeb3" +checksum = "22c61058223f80c1f961b03f7737529609a3283eef91129e971a1966101c18ea" dependencies = [ - "array-bytes", + "array-bytes 6.1.0", "chrono", "clap", "fdlimit", @@ -9115,6 +9394,7 @@ dependencies = [ "sc-client-api", "sc-client-db", "sc-keystore", + "sc-mixnet", "sc-network", "sc-service", "sc-telemetry", @@ -9136,9 +9416,9 @@ dependencies = [ [[package]] name = "sc-client-api" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49efb455b1b276557ba3cac01c2e42811148cc73149858296e4ae96707dc70e" +checksum = "c7d32101f415f4d7ddbe8b5de1c1387a78d6dce070e26407ec605fe9f3fc9e23" dependencies = [ "fnv", "futures", @@ -9164,9 +9444,9 @@ dependencies = [ [[package]] name = "sc-client-db" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1062af3e43f09e0080714382ee3e7dd850037908938323eefdcd4f4b61bdd6b" +checksum = "d4ced79f609a44782874d856cf39d256838957195ef34f4fb8ced90bf4b725d0" dependencies = [ "hash-db", "kvdb", @@ -9191,9 +9471,9 @@ dependencies = [ [[package]] name = "sc-consensus" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5f8da1ef0f036209b80d8bde5c8990ea1a86241532d84b5fd15f5e721da849c" +checksum = "86e4100cc8fb3876708e1ec5a7c63af3baa75febd5051beb9ddd1e4835fdfc27" dependencies = [ "async-trait", "futures", @@ -9217,9 +9497,9 @@ dependencies = [ [[package]] name = "sc-executor" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cfeaa8dc2a70ed5820667d3251266ed156f38d8062c2f976aa7c618411f1776" +checksum = "225f2ad733bc7234a6638d5203624194824b2f78ab631bc911223f536a66b9c8" dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", @@ -9240,9 +9520,9 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d404519f2a636d5977b1ac16c90aeb4129fe4609a5b284960a2dcb005c08da6" +checksum = "169c1cfe81ba0e0d44ab4ada1600e30b6a9de588c792db73e32a854a6e3e1a87" dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", @@ -9253,14 +9533,15 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82515a0cb74a2acb58f6ced20fae56eeb87ba4d813e60e46cf190a53d44c931" +checksum = "f9167d733e928c528273be63b905ec750cfda85d740453071463da69f7d633bc" dependencies = [ "anyhow", "cfg-if", "libc", "log", + "parking_lot 0.12.1", "rustix 0.36.15", "sc-allocator", "sc-executor-common", @@ -9271,9 +9552,9 @@ dependencies = [ [[package]] name = "sc-informant" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233ece6736217208ffac94f84de2d15465f80f676f881dacd0a9b3411b476951" +checksum = "7189a0b95fe5d79895a107c6c057bc9351cd9c867552200815199cde25bcdb9d" dependencies = [ "ansi_term", "futures", @@ -9288,11 +9569,11 @@ dependencies = [ [[package]] name = "sc-keystore" -version = "21.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c15cc8b79eb0832cac48fde41e9ecd011df5d57dad7608f2b89fe721e97012c" +checksum = "abecdf9778fccc254c0b5e227ea8b90fd59247044a30ad293a068b180427d244" dependencies = [ - "array-bytes", + "array-bytes 6.1.0", "parking_lot 0.12.1", "serde_json", "sp-application-crypto", @@ -9301,13 +9582,42 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sc-mixnet" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53ea71ec60601c18d6adcaf7a62698fc2e886c16dc8fdf8d61b3b76244dea38" +dependencies = [ + "array-bytes 4.2.0", + "arrayvec 0.7.4", + "blake2 0.10.6", + "futures", + "futures-timer", + "libp2p-identity", + "log", + "mixnet", + "multiaddr", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-client-api", + "sc-network", + "sc-transaction-pool-api", + "sp-api", + "sp-consensus", + "sp-core", + "sp-keystore", + "sp-mixnet", + "sp-runtime", + "thiserror", +] + [[package]] name = "sc-network" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3edad0e7930c2572d6920dc257bc03af6f40ba272bc45602edd0a045d94e5e59" +checksum = "01f519592a971199c486d412dbf38ba54096857080bf4b9d29c9ffabcfee3745" dependencies = [ - "array-bytes", + "array-bytes 6.1.0", "async-channel", "async-trait", "asynchronous-codec", @@ -9345,9 +9655,9 @@ dependencies = [ [[package]] name = "sc-network-bitswap" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a0d247f576989cb2fe49df0511cbbd826f1e47b444848971e2bddec8f18a65" +checksum = "8fe63a55e03d8bc796ff1e94e7fb62a62acfd7a80a47865a97b55c13371c3e05" dependencies = [ "async-channel", "cid", @@ -9366,9 +9676,9 @@ dependencies = [ [[package]] name = "sc-network-common" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418c79cea8ab5b43f5bbe7ee95da7d6490bdfedbe92a9b07a714ca4f09a2426" +checksum = "8d236686d15275e4aa49ca929a06fb6fac28aa70e35ee185b981036c149f9e9d" dependencies = [ "async-trait", "bitflags 1.3.2", @@ -9384,11 +9694,11 @@ dependencies = [ [[package]] name = "sc-network-light" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36fc98d43aa75eb0d0690af6a8c6a929318f6cb4bf1fc039410ece56c8bb5a9" +checksum = "aac888fd720ef8bb2ff7d2b7f7b2e54d17bb85a417cf1e1b6f0f64f7e644936d" dependencies = [ - "array-bytes", + "array-bytes 6.1.0", "async-channel", "futures", "libp2p-identity", @@ -9406,11 +9716,11 @@ dependencies = [ [[package]] name = "sc-network-sync" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d049b008a7353fc46cb45a1f6f68e5e5128442b6726cfd82da09cb676443e73" +checksum = "10c697aa8f52cf194b9f00113a7d0d3ce5d1456bedd6169a9caae10737f02907" dependencies = [ - "array-bytes", + "array-bytes 6.1.0", "async-channel", "async-trait", "fork-tree", @@ -9437,15 +9747,16 @@ dependencies = [ "sp-runtime", "substrate-prometheus-endpoint", "thiserror", + "tokio-stream", ] [[package]] name = "sc-network-transactions" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef6606f7705bc9c038c9e11715b7ddbdb2a5b43c12d8e3cc346e0b9927218e4" +checksum = "bb7c9bfc7b58ce229d1512158b8f13dc849ec24857d1c29a41a867fb8afb5c09" dependencies = [ - "array-bytes", + "array-bytes 6.1.0", "futures", "libp2p", "log", @@ -9460,9 +9771,9 @@ dependencies = [ [[package]] name = "sc-rpc" -version = "25.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede50e654b3e0c076bb9beb041612af80f07dfb883cc05d8aaae1c7a1bb72761" +checksum = "eb277280b6b3519e4a2e693b75d4ca516ebb4a928162e6a1791b217b2be60c9f" dependencies = [ "futures", "jsonrpsee", @@ -9472,6 +9783,7 @@ dependencies = [ "sc-block-builder", "sc-chain-spec", "sc-client-api", + "sc-mixnet", "sc-rpc-api", "sc-tracing", "sc-transaction-pool-api", @@ -9492,13 +9804,14 @@ dependencies = [ [[package]] name = "sc-rpc-api" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac4149b7427beed423006c78e0b75c0193ac01d6e66ff0dd8a1909747cf593" +checksum = "def499ac717db8442fe18543e52330d5f105027b666df73c0b38e81e9105078b" dependencies = [ "jsonrpsee", "parity-scale-codec", "sc-chain-spec", + "sc-mixnet", "sc-transaction-pool-api", "scale-info", "serde", @@ -9512,9 +9825,9 @@ dependencies = [ [[package]] name = "sc-rpc-server" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a62b9c5bf359cd4923ce10d294532936aa68d0cd59e890a0414f6434397180b" +checksum = "9e8083e1b026dcf397f8c1122b3fba6cc744c6962996df6a30e0fb75223f7637" dependencies = [ "http", "jsonrpsee", @@ -9528,11 +9841,11 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e770646ab839fb33dfeb7cbde94d98cdaf78526c70b10aa59ec5810953ff2a5" +checksum = "198ea9287111b4060ce1d70dce99804b99d1a92b5fb23a79d94bf0cb460ca3ce" dependencies = [ - "array-bytes", + "array-bytes 6.1.0", "futures", "futures-util", "hex", @@ -9557,9 +9870,9 @@ dependencies = [ [[package]] name = "sc-service" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9c7fa14eaf48c44edff226ce9b18dc984c122e9deebbf825a8945be7c046ade" +checksum = "3623ae5bd7b089da9796a3f1edd974c94f34dd4b4b527146662ef409ae9cd38c" dependencies = [ "async-trait", "directories", @@ -9622,9 +9935,9 @@ dependencies = [ [[package]] name = "sc-state-db" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bc9266fdec30b59857e794fc329aa600aaa6ed46799f9df859a7e30c0ec34b" +checksum = "3635fe572adfe796886e18910c8b94f7ce67f9ae3e2c161176e122ddf0baa7e4" dependencies = [ "log", "parity-scale-codec", @@ -9634,9 +9947,9 @@ dependencies = [ [[package]] name = "sc-sysinfo" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff97437e564c0e7483d7e32384e3f6571f656728ea03a6e1b07a6325e064a76" +checksum = "60967710b85e650652832df73915b64c315f7b437e53c4635bd26106d6d05c21" dependencies = [ "futures", "libc", @@ -9654,9 +9967,9 @@ dependencies = [ [[package]] name = "sc-telemetry" -version = "11.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46193a2979c86da75fc43276d222359757ea257b512fe6e4128e7a50b0bb22" +checksum = "28e214e4d46cac02321bc3dc6fd72f019ac10819d1ac8f24f6935a4ae74ef273" dependencies = [ "chrono", "futures", @@ -9674,9 +9987,9 @@ dependencies = [ [[package]] name = "sc-tracing" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fcb4398268e83957ebbc84e6290307198e817caa47386135d3de6ba3316203a" +checksum = "83bcd745ea216ba0c0a344cff2c41b12e27846d5fca4b28f56ff77e1d3ff3634" dependencies = [ "ansi_term", "atty", @@ -9704,9 +10017,9 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71bd05d3f24c0c2489c57b90a76db883c23c25577718ca05c9b0181fd427f501" +checksum = "9c4ae9e4f957d7274ac6b59d667b66262caf6482dbb1b63f1c370528626b1272" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9716,9 +10029,9 @@ dependencies = [ [[package]] name = "sc-transaction-pool" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6af477c0e8a2698aabf442a3918313e8f096eb6695ceaaa7e12679c496d2826" +checksum = "6f6db45a057a619670e07deefb4e69aab83386f076363db424907da2b2e82590" dependencies = [ "async-trait", "futures", @@ -9743,9 +10056,9 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4f1b864d0ae8f1891eb310672c12fc160d24e37ef297d5ef0db257558fe13b1" +checksum = "1491607f296bb8cce09a5eb3a03320c60ad52bb8120127b26f69c32bcaccd8f2" dependencies = [ "async-trait", "futures", @@ -9760,9 +10073,9 @@ dependencies = [ [[package]] name = "sc-utils" -version = "10.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b01c8eed623f999d402e44679d42ad42586afd4638aaed38708a307b59f4d7" +checksum = "81a4769c82dde62b9243dcc166be52e0c5d2d61cf2599923271118d9c8b997b1" dependencies = [ "async-channel", "futures", @@ -9834,7 +10147,7 @@ dependencies = [ "rand 0.7.3", "rand_core 0.5.1", "sha2 0.8.2", - "subtle", + "subtle 2.4.1", "zeroize", ] @@ -9892,7 +10205,7 @@ dependencies = [ "der 0.6.1", "generic-array 0.14.7", "pkcs8 0.9.0", - "subtle", + "subtle 2.4.1", "zeroize", ] @@ -9906,7 +10219,7 @@ dependencies = [ "der 0.7.8", "generic-array 0.14.7", "pkcs8 0.10.2", - "subtle", + "subtle 2.4.1", "zeroize", ] @@ -10180,9 +10493,9 @@ checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "slot-range-helper" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5109eff24021551c130973a924318728720e6c74fc98d206b4f42b7763978fdc" +checksum = "1e902c6b7e8f86718aee7989d6c8ea851d9772cb54a3389f2d729d8df41167ec" dependencies = [ "enumn", "parity-scale-codec", @@ -10210,14 +10523,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c9d1425eb528a21de2755c75af4c9b5d57f50a0d4c3b7f1828a4cd03f8ba155" dependencies = [ "aes-gcm 0.9.4", - "blake2", + "blake2 0.10.6", "chacha20poly1305", "curve25519-dalek 4.0.0", "rand_core 0.6.4", "ring", "rustc_version", "sha2 0.10.7", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -10259,9 +10572,9 @@ dependencies = [ [[package]] name = "sp-api" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc5213210472ba2becdc094fbb9d30c4455753b1a608962797e1e971c3e5ec4" +checksum = "f582f92ce47c86e4ffffe81fdd5120fea7c850dc0800653a7fa203bcc1532335" dependencies = [ "hash-db", "log", @@ -10281,12 +10594,12 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" -version = "11.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20e7f093302d30b9d35436db024376459bdc9da7530abcacf5d87c32a67d94fd" +checksum = "a896941b2d27365a6f937ebce11e36d55132dc32104f6a48b4cd765b55efd252" dependencies = [ "Inflector", - "blake2", + "blake2 0.10.6", "expander 2.0.0", "proc-macro-crate", "proc-macro2", @@ -10296,9 +10609,9 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "26.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74454c936a45ac55c8de95b9fd8b5e38f8b43d97df8f4274dd6777b20d95569" +checksum = "a93da025616ab59639f8e378df579c5aaa2c8b9999f328a0239156a57c991b53" dependencies = [ "parity-scale-codec", "scale-info", @@ -10310,9 +10623,9 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "19.0.0" +version = "20.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e41f710a77e9debd1c9b80f862709dce648e50f0904cde4117488e7d11d4796d" +checksum = "f80b5c16afb61dde1037a469d570adcc686440036429e50abe2301ba9d61aad5" dependencies = [ "integer-sqrt", "num-traits", @@ -10325,9 +10638,9 @@ dependencies = [ [[package]] name = "sp-authority-discovery" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3259fe9bf2e48eba37067f464a3db79ef20e25f1297cbad310c11738757c5c6a" +checksum = "e204d85bad6f02a5ae8fbba83c365e20459e979fd69db5575ba4b3ea1025ab3c" dependencies = [ "parity-scale-codec", "scale-info", @@ -10339,9 +10652,9 @@ dependencies = [ [[package]] name = "sp-block-builder" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c6a066e310d4c0c240829d7bb5d6bd01dde55d03e15b665f0372b40952f37e6" +checksum = "6cd16df3d1cdad862d3e764f10f7675876b011e032907423fdfa377ae2ec8575" dependencies = [ "sp-api", "sp-inherents", @@ -10351,9 +10664,9 @@ dependencies = [ [[package]] name = "sp-blockchain" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f506119858f25a73ed9d61a2ead0d5b97b5141055b3b4a12b9b82e530b06c673" +checksum = "4932b97cde61874f395bab9b02443e3bd2046943abb280b63f83da9d0b623ea7" dependencies = [ "futures", "log", @@ -10370,9 +10683,9 @@ dependencies = [ [[package]] name = "sp-consensus" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e142e27f140d50701e613d925f61482fafccb7d90933ee30d7bae54d293ea3" +checksum = "2c5d7170fb7cfb18024ef7eeb40d272d22b9c3587d85cde2d091e8463b397f06" dependencies = [ "async-trait", "futures", @@ -10386,9 +10699,9 @@ dependencies = [ [[package]] name = "sp-consensus-aura" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dcc6df7a006a55651d0e7bdf2d8d4583d5b917cb4b7b6a1331398e96307a883" +checksum = "643a7c486a645f398d219d1fbcc8a416cad5018164a212fefde5c2ef00a182e4" dependencies = [ "async-trait", "parity-scale-codec", @@ -10404,9 +10717,9 @@ dependencies = [ [[package]] name = "sp-consensus-babe" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572374a1260687fa18481ccac58c4a64611df379fb1aa65389ce96c6661b3b05" +checksum = "268f9b2e36d4e136c09ad87876cdcfd7ff734cb5917f333fefebff248f95a24f" dependencies = [ "async-trait", "parity-scale-codec", @@ -10424,9 +10737,9 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1969665f2c07bd7403810c3e1180ef03e388f74be04a1362fe4471d14a7cda14" +checksum = "90e18fe984ea745727e645c43d6a955bc471b3bcd36aa8d260c3bd0deeada0c5" dependencies = [ "lazy_static", "parity-scale-codec", @@ -10444,9 +10757,9 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" -version = "9.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d20516ed05a6a17f712050d6be385ca53c16b2d49938a29ca05e07f7aa5118" +checksum = "28bbee685900110419913f281ce0f29457fbc17418f00d15f0212c8043aba167" dependencies = [ "finality-grandpa", "log", @@ -10463,9 +10776,9 @@ dependencies = [ [[package]] name = "sp-consensus-slots" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ebe1c46246a76af1105639c7434c1383d376fd45a8548fc18ed66dbf86f803c" +checksum = "895b0c176d4eead833ddee5251d3cccbaeb0191ca3f33f84b11d347bebc6e21f" dependencies = [ "parity-scale-codec", "scale-info", @@ -10476,13 +10789,13 @@ dependencies = [ [[package]] name = "sp-core" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7921d278ed2aebbb21a644c96e09663dc49a6139d1e2e063c059dc9f866e149b" +checksum = "f9ebb090ead698a6df04347c86a31ba91a387edb8a58534ec70c4f977d1e1e87" dependencies = [ - "array-bytes", + "array-bytes 6.1.0", "bitflags 1.3.2", - "blake2", + "blake2 0.10.6", "bounded-collections", "bs58 0.5.0", "dyn-clonable", @@ -10517,14 +10830,15 @@ dependencies = [ "thiserror", "tiny-bip39", "tracing", + "w3f-bls", "zeroize", ] [[package]] name = "sp-core-hashing" -version = "12.0.0" +version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cb5c31aa385d6997a5b73fdc9837c1c0145559205198555c3000739a474767" +checksum = "cb8524f01591ee58b46cd83c9dbc0fcffd2fd730dabec4f59326cd58a00f17e2" dependencies = [ "blake2b_simd", "byteorder", @@ -10536,9 +10850,9 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" -version = "12.0.0" +version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a4327a220777a8d492ed3d0bcd4c769cbb030301e7d4a2d9e09513d690c313b" +checksum = "42ce3e6931303769197da81facefa86159fa1085dcd96ecb7e7407b5b93582a0" dependencies = [ "quote", "sp-core-hashing", @@ -10547,9 +10861,9 @@ dependencies = [ [[package]] name = "sp-database" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab25f79468af89010a8eb84e6bf56068b59929a55291c03519f47208360f3ebe" +checksum = "9c6e8c710d6a71512af6f42d9dba9c3d1f6ad793846480babf459bbde3d60a94" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -10557,9 +10871,9 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "11.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f7d375610590566e11882bf5b5a4b8d0666a96ba86808b2650bbbd9be50bf8" +checksum = "50535e1a5708d3ba5c1195b59ebefac61cc8679c2c24716b87a86e8b7ed2e4a1" dependencies = [ "proc-macro2", "quote", @@ -10568,9 +10882,9 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede074871514ca7c5d2eca9563515d858c6220b47ae815714ed4393a4e99db4a" +checksum = "884d05160bc89d0943d1c9fb8006c3d44b80f37f8af607aeff8d4d9cc82e279a" dependencies = [ "environmental", "parity-scale-codec", @@ -10580,9 +10894,9 @@ dependencies = [ [[package]] name = "sp-genesis-builder" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10b9f0251a09b578393f3297abe54a29abdb7e93c17e89a88dc1cabb8e2d5a2d" +checksum = "a0cb71d40ad47e40bdcce5ae5531c7d7ba579cd495a0e0413642fb063fa66f84" dependencies = [ "serde_json", "sp-api", @@ -10592,9 +10906,9 @@ dependencies = [ [[package]] name = "sp-inherents" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439882da80e9bcfd1ba53df7ec5070d4d7f2a9a93f988aa3598f99ee5bfc76eb" +checksum = "604229aa145be0cff853b47ffed8bc2c62eb08ec6974d6307b9a559c378e6dc5" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -10607,9 +10921,9 @@ dependencies = [ [[package]] name = "sp-io" -version = "26.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88fb6e281de5054565f07a9f79504d21133e115db549993c99f1b21236c677a5" +checksum = "0ced350da15e8ba3a106206840acc42a6d3eb0d7e8bf7aa43ab00eac0bdf956f" dependencies = [ "bytes", "ed25519-dalek", @@ -10632,9 +10946,9 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f09927534d2233e135e4b4a0c758554d0ff66178f6e9cfba2e151dfeac97b3" +checksum = "655ec0b35cb9cb9029fb323aa676b07d58deb872cecc7566e50278409a00ee95" dependencies = [ "lazy_static", "sp-core", @@ -10644,9 +10958,9 @@ dependencies = [ [[package]] name = "sp-keystore" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9f19e773319d96223ce8dba960267e6cb977907537a8f738746ceb86592413" +checksum = "8b8ec5ebbba70bee83d79c3fe5e49f12df0a4bb6029858ddf9a15eea7539a592" dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", @@ -10657,9 +10971,9 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" -version = "8.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "377a0e22a104a1a83804562fba6702537af6a36df9ee2049c89c3be9148b42b1" +checksum = "8846768f036429227e49f6ab523fbee4bc6edfee278a361bf27999590fe020d4" dependencies = [ "thiserror", "zstd 0.12.4", @@ -10667,9 +10981,9 @@ dependencies = [ [[package]] name = "sp-metadata-ir" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb0dec8af38c68358600da59cf14424e1230fe9ae1d4b4f64a098288145c0775" +checksum = "7ca9ff0e522a74725ac92f009d38deeb12e880f5296afbd78a6c6b970b773278" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -10677,11 +10991,24 @@ dependencies = [ "sp-std", ] +[[package]] +name = "sp-mixnet" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf61f28ca97aab6c21a3c6e0ed496e60d505e5de1f43fd4ba748c9afaa4fc85" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-std", +] + [[package]] name = "sp-mmr-primitives" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f616a1e1f731d027808d06d6b10de8d1e401397571e8f8e4ba84c1e74afc334c" +checksum = "0c3b33c20a4b1dd5a0069ced6997078a2af5d625f2c53d1b69bef9e131f42d77" dependencies = [ "ckb-merkle-mountain-range", "log", @@ -10698,9 +11025,9 @@ dependencies = [ [[package]] name = "sp-npos-elections" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec60b253bf9097e8ffe103563c515ef80550556ab3b2ec5513ed17a4ad7de520" +checksum = "9ee3536d7fd990c30864ca545d7bdbee02dc66a92ac2a7a66ab4e21521992a7b" dependencies = [ "parity-scale-codec", "scale-info", @@ -10713,9 +11040,9 @@ dependencies = [ [[package]] name = "sp-offchain" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b1501eb4ede6471162ff48c85ccabb21434b698c8b61e2651f85c00bc1656f" +checksum = "9310227f043ed99877b0449a683025a7461431a00995dcd6ef423a273d0fd85d" dependencies = [ "sp-api", "sp-core", @@ -10724,9 +11051,9 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "11.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd099ba2d6c1bfe5d0c79aa56e440fa3c9257eadfc0c782c09cdc2122b1e60ed" +checksum = "b00e40857ed3e0187f145b037c733545c5633859f1bd1d1b09deb52805fa696a" dependencies = [ "backtrace", "lazy_static", @@ -10735,9 +11062,9 @@ dependencies = [ [[package]] name = "sp-rpc" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8534ae0a6043f70a93054bf0d3da27436637a8134ed44667c360e7a955cb3d" +checksum = "51867fea921f54bbaa2bf505f373559b5f3b80e8d7f38ecb9677f0d3795a3e6a" dependencies = [ "rustc-hash", "serde", @@ -10746,9 +11073,9 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c0641e1a9d340960b562bcceea1457680fd0e109fc1040f8f5364fd7bc2506" +checksum = "6d9c40ff7303e62219b55635e5245d963358cb77d6916250991ebcb82c0be2c6" dependencies = [ "either", "hash256-std-hasher", @@ -10769,9 +11096,9 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "20.0.0" +version = "21.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17a4030ad93f05c93f2cc294c74bc5fea227f90fb3d1426d4a6f165e017fb7ea" +checksum = "4f365332922a8cfa98ab00c6d08b1b0f24e159e730dd554e720d950ff3371b1f" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -10788,9 +11115,9 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b232943ee7ca83a6d56face33b8af12e9fb470a15a53835f4e12a6e452a41c1c" +checksum = "9b2afcbd1bd18d323371111b66b7ac2870bdc1c86c3d7b0dae67b112ca52b4d8" dependencies = [ "Inflector", "proc-macro-crate", @@ -10801,9 +11128,9 @@ dependencies = [ [[package]] name = "sp-session" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfd062688577cc54493ba6f58383bfed89c66d5ef7b7c3747293b0da06c7f795" +checksum = "248dd8f49aa96b56bf0a7d513691ddb4194f9359fdb93e94397eabdef1036085" dependencies = [ "parity-scale-codec", "scale-info", @@ -10817,9 +11144,9 @@ dependencies = [ [[package]] name = "sp-staking" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3b2a4a7aa67a9adb2a8f49ed516f6694b5fa70792ab9b0125934b1c8cdc2e3" +checksum = "ee0feed0137234598bd1f76d0b468c585ea16619ea9ed1acbba82dd24ac79788" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -10832,9 +11159,9 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf4c76bea1a9e4a2e79afe70f42f1d368a8a45308e58f19bfd755c5ddb2b4a3" +checksum = "96e087fa4430befd2047b61d912c9d6fa4eaed408c4b58b46c6e9acd7965f2d3" dependencies = [ "hash-db", "log", @@ -10854,9 +11181,9 @@ dependencies = [ [[package]] name = "sp-statement-store" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a11bbdc403457dd7a850078936aa7cc753c617b7bbeba5f5766ce5a55b2bf124" +checksum = "4b8654bcd37602b1811414050d34d14f543873bd4e64e50d210a0116b660c600" dependencies = [ "aes-gcm 0.10.2", "curve25519-dalek 4.0.0", @@ -10879,15 +11206,15 @@ dependencies = [ [[package]] name = "sp-std" -version = "11.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c91d32e165d08a14098ce5ec923eaec59d1d0583758a18a770beec1b780b0d0" +checksum = "54c78c5a66682568cc7b153603c5d01a2cc8f5c221c7b1e921517a0eef18ae05" [[package]] name = "sp-storage" -version = "16.0.0" +version = "17.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9660ecd48314443e73ad0f44d58b76426666a1343d72f6f65664e174da9244" +checksum = "016f20812cc51bd479cc88d048c35d44cd3adde4accdb159d49d6050f2953595" dependencies = [ "impl-serde", "parity-scale-codec", @@ -10899,9 +11226,9 @@ dependencies = [ [[package]] name = "sp-timestamp" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0ab4b6b2d31db93e7da68894ccb7c5a305524cea051109820b958361d162be" +checksum = "004a7f453240db80b2967c0e1c6411836efc7daa7afae98fd16202caa51460e0" dependencies = [ "async-trait", "parity-scale-codec", @@ -10913,9 +11240,9 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "13.0.0" +version = "14.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a61948986d2a9f8d67d60884ff0277d910df09ebe08d0e1f309da777516453" +checksum = "0d727cb5265641ffbb7d4e42c18b63e29f6cfdbd240aae3bcf093c3d6eb29a19" dependencies = [ "parity-scale-codec", "sp-std", @@ -10926,9 +11253,9 @@ dependencies = [ [[package]] name = "sp-transaction-pool" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ea9c85f85f52e0a49c3f2ec6cff952fdc3ffe8392bebe21ed30eddd8d059c5" +checksum = "c7cd2afe89c474339d15d06e73639171ebe4d280be6904d9349072103da21427" dependencies = [ "sp-api", "sp-runtime", @@ -10936,9 +11263,9 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a2d2d676a4c8e9ff18cb43782ed557d00de28ee9fb090842a8510e4a7ce0a7" +checksum = "39ae7c4954431b8479f7b2b6b82f0551cc360a1ee59b6a5276eef86a1099eaed" dependencies = [ "async-trait", "parity-scale-codec", @@ -10952,9 +11279,9 @@ dependencies = [ [[package]] name = "sp-trie" -version = "25.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb2d292eb90452dcb0909fb44e74bf04395e3ffa37a66c0f1635a00600382a4" +checksum = "1e359b358263cc322c3f678c272a3a519621d9853dcfa1374dfcbdb5f54c6f85" dependencies = [ "ahash 0.8.3", "hash-db", @@ -10964,6 +11291,7 @@ dependencies = [ "nohash-hasher", "parity-scale-codec", "parking_lot 0.12.1", + "rand 0.8.5", "scale-info", "schnellru", "sp-core", @@ -10976,9 +11304,9 @@ dependencies = [ [[package]] name = "sp-version" -version = "25.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "125da59ea46ecb23860e7d895f6f2882f596b71ffca0ae4887558aac541f4342" +checksum = "3e93da332eba3cb59a65f128da5edd5c70e1475692b45470104e7465b1278471" dependencies = [ "impl-serde", "parity-scale-codec", @@ -10994,9 +11322,9 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" -version = "11.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92897ffa04436cbd100c49ea1f8b637cb68e2a9fe144115f4b545b5ace2f47e2" +checksum = "49535d8c7184dab46d15639c68374a30cbb1534e392fa09a1ebb059a993ad436" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -11006,9 +11334,9 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "17.0.0" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf43bb0c8eb76dc41057ce0fb6b744b94c9aec28b31dff53a1efc4f04ef25384" +checksum = "d5d85813d46a22484cdf5e5afddbbe85442dd1b4d84d67a8c7792f92f9f93607" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -11020,9 +11348,9 @@ dependencies = [ [[package]] name = "sp-weights" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1cef0aad13ed8a8522a6e86ace16fb97ab220c16d2357e628352b528582693" +checksum = "751676c1263e7f3600af16bad26a7978a816bc532676fe05eafa23b862c05b9e" dependencies = [ "parity-scale-codec", "scale-info", @@ -11108,8 +11436,9 @@ dependencies = [ "frame-system-rpc-runtime-api", "frame-try-runtime", "hex-literal", - "kusama-runtime-constants 1.0.0", + "kusama-runtime-constants", "log", + "pallet-asset-rate", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", @@ -11181,6 +11510,7 @@ dependencies = [ "sp-consensus-babe", "sp-consensus-beefy", "sp-core", + "sp-genesis-builder", "sp-inherents", "sp-io", "sp-keyring", @@ -11207,9 +11537,9 @@ dependencies = [ [[package]] name = "staging-parachain-info" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5bab12d15197074042e4f63034a58a1fad1abca3c779b9623696e163f549b5" +checksum = "3a1bcf863664ca5708d92894fc30d2c6606c7dbb7d7cfcf43b9ae69d5b83f4fb" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -11222,9 +11552,9 @@ dependencies = [ [[package]] name = "staging-xcm" -version = "3.0.1" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b199be791bd630ec9edc78b3896826d802f59202739a73cca5d0cd4d95b6088" +checksum = "7abd0c2e401a1e264379131c27676bc65c9631aaa508044bc04d8ce60a7d8524" dependencies = [ "bounded-collections", "derivative", @@ -11240,9 +11570,9 @@ dependencies = [ [[package]] name = "staging-xcm-builder" -version = "3.0.1" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855a422587cd951cae29249a6011c18c55486e6f4ae44f1dad1e971413eac880" +checksum = "aa3b14246daaf0301dd35d698bac570d82ba0c6c6c1d3e149b93bcf377b2fc6b" dependencies = [ "frame-support", "frame-system", @@ -11263,9 +11593,9 @@ dependencies = [ [[package]] name = "staging-xcm-executor" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a50ece4a1d0651af4ccb78170e8008a44cd119ee4fdf5190d997c78e24e46a03" +checksum = "3a85a421053f810f3ed988ba3cc39d926c95f70f1ae73282aa8cd5c50072173b" dependencies = [ "environmental", "frame-benchmarking", @@ -11356,7 +11686,7 @@ dependencies = [ "md-5", "rand 0.8.5", "ring", - "subtle", + "subtle 2.4.1", "thiserror", "tokio", "url", @@ -11378,9 +11708,9 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e99fe4e955b8d7c25bd3a88a6907933867d11ef6194ef935e865a9e87c320ff" +checksum = "ededbe617291db8a47d6e5155486ff1e5425f0bbf5dcb7f752730466a62bd293" dependencies = [ "hyper", "log", @@ -11391,9 +11721,9 @@ dependencies = [ [[package]] name = "substrate-rpc-client" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624257055386482adba21684a4af2cebdbaf0a8dd0e1b7cd9eec05b564afa5db" +checksum = "5575c2bef89385e5406565b8fe5620856d414e3846c60927a78f0788cb288c8c" dependencies = [ "async-trait", "jsonrpsee", @@ -11405,9 +11735,9 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" -version = "13.0.0" +version = "14.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a23975404eca6d81818f3f3d4ecde9635dae3e616f366dbc1a0d510c86f02a2" +checksum = "12ab1707dbbd129622b771a9b80b25f0ebf1c04854b907bc44b51ec96fb4005b" dependencies = [ "ansi_term", "build-helper", @@ -11431,6 +11761,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "subtle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" + [[package]] name = "subtle" version = "2.4.1" @@ -11905,9 +12241,9 @@ dependencies = [ [[package]] name = "tracing-gum" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388d505e3d23a34f23f4093937252f9a3a874184083680292a3c80f16c2937a7" +checksum = "32c0555bd635d9adbf8dec0bf45f7c2aef7541121d648ba37f5f792a211077b6" dependencies = [ "coarsetime", "polkadot-node-jaeger", @@ -11918,9 +12254,9 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f4ac73c340c95608556d9a52545c227be6b262ab3f3039a4dc005aad449bff" +checksum = "35756d8c1a227ec525853a1080bf890d03d939deb2bc50d4d43c96516c795d0d" dependencies = [ "expander 2.0.0", "proc-macro-crate", @@ -12142,7 +12478,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" dependencies = [ "generic-array 0.14.7", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -12152,7 +12488,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -12223,6 +12559,30 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +[[package]] +name = "w3f-bls" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7335e4c132c28cc43caef6adb339789e599e39adbe78da0c4d547fad48cbc331" +dependencies = [ + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-serialize-derive", + "arrayref", + "constcat", + "digest 0.10.7", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "sha2 0.10.7", + "sha3", + "thiserror", + "zeroize", +] + [[package]] name = "waitgroup" version = "0.1.2" @@ -12352,9 +12712,9 @@ dependencies = [ [[package]] name = "wasm-opt" -version = "0.114.1" +version = "0.116.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d005a95f934878a1fb446a816d51c3601a0120ff929005ba3bab3c749cfd1c7" +checksum = "fc942673e7684671f0c5708fc18993569d184265fd5223bb51fc8e5b9b6cfd52" dependencies = [ "anyhow", "libc", @@ -12368,9 +12728,9 @@ dependencies = [ [[package]] name = "wasm-opt-cxx-sys" -version = "0.114.1" +version = "0.116.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d04e240598162810fad3b2e96fa0dec6dba1eb65a03f3bd99a9248ab8b56caa" +checksum = "8c57b28207aa724318fcec6575fe74803c23f6f266fce10cbc9f3f116762f12e" dependencies = [ "anyhow", "cxx", @@ -12380,9 +12740,9 @@ dependencies = [ [[package]] name = "wasm-opt-sys" -version = "0.114.1" +version = "0.116.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efd2aaca519d64098c4faefc8b7433a97ed511caf4c9e516384eb6aef1ff4f9" +checksum = "8a1cce564dc768dacbdb718fc29df2dba80bd21cb47d8f77ae7e3d95ceb98cbe" dependencies = [ "anyhow", "cc", @@ -12751,7 +13111,7 @@ dependencies = [ "sha1", "sha2 0.10.7", "signature 1.6.4", - "subtle", + "subtle 2.4.1", "thiserror", "tokio", "webpki 0.21.4", @@ -12845,7 +13205,7 @@ dependencies = [ "rtcp", "rtp", "sha-1", - "subtle", + "subtle 2.4.1", "thiserror", "tokio", "webrtc-util", @@ -12874,9 +13234,9 @@ dependencies = [ [[package]] name = "westend-runtime-constants" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "281a188361cdcd28ade41bfca74d1b52f28bb6eb8f51bfd15ca3be721396ab75" +checksum = "682c32c5f5e6d51c431bf66c33fc502c66e7b25488c0bd92f5ee020c329f2beb" dependencies = [ "frame-support", "polkadot-primitives", @@ -12885,6 +13245,7 @@ dependencies = [ "sp-core", "sp-runtime", "sp-weights", + "staging-xcm", ] [[package]] @@ -13219,9 +13580,9 @@ dependencies = [ [[package]] name = "xcm-procedural" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d69991e802386307acc13e9d67004da522d083fe338111fe79c4317878445e4" +checksum = "401e2b62628da9246dececb06fe58118196557dd8deb9ce12d95cc4aaf56003f" dependencies = [ "Inflector", "proc-macro2", diff --git a/relay/kusama/Cargo.toml b/relay/kusama/Cargo.toml index f458a0676e..9c1c0f7af0 100644 --- a/relay/kusama/Cargo.toml +++ b/relay/kusama/Cargo.toml @@ -19,112 +19,114 @@ serde_derive = { version = "1.0.117", optional = true } static_assertions = "1.1.0" smallvec = "1.8.0" -authority-discovery-primitives = { package = "sp-authority-discovery", default-features = false , version = "22.0.0" } -babe-primitives = { package = "sp-consensus-babe", default-features = false , version = "0.28.0" } -beefy-primitives = { package = "sp-consensus-beefy", default-features = false , version = "9.0.0" } -binary-merkle-tree = { default-features = false , version = "9.0.0" } +authority-discovery-primitives = { package = "sp-authority-discovery", default-features = false , version = "23.0.0" } +babe-primitives = { package = "sp-consensus-babe", default-features = false , version = "0.29.0" } +beefy-primitives = { package = "sp-consensus-beefy", default-features = false , version = "10.0.0" } +binary-merkle-tree = { default-features = false , version = "10.0.0" } kusama-runtime-constants = { package = "kusama-runtime-constants", path = "constants", default-features = false } -sp-api = { default-features = false , version = "22.0.0" } -inherents = { package = "sp-inherents", default-features = false , version = "22.0.0" } -offchain-primitives = { package = "sp-offchain", default-features = false , version = "22.0.0" } -sp-std = { package = "sp-std", default-features = false , version = "11.0.0" } -sp-application-crypto = { default-features = false , version = "26.0.0" } -sp-arithmetic = { default-features = false , version = "19.0.0" } -sp-io = { default-features = false , version = "26.0.0" } -sp-mmr-primitives = { default-features = false , version = "22.0.0" } -sp-runtime = { default-features = false , version = "27.0.0" } -sp-staking = { default-features = false , version = "22.0.0" } -sp-core = { default-features = false , version = "24.0.0" } -sp-session = { default-features = false , version = "23.0.0" } -sp-storage = { default-features = false , version = "16.0.0" } -sp-version = { default-features = false , version = "25.0.0" } -tx-pool-api = { package = "sp-transaction-pool", default-features = false , version = "22.0.0" } -block-builder-api = { package = "sp-block-builder", default-features = false , version = "22.0.0" } -sp-npos-elections = { default-features = false , version = "22.0.0" } +sp-api = { default-features = false , version = "23.0.0" } +inherents = { package = "sp-inherents", default-features = false , version = "23.0.0" } +offchain-primitives = { package = "sp-offchain", default-features = false , version = "23.0.0" } +sp-std = { package = "sp-std", default-features = false , version = "12.0.0" } +sp-application-crypto = { default-features = false , version = "27.0.0" } +sp-arithmetic = { default-features = false , version = "20.0.0" } +sp-genesis-builder = { default-features = false , version = "0.4.0" } +sp-io = { default-features = false , version = "27.0.0" } +sp-mmr-primitives = { default-features = false , version = "23.0.0" } +sp-runtime = { default-features = false , version = "28.0.0" } +sp-staking = { default-features = false , version = "23.0.0" } +sp-core = { default-features = false , version = "25.0.0" } +sp-session = { default-features = false , version = "24.0.0" } +sp-storage = { default-features = false , version = "17.0.0" } +sp-version = { default-features = false , version = "26.0.0" } +tx-pool-api = { package = "sp-transaction-pool", default-features = false , version = "23.0.0" } +block-builder-api = { package = "sp-block-builder", default-features = false , version = "23.0.0" } +sp-npos-elections = { default-features = false , version = "23.0.0" } -pallet-authority-discovery = { default-features = false , version = "24.0.0" } -pallet-authorship = { default-features = false , version = "24.0.0" } -pallet-babe = { default-features = false , version = "24.0.0" } -pallet-bags-list = { default-features = false , version = "23.0.0" } -pallet-balances = { default-features = false , version = "24.0.0" } -pallet-beefy = { default-features = false , version = "24.0.0" } -pallet-beefy-mmr = { default-features = false , version = "24.0.0" } -pallet-bounties = { default-features = false , version = "23.0.0" } -pallet-child-bounties = { default-features = false , version = "23.0.0" } -pallet-transaction-payment = { default-features = false , version = "24.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false , version = "24.0.0" } -pallet-nomination-pools-runtime-api = { default-features = false , version = "19.0.0" } -pallet-collective = { default-features = false , version = "24.0.0" } -pallet-conviction-voting = { default-features = false , version = "24.0.0" } -pallet-democracy = { default-features = false , version = "24.0.0" } -pallet-elections-phragmen = { default-features = false , version = "25.0.0" } -pallet-election-provider-multi-phase = { default-features = false , version = "23.0.0" } -pallet-fast-unstake = { default-features = false , version = "23.0.0" } -frame-executive = { default-features = false , version = "24.0.0" } -pallet-grandpa = { default-features = false , version = "24.0.0" } -pallet-nis = { default-features = false , version = "24.0.0" } -pallet-identity = { default-features = false , version = "24.0.0" } -pallet-im-online = { default-features = false , version = "23.0.0" } -pallet-indices = { default-features = false , version = "24.0.0" } -pallet-membership = { default-features = false , version = "24.0.0" } -pallet-message-queue = { default-features = false , version = "27.0.0" } -pallet-mmr = { default-features = false , version = "23.0.0" } -pallet-multisig = { default-features = false , version = "24.0.0" } -pallet-nomination-pools = { default-features = false , version = "21.0.0" } -pallet-offences = { default-features = false , version = "23.0.0" } -pallet-preimage = { default-features = false , version = "24.0.0" } -pallet-proxy = { default-features = false , version = "24.0.0" } -pallet-ranked-collective = { default-features = false , version = "24.0.0" } -pallet-recovery = { default-features = false , version = "24.0.0" } -pallet-referenda = { default-features = false , version = "24.0.0" } -pallet-scheduler = { default-features = false , version = "25.0.0" } -pallet-session = { default-features = false , version = "24.0.0" } -pallet-society = { default-features = false, version = "24.0.0" } -frame-support = { default-features = false , version = "24.0.0" } -pallet-staking = { default-features = false , version = "24.0.0" } -pallet-state-trie-migration = { default-features = false , version = "25.0.0" } -pallet-staking-runtime-api = { default-features = false , version = "10.0.0" } -frame-system = { default-features = false , version = "24.0.0" } -frame-system-rpc-runtime-api = { default-features = false , version = "22.0.0" } -pallet-timestamp = { default-features = false , version = "23.0.0" } -pallet-tips = { default-features = false , version = "23.0.0" } -pallet-treasury = { default-features = false , version = "23.0.0" } -pallet-utility = { default-features = false , version = "24.0.0" } -pallet-vesting = { default-features = false , version = "24.0.0" } -pallet-whitelist = { default-features = false , version = "23.0.0" } -pallet-xcm = { default-features = false , version = "3.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } -frame-election-provider-support = { default-features = false , version = "24.0.0" } +pallet-asset-rate = { default-features = false , version = "4.0.0" } +pallet-authority-discovery = { default-features = false , version = "25.0.0" } +pallet-authorship = { default-features = false , version = "25.0.0" } +pallet-babe = { default-features = false , version = "25.0.0" } +pallet-bags-list = { default-features = false , version = "24.0.0" } +pallet-balances = { default-features = false , version = "25.0.0" } +pallet-beefy = { default-features = false , version = "25.0.0" } +pallet-beefy-mmr = { default-features = false , version = "25.0.0" } +pallet-bounties = { default-features = false , version = "24.0.0" } +pallet-child-bounties = { default-features = false , version = "24.0.0" } +pallet-transaction-payment = { default-features = false , version = "25.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false , version = "25.0.0" } +pallet-nomination-pools-runtime-api = { default-features = false , version = "20.0.0" } +pallet-collective = { default-features = false , version = "25.0.0" } +pallet-conviction-voting = { default-features = false , version = "25.0.0" } +pallet-democracy = { default-features = false , version = "25.0.0" } +pallet-elections-phragmen = { default-features = false , version = "26.0.0" } +pallet-election-provider-multi-phase = { default-features = false , version = "24.0.0" } +pallet-fast-unstake = { default-features = false , version = "24.0.0" } +frame-executive = { default-features = false , version = "25.0.0" } +pallet-grandpa = { default-features = false , version = "25.0.0" } +pallet-nis = { default-features = false , version = "25.0.0" } +pallet-identity = { default-features = false , version = "25.0.0" } +pallet-im-online = { default-features = false , version = "24.0.0" } +pallet-indices = { default-features = false , version = "25.0.0" } +pallet-membership = { default-features = false , version = "25.0.0" } +pallet-message-queue = { default-features = false , version = "28.0.0" } +pallet-mmr = { default-features = false , version = "24.0.0" } +pallet-multisig = { default-features = false , version = "25.0.0" } +pallet-nomination-pools = { default-features = false , version = "22.0.0" } +pallet-offences = { default-features = false , version = "24.0.0" } +pallet-preimage = { default-features = false , version = "25.0.0" } +pallet-proxy = { default-features = false , version = "25.0.0" } +pallet-ranked-collective = { default-features = false , version = "25.0.0" } +pallet-recovery = { default-features = false , version = "25.0.0" } +pallet-referenda = { default-features = false , version = "25.0.0" } +pallet-scheduler = { default-features = false , version = "26.0.0" } +pallet-session = { default-features = false , version = "25.0.0" } +pallet-society = { default-features = false, version = "25.0.0" } +frame-support = { default-features = false , version = "25.0.0" } +pallet-staking = { default-features = false , version = "25.0.0" } +pallet-state-trie-migration = { default-features = false , version = "26.0.0" } +pallet-staking-runtime-api = { default-features = false , version = "11.0.0" } +frame-system = { default-features = false , version = "25.0.0" } +frame-system-rpc-runtime-api = { default-features = false , version = "23.0.0" } +pallet-timestamp = { default-features = false , version = "24.0.0" } +pallet-tips = { default-features = false , version = "24.0.0" } +pallet-treasury = { default-features = false , version = "24.0.0" } +pallet-utility = { default-features = false , version = "25.0.0" } +pallet-vesting = { default-features = false , version = "25.0.0" } +pallet-whitelist = { default-features = false , version = "24.0.0" } +pallet-xcm = { default-features = false , version = "4.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "4.0.0" } +frame-election-provider-support = { default-features = false , version = "25.0.0" } -frame-benchmarking = { default-features = false, optional = true , version = "24.0.0" } -frame-try-runtime = { default-features = false, optional = true , version = "0.30.0" } -pallet-offences-benchmarking = { default-features = false, optional = true , version = "24.0.0" } -pallet-session-benchmarking = { default-features = false, optional = true , version = "24.0.0" } -pallet-nomination-pools-benchmarking = { default-features = false, optional = true , version = "22.0.0" } -frame-system-benchmarking = { default-features = false, optional = true , version = "24.0.0" } -pallet-election-provider-support-benchmarking = { default-features = false, optional = true , version = "23.0.0" } +frame-benchmarking = { default-features = false, optional = true , version = "25.0.0" } +frame-try-runtime = { default-features = false, optional = true , version = "0.31.0" } +pallet-offences-benchmarking = { default-features = false, optional = true , version = "25.0.0" } +pallet-session-benchmarking = { default-features = false, optional = true , version = "25.0.0" } +pallet-nomination-pools-benchmarking = { default-features = false, optional = true , version = "23.0.0" } +frame-system-benchmarking = { default-features = false, optional = true , version = "25.0.0" } +pallet-election-provider-support-benchmarking = { default-features = false, optional = true , version = "24.0.0" } hex-literal = "0.4.1" -runtime-common = { package = "polkadot-runtime-common", default-features = false, version = "3.0.0" } -runtime-parachains = { package = "polkadot-runtime-parachains", default-features = false , version = "3.0.0" } -primitives = { package = "polkadot-primitives", default-features = false , version = "3.0.0" } +runtime-common = { package = "polkadot-runtime-common", default-features = false, version = "4.0.0" } +runtime-parachains = { package = "polkadot-runtime-parachains", default-features = false , version = "4.0.0" } +primitives = { package = "polkadot-primitives", default-features = false , version = "4.0.0" } -xcm = { package = "staging-xcm", default-features = false , version = "3.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false , version = "3.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "3.0.1" } +xcm = { package = "staging-xcm", default-features = false , version = "4.0.0" } +xcm-executor = { package = "staging-xcm-executor", default-features = false , version = "4.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "4.0.0" } [dev-dependencies] tiny-keccak = { version = "2.0.2", features = ["keccak"] } -keyring = { package = "sp-keyring", version = "27.0.0" } -sp-trie = { version = "25.0.0" } +keyring = { package = "sp-keyring", version = "28.0.0" } +sp-trie = { version = "26.0.0" } separator = "0.4.1" serde_json = "1.0.96" -remote-externalities = { package = "frame-remote-externalities" , version = "0.31.0" } +remote-externalities = { package = "frame-remote-externalities" , version = "0.32.0" } tokio = { version = "1.24.2", features = ["macros"] } -sp-tracing = { default-features = false , version = "13.0.0" } +sp-tracing = { default-features = false , version = "14.0.0" } [build-dependencies] -substrate-wasm-builder = { version = "13.0.0" } +substrate-wasm-builder = { version = "14.0.0" } [features] default = [ "std" ] @@ -149,6 +151,7 @@ std = [ "kusama-runtime-constants/std", "log/std", "offchain-primitives/std", + "pallet-asset-rate/std", "pallet-authority-discovery/std", "pallet-authorship/std", "pallet-babe/std", @@ -213,6 +216,7 @@ std = [ "sp-application-crypto/std", "sp-arithmetic/std", "sp-core/std", + "sp-genesis-builder/std", "sp-io/std", "sp-mmr-primitives/std", "sp-npos-elections/std", @@ -234,6 +238,7 @@ runtime-benchmarks = [ "frame-support/runtime-benchmarks", "frame-system-benchmarking/runtime-benchmarks", "frame-system/runtime-benchmarks", + "pallet-asset-rate/runtime-benchmarks", "pallet-babe/runtime-benchmarks", "pallet-bags-list/runtime-benchmarks", "pallet-balances/runtime-benchmarks", @@ -292,6 +297,7 @@ try-runtime = [ "frame-system/try-runtime", "frame-try-runtime", "frame-try-runtime/try-runtime", + "pallet-asset-rate/try-runtime", "pallet-authority-discovery/try-runtime", "pallet-authorship/try-runtime", "pallet-babe/try-runtime", diff --git a/relay/kusama/constants/Cargo.toml b/relay/kusama/constants/Cargo.toml index 5ac1bca49a..9127334bdc 100644 --- a/relay/kusama/constants/Cargo.toml +++ b/relay/kusama/constants/Cargo.toml @@ -9,12 +9,14 @@ license.workspace = true [dependencies] smallvec = "1.8.0" -frame-support = { default-features = false , version = "24.0.0" } -primitives = { package = "polkadot-primitives", default-features = false , version = "3.0.0" } -runtime-common = { package = "polkadot-runtime-common", default-features = false , version = "3.0.0" } -sp-runtime = { default-features = false , version = "27.0.0" } -sp-weights = { default-features = false , version = "23.0.0" } -sp-core = { default-features = false , version = "24.0.0" } +frame-support = { default-features = false , version = "25.0.0" } +primitives = { package = "polkadot-primitives", default-features = false , version = "4.0.0" } +runtime-common = { package = "polkadot-runtime-common", default-features = false , version = "4.0.0" } +sp-runtime = { default-features = false , version = "28.0.0" } +sp-weights = { default-features = false , version = "24.0.0" } +sp-core = { default-features = false , version = "25.0.0" } + +xcm = { package = "staging-xcm", default-features = false , version = "4.0.0" } [features] default = [ "std" ] @@ -25,4 +27,5 @@ std = [ "sp-core/std", "sp-runtime/std", "sp-weights/std", + "xcm/std" ] diff --git a/relay/kusama/constants/src/lib.rs b/relay/kusama/constants/src/lib.rs index 78f96b3510..342359608b 100644 --- a/relay/kusama/constants/src/lib.rs +++ b/relay/kusama/constants/src/lib.rs @@ -97,6 +97,35 @@ pub mod fee { } } +/// System Parachains. +pub mod system_parachain { + use xcm::latest::prelude::*; + + /// Asset Hub parachain ID. + pub const ASSET_HUB_ID: u32 = 1000; + /// Encointer parachain ID. + pub const ENCOINTER_ID: u32 = 1001; + /// Bridge Hub parachain ID. + pub const BRIDGE_HUB_ID: u32 = 1002; + + frame_support::match_types! { + // System parachains from Kusama point of view. + pub type SystemParachains: impl Contains = { + MultiLocation { + parents: 0, + interior: X1(Parachain( + ASSET_HUB_ID | + ENCOINTER_ID | + BRIDGE_HUB_ID + )), + } + }; + } +} + +/// Kusama Treasury pallet instance. +pub const TREASURY_PALLET_ID: u8 = 18; + #[cfg(test)] mod tests { use super::{ diff --git a/relay/kusama/src/lib.rs b/relay/kusama/src/lib.rs index 8e4360d502..a5dca2b45f 100644 --- a/relay/kusama/src/lib.rs +++ b/relay/kusama/src/lib.rs @@ -31,9 +31,13 @@ use primitives::{ PARACHAIN_KEY_TYPE_ID, }; use runtime_common::{ - auctions, claims, crowdloan, impl_runtime_weights, impls::DealWithFees, paras_registrar, - prod_or_fast, slots, BalanceToU256, BlockHashCount, BlockLength, CurrencyToVote, - SlowAdjustingFeeUpdate, U256ToBalance, + auctions, claims, crowdloan, impl_runtime_weights, + impls::{ + DealWithFees, LocatableAssetConverter, VersionedLocatableAsset, + VersionedMultiLocationConverter, + }, + paras_registrar, prod_or_fast, slots, BalanceToU256, BlockHashCount, BlockLength, + CurrencyToVote, SlowAdjustingFeeUpdate, U256ToBalance, }; use scale_info::TypeInfo; use sp_std::{cmp::Ordering, collections::btree_map::BTreeMap, prelude::*}; @@ -61,7 +65,9 @@ use frame_election_provider_support::{ SequentialPhragmen, }; use frame_support::{ - construct_runtime, parameter_types, + construct_runtime, + genesis_builder_helper::{build_config, create_default_config}, + parameter_types, traits::{ fungible::HoldConsideration, ConstU32, Contains, EitherOf, EitherOfDiverse, InstanceFilter, KeyOwnerProofSystem, LinearStoragePrice, PrivilegeCmp, ProcessMessage, ProcessMessageError, @@ -72,6 +78,7 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId}; +use pallet_identity::simple::IdentityInfo; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_session::historical as session_historical; use pallet_transaction_payment::{CurrencyAdapter, FeeDetails, RuntimeDispatchInfo}; @@ -80,7 +87,7 @@ use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, traits::{ AccountIdLookup, BlakeTwo256, Block as BlockT, ConvertInto, Extrinsic as ExtrinsicT, - Keccak256, OpaqueKeys, SaturatedConversion, Verify, + IdentityLookup, Keccak256, OpaqueKeys, SaturatedConversion, Verify, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill, Percent, Permill, RuntimeDebug, @@ -89,7 +96,11 @@ use sp_staking::SessionIndex; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use xcm::latest::Junction; +use xcm::{ + latest::{InteriorMultiLocation, Junction, Junction::PalletInstance}, + VersionedMultiLocation, +}; +use xcm_builder::PayOverXcm; pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; @@ -102,7 +113,7 @@ use sp_runtime::traits::Get; pub use sp_runtime::BuildStorage; /// Constant values used within the runtime. -use kusama_runtime_constants::{currency::*, fee::*, time::*}; +use kusama_runtime_constants::{currency::*, fee::*, time::*, TREASURY_PALLET_ID}; // Weights used in the runtime. mod weights; @@ -317,10 +328,11 @@ impl pallet_balances::Config for Runtime { type MaxReserves = MaxReserves; type ReserveIdentifier = [u8; 8]; type WeightInfo = weights::pallet_balances::WeightInfo; - type FreezeIdentifier = (); - type MaxFreezes = (); + type FreezeIdentifier = RuntimeFreezeReason; + type MaxFreezes = ConstU32<8>; type RuntimeHoldReason = RuntimeHoldReason; - type MaxHolds = ConstU32<1>; + type RuntimeFreezeReason = RuntimeFreezeReason; + type MaxHolds = ConstU32<2>; } parameter_types! { @@ -699,6 +711,10 @@ parameter_types! { pub const SpendPeriod: BlockNumber = 6 * DAYS; pub const Burn: Permill = Permill::from_perthousand(2); pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); + pub const PayoutSpendPeriod: BlockNumber = 30 * DAYS; + // The asset's interior location for the paying account. This is the Treasury + // pallet instance (which sits at index 18). + pub TreasuryInteriorLocation: InteriorMultiLocation = PalletInstance(TREASURY_PALLET_ID).into(); pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); @@ -727,6 +743,23 @@ impl pallet_treasury::Config for Runtime { type WeightInfo = weights::pallet_treasury::WeightInfo; type SpendFunds = Bounties; type SpendOrigin = TreasurySpender; + type AssetKind = VersionedLocatableAsset; + type Beneficiary = VersionedMultiLocation; + type BeneficiaryLookup = IdentityLookup; + type Paymaster = PayOverXcm< + TreasuryInteriorLocation, + crate::xcm_config::XcmRouter, + crate::XcmPallet, + ConstU32<{ 6 * HOURS }>, + Self::Beneficiary, + Self::AssetKind, + LocatableAssetConverter, + VersionedMultiLocationConverter, + >; + type BalanceConverter = AssetRate; + type PayoutPeriod = PayoutSpendPeriod; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = runtime_common::impls::benchmarks::TreasuryArguments; } parameter_types! { @@ -902,6 +935,7 @@ impl pallet_identity::Config for Runtime { type SubAccountDeposit = SubAccountDeposit; type MaxSubAccounts = MaxSubAccounts; type MaxAdditionalFields = MaxAdditionalFields; + type IdentityInformation = IdentityInfo; type MaxRegistrars = MaxRegistrars; type Slashed = Treasury; type ForceOrigin = EitherOf, GeneralAdmin>; @@ -1374,9 +1408,10 @@ impl pallet_balances::Config for Runtime { type ReserveIdentifier = [u8; 8]; type WeightInfo = weights::pallet_balances_nis_counterpart_balances::WeightInfo; type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; + type MaxHolds = ConstU32<2>; + type MaxFreezes = ConstU32<1>; } parameter_types! { @@ -1423,6 +1458,7 @@ impl pallet_nomination_pools::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = weights::pallet_nomination_pools::WeightInfo; type Currency = Balances; + type RuntimeFreezeReason = RuntimeFreezeReason; type RewardCounter = FixedU128; type BalanceToU256 = BalanceToU256; type U256ToBalance = U256ToBalance; @@ -1455,6 +1491,18 @@ impl pallet_state_trie_migration::Config for Runtime { type MaxKeyLen = MigrationMaxKeyLen; } +impl pallet_asset_rate::Config for Runtime { + type WeightInfo = weights::pallet_asset_rate::WeightInfo; + type RuntimeEvent = RuntimeEvent; + type CreateOrigin = EitherOfDiverse, Treasurer>; + type RemoveOrigin = EitherOfDiverse, Treasurer>; + type UpdateOrigin = EitherOfDiverse, Treasurer>; + type Currency = Balances; + type AssetKind = ::AssetKind; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = runtime_common::impls::benchmarks::AssetRateArguments; +} + construct_runtime! { pub enum Runtime { @@ -1550,7 +1598,7 @@ construct_runtime! { VoterList: pallet_bags_list::::{Pallet, Call, Storage, Event} = 39, // nomination pools: extension to staking. - NominationPools: pallet_nomination_pools::{Pallet, Call, Storage, Event, Config} = 41, + NominationPools: pallet_nomination_pools::{Pallet, Call, Storage, Event, Config, FreezeReason} = 41, // Fast unstake pallet: extension to staking. FastUnstake: pallet_fast_unstake = 42, @@ -1585,6 +1633,9 @@ construct_runtime! { // Generalized message queue MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} = 100, + + // Asset rate. + AssetRate: pallet_asset_rate::{Pallet, Call, Storage, Event} = 101, } } @@ -1626,8 +1677,13 @@ pub type Migrations = migrations::Unreleased; /// The runtime migrations per release. #[allow(deprecated, missing_docs)] pub mod migrations { + use super::Runtime; + /// Unreleased migrations. Add new ones here: - pub type Unreleased = (); + pub type Unreleased = ( + pallet_nomination_pools::migration::versioned_migrations::V5toV6, + pallet_nomination_pools::migration::versioned_migrations::V6ToV7, + ); } /// Unchecked extrinsic type as expected by this runtime. @@ -1699,6 +1755,7 @@ mod benches { [pallet_utility, Utility] [pallet_vesting, Vesting] [pallet_whitelist, Whitelist] + [pallet_asset_rate, AssetRate] // XCM [pallet_xcm, XcmPallet] [pallet_xcm_benchmarks::fungible, pallet_xcm_benchmarks::fungible::Pallet::] @@ -1772,6 +1829,7 @@ sp_api::impl_runtime_apis! { } } + #[api_version(7)] impl primitives::runtime_api::ParachainHost for Runtime { fn validators() -> Vec { parachains_runtime_api_impl::validators::() @@ -1902,6 +1960,18 @@ sp_api::impl_runtime_apis! { key_ownership_proof, ) } + + fn minimum_backing_votes() -> u32 { + parachains_runtime_api_impl::minimum_backing_votes::() + } + + fn para_backing_state(para_id: ParaId) -> Option { + parachains_runtime_api_impl::backing_state::(para_id) + } + + fn async_backing_params() -> primitives::AsyncBackingParams { + parachains_runtime_api_impl::async_backing_params::() + } } impl beefy_primitives::BeefyApi for Runtime { @@ -2165,6 +2235,16 @@ sp_api::impl_runtime_apis! { } } + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { @@ -2227,7 +2307,7 @@ sp_api::impl_runtime_apis! { use frame_benchmarking::baseline::Pallet as Baseline; use xcm::latest::prelude::*; use xcm_config::{ - LocalCheckAccount, SovereignAccountOf, Statemine, TokenLocation, XcmConfig, + LocalCheckAccount, SovereignAccountOf, AssetHubLocation, TokenLocation, XcmConfig, }; impl pallet_session_benchmarking::Config for Runtime {} @@ -2238,11 +2318,26 @@ sp_api::impl_runtime_apis! { impl pallet_nomination_pools_benchmarking::Config for Runtime {} impl runtime_parachains::disputes::slashing::benchmarking::Config for Runtime {} + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + TokenLocation::get(), + ExistentialDeposit::get() + ).into()); + pub ToParachain: ParaId = kusama_runtime_constants::system_parachain::ASSET_HUB_ID.into(); + } + impl pallet_xcm_benchmarks::Config for Runtime { type XcmConfig = XcmConfig; type AccountIdConverter = SovereignAccountOf; + type DeliveryHelper = runtime_common::xcm_sender::ToParachainDeliveryHelper< + XcmConfig, + ExistentialDepositMultiAsset, + xcm_config::PriceForChildParachainDelivery, + ToParachain, + (), + >; fn valid_destination() -> Result { - Ok(Statemine::get()) + Ok(AssetHubLocation::get()) } fn worst_case_holding(_depositable_count: u32) -> MultiAssets { // Kusama only knows about KSM. @@ -2255,7 +2350,7 @@ sp_api::impl_runtime_apis! { parameter_types! { pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( - Statemine::get(), + AssetHubLocation::get(), MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(TokenLocation::get()) }, )); pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; @@ -2277,6 +2372,7 @@ sp_api::impl_runtime_apis! { } impl pallet_xcm_benchmarks::generic::Config for Runtime { + type TransactAsset = Balances; type RuntimeCall = RuntimeCall; fn worst_case_response() -> (u64, Response) { @@ -2294,15 +2390,15 @@ sp_api::impl_runtime_apis! { } fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { - Ok((Statemine::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) + Ok((AssetHubLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } fn subscribe_origin() -> Result { - Ok(Statemine::get()) + Ok(AssetHubLocation::get()) } fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { - let origin = Statemine::get(); + let origin = AssetHubLocation::get(); let assets: MultiAssets = (Concrete(TokenLocation::get()), 1_000 * UNITS).into(); let ticket = MultiLocation { parents: 0, interior: Here }; Ok((origin, ticket, assets)) @@ -2356,7 +2452,10 @@ mod fees_tests { #[cfg(test)] mod multiplier_tests { use super::*; - use frame_support::{dispatch::DispatchInfo, traits::OnFinalize}; + use frame_support::{ + dispatch::DispatchInfo, + traits::{OnFinalize, PalletInfoAccess}, + }; use runtime_common::{MinimumMultiplier, TargetBlockFullness}; use separator::Separatable; use sp_runtime::traits::Convert; @@ -2401,6 +2500,11 @@ mod multiplier_tests { assert!(on_idle / block_time <= 0.5f32) } + #[test] + fn treasury_pallet_index_is_correct() { + assert_eq!(TREASURY_PALLET_ID, ::index() as u8); + } + #[test] #[ignore] fn multiplier_growth_simulator() { diff --git a/relay/kusama/src/weights/mod.rs b/relay/kusama/src/weights/mod.rs index b3642d49d4..7c935b73e0 100644 --- a/relay/kusama/src/weights/mod.rs +++ b/relay/kusama/src/weights/mod.rs @@ -17,6 +17,7 @@ pub mod frame_election_provider_support; pub mod frame_system; +pub mod pallet_asset_rate; pub mod pallet_bags_list; pub mod pallet_balances; pub mod pallet_balances_nis_counterpart_balances; diff --git a/relay/kusama/src/weights/pallet_asset_rate.rs b/relay/kusama/src/weights/pallet_asset_rate.rs new file mode 100644 index 0000000000..e6fbff6374 --- /dev/null +++ b/relay/kusama/src/weights/pallet_asset_rate.rs @@ -0,0 +1,86 @@ +// 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 . + +//! Autogenerated weights for `pallet_asset_rate` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-07-03, STEPS: `50`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `cob`, CPU: `` +//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./target/debug/polkadot +// benchmark +// pallet +// --chain=kusama-dev +// --steps=50 +// --repeat=2 +// --pallet=pallet_asset_rate +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./runtime/kusama/src/weights/ +// --header=./file_header.txt + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_asset_rate`. +pub struct WeightInfo(PhantomData); +impl pallet_asset_rate::WeightInfo for WeightInfo { + /// Storage: AssetRate ConversionRateToNative (r:1 w:1) + /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(1237), added: 3712, mode: MaxEncodedLen) + fn create() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `4702` + // Minimum execution time: 53_000_000 picoseconds. + Weight::from_parts(55_000_000, 0) + .saturating_add(Weight::from_parts(0, 4702)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: AssetRate ConversionRateToNative (r:1 w:1) + /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(1237), added: 3712, mode: MaxEncodedLen) + fn update() -> Weight { + // Proof Size summary in bytes: + // Measured: `110` + // Estimated: `4702` + // Minimum execution time: 60_000_000 picoseconds. + Weight::from_parts(60_000_000, 0) + .saturating_add(Weight::from_parts(0, 4702)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: AssetRate ConversionRateToNative (r:1 w:1) + /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(1237), added: 3712, mode: MaxEncodedLen) + fn remove() -> Weight { + // Proof Size summary in bytes: + // Measured: `110` + // Estimated: `4702` + // Minimum execution time: 66_000_000 picoseconds. + Weight::from_parts(74_000_000, 0) + .saturating_add(Weight::from_parts(0, 4702)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/relay/kusama/src/weights/pallet_nomination_pools.rs b/relay/kusama/src/weights/pallet_nomination_pools.rs index 3320520cd7..3eae33b5b9 100644 --- a/relay/kusama/src/weights/pallet_nomination_pools.rs +++ b/relay/kusama/src/weights/pallet_nomination_pools.rs @@ -597,4 +597,23 @@ impl pallet_nomination_pools::WeightInfo for WeightInfo .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } + + /// Storage: `NominationPools::BondedPools` (r:1 w:0) + /// Proof: `NominationPools::BondedPools` (`max_values`: None, `max_size`: Some(220), added: 2695, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:1) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:0) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + fn adjust_pool_deposit() -> Weight { + // Proof Size summary in bytes: + // Measured: `980` + // Estimated: `4764` + // Minimum execution time: 54_057_000 picoseconds. + Weight::from_parts(54_855_000, 0) + .saturating_add(Weight::from_parts(0, 4764)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } } diff --git a/relay/kusama/src/weights/pallet_treasury.rs b/relay/kusama/src/weights/pallet_treasury.rs index 5ca8eb50b7..52b59a25cd 100644 --- a/relay/kusama/src/weights/pallet_treasury.rs +++ b/relay/kusama/src/weights/pallet_treasury.rs @@ -51,12 +51,12 @@ impl pallet_treasury::WeightInfo for WeightInfo { /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) /// Storage: `Treasury::Proposals` (r:0 w:1) /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - fn spend() -> Weight { + fn spend_local() -> Weight { // Proof Size summary in bytes: // Measured: `6` // Estimated: `1887` - // Minimum execution time: 12_229_000 picoseconds. - Weight::from_parts(12_915_000, 0) + // Minimum execution time: 7_563_000 picoseconds. + Weight::from_parts(7_868_000, 0) .saturating_add(Weight::from_parts(0, 1887)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(3)) @@ -69,8 +69,8 @@ impl pallet_treasury::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `107` // Estimated: `1489` - // Minimum execution time: 23_903_000 picoseconds. - Weight::from_parts(24_930_000, 0) + // Minimum execution time: 16_827_000 picoseconds. + Weight::from_parts(17_262_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -83,8 +83,8 @@ impl pallet_treasury::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `265` // Estimated: `3593` - // Minimum execution time: 36_120_000 picoseconds. - Weight::from_parts(37_341_000, 0) + // Minimum execution time: 25_789_000 picoseconds. + Weight::from_parts(26_398_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -98,11 +98,11 @@ impl pallet_treasury::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `433 + p * (8 ±0)` // Estimated: `3573` - // Minimum execution time: 7_598_000 picoseconds. - Weight::from_parts(12_144_577, 0) + // Minimum execution time: 5_353_000 picoseconds. + Weight::from_parts(8_423_989, 0) .saturating_add(Weight::from_parts(0, 3573)) - // Standard Error: 1_737 - .saturating_add(Weight::from_parts(83_412, 0).saturating_mul(p.into())) + // Standard Error: 1_120 + .saturating_add(Weight::from_parts(45_883, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -112,8 +112,8 @@ impl pallet_treasury::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `1887` - // Minimum execution time: 5_895_000 picoseconds. - Weight::from_parts(6_191_000, 0) + // Minimum execution time: 4_075_000 picoseconds. + Weight::from_parts(4_286_000, 0) .saturating_add(Weight::from_parts(0, 1887)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -122,26 +122,90 @@ impl pallet_treasury::WeightInfo for WeightInfo { /// Proof: `Treasury::Deactivated` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Treasury::Approvals` (r:1 w:1) /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) - /// Storage: `Treasury::Proposals` (r:100 w:100) + /// Storage: `Treasury::Proposals` (r:99 w:99) /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:201 w:201) + /// Storage: `System::Account` (r:199 w:199) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Bounties::BountyApprovals` (r:1 w:1) /// Proof: `Bounties::BountyApprovals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) - /// The range of component `p` is `[0, 100]`. + /// The range of component `p` is `[0, 99]`. fn on_initialize_proposals(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `297 + p * (251 ±0)` + // Measured: `294 + p * (251 ±0)` // Estimated: `3593 + p * (5206 ±0)` - // Minimum execution time: 59_368_000 picoseconds. - Weight::from_parts(55_754_002, 0) + // Minimum execution time: 34_895_000 picoseconds. + Weight::from_parts(40_046_318, 0) .saturating_add(Weight::from_parts(0, 3593)) - // Standard Error: 15_044 - .saturating_add(Weight::from_parts(37_890_085, 0).saturating_mul(p.into())) + // Standard Error: 6_188 + .saturating_add(Weight::from_parts(25_772_314, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes(4)) .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 5206).saturating_mul(p.into())) } + /// Storage: `Treasury::SpendCount` (r:1 w:1) + /// Proof: `Treasury::SpendCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Spends` (r:0 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(1853), added: 4328, mode: `MaxEncodedLen`) + fn spend() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `1489` + // Minimum execution time: 8_598_000 picoseconds. + Weight::from_parts(8_937_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::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(1853), added: 4328, mode: `MaxEncodedLen`) + /// Storage: `XcmPallet::QueryCounter` (r:1 w:1) + /// Proof: `XcmPallet::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// 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`) + /// Storage: `XcmPallet::Queries` (r:0 w:1) + /// Proof: `XcmPallet::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn payout() -> Weight { + // Proof Size summary in bytes: + // Measured: `251` + // Estimated: `5318` + // Minimum execution time: 29_981_000 picoseconds. + Weight::from_parts(30_787_000, 0) + .saturating_add(Weight::from_parts(0, 5318)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: `Treasury::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(1853), added: 4328, mode: `MaxEncodedLen`) + /// Storage: `XcmPallet::Queries` (r:1 w:1) + /// Proof: `XcmPallet::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn check_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `170` + // Estimated: `5318` + // Minimum execution time: 15_985_000 picoseconds. + Weight::from_parts(16_431_000, 0) + .saturating_add(Weight::from_parts(0, 5318)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Treasury::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(1853), added: 4328, mode: `MaxEncodedLen`) + fn void_spend() -> Weight { + // Proof Size summary in bytes: + // Measured: `142` + // Estimated: `5318` + // Minimum execution time: 8_515_000 picoseconds. + Weight::from_parts(8_795_000, 0) + .saturating_add(Weight::from_parts(0, 5318)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/relay/kusama/src/weights/xcm/mod.rs b/relay/kusama/src/weights/xcm/mod.rs index 5958abe40d..ec73d891ec 100644 --- a/relay/kusama/src/weights/xcm/mod.rs +++ b/relay/kusama/src/weights/xcm/mod.rs @@ -91,7 +91,6 @@ impl XcmWeightInfo for KusamaXcmWeight { assets.weigh_multi_assets(XcmBalancesWeight::::withdraw_asset()) } fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { - // Kusama doesn't support ReserveAssetDeposited, so this benchmark has a default weight assets.weigh_multi_assets(XcmBalancesWeight::::reserve_asset_deposited()) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { diff --git a/relay/kusama/src/xcm_config.rs b/relay/kusama/src/xcm_config.rs index c90e6c55a9..fe0d1ae1b6 100644 --- a/relay/kusama/src/xcm_config.rs +++ b/relay/kusama/src/xcm_config.rs @@ -18,8 +18,8 @@ use super::{ parachains_origin, AccountId, AllPalletsWithSystem, Balances, Dmp, Fellows, ParaId, Runtime, - RuntimeCall, RuntimeEvent, RuntimeOrigin, StakingAdmin, TransactionByteFee, WeightToFee, - XcmPallet, + RuntimeCall, RuntimeEvent, RuntimeOrigin, StakingAdmin, TransactionByteFee, Treasury, + WeightToFee, XcmPallet, }; use frame_support::{ match_types, parameter_types, @@ -27,7 +27,7 @@ use frame_support::{ weights::Weight, }; use frame_system::EnsureRoot; -use kusama_runtime_constants::currency::CENTS; +use kusama_runtime_constants::{currency::CENTS, system_parachain::*}; use runtime_common::{ crowdloan, paras_registrar, xcm_sender::{ChildParachainRouter, ExponentialPrice}, @@ -42,7 +42,7 @@ use xcm_builder::{ CurrencyAdapter as XcmCurrencyAdapter, IsChildSystemParachain, IsConcrete, MintLocation, OriginToPluralityVoice, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeesToAccount, }; use xcm_executor::traits::WithOriginFilter; @@ -61,6 +61,8 @@ parameter_types! { pub CheckAccount: AccountId = XcmPallet::check_account(); /// The check account that is allowed to mint assets locally. pub LocalCheckAccount: (AccountId, MintLocation) = (CheckAccount::get(), MintLocation::Local); + /// Account of the treasury pallet. + pub TreasuryAccount: AccountId = Treasury::account_id(); } /// The canonical means of converting a `MultiLocation` into an `AccountId`, used when we want to @@ -113,27 +115,31 @@ parameter_types! { pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } +pub type PriceForChildParachainDelivery = + ExponentialPrice; + /// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our /// individual routers. pub type XcmRouter = WithUniqueTopic<( // Only one router so far - use DMP to communicate with child parachains. - ChildParachainRouter< - Runtime, - XcmPallet, - ExponentialPrice, - >, + ChildParachainRouter, )>; parameter_types! { pub const Ksm: MultiAssetFilter = Wild(AllOf { fun: WildFungible, id: Concrete(TokenLocation::get()) }); - pub const Statemine: MultiLocation = Parachain(1000).into_location(); - pub const Encointer: MultiLocation = Parachain(1001).into_location(); - pub const KsmForStatemine: (MultiAssetFilter, MultiLocation) = (Ksm::get(), Statemine::get()); + pub const AssetHubLocation: MultiLocation = Parachain(ASSET_HUB_ID).into_location(); + pub const KsmForAssetHub: (MultiAssetFilter, MultiLocation) = (Ksm::get(), AssetHubLocation::get()); + pub const Encointer: MultiLocation = Parachain(ENCOINTER_ID).into_location(); pub const KsmForEncointer: (MultiAssetFilter, MultiLocation) = (Ksm::get(), Encointer::get()); + pub const BridgeHubLocation: MultiLocation = Parachain(BRIDGE_HUB_ID).into_location(); + pub const KsmForBridgeHub: (MultiAssetFilter, MultiLocation) = (Ksm::get(), BridgeHubLocation::get()); pub const MaxAssetsIntoHolding: u32 = 64; } -pub type TrustedTeleporters = - (xcm_builder::Case, xcm_builder::Case); +pub type TrustedTeleporters = ( + xcm_builder::Case, + xcm_builder::Case, + xcm_builder::Case, +); match_types! { pub type OnlyParachains: impl Contains = { @@ -339,7 +345,7 @@ impl xcm_executor::Config for XcmConfig { type SubscriptionService = XcmPallet; type PalletInstancesInfo = AllPalletsWithSystem; type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type FeeManager = (); + type FeeManager = XcmFeesToAccount; // No bridges yet... type MessageExporter = (); type UniversalAliases = Nothing; diff --git a/relay/polkadot/Cargo.toml b/relay/polkadot/Cargo.toml index 65c31fd197..0208c50c83 100644 --- a/relay/polkadot/Cargo.toml +++ b/relay/polkadot/Cargo.toml @@ -18,105 +18,107 @@ serde_derive = { version = "1.0.117", optional = true } static_assertions = "1.1.0" smallvec = "1.8.0" -authority-discovery-primitives = { package = "sp-authority-discovery", default-features = false , version = "22.0.0" } -babe-primitives = { package = "sp-consensus-babe", default-features = false , version = "0.28.0" } -beefy-primitives = { package = "sp-consensus-beefy", default-features = false , version = "9.0.0" } -block-builder-api = { package = "sp-block-builder", default-features = false , version = "22.0.0" } -inherents = { package = "sp-inherents", default-features = false , version = "22.0.0" } -offchain-primitives = { package = "sp-offchain", default-features = false , version = "22.0.0" } -tx-pool-api = { package = "sp-transaction-pool", default-features = false , version = "22.0.0" } -sp-arithmetic = { default-features = false , version = "19.0.0" } -sp-api = { default-features = false , version = "22.0.0" } -sp-std = { default-features = false , version = "11.0.0" } -sp-io = { default-features = false , version = "26.0.0" } -sp-mmr-primitives = { default-features = false , version = "22.0.0" } -sp-runtime = { default-features = false , version = "27.0.0" } -sp-staking = { default-features = false , version = "22.0.0" } -sp-core = { default-features = false , version = "24.0.0" } -sp-session = { default-features = false , version = "23.0.0" } -sp-storage = { default-features = false , version = "16.0.0" } -sp-version = { default-features = false , version = "25.0.0" } -sp-npos-elections = { default-features = false , version = "22.0.0" } +authority-discovery-primitives = { package = "sp-authority-discovery", default-features = false , version = "23.0.0" } +babe-primitives = { package = "sp-consensus-babe", default-features = false , version = "0.29.0" } +beefy-primitives = { package = "sp-consensus-beefy", default-features = false , version = "10.0.0" } +block-builder-api = { package = "sp-block-builder", default-features = false , version = "23.0.0" } +inherents = { package = "sp-inherents", default-features = false , version = "23.0.0" } +offchain-primitives = { package = "sp-offchain", default-features = false , version = "23.0.0" } +tx-pool-api = { package = "sp-transaction-pool", default-features = false , version = "23.0.0" } +sp-arithmetic = { default-features = false , version = "20.0.0" } +sp-api = { default-features = false , version = "23.0.0" } +sp-genesis-builder = { default-features = false , version = "0.4.0" } +sp-std = { default-features = false , version = "12.0.0" } +sp-io = { default-features = false , version = "27.0.0" } +sp-mmr-primitives = { default-features = false , version = "23.0.0" } +sp-runtime = { default-features = false , version = "28.0.0" } +sp-staking = { default-features = false , version = "23.0.0" } +sp-core = { default-features = false , version = "25.0.0" } +sp-session = { default-features = false , version = "24.0.0" } +sp-storage = { default-features = false , version = "17.0.0" } +sp-version = { default-features = false , version = "26.0.0" } +sp-npos-elections = { default-features = false , version = "23.0.0" } -pallet-authority-discovery = { default-features = false , version = "24.0.0" } -pallet-authorship = { default-features = false , version = "24.0.0" } -pallet-babe = { default-features = false , version = "24.0.0" } -pallet-bags-list = { default-features = false , version = "23.0.0" } -pallet-balances = { default-features = false , version = "24.0.0" } -pallet-bounties = { default-features = false , version = "23.0.0" } -pallet-child-bounties = { default-features = false , version = "23.0.0" } -pallet-transaction-payment = { default-features = false , version = "24.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false , version = "24.0.0" } -pallet-collective = { default-features = false , version = "24.0.0" } -pallet-conviction-voting = { default-features = false , version = "24.0.0" } -pallet-democracy = { default-features = false , version = "24.0.0" } -pallet-elections-phragmen = { default-features = false , version = "25.0.0" } -pallet-election-provider-multi-phase = { default-features = false , version = "23.0.0" } -pallet-fast-unstake = { default-features = false , version = "23.0.0" } -frame-executive = { default-features = false , version = "24.0.0" } -pallet-grandpa = { default-features = false , version = "24.0.0" } -pallet-identity = { default-features = false , version = "24.0.0" } -pallet-im-online = { default-features = false , version = "23.0.0" } -pallet-indices = { default-features = false , version = "24.0.0" } -pallet-membership = { default-features = false , version = "24.0.0" } -pallet-message-queue = { default-features = false , version = "27.0.0" } -pallet-multisig = { default-features = false , version = "24.0.0" } -pallet-nomination-pools = { default-features = false , version = "21.0.0" } -pallet-nomination-pools-runtime-api = { default-features = false , version = "19.0.0" } -pallet-offences = { default-features = false , version = "23.0.0" } -pallet-preimage = { default-features = false , version = "24.0.0" } -pallet-proxy = { default-features = false , version = "24.0.0" } -pallet-referenda = { default-features = false , version = "24.0.0" } -pallet-scheduler = { default-features = false , version = "25.0.0" } -pallet-session = { default-features = false , version = "24.0.0" } -frame-support = { default-features = false , version = "24.0.0" } -pallet-staking = { default-features = false , version = "24.0.0" } -pallet-staking-reward-curve = { version = "9.0.0" } -pallet-staking-reward-fn = { default-features = false, version = "15.0.0" } -pallet-staking-runtime-api = { default-features = false , version = "10.0.0" } -frame-system = { default-features = false , version = "24.0.0" } -frame-system-rpc-runtime-api = { default-features = false , version = "22.0.0" } +pallet-asset-rate = { default-features = false , version = "4.0.0" } +pallet-authority-discovery = { default-features = false , version = "25.0.0" } +pallet-authorship = { default-features = false , version = "25.0.0" } +pallet-babe = { default-features = false , version = "25.0.0" } +pallet-bags-list = { default-features = false , version = "24.0.0" } +pallet-balances = { default-features = false , version = "25.0.0" } +pallet-bounties = { default-features = false , version = "24.0.0" } +pallet-child-bounties = { default-features = false , version = "24.0.0" } +pallet-transaction-payment = { default-features = false , version = "25.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false , version = "25.0.0" } +pallet-collective = { default-features = false , version = "25.0.0" } +pallet-conviction-voting = { default-features = false , version = "25.0.0" } +pallet-democracy = { default-features = false , version = "25.0.0" } +pallet-elections-phragmen = { default-features = false , version = "26.0.0" } +pallet-election-provider-multi-phase = { default-features = false , version = "24.0.0" } +pallet-fast-unstake = { default-features = false , version = "24.0.0" } +frame-executive = { default-features = false , version = "25.0.0" } +pallet-grandpa = { default-features = false , version = "25.0.0" } +pallet-identity = { default-features = false , version = "25.0.0" } +pallet-im-online = { default-features = false , version = "24.0.0" } +pallet-indices = { default-features = false , version = "25.0.0" } +pallet-membership = { default-features = false , version = "25.0.0" } +pallet-message-queue = { default-features = false , version = "28.0.0" } +pallet-multisig = { default-features = false , version = "25.0.0" } +pallet-nomination-pools = { default-features = false , version = "22.0.0" } +pallet-nomination-pools-runtime-api = { default-features = false , version = "20.0.0" } +pallet-offences = { default-features = false , version = "24.0.0" } +pallet-preimage = { default-features = false , version = "25.0.0" } +pallet-proxy = { default-features = false , version = "25.0.0" } +pallet-referenda = { default-features = false , version = "25.0.0" } +pallet-scheduler = { default-features = false , version = "26.0.0" } +pallet-session = { default-features = false , version = "25.0.0" } +frame-support = { default-features = false , version = "25.0.0" } +pallet-staking = { default-features = false , version = "25.0.0" } +pallet-staking-reward-fn = { default-features = false, version = "16.0.0" } +pallet-staking-reward-curve = { version = "10.0.0" } +pallet-staking-runtime-api = { default-features = false , version = "11.0.0" } +frame-system = { default-features = false , version = "25.0.0" } +frame-system-rpc-runtime-api = { default-features = false , version = "23.0.0" } polkadot-runtime-constants = { package = "polkadot-runtime-constants", path = "constants", default-features = false } -pallet-timestamp = { default-features = false , version = "23.0.0" } -pallet-tips = { default-features = false , version = "23.0.0" } -pallet-treasury = { default-features = false , version = "23.0.0" } -pallet-whitelist = { default-features = false , version = "23.0.0" } -pallet-vesting = { default-features = false , version = "24.0.0" } -pallet-utility = { default-features = false , version = "24.0.0" } -frame-election-provider-support = { default-features = false , version = "24.0.0" } -pallet-xcm = { default-features = false, version = "3.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } +pallet-timestamp = { default-features = false , version = "24.0.0" } +pallet-tips = { default-features = false , version = "24.0.0" } +pallet-treasury = { default-features = false , version = "24.0.0" } +pallet-whitelist = { default-features = false , version = "24.0.0" } +pallet-vesting = { default-features = false , version = "25.0.0" } +pallet-utility = { default-features = false , version = "25.0.0" } +frame-election-provider-support = { default-features = false , version = "25.0.0" } +pallet-xcm = { default-features = false, version = "4.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "4.0.0" } -frame-benchmarking = { default-features = false, optional = true , version = "24.0.0" } -frame-try-runtime = { default-features = false, optional = true , version = "0.30.0" } -frame-system-benchmarking = { default-features = false, optional = true , version = "24.0.0" } -pallet-election-provider-support-benchmarking = { default-features = false, optional = true , version = "23.0.0" } -pallet-offences-benchmarking = { default-features = false, optional = true , version = "24.0.0" } -pallet-session-benchmarking = { default-features = false, optional = true , version = "24.0.0" } -pallet-nomination-pools-benchmarking = { default-features = false, optional = true , version = "22.0.0" } +frame-benchmarking = { default-features = false, optional = true , version = "25.0.0" } +frame-try-runtime = { default-features = false, optional = true , version = "0.31.0" } +frame-system-benchmarking = { default-features = false, optional = true , version = "25.0.0" } +pallet-election-provider-support-benchmarking = { default-features = false, optional = true , version = "24.0.0" } +pallet-offences-benchmarking = { default-features = false, optional = true , version = "25.0.0" } +pallet-session-benchmarking = { default-features = false, optional = true , version = "25.0.0" } +pallet-nomination-pools-benchmarking = { default-features = false, optional = true , version = "23.0.0" } hex-literal = { version = "0.4.1", optional = true } -runtime-common = { package = "polkadot-runtime-common", default-features = false , version = "3.0.0" } -runtime-parachains = { package = "polkadot-runtime-parachains", default-features = false , version = "3.0.0" } -primitives = { package = "polkadot-primitives", default-features = false , version = "3.0.0" } +runtime-common = { package = "polkadot-runtime-common", default-features = false, version = "4.0.0" } +runtime-parachains = { package = "polkadot-runtime-parachains", default-features = false , version = "4.0.0" } +primitives = { package = "polkadot-primitives", default-features = false , version = "4.0.0" } -xcm = { package = "staging-xcm", default-features = false , version = "3.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false , version = "3.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "3.0.1" } +xcm = { package = "staging-xcm", default-features = false , version = "4.0.0" } +xcm-executor = { package = "staging-xcm-executor", default-features = false , version = "4.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false , version = "4.0.0" } [dev-dependencies] hex-literal = "0.4.1" tiny-keccak = { version = "2.0.2", features = ["keccak"] } -keyring = { package = "sp-keyring", version = "27.0.0" } -sp-trie = { version = "25.0.0" } +keyring = { package = "sp-keyring", version = "28.0.0" } +sp-trie = { version = "26.0.0" } serde_json = "1.0.96" separator = "0.4.1" -remote-externalities = { package = "frame-remote-externalities" , version = "0.31.0" } +remote-externalities = { package = "frame-remote-externalities" , version = "0.32.0" } tokio = { version = "1.24.2", features = ["macros"] } -sp-tracing = { default-features = false , version = "13.0.0" } +sp-tracing = { default-features = false , version = "14.0.0" } [build-dependencies] -substrate-wasm-builder = { version = "13.0.0" } +substrate-wasm-builder = { version = "14.0.0" } [features] default = [ "std" ] @@ -139,6 +141,7 @@ std = [ "inherents/std", "log/std", "offchain-primitives/std", + "pallet-asset-rate/std", "pallet-authority-discovery/std", "pallet-authorship/std", "pallet-babe/std", @@ -171,8 +174,8 @@ std = [ "pallet-scheduler/std", "pallet-session-benchmarking?/std", "pallet-session/std", - "pallet-staking-runtime-api/std", "pallet-staking-reward-fn/std", + "pallet-staking-runtime-api/std", "pallet-staking/std", "pallet-timestamp/std", "pallet-tips/std", @@ -196,6 +199,7 @@ std = [ "sp-api/std", "sp-arithmetic/std", "sp-core/std", + "sp-genesis-builder/std", "sp-io/std", "sp-mmr-primitives/std", "sp-npos-elections/std", @@ -218,6 +222,7 @@ runtime-benchmarks = [ "frame-system-benchmarking/runtime-benchmarks", "frame-system/runtime-benchmarks", "hex-literal", + "pallet-asset-rate/runtime-benchmarks", "pallet-babe/runtime-benchmarks", "pallet-bags-list/runtime-benchmarks", "pallet-balances/runtime-benchmarks", @@ -270,6 +275,7 @@ try-runtime = [ "frame-system/try-runtime", "frame-try-runtime", "frame-try-runtime/try-runtime", + "pallet-asset-rate/try-runtime", "pallet-authority-discovery/try-runtime", "pallet-authorship/try-runtime", "pallet-babe/try-runtime", diff --git a/relay/polkadot/constants/Cargo.toml b/relay/polkadot/constants/Cargo.toml index 0b77ef424f..706b43261e 100644 --- a/relay/polkadot/constants/Cargo.toml +++ b/relay/polkadot/constants/Cargo.toml @@ -9,12 +9,14 @@ license.workspace = true [dependencies] smallvec = "1.8.0" -frame-support = { default-features = false , version = "24.0.0" } -primitives = { package = "polkadot-primitives", default-features = false , version = "3.0.0" } -runtime-common = { package = "polkadot-runtime-common", default-features = false , version = "3.0.0" } -sp-runtime = { default-features = false , version = "27.0.0" } -sp-weights = { default-features = false , version = "23.0.0" } -sp-core = { default-features = false , version = "24.0.0" } +frame-support = { default-features = false , version = "25.0.0" } +primitives = { package = "polkadot-primitives", default-features = false , version = "4.0.0" } +runtime-common = { package = "polkadot-runtime-common", default-features = false , version = "4.0.0" } +sp-runtime = { default-features = false , version = "28.0.0" } +sp-weights = { default-features = false , version = "24.0.0" } +sp-core = { default-features = false , version = "25.0.0" } + +xcm = { package = "staging-xcm", default-features = false , version = "4.0.0" } [features] default = [ "std" ] @@ -25,4 +27,5 @@ std = [ "sp-core/std", "sp-runtime/std", "sp-weights/std", + "xcm/std" ] diff --git a/relay/polkadot/constants/src/lib.rs b/relay/polkadot/constants/src/lib.rs index 304d86d1dd..dde8bd8ee5 100644 --- a/relay/polkadot/constants/src/lib.rs +++ b/relay/polkadot/constants/src/lib.rs @@ -113,12 +113,33 @@ pub mod xcm { /// System Parachains. pub mod system_parachain { - /// Statemint parachain ID. - pub const STATEMINT_ID: u32 = 1000; + use xcm::latest::prelude::*; + + /// Asset Hub parachain ID. + pub const ASSET_HUB_ID: u32 = 1000; /// Collectives parachain ID. pub const COLLECTIVES_ID: u32 = 1001; + /// Bridge Hub parachain ID. + pub const BRIDGE_HUB_ID: u32 = 1002; + + frame_support::match_types! { + // System parachains from Polkadot point of view. + pub type SystemParachains: impl Contains = { + MultiLocation { + parents: 0, + interior: X1(Parachain( + ASSET_HUB_ID | + COLLECTIVES_ID | + BRIDGE_HUB_ID + )), + } + }; + } } +/// Polkadot Treasury pallet instance. +pub const TREASURY_PALLET_ID: u8 = 19; + #[cfg(test)] mod tests { use super::{ diff --git a/relay/polkadot/src/lib.rs b/relay/polkadot/src/lib.rs index 247034be8f..02ca53e6de 100644 --- a/relay/polkadot/src/lib.rs +++ b/relay/polkadot/src/lib.rs @@ -22,8 +22,13 @@ use pallet_transaction_payment::CurrencyAdapter; use runtime_common::{ - auctions, claims, crowdloan, impl_runtime_weights, impls::DealWithFees, paras_registrar, - prod_or_fast, slots, BlockHashCount, BlockLength, CurrencyToVote, SlowAdjustingFeeUpdate, + auctions, claims, crowdloan, impl_runtime_weights, + impls::{ + DealWithFees, LocatableAssetConverter, VersionedLocatableAsset, + VersionedMultiLocationConverter, + }, + paras_registrar, prod_or_fast, slots, BlockHashCount, BlockLength, CurrencyToVote, + SlowAdjustingFeeUpdate, }; use runtime_parachains::{ @@ -45,7 +50,9 @@ use frame_election_provider_support::{ bounds::ElectionBoundsBuilder, generate_solution_type, onchain, SequentialPhragmen, }; use frame_support::{ - construct_runtime, parameter_types, + construct_runtime, + genesis_builder_helper::{build_config, create_default_config}, + parameter_types, traits::{ fungible::HoldConsideration, ConstU32, Contains, EitherOf, EitherOfDiverse, InstanceFilter, KeyOwnerProofSystem, LinearStoragePrice, PrivilegeCmp, ProcessMessage, ProcessMessageError, @@ -56,6 +63,7 @@ use frame_support::{ }; use frame_system::EnsureRoot; use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId}; +use pallet_identity::simple::IdentityInfo; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_session::historical as session_historical; use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo}; @@ -76,7 +84,7 @@ use sp_runtime::{ generic, impl_opaque_keys, traits::{ AccountIdLookup, BlakeTwo256, Block as BlockT, ConvertInto, Extrinsic as ExtrinsicT, - OpaqueKeys, SaturatedConversion, Verify, + IdentityLookup, OpaqueKeys, SaturatedConversion, Verify, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill, Percent, Permill, RuntimeDebug, @@ -86,7 +94,11 @@ use sp_std::{cmp::Ordering, collections::btree_map::BTreeMap, prelude::*}; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use xcm::latest::Junction; +use xcm::{ + latest::{InteriorMultiLocation, Junction, Junction::PalletInstance}, + VersionedMultiLocation, +}; +use xcm_builder::PayOverXcm; pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; @@ -100,7 +112,7 @@ use sp_runtime::traits::Get; pub use sp_runtime::BuildStorage; /// Constant values used within the runtime. -use polkadot_runtime_constants::{currency::*, fee::*, time::*}; +use polkadot_runtime_constants::{currency::*, fee::*, time::*, TREASURY_PALLET_ID}; // Weights used in the runtime. mod weights; @@ -304,9 +316,10 @@ impl pallet_balances::Config for Runtime { type ReserveIdentifier = [u8; 8]; type WeightInfo = weights::pallet_balances::WeightInfo; type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; + type RuntimeFreezeReason = RuntimeFreezeReason; + type FreezeIdentifier = RuntimeFreezeReason; + type MaxHolds = ConstU32<1>; + type MaxFreezes = ConstU32<8>; } parameter_types! { @@ -683,6 +696,7 @@ impl pallet_identity::Config for Runtime { type SubAccountDeposit = SubAccountDeposit; type MaxSubAccounts = MaxSubAccounts; type MaxAdditionalFields = MaxAdditionalFields; + type IdentityInformation = IdentityInfo; type MaxRegistrars = MaxRegistrars; type Slashed = Treasury; type ForceOrigin = EitherOf, GeneralAdmin>; @@ -697,6 +711,10 @@ parameter_types! { pub const SpendPeriod: BlockNumber = 24 * DAYS; pub const Burn: Permill = Permill::from_percent(1); pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); + pub const PayoutSpendPeriod: BlockNumber = 30 * DAYS; + // The asset's interior location for the paying account. This is the Treasury + // pallet instance (which sits at index 19). + pub TreasuryInteriorLocation: InteriorMultiLocation = PalletInstance(TREASURY_PALLET_ID).into(); pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); @@ -727,6 +745,23 @@ impl pallet_treasury::Config for Runtime { type MaxApprovals = MaxApprovals; type WeightInfo = weights::pallet_treasury::WeightInfo; type SpendOrigin = TreasurySpender; + type AssetKind = VersionedLocatableAsset; + type Beneficiary = VersionedMultiLocation; + type BeneficiaryLookup = IdentityLookup; + type Paymaster = PayOverXcm< + TreasuryInteriorLocation, + crate::xcm_config::XcmRouter, + crate::XcmPallet, + ConstU32<{ 6 * HOURS }>, + Self::Beneficiary, + Self::AssetKind, + LocatableAssetConverter, + VersionedMultiLocationConverter, + >; + type BalanceConverter = AssetRate; + type PayoutPeriod = PayoutSpendPeriod; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = runtime_common::impls::benchmarks::TreasuryArguments; } parameter_types! { @@ -1340,6 +1375,7 @@ parameter_types! { impl pallet_nomination_pools::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; + type RuntimeFreezeReason = RuntimeFreezeReason; type RewardCounter = FixedU128; type BalanceToU256 = runtime_common::BalanceToU256; type U256ToBalance = runtime_common::U256ToBalance; @@ -1377,6 +1413,18 @@ impl frame_support::traits::OnRuntimeUpgrade for InitiateNominationPools { } } +impl pallet_asset_rate::Config for Runtime { + type WeightInfo = weights::pallet_asset_rate::WeightInfo; + type RuntimeEvent = RuntimeEvent; + type CreateOrigin = EitherOfDiverse, Treasurer>; + type RemoveOrigin = EitherOfDiverse, Treasurer>; + type UpdateOrigin = EitherOfDiverse, Treasurer>; + type Currency = Balances; + type AssetKind = ::AssetKind; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = runtime_common::impls::benchmarks::AssetRateArguments; +} + construct_runtime! { pub enum Runtime { @@ -1439,7 +1487,7 @@ construct_runtime! { VoterList: pallet_bags_list::::{Pallet, Call, Storage, Event} = 37, // Nomination pools: extension to staking. - NominationPools: pallet_nomination_pools::{Pallet, Call, Storage, Event, Config} = 39, + NominationPools: pallet_nomination_pools::{Pallet, Call, Storage, Event, Config, FreezeReason} = 39, // Fast unstake pallet: extension to staking. FastUnstake: pallet_fast_unstake = 40, @@ -1472,6 +1520,9 @@ construct_runtime! { // Generalized message queue MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} = 100, + + // Asset rate. + AssetRate: pallet_asset_rate::{Pallet, Call, Storage, Event} = 101, } } @@ -1598,6 +1649,9 @@ pub mod migrations { // Migrate parachain info format paras_registrar::migration::VersionCheckedMigrateToV1, + pallet_nomination_pools::migration::versioned_migrations::V5toV6, + pallet_nomination_pools::migration::versioned_migrations::V6ToV7, + runtime_parachains::scheduler::migration::v1::MigrateToV1 ); } @@ -1666,6 +1720,7 @@ mod benches { [pallet_conviction_voting, ConvictionVoting] [pallet_referenda, Referenda] [pallet_whitelist, Whitelist] + [pallet_asset_rate, AssetRate] // XCM [pallet_xcm, XcmPallet] [pallet_xcm_benchmarks::fungible, pallet_xcm_benchmarks::fungible::Pallet::] @@ -2100,6 +2155,16 @@ sp_api::impl_runtime_apis! { } } + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { @@ -2161,7 +2226,7 @@ sp_api::impl_runtime_apis! { use frame_system_benchmarking::Pallet as SystemBench; use frame_benchmarking::baseline::Pallet as Baseline; use xcm::latest::prelude::*; - use xcm_config::{XcmConfig, StatemintLocation, TokenLocation, LocalCheckAccount, SovereignAccountOf}; + use xcm_config::{XcmConfig, AssetHubLocation, TokenLocation, LocalCheckAccount, SovereignAccountOf}; impl pallet_session_benchmarking::Config for Runtime {} impl pallet_offences_benchmarking::Config for Runtime {} @@ -2175,11 +2240,26 @@ sp_api::impl_runtime_apis! { let treasury_key = frame_system::Account::::hashed_key_for(Treasury::account_id()); whitelist.push(treasury_key.to_vec().into()); + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + TokenLocation::get(), + ExistentialDeposit::get() + ).into()); + pub ToParachain: ParaId = polkadot_runtime_constants::system_parachain::ASSET_HUB_ID.into(); + } + impl pallet_xcm_benchmarks::Config for Runtime { type XcmConfig = XcmConfig; type AccountIdConverter = SovereignAccountOf; + type DeliveryHelper = runtime_common::xcm_sender::ToParachainDeliveryHelper< + XcmConfig, + ExistentialDepositMultiAsset, + xcm_config::PriceForChildParachainDelivery, + ToParachain, + (), + >; fn valid_destination() -> Result { - Ok(StatemintLocation::get()) + Ok(AssetHubLocation::get()) } fn worst_case_holding(_depositable_count: u32) -> MultiAssets { // Polkadot only knows about DOT @@ -2189,7 +2269,7 @@ sp_api::impl_runtime_apis! { parameter_types! { pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( - StatemintLocation::get(), + AssetHubLocation::get(), MultiAsset { id: Concrete(TokenLocation::get()), fun: Fungible(1 * UNITS) } )); pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; @@ -2211,6 +2291,7 @@ sp_api::impl_runtime_apis! { } impl pallet_xcm_benchmarks::generic::Config for Runtime { + type TransactAsset = Balances; type RuntimeCall = RuntimeCall; fn worst_case_response() -> (u64, Response) { @@ -2228,15 +2309,15 @@ sp_api::impl_runtime_apis! { } fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { - Ok((StatemintLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) + Ok((AssetHubLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } fn subscribe_origin() -> Result { - Ok(StatemintLocation::get()) + Ok(AssetHubLocation::get()) } fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { - let origin = StatemintLocation::get(); + let origin = AssetHubLocation::get(); let assets: MultiAssets = (Concrete(TokenLocation::get()), 1_000 * UNITS).into(); let ticket = MultiLocation { parents: 0, interior: Here }; Ok((origin, ticket, assets)) @@ -2464,7 +2545,10 @@ mod test { #[cfg(test)] mod multiplier_tests { use super::*; - use frame_support::{dispatch::DispatchInfo, traits::OnFinalize}; + use frame_support::{ + dispatch::DispatchInfo, + traits::{OnFinalize, PalletInfoAccess}, + }; use runtime_common::{MinimumMultiplier, TargetBlockFullness}; use scale_info::TypeInfo; use separator::Separatable; @@ -2510,6 +2594,11 @@ mod multiplier_tests { assert!(on_idle / block_time <= 0.5f32) } + #[test] + fn treasury_pallet_index_is_correct() { + assert_eq!(TREASURY_PALLET_ID, ::index() as u8); + } + #[test] #[ignore] fn multiplier_growth_simulator() { diff --git a/relay/polkadot/src/weights/mod.rs b/relay/polkadot/src/weights/mod.rs index 596b594c93..7eca87034b 100644 --- a/relay/polkadot/src/weights/mod.rs +++ b/relay/polkadot/src/weights/mod.rs @@ -17,6 +17,7 @@ pub mod frame_election_provider_support; pub mod frame_system; +pub mod pallet_asset_rate; pub mod pallet_bags_list; pub mod pallet_balances; pub mod pallet_bounties; diff --git a/relay/polkadot/src/weights/pallet_asset_rate.rs b/relay/polkadot/src/weights/pallet_asset_rate.rs new file mode 100644 index 0000000000..e6fbff6374 --- /dev/null +++ b/relay/polkadot/src/weights/pallet_asset_rate.rs @@ -0,0 +1,86 @@ +// 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 . + +//! Autogenerated weights for `pallet_asset_rate` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-07-03, STEPS: `50`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `cob`, CPU: `` +//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./target/debug/polkadot +// benchmark +// pallet +// --chain=kusama-dev +// --steps=50 +// --repeat=2 +// --pallet=pallet_asset_rate +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./runtime/kusama/src/weights/ +// --header=./file_header.txt + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_asset_rate`. +pub struct WeightInfo(PhantomData); +impl pallet_asset_rate::WeightInfo for WeightInfo { + /// Storage: AssetRate ConversionRateToNative (r:1 w:1) + /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(1237), added: 3712, mode: MaxEncodedLen) + fn create() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `4702` + // Minimum execution time: 53_000_000 picoseconds. + Weight::from_parts(55_000_000, 0) + .saturating_add(Weight::from_parts(0, 4702)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: AssetRate ConversionRateToNative (r:1 w:1) + /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(1237), added: 3712, mode: MaxEncodedLen) + fn update() -> Weight { + // Proof Size summary in bytes: + // Measured: `110` + // Estimated: `4702` + // Minimum execution time: 60_000_000 picoseconds. + Weight::from_parts(60_000_000, 0) + .saturating_add(Weight::from_parts(0, 4702)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: AssetRate ConversionRateToNative (r:1 w:1) + /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(1237), added: 3712, mode: MaxEncodedLen) + fn remove() -> Weight { + // Proof Size summary in bytes: + // Measured: `110` + // Estimated: `4702` + // Minimum execution time: 66_000_000 picoseconds. + Weight::from_parts(74_000_000, 0) + .saturating_add(Weight::from_parts(0, 4702)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/relay/polkadot/src/weights/pallet_nomination_pools.rs b/relay/polkadot/src/weights/pallet_nomination_pools.rs index 095fa7fcc4..32ff276f7f 100644 --- a/relay/polkadot/src/weights/pallet_nomination_pools.rs +++ b/relay/polkadot/src/weights/pallet_nomination_pools.rs @@ -597,4 +597,22 @@ impl pallet_nomination_pools::WeightInfo for WeightInfo .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `NominationPools::BondedPools` (r:1 w:0) + /// Proof: `NominationPools::BondedPools` (`max_values`: None, `max_size`: Some(220), added: 2695, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:1) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:0) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + fn adjust_pool_deposit() -> Weight { + // Proof Size summary in bytes: + // Measured: `946` + // Estimated: `4764` + // Minimum execution time: 53_711_000 picoseconds. + Weight::from_parts(54_615_000, 0) + .saturating_add(Weight::from_parts(0, 4764)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } } diff --git a/relay/polkadot/src/weights/pallet_treasury.rs b/relay/polkadot/src/weights/pallet_treasury.rs index 9fd089ec3f..fad730f4c1 100644 --- a/relay/polkadot/src/weights/pallet_treasury.rs +++ b/relay/polkadot/src/weights/pallet_treasury.rs @@ -51,12 +51,12 @@ impl pallet_treasury::WeightInfo for WeightInfo { /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) /// Storage: `Treasury::Proposals` (r:0 w:1) /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - fn spend() -> Weight { + fn spend_local() -> Weight { // Proof Size summary in bytes: // Measured: `6` // Estimated: `1887` - // Minimum execution time: 12_248_000 picoseconds. - Weight::from_parts(12_752_000, 0) + // Minimum execution time: 7_278_000 picoseconds. + Weight::from_parts(7_633_000, 0) .saturating_add(Weight::from_parts(0, 1887)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(3)) @@ -69,8 +69,8 @@ impl pallet_treasury::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `107` // Estimated: `1489` - // Minimum execution time: 23_447_000 picoseconds. - Weight::from_parts(24_267_000, 0) + // Minimum execution time: 16_116_000 picoseconds. + Weight::from_parts(16_811_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -83,8 +83,8 @@ impl pallet_treasury::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `265` // Estimated: `3593` - // Minimum execution time: 36_221_000 picoseconds. - Weight::from_parts(37_350_000, 0) + // Minimum execution time: 25_554_000 picoseconds. + Weight::from_parts(26_473_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -98,11 +98,11 @@ impl pallet_treasury::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `433 + p * (8 ±0)` // Estimated: `3573` - // Minimum execution time: 7_718_000 picoseconds. - Weight::from_parts(10_234_157, 0) + // Minimum execution time: 5_048_000 picoseconds. + Weight::from_parts(7_308_351, 0) .saturating_add(Weight::from_parts(0, 3573)) - // Standard Error: 1_357 - .saturating_add(Weight::from_parts(72_271, 0).saturating_mul(p.into())) + // Standard Error: 950 + .saturating_add(Weight::from_parts(40_390, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -112,8 +112,8 @@ impl pallet_treasury::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `1887` - // Minimum execution time: 5_896_000 picoseconds. - Weight::from_parts(6_149_000, 0) + // Minimum execution time: 4_029_000 picoseconds. + Weight::from_parts(4_175_000, 0) .saturating_add(Weight::from_parts(0, 1887)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -122,26 +122,90 @@ impl pallet_treasury::WeightInfo for WeightInfo { /// Proof: `Treasury::Deactivated` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Treasury::Approvals` (r:1 w:1) /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) - /// Storage: `Treasury::Proposals` (r:100 w:100) + /// Storage: `Treasury::Proposals` (r:99 w:99) /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:200 w:200) + /// Storage: `System::Account` (r:198 w:198) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Bounties::BountyApprovals` (r:1 w:1) /// Proof: `Bounties::BountyApprovals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) - /// The range of component `p` is `[0, 100]`. + /// The range of component `p` is `[0, 99]`. fn on_initialize_proposals(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `217 + p * (251 ±0)` + // Measured: `214 + p * (251 ±0)` // Estimated: `1887 + p * (5206 ±0)` - // Minimum execution time: 38_724_000 picoseconds. - Weight::from_parts(36_590_852, 0) + // Minimum execution time: 21_953_000 picoseconds. + Weight::from_parts(26_546_487, 0) .saturating_add(Weight::from_parts(0, 1887)) - // Standard Error: 19_186 - .saturating_add(Weight::from_parts(37_703_755, 0).saturating_mul(p.into())) + // Standard Error: 9_168 + .saturating_add(Weight::from_parts(25_474_821, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes(3)) .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 5206).saturating_mul(p.into())) } + /// Storage: `Treasury::SpendCount` (r:1 w:1) + /// Proof: `Treasury::SpendCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Spends` (r:0 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(1853), added: 4328, mode: `MaxEncodedLen`) + fn spend() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `1489` + // Minimum execution time: 8_354_000 picoseconds. + Weight::from_parts(8_786_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::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(1853), added: 4328, mode: `MaxEncodedLen`) + /// Storage: `XcmPallet::QueryCounter` (r:1 w:1) + /// Proof: `XcmPallet::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// 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`) + /// Storage: `XcmPallet::Queries` (r:0 w:1) + /// Proof: `XcmPallet::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn payout() -> Weight { + // Proof Size summary in bytes: + // Measured: `218` + // Estimated: `5318` + // Minimum execution time: 29_975_000 picoseconds. + Weight::from_parts(30_430_000, 0) + .saturating_add(Weight::from_parts(0, 5318)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: `Treasury::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(1853), added: 4328, mode: `MaxEncodedLen`) + /// Storage: `XcmPallet::Queries` (r:1 w:1) + /// Proof: `XcmPallet::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn check_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `170` + // Estimated: `5318` + // Minimum execution time: 14_485_000 picoseconds. + Weight::from_parts(14_964_000, 0) + .saturating_add(Weight::from_parts(0, 5318)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Treasury::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(1853), added: 4328, mode: `MaxEncodedLen`) + fn void_spend() -> Weight { + // Proof Size summary in bytes: + // Measured: `142` + // Estimated: `5318` + // Minimum execution time: 8_322_000 picoseconds. + Weight::from_parts(8_580_000, 0) + .saturating_add(Weight::from_parts(0, 5318)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/relay/polkadot/src/weights/xcm/mod.rs b/relay/polkadot/src/weights/xcm/mod.rs index acef102b44..98c12fa7db 100644 --- a/relay/polkadot/src/weights/xcm/mod.rs +++ b/relay/polkadot/src/weights/xcm/mod.rs @@ -91,7 +91,6 @@ impl XcmWeightInfo for PolkadotXcmWeight assets.weigh_multi_assets(XcmBalancesWeight::::withdraw_asset()) } fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { - // Polkadot doesn't support ReserveAssetDeposited, so this benchmark has a default weight assets.weigh_multi_assets(XcmBalancesWeight::::reserve_asset_deposited()) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { diff --git a/relay/polkadot/src/xcm_config.rs b/relay/polkadot/src/xcm_config.rs index 6c45f1cec4..f6ce0d4fe8 100644 --- a/relay/polkadot/src/xcm_config.rs +++ b/relay/polkadot/src/xcm_config.rs @@ -19,7 +19,7 @@ use super::{ parachains_origin, AccountId, AllPalletsWithSystem, Balances, Dmp, FellowshipAdmin, GeneralAdmin, ParaId, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, StakingAdmin, - TransactionByteFee, WeightToFee, XcmPallet, + TransactionByteFee, Treasury, WeightToFee, XcmPallet, }; use frame_support::{ match_types, parameter_types, @@ -44,7 +44,7 @@ use xcm_builder::{ ChildParachainConvertsVia, CurrencyAdapter as XcmCurrencyAdapter, IsConcrete, MintLocation, OriginToPluralityVoice, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeesToAccount, }; use xcm_executor::traits::WithOriginFilter; @@ -61,6 +61,8 @@ parameter_types! { pub CheckAccount: AccountId = XcmPallet::check_account(); /// The Checking Account along with the indication that the local chain is able to mint tokens. pub LocalCheckAccount: (AccountId, MintLocation) = (CheckAccount::get(), MintLocation::Local); + /// Account of the treasury pallet. + pub TreasuryAccount: AccountId = Treasury::account_id(); } /// The canonical means of converting a `MultiLocation` into an `AccountId`, used when we want to @@ -118,29 +120,33 @@ parameter_types! { pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } +pub type PriceForChildParachainDelivery = + ExponentialPrice; + /// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our /// individual routers. pub type XcmRouter = WithUniqueTopic<( // Only one router so far - use DMP to communicate with child parachains. - ChildParachainRouter< - Runtime, - XcmPallet, - ExponentialPrice, - >, + ChildParachainRouter, )>; parameter_types! { pub const Dot: MultiAssetFilter = Wild(AllOf { fun: WildFungible, id: Concrete(TokenLocation::get()) }); - pub const StatemintLocation: MultiLocation = Parachain(STATEMINT_ID).into_location(); - pub const DotForStatemint: (MultiAssetFilter, MultiLocation) = (Dot::get(), StatemintLocation::get()); + pub const AssetHubLocation: MultiLocation = Parachain(ASSET_HUB_ID).into_location(); + pub const DotForAssetHub: (MultiAssetFilter, MultiLocation) = (Dot::get(), AssetHubLocation::get()); pub const CollectivesLocation: MultiLocation = Parachain(COLLECTIVES_ID).into_location(); pub const DotForCollectives: (MultiAssetFilter, MultiLocation) = (Dot::get(), CollectivesLocation::get()); + pub const BridgeHubLocation: MultiLocation = Parachain(BRIDGE_HUB_ID).into_location(); + pub const DotForBridgeHub: (MultiAssetFilter, MultiLocation) = (Dot::get(), BridgeHubLocation::get()); pub const MaxAssetsIntoHolding: u32 = 64; } -/// Polkadot Relay recognizes/respects the Statemint chain as a teleporter. -pub type TrustedTeleporters = - (xcm_builder::Case, xcm_builder::Case); +/// Polkadot Relay recognizes/respects the asset hub chain as a teleporter. +pub type TrustedTeleporters = ( + xcm_builder::Case, + xcm_builder::Case, + xcm_builder::Case, +); match_types! { pub type OnlyParachains: impl Contains = { @@ -340,7 +346,7 @@ impl xcm_executor::Config for XcmConfig { type SubscriptionService = XcmPallet; type PalletInstancesInfo = AllPalletsWithSystem; type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type FeeManager = (); + type FeeManager = XcmFeesToAccount; // No bridges yet... type MessageExporter = (); type UniversalAliases = Nothing; diff --git a/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml b/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml index 0b9e2dd906..c7abca8d60 100644 --- a/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml +++ b/system-parachains/asset-hubs/asset-hub-kusama/Cargo.toml @@ -16,77 +16,78 @@ scale-info = { version = "2.9.0", default-features = false, features = ["derive" smallvec = "1.11.0" # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-executive = { default-features = false, version = "24.0.0" } -frame-support = { default-features = false, version = "24.0.0" } -frame-system = { default-features = false, version = "24.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } -pallet-asset-conversion-tx-payment = { default-features = false, version = "6.0.0" } -pallet-assets = { default-features = false, version = "25.0.0" } -pallet-asset-conversion = { default-features = false, version = "6.0.0" } -pallet-aura = { default-features = false, version = "23.0.0" } -pallet-authorship = { default-features = false, version = "24.0.0" } -pallet-balances = { default-features = false, version = "24.0.0" } -pallet-multisig = { default-features = false, version = "24.0.0" } -pallet-nft-fractionalization = { default-features = false, version = "6.0.0" } -pallet-nfts = { default-features = false, version = "18.0.0" } -pallet-nfts-runtime-api = { default-features = false, version = "10.0.0" } -pallet-proxy = { default-features = false, version = "24.0.0" } -pallet-session = { default-features = false, version = "24.0.0" } -pallet-state-trie-migration = { default-features = false, optional = true , version = "25.0.0" } -pallet-timestamp = { default-features = false, version = "23.0.0" } -pallet-transaction-payment = { default-features = false, version = "24.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "24.0.0" } -pallet-uniques = { default-features = false, version = "24.0.0" } -pallet-utility = { default-features = false, version = "24.0.0" } -sp-api = { default-features = false, version = "22.0.0" } -sp-block-builder = { default-features = false, version = "22.0.0" } -sp-consensus-aura = { default-features = false, version = "0.28.0" } -sp-core = { default-features = false, version = "24.0.0" } -sp-inherents = { default-features = false, version = "22.0.0" } -sp-offchain = { default-features = false, version = "22.0.0" } -sp-runtime = { default-features = false, version = "27.0.0" } -sp-session = { default-features = false, version = "23.0.0" } -sp-std = { default-features = false, version = "11.0.0" } -sp-storage = { default-features = false, version = "16.0.0" } -sp-transaction-pool = { default-features = false, version = "22.0.0" } -sp-version = { default-features = false, version = "25.0.0" } -sp-weights = { default-features = false, version = "23.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-executive = { default-features = false, version = "25.0.0" } +frame-support = { default-features = false, version = "25.0.0" } +frame-system = { default-features = false, version = "25.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "23.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.31.0" } +pallet-asset-conversion-tx-payment = { default-features = false, version = "7.0.0" } +pallet-assets = { default-features = false, version = "26.0.0" } +pallet-asset-conversion = { default-features = false, version = "7.0.0" } +pallet-aura = { default-features = false, version = "24.0.0" } +pallet-authorship = { default-features = false, version = "25.0.0" } +pallet-balances = { default-features = false, version = "25.0.0" } +pallet-multisig = { default-features = false, version = "25.0.0" } +pallet-nft-fractionalization = { default-features = false, version = "7.0.0" } +pallet-nfts = { default-features = false, version = "19.0.0" } +pallet-nfts-runtime-api = { default-features = false, version = "11.0.0" } +pallet-proxy = { default-features = false, version = "25.0.0" } +pallet-session = { default-features = false, version = "25.0.0" } +pallet-state-trie-migration = { default-features = false, optional = true , version = "26.0.0" } +pallet-timestamp = { default-features = false, version = "24.0.0" } +pallet-transaction-payment = { default-features = false, version = "25.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "25.0.0" } +pallet-uniques = { default-features = false, version = "25.0.0" } +pallet-utility = { default-features = false, version = "25.0.0" } +sp-api = { default-features = false, version = "23.0.0" } +sp-block-builder = { default-features = false, version = "23.0.0" } +sp-consensus-aura = { default-features = false, version = "0.29.0" } +sp-core = { default-features = false, version = "25.0.0" } +sp-genesis-builder = { default-features = false , version = "0.4.0" } +sp-inherents = { default-features = false, version = "23.0.0" } +sp-offchain = { default-features = false, version = "23.0.0" } +sp-runtime = { default-features = false, version = "28.0.0" } +sp-session = { default-features = false, version = "24.0.0" } +sp-std = { default-features = false, version = "12.0.0" } +sp-storage = { default-features = false, version = "17.0.0" } +sp-transaction-pool = { default-features = false, version = "23.0.0" } +sp-version = { default-features = false, version = "26.0.0" } +sp-weights = { default-features = false, version = "24.0.0" } # num-traits feature needed for dex integer sq root: -primitive-types = { version = "0.12.1", default-features = false, features = ["codec", "scale-info", "num-traits"] } +primitive-types = { version = "0.12.2", default-features = false, features = ["codec", "scale-info", "num-traits"] } # Polkadot kusama-runtime-constants = { path = "../../../relay/kusama/constants", default-features = false} -pallet-xcm = { default-features = false, version = "3.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } -polkadot-core-primitives = { default-features = false, version = "3.0.0" } -polkadot-parachain-primitives = { default-features = false, version = "2.0.0" } -polkadot-runtime-common = { default-features = false, version = "3.0.0" } -xcm = { package = "staging-xcm", default-features = false, version = "3.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } +pallet-xcm = { default-features = false, version = "4.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "4.0.0" } +polkadot-core-primitives = { default-features = false, version = "4.0.0" } +polkadot-parachain-primitives = { default-features = false, version = "3.0.0" } +polkadot-runtime-common = { default-features = false, version = "4.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "4.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "4.0.0" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "4.0.0" } # Cumulus -cumulus-pallet-aura-ext = { default-features = false , version = "0.3.0" } -cumulus-pallet-dmp-queue = { default-features = false , version = "0.3.0" } -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } -cumulus-pallet-session-benchmarking = { default-features = false, version = "5.0.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } -cumulus-pallet-xcmp-queue = { default-features = false , version = "0.3.0" } -cumulus-primitives-core = { default-features = false , version = "0.3.0" } -cumulus-primitives-utility = { default-features = false , version = "0.3.0" } -pallet-collator-selection = { default-features = false , version = "5.0.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } -parachains-common = { default-features = false , version = "3.0.0" } -assets-common = { default-features = false , version = "0.3.0" } +cumulus-pallet-aura-ext = { default-features = false , version = "0.4.0" } +cumulus-pallet-dmp-queue = { default-features = false , version = "0.4.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.4.0" } +cumulus-pallet-session-benchmarking = { default-features = false, version = "6.0.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.4.0" } +cumulus-pallet-xcmp-queue = { default-features = false , version = "0.4.0" } +cumulus-primitives-core = { default-features = false , version = "0.4.0" } +cumulus-primitives-utility = { default-features = false , version = "0.4.0" } +pallet-collator-selection = { default-features = false , version = "6.0.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.4.0" } +parachains-common = { default-features = false , version = "4.0.0" } +assets-common = { default-features = false , version = "0.4.0" } [dev-dependencies] -asset-test-utils = { version = "3.0.0" } +asset-test-utils = { version = "4.0.0" } [build-dependencies] -substrate-wasm-builder = { optional = true , version = "13.0.0" } +substrate-wasm-builder = { optional = true , version = "14.0.0" } [features] default = [ "std" ] @@ -103,6 +104,7 @@ runtime-benchmarks = [ "cumulus-pallet-parachain-system/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", + "cumulus-primitives-utility/runtime-benchmarks", "frame-benchmarking/runtime-benchmarks", "frame-support/runtime-benchmarks", "frame-system-benchmarking/runtime-benchmarks", @@ -210,6 +212,7 @@ std = [ "sp-block-builder/std", "sp-consensus-aura/std", "sp-core/std", + "sp-genesis-builder/std", "sp-inherents/std", "sp-offchain/std", "sp-runtime/std", diff --git a/system-parachains/asset-hubs/asset-hub-kusama/src/lib.rs b/system-parachains/asset-hubs/asset-hub-kusama/src/lib.rs index 7d2fafbafa..1d03f75a01 100644 --- a/system-parachains/asset-hubs/asset-hub-kusama/src/lib.rs +++ b/system-parachains/asset-hubs/asset-hub-kusama/src/lib.rs @@ -52,6 +52,7 @@ use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ construct_runtime, dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, ord_parameter_types, parameter_types, traits::{ AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU32, ConstU64, ConstU8, EitherOfDiverse, @@ -87,7 +88,7 @@ pub use sp_runtime::BuildStorage; // Polkadot imports use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm::latest::BodyId; +use xcm::prelude::*; use xcm_executor::XcmExecutor; use crate::xcm_config::{ @@ -222,6 +223,7 @@ impl pallet_balances::Config for Runtime { type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; type FreezeIdentifier = (); // We allow each account to have holds on it from: // - `NftFractionalization`: 1 @@ -630,8 +632,26 @@ impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { // Fellows pluralistic body. pub const FellowsBodyId: BodyId = BodyId::Technical; + /// The asset ID for the asset that we use to pay for message delivery fees. + pub FeeAssetId: AssetId = Concrete(xcm_config::KsmLocation::get()); + /// The base fee for the message delivery fees. + pub const ToSiblingBaseDeliveryFee: u128 = CENTS.saturating_mul(3); + pub const ToParentBaseDeliveryFee: u128 = CENTS.saturating_mul(3); } +pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + ToSiblingBaseDeliveryFee, + TransactionByteFee, + XcmpQueue, +>; +pub type PriceForParentDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + ToParentBaseDeliveryFee, + TransactionByteFee, + ParachainSystem, +>; + impl cumulus_pallet_xcmp_queue::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; @@ -644,7 +664,7 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { >; type ControllerOriginConverter = xcm_config::XcmOriginToTransactDispatchOrigin; type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = (); + type PriceForSiblingDelivery = PriceForSiblingParachainDelivery; } impl cumulus_pallet_dmp_queue::Config for Runtime { @@ -1177,6 +1197,16 @@ impl_runtime_apis! { } } + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { @@ -1253,9 +1283,21 @@ impl_runtime_apis! { use xcm_config::{KsmLocation, MaxAssetsIntoHolding}; use pallet_xcm_benchmarks::asset_instance_from; + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + KsmLocation::get(), + ExistentialDeposit::get() + ).into()); + } + impl pallet_xcm_benchmarks::Config for Runtime { type XcmConfig = xcm_config::XcmConfig; type AccountIdConverter = xcm_config::LocationToAccountId; + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositMultiAsset, + PriceForParentDelivery, + >; fn valid_destination() -> Result { Ok(KsmLocation::get()) } @@ -1311,6 +1353,7 @@ impl_runtime_apis! { } impl pallet_xcm_benchmarks::generic::Config for Runtime { + type TransactAsset = Balances; type RuntimeCall = RuntimeCall; fn worst_case_response() -> (u64, Response) { diff --git a/system-parachains/asset-hubs/asset-hub-kusama/src/weights/xcm/mod.rs b/system-parachains/asset-hubs/asset-hub-kusama/src/weights/xcm/mod.rs index 9aff4902d1..ce6e920651 100644 --- a/system-parachains/asset-hubs/asset-hub-kusama/src/weights/xcm/mod.rs +++ b/system-parachains/asset-hubs/asset-hub-kusama/src/weights/xcm/mod.rs @@ -61,16 +61,8 @@ impl XcmWeightInfo for AssetHubKusamaXcmWeight { fn withdraw_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) } - // Currently there is no trusted reserve (`IsReserve = ()`), - // but we need this hack for `pallet_xcm::reserve_transfer_assets` - // (TODO) fix https://github.com/paritytech/polkadot/pull/7424 - // (TODO) fix https://github.com/paritytech/polkadot/pull/7546 - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { - // TODO: if we change `IsReserve = ...` then use this line... - // TODO: or if remote weight estimation is fixed, then remove - // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - hardcoded_weight.min(XcmFungibleWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) @@ -127,10 +119,7 @@ impl XcmWeightInfo for AssetHubKusamaXcmWeight { } fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); - hardcoded_weight.min(weight) + assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) } fn deposit_reserve_asset( assets: &MultiAssetFilter, diff --git a/system-parachains/asset-hubs/asset-hub-kusama/src/xcm_config.rs b/system-parachains/asset-hubs/asset-hub-kusama/src/xcm_config.rs index 0c197598f8..13fb5bdd8c 100644 --- a/system-parachains/asset-hubs/asset-hub-kusama/src/xcm_config.rs +++ b/system-parachains/asset-hubs/asset-hub-kusama/src/xcm_config.rs @@ -15,35 +15,42 @@ use super::{ AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, PoolAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + ParachainSystem, PolkadotXcm, PoolAssets, PriceForParentDelivery, Runtime, RuntimeCall, + RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use crate::ForeignAssets; use assets_common::{ local_and_foreign_assets::MatchesLocalAndForeignAssetsMultiLocation, - matching::{ - FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, - }, + matching::{FromSiblingParachain, IsForeignConcreteAsset}, }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, + traits::{ConstU32, Contains, Equals, Everything, Nothing, PalletInfoAccess}, }; use frame_system::EnsureRoot; +use kusama_runtime_constants::system_parachain; use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ + AssetFeeAsExistentialDepositMultiplier, ConcreteAssetFromSystem, + RelayOrOtherSystemParachains, + }, + TREASURY_PALLET_ID, +}; use polkadot_parachain_primitives::primitives::Sibling; -use sp_runtime::traits::ConvertInto; +use sp_runtime::traits::{AccountIdConversion, ConvertInto}; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal, DescribeFamily, - EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NativeAsset, - NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NoChecking, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + SovereignSignedViaLocation, StartsWith, StartsWithExplicitGlobalConsensus, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeesToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -66,6 +73,8 @@ parameter_types! { pub CheckingAccount: AccountId = PolkadotXcm::check_account(); pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); pub const FellowshipLocation: MultiLocation = MultiLocation::parent(); + pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(kusama_runtime_constants::TREASURY_PALLET_ID)).into(); + pub TreasuryAccount: Option = Some(TREASURY_PALLET_ID.into_account_truncating()); } /// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used @@ -451,8 +460,12 @@ pub type Barrier = TrailingSetTopicAsId< // If the message is one that immediately attemps to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, + // Parent, its pluralities (i.e. governance bodies) and parent's treasury + // pallet get free execution. + AllowExplicitUnpaidExecutionFrom<( + ParentOrParentsPlurality, + Equals, + )>, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, ), @@ -470,6 +483,33 @@ pub type AssetFeeAsExistentialDepositMultiplierFeeCharger = AssetFeeAsExistentia TrustBackedAssetsInstance, >; +match_types! { + pub type SystemParachains: impl Contains = { + MultiLocation { + parents: 1, + interior: X1(Parachain( + system_parachain::ENCOINTER_ID | + system_parachain::BRIDGE_HUB_ID + )), + } + }; +} + +/// Locations that will not be charged fees in the executor, +/// either execution or delivery. +/// We only waive fees for system functions, which these locations represent. +pub type WaivedLocations = + (RelayOrOtherSystemParachains, Equals); + +/// Cases where a remote origin is accepted as trusted Teleporter for a given asset: +/// +/// - KSM with the parent Relay Chain and sibling system parachains; and +/// - Sibling parachains' assets from where they originate (as `ForeignCreators`). +pub type TrustedTeleporters = ( + ConcreteAssetFromSystem, + IsForeignConcreteAsset>>, +); + pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; @@ -480,13 +520,7 @@ impl xcm_executor::Config for XcmConfig { // Asset Hub acting _as_ a reserve location for KSM and assets created under `pallet-assets`. // For KSM, users must use teleport where allowed (e.g. with the Relay Chain). type IsReserve = (); - // We allow: - // - teleportation of KSM - // - teleportation of sibling parachain's assets (as ForeignCreators) - type IsTeleporter = ( - NativeAsset, - IsForeignConcreteAsset>>, - ); + type IsTeleporter = TrustedTeleporters; type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< @@ -516,7 +550,7 @@ impl xcm_executor::Config for XcmConfig { type MaxAssetsIntoHolding = MaxAssetsIntoHolding; type AssetLocker = (); type AssetExchanger = (); - type FeeManager = (); + type FeeManager = XcmFeesToAccount; type MessageExporter = (); type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; @@ -532,7 +566,7 @@ pub type LocalOriginToLocation = SignedToAccountId32, + cumulus_primitives_utility::ParentAsUmp, // ..and XCMP to communicate with the sibling chains. XcmpQueue, )>; diff --git a/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml b/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml index 7e218ca8ee..a3125308b7 100644 --- a/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml +++ b/system-parachains/asset-hubs/asset-hub-polkadot/Cargo.toml @@ -16,73 +16,74 @@ scale-info = { version = "2.9.0", default-features = false, features = ["derive" smallvec = "1.11.0" # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-executive = { default-features = false, version = "24.0.0" } -frame-support = { default-features = false, version = "24.0.0" } -frame-system = { default-features = false, version = "24.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } -pallet-asset-tx-payment = { default-features = false , version = "24.0.0" } -pallet-assets = { default-features = false, version = "25.0.0" } -pallet-aura = { default-features = false, version = "23.0.0" } -pallet-authorship = { default-features = false, version = "24.0.0" } -pallet-balances = { default-features = false, version = "24.0.0" } -pallet-multisig = { default-features = false, version = "24.0.0" } -pallet-nfts = { default-features = false, version = "18.0.0" } -pallet-nfts-runtime-api = { default-features = false, version = "10.0.0" } -pallet-proxy = { default-features = false, version = "24.0.0" } -pallet-session = { default-features = false, version = "24.0.0" } -pallet-timestamp = { default-features = false, version = "23.0.0" } -pallet-transaction-payment = { default-features = false, version = "24.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "24.0.0" } -pallet-uniques = { default-features = false, version = "24.0.0" } -pallet-utility = { default-features = false, version = "24.0.0" } -sp-api = { default-features = false, version = "22.0.0" } -sp-block-builder = { default-features = false, version = "22.0.0" } -sp-consensus-aura = { default-features = false, version = "0.28.0" } -sp-core = { default-features = false, version = "24.0.0" } -sp-inherents = { default-features = false, version = "22.0.0" } -sp-offchain = { default-features = false, version = "22.0.0" } -sp-runtime = { default-features = false, version = "27.0.0" } -sp-session = { default-features = false, version = "23.0.0" } -sp-std = { default-features = false, version = "11.0.0" } -sp-storage = { default-features = false, version = "16.0.0" } -sp-transaction-pool = { default-features = false, version = "22.0.0" } -sp-version = { default-features = false, version = "25.0.0" } -sp-weights = { default-features = false, version = "23.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-executive = { default-features = false, version = "25.0.0" } +frame-support = { default-features = false, version = "25.0.0" } +frame-system = { default-features = false, version = "25.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "23.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.31.0" } +pallet-asset-tx-payment = { default-features = false , version = "25.0.0" } +pallet-assets = { default-features = false, version = "26.0.0" } +pallet-aura = { default-features = false, version = "24.0.0" } +pallet-authorship = { default-features = false, version = "25.0.0" } +pallet-balances = { default-features = false, version = "25.0.0" } +pallet-multisig = { default-features = false, version = "25.0.0" } +pallet-nfts = { default-features = false, version = "19.0.0" } +pallet-nfts-runtime-api = { default-features = false, version = "11.0.0" } +pallet-proxy = { default-features = false, version = "25.0.0" } +pallet-session = { default-features = false, version = "25.0.0" } +pallet-timestamp = { default-features = false, version = "24.0.0" } +pallet-transaction-payment = { default-features = false, version = "25.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "25.0.0" } +pallet-uniques = { default-features = false, version = "25.0.0" } +pallet-utility = { default-features = false, version = "25.0.0" } +sp-api = { default-features = false, version = "23.0.0" } +sp-block-builder = { default-features = false, version = "23.0.0" } +sp-consensus-aura = { default-features = false, version = "0.29.0" } +sp-core = { default-features = false, version = "25.0.0" } +sp-genesis-builder = { default-features = false , version = "0.4.0" } +sp-inherents = { default-features = false, version = "23.0.0" } +sp-offchain = { default-features = false, version = "23.0.0" } +sp-runtime = { default-features = false, version = "28.0.0" } +sp-session = { default-features = false, version = "24.0.0" } +sp-std = { default-features = false, version = "12.0.0" } +sp-storage = { default-features = false, version = "17.0.0" } +sp-transaction-pool = { default-features = false, version = "23.0.0" } +sp-version = { default-features = false, version = "26.0.0" } +sp-weights = { default-features = false, version = "24.0.0" } # Polkadot -pallet-xcm = { default-features = false, version = "3.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } -polkadot-core-primitives = { default-features = false, version = "3.0.0" } -polkadot-parachain-primitives = { default-features = false, version = "2.0.0" } -polkadot-runtime-common = { default-features = false, version = "3.0.0" } +pallet-xcm = { default-features = false, version = "4.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "4.0.0" } +polkadot-core-primitives = { default-features = false, version = "4.0.0" } +polkadot-parachain-primitives = { default-features = false, version = "3.0.0" } +polkadot-runtime-common = { default-features = false, version = "4.0.0" } polkadot-runtime-constants = { path = "../../../relay/polkadot/constants", default-features = false} -xcm = { package = "staging-xcm", default-features = false, version = "3.0.0" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "4.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "4.0.0" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "4.0.0" } # Cumulus -cumulus-pallet-aura-ext = { default-features = false , version = "0.3.0" } -cumulus-pallet-dmp-queue = { default-features = false , version = "0.3.0" } -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } -cumulus-pallet-session-benchmarking = { default-features = false, version = "5.0.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } -cumulus-pallet-xcmp-queue = { default-features = false , version = "0.3.0" } -cumulus-primitives-core = { default-features = false , version = "0.3.0" } -cumulus-primitives-utility = { default-features = false , version = "0.3.0" } -pallet-collator-selection = { default-features = false , version = "5.0.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } -parachains-common = { default-features = false , version = "3.0.0" } -assets-common = { default-features = false , version = "0.3.0" } +cumulus-pallet-aura-ext = { default-features = false , version = "0.4.0" } +cumulus-pallet-dmp-queue = { default-features = false , version = "0.4.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.4.0" } +cumulus-pallet-session-benchmarking = { default-features = false, version = "6.0.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.4.0" } +cumulus-pallet-xcmp-queue = { default-features = false , version = "0.4.0" } +cumulus-primitives-core = { default-features = false , version = "0.4.0" } +cumulus-primitives-utility = { default-features = false , version = "0.4.0" } +pallet-collator-selection = { default-features = false , version = "6.0.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.4.0" } +parachains-common = { default-features = false , version = "4.0.0" } +assets-common = { default-features = false , version = "0.4.0" } [dev-dependencies] hex-literal = "0.4.1" -asset-test-utils = { version = "3.0.0" } +asset-test-utils = { version = "4.0.0" } [build-dependencies] -substrate-wasm-builder = { optional = true , version = "13.0.0" } +substrate-wasm-builder = { optional = true , version = "14.0.0" } [features] default = [ "std" ] @@ -91,6 +92,7 @@ runtime-benchmarks = [ "cumulus-pallet-parachain-system/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", + "cumulus-primitives-utility/runtime-benchmarks", "frame-benchmarking/runtime-benchmarks", "frame-support/runtime-benchmarks", "frame-system-benchmarking/runtime-benchmarks", @@ -191,6 +193,7 @@ std = [ "sp-block-builder/std", "sp-consensus-aura/std", "sp-core/std", + "sp-genesis-builder/std", "sp-inherents/std", "sp-offchain/std", "sp-runtime/std", diff --git a/system-parachains/asset-hubs/asset-hub-polkadot/src/lib.rs b/system-parachains/asset-hubs/asset-hub-polkadot/src/lib.rs index 2498ce7cc4..2c62e27069 100644 --- a/system-parachains/asset-hubs/asset-hub-polkadot/src/lib.rs +++ b/system-parachains/asset-hubs/asset-hub-polkadot/src/lib.rs @@ -84,6 +84,7 @@ use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ construct_runtime, dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, parameter_types, traits::{ AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, @@ -117,7 +118,7 @@ pub use sp_runtime::BuildStorage; // Polkadot imports use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm::latest::BodyId; +use xcm::prelude::*; use xcm_executor::XcmExecutor; use crate::xcm_config::ForeignCreatorsSovereignAccountOf; @@ -232,6 +233,7 @@ impl pallet_balances::Config for Runtime { type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; @@ -566,8 +568,26 @@ impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { // Fellows pluralistic body. pub const FellowsBodyId: BodyId = BodyId::Technical; + /// The asset ID for the asset that we use to pay for message delivery fees. + pub FeeAssetId: AssetId = Concrete(xcm_config::DotLocation::get()); + /// The base fee for the message delivery fees. + pub const ToSiblingBaseDeliveryFee: u128 = CENTS.saturating_mul(3); + pub const ToParentBaseDeliveryFee: u128 = CENTS.saturating_mul(3); } +pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + ToSiblingBaseDeliveryFee, + TransactionByteFee, + XcmpQueue, +>; +pub type PriceForParentDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + ToParentBaseDeliveryFee, + TransactionByteFee, + ParachainSystem, +>; + impl cumulus_pallet_xcmp_queue::Config for Runtime { type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; type RuntimeEvent = RuntimeEvent; @@ -580,7 +600,7 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { EnsureXcm>, >; type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type PriceForSiblingDelivery = (); + type PriceForSiblingDelivery = PriceForSiblingParachainDelivery; } impl cumulus_pallet_dmp_queue::Config for Runtime { @@ -834,6 +854,11 @@ impl frame_support::traits::OnRuntimeUpgrade for InitStorageVersions { writes.saturating_inc(); } + if Uniques::on_chain_storage_version() == StorageVersion::new(0) { + Uniques::current_storage_version().put::(); + writes.saturating_inc(); + } + ::DbWeight::get().reads_writes(4, writes) } } @@ -1054,6 +1079,16 @@ impl_runtime_apis! { } } + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { @@ -1129,9 +1164,21 @@ impl_runtime_apis! { use xcm_config::{DotLocation, MaxAssetsIntoHolding}; use pallet_xcm_benchmarks::asset_instance_from; + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + DotLocation::get(), + ExistentialDeposit::get() + ).into()); + } + impl pallet_xcm_benchmarks::Config for Runtime { type XcmConfig = xcm_config::XcmConfig; type AccountIdConverter = xcm_config::LocationToAccountId; + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositMultiAsset, + PriceForParentDelivery, + >; fn valid_destination() -> Result { Ok(DotLocation::get()) } @@ -1187,6 +1234,7 @@ impl_runtime_apis! { } impl pallet_xcm_benchmarks::generic::Config for Runtime { + type TransactAsset = Balances; type RuntimeCall = RuntimeCall; fn worst_case_response() -> (u64, Response) { diff --git a/system-parachains/asset-hubs/asset-hub-polkadot/src/weights/xcm/mod.rs b/system-parachains/asset-hubs/asset-hub-polkadot/src/weights/xcm/mod.rs index 55fed809e2..eb140c4bf3 100644 --- a/system-parachains/asset-hubs/asset-hub-polkadot/src/weights/xcm/mod.rs +++ b/system-parachains/asset-hubs/asset-hub-polkadot/src/weights/xcm/mod.rs @@ -61,16 +61,8 @@ impl XcmWeightInfo for AssetHubPolkadotXcmWeight { fn withdraw_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) } - // Currently there is no trusted reserve (`IsReserve = ()`), - // but we need this hack for `pallet_xcm::reserve_transfer_assets` - // (TODO) fix https://github.com/paritytech/polkadot/pull/7424 - // (TODO) fix https://github.com/paritytech/polkadot/pull/7546 - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { - // TODO: if we change `IsReserve = ...` then use this line... - // TODO: or if remote weight estimation is fixed, then remove - // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - hardcoded_weight.min(XcmFungibleWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) @@ -127,10 +119,7 @@ impl XcmWeightInfo for AssetHubPolkadotXcmWeight { } fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); - hardcoded_weight.min(weight) + assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) } fn deposit_reserve_asset( assets: &MultiAssetFilter, diff --git a/system-parachains/asset-hubs/asset-hub-polkadot/src/xcm_config.rs b/system-parachains/asset-hubs/asset-hub-polkadot/src/xcm_config.rs index d59507e4bd..664a2df5fd 100644 --- a/system-parachains/asset-hubs/asset-hub-polkadot/src/xcm_config.rs +++ b/system-parachains/asset-hubs/asset-hub-polkadot/src/xcm_config.rs @@ -15,31 +15,38 @@ use super::{ AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ForeignAssets, - ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - TrustBackedAssetsInstance, WeightToFee, XcmpQueue, -}; -use assets_common::matching::{ - FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, + ParachainInfo, ParachainSystem, PolkadotXcm, PriceForParentDelivery, Runtime, RuntimeCall, + RuntimeEvent, RuntimeOrigin, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; +use assets_common::matching::{FromSiblingParachain, IsForeignConcreteAsset}; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, + traits::{ConstU32, Contains, Equals, Everything, Nothing, PalletInfoAccess}, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ + AssetFeeAsExistentialDepositMultiplier, ConcreteAssetFromSystem, + RelayOrOtherSystemParachains, + }, + TREASURY_PALLET_ID, +}; use polkadot_parachain_primitives::primitives::Sibling; -use sp_runtime::traits::ConvertInto; +use polkadot_runtime_constants::system_parachain; +use sp_runtime::traits::{AccountIdConversion, ConvertInto}; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, DescribeFamily, DescribePalletTerminal, - EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NativeAsset, - NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NoChecking, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + SovereignSignedViaLocation, StartsWith, StartsWithExplicitGlobalConsensus, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeesToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -55,6 +62,8 @@ parameter_types! { pub CheckingAccount: AccountId = PolkadotXcm::check_account(); pub FellowshipLocation: MultiLocation = MultiLocation::new(1, Parachain(1001)); pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); + pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(polkadot_runtime_constants::TREASURY_PALLET_ID)).into(); + pub TreasuryAccount: Option = Some(TREASURY_PALLET_ID.into_account_truncating()); } /// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used @@ -366,12 +375,12 @@ pub type Barrier = TrailingSetTopicAsId< // If the message is one that immediately attemps to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, - // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality - // get free execution. + // The locations listed below get free execution. AllowExplicitUnpaidExecutionFrom<( ParentOrParentsPlurality, FellowsPlurality, FellowshipSalaryPallet, + Equals, )>, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, @@ -390,6 +399,33 @@ pub type AssetFeeAsExistentialDepositMultiplierFeeCharger = AssetFeeAsExistentia TrustBackedAssetsInstance, >; +match_types! { + pub type SystemParachains: impl Contains = { + MultiLocation { + parents: 1, + interior: X1(Parachain( + system_parachain::COLLECTIVES_ID | + system_parachain::BRIDGE_HUB_ID + )), + } + }; +} + +/// Locations that will not be charged fees in the executor, +/// either execution or delivery. +/// We only waive fees for system functions, which these locations represent. +pub type WaivedLocations = + (RelayOrOtherSystemParachains, Equals); + +/// Cases where a remote origin is accepted as trusted Teleporter for a given asset: +/// +/// - DOT with the parent Relay Chain and sibling system parachains; and +/// - Sibling parachains' assets from where they originate (as `ForeignCreators`). +pub type TrustedTeleporters = ( + ConcreteAssetFromSystem, + IsForeignConcreteAsset>>, +); + pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; @@ -400,13 +436,7 @@ impl xcm_executor::Config for XcmConfig { // Asset Hub acting _as_ a reserve location for DOT and assets created under `pallet-assets`. // For DOT, users must use teleport where allowed (e.g. with the Relay Chain). type IsReserve = (); - // We allow: - // - teleportation of DOT - // - teleportation of sibling parachain's assets (as ForeignCreators) - type IsTeleporter = ( - NativeAsset, - IsForeignConcreteAsset>>, - ); + type IsTeleporter = TrustedTeleporters; type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< @@ -436,7 +466,7 @@ impl xcm_executor::Config for XcmConfig { type MaxAssetsIntoHolding = MaxAssetsIntoHolding; type AssetLocker = (); type AssetExchanger = (); - type FeeManager = (); + type FeeManager = XcmFeesToAccount; type MessageExporter = (); type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; @@ -452,7 +482,7 @@ pub type LocalOriginToLocation = SignedToAccountId32, + cumulus_primitives_utility::ParentAsUmp, // ..and XCMP to communicate with the sibling chains. XcmpQueue, )>; diff --git a/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml b/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml index 5f608342a1..ed7d2bf1f1 100644 --- a/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ b/system-parachains/bridge-hubs/bridge-hub-kusama/Cargo.toml @@ -9,7 +9,7 @@ repository.workspace = true version.workspace = true [build-dependencies] -substrate-wasm-builder = { optional = true , version = "13.0.0" } +substrate-wasm-builder = { optional = true , version = "14.0.0" } [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } @@ -20,62 +20,63 @@ serde = { version = "1.0.188", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-executive = { default-features = false, version = "24.0.0" } -frame-support = { default-features = false, version = "24.0.0" } -frame-system = { default-features = false, version = "24.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } -pallet-aura = { default-features = false, version = "23.0.0" } -pallet-authorship = { default-features = false, version = "24.0.0" } -pallet-balances = { default-features = false, version = "24.0.0" } -pallet-multisig = { default-features = false, version = "24.0.0" } -pallet-session = { default-features = false, version = "24.0.0" } -pallet-timestamp = { default-features = false, version = "23.0.0" } -pallet-transaction-payment = { default-features = false, version = "24.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "24.0.0" } -pallet-utility = { default-features = false, version = "24.0.0" } -sp-api = { default-features = false, version = "22.0.0" } -sp-block-builder = { default-features = false, version = "22.0.0" } -sp-consensus-aura = { default-features = false, version = "0.28.0" } -sp-core = { default-features = false, version = "24.0.0" } -sp-inherents = { default-features = false, version = "22.0.0" } -sp-io = { default-features = false, version = "26.0.0" } -sp-offchain = { default-features = false, version = "22.0.0" } -sp-runtime = { default-features = false, version = "27.0.0" } -sp-session = { default-features = false, version = "23.0.0" } -sp-std = { default-features = false, version = "11.0.0" } -sp-storage = { default-features = false, version = "16.0.0" } -sp-transaction-pool = { default-features = false, version = "22.0.0" } -sp-version = { default-features = false, version = "25.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-executive = { default-features = false, version = "25.0.0" } +frame-support = { default-features = false, version = "25.0.0" } +frame-system = { default-features = false, version = "25.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "23.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.31.0" } +pallet-aura = { default-features = false, version = "24.0.0" } +pallet-authorship = { default-features = false, version = "25.0.0" } +pallet-balances = { default-features = false, version = "25.0.0" } +pallet-multisig = { default-features = false, version = "25.0.0" } +pallet-session = { default-features = false, version = "25.0.0" } +pallet-timestamp = { default-features = false, version = "24.0.0" } +pallet-transaction-payment = { default-features = false, version = "25.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "25.0.0" } +pallet-utility = { default-features = false, version = "25.0.0" } +sp-api = { default-features = false, version = "23.0.0" } +sp-block-builder = { default-features = false, version = "23.0.0" } +sp-consensus-aura = { default-features = false, version = "0.29.0" } +sp-core = { default-features = false, version = "25.0.0" } +sp-genesis-builder = { default-features = false , version = "0.4.0" } +sp-inherents = { default-features = false, version = "23.0.0" } +sp-io = { default-features = false, version = "27.0.0" } +sp-offchain = { default-features = false, version = "23.0.0" } +sp-runtime = { default-features = false, version = "28.0.0" } +sp-session = { default-features = false, version = "24.0.0" } +sp-std = { default-features = false, version = "12.0.0" } +sp-storage = { default-features = false, version = "17.0.0" } +sp-transaction-pool = { default-features = false, version = "23.0.0" } +sp-version = { default-features = false, version = "26.0.0" } # Polkadot kusama-runtime-constants = { path = "../../../relay/kusama/constants", default-features = false} -pallet-xcm = { default-features = false, version = "3.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } -polkadot-core-primitives = { default-features = false, version = "3.0.0" } -polkadot-parachain-primitives = { default-features = false, version = "2.0.0" } -polkadot-runtime-common = { default-features = false, version = "3.0.0" } -xcm = { package = "staging-xcm", default-features = false, version = "3.0.1" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } +pallet-xcm = { default-features = false, version = "4.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "4.0.0" } +polkadot-core-primitives = { default-features = false, version = "4.0.0" } +polkadot-parachain-primitives = { default-features = false, version = "3.0.0" } +polkadot-runtime-common = { default-features = false, version = "4.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "4.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "4.0.0" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "4.0.0" } # Cumulus -cumulus-pallet-aura-ext = { default-features = false , version = "0.3.0" } -cumulus-pallet-dmp-queue = { default-features = false , version = "0.3.0" } -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } -cumulus-pallet-session-benchmarking = { default-features = false, version = "5.0.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } -cumulus-pallet-xcmp-queue = { default-features = false , version = "0.3.0" } -cumulus-primitives-core = { default-features = false , version = "0.3.0" } -cumulus-primitives-utility = { default-features = false , version = "0.3.0" } -pallet-collator-selection = { default-features = false , version = "5.0.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } -parachains-common = { default-features = false , version = "3.0.0" } +cumulus-pallet-aura-ext = { default-features = false , version = "0.4.0" } +cumulus-pallet-dmp-queue = { default-features = false , version = "0.4.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.4.0" } +cumulus-pallet-session-benchmarking = { default-features = false, version = "6.0.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.4.0" } +cumulus-pallet-xcmp-queue = { default-features = false , version = "0.4.0" } +cumulus-primitives-core = { default-features = false , version = "0.4.0" } +cumulus-primitives-utility = { default-features = false , version = "0.4.0" } +pallet-collator-selection = { default-features = false , version = "6.0.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.4.0" } +parachains-common = { default-features = false , version = "4.0.0" } [dev-dependencies] -bridge-hub-test-utils = { version = "0.3.0" } +bridge-hub-test-utils = { version = "0.4.0" } [features] default = [ "std" ] @@ -121,6 +122,7 @@ std = [ "sp-block-builder/std", "sp-consensus-aura/std", "sp-core/std", + "sp-genesis-builder/std", "sp-inherents/std", "sp-io/std", "sp-offchain/std", @@ -140,6 +142,7 @@ runtime-benchmarks = [ "cumulus-pallet-parachain-system/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", + "cumulus-primitives-utility/runtime-benchmarks", "frame-benchmarking/runtime-benchmarks", "frame-support/runtime-benchmarks", "frame-system-benchmarking/runtime-benchmarks", diff --git a/system-parachains/bridge-hubs/bridge-hub-kusama/src/lib.rs b/system-parachains/bridge-hubs/bridge-hub-kusama/src/lib.rs index 206f306843..f0d5f8a3cb 100644 --- a/system-parachains/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ b/system-parachains/bridge-hubs/bridge-hub-kusama/src/lib.rs @@ -43,6 +43,7 @@ use sp_version::RuntimeVersion; use frame_support::{ construct_runtime, dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, parameter_types, traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, weights::{ConstantMultiplier, Weight}, @@ -74,7 +75,7 @@ use parachains_common::{ }; // XCM Imports -use xcm::latest::prelude::BodyId; +use xcm::prelude::*; use xcm_executor::XcmExecutor; /// The address format for describing accounts. @@ -271,6 +272,7 @@ impl pallet_balances::Config for Runtime { type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; @@ -321,6 +323,11 @@ impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { // Fellows pluralistic body. pub const FellowsBodyId: BodyId = BodyId::Technical; + /// The asset ID for the asset that we use to pay for message delivery fees. + pub FeeAssetId: AssetId = Concrete(xcm_config::KsmRelayLocation::get()); + /// The base fee for the message delivery fees. + pub const ToSiblingBaseDeliveryFee: u128 = CENTS.saturating_mul(3); + pub const ToParentBaseDeliveryFee: u128 = CENTS.saturating_mul(3); } /// Privileged origin that represents Root or Fellows pluralistic body. @@ -329,6 +336,19 @@ pub type RootOrFellows = EitherOfDiverse< EnsureXcm>, >; +pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + ToSiblingBaseDeliveryFee, + TransactionByteFee, + XcmpQueue, +>; +pub type PriceForParentDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + ToParentBaseDeliveryFee, + TransactionByteFee, + ParachainSystem, +>; + impl cumulus_pallet_xcmp_queue::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; @@ -338,7 +358,7 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOrigin = RootOrFellows; type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = (); + type PriceForSiblingDelivery = PriceForSiblingParachainDelivery; } impl cumulus_pallet_dmp_queue::Config for Runtime { @@ -628,6 +648,16 @@ impl_runtime_apis! { } } + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { @@ -695,9 +725,21 @@ impl_runtime_apis! { use xcm::latest::prelude::*; use xcm_config::KsmRelayLocation; + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + KsmRelayLocation::get(), + ExistentialDeposit::get() + ).into()); + } + impl pallet_xcm_benchmarks::Config for Runtime { type XcmConfig = xcm_config::XcmConfig; type AccountIdConverter = xcm_config::LocationToAccountId; + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositMultiAsset, + PriceForParentDelivery, + >; fn valid_destination() -> Result { Ok(KsmRelayLocation::get()) } @@ -738,6 +780,7 @@ impl_runtime_apis! { } impl pallet_xcm_benchmarks::generic::Config for Runtime { + type TransactAsset = Balances; type RuntimeCall = RuntimeCall; fn worst_case_response() -> (u64, Response) { diff --git a/system-parachains/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs b/system-parachains/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs index 0e740922f3..ded5dc6702 100644 --- a/system-parachains/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs +++ b/system-parachains/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs @@ -61,16 +61,8 @@ impl XcmWeightInfo for BridgeHubKusamaXcmWeight { fn withdraw_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) } - // Currently there is no trusted reserve (`IsReserve = ()`), - // but we need this hack for `pallet_xcm::reserve_transfer_assets` - // (TODO) fix https://github.com/paritytech/polkadot/pull/7424 - // (TODO) fix https://github.com/paritytech/polkadot/pull/7546 - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { - // TODO: if we change `IsReserve = ...` then use this line... - // TODO: or if remote weight estimation is fixed, then remove - // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - hardcoded_weight.min(XcmFungibleWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) @@ -127,10 +119,7 @@ impl XcmWeightInfo for BridgeHubKusamaXcmWeight { } fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); - hardcoded_weight.min(weight) + assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) } fn deposit_reserve_asset( assets: &MultiAssetFilter, diff --git a/system-parachains/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs b/system-parachains/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs index 696462be9c..3a1ac9c8b1 100644 --- a/system-parachains/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs +++ b/system-parachains/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs @@ -16,16 +16,23 @@ use super::{ AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, + PriceForParentDelivery, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, + XcmpQueue, }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing}, + traits::{ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; +use kusama_runtime_constants::system_parachain; use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ConcreteAssetFromSystem, RelayOrOtherSystemParachains}, + TREASURY_PALLET_ID, +}; use polkadot_parachain_primitives::primitives::Sibling; +use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, @@ -34,6 +41,7 @@ use xcm_builder::{ ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeesToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -47,6 +55,8 @@ parameter_types! { pub const MaxAssetsIntoHolding: u32 = 64; pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); pub const FellowshipLocation: MultiLocation = MultiLocation::parent(); + pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(kusama_runtime_constants::TREASURY_PALLET_ID)).into(); + pub TreasuryAccount: Option = Some(TREASURY_PALLET_ID.into_account_truncating()); } /// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used @@ -165,8 +175,12 @@ pub type Barrier = TrailingSetTopicAsId< // If the message is one that immediately attemps to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) and relay treasury get + // free execution. + AllowExplicitUnpaidExecutionFrom<( + ParentOrParentsPlurality, + Equals, + )>, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, ), @@ -177,6 +191,28 @@ pub type Barrier = TrailingSetTopicAsId< >, >; +match_types! { + pub type SystemParachains: impl Contains = { + MultiLocation { + parents: 1, + interior: X1(Parachain( + system_parachain::ASSET_HUB_ID | + system_parachain::ENCOINTER_ID + )), + } + }; +} + +/// Locations that will not be charged fees in the executor, +/// either execution or delivery. +/// We only waive fees for system functions, which these locations represent. +pub type WaivedLocations = + (RelayOrOtherSystemParachains, Equals); + +/// Cases where a remote origin is accepted as trusted Teleporter for a given asset: +/// - KSM with the parent Relay Chain and sibling parachains. +pub type TrustedTeleporters = ConcreteAssetFromSystem; + pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; @@ -186,8 +222,7 @@ impl xcm_executor::Config for XcmConfig { // BridgeHub does not recognize a reserve location for any asset. Users must teleport KSM // where allowed (e.g. with the Relay Chain). type IsReserve = (); - /// Only allow teleportation of KSM. - type IsTeleporter = ConcreteNativeAssetFrom; + type IsTeleporter = TrustedTeleporters; type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< @@ -205,7 +240,7 @@ impl xcm_executor::Config for XcmConfig { type MaxAssetsIntoHolding = MaxAssetsIntoHolding; type AssetLocker = (); type AssetExchanger = (); - type FeeManager = (); + type FeeManager = XcmFeesToAccount; type MessageExporter = (); type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; @@ -221,7 +256,7 @@ pub type LocalOriginToLocation = SignedToAccountId32, + cumulus_primitives_utility::ParentAsUmp, // ..and XCMP to communicate with the sibling chains. XcmpQueue, )>; diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml index d0384b967f..2e74c27c78 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/Cargo.toml @@ -9,7 +9,7 @@ repository.workspace = true version.workspace = true [build-dependencies] -substrate-wasm-builder = { optional = true , version = "13.0.0" } +substrate-wasm-builder = { optional = true , version = "14.0.0" } [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } @@ -20,62 +20,63 @@ serde = { version = "1.0.188", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-executive = { default-features = false, version = "24.0.0" } -frame-support = { default-features = false, version = "24.0.0" } -frame-system = { default-features = false, version = "24.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } -pallet-aura = { default-features = false, version = "23.0.0" } -pallet-authorship = { default-features = false, version = "24.0.0" } -pallet-balances = { default-features = false, version = "24.0.0" } -pallet-multisig = { default-features = false, version = "24.0.0" } -pallet-session = { default-features = false, version = "24.0.0" } -pallet-timestamp = { default-features = false, version = "23.0.0" } -pallet-transaction-payment = { default-features = false, version = "24.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "24.0.0" } -pallet-utility = { default-features = false, version = "24.0.0" } -sp-api = { default-features = false, version = "22.0.0" } -sp-block-builder = { default-features = false, version = "22.0.0" } -sp-consensus-aura = { default-features = false, version = "0.28.0" } -sp-core = { default-features = false, version = "24.0.0" } -sp-inherents = { default-features = false, version = "22.0.0" } -sp-io = { default-features = false, version = "26.0.0" } -sp-offchain = { default-features = false, version = "22.0.0" } -sp-runtime = { default-features = false, version = "27.0.0" } -sp-session = { default-features = false, version = "23.0.0" } -sp-std = { default-features = false, version = "11.0.0" } -sp-storage = { default-features = false, version = "16.0.0" } -sp-transaction-pool = { default-features = false, version = "22.0.0" } -sp-version = { default-features = false, version = "25.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-executive = { default-features = false, version = "25.0.0" } +frame-support = { default-features = false, version = "25.0.0" } +frame-system = { default-features = false, version = "25.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "23.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.31.0" } +pallet-aura = { default-features = false, version = "24.0.0" } +pallet-authorship = { default-features = false, version = "25.0.0" } +pallet-balances = { default-features = false, version = "25.0.0" } +pallet-multisig = { default-features = false, version = "25.0.0" } +pallet-session = { default-features = false, version = "25.0.0" } +pallet-timestamp = { default-features = false, version = "24.0.0" } +pallet-transaction-payment = { default-features = false, version = "25.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "25.0.0" } +pallet-utility = { default-features = false, version = "25.0.0" } +sp-api = { default-features = false, version = "23.0.0" } +sp-block-builder = { default-features = false, version = "23.0.0" } +sp-consensus-aura = { default-features = false, version = "0.29.0" } +sp-core = { default-features = false, version = "25.0.0" } +sp-genesis-builder = { default-features = false , version = "0.4.0" } +sp-inherents = { default-features = false, version = "23.0.0" } +sp-io = { default-features = false, version = "27.0.0" } +sp-offchain = { default-features = false, version = "23.0.0" } +sp-runtime = { default-features = false, version = "28.0.0" } +sp-session = { default-features = false, version = "24.0.0" } +sp-std = { default-features = false, version = "12.0.0" } +sp-storage = { default-features = false, version = "17.0.0" } +sp-transaction-pool = { default-features = false, version = "23.0.0" } +sp-version = { default-features = false, version = "26.0.0" } # Polkadot polkadot-runtime-constants = { path = "../../../relay/polkadot/constants", default-features = false} -pallet-xcm = { default-features = false, version = "3.0.0" } -pallet-xcm-benchmarks = { default-features = false, optional = true , version = "3.0.0" } -polkadot-core-primitives = { default-features = false, version = "3.0.0" } -polkadot-parachain-primitives = { default-features = false, version = "2.0.0" } -polkadot-runtime-common = { default-features = false, version = "3.0.0" } -xcm = { package = "staging-xcm", default-features = false, version = "3.0.1" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } +pallet-xcm = { default-features = false, version = "4.0.0" } +pallet-xcm-benchmarks = { default-features = false, optional = true , version = "4.0.0" } +polkadot-core-primitives = { default-features = false, version = "4.0.0" } +polkadot-parachain-primitives = { default-features = false, version = "3.0.0" } +polkadot-runtime-common = { default-features = false, version = "4.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "4.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "4.0.0" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "4.0.0" } # Cumulus -cumulus-pallet-aura-ext = { default-features = false , version = "0.3.0" } -cumulus-pallet-dmp-queue = { default-features = false , version = "0.3.0" } -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } -cumulus-pallet-session-benchmarking = { default-features = false, version = "5.0.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } -cumulus-pallet-xcmp-queue = { default-features = false , version = "0.3.0" } -cumulus-primitives-core = { default-features = false , version = "0.3.0" } -cumulus-primitives-utility = { default-features = false , version = "0.3.0" } -pallet-collator-selection = { default-features = false , version = "5.0.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } -parachains-common = { default-features = false , version = "3.0.0" } +cumulus-pallet-aura-ext = { default-features = false , version = "0.4.0" } +cumulus-pallet-dmp-queue = { default-features = false , version = "0.4.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.4.0" } +cumulus-pallet-session-benchmarking = { default-features = false, version = "6.0.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.4.0" } +cumulus-pallet-xcmp-queue = { default-features = false , version = "0.4.0" } +cumulus-primitives-core = { default-features = false , version = "0.4.0" } +cumulus-primitives-utility = { default-features = false , version = "0.4.0" } +pallet-collator-selection = { default-features = false , version = "6.0.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.4.0" } +parachains-common = { default-features = false , version = "4.0.0" } [dev-dependencies] -bridge-hub-test-utils = { version = "0.3.0" } +bridge-hub-test-utils = { version = "0.4.0" } [features] default = [ "std" ] @@ -121,6 +122,7 @@ std = [ "sp-block-builder/std", "sp-consensus-aura/std", "sp-core/std", + "sp-genesis-builder/std", "sp-inherents/std", "sp-io/std", "sp-offchain/std", @@ -140,6 +142,7 @@ runtime-benchmarks = [ "cumulus-pallet-parachain-system/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", "cumulus-pallet-xcmp-queue/runtime-benchmarks", + "cumulus-primitives-utility/runtime-benchmarks", "frame-benchmarking/runtime-benchmarks", "frame-support/runtime-benchmarks", "frame-system-benchmarking/runtime-benchmarks", diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs index 48d0744ff0..a811d768bd 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -43,6 +43,7 @@ use sp_version::RuntimeVersion; use frame_support::{ construct_runtime, dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, parameter_types, traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, weights::{ConstantMultiplier, Weight}, @@ -74,7 +75,7 @@ use parachains_common::{ HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; // XCM Imports -use xcm::latest::prelude::BodyId; +use xcm::prelude::*; use xcm_executor::XcmExecutor; /// The address format for describing accounts. @@ -246,6 +247,7 @@ impl pallet_balances::Config for Runtime { type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; type FreezeIdentifier = (); type MaxHolds = ConstU32<0>; type MaxFreezes = ConstU32<0>; @@ -296,6 +298,11 @@ impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { // Fellows pluralistic body. pub const FellowsBodyId: BodyId = BodyId::Technical; + /// The asset ID for the asset that we use to pay for message delivery fees. + pub FeeAssetId: AssetId = Concrete(xcm_config::DotRelayLocation::get()); + /// The base fee for the message delivery fees. + pub const ToSiblingBaseDeliveryFee: u128 = CENTS.saturating_mul(3); + pub const ToParentBaseDeliveryFee: u128 = CENTS.saturating_mul(3); } /// Privileged origin that represents Root or Fellows. @@ -304,6 +311,19 @@ pub type RootOrFellows = EitherOfDiverse< EnsureXcm>, >; +pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + ToSiblingBaseDeliveryFee, + TransactionByteFee, + XcmpQueue, +>; +pub type PriceForParentDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + ToParentBaseDeliveryFee, + TransactionByteFee, + ParachainSystem, +>; + impl cumulus_pallet_xcmp_queue::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; @@ -313,7 +333,7 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOrigin = RootOrFellows; type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = (); + type PriceForSiblingDelivery = PriceForSiblingParachainDelivery; } impl cumulus_pallet_dmp_queue::Config for Runtime { @@ -603,6 +623,16 @@ impl_runtime_apis! { } } + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { @@ -670,9 +700,21 @@ impl_runtime_apis! { use xcm::latest::prelude::*; use xcm_config::DotRelayLocation; + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + DotRelayLocation::get(), + ExistentialDeposit::get() + ).into()); + } + impl pallet_xcm_benchmarks::Config for Runtime { type XcmConfig = xcm_config::XcmConfig; type AccountIdConverter = xcm_config::LocationToAccountId; + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositMultiAsset, + PriceForParentDelivery, + >; fn valid_destination() -> Result { Ok(DotRelayLocation::get()) } @@ -713,6 +755,7 @@ impl_runtime_apis! { } impl pallet_xcm_benchmarks::generic::Config for Runtime { + type TransactAsset = Balances; type RuntimeCall = RuntimeCall; fn worst_case_response() -> (u64, Response) { diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs index 4f8c2dec7a..7e9f218427 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs @@ -61,16 +61,8 @@ impl XcmWeightInfo for BridgeHubPolkadotXcmWeight { fn withdraw_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) } - // Currently there is no trusted reserve (`IsReserve = ()`), - // but we need this hack for `pallet_xcm::reserve_transfer_assets` - // (TODO) fix https://github.com/paritytech/polkadot/pull/7424 - // (TODO) fix https://github.com/paritytech/polkadot/pull/7546 - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { - // TODO: if we change `IsReserve = ...` then use this line... - // TODO: or if remote weight estimation is fixed, then remove - // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - hardcoded_weight.min(XcmFungibleWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) } fn receive_teleported_asset(assets: &MultiAssets) -> Weight { assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) @@ -127,10 +119,7 @@ impl XcmWeightInfo for BridgeHubPolkadotXcmWeight { } fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); - hardcoded_weight.min(weight) + assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) } fn deposit_reserve_asset( assets: &MultiAssetFilter, @@ -154,10 +143,7 @@ impl XcmWeightInfo for BridgeHubPolkadotXcmWeight { _dest: &MultiLocation, _xcm: &Xcm<()>, ) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(200_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()); - hardcoded_weight.min(weight) + assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) } fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { XcmGeneric::::report_holding() diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs index 0965600c24..f92b9adbf0 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs @@ -16,16 +16,23 @@ use super::{ AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, + PriceForParentDelivery, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, + XcmpQueue, }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing}, + traits::{ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ConcreteAssetFromSystem, RelayOrOtherSystemParachains}, + TREASURY_PALLET_ID, +}; use polkadot_parachain_primitives::primitives::Sibling; +use polkadot_runtime_constants::system_parachain; +use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, @@ -34,6 +41,7 @@ use xcm_builder::{ ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeesToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -47,6 +55,8 @@ parameter_types! { pub const MaxAssetsIntoHolding: u32 = 64; pub FellowshipLocation: MultiLocation = MultiLocation::new(1, Parachain(1001)); pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); + pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(polkadot_runtime_constants::TREASURY_PALLET_ID)).into(); + pub TreasuryAccount: Option = Some(TREASURY_PALLET_ID.into_account_truncating()); } /// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used @@ -168,9 +178,13 @@ pub type Barrier = TrailingSetTopicAsId< // If the message is one that immediately attemps to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, - // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality - // get free execution. - AllowExplicitUnpaidExecutionFrom<(ParentOrParentsPlurality, FellowsPlurality)>, + // Parent, its pluralities (i.e. governance bodies), Fellows plurality + // and relay treasury get free execution. + AllowExplicitUnpaidExecutionFrom<( + ParentOrParentsPlurality, + FellowsPlurality, + Equals, + )>, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, ), @@ -181,6 +195,28 @@ pub type Barrier = TrailingSetTopicAsId< >, >; +match_types! { + pub type SystemParachains: impl Contains = { + MultiLocation { + parents: 1, + interior: X1(Parachain( + system_parachain::ASSET_HUB_ID | + system_parachain::COLLECTIVES_ID + )), + } + }; +} + +/// Locations that will not be charged fees in the executor, +/// either execution or delivery. +/// We only waive fees for system functions, which these locations represent. +pub type WaivedLocations = + (RelayOrOtherSystemParachains, Equals); + +/// Cases where a remote origin is accepted as trusted Teleporter for a given asset: +/// - DOT with the parent Relay Chain and sibling parachains. +pub type TrustedTeleporters = ConcreteAssetFromSystem; + pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; @@ -190,8 +226,7 @@ impl xcm_executor::Config for XcmConfig { // BridgeHub does not recognize a reserve location for any asset. Users must teleport DOT // where allowed (e.g. with the Relay Chain). type IsReserve = (); - /// Only allow teleportation of DOT. - type IsTeleporter = ConcreteNativeAssetFrom; + type IsTeleporter = TrustedTeleporters; type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< @@ -209,7 +244,7 @@ impl xcm_executor::Config for XcmConfig { type MaxAssetsIntoHolding = MaxAssetsIntoHolding; type AssetLocker = (); type AssetExchanger = (); - type FeeManager = (); + type FeeManager = XcmFeesToAccount; type MessageExporter = (); type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; @@ -225,7 +260,7 @@ pub type LocalOriginToLocation = SignedToAccountId32, + cumulus_primitives_utility::ParentAsUmp, // ..and XCMP to communicate with the sibling chains. XcmpQueue, )>; diff --git a/system-parachains/collectives/collectives-polkadot/Cargo.toml b/system-parachains/collectives/collectives-polkadot/Cargo.toml index cdd13b081e..dd0182ac0c 100644 --- a/system-parachains/collectives/collectives-polkadot/Cargo.toml +++ b/system-parachains/collectives/collectives-polkadot/Cargo.toml @@ -16,70 +16,71 @@ scale-info = { version = "2.9.0", default-features = false, features = ["derive" smallvec = "1.11.0" # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-executive = { default-features = false, version = "24.0.0" } -frame-support = { default-features = false, version = "24.0.0" } -frame-system = { default-features = false, version = "24.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } -pallet-alliance = { default-features = false, version = "23.0.0" } -pallet-aura = { default-features = false, version = "23.0.0" } -pallet-authorship = { default-features = false, version = "24.0.0" } -pallet-balances = { default-features = false, version = "24.0.0" } -pallet-collective = { default-features = false, version = "24.0.0" } -pallet-multisig = { default-features = false, version = "24.0.0" } -pallet-preimage = { default-features = false , version = "24.0.0" } -pallet-proxy = { default-features = false, version = "24.0.0" } -pallet-scheduler = { default-features = false , version = "25.0.0" } -pallet-session = { default-features = false, version = "24.0.0" } -pallet-timestamp = { default-features = false, version = "23.0.0" } -pallet-transaction-payment = { default-features = false, version = "24.0.0" } -pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "24.0.0" } -pallet-utility = { default-features = false, version = "24.0.0" } -pallet-referenda = { default-features = false, version = "24.0.0" } -pallet-ranked-collective = { default-features = false, version = "24.0.0" } -pallet-core-fellowship = { default-features = false, version = "8.0.0" } -pallet-salary = { default-features = false, version = "9.0.0" } -sp-api = { default-features = false, version = "22.0.0" } -sp-arithmetic = { default-features = false , version = "19.0.0" } -sp-block-builder = { default-features = false, version = "22.0.0" } -sp-consensus-aura = { default-features = false, version = "0.28.0" } -sp-core = { default-features = false, version = "24.0.0" } -sp-inherents = { default-features = false, version = "22.0.0" } -sp-offchain = { default-features = false, version = "22.0.0" } -sp-runtime = { default-features = false, version = "27.0.0" } -sp-session = { default-features = false, version = "23.0.0" } -sp-std = { default-features = false, version = "11.0.0" } -sp-storage = { default-features = false, version = "16.0.0" } -sp-transaction-pool = { default-features = false, version = "22.0.0" } -sp-version = { default-features = false, version = "25.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-executive = { default-features = false, version = "25.0.0" } +frame-support = { default-features = false, version = "25.0.0" } +frame-system = { default-features = false, version = "25.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "23.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.31.0" } +pallet-alliance = { default-features = false, version = "24.0.0" } +pallet-aura = { default-features = false, version = "24.0.0" } +pallet-authorship = { default-features = false, version = "25.0.0" } +pallet-balances = { default-features = false, version = "25.0.0" } +pallet-collective = { default-features = false, version = "25.0.0" } +pallet-multisig = { default-features = false, version = "25.0.0" } +pallet-preimage = { default-features = false , version = "25.0.0" } +pallet-proxy = { default-features = false, version = "25.0.0" } +pallet-scheduler = { default-features = false , version = "26.0.0" } +pallet-session = { default-features = false, version = "25.0.0" } +pallet-timestamp = { default-features = false, version = "24.0.0" } +pallet-transaction-payment = { default-features = false, version = "25.0.0" } +pallet-transaction-payment-rpc-runtime-api = { default-features = false, version = "25.0.0" } +pallet-utility = { default-features = false, version = "25.0.0" } +pallet-referenda = { default-features = false, version = "25.0.0" } +pallet-ranked-collective = { default-features = false, version = "25.0.0" } +pallet-core-fellowship = { default-features = false, version = "9.0.0" } +pallet-salary = { default-features = false, version = "10.0.0" } +sp-api = { default-features = false, version = "23.0.0" } +sp-arithmetic = { default-features = false , version = "20.0.0" } +sp-block-builder = { default-features = false, version = "23.0.0" } +sp-consensus-aura = { default-features = false, version = "0.29.0" } +sp-core = { default-features = false, version = "25.0.0" } +sp-genesis-builder = { default-features = false , version = "0.4.0" } +sp-inherents = { default-features = false, version = "23.0.0" } +sp-offchain = { default-features = false, version = "23.0.0" } +sp-runtime = { default-features = false, version = "28.0.0" } +sp-session = { default-features = false, version = "24.0.0" } +sp-std = { default-features = false, version = "12.0.0" } +sp-storage = { default-features = false, version = "17.0.0" } +sp-transaction-pool = { default-features = false, version = "23.0.0" } +sp-version = { default-features = false, version = "26.0.0" } # Polkadot -pallet-xcm = { default-features = false, version = "3.0.0" } -polkadot-core-primitives = { default-features = false, version = "3.0.0" } -polkadot-parachain-primitives = { default-features = false, version = "2.0.0" } -polkadot-runtime-common = { default-features = false, version = "3.0.0" } +pallet-xcm = { default-features = false, version = "4.0.0" } +polkadot-core-primitives = { default-features = false, version = "4.0.0" } +polkadot-parachain-primitives = { default-features = false, version = "3.0.0" } +polkadot-runtime-common = { default-features = false, version = "4.0.0" } polkadot-runtime-constants = { path = "../../../relay/polkadot/constants", default-features = false} -xcm = { package = "staging-xcm", default-features = false, version = "3.0.1" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "4.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "4.0.0" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "4.0.0" } # Cumulus -cumulus-pallet-aura-ext = { default-features = false , version = "0.3.0" } -cumulus-pallet-dmp-queue = { default-features = false , version = "0.3.0" } -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } -cumulus-pallet-session-benchmarking = { default-features = false, version = "5.0.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } -cumulus-pallet-xcmp-queue = { default-features = false , version = "0.3.0" } -cumulus-primitives-core = { default-features = false , version = "0.3.0" } -cumulus-primitives-utility = { default-features = false , version = "0.3.0" } -pallet-collator-selection = { default-features = false , version = "5.0.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } -parachains-common = { default-features = false , version = "3.0.0" } +cumulus-pallet-aura-ext = { default-features = false , version = "0.4.0" } +cumulus-pallet-dmp-queue = { default-features = false , version = "0.4.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.4.0" } +cumulus-pallet-session-benchmarking = { default-features = false, version = "6.0.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.4.0" } +cumulus-pallet-xcmp-queue = { default-features = false , version = "0.4.0" } +cumulus-primitives-core = { default-features = false , version = "0.4.0" } +cumulus-primitives-utility = { default-features = false , version = "0.4.0" } +pallet-collator-selection = { default-features = false , version = "6.0.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.4.0" } +parachains-common = { default-features = false , version = "4.0.0" } [build-dependencies] -substrate-wasm-builder = { optional = true , version = "13.0.0" } +substrate-wasm-builder = { optional = true , version = "14.0.0" } [features] default = [ "std" ] @@ -195,6 +196,7 @@ std = [ "sp-block-builder/std", "sp-consensus-aura/std", "sp-core/std", + "sp-genesis-builder/std", "sp-inherents/std", "sp-offchain/std", "sp-runtime/std", diff --git a/system-parachains/collectives/collectives-polkadot/src/lib.rs b/system-parachains/collectives/collectives-polkadot/src/lib.rs index a51e65fc81..c3d12985ef 100644 --- a/system-parachains/collectives/collectives-polkadot/src/lib.rs +++ b/system-parachains/collectives/collectives-polkadot/src/lib.rs @@ -63,6 +63,7 @@ use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ construct_runtime, dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, parameter_types, traits::{ fungible::HoldConsideration, ConstBool, ConstU16, ConstU32, ConstU64, ConstU8, @@ -92,7 +93,7 @@ pub use sp_runtime::BuildStorage; // Polkadot imports use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm::latest::BodyId; +use xcm::prelude::*; use xcm_executor::XcmExecutor; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; @@ -208,8 +209,9 @@ impl pallet_balances::Config for Runtime { type MaxReserves = ConstU32<50>; type ReserveIdentifier = [u8; 8]; type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; + type MaxHolds = ConstU32<1>; type MaxFreezes = ConstU32<0>; } @@ -381,6 +383,28 @@ impl parachain_info::Config for Runtime {} impl cumulus_pallet_aura_ext::Config for Runtime {} +parameter_types! { + /// The asset ID for the asset that we use to pay for message delivery fees. + pub FeeAssetId: AssetId = Concrete(xcm_config::DotLocation::get()); + /// The base fee for the message delivery fees. + pub const ToSiblingBaseDeliveryFee: u128 = CENTS.saturating_mul(3); + pub const ToParentBaseDeliveryFee: u128 = CENTS.saturating_mul(3); +} + +pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + ToSiblingBaseDeliveryFee, + TransactionByteFee, + XcmpQueue, +>; + +pub type PriceForParentDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + ToParentBaseDeliveryFee, + TransactionByteFee, + ParachainSystem, +>; + impl cumulus_pallet_xcmp_queue::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; @@ -390,7 +414,7 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOrigin = EitherOfDiverse, Fellows>; type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = (); + type PriceForSiblingDelivery = PriceForSiblingParachainDelivery; } impl cumulus_pallet_dmp_queue::Config for Runtime { @@ -872,6 +896,16 @@ impl_runtime_apis! { } } + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { diff --git a/system-parachains/collectives/collectives-polkadot/src/xcm_config.rs b/system-parachains/collectives/collectives-polkadot/src/xcm_config.rs index b4db73e3ab..c609b491d1 100644 --- a/system-parachains/collectives/collectives-polkadot/src/xcm_config.rs +++ b/system-parachains/collectives/collectives-polkadot/src/xcm_config.rs @@ -15,17 +15,24 @@ use super::{ AccountId, AllPalletsWithSystem, Balances, Fellows, ParachainInfo, ParachainSystem, - PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, + PolkadotXcm, PriceForParentDelivery, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + WeightToFee, XcmpQueue, }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing}, + traits::{ConstU32, Contains, Equals, Everything, Nothing}, weights::Weight, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ConcreteAssetFromSystem, RelayOrOtherSystemParachains}, + TREASURY_PALLET_ID, +}; use polkadot_parachain_primitives::primitives::Sibling; +use polkadot_runtime_constants::system_parachain; +use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, @@ -34,7 +41,7 @@ use xcm_builder::{ OriginToPluralityVoice, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, - UsingComponents, WithComputedOrigin, WithUniqueTopic, + UsingComponents, WithComputedOrigin, WithUniqueTopic, XcmFeesToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -46,6 +53,8 @@ parameter_types! { X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); + pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(polkadot_runtime_constants::TREASURY_PALLET_ID)).into(); + pub TreasuryAccount: Option = Some(TREASURY_PALLET_ID.into_account_truncating()); } /// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used @@ -215,8 +224,12 @@ pub type Barrier = TrailingSetTopicAsId< // If the message is one that immediately attemps to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) and relay treasury get + // free execution. + AllowExplicitUnpaidExecutionFrom<( + ParentOrParentsPlurality, + Equals, + )>, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, ), @@ -227,6 +240,28 @@ pub type Barrier = TrailingSetTopicAsId< >, >; +match_types! { + pub type SystemParachains: impl Contains = { + MultiLocation { + parents: 1, + interior: X1(Parachain( + system_parachain::ASSET_HUB_ID | + system_parachain::BRIDGE_HUB_ID + )), + } + }; +} + +/// Locations that will not be charged fees in the executor, +/// either execution or delivery. +/// We only waive fees for system functions, which these locations represent. +pub type WaivedLocations = + (RelayOrOtherSystemParachains, Equals); + +/// Cases where a remote origin is accepted as trusted Teleporter for a given asset: +/// - DOT with the parent Relay Chain and sibling parachains. +pub type TrustedTeleporters = ConcreteAssetFromSystem; + pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; @@ -236,8 +271,7 @@ impl xcm_executor::Config for XcmConfig { // Collectives does not recognize a reserve location for any asset. Users must teleport DOT // where allowed (e.g. with the Relay Chain). type IsReserve = (); - /// Only allow teleportation of DOT. - type IsTeleporter = ConcreteNativeAssetFrom; + type IsTeleporter = TrustedTeleporters; type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = FixedWeightBounds; @@ -251,7 +285,7 @@ impl xcm_executor::Config for XcmConfig { type MaxAssetsIntoHolding = MaxAssetsIntoHolding; type AssetLocker = (); type AssetExchanger = (); - type FeeManager = (); + type FeeManager = XcmFeesToAccount; type MessageExporter = (); type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; @@ -267,7 +301,7 @@ pub type LocalOriginToLocation = SignedToAccountId32, + cumulus_primitives_utility::ParentAsUmp, // ..and XCMP to communicate with the sibling chains. XcmpQueue, )>; diff --git a/system-parachains/gluttons/glutton-kusama/Cargo.toml b/system-parachains/gluttons/glutton-kusama/Cargo.toml index 9fec42b5b8..f86a9159d1 100644 --- a/system-parachains/gluttons/glutton-kusama/Cargo.toml +++ b/system-parachains/gluttons/glutton-kusama/Cargo.toml @@ -13,41 +13,42 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } # Substrate -frame-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-executive = { default-features = false, version = "24.0.0" } -frame-support = { default-features = false, version = "24.0.0" } -frame-system = { default-features = false, version = "24.0.0" } -frame-system-rpc-runtime-api = { default-features = false, version = "22.0.0" } -frame-system-benchmarking = { default-features = false, optional = true, version = "24.0.0" } -frame-try-runtime = { default-features = false, optional = true, version = "0.30.0" } -pallet-glutton = { default-features = false, optional = true, version = "10.0.0" } -pallet-sudo = { default-features = false, optional = true, version = "24.0.0" } -sp-api = { default-features = false, version = "22.0.0" } -sp-block-builder = { default-features = false, version = "22.0.0" } -sp-core = { default-features = false, version = "24.0.0" } -sp-inherents = { default-features = false, version = "22.0.0" } -sp-offchain = { default-features = false, version = "22.0.0" } -sp-runtime = { default-features = false, version = "27.0.0" } -sp-session = { default-features = false, version = "23.0.0" } -sp-std = { default-features = false, version = "11.0.0" } -sp-storage = { default-features = false, version = "16.0.0" } -sp-transaction-pool = { default-features = false, version = "22.0.0" } -sp-version = { default-features = false, version = "25.0.0" } +frame-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-executive = { default-features = false, version = "25.0.0" } +frame-support = { default-features = false, version = "25.0.0" } +frame-system = { default-features = false, version = "25.0.0" } +frame-system-rpc-runtime-api = { default-features = false, version = "23.0.0" } +frame-system-benchmarking = { default-features = false, optional = true, version = "25.0.0" } +frame-try-runtime = { default-features = false, optional = true, version = "0.31.0" } +pallet-glutton = { default-features = false, optional = true, version = "11.0.0" } +pallet-sudo = { default-features = false, optional = true, version = "25.0.0" } +sp-api = { default-features = false, version = "23.0.0" } +sp-block-builder = { default-features = false, version = "23.0.0" } +sp-core = { default-features = false, version = "25.0.0" } +sp-genesis-builder = { default-features = false , version = "0.4.0" } +sp-inherents = { default-features = false, version = "23.0.0" } +sp-offchain = { default-features = false, version = "23.0.0" } +sp-runtime = { default-features = false, version = "28.0.0" } +sp-session = { default-features = false, version = "24.0.0" } +sp-std = { default-features = false, version = "12.0.0" } +sp-storage = { default-features = false, version = "17.0.0" } +sp-transaction-pool = { default-features = false, version = "23.0.0" } +sp-version = { default-features = false, version = "26.0.0" } # Polkadot -xcm = { package = "staging-xcm", default-features = false, version = "3.0.1" } -xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "3.0.1" } -xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "3.0.0" } +xcm = { package = "staging-xcm", default-features = false, version = "4.0.0" } +xcm-builder = { package = "staging-xcm-builder", default-features = false, version = "4.0.0" } +xcm-executor = { package = "staging-xcm-executor", default-features = false, version = "4.0.0" } # Cumulus -cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.3.0" } -cumulus-pallet-xcm = { default-features = false , version = "0.3.0" } -cumulus-primitives-core = { default-features = false , version = "0.3.0" } -parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.3.0" } -parachains-common = { default-features = false , version = "3.0.0" } +cumulus-pallet-parachain-system = { default-features = false, features = ["parameterized-consensus-hook",] , version = "0.4.0" } +cumulus-pallet-xcm = { default-features = false , version = "0.4.0" } +cumulus-primitives-core = { default-features = false , version = "0.4.0" } +parachain-info = { package = "staging-parachain-info", default-features = false , version = "0.4.0" } +parachains-common = { default-features = false , version = "4.0.0" } [build-dependencies] -substrate-wasm-builder = { version = "13.0.0" } +substrate-wasm-builder = { version = "14.0.0" } [features] default = [ "std" ] @@ -59,6 +60,7 @@ runtime-benchmarks = [ "frame-system/runtime-benchmarks", "pallet-glutton/runtime-benchmarks", "pallet-sudo?/runtime-benchmarks", + "parachains-common/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", @@ -83,6 +85,7 @@ std = [ "sp-api/std", "sp-block-builder/std", "sp-core/std", + "sp-genesis-builder/std", "sp-inherents/std", "sp-offchain/std", "sp-runtime/std", diff --git a/system-parachains/gluttons/glutton-kusama/src/lib.rs b/system-parachains/gluttons/glutton-kusama/src/lib.rs index a6153952de..050bf21f88 100644 --- a/system-parachains/gluttons/glutton-kusama/src/lib.rs +++ b/system-parachains/gluttons/glutton-kusama/src/lib.rs @@ -63,6 +63,7 @@ use sp_version::RuntimeVersion; pub use frame_support::{ construct_runtime, dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, parameter_types, traits::{Everything, IsInVec, Randomness}, weights::{ @@ -347,12 +348,22 @@ impl_runtime_apis! { } } - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { fn account_nonce(account: AccountId) -> Nonce { System::account_nonce(account) } } + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } + #[cfg(feature = "runtime-benchmarks")] impl frame_benchmarking::Benchmark for Runtime { fn benchmark_metadata(extra: bool) -> ( From 16e556492fd0d8c9dd54cdd9a2ec4a2d7fb8aeb0 Mon Sep 17 00:00:00 2001 From: Liam Aharon Date: Fri, 1 Dec 2023 16:25:44 +0400 Subject: [PATCH 19/21] Fix Asset Hub naming in code and release notes (#71) Cleans up some usage of old naming conventions. I noticed also in the [last release](https://github.com/polkadot-fellows/runtimes/releases/tag/v1.0.0) the old naming conventions are used. I believe we should refer to these chains as Asset Hub now? - Update Oct 24: Updated the release notes generation to replace "Statemint" and "Statemine" with "Polkadot Asset Hub (previous Statemint) and "Kusama Asset Hub (previously Statemine)". Release built with updated script: https://github.com/liamaharon/runtimes/releases/tag/v1.0.0 --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- .github/workflows/release.yml | 15 +++++++++++++-- .../asset-hubs/asset-hub-kusama/tests/tests.rs | 2 +- .../asset-hubs/asset-hub-polkadot/tests/tests.rs | 2 +- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 373d14f949..d19cbe550c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -114,9 +114,20 @@ jobs: EOF for JSON in $(<<<$CONTEXT sort -sr) - do tee -a DRAFT <<-EOF + do + SPEC_NAME=$(WASM 'core_version.specName') + # Check for spec names and adjust the heading accordingly + if [[ "$SPEC_NAME" == "statemint" ]]; then + HEADING="Asset Hub Polkadot (previously Statemint)" + elif [[ "$SPEC_NAME" == "statemine" ]]; then + HEADING="Asset Hub Kusama (previously Statemine)" + else + HEADING=$(WASM 'core_version.specName / "-" | map(. / "" | first |= ascii_upcase | add) | join(" ")') + fi - ### $(WASM 'core_version.specName / "-" | map(. / "" | first |= ascii_upcase | add) | join(" ")') + tee -a DRAFT <<-EOF + + ### $HEADING ~~~ 🏋️ Runtime Size: $(numfmt --to iec-i --format "%.2f" $(WASM size)) ($(WASM size) bytes) 🗜 Compressed: $(WASM 'compression | if .compressed then "Yes: \(1 - .size_compressed / .size_decompressed | . * 10000 | round / 100)%" else "No" end') diff --git a/system-parachains/asset-hubs/asset-hub-kusama/tests/tests.rs b/system-parachains/asset-hubs/asset-hub-kusama/tests/tests.rs index 7d49b56e46..20477cb24e 100644 --- a/system-parachains/asset-hubs/asset-hub-kusama/tests/tests.rs +++ b/system-parachains/asset-hubs/asset-hub-kusama/tests/tests.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Tests for the Statemine (Kusama Assets Hub) chain. +//! Tests for the Kusama Asset Hub (previously known as Statemine) chain. use asset_hub_kusama_runtime::xcm_config::{ AssetFeeAsExistentialDepositMultiplierFeeCharger, KsmLocation, TrustBackedAssetsPalletLocation, diff --git a/system-parachains/asset-hubs/asset-hub-polkadot/tests/tests.rs b/system-parachains/asset-hubs/asset-hub-polkadot/tests/tests.rs index 7200ebc16a..5af2c63c18 100644 --- a/system-parachains/asset-hubs/asset-hub-polkadot/tests/tests.rs +++ b/system-parachains/asset-hubs/asset-hub-polkadot/tests/tests.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Tests for the Statemint (Polkadot Assets Hub) chain. +//! Tests for the Polkadot Asset Hub (previously known as Statemint) chain. use asset_hub_polkadot_runtime::xcm_config::{ AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, DotLocation, From b8df4b06c78fb2fb2d0f081c76e30569f12363c6 Mon Sep 17 00:00:00 2001 From: Muharem Date: Fri, 1 Dec 2023 16:57:14 +0100 Subject: [PATCH 20/21] Fellowship entities get free xcm execution (#107) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fellowship entities get free xcm execution. Same as the Fellowship entities allowed to pass `UnpaidExecution` command to bypass the fees charged by `Trader` impl, we include the Fellowship locations to `WaivedLocations` to not be charged by `FeeManager` impl. Co-authored-by: Bastian Köcher --- .../asset-hubs/asset-hub-polkadot/src/xcm_config.rs | 8 ++++++-- .../bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs | 7 +++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/system-parachains/asset-hubs/asset-hub-polkadot/src/xcm_config.rs b/system-parachains/asset-hubs/asset-hub-polkadot/src/xcm_config.rs index 664a2df5fd..92776aa1dc 100644 --- a/system-parachains/asset-hubs/asset-hub-polkadot/src/xcm_config.rs +++ b/system-parachains/asset-hubs/asset-hub-polkadot/src/xcm_config.rs @@ -414,8 +414,12 @@ match_types! { /// Locations that will not be charged fees in the executor, /// either execution or delivery. /// We only waive fees for system functions, which these locations represent. -pub type WaivedLocations = - (RelayOrOtherSystemParachains, Equals); +pub type WaivedLocations = ( + RelayOrOtherSystemParachains, + Equals, + FellowsPlurality, + FellowshipSalaryPallet, +); /// Cases where a remote origin is accepted as trusted Teleporter for a given asset: /// diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs index f92b9adbf0..be8f1dfa00 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs @@ -210,8 +210,11 @@ match_types! { /// Locations that will not be charged fees in the executor, /// either execution or delivery. /// We only waive fees for system functions, which these locations represent. -pub type WaivedLocations = - (RelayOrOtherSystemParachains, Equals); +pub type WaivedLocations = ( + RelayOrOtherSystemParachains, + Equals, + FellowsPlurality, +); /// Cases where a remote origin is accepted as trusted Teleporter for a given asset: /// - DOT with the parent Relay Chain and sibling parachains. From 2b3024339b1a5f81157af827cde36b19f9ddc505 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 7 Dec 2023 23:18:55 +0100 Subject: [PATCH 21/21] [ci/cd] Split Test pipeline according to `runtime-benchmarks` feature (#48) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Based on original [issue](https://github.com/paritytech/ci_cd/issues/864 ) from @gilescope related to the monorepo: > Currently the tests have started to be run with the `runtime-benchmarks` feature enabled ( E.g. https://github.com/paritytech/polkadot-sdk/blob/aabed6757e26e21ce06dd59946a17b72f349185e/.gitlab/pipeline/test.yml#L37 ). This was done so that the autogenerated tests that the benchmark macros create get run (but it seems that we already have a short-benchmark CI job... - do the additional tests give us anything extra? EDIT: the short-benchmarks only test 3 relay chains so not comprehensive enough). > However, this is inherently dangerous as not everything will be in a production like state when it is being tested. > For safety's sake we should be running without the `runtime-benchmarks` feature enabled. Assuming the CI system can take it, we should set up another job that runs the tests with the runtime-benchmarks feature enabled. (if we did not do this we would catch any problems later when the weights are rerun for the runtime release builds). ## Proposed solution Split [test pipeline](https://github.com/polkadot-fellows/runtimes/blob/main/.github/workflows/test.yml#L44) to the two pipelines: - one without `runtime-benchmarks` feature - one with `runtime-benchmarks` feature Co-authored-by: Bastian Köcher --- .github/workflows/test.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d3c294071f..2672bc2b00 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,8 +51,14 @@ jobs: - name: Fetch cache uses: Swatinem/rust-cache@a95ba195448af2da9b00fb742d14ffaaf3c21f43 # v2.7.0 + - name: Test + run: cargo test --workspace --release --locked -q --features=runtime-metrics,try-runtime + env: + RUSTFLAGS: "-C debug-assertions -D warnings" + SKIP_WASM_BUILD: 1 + - name: Test all features run: cargo test --workspace --release --locked -q --features=runtime-benchmarks,runtime-metrics,try-runtime env: RUSTFLAGS: "-C debug-assertions -D warnings" - SKIP_WASM_BUILD: 1 + SKIP_WASM_BUILD: 1 \ No newline at end of file

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