diff --git a/Cargo.lock b/Cargo.lock
index a42f5baa4765e..87573804fcc08 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -11943,6 +11943,26 @@ dependencies = [
"sp-weights 27.0.0",
]
+[[package]]
+name = "pallet-meta-tx"
+version = "0.0.1"
+dependencies = [
+ "docify 0.2.7",
+ "frame-benchmarking",
+ "frame-support",
+ "frame-system",
+ "pallet-balances",
+ "pallet-transaction-payment",
+ "parity-scale-codec",
+ "scale-info",
+ "serde",
+ "sp-core",
+ "sp-io",
+ "sp-keyring",
+ "sp-runtime",
+ "sp-std 14.0.0",
+]
+
[[package]]
name = "pallet-migrations"
version = "1.0.0"
diff --git a/bridges/bin/runtime-common/src/priority_calculator.rs b/bridges/bin/runtime-common/src/priority_calculator.rs
new file mode 100644
index 0000000000000..91486a8104fdf
--- /dev/null
+++ b/bridges/bin/runtime-common/src/priority_calculator.rs
@@ -0,0 +1,205 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// This file is part of Parity Bridges Common.
+
+// Parity Bridges Common is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Parity Bridges Common is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Parity Bridges Common. If not, see .
+
+//! Bridge transaction priority calculator.
+//!
+//! We want to prioritize message delivery transactions with more messages over
+//! transactions with less messages. That's because we reject delivery transactions
+//! if it contains already delivered message. And if some transaction delivers
+//! single message with nonce `N`, then the transaction with nonces `N..=N+100` will
+//! be rejected. This can lower bridge throughput down to one message per block.
+
+use bp_messages::MessageNonce;
+use frame_support::traits::Get;
+use sp_runtime::transaction_validity::TransactionPriority;
+
+// reexport everything from `integrity_tests` module
+#[allow(unused_imports)]
+pub use integrity_tests::*;
+
+/// Compute priority boost for message delivery transaction that delivers
+/// given number of messages.
+pub fn compute_priority_boost(
+ messages: MessageNonce,
+) -> TransactionPriority
+where
+ PriorityBoostPerMessage: Get,
+{
+ // we don't want any boost for transaction with single message => minus one
+ PriorityBoostPerMessage::get().saturating_mul(messages.saturating_sub(1))
+}
+
+#[cfg(not(feature = "integrity-test"))]
+mod integrity_tests {}
+
+#[cfg(feature = "integrity-test")]
+mod integrity_tests {
+ use super::compute_priority_boost;
+
+ use bp_messages::MessageNonce;
+ use bp_runtime::PreComputedSize;
+ use frame_support::{
+ dispatch::{DispatchClass, DispatchInfo, Pays, PostDispatchInfo},
+ traits::Get,
+ };
+ use pallet_bridge_messages::WeightInfoExt;
+ use pallet_transaction_payment::OnChargeTransaction;
+ use sp_runtime::{
+ traits::{Dispatchable, UniqueSaturatedInto, Zero},
+ transaction_validity::TransactionPriority,
+ FixedPointOperand, SaturatedConversion, Saturating,
+ };
+
+ type BalanceOf =
+ <::OnChargeTransaction as OnChargeTransaction<
+ T,
+ >>::Balance;
+
+ /// Ensures that the value of `PriorityBoostPerMessage` matches the value of
+ /// `tip_boost_per_message`.
+ ///
+ /// We want two transactions, `TX1` with `N` messages and `TX2` with `N+1` messages, have almost
+ /// the same priority if we'll add `tip_boost_per_message` tip to the `TX1`. We want to be sure
+ /// that if we add plain `PriorityBoostPerMessage` priority to `TX1`, the priority will be close
+ /// to `TX2` as well.
+ pub fn ensure_priority_boost_is_sane(
+ tip_boost_per_message: BalanceOf,
+ ) where
+ Runtime:
+ pallet_transaction_payment::Config + pallet_bridge_messages::Config,
+ MessagesInstance: 'static,
+ PriorityBoostPerMessage: Get,
+ Runtime::RuntimeCall: Dispatchable,
+ BalanceOf: Send + Sync + FixedPointOperand,
+ {
+ let priority_boost_per_message = PriorityBoostPerMessage::get();
+ let maximal_messages_in_delivery_transaction =
+ Runtime::MaxUnconfirmedMessagesAtInboundLane::get();
+ for messages in 1..=maximal_messages_in_delivery_transaction {
+ let base_priority = estimate_message_delivery_transaction_priority::<
+ Runtime,
+ MessagesInstance,
+ >(messages, Zero::zero());
+ let priority_boost = compute_priority_boost::(messages);
+ let priority_with_boost = base_priority + priority_boost;
+
+ let tip = tip_boost_per_message.saturating_mul((messages - 1).unique_saturated_into());
+ let priority_with_tip =
+ estimate_message_delivery_transaction_priority::(1, tip);
+
+ const ERROR_MARGIN: TransactionPriority = 5; // 5%
+ if priority_with_boost.abs_diff(priority_with_tip).saturating_mul(100) /
+ priority_with_tip >
+ ERROR_MARGIN
+ {
+ panic!(
+ "The PriorityBoostPerMessage value ({}) must be fixed to: {}",
+ priority_boost_per_message,
+ compute_priority_boost_per_message::(
+ tip_boost_per_message
+ ),
+ );
+ }
+ }
+ }
+
+ /// Compute priority boost that we give to message delivery transaction for additional message.
+ #[cfg(feature = "integrity-test")]
+ fn compute_priority_boost_per_message(
+ tip_boost_per_message: BalanceOf,
+ ) -> TransactionPriority
+ where
+ Runtime:
+ pallet_transaction_payment::Config + pallet_bridge_messages::Config,
+ MessagesInstance: 'static,
+ Runtime::RuntimeCall: Dispatchable,
+ BalanceOf: Send + Sync + FixedPointOperand,
+ {
+ // estimate priority of transaction that delivers one message and has large tip
+ let maximal_messages_in_delivery_transaction =
+ Runtime::MaxUnconfirmedMessagesAtInboundLane::get();
+ let small_with_tip_priority =
+ estimate_message_delivery_transaction_priority::(
+ 1,
+ tip_boost_per_message
+ .saturating_mul(maximal_messages_in_delivery_transaction.saturated_into()),
+ );
+ // estimate priority of transaction that delivers maximal number of messages, but has no tip
+ let large_without_tip_priority = estimate_message_delivery_transaction_priority::<
+ Runtime,
+ MessagesInstance,
+ >(maximal_messages_in_delivery_transaction, Zero::zero());
+
+ small_with_tip_priority
+ .saturating_sub(large_without_tip_priority)
+ .saturating_div(maximal_messages_in_delivery_transaction - 1)
+ }
+
+ /// Estimate message delivery transaction priority.
+ #[cfg(feature = "integrity-test")]
+ fn estimate_message_delivery_transaction_priority(
+ messages: MessageNonce,
+ tip: BalanceOf,
+ ) -> TransactionPriority
+ where
+ Runtime:
+ pallet_transaction_payment::Config + pallet_bridge_messages::Config,
+ MessagesInstance: 'static,
+ Runtime::RuntimeCall: Dispatchable,
+ BalanceOf: Send + Sync + FixedPointOperand,
+ {
+ // just an estimation of extra transaction bytes that are added to every transaction
+ // (including signature, signed extensions extra and etc + in our case it includes
+ // all call arguments extept the proof itself)
+ let base_tx_size = 512;
+ // let's say we are relaying similar small messages and for every message we add more trie
+ // nodes to the proof (x0.5 because we expect some nodes to be reused)
+ let estimated_message_size = 512;
+ // let's say all our messages have the same dispatch weight
+ let estimated_message_dispatch_weight = >::WeightInfo::message_dispatch_weight(
+ estimated_message_size
+ );
+ // messages proof argument size is (for every message) messages size + some additional
+ // trie nodes. Some of them are reused by different messages, so let's take 2/3 of default
+ // "overhead" constant
+ let messages_proof_size = >::WeightInfo::expected_extra_storage_proof_size()
+ .saturating_mul(2)
+ .saturating_div(3)
+ .saturating_add(estimated_message_size)
+ .saturating_mul(messages as _);
+
+ // finally we are able to estimate transaction size and weight
+ let transaction_size = base_tx_size.saturating_add(messages_proof_size);
+ let transaction_weight = >::WeightInfo::receive_messages_proof_weight(
+ &PreComputedSize(transaction_size as _),
+ messages as _,
+ estimated_message_dispatch_weight.saturating_mul(messages),
+ );
+
+ pallet_transaction_payment::ChargeTransactionPayment::::get_priority(
+ &DispatchInfo {
+ weight: transaction_weight,
+ class: DispatchClass::Normal,
+ pays_fee: Pays::Yes,
+ },
+ transaction_size as _,
+ tip,
+ Zero::zero(),
+ )
+ }
+}
diff --git a/bridges/modules/relayers/src/extension/mod.rs b/bridges/modules/relayers/src/extension/mod.rs
index 710533c223a0b..6db42139e10e5 100644
--- a/bridges/modules/relayers/src/extension/mod.rs
+++ b/bridges/modules/relayers/src/extension/mod.rs
@@ -355,6 +355,7 @@ where
_call: &R::RuntimeCall,
_info: &DispatchInfoOf,
_len: usize,
+ _context: &Context,
) -> Result {
Ok(val.inspect(|data| {
log::trace!(
@@ -1191,6 +1192,7 @@ mod tests {
&post_dispatch_info(),
1024,
&dispatch_result,
+ &(),
);
assert_eq!(post_dispatch_result, Ok(Weight::zero()));
}
diff --git a/bridges/primitives/runtime/src/extensions.rs b/bridges/primitives/runtime/src/extensions.rs
index 25553f9c7b2e8..49f2e4b1a8921 100644
--- a/bridges/primitives/runtime/src/extensions.rs
+++ b/bridges/primitives/runtime/src/extensions.rs
@@ -148,3 +148,15 @@ where
impl_tx_ext_default!(C; weight validate prepare);
}
+impl TransactionExtension for GenericTransactionExtension
+where
+ C: Dispatchable,
+ S: TransactionExtensionSchema,
+ S::Payload: Send + Sync,
+ S::Implicit: Send + Sync,
+{
+ type Pre = ();
+ type Val = ();
+
+ impl_tx_ext_default!(C; Context; validate prepare);
+}
diff --git a/bridges/snowbridge/runtime/test-common/Cargo.toml b/bridges/snowbridge/runtime/test-common/Cargo.toml
index 6f8e586bf5ff1..14bb6f1b83f7b 100644
--- a/bridges/snowbridge/runtime/test-common/Cargo.toml
+++ b/bridges/snowbridge/runtime/test-common/Cargo.toml
@@ -81,6 +81,7 @@ runtime-benchmarks = [
"pallet-collator-selection/runtime-benchmarks",
"pallet-message-queue/runtime-benchmarks",
"pallet-timestamp/runtime-benchmarks",
+ "pallet-transaction-payment/runtime-benchmarks",
"pallet-utility/runtime-benchmarks",
"pallet-xcm/runtime-benchmarks",
"snowbridge-core/runtime-benchmarks",
diff --git a/cumulus/parachains/runtimes/starters/seedling/src/lib.rs b/cumulus/parachains/runtimes/starters/seedling/src/lib.rs
new file mode 100644
index 0000000000000..2c990ea427849
--- /dev/null
+++ b/cumulus/parachains/runtimes/starters/seedling/src/lib.rs
@@ -0,0 +1,386 @@
+// 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 .
+
+//! # Seedling Runtime
+//!
+//! Seedling is a parachain meant to help parachain auction winners migrate a blockchain from
+//! another consensus system into the consensus system of a given Relay Chain.
+
+#![cfg_attr(not(feature = "std"), no_std)]
+// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256.
+#![recursion_limit = "256"]
+
+// Make the WASM binary available.
+#[cfg(feature = "std")]
+include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
+
+use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases;
+use sp_api::impl_runtime_apis;
+pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;
+use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
+use sp_runtime::{
+ create_runtime_str, generic, impl_opaque_keys,
+ traits::{AccountIdLookup, BlakeTwo256, Block as BlockT},
+ transaction_validity::{TransactionSource, TransactionValidity},
+ ApplyExtrinsicResult,
+};
+use sp_std::prelude::*;
+#[cfg(feature = "std")]
+use sp_version::NativeVersion;
+use sp_version::RuntimeVersion;
+
+// A few exports that help ease life for downstream crates.
+pub use frame_support::{
+ construct_runtime, derive_impl,
+ dispatch::DispatchClass,
+ genesis_builder_helper::{build_config, create_default_config},
+ parameter_types,
+ traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, IsInVec, Randomness},
+ weights::{
+ constants::{
+ BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND,
+ },
+ IdentityFee, Weight,
+ },
+ StorageValue,
+};
+use frame_system::limits::{BlockLength, BlockWeights};
+use parachains_common::{AccountId, Signature};
+#[cfg(any(feature = "std", test))]
+pub use sp_runtime::BuildStorage;
+pub use sp_runtime::{Perbill, Permill};
+
+impl_opaque_keys! {
+ pub struct SessionKeys {
+ pub aura: Aura,
+ }
+}
+
+/// This runtime version.
+#[sp_version::runtime_version]
+pub const VERSION: RuntimeVersion = RuntimeVersion {
+ spec_name: create_runtime_str!("seedling"),
+ impl_name: create_runtime_str!("seedling"),
+ authoring_version: 1,
+ spec_version: 1,
+ impl_version: 0,
+ apis: RUNTIME_API_VERSIONS,
+ transaction_version: 2,
+ state_version: 0,
+};
+
+/// The version information used to identify this runtime when compiled natively.
+#[cfg(feature = "std")]
+pub fn native_version() -> NativeVersion {
+ NativeVersion { runtime_version: VERSION, can_author_with: Default::default() }
+}
+
+/// Maximum number of blocks simultaneously accepted by the Runtime, not yet included
+/// into the relay chain.
+const UNINCLUDED_SEGMENT_CAPACITY: u32 = 1;
+/// How many parachain blocks are processed by the relay chain per parent. Limits the
+/// number of blocks authored per slot.
+const BLOCK_PROCESSING_VELOCITY: u32 = 1;
+/// Relay chain slot duration, in milliseconds.
+const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000;
+
+/// We assume that ~10% of the block weight is consumed by `on_initialize` handlers.
+/// This is used to limit the maximal weight of a single extrinsic.
+const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10);
+/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used
+/// by Operational extrinsics.
+const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75);
+/// We allow for .5 seconds of compute with a 12 second average block time.
+const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(
+ WEIGHT_REF_TIME_PER_SECOND.saturating_div(2),
+ cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64,
+);
+
+parameter_types! {
+ pub const BlockHashCount: BlockNumber = 250;
+ pub const Version: RuntimeVersion = VERSION;
+ pub RuntimeBlockLength: BlockLength =
+ BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);
+ pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder()
+ .base_block(BlockExecutionWeight::get())
+ .for_class(DispatchClass::all(), |weights| {
+ weights.base_extrinsic = ExtrinsicBaseWeight::get();
+ })
+ .for_class(DispatchClass::Normal, |weights| {
+ weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT);
+ })
+ .for_class(DispatchClass::Operational, |weights| {
+ weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT);
+ // Operational transactions have some extra reserved space, so that they
+ // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`.
+ weights.reserved = Some(
+ MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT
+ );
+ })
+ .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO)
+ .build_or_panic();
+ pub const SS58Prefix: u8 = 42;
+}
+
+#[derive_impl(frame_system::config_preludes::TestDefaultConfig)]
+impl frame_system::Config for Runtime {
+ /// The identifier used to distinguish between accounts.
+ type AccountId = AccountId;
+ /// The aggregated dispatch type that is available for extrinsics.
+ type RuntimeCall = RuntimeCall;
+ /// The lookup mechanism to get account ID from whatever is passed in dispatchers.
+ type Lookup = AccountIdLookup;
+ /// The index type for storing how many extrinsics an account has signed.
+ type Nonce = Nonce;
+ /// The type for hashing blocks and tries.
+ type Hash = Hash;
+ /// The hashing algorithm used.
+ type Hashing = BlakeTwo256;
+ /// The block type.
+ type Block = Block;
+ /// The ubiquitous event type.
+ type RuntimeEvent = RuntimeEvent;
+ /// The ubiquitous origin type.
+ type RuntimeOrigin = RuntimeOrigin;
+ /// Maximum number of block number to block hash mappings to keep (oldest pruned first).
+ type BlockHashCount = BlockHashCount;
+ /// Runtime version.
+ type Version = Version;
+ /// Converts a module to an index of this module in the runtime.
+ type PalletInfo = PalletInfo;
+ type AccountData = pallet_balances::AccountData;
+ type OnNewAccount = ();
+ type OnKilledAccount = ();
+ type DbWeight = ();
+ type BaseCallFilter = frame_support::traits::Everything;
+ type SystemWeightInfo = ();
+ type BlockWeights = RuntimeBlockWeights;
+ type BlockLength = RuntimeBlockLength;
+ type SS58Prefix = SS58Prefix;
+ type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode;
+ type MaxConsumers = frame_support::traits::ConstU32<16>;
+}
+
+impl pallet_sudo::Config for Runtime {
+ type RuntimeCall = RuntimeCall;
+ type RuntimeEvent = RuntimeEvent;
+ type WeightInfo = pallet_sudo::weights::SubstrateWeight;
+}
+
+impl cumulus_pallet_solo_to_para::Config for Runtime {
+ type RuntimeEvent = RuntimeEvent;
+}
+
+impl cumulus_pallet_parachain_system::Config for Runtime {
+ type WeightInfo = ();
+ type RuntimeEvent = RuntimeEvent;
+ type OnSystemEvent = cumulus_pallet_solo_to_para::Pallet;
+ type SelfParaId = parachain_info::Pallet;
+ type OutboundXcmpMessageSource = ();
+ // Ignore all DMP messages by enqueueing them into `()`:
+ type DmpQueue = frame_support::traits::EnqueueWithOrigin<(), sp_core::ConstU8<0>>;
+ type ReservedDmpWeight = ();
+ type XcmpMessageHandler = ();
+ type ReservedXcmpWeight = ();
+ type CheckAssociatedRelayNumber = RelayNumberMonotonicallyIncreases;
+ type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook<
+ Runtime,
+ RELAY_CHAIN_SLOT_DURATION_MILLIS,
+ BLOCK_PROCESSING_VELOCITY,
+ UNINCLUDED_SEGMENT_CAPACITY,
+ >;
+}
+
+impl parachain_info::Config for Runtime {}
+
+impl cumulus_pallet_aura_ext::Config for Runtime {}
+
+impl pallet_aura::Config for Runtime {
+ type AuthorityId = AuraId;
+ type DisabledValidators = ();
+ type MaxAuthorities = ConstU32<100_000>;
+ type AllowMultipleBlocksPerSlot = ConstBool;
+ type SlotDuration = pallet_aura::MinimumPeriodTimesTwo;
+}
+
+impl pallet_timestamp::Config for Runtime {
+ type Moment = u64;
+ type OnTimestampSet = Aura;
+ type MinimumPeriod = ConstU64<0>;
+ type WeightInfo = ();
+}
+
+construct_runtime! {
+ pub enum Runtime
+ {
+ System: frame_system,
+ Sudo: pallet_sudo,
+ Timestamp: pallet_timestamp,
+
+ ParachainSystem: cumulus_pallet_parachain_system,
+ ParachainInfo: parachain_info,
+ SoloToPara: cumulus_pallet_solo_to_para,
+ Aura: pallet_aura,
+ AuraExt: cumulus_pallet_aura_ext,
+ }
+}
+
+/// Index of a transaction in the chain.
+pub type Nonce = u32;
+/// A hash of some data used by the chain.
+pub type Hash = sp_core::H256;
+/// An index to a block.
+pub type BlockNumber = u32;
+/// The address format for describing accounts.
+pub type Address = sp_runtime::MultiAddress;
+/// Block header type as expected by this runtime.
+pub type Header = generic::Header;
+/// Block type as expected by this runtime.
+pub type Block = generic::Block;
+/// A Block signed with a Justification
+pub type SignedBlock = generic::SignedBlock;
+/// BlockId type as expected by this runtime.
+pub type BlockId = generic::BlockId;
+/// The extension to the basic transaction logic.
+pub type TxExtension = (
+ frame_system::CheckSpecVersion,
+ frame_system::CheckTxVersion,
+ frame_system::CheckGenesis,
+ frame_system::CheckEra,
+ frame_system::CheckNonce,
+ pallet_sudo::CheckOnlySudoAccount,
+);
+/// Unchecked extrinsic type as expected by this runtime.
+pub type UncheckedExtrinsic =
+ generic::UncheckedExtrinsic;
+
+/// Executive: handles dispatch to the various modules.
+pub type Executive = frame_executive::Executive<
+ Runtime,
+ Block,
+ frame_system::ChainContext,
+ Runtime,
+ AllPalletsWithSystem,
+>;
+
+impl_runtime_apis! {
+ impl sp_consensus_aura::AuraApi for Runtime {
+ fn slot_duration() -> sp_consensus_aura::SlotDuration {
+ sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration())
+ }
+
+ fn authorities() -> Vec {
+ pallet_aura::Authorities::::get().into_inner()
+ }
+ }
+
+ impl sp_api::Core for Runtime {
+ fn version() -> RuntimeVersion {
+ VERSION
+ }
+
+ fn execute_block(block: Block) {
+ Executive::execute_block(block)
+ }
+
+ fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode {
+ Executive::initialize_block(header)
+ }
+ }
+
+ impl sp_api::Metadata for Runtime {
+ fn metadata() -> OpaqueMetadata {
+ OpaqueMetadata::new(Runtime::metadata().into())
+ }
+
+ fn metadata_at_version(version: u32) -> Option {
+ Runtime::metadata_at_version(version)
+ }
+
+ fn metadata_versions() -> sp_std::vec::Vec {
+ Runtime::metadata_versions()
+ }
+ }
+
+ impl sp_block_builder::BlockBuilder for Runtime {
+ fn apply_extrinsic(
+ extrinsic: ::Extrinsic,
+ ) -> ApplyExtrinsicResult {
+ Executive::apply_extrinsic(extrinsic)
+ }
+
+ fn finalize_block() -> ::Header {
+ Executive::finalize_block()
+ }
+
+ fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> {
+ data.create_extrinsics()
+ }
+
+ fn check_inherents(block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult {
+ data.check_extrinsics(&block)
+ }
+ }
+
+ impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime {
+ fn validate_transaction(
+ source: TransactionSource,
+ tx: ::Extrinsic,
+ block_hash: ::Hash,
+ ) -> TransactionValidity {
+ Executive::validate_transaction(source, tx, block_hash)
+ }
+ }
+
+ impl sp_offchain::OffchainWorkerApi for Runtime {
+ fn offchain_worker(header: &::Header) {
+ Executive::offchain_worker(header)
+ }
+ }
+
+ impl sp_session::SessionKeys for Runtime {
+ fn generate_session_keys(seed: Option>) -> Vec {
+ SessionKeys::generate(seed)
+ }
+
+ fn decode_session_keys(
+ encoded: Vec,
+ ) -> Option, KeyTypeId)>> {
+ SessionKeys::decode_into_raw_public_keys(&encoded)
+ }
+ }
+
+ impl cumulus_primitives_core::CollectCollationInfo for Runtime {
+ fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo {
+ ParachainSystem::collect_collation_info(header)
+ }
+ }
+
+ 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)
+ }
+ }
+}
+
+cumulus_pallet_parachain_system::register_validate_block! {
+ Runtime = Runtime,
+ BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::,
+}
diff --git a/cumulus/parachains/runtimes/starters/shell/src/lib.rs b/cumulus/parachains/runtimes/starters/shell/src/lib.rs
new file mode 100644
index 0000000000000..6174a9028ad05
--- /dev/null
+++ b/cumulus/parachains/runtimes/starters/shell/src/lib.rs
@@ -0,0 +1,449 @@
+// 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 .
+
+//! # Shell Runtime
+//!
+//! The Shell runtime defines a minimal parachain. It can listen for a downward message authorizing
+//! an upgrade into another parachain.
+//!
+//! Generally (so far) only used as the first parachain on a Relay.
+
+#![cfg_attr(not(feature = "std"), no_std)]
+// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256.
+#![recursion_limit = "256"]
+
+// Make the WASM binary available.
+#[cfg(feature = "std")]
+include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
+
+pub mod xcm_config;
+
+use codec::{Decode, Encode};
+use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases;
+use cumulus_primitives_core::AggregateMessageOrigin;
+use scale_info::TypeInfo;
+use sp_api::impl_runtime_apis;
+pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;
+use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
+use sp_runtime::{
+ create_runtime_str, generic, impl_opaque_keys,
+ traits::{
+ AccountIdLookup, BlakeTwo256, Block as BlockT, DispatchInfoOf, OriginOf,
+ TransactionExtension, TransactionExtensionBase, ValidateResult,
+ },
+ transaction_validity::{
+ InvalidTransaction, TransactionSource, TransactionValidity, TransactionValidityError,
+ },
+ ApplyExtrinsicResult,
+};
+use sp_std::prelude::*;
+#[cfg(feature = "std")]
+use sp_version::NativeVersion;
+use sp_version::RuntimeVersion;
+
+// A few exports that help ease life for downstream crates.
+pub use frame_support::{
+ construct_runtime, derive_impl,
+ dispatch::DispatchClass,
+ genesis_builder_helper::{build_config, create_default_config},
+ parameter_types,
+ traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, IsInVec, Randomness},
+ weights::{
+ constants::{
+ BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND,
+ },
+ IdentityFee, Weight,
+ },
+ StorageValue,
+};
+use frame_system::limits::{BlockLength, BlockWeights};
+use parachains_common::{AccountId, Signature};
+#[cfg(any(feature = "std", test))]
+pub use sp_runtime::BuildStorage;
+pub use sp_runtime::{Perbill, Permill};
+
+impl_opaque_keys! {
+ pub struct SessionKeys {
+ pub aura: Aura,
+ }
+}
+
+/// This runtime version.
+#[sp_version::runtime_version]
+pub const VERSION: RuntimeVersion = RuntimeVersion {
+ spec_name: create_runtime_str!("shell"),
+ impl_name: create_runtime_str!("shell"),
+ authoring_version: 1,
+ spec_version: 2,
+ impl_version: 0,
+ apis: RUNTIME_API_VERSIONS,
+ transaction_version: 1,
+ state_version: 0,
+};
+
+/// The version information used to identify this runtime when compiled natively.
+#[cfg(feature = "std")]
+pub fn native_version() -> NativeVersion {
+ NativeVersion { runtime_version: VERSION, can_author_with: Default::default() }
+}
+
+/// Maximum number of blocks simultaneously accepted by the Runtime, not yet included
+/// into the relay chain.
+const UNINCLUDED_SEGMENT_CAPACITY: u32 = 1;
+/// How many parachain blocks are processed by the relay chain per parent. Limits the
+/// number of blocks authored per slot.
+const BLOCK_PROCESSING_VELOCITY: u32 = 1;
+/// Relay chain slot duration, in milliseconds.
+const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000;
+
+/// We assume that ~10% of the block weight is consumed by `on_initialize` handlers.
+/// This is used to limit the maximal weight of a single extrinsic.
+const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10);
+/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used
+/// by Operational extrinsics.
+const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75);
+/// We allow for .5 seconds of compute with a 12 second average block time.
+const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(
+ WEIGHT_REF_TIME_PER_SECOND.saturating_div(2),
+ cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64,
+);
+
+parameter_types! {
+ pub const BlockHashCount: BlockNumber = 250;
+ pub const Version: RuntimeVersion = VERSION;
+ pub RuntimeBlockLength: BlockLength =
+ BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);
+ pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder()
+ .base_block(BlockExecutionWeight::get())
+ .for_class(DispatchClass::all(), |weights| {
+ weights.base_extrinsic = ExtrinsicBaseWeight::get();
+ })
+ .for_class(DispatchClass::Normal, |weights| {
+ weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT);
+ })
+ .for_class(DispatchClass::Operational, |weights| {
+ weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT);
+ // Operational transactions have some extra reserved space, so that they
+ // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`.
+ weights.reserved = Some(
+ MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT
+ );
+ })
+ .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO)
+ .build_or_panic();
+ pub const SS58Prefix: u8 = 42;
+}
+
+#[derive_impl(frame_system::config_preludes::TestDefaultConfig)]
+impl frame_system::Config for Runtime {
+ /// The identifier used to distinguish between accounts.
+ type AccountId = AccountId;
+ /// The aggregated dispatch type that is available for extrinsics.
+ type RuntimeCall = RuntimeCall;
+ /// The lookup mechanism to get account ID from whatever is passed in dispatchers.
+ type Lookup = AccountIdLookup;
+ /// The index type for storing how many extrinsics an account has signed.
+ type Nonce = Nonce;
+ /// The type for hashing blocks and tries.
+ type Hash = Hash;
+ /// The hashing algorithm used.
+ type Hashing = BlakeTwo256;
+ /// The block type.
+ type Block = Block;
+ /// The ubiquitous event type.
+ type RuntimeEvent = RuntimeEvent;
+ /// The ubiquitous origin type.
+ type RuntimeOrigin = RuntimeOrigin;
+ /// Maximum number of block number to block hash mappings to keep (oldest pruned first).
+ type BlockHashCount = BlockHashCount;
+ /// Runtime version.
+ type Version = Version;
+ /// Converts a module to an index of this module in the runtime.
+ type PalletInfo = PalletInfo;
+ type AccountData = ();
+ type OnNewAccount = ();
+ type OnKilledAccount = ();
+ type DbWeight = ();
+ type BaseCallFilter = frame_support::traits::Everything;
+ type SystemWeightInfo = ();
+ type BlockWeights = RuntimeBlockWeights;
+ type BlockLength = RuntimeBlockLength;
+ type SS58Prefix = SS58Prefix;
+ type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode;
+ type MaxConsumers = frame_support::traits::ConstU32<16>;
+}
+
+parameter_types! {
+ pub const RelayOrigin: AggregateMessageOrigin = AggregateMessageOrigin::Parent;
+ pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4);
+}
+
+impl cumulus_pallet_parachain_system::Config for Runtime {
+ type WeightInfo = ();
+ type RuntimeEvent = RuntimeEvent;
+ type OnSystemEvent = ();
+ type SelfParaId = parachain_info::Pallet;
+ type OutboundXcmpMessageSource = ();
+ type DmpQueue = frame_support::traits::EnqueueWithOrigin;
+ type ReservedDmpWeight = ReservedDmpWeight;
+ type XcmpMessageHandler = ();
+ type ReservedXcmpWeight = ();
+ type CheckAssociatedRelayNumber = RelayNumberMonotonicallyIncreases;
+ type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook<
+ Runtime,
+ RELAY_CHAIN_SLOT_DURATION_MILLIS,
+ BLOCK_PROCESSING_VELOCITY,
+ UNINCLUDED_SEGMENT_CAPACITY,
+ >;
+}
+
+impl parachain_info::Config for Runtime {}
+
+parameter_types! {
+ pub MessageQueueServiceWeight: Weight = Perbill::from_percent(35) * RuntimeBlockWeights::get().max_block;
+}
+
+impl pallet_message_queue::Config for Runtime {
+ type RuntimeEvent = RuntimeEvent;
+ type WeightInfo = ();
+ #[cfg(feature = "runtime-benchmarks")]
+ type MessageProcessor = pallet_message_queue::mock_helpers::NoopMessageProcessor<
+ cumulus_primitives_core::AggregateMessageOrigin,
+ >;
+ #[cfg(not(feature = "runtime-benchmarks"))]
+ type MessageProcessor = xcm_builder::ProcessXcmMessage<
+ AggregateMessageOrigin,
+ xcm_executor::XcmExecutor,
+ RuntimeCall,
+ >;
+ type Size = u32;
+ // These need to be configured to the XCMP pallet - if it is deployed.
+ type QueueChangeHandler = ();
+ type QueuePausedQuery = ();
+ type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>;
+ type MaxStale = sp_core::ConstU32<8>;
+ type ServiceWeight = MessageQueueServiceWeight;
+}
+
+impl cumulus_pallet_aura_ext::Config for Runtime {}
+
+impl pallet_aura::Config for Runtime {
+ type AuthorityId = AuraId;
+ type DisabledValidators = ();
+ type MaxAuthorities = ConstU32<100_000>;
+ type AllowMultipleBlocksPerSlot = ConstBool;
+ type SlotDuration = pallet_aura::MinimumPeriodTimesTwo;
+}
+
+impl pallet_timestamp::Config for Runtime {
+ type Moment = u64;
+ type OnTimestampSet = Aura;
+ type MinimumPeriod = ConstU64<0>;
+ type WeightInfo = ();
+}
+
+construct_runtime! {
+ pub enum Runtime
+ {
+ System: frame_system,
+ Timestamp: pallet_timestamp,
+
+ ParachainSystem: cumulus_pallet_parachain_system,
+ ParachainInfo: parachain_info,
+
+ CumulusXcm: cumulus_pallet_xcm,
+ MessageQueue: pallet_message_queue,
+
+ Aura: pallet_aura,
+ AuraExt: cumulus_pallet_aura_ext,
+ }
+}
+
+/// Simple implementation which fails any transaction which is signed.
+#[derive(Eq, PartialEq, Clone, Default, sp_core::RuntimeDebug, Encode, Decode, TypeInfo)]
+pub struct DisallowSigned;
+
+impl TransactionExtensionBase for DisallowSigned {
+ const IDENTIFIER: &'static str = "DisallowSigned";
+ type Implicit = ();
+}
+
+impl TransactionExtension for DisallowSigned {
+ type Val = ();
+ type Pre = ();
+ fn validate(
+ &self,
+ _origin: OriginOf,
+ _call: &RuntimeCall,
+ _info: &DispatchInfoOf,
+ _len: usize,
+ _context: &mut C,
+ _self_implicit: Self::Implicit,
+ _inherited_implication: &impl Encode,
+ ) -> ValidateResult {
+ Err(InvalidTransaction::BadProof.into())
+ }
+ fn prepare(
+ self,
+ _val: Self::Val,
+ _origin: &OriginOf,
+ _call: &RuntimeCall,
+ _info: &DispatchInfoOf,
+ _len: usize,
+ _context: &C,
+ ) -> Result {
+ Err(InvalidTransaction::BadProof.into())
+ }
+}
+
+/// Index of a transaction in the chain.
+pub type Nonce = u32;
+/// A hash of some data used by the chain.
+pub type Hash = sp_core::H256;
+/// An index to a block.
+pub type BlockNumber = u32;
+/// The address format for describing accounts.
+pub type Address = sp_runtime::MultiAddress;
+/// Block header type as expected by this runtime.
+pub type Header = generic::Header;
+/// Block type as expected by this runtime.
+pub type Block = generic::Block;
+/// A Block signed with a Justification
+pub type SignedBlock = generic::SignedBlock;
+/// BlockId type as expected by this runtime.
+pub type BlockId = generic::BlockId;
+/// The extension to the basic transaction logic.
+pub type TxExtension = DisallowSigned;
+/// Unchecked extrinsic type as expected by this runtime.
+pub type UncheckedExtrinsic =
+ generic::UncheckedExtrinsic;
+/// Executive: handles dispatch to the various modules.
+pub type Executive = frame_executive::Executive<
+ Runtime,
+ Block,
+ frame_system::ChainContext,
+ Runtime,
+ AllPalletsWithSystem,
+>;
+
+impl_runtime_apis! {
+ impl sp_consensus_aura::AuraApi for Runtime {
+ fn slot_duration() -> sp_consensus_aura::SlotDuration {
+ sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration())
+ }
+
+ fn authorities() -> Vec {
+ pallet_aura::Authorities::::get().into_inner()
+ }
+ }
+
+ impl sp_api::Core for Runtime {
+ fn version() -> RuntimeVersion {
+ VERSION
+ }
+
+ fn execute_block(block: Block) {
+ Executive::execute_block(block)
+ }
+
+ fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode {
+ Executive::initialize_block(header)
+ }
+ }
+
+ impl sp_api::Metadata for Runtime {
+ fn metadata() -> OpaqueMetadata {
+ OpaqueMetadata::new(Runtime::metadata().into())
+ }
+
+ fn metadata_at_version(version: u32) -> Option {
+ Runtime::metadata_at_version(version)
+ }
+
+ fn metadata_versions() -> sp_std::vec::Vec {
+ Runtime::metadata_versions()
+ }
+ }
+
+ impl sp_block_builder::BlockBuilder for Runtime {
+ fn apply_extrinsic(
+ extrinsic: ::Extrinsic,
+ ) -> ApplyExtrinsicResult {
+ Executive::apply_extrinsic(extrinsic)
+ }
+
+ fn finalize_block() -> ::Header {
+ Executive::finalize_block()
+ }
+
+ fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> {
+ data.create_extrinsics()
+ }
+
+ fn check_inherents(block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult {
+ data.check_extrinsics(&block)
+ }
+ }
+
+ impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime {
+ fn validate_transaction(
+ source: TransactionSource,
+ tx: ::Extrinsic,
+ block_hash: ::Hash,
+ ) -> TransactionValidity {
+ Executive::validate_transaction(source, tx, block_hash)
+ }
+ }
+
+ impl sp_offchain::OffchainWorkerApi for Runtime {
+ fn offchain_worker(header: &::Header) {
+ Executive::offchain_worker(header)
+ }
+ }
+
+ impl sp_session::SessionKeys for Runtime {
+ fn generate_session_keys(seed: Option>) -> Vec {
+ SessionKeys::generate(seed)
+ }
+
+ fn decode_session_keys(
+ encoded: Vec,
+ ) -> Option, KeyTypeId)>> {
+ SessionKeys::decode_into_raw_public_keys(&encoded)
+ }
+ }
+
+ impl cumulus_primitives_core::CollectCollationInfo for Runtime {
+ fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo {
+ ParachainSystem::collect_collation_info(header)
+ }
+ }
+
+ 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)
+ }
+ }
+}
+
+cumulus_pallet_parachain_system::register_validate_block! {
+ Runtime = Runtime,
+ BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::,
+}
diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml
index bbc1185db0d87..bd1b68dcb1c63 100644
--- a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml
+++ b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml
@@ -134,6 +134,7 @@ runtime-benchmarks = [
"sp-runtime/runtime-benchmarks",
"xcm-builder/runtime-benchmarks",
"xcm-executor/runtime-benchmarks",
+ "cumulus-primitives-storage-weight-reclaim/runtime-benchmarks"
]
# A feature that should be enabled when the runtime should be built for on-chain
diff --git a/cumulus/primitives/storage-weight-reclaim/Cargo.toml b/cumulus/primitives/storage-weight-reclaim/Cargo.toml
index e1ae6743335ab..eda0bbb224dba 100644
--- a/cumulus/primitives/storage-weight-reclaim/Cargo.toml
+++ b/cumulus/primitives/storage-weight-reclaim/Cargo.toml
@@ -31,6 +31,13 @@ cumulus-test-runtime = { workspace = true }
[features]
default = ["std"]
+runtime-benchmarks = [
+ "cumulus-primitives-core/runtime-benchmarks",
+ "frame-benchmarking/runtime-benchmarks",
+ "frame-support/runtime-benchmarks",
+ "frame-system/runtime-benchmarks",
+ "sp-runtime/runtime-benchmarks",
+]
std = [
"codec/std",
"cumulus-primitives-core/std",
@@ -40,6 +47,7 @@ std = [
"frame-system/std",
"log/std",
"scale-info/std",
+ "sp-core/std",
"sp-io/std",
"sp-runtime/std",
"sp-trie/std",
diff --git a/cumulus/primitives/storage-weight-reclaim/src/benchmarking.rs b/cumulus/primitives/storage-weight-reclaim/src/benchmarking.rs
new file mode 100644
index 0000000000000..2980d08271a2c
--- /dev/null
+++ b/cumulus/primitives/storage-weight-reclaim/src/benchmarking.rs
@@ -0,0 +1,70 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Benchmarking setup for cumulus-primitives-storage-weight-reclaim
+
+#![cfg(feature = "runtime-benchmarks")]
+
+use super::*;
+
+use frame_benchmarking::{account, v2::*, BenchmarkError};
+use frame_support::pallet_prelude::DispatchClass;
+use frame_system::{BlockWeight, RawOrigin};
+use sp_runtime::traits::{DispatchTransaction, Get};
+use sp_std::{
+ marker::{Send, Sync},
+ prelude::*,
+};
+
+/// Pallet we're benchmarking here.
+pub struct Pallet(frame_system::Pallet);
+
+#[benchmarks(where
+ T: Send + Sync,
+ T::RuntimeCall: Dispatchable
+)]
+mod benchmarks {
+ use super::*;
+
+ #[benchmark]
+ fn storage_weight_reclaim() -> Result<(), BenchmarkError> {
+ let caller = account("caller", 0, 0);
+ BlockWeight::::mutate(|current_weight| {
+ current_weight.set(Weight::from_parts(0, 1000), DispatchClass::Normal);
+ });
+ let base_extrinsic = ::BlockWeights::get()
+ .get(DispatchClass::Normal)
+ .base_extrinsic;
+ let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() };
+ let call: T::RuntimeCall = frame_system::Call::remark { remark: vec![] }.into();
+ let post_info = PostDispatchInfo {
+ actual_weight: Some(Weight::from_parts(0, 200)),
+ pays_fee: Default::default(),
+ };
+ let len = 0_usize;
+ let ext = StorageWeightReclaim::::new();
+
+ #[block]
+ {
+ ext.test_run(RawOrigin::Signed(caller).into(), &call, &info, len, |_| Ok(post_info))
+ .unwrap()
+ .unwrap();
+ }
+
+ assert_eq!(BlockWeight::::get().total().proof_size(), 700 + base_extrinsic.proof_size());
+
+ Ok(())
+ }
+}
diff --git a/cumulus/primitives/storage-weight-reclaim/src/lib.rs b/cumulus/primitives/storage-weight-reclaim/src/lib.rs
index 5471640695ca2..670405698e486 100644
--- a/cumulus/primitives/storage-weight-reclaim/src/lib.rs
+++ b/cumulus/primitives/storage-weight-reclaim/src/lib.rs
@@ -39,6 +39,12 @@ use sp_runtime::{
#[cfg(test)]
mod tests;
+#[cfg(test)]
+mod tests;
+
+#[cfg(feature = "runtime-benchmarks")]
+mod benchmarking;
+
const LOG_TARGET: &'static str = "runtime::storage_reclaim";
/// `StorageWeightReclaimer` is a mechanism for manually reclaiming storage weight.
diff --git a/cumulus/test/client/Cargo.toml b/cumulus/test/client/Cargo.toml
index 33023816c718c..b079c5f041003 100644
--- a/cumulus/test/client/Cargo.toml
+++ b/cumulus/test/client/Cargo.toml
@@ -50,6 +50,7 @@ cumulus-primitives-storage-weight-reclaim = { workspace = true, default-features
[features]
runtime-benchmarks = [
"cumulus-primitives-core/runtime-benchmarks",
+ "cumulus-primitives-storage-weight-reclaim/runtime-benchmarks",
"cumulus-test-service/runtime-benchmarks",
"frame-system/runtime-benchmarks",
"pallet-balances/runtime-benchmarks",
diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml
index 3ef9424b9ed6b..1002f4215e38b 100644
--- a/cumulus/test/service/Cargo.toml
+++ b/cumulus/test/service/Cargo.toml
@@ -107,6 +107,7 @@ substrate-test-utils = { workspace = true }
runtime-benchmarks = [
"cumulus-pallet-parachain-system/runtime-benchmarks",
"cumulus-primitives-core/runtime-benchmarks",
+ "cumulus-primitives-storage-weight-reclaim/runtime-benchmarks",
"cumulus-test-client/runtime-benchmarks",
"frame-system/runtime-benchmarks",
"pallet-timestamp/runtime-benchmarks",
diff --git a/polkadot/runtime/common/src/claims.rs b/polkadot/runtime/common/src/claims.rs
index 2b36c19efce78..84b58e5c692e9 100644
--- a/polkadot/runtime/common/src/claims.rs
+++ b/polkadot/runtime/common/src/claims.rs
@@ -93,7 +93,7 @@ pub enum StatementKind {
impl StatementKind {
/// Convert this to the (English) statement it represents.
- fn to_text(self) -> &'static [u8] {
+ pub fn to_text(self) -> &'static [u8] {
match self {
StatementKind::Regular =>
&b"I hereby agree to the terms of the statement whose SHA-256 multihash is \
@@ -701,7 +701,7 @@ mod secp_utils {
}
#[cfg(test)]
-mod tests {
+pub(super) mod tests {
use super::*;
use hex_literal::hex;
use secp_utils::*;
@@ -1437,7 +1437,7 @@ mod tests {
}
#[cfg(feature = "runtime-benchmarks")]
-mod benchmarking {
+pub(super) mod benchmarking {
use super::*;
use crate::claims::Call;
use frame_benchmarking::{account, benchmarks};
diff --git a/polkadot/runtime/rococo/src/weights/runtime_common_claims.rs b/polkadot/runtime/rococo/src/weights/runtime_common_claims.rs
new file mode 100644
index 0000000000000..de2bb71933b7a
--- /dev/null
+++ b/polkadot/runtime/rococo/src/weights/runtime_common_claims.rs
@@ -0,0 +1,182 @@
+// 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 `runtime_common::claims`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
+//! DATE: 2024-02-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024
+
+// Executed Command:
+// ./target/production/polkadot
+// benchmark
+// pallet
+// --chain=rococo-dev
+// --steps=50
+// --repeat=20
+// --no-storage-info
+// --no-median-slopes
+// --no-min-squares
+// --pallet=runtime_common::claims
+// --extrinsic=*
+// --execution=wasm
+// --wasm-execution=compiled
+// --header=./polkadot/file_header.txt
+// --output=./polkadot/runtime/rococo/src/weights/runtime_common_claims.rs
+
+#![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 `runtime_common::claims`.
+pub struct WeightInfo(PhantomData);
+impl runtime_common::claims::WeightInfo for WeightInfo {
+ /// Storage: `Claims::Claims` (r:1 w:1)
+ /// Proof: `Claims::Claims` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Signing` (r:1 w:1)
+ /// Proof: `Claims::Signing` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Total` (r:1 w:1)
+ /// Proof: `Claims::Total` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Vesting` (r:1 w:1)
+ /// Proof: `Claims::Vesting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Vesting::Vesting` (r:1 w:1)
+ /// Proof: `Vesting::Vesting` (`max_values`: None, `max_size`: Some(1057), added: 3532, mode: `MaxEncodedLen`)
+ /// Storage: `System::Account` (r:1 w:0)
+ /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
+ /// Storage: `Balances::Locks` (r:1 w:1)
+ /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`)
+ /// Storage: `Balances::Freezes` (r:1 w:0)
+ /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`)
+ fn claim() -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `558`
+ // Estimated: `4764`
+ // Minimum execution time: 181_028_000 picoseconds.
+ Weight::from_parts(194_590_000, 0)
+ .saturating_add(Weight::from_parts(0, 4764))
+ .saturating_add(T::DbWeight::get().reads(8))
+ .saturating_add(T::DbWeight::get().writes(6))
+ }
+ /// Storage: `Claims::Total` (r:1 w:1)
+ /// Proof: `Claims::Total` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Vesting` (r:0 w:1)
+ /// Proof: `Claims::Vesting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Claims` (r:0 w:1)
+ /// Proof: `Claims::Claims` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Signing` (r:0 w:1)
+ /// Proof: `Claims::Signing` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ fn mint_claim() -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `216`
+ // Estimated: `1701`
+ // Minimum execution time: 11_224_000 picoseconds.
+ Weight::from_parts(13_342_000, 0)
+ .saturating_add(Weight::from_parts(0, 1701))
+ .saturating_add(T::DbWeight::get().reads(1))
+ .saturating_add(T::DbWeight::get().writes(4))
+ }
+ /// Storage: `Claims::Claims` (r:1 w:1)
+ /// Proof: `Claims::Claims` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Signing` (r:1 w:1)
+ /// Proof: `Claims::Signing` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Total` (r:1 w:1)
+ /// Proof: `Claims::Total` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Vesting` (r:1 w:1)
+ /// Proof: `Claims::Vesting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Vesting::Vesting` (r:1 w:1)
+ /// Proof: `Vesting::Vesting` (`max_values`: None, `max_size`: Some(1057), added: 3532, mode: `MaxEncodedLen`)
+ /// Storage: `System::Account` (r:1 w:0)
+ /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
+ /// Storage: `Balances::Locks` (r:1 w:1)
+ /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`)
+ /// Storage: `Balances::Freezes` (r:1 w:0)
+ /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`)
+ fn claim_attest() -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `558`
+ // Estimated: `4764`
+ // Minimum execution time: 187_964_000 picoseconds.
+ Weight::from_parts(202_553_000, 0)
+ .saturating_add(Weight::from_parts(0, 4764))
+ .saturating_add(T::DbWeight::get().reads(8))
+ .saturating_add(T::DbWeight::get().writes(6))
+ }
+ /// Storage: `Claims::Preclaims` (r:1 w:1)
+ /// Proof: `Claims::Preclaims` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Signing` (r:1 w:1)
+ /// Proof: `Claims::Signing` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Claims` (r:1 w:1)
+ /// Proof: `Claims::Claims` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Total` (r:1 w:1)
+ /// Proof: `Claims::Total` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Vesting` (r:1 w:1)
+ /// Proof: `Claims::Vesting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Vesting::Vesting` (r:1 w:1)
+ /// Proof: `Vesting::Vesting` (`max_values`: None, `max_size`: Some(1057), added: 3532, mode: `MaxEncodedLen`)
+ /// Storage: `System::Account` (r:1 w:0)
+ /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
+ /// Storage: `Balances::Locks` (r:1 w:1)
+ /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`)
+ /// Storage: `Balances::Freezes` (r:1 w:0)
+ /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`)
+ fn attest() -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `632`
+ // Estimated: `4764`
+ // Minimum execution time: 78_210_000 picoseconds.
+ Weight::from_parts(84_581_000, 0)
+ .saturating_add(Weight::from_parts(0, 4764))
+ .saturating_add(T::DbWeight::get().reads(9))
+ .saturating_add(T::DbWeight::get().writes(7))
+ }
+ /// Storage: `Claims::Claims` (r:1 w:2)
+ /// Proof: `Claims::Claims` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Vesting` (r:1 w:2)
+ /// Proof: `Claims::Vesting` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Signing` (r:1 w:2)
+ /// Proof: `Claims::Signing` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Preclaims` (r:1 w:1)
+ /// Proof: `Claims::Preclaims` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ fn move_claim() -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `440`
+ // Estimated: `3905`
+ // Minimum execution time: 33_940_000 picoseconds.
+ Weight::from_parts(48_438_000, 0)
+ .saturating_add(Weight::from_parts(0, 3905))
+ .saturating_add(T::DbWeight::get().reads(4))
+ .saturating_add(T::DbWeight::get().writes(7))
+ }
+ /// Storage: `Claims::Preclaims` (r:1 w:0)
+ /// Proof: `Claims::Preclaims` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Claims::Signing` (r:1 w:0)
+ /// Proof: `Claims::Signing` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ fn prevalidate_attests() -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `296`
+ // Estimated: `3761`
+ // Minimum execution time: 9_025_000 picoseconds.
+ Weight::from_parts(10_563_000, 0)
+ .saturating_add(Weight::from_parts(0, 3761))
+ .saturating_add(T::DbWeight::get().reads(2))
+ }
+}
diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs
new file mode 100644
index 0000000000000..a3b912491e5ec
--- /dev/null
+++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs
@@ -0,0 +1,329 @@
+// 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 `runtime_parachains::hrmp`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
+//! DATE: 2024-02-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024
+
+// Executed Command:
+// ./target/production/polkadot
+// benchmark
+// pallet
+// --chain=rococo-dev
+// --steps=50
+// --repeat=20
+// --no-storage-info
+// --no-median-slopes
+// --no-min-squares
+// --pallet=runtime_parachains::hrmp
+// --extrinsic=*
+// --execution=wasm
+// --wasm-execution=compiled
+// --header=./polkadot/file_header.txt
+// --output=./polkadot/runtime/rococo/src/weights/runtime_parachains_hrmp.rs
+
+#![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 `runtime_parachains::hrmp`.
+pub struct WeightInfo(PhantomData);
+impl runtime_parachains::hrmp::WeightInfo for WeightInfo {
+ /// 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:1 w:1)
+ /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1)
+ /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ fn hrmp_init_open_channel() -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `488`
+ // Estimated: `3953`
+ // Minimum execution time: 34_911_000 picoseconds.
+ Weight::from_parts(35_762_000, 0)
+ .saturating_add(Weight::from_parts(0, 3953))
+ .saturating_add(T::DbWeight::get().reads(8))
+ .saturating_add(T::DbWeight::get().writes(5))
+ }
+ /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1)
+ /// Proof: `Hrmp::HrmpOpenChannelRequests` (`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`)
+ /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1)
+ /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1)
+ /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ fn hrmp_accept_open_channel() -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `478`
+ // Estimated: `3943`
+ // Minimum execution time: 31_483_000 picoseconds.
+ Weight::from_parts(32_230_000, 0)
+ .saturating_add(Weight::from_parts(0, 3943))
+ .saturating_add(T::DbWeight::get().reads(5))
+ .saturating_add(T::DbWeight::get().writes(4))
+ }
+ /// Storage: `Hrmp::HrmpChannels` (r:1 w:0)
+ /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpCloseChannelRequests` (r:1 w:1)
+ /// Proof: `Hrmp::HrmpCloseChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpCloseChannelRequestsList` (r:1 w:1)
+ /// Proof: `Hrmp::HrmpCloseChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1)
+ /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1)
+ /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ fn hrmp_close_channel() -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `591`
+ // Estimated: `4056`
+ // Minimum execution time: 32_153_000 picoseconds.
+ Weight::from_parts(32_982_000, 0)
+ .saturating_add(Weight::from_parts(0, 4056))
+ .saturating_add(T::DbWeight::get().reads(5))
+ .saturating_add(T::DbWeight::get().writes(4))
+ }
+ /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpChannels` (r:254 w:254)
+ /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:0 w:1)
+ /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpChannelContents` (r:0 w:254)
+ /// Proof: `Hrmp::HrmpChannelContents` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:0 w:1)
+ /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// The range of component `i` is `[0, 127]`.
+ /// The range of component `e` is `[0, 127]`.
+ fn force_clean_hrmp(i: u32, e: u32, ) -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `297 + e * (100 ±0) + i * (100 ±0)`
+ // Estimated: `3759 + e * (2575 ±0) + i * (2575 ±0)`
+ // Minimum execution time: 1_240_769_000 picoseconds.
+ Weight::from_parts(1_249_285_000, 0)
+ .saturating_add(Weight::from_parts(0, 3759))
+ // Standard Error: 112_346
+ .saturating_add(Weight::from_parts(3_449_114, 0).saturating_mul(i.into()))
+ // Standard Error: 112_346
+ .saturating_add(Weight::from_parts(3_569_184, 0).saturating_mul(e.into()))
+ .saturating_add(T::DbWeight::get().reads(2))
+ .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(i.into())))
+ .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(e.into())))
+ .saturating_add(T::DbWeight::get().writes(4))
+ .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(i.into())))
+ .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(e.into())))
+ .saturating_add(Weight::from_parts(0, 2575).saturating_mul(e.into()))
+ .saturating_add(Weight::from_parts(0, 2575).saturating_mul(i.into()))
+ }
+ /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1)
+ /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ParaLifecycles` (r:256 w:0)
+ /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpOpenChannelRequestCount` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpAcceptedChannelRequestCount` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpAcceptedChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpChannels` (r:0 w:128)
+ /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// The range of component `c` is `[0, 128]`.
+ fn force_process_hrmp_open(c: u32, ) -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `525 + c * (136 ±0)`
+ // Estimated: `1980 + c * (5086 ±0)`
+ // Minimum execution time: 6_026_000 picoseconds.
+ Weight::from_parts(6_257_000, 0)
+ .saturating_add(Weight::from_parts(0, 1980))
+ // Standard Error: 9_732
+ .saturating_add(Weight::from_parts(21_049_890, 0).saturating_mul(c.into()))
+ .saturating_add(T::DbWeight::get().reads(1))
+ .saturating_add(T::DbWeight::get().reads((7_u64).saturating_mul(c.into())))
+ .saturating_add(T::DbWeight::get().writes(1))
+ .saturating_add(T::DbWeight::get().writes((6_u64).saturating_mul(c.into())))
+ .saturating_add(Weight::from_parts(0, 5086).saturating_mul(c.into()))
+ }
+ /// Storage: `Hrmp::HrmpCloseChannelRequestsList` (r:1 w:1)
+ /// Proof: `Hrmp::HrmpCloseChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpChannels` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpChannels` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpEgressChannelsIndex` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpEgressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpIngressChannelsIndex` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpIngressChannelsIndex` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpCloseChannelRequests` (r:0 w:128)
+ /// Proof: `Hrmp::HrmpCloseChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpChannelContents` (r:0 w:128)
+ /// Proof: `Hrmp::HrmpChannelContents` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// The range of component `c` is `[0, 128]`.
+ fn force_process_hrmp_close(c: u32, ) -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `368 + c * (124 ±0)`
+ // Estimated: `1828 + c * (2600 ±0)`
+ // Minimum execution time: 4_991_000 picoseconds.
+ Weight::from_parts(984_758, 0)
+ .saturating_add(Weight::from_parts(0, 1828))
+ // Standard Error: 11_918
+ .saturating_add(Weight::from_parts(13_018_813, 0).saturating_mul(c.into()))
+ .saturating_add(T::DbWeight::get().reads(1))
+ .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(c.into())))
+ .saturating_add(T::DbWeight::get().writes(1))
+ .saturating_add(T::DbWeight::get().writes((5_u64).saturating_mul(c.into())))
+ .saturating_add(Weight::from_parts(0, 2600).saturating_mul(c.into()))
+ }
+ /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1)
+ /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `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::HrmpOpenChannelRequestCount` (r:1 w:1)
+ /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// The range of component `c` is `[0, 128]`.
+ fn hrmp_cancel_open_request(c: u32, ) -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `1059 + c * (13 ±0)`
+ // Estimated: `4328 + c * (15 ±0)`
+ // Minimum execution time: 17_299_000 picoseconds.
+ Weight::from_parts(27_621_478, 0)
+ .saturating_add(Weight::from_parts(0, 4328))
+ // Standard Error: 2_527
+ .saturating_add(Weight::from_parts(121_149, 0).saturating_mul(c.into()))
+ .saturating_add(T::DbWeight::get().reads(3))
+ .saturating_add(T::DbWeight::get().writes(3))
+ .saturating_add(Weight::from_parts(0, 15).saturating_mul(c.into()))
+ }
+ /// Storage: `Hrmp::HrmpOpenChannelRequestsList` (r:1 w:1)
+ /// Proof: `Hrmp::HrmpOpenChannelRequestsList` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:128 w:128)
+ /// Proof: `Hrmp::HrmpOpenChannelRequests` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// The range of component `c` is `[0, 128]`.
+ fn clean_open_channel_requests(c: u32, ) -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `276 + c * (63 ±0)`
+ // Estimated: `1755 + c * (2538 ±0)`
+ // Minimum execution time: 3_764_000 picoseconds.
+ Weight::from_parts(5_935_301, 0)
+ .saturating_add(Weight::from_parts(0, 1755))
+ // Standard Error: 3_761
+ .saturating_add(Weight::from_parts(3_290_277, 0).saturating_mul(c.into()))
+ .saturating_add(T::DbWeight::get().reads(1))
+ .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into())))
+ .saturating_add(T::DbWeight::get().writes(1))
+ .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into())))
+ .saturating_add(Weight::from_parts(0, 2538).saturating_mul(c.into()))
+ }
+ /// Storage: `Hrmp::HrmpOpenChannelRequests` (r:1 w:1)
+ /// Proof: `Hrmp::HrmpOpenChannelRequests` (`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: `Hrmp::HrmpOpenChannelRequestCount` (r:1 w:1)
+ /// Proof: `Hrmp::HrmpOpenChannelRequestCount` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ParaLifecycles` (r:1 w:0)
+ /// Proof: `Paras::ParaLifecycles` (`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: `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`)
+ /// The range of component `c` is `[0, 1]`.
+ fn force_open_hrmp_channel(c: u32, ) -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `488 + c * (235 ±0)`
+ // Estimated: `6428 + c * (235 ±0)`
+ // Minimum execution time: 49_506_000 picoseconds.
+ Weight::from_parts(51_253_075, 0)
+ .saturating_add(Weight::from_parts(0, 6428))
+ // Standard Error: 144_082
+ .saturating_add(Weight::from_parts(12_862_224, 0).saturating_mul(c.into()))
+ .saturating_add(T::DbWeight::get().reads(12))
+ .saturating_add(T::DbWeight::get().writes(8))
+ .saturating_add(Weight::from_parts(0, 235).saturating_mul(c.into()))
+ }
+ /// 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: `488`
+ // Estimated: `6428`
+ // Minimum execution time: 50_016_000 picoseconds.
+ Weight::from_parts(50_933_000, 0)
+ .saturating_add(Weight::from_parts(0, 6428))
+ .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: `296`
+ // Estimated: `3761`
+ // Minimum execution time: 12_280_000 picoseconds.
+ Weight::from_parts(12_863_000, 0)
+ .saturating_add(Weight::from_parts(0, 3761))
+ .saturating_add(T::DbWeight::get().reads(1))
+ .saturating_add(T::DbWeight::get().writes(1))
+ }
+}
diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_inclusion.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_inclusion.rs
new file mode 100644
index 0000000000000..b9ec7565bd555
--- /dev/null
+++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_inclusion.rs
@@ -0,0 +1,75 @@
+// 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 `runtime_parachains::inclusion`
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
+//! DATE: 2024-02-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! WORST CASE MAP SIZE: `1000000`
+//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
+//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024
+
+// Executed Command:
+// ./target/production/polkadot
+// benchmark
+// pallet
+// --chain=rococo-dev
+// --steps=50
+// --repeat=20
+// --no-storage-info
+// --no-median-slopes
+// --no-min-squares
+// --pallet=runtime_parachains::inclusion
+// --extrinsic=*
+// --execution=wasm
+// --wasm-execution=compiled
+// --header=./polkadot/file_header.txt
+// --output=./polkadot/runtime/rococo/src/weights/runtime_parachains_inclusion.rs
+
+#![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 `runtime_parachains::inclusion`.
+pub struct WeightInfo(PhantomData);
+impl runtime_parachains::inclusion::WeightInfo for WeightInfo {
+ /// Storage: `MessageQueue::BookStateFor` (r:1 w:1)
+ /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(55), added: 2530, mode: `MaxEncodedLen`)
+ /// Storage: `MessageQueue::Pages` (r:1 w:999)
+ /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(32818), added: 35293, mode: `MaxEncodedLen`)
+ /// Storage: UNKNOWN KEY `0x3a72656c61795f64697370617463685f71756575655f72656d61696e696e675f` (r:0 w:1)
+ /// Proof: UNKNOWN KEY `0x3a72656c61795f64697370617463685f71756575655f72656d61696e696e675f` (r:0 w:1)
+ /// Storage: UNKNOWN KEY `0xf5207f03cfdce586301014700e2c2593fad157e461d71fd4c1f936839a5f1f3e` (r:0 w:1)
+ /// Proof: UNKNOWN KEY `0xf5207f03cfdce586301014700e2c2593fad157e461d71fd4c1f936839a5f1f3e` (r:0 w:1)
+ /// The range of component `i` is `[1, 1000]`.
+ fn receive_upward_messages(i: u32, ) -> Weight {
+ // Proof Size summary in bytes:
+ // Measured: `32993`
+ // Estimated: `36283`
+ // Minimum execution time: 72_675_000 picoseconds.
+ Weight::from_parts(73_290_000, 0)
+ .saturating_add(Weight::from_parts(0, 36283))
+ // Standard Error: 16_067
+ .saturating_add(Weight::from_parts(57_735_739, 0).saturating_mul(i.into()))
+ .saturating_add(T::DbWeight::get().reads(2))
+ .saturating_add(T::DbWeight::get().writes(3))
+ .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+ }
+}
diff --git a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_assigned_slots.rs b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_assigned_slots.rs
index 08b0b0f34df13..e1ed770879caf 100644
--- a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_assigned_slots.rs
+++ b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_assigned_slots.rs
@@ -16,22 +16,22 @@
//! Autogenerated weights for `runtime_common::assigned_slots`
//!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2023-08-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
+//! DATE: 2024-02-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! WORST CASE MAP SIZE: `1000000`
//! HOSTNAME: `runner-ynta1nyy-project-163-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024
// Executed Command:
-// target/production/polkadot
+// ./target/production/polkadot
// benchmark
// pallet
+// --chain=rococo-dev
// --steps=50
// --repeat=20
-// --extrinsic=*
-// --wasm-execution=compiled
-// --heap-pages=4096
-// --json-file=/builds/parity/mirrors/polkadot/.git/.artifacts/bench.json
+// --no-storage-info
+// --no-median-slopes
+// --no-min-squares
// --pallet=runtime_common::assigned_slots
// --chain=westend-dev
// --header=./file_header.txt
@@ -74,9 +74,9 @@ impl polkadot_runtime_common::assigned_slots::WeightInf
Weight::from_parts(79_847_000, 0)
.saturating_add(Weight::from_parts(0, 4105))
.saturating_add(T::DbWeight::get().reads(9))
- .saturating_add(T::DbWeight::get().writes(6))
+ .saturating_add(T::DbWeight::get().writes(5))
}
- /// Storage: `Registrar::Paras` (r:1 w:1)
+ /// Storage: `Registrar::Paras` (r:1 w:0)
/// Proof: `Registrar::Paras` (`max_values`: None, `max_size`: None, mode: `Measured`)
/// Storage: `Paras::ParaLifecycles` (r:1 w:1)
/// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`)
@@ -104,7 +104,7 @@ impl polkadot_runtime_common::assigned_slots::WeightInf
Weight::from_parts(77_993_000, 0)
.saturating_add(Weight::from_parts(0, 4105))
.saturating_add(T::DbWeight::get().reads(10))
- .saturating_add(T::DbWeight::get().writes(7))
+ .saturating_add(T::DbWeight::get().writes(6))
}
/// Storage: `AssignedSlots::PermanentSlots` (r:1 w:0)
/// Proof: `AssignedSlots::PermanentSlots` (`max_values`: None, `max_size`: Some(20), added: 2495, mode: `MaxEncodedLen`)
diff --git a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_auctions.rs b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_auctions.rs
index 58ca2a083b2cb..de47d692fe34b 100644
--- a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_auctions.rs
+++ b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_auctions.rs
@@ -64,20 +64,20 @@ impl polkadot_runtime_common::auctions::WeightInfo for
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(2))
}
- /// Storage: Paras ParaLifecycles (r:1 w:0)
- /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured)
- /// Storage: Auctions AuctionCounter (r:1 w:0)
- /// Proof: Auctions AuctionCounter (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen)
- /// Storage: Auctions AuctionInfo (r:1 w:0)
- /// Proof: Auctions AuctionInfo (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen)
- /// Storage: Slots Leases (r:1 w:0)
- /// Proof Skipped: Slots Leases (max_values: None, max_size: None, mode: Measured)
- /// Storage: Auctions Winning (r:1 w:1)
- /// Proof: Auctions Winning (max_values: None, max_size: Some(1920), added: 4395, mode: MaxEncodedLen)
- /// Storage: Auctions ReservedAmounts (r:2 w:2)
- /// Proof: Auctions ReservedAmounts (max_values: None, max_size: Some(60), added: 2535, mode: MaxEncodedLen)
- /// Storage: System Account (r:1 w:1)
- /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen)
+ /// Storage: `Paras::ParaLifecycles` (r:1 w:0)
+ /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Auctions::AuctionCounter` (r:1 w:0)
+ /// Proof: `Auctions::AuctionCounter` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+ /// Storage: `Auctions::AuctionInfo` (r:1 w:0)
+ /// Proof: `Auctions::AuctionInfo` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+ /// Storage: `Slots::Leases` (r:1 w:0)
+ /// Proof: `Slots::Leases` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Auctions::Winning` (r:1 w:1)
+ /// Proof: `Auctions::Winning` (`max_values`: None, `max_size`: Some(1920), added: 4395, mode: `MaxEncodedLen`)
+ /// Storage: `Auctions::ReservedAmounts` (r:2 w:2)
+ /// Proof: `Auctions::ReservedAmounts` (`max_values`: None, `max_size`: Some(60), added: 2535, mode: `MaxEncodedLen`)
+ /// Storage: `System::Account` (r:1 w:1)
+ /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
fn bid() -> Weight {
// Proof Size summary in bytes:
// Measured: `571`
@@ -122,14 +122,14 @@ impl polkadot_runtime_common::auctions::WeightInfo for
.saturating_add(T::DbWeight::get().reads(3688))
.saturating_add(T::DbWeight::get().writes(3683))
}
- /// Storage: Auctions ReservedAmounts (r:37 w:36)
- /// Proof: Auctions ReservedAmounts (max_values: None, max_size: Some(60), added: 2535, mode: MaxEncodedLen)
- /// Storage: System Account (r:36 w:36)
- /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen)
- /// Storage: Auctions Winning (r:3600 w:3600)
- /// Proof: Auctions Winning (max_values: None, max_size: Some(1920), added: 4395, mode: MaxEncodedLen)
- /// Storage: Auctions AuctionInfo (r:0 w:1)
- /// Proof: Auctions AuctionInfo (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen)
+ /// Storage: `Auctions::ReservedAmounts` (r:37 w:36)
+ /// Proof: `Auctions::ReservedAmounts` (`max_values`: None, `max_size`: Some(60), added: 2535, mode: `MaxEncodedLen`)
+ /// Storage: `System::Account` (r:36 w:36)
+ /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
+ /// Storage: `Auctions::Winning` (r:3600 w:3600)
+ /// Proof: `Auctions::Winning` (`max_values`: None, `max_size`: Some(1920), added: 4395, mode: `MaxEncodedLen`)
+ /// Storage: `Auctions::AuctionInfo` (r:0 w:1)
+ /// Proof: `Auctions::AuctionInfo` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
fn cancel_auction() -> Weight {
// Proof Size summary in bytes:
// Measured: `177732`
diff --git a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_crowdloan.rs b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_crowdloan.rs
index 47472406de1e5..1e4304b016f97 100644
--- a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_crowdloan.rs
+++ b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_crowdloan.rs
@@ -68,24 +68,22 @@ impl polkadot_runtime_common::crowdloan::WeightInfo for
Weight::from_parts(73_165_000, 0)
.saturating_add(Weight::from_parts(0, 3903))
.saturating_add(T::DbWeight::get().reads(5))
- .saturating_add(T::DbWeight::get().writes(4))
+ .saturating_add(T::DbWeight::get().writes(3))
}
- /// Storage: Crowdloan Funds (r:1 w:1)
- /// Proof Skipped: Crowdloan Funds (max_values: None, max_size: None, mode: Measured)
- /// Storage: Slots Leases (r:1 w:0)
- /// Proof Skipped: Slots Leases (max_values: None, max_size: None, mode: Measured)
- /// Storage: Auctions AuctionInfo (r:1 w:0)
- /// Proof: Auctions AuctionInfo (max_values: Some(1), max_size: Some(8), added: 503, 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 InactiveIssuance (r:1 w:1)
- /// Proof: Balances InactiveIssuance (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen)
- /// Storage: Crowdloan EndingsCount (r:1 w:0)
- /// Proof Skipped: Crowdloan EndingsCount (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Crowdloan NewRaise (r:1 w:1)
- /// Proof Skipped: Crowdloan NewRaise (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: unknown `0xd861ea1ebf4800d4b89f4ff787ad79ee96d9a708c85b57da7eb8f9ddeda61291` (r:1 w:1)
- /// Proof Skipped: unknown `0xd861ea1ebf4800d4b89f4ff787ad79ee96d9a708c85b57da7eb8f9ddeda61291` (r:1 w:1)
+ /// Storage: `Crowdloan::Funds` (r:1 w:1)
+ /// Proof: `Crowdloan::Funds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Slots::Leases` (r:1 w:0)
+ /// Proof: `Slots::Leases` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Auctions::AuctionInfo` (r:1 w:0)
+ /// Proof: `Auctions::AuctionInfo` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+ /// Storage: `System::Account` (r:1 w:1)
+ /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
+ /// Storage: `Crowdloan::EndingsCount` (r:1 w:0)
+ /// Proof: `Crowdloan::EndingsCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Crowdloan::NewRaise` (r:1 w:1)
+ /// Proof: `Crowdloan::NewRaise` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: UNKNOWN KEY `0xd861ea1ebf4800d4b89f4ff787ad79ee96d9a708c85b57da7eb8f9ddeda61291` (r:1 w:1)
+ /// Proof: UNKNOWN KEY `0xd861ea1ebf4800d4b89f4ff787ad79ee96d9a708c85b57da7eb8f9ddeda61291` (r:1 w:1)
fn contribute() -> Weight {
// Proof Size summary in bytes:
// Measured: `424`
@@ -96,14 +94,12 @@ impl polkadot_runtime_common::crowdloan::WeightInfo for
.saturating_add(T::DbWeight::get().reads(8))
.saturating_add(T::DbWeight::get().writes(5))
}
- /// Storage: Crowdloan Funds (r:1 w:1)
- /// Proof Skipped: Crowdloan Funds (max_values: None, max_size: None, mode: Measured)
- /// Storage: System Account (r:2 w:2)
- /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen)
- /// Storage: Balances InactiveIssuance (r:1 w:1)
- /// Proof: Balances InactiveIssuance (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen)
- /// Storage: unknown `0xc85982571aa615c788ef9b2c16f54f25773fd439e8ee1ed2aa3ae43d48e880f0` (r:1 w:1)
- /// Proof Skipped: unknown `0xc85982571aa615c788ef9b2c16f54f25773fd439e8ee1ed2aa3ae43d48e880f0` (r:1 w:1)
+ /// Storage: `Crowdloan::Funds` (r:1 w:1)
+ /// Proof: `Crowdloan::Funds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `System::Account` (r:2 w:2)
+ /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
+ /// Storage: UNKNOWN KEY `0xc85982571aa615c788ef9b2c16f54f25773fd439e8ee1ed2aa3ae43d48e880f0` (r:1 w:1)
+ /// Proof: UNKNOWN KEY `0xc85982571aa615c788ef9b2c16f54f25773fd439e8ee1ed2aa3ae43d48e880f0` (r:1 w:1)
fn withdraw() -> Weight {
// Proof Size summary in bytes:
// Measured: `690`
@@ -111,8 +107,8 @@ impl polkadot_runtime_common::crowdloan::WeightInfo for
// Minimum execution time: 88_125_000 picoseconds.
Weight::from_parts(108_202_000, 0)
.saturating_add(Weight::from_parts(0, 6196))
- .saturating_add(T::DbWeight::get().reads(5))
- .saturating_add(T::DbWeight::get().writes(5))
+ .saturating_add(T::DbWeight::get().reads(4))
+ .saturating_add(T::DbWeight::get().writes(4))
}
/// Storage: Skipped Metadata (r:0 w:0)
/// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured)
@@ -128,17 +124,17 @@ impl polkadot_runtime_common::crowdloan::WeightInfo for
.saturating_add(Weight::from_parts(42_987_746, 0).saturating_mul(k.into()))
.saturating_add(T::DbWeight::get().reads(4))
.saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(k.into())))
- .saturating_add(T::DbWeight::get().writes(3))
+ .saturating_add(T::DbWeight::get().writes(2))
.saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(k.into())))
.saturating_add(Weight::from_parts(0, 189).saturating_mul(k.into()))
}
- /// Storage: Crowdloan Funds (r:1 w:1)
- /// Proof Skipped: Crowdloan Funds (max_values: None, max_size: None, mode: Measured)
- /// Storage: System Account (r:2 w:2)
- /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen)
+ /// Storage: `Crowdloan::Funds` (r:1 w:1)
+ /// Proof: `Crowdloan::Funds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `System::Account` (r:2 w:2)
+ /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
fn dissolve() -> Weight {
// Proof Size summary in bytes:
- // Measured: `515`
+ // Measured: `514`
// Estimated: `6196`
// Minimum execution time: 48_316_000 picoseconds.
Weight::from_parts(60_935_000, 0)
@@ -146,8 +142,8 @@ impl polkadot_runtime_common::crowdloan::WeightInfo for
.saturating_add(T::DbWeight::get().reads(3))
.saturating_add(T::DbWeight::get().writes(3))
}
- /// Storage: Crowdloan Funds (r:1 w:1)
- /// Proof Skipped: Crowdloan Funds (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `Crowdloan::Funds` (r:1 w:1)
+ /// Proof: `Crowdloan::Funds` (`max_values`: None, `max_size`: None, mode: `Measured`)
fn edit() -> Weight {
// Proof Size summary in bytes:
// Measured: `235`
@@ -158,10 +154,10 @@ impl polkadot_runtime_common::crowdloan::WeightInfo for
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
- /// Storage: Crowdloan Funds (r:1 w:0)
- /// Proof Skipped: Crowdloan Funds (max_values: None, max_size: None, mode: Measured)
- /// Storage: unknown `0xd861ea1ebf4800d4b89f4ff787ad79ee96d9a708c85b57da7eb8f9ddeda61291` (r:1 w:1)
- /// Proof Skipped: unknown `0xd861ea1ebf4800d4b89f4ff787ad79ee96d9a708c85b57da7eb8f9ddeda61291` (r:1 w:1)
+ /// Storage: `Crowdloan::Funds` (r:1 w:0)
+ /// Proof: `Crowdloan::Funds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: UNKNOWN KEY `0xd861ea1ebf4800d4b89f4ff787ad79ee96d9a708c85b57da7eb8f9ddeda61291` (r:1 w:1)
+ /// Proof: UNKNOWN KEY `0xd861ea1ebf4800d4b89f4ff787ad79ee96d9a708c85b57da7eb8f9ddeda61291` (r:1 w:1)
fn add_memo() -> Weight {
// Proof Size summary in bytes:
// Measured: `412`
@@ -172,10 +168,10 @@ impl polkadot_runtime_common::crowdloan::WeightInfo for
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
- /// Storage: Crowdloan Funds (r:1 w:0)
- /// Proof Skipped: Crowdloan Funds (max_values: None, max_size: None, mode: Measured)
- /// Storage: Crowdloan NewRaise (r:1 w:1)
- /// Proof Skipped: Crowdloan NewRaise (max_values: Some(1), max_size: None, mode: Measured)
+ /// Storage: `Crowdloan::Funds` (r:1 w:0)
+ /// Proof: `Crowdloan::Funds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Crowdloan::NewRaise` (r:1 w:1)
+ /// Proof: `Crowdloan::NewRaise` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
fn poke() -> Weight {
// Proof Size summary in bytes:
// Measured: `239`
@@ -186,26 +182,26 @@ impl polkadot_runtime_common::crowdloan::WeightInfo for
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
- /// Storage: Auctions AuctionInfo (r:1 w:0)
- /// Proof: Auctions AuctionInfo (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen)
- /// Storage: Crowdloan EndingsCount (r:1 w:1)
- /// Proof Skipped: Crowdloan EndingsCount (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Crowdloan NewRaise (r:1 w:1)
- /// Proof Skipped: Crowdloan NewRaise (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Crowdloan Funds (r:100 w:0)
- /// Proof Skipped: Crowdloan Funds (max_values: None, max_size: None, mode: Measured)
- /// Storage: Auctions AuctionCounter (r:1 w:0)
- /// Proof: Auctions AuctionCounter (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen)
- /// Storage: Paras ParaLifecycles (r:100 w:0)
- /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured)
- /// Storage: Slots Leases (r:100 w:0)
- /// Proof Skipped: Slots Leases (max_values: None, max_size: None, mode: Measured)
- /// Storage: Auctions Winning (r:1 w:1)
- /// Proof: Auctions Winning (max_values: None, max_size: Some(1920), added: 4395, mode: MaxEncodedLen)
- /// Storage: Auctions ReservedAmounts (r:100 w:100)
- /// Proof: Auctions ReservedAmounts (max_values: None, max_size: Some(60), added: 2535, mode: MaxEncodedLen)
- /// Storage: System Account (r:100 w:100)
- /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen)
+ /// Storage: `Auctions::AuctionInfo` (r:1 w:0)
+ /// Proof: `Auctions::AuctionInfo` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`)
+ /// Storage: `Crowdloan::EndingsCount` (r:1 w:1)
+ /// Proof: `Crowdloan::EndingsCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Crowdloan::NewRaise` (r:1 w:1)
+ /// Proof: `Crowdloan::NewRaise` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Crowdloan::Funds` (r:100 w:0)
+ /// Proof: `Crowdloan::Funds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Auctions::AuctionCounter` (r:1 w:0)
+ /// Proof: `Auctions::AuctionCounter` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+ /// Storage: `Paras::ParaLifecycles` (r:100 w:0)
+ /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Slots::Leases` (r:100 w:0)
+ /// Proof: `Slots::Leases` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Auctions::Winning` (r:1 w:1)
+ /// Proof: `Auctions::Winning` (`max_values`: None, `max_size`: Some(1920), added: 4395, mode: `MaxEncodedLen`)
+ /// Storage: `Auctions::ReservedAmounts` (r:100 w:100)
+ /// Proof: `Auctions::ReservedAmounts` (`max_values`: None, `max_size`: Some(60), added: 2535, mode: `MaxEncodedLen`)
+ /// Storage: `System::Account` (r:100 w:100)
+ /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
/// The range of component `n` is `[2, 100]`.
fn on_initialize(n: u32, ) -> Weight {
// Proof Size summary in bytes:
diff --git a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_identity_migrator.rs b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_identity_migrator.rs
index 4ea6f67968017..3df3c6c8dd92b 100644
--- a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_identity_migrator.rs
+++ b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_identity_migrator.rs
@@ -1,36 +1,43 @@
// Copyright (C) Parity Technologies (UK) Ltd.
-// SPDX-License-Identifier: Apache-2.0
+// This file is part of Polkadot.
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// 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 `runtime_common::identity_migrator`
//!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2023-11-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
+//! DATE: 2024-02-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! WORST CASE MAP SIZE: `1000000`
-//! HOSTNAME: `sbtb`, CPU: `13th Gen Intel(R) Core(TM) i7-1365U`
+//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024
// Executed Command:
-// ./target/release/polkadot
+// ./target/production/polkadot
// benchmark
// pallet
// --chain=rococo-dev
-// --steps=2
-// --repeat=1
+// --steps=50
+// --repeat=20
+// --no-storage-info
+// --no-median-slopes
+// --no-min-squares
// --pallet=runtime_common::identity_migrator
// --extrinsic=*
-// --output=./migrator-release.rs
+// --execution=wasm
+// --wasm-execution=compiled
+// --header=./polkadot/file_header.txt
+// --output=./polkadot/runtime/rococo/src/weights/runtime_common_identity_migrator.rs
#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(unused_parens)]
@@ -44,7 +51,7 @@ use core::marker::PhantomData;
pub struct WeightInfo(PhantomData);
impl polkadot_runtime_common::identity_migrator::WeightInfo for WeightInfo {
/// Storage: `Identity::IdentityOf` (r:1 w:1)
- /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7538), added: 10013, mode: `MaxEncodedLen`)
+ /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`)
/// Storage: `Identity::SubsOf` (r:1 w:1)
/// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`)
/// Storage: `System::Account` (r:2 w:2)
@@ -63,34 +70,34 @@ impl polkadot_runtime_common::identity_migrator::Weight
/// The range of component `s` is `[0, 100]`.
fn reap_identity(r: u32, s: u32, ) -> Weight {
// Proof Size summary in bytes:
- // Measured: `7292 + r * (8 ±0) + s * (32 ±0)`
- // Estimated: `11003 + r * (8 ±0) + s * (33 ±0)`
- // Minimum execution time: 163_756_000 picoseconds.
- Weight::from_parts(158_982_500, 0)
- .saturating_add(Weight::from_parts(0, 11003))
- // Standard Error: 1_143_629
- .saturating_add(Weight::from_parts(238_675, 0).saturating_mul(r.into()))
- // Standard Error: 228_725
- .saturating_add(Weight::from_parts(1_529_645, 0).saturating_mul(s.into()))
+ // Measured: `7457 + r * (5 ±0) + s * (32 ±0)`
+ // Estimated: `11037 + r * (7 ±0) + s * (32 ±0)`
+ // Minimum execution time: 157_343_000 picoseconds.
+ Weight::from_parts(159_289_236, 0)
+ .saturating_add(Weight::from_parts(0, 11037))
+ // Standard Error: 16_439
+ .saturating_add(Weight::from_parts(224_293, 0).saturating_mul(r.into()))
+ // Standard Error: 3_367
+ .saturating_add(Weight::from_parts(1_383_637, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().reads(8))
- .saturating_add(T::DbWeight::get().writes(5))
+ .saturating_add(T::DbWeight::get().writes(6))
.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into())))
- .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into()))
- .saturating_add(Weight::from_parts(0, 33).saturating_mul(s.into()))
+ .saturating_add(Weight::from_parts(0, 7).saturating_mul(r.into()))
+ .saturating_add(Weight::from_parts(0, 32).saturating_mul(s.into()))
}
/// Storage: `Identity::IdentityOf` (r:1 w:1)
- /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7538), added: 10013, mode: `MaxEncodedLen`)
+ /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`)
/// Storage: `System::Account` (r:1 w:1)
/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
/// Storage: `Identity::SubsOf` (r:1 w:1)
/// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`)
fn poke_deposit() -> Weight {
// Proof Size summary in bytes:
- // Measured: `7229`
- // Estimated: `11003`
- // Minimum execution time: 137_570_000 picoseconds.
- Weight::from_parts(137_570_000, 0)
- .saturating_add(Weight::from_parts(0, 11003))
+ // Measured: `7242`
+ // Estimated: `11037`
+ // Minimum execution time: 114_384_000 picoseconds.
+ Weight::from_parts(115_741_000, 0)
+ .saturating_add(Weight::from_parts(0, 11037))
.saturating_add(T::DbWeight::get().reads(3))
.saturating_add(T::DbWeight::get().writes(3))
}
diff --git a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_paras_registrar.rs b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_paras_registrar.rs
index befd89874411a..0ac251d6f9fc0 100644
--- a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_paras_registrar.rs
+++ b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_paras_registrar.rs
@@ -122,20 +122,20 @@ impl polkadot_runtime_common::paras_registrar::WeightIn
.saturating_add(T::DbWeight::get().reads(7))
.saturating_add(T::DbWeight::get().writes(8))
}
- /// Storage: Registrar Paras (r:1 w:1)
- /// Proof Skipped: Registrar Paras (max_values: None, max_size: None, mode: Measured)
- /// Storage: Paras ParaLifecycles (r:1 w:1)
- /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured)
- /// Storage: Paras FutureCodeHash (r:1 w:0)
- /// Proof Skipped: Paras FutureCodeHash (max_values: None, max_size: None, mode: Measured)
- /// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
- /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Paras ActionsQueue (r:1 w:1)
- /// Proof Skipped: Paras ActionsQueue (max_values: None, max_size: None, mode: Measured)
- /// Storage: MessageQueue BookStateFor (r:1 w:0)
- /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(55), added: 2530, mode: MaxEncodedLen)
- /// Storage: Registrar PendingSwap (r:0 w:1)
- /// Proof Skipped: Registrar PendingSwap (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `Registrar::Paras` (r:1 w:1)
+ /// Proof: `Registrar::Paras` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ParaLifecycles` (r:1 w:1)
+ /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::FutureCodeHash` (r:1 w:0)
+ /// Proof: `Paras::FutureCodeHash` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0)
+ /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ActionsQueue` (r:1 w:1)
+ /// Proof: `Paras::ActionsQueue` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `MessageQueue::BookStateFor` (r:1 w:0)
+ /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(55), added: 2530, mode: `MaxEncodedLen`)
+ /// Storage: `Registrar::PendingSwap` (r:0 w:1)
+ /// Proof: `Registrar::PendingSwap` (`max_values`: None, `max_size`: None, mode: `Measured`)
fn deregister() -> Weight {
// Proof Size summary in bytes:
// Measured: `476`
@@ -146,20 +146,20 @@ impl polkadot_runtime_common::paras_registrar::WeightIn
.saturating_add(T::DbWeight::get().reads(6))
.saturating_add(T::DbWeight::get().writes(4))
}
- /// Storage: Registrar Paras (r:1 w:0)
- /// Proof Skipped: Registrar Paras (max_values: None, max_size: None, mode: Measured)
- /// Storage: Paras ParaLifecycles (r:2 w:2)
- /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured)
- /// Storage: Registrar PendingSwap (r:1 w:1)
- /// Proof Skipped: Registrar PendingSwap (max_values: None, max_size: None, mode: Measured)
- /// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
- /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Paras ActionsQueue (r:1 w:1)
- /// Proof Skipped: Paras ActionsQueue (max_values: None, max_size: None, mode: Measured)
- /// Storage: Crowdloan Funds (r:2 w:2)
- /// Proof Skipped: Crowdloan Funds (max_values: None, max_size: None, mode: Measured)
- /// Storage: Slots Leases (r:2 w:2)
- /// Proof Skipped: Slots Leases (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `Registrar::Paras` (r:1 w:0)
+ /// Proof: `Registrar::Paras` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ParaLifecycles` (r:2 w:2)
+ /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Registrar::PendingSwap` (r:1 w:1)
+ /// Proof: `Registrar::PendingSwap` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0)
+ /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ActionsQueue` (r:1 w:1)
+ /// Proof: `Paras::ActionsQueue` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Crowdloan::Funds` (r:2 w:2)
+ /// Proof: `Crowdloan::Funds` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Slots::Leases` (r:2 w:2)
+ /// Proof: `Slots::Leases` (`max_values`: None, `max_size`: None, mode: `Measured`)
fn swap() -> Weight {
// Proof Size summary in bytes:
// Measured: `674`
@@ -201,8 +201,8 @@ impl polkadot_runtime_common::paras_registrar::WeightIn
.saturating_add(T::DbWeight::get().reads(9))
.saturating_add(T::DbWeight::get().writes(7))
}
- /// Storage: Paras Heads (r:0 w:1)
- /// Proof Skipped: Paras Heads (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `Paras::Heads` (r:0 w:1)
+ /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`)
/// The range of component `b` is `[1, 1048576]`.
fn set_current_head(b: u32, ) -> Weight {
// Proof Size summary in bytes:
diff --git a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_slots.rs b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_slots.rs
index b1422e506ab1d..047cb13b305bd 100644
--- a/polkadot/runtime/westend/src/weights/polkadot_runtime_common_slots.rs
+++ b/polkadot/runtime/westend/src/weights/polkadot_runtime_common_slots.rs
@@ -64,18 +64,16 @@ impl polkadot_runtime_common::slots::WeightInfo for Wei
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(2))
}
- /// Storage: Paras Parachains (r:1 w:0)
- /// Proof Skipped: Paras Parachains (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Slots Leases (r:101 w:100)
- /// Proof Skipped: Slots Leases (max_values: None, max_size: None, mode: Measured)
- /// Storage: Paras ParaLifecycles (r:200 w:200)
- /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured)
- /// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
- /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Paras ActionsQueue (r:1 w:1)
- /// Proof Skipped: Paras ActionsQueue (max_values: None, max_size: None, mode: Measured)
- /// Storage: Registrar Paras (r:100 w:100)
- /// Proof Skipped: Registrar Paras (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `Paras::Parachains` (r:1 w:0)
+ /// Proof: `Paras::Parachains` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Slots::Leases` (r:101 w:100)
+ /// Proof: `Slots::Leases` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ParaLifecycles` (r:200 w:200)
+ /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0)
+ /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ActionsQueue` (r:1 w:1)
+ /// Proof: `Paras::ActionsQueue` (`max_values`: None, `max_size`: None, mode: `Measured`)
/// The range of component `c` is `[0, 100]`.
/// The range of component `t` is `[0, 100]`.
fn manage_lease_period_start(c: u32, t: u32, ) -> Weight {
@@ -91,17 +89,17 @@ impl polkadot_runtime_common::slots::WeightInfo for Wei
.saturating_add(Weight::from_parts(14_335_474, 0).saturating_mul(t.into()))
.saturating_add(T::DbWeight::get().reads(4))
.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into())))
- .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(t.into())))
+ .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(t.into())))
.saturating_add(T::DbWeight::get().writes(1))
.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into())))
- .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(t.into())))
- .saturating_add(Weight::from_parts(0, 2526).saturating_mul(c.into()))
- .saturating_add(Weight::from_parts(0, 2789).saturating_mul(t.into()))
+ .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(t.into())))
+ .saturating_add(Weight::from_parts(0, 2496).saturating_mul(c.into()))
+ .saturating_add(Weight::from_parts(0, 2709).saturating_mul(t.into()))
}
- /// Storage: Slots Leases (r:1 w:1)
- /// Proof Skipped: Slots Leases (max_values: None, max_size: None, mode: Measured)
- /// Storage: System Account (r:8 w:8)
- /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen)
+ /// Storage: `Slots::Leases` (r:1 w:1)
+ /// Proof: `Slots::Leases` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `System::Account` (r:8 w:8)
+ /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
fn clear_all_leases() -> Weight {
// Proof Size summary in bytes:
// Measured: `2653`
@@ -112,16 +110,14 @@ impl polkadot_runtime_common::slots::WeightInfo for Wei
.saturating_add(T::DbWeight::get().reads(9))
.saturating_add(T::DbWeight::get().writes(9))
}
- /// Storage: Slots Leases (r:1 w:0)
- /// Proof Skipped: Slots Leases (max_values: None, max_size: None, mode: Measured)
- /// Storage: Paras ParaLifecycles (r:1 w:1)
- /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured)
- /// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
- /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Paras ActionsQueue (r:1 w:1)
- /// Proof Skipped: Paras ActionsQueue (max_values: None, max_size: None, mode: Measured)
- /// Storage: Registrar Paras (r:1 w:1)
- /// Proof Skipped: Registrar Paras (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `Slots::Leases` (r:1 w:0)
+ /// Proof: `Slots::Leases` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ParaLifecycles` (r:1 w:1)
+ /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0)
+ /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ActionsQueue` (r:1 w:1)
+ /// Proof: `Paras::ActionsQueue` (`max_values`: None, `max_size`: None, mode: `Measured`)
fn trigger_onboard() -> Weight {
// Proof Size summary in bytes:
// Measured: `601`
diff --git a/polkadot/runtime/westend/src/weights/polkadot_runtime_parachains_configuration.rs b/polkadot/runtime/westend/src/weights/polkadot_runtime_parachains_configuration.rs
index 5130b04668b20..f918f256b4ce3 100644
--- a/polkadot/runtime/westend/src/weights/polkadot_runtime_parachains_configuration.rs
+++ b/polkadot/runtime/westend/src/weights/polkadot_runtime_parachains_configuration.rs
@@ -17,21 +17,21 @@
//! Autogenerated weights for `runtime_parachains::configuration`
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
-//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2024-02-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! WORST CASE MAP SIZE: `1000000`
//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024
// Executed Command:
-// target/production/polkadot
+// ./target/production/polkadot
// benchmark
// pallet
+// --chain=rococo-dev
// --steps=50
// --repeat=20
-// --extrinsic=*
-// --wasm-execution=compiled
-// --heap-pages=4096
-// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json
+// --no-storage-info
+// --no-median-slopes
+// --no-min-squares
// --pallet=runtime_parachains::configuration
// --chain=westend-dev
// --header=./polkadot/file_header.txt
diff --git a/polkadot/runtime/westend/src/weights/polkadot_runtime_parachains_paras.rs b/polkadot/runtime/westend/src/weights/polkadot_runtime_parachains_paras.rs
index d96964e69c114..9719304932e5b 100644
--- a/polkadot/runtime/westend/src/weights/polkadot_runtime_parachains_paras.rs
+++ b/polkadot/runtime/westend/src/weights/polkadot_runtime_parachains_paras.rs
@@ -75,8 +75,8 @@ impl polkadot_runtime_parachains::paras::WeightInfo for
.saturating_add(T::DbWeight::get().reads(4))
.saturating_add(T::DbWeight::get().writes(6))
}
- /// Storage: Paras Heads (r:0 w:1)
- /// Proof Skipped: Paras Heads (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `Paras::Heads` (r:0 w:1)
+ /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`)
/// The range of component `s` is `[1, 1048576]`.
fn force_set_current_head(s: u32, ) -> Weight {
// Proof Size summary in bytes:
@@ -89,11 +89,16 @@ impl polkadot_runtime_parachains::paras::WeightInfo for
.saturating_add(Weight::from_parts(1_025, 0).saturating_mul(s.into()))
.saturating_add(T::DbWeight::get().writes(1))
}
- // Storage: Paras Heads (r:0 w:1)
+ /// Storage: `Paras::MostRecentContext` (r:0 w:1)
+ /// Proof: `Paras::MostRecentContext` (`max_values`: None, `max_size`: None, mode: `Measured`)
fn force_set_most_recent_context() -> Weight {
- Weight::from_parts(10_155_000, 0)
- // Standard Error: 0
- .saturating_add(T::DbWeight::get().writes(1 as u64))
+ // Proof Size summary in bytes:
+ // Measured: `0`
+ // Estimated: `0`
+ // Minimum execution time: 2_733_000 picoseconds.
+ Weight::from_parts(2_954_000, 0)
+ .saturating_add(Weight::from_parts(0, 0))
+ .saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: Paras FutureCodeHash (r:1 w:1)
/// Proof Skipped: Paras FutureCodeHash (max_values: None, max_size: None, mode: Measured)
@@ -126,12 +131,16 @@ impl polkadot_runtime_parachains::paras::WeightInfo for
.saturating_add(T::DbWeight::get().reads(8))
.saturating_add(T::DbWeight::get().writes(7))
}
- /// Storage: Paras FutureCodeUpgrades (r:1 w:0)
- /// Proof Skipped: Paras FutureCodeUpgrades (max_values: None, max_size: None, mode: Measured)
- /// Storage: Paras Heads (r:0 w:1)
- /// Proof Skipped: Paras Heads (max_values: None, max_size: None, mode: Measured)
- /// Storage: Paras UpgradeGoAheadSignal (r:0 w:1)
- /// Proof Skipped: Paras UpgradeGoAheadSignal (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `Paras::FutureCodeUpgrades` (r:1 w:0)
+ /// Proof: `Paras::FutureCodeUpgrades` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Registrar::Paras` (r:1 w:0)
+ /// Proof: `Registrar::Paras` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::Heads` (r:0 w:1)
+ /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::UpgradeGoAheadSignal` (r:0 w:1)
+ /// Proof: `Paras::UpgradeGoAheadSignal` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::MostRecentContext` (r:0 w:1)
+ /// Proof: `Paras::MostRecentContext` (`max_values`: None, `max_size`: None, mode: `Measured`)
/// The range of component `s` is `[1, 1048576]`.
fn force_note_new_head(s: u32, ) -> Weight {
// Proof Size summary in bytes:
@@ -145,10 +154,10 @@ impl polkadot_runtime_parachains::paras::WeightInfo for
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(2))
}
- /// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
- /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Paras ActionsQueue (r:1 w:1)
- /// Proof Skipped: Paras ActionsQueue (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0)
+ /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::ActionsQueue` (r:1 w:1)
+ /// Proof: `Paras::ActionsQueue` (`max_values`: None, `max_size`: None, mode: `Measured`)
fn force_queue_action() -> Weight {
// Proof Size summary in bytes:
// Measured: `4288`
@@ -180,10 +189,10 @@ impl polkadot_runtime_parachains::paras::WeightInfo for
.saturating_add(T::DbWeight::get().reads(4))
.saturating_add(T::DbWeight::get().writes(3))
}
- /// Storage: Paras CodeByHashRefs (r:1 w:0)
- /// Proof Skipped: Paras CodeByHashRefs (max_values: None, max_size: None, mode: Measured)
- /// Storage: Paras CodeByHash (r:0 w:1)
- /// Proof Skipped: Paras CodeByHash (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `Paras::CodeByHashRefs` (r:1 w:0)
+ /// Proof: `Paras::CodeByHashRefs` (`max_values`: None, `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::CodeByHash` (r:0 w:1)
+ /// Proof: `Paras::CodeByHash` (`max_values`: None, `max_size`: None, mode: `Measured`)
fn poke_unused_validation_code() -> Weight {
// Proof Size summary in bytes:
// Measured: `28`
@@ -194,12 +203,12 @@ impl polkadot_runtime_parachains::paras::WeightInfo for
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
- /// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
- /// Proof Skipped: ParasShared ActiveValidatorKeys (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
- /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Paras PvfActiveVoteMap (r:1 w:1)
- /// Proof Skipped: Paras PvfActiveVoteMap (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0)
+ /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0)
+ /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::PvfActiveVoteMap` (r:1 w:1)
+ /// Proof: `Paras::PvfActiveVoteMap` (`max_values`: None, `max_size`: None, mode: `Measured`)
fn include_pvf_check_statement() -> Weight {
// Proof Size summary in bytes:
// Measured: `26682`
@@ -234,12 +243,12 @@ impl polkadot_runtime_parachains::paras::WeightInfo for
.saturating_add(T::DbWeight::get().reads(6))
.saturating_add(T::DbWeight::get().writes(104))
}
- /// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
- /// Proof Skipped: ParasShared ActiveValidatorKeys (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
- /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Paras PvfActiveVoteMap (r:1 w:1)
- /// Proof Skipped: Paras PvfActiveVoteMap (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0)
+ /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0)
+ /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::PvfActiveVoteMap` (r:1 w:1)
+ /// Proof: `Paras::PvfActiveVoteMap` (`max_values`: None, `max_size`: None, mode: `Measured`)
fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight {
// Proof Size summary in bytes:
// Measured: `27214`
@@ -270,12 +279,12 @@ impl polkadot_runtime_parachains::paras::WeightInfo for
.saturating_add(T::DbWeight::get().reads(5))
.saturating_add(T::DbWeight::get().writes(3))
}
- /// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
- /// Proof Skipped: ParasShared ActiveValidatorKeys (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
- /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured)
- /// Storage: Paras PvfActiveVoteMap (r:1 w:1)
- /// Proof Skipped: Paras PvfActiveVoteMap (max_values: None, max_size: None, mode: Measured)
+ /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0)
+ /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0)
+ /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+ /// Storage: `Paras::PvfActiveVoteMap` (r:1 w:1)
+ /// Proof: `Paras::PvfActiveVoteMap` (`max_values`: None, `max_size`: None, mode: `Measured`)
fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight {
// Proof Size summary in bytes:
// Measured: `26682`
diff --git a/prdoc/1.9.0/pr_3665.prdoc b/prdoc/1.9.0/pr_3665.prdoc
deleted file mode 100644
index 67725d24d1855..0000000000000
--- a/prdoc/1.9.0/pr_3665.prdoc
+++ /dev/null
@@ -1,11 +0,0 @@
-# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0
-# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json
-
-title: Revert "FRAME Create TransactionExtension as a replacement for SignedExtension (#2280)"
-
-doc:
- - audience: Runtime Dev
- description: |
- This PR reverts the PR which introduced `TransactionExtension` to replace `SignedExtension`.
-
-crates: [ ]
diff --git a/prdoc/pr_2280.prdoc b/prdoc/pr_2280.prdoc
new file mode 100644
index 0000000000000..3026dc254e64b
--- /dev/null
+++ b/prdoc/pr_2280.prdoc
@@ -0,0 +1,144 @@
+# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0
+# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json
+
+title: FRAME Create `TransactionExtension` as a replacement for `SignedExtension`
+
+doc:
+ - audience: Runtime User
+ description: |
+ Introduces a new trait `TransactionExtension` to replace `SignedExtension`. Introduce the
+ idea of transactions which obey the runtime's extensions and have according Extension data
+ (né Extra data) yet do not have hard-coded signatures.
+
+ Deprecate the terminology of "Unsigned" when used for transactions/extrinsics owing to there
+ now being "proper" unsigned transactions which obey the extension framework and "old-style"
+ unsigned which do not. Instead we have `General` for the former and `Bare` for the latter.
+ Unsigned will be phased out as a type of transaction, and `Bare` will only be used for
+ Inherents.
+
+ Types of extrinsic are now therefore
+ - Bare (no hardcoded signature, no Extra data; used to be known as "Unsigned")
+ - Bare transactions (deprecated) - Gossiped, validated with `ValidateUnsigned`
+ (deprecated) and the `_bare_compat` bits of `TransactionExtension` (deprecated).
+ - Inherents - Not gossiped, validated with `ProvideInherent`.
+ - Extended (Extra data) - Gossiped, validated via `TransactionExtension`.
+ - Signed transactions (with a hardcoded signature).
+ - General transactions (without a hardcoded signature).
+
+ Notable information on `TransactionExtension` and the differences from `SignedExtension`
+ - `AdditionalSigned`/`additional_signed` is renamed to `Implicit`/`implicit`. It is encoded
+ for the entire transaction and passed in to each extension as a new argument to validate.
+ - `pre_dispatch` is renamed to `prepare`.
+ - `validate` runs transaction validation logic both off-chain and on-chain, and is
+ non-mutating.
+ - `prepare` runs on-chain pre-execution logic using information extracted during validation
+ and is mutating.
+ - `validate` and `prepare` are now passed an `Origin` rather than an `AccountId`. If the
+ extension logic presumes an `AccountId`, consider using the trait function
+ `AsSystemOriginSigner::as_system_origin_signer`.
+ - A signature on the underlying transaction may validly not be present.
+ - The origin may be altered during validation.
+ - Validation functionality present in `validate` should not be repeated in `prepare`.
+ Useful information obtained during `validate` should now be passsed in to `prepare` using
+ the new user-specifiable type `Val`.
+ - Unsigned logic should be migrated from the old `*_unsigned` functions into the regular
+ versions of the new functions where the `Origin` is `None`.
+ - The `Call` type defining the runtime call is now a type parameter.
+ - `TransactionExtension` now takes a `Context` type parameter. This defines some arbitrary
+ contextual data that is injected into the transaction extension logic. It is unused in
+ instances migrated from `SignedExtension`.
+ - Extensions now track the weight they consume during valdiation, preparation and
+ post-dispatch through the `TransactionExtensionBase::weight` function.
+ - `TestXt` was removed and its usage in tests was replaced with `UncheckedExtrinsic`
+ instances.
+
+ To fix the build issues introduced by this change, use the `AsTransactionExtension` adapter
+ to wrap existing `SignedExtension`s by converting them using the `From`
+ generic implementation for `AsTransactionExtension`. More details on migrating existing
+ `SignedExtension` implementations to `TransactionExtension` in the PR description.
+
+crates:
+ - name: bridge-runtime-common
+ - name: bp-bridge-hub-cumulus
+ - name: bp-kusama
+ - name: bp-polkadot-bulletin
+ - name: bp-polkadot
+ - name: bp-rococo
+ - name: bp-westend
+ - name: bp-polkadot-core
+ - name: bp-runtime
+ - name: snowbridge-pallet-inbound-queue
+ - name: snowbridge-pallet-outbound-queue
+ - name: snowbridge-pallet-system
+ - name: snowbridge-runtime-test-common
+ - name: parachain-template-runtime
+ - name: asset-hub-rococo-runtime
+ - name: asset-hub-westend-runtime
+ - name: bridge-hub-rococo-runtime
+ - name: bridge-hub-westend-runtime
+ - name: collectives-westend-runtime
+ - name: contracts-rococo-runtime
+ - name: coretime-rococo-runtime
+ - name: coretime-westend-runtime
+ - name: glutton-westend-runtime
+ - name: people-rococo-runtime
+ - name: people-westend-runtime
+ - name: seedling-runtime
+ - name: shell-runtime
+ - name: penpal-runtime
+ - name: rococo-parachain-runtime
+ - name: polkadot-parachain-bin
+ - name: cumulus-primitives-storage-weight-reclaim
+ - name: cumulus-test-client
+ - name: cumulus-test-runtime
+ - name: cumulus-test-service
+ - name: polkadot-sdk-docs
+ - name: polkadot-service
+ - name: polkadot-test-service
+ - name: polkadot-runtime-common
+ - name: rococo-runtime
+ - name: polkadot-test-runtime
+ - name: westend-runtime
+ - name: staging-xcm-builder
+ - name: minimal-runtime
+ - name: node-template
+ - name: node-template-runtime
+ - name: staging-node-cli
+ - name: kitchensink-runtime
+ - name: node-testing
+ - name: sc-client-api
+ - name: sc-client-db
+ - name: sc-network-gossip
+ - name: sc-network-sync
+ - name: sc-transaction-pool
+ - name: frame
+ - name: pallet-babe
+ - name: pallet-balances
+ - name: pallet-beefy
+ - name: pallet-collective
+ - name: pallet-election-provider-multi-phase
+ - name: pallet-elections-phragmen
+ - name: pallet-example-basic
+ - name: pallet-example-offchain-worker
+ - name: frame-executive
+ - name: pallet-grandpa
+ - name: pallet-im-online
+ - name: pallet-offences
+ - name: pallet-sassafras
+ - name: pallet-state-trie-migration
+ - name: pallet-sudo
+ - name: frame-support-procedural
+ - name: frame-support
+ - name: frame-system
+ - name: frame-system-benchmarking
+ - name: pallet-transaction-payment
+ - name: pallet-asset-conversion-tx-payment
+ - name: pallet-asset-tx-payment
+ - name: pallet-skip-feeless-payment
+ - name: sp-inherents
+ - name: sp-metadata-ir
+ - name: sp-runtime
+ - name: substrate-test-runtime
+ - name: frame-benchmarking-cli
+ - name: frame-remote-externalities
+ - name: substrate-rpc-client
diff --git a/substrate/bin/node/cli/src/service.rs b/substrate/bin/node/cli/src/service.rs
index 7b166f94bcc83..ab0319d8cc29e 100644
--- a/substrate/bin/node/cli/src/service.rs
+++ b/substrate/bin/node/cli/src/service.rs
@@ -123,16 +123,19 @@ pub fn create_extrinsic(
let tip = 0;
let tx_ext: kitchensink_runtime::TxExtension =
(
- frame_system::CheckNonZeroSender::::new(),
- frame_system::CheckSpecVersion::::new(),
- frame_system::CheckTxVersion::::new(),
- frame_system::CheckGenesis::::new(),
- frame_system::CheckEra::::from(generic::Era::mortal(
- period,
- best_block.saturated_into(),
- )),
- frame_system::CheckNonce::::from(nonce),
- frame_system::CheckWeight::::new(),
+ (
+ frame_system::CheckNonZeroSender::::new(),
+ frame_system::CheckSpecVersion::::new(),
+ frame_system::CheckTxVersion::::new(),
+ frame_system::CheckGenesis::::new(),
+ frame_system::CheckEra::::from(generic::Era::mortal(
+ period,
+ best_block.saturated_into(),
+ )),
+ frame_system::CheckNonce::::from(nonce),
+ frame_system::CheckWeight::::new(),
+ )
+ .into(),
pallet_skip_feeless_payment::SkipCheckIfFeeless::from(
pallet_asset_conversion_tx_payment::ChargeAssetTxPayment::<
kitchensink_runtime::Runtime,
@@ -145,13 +148,15 @@ pub fn create_extrinsic(
function.clone(),
tx_ext.clone(),
(
- (),
- kitchensink_runtime::VERSION.spec_version,
- kitchensink_runtime::VERSION.transaction_version,
- genesis_hash,
- best_hash,
- (),
- (),
+ (
+ (),
+ kitchensink_runtime::VERSION.spec_version,
+ kitchensink_runtime::VERSION.transaction_version,
+ genesis_hash,
+ best_hash,
+ (),
+ (),
+ ),
(),
None,
),
diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs
index d6a17856e4704..eba849100a17e 100644
--- a/substrate/bin/node/runtime/src/lib.rs
+++ b/substrate/bin/node/runtime/src/lib.rs
@@ -2323,6 +2323,24 @@ impl pallet_parameters::Config for Runtime {
type WeightInfo = ();
}
+pub type MetaTxExtension = (
+ frame_system::CheckNonZeroSender,
+ frame_system::CheckSpecVersion,
+ frame_system::CheckTxVersion,
+ frame_system::CheckGenesis,
+ frame_system::CheckEra,
+ frame_system::CheckNonce,
+);
+
+impl pallet_meta_tx::Config for Runtime {
+ type RuntimeEvent = RuntimeEvent;
+ type RuntimeCall = RuntimeCall;
+ type Signature = Signature;
+ type PublicKey = ::Signer;
+ type Context = ();
+ type Extension = MetaTxExtension;
+}
+
#[frame_support::runtime]
mod runtime {
use super::*;
diff --git a/substrate/bin/node/testing/src/keyring.rs b/substrate/bin/node/testing/src/keyring.rs
index 20497e85eab97..09b1c11d19c4f 100644
--- a/substrate/bin/node/testing/src/keyring.rs
+++ b/substrate/bin/node/testing/src/keyring.rs
@@ -75,13 +75,16 @@ pub fn session_keys_from_seed(seed: &str) -> SessionKeys {
/// Returns transaction extra.
pub fn tx_ext(nonce: Nonce, extra_fee: Balance) -> TxExtension {
(
- frame_system::CheckNonZeroSender::new(),
- frame_system::CheckSpecVersion::new(),
- frame_system::CheckTxVersion::new(),
- frame_system::CheckGenesis::new(),
- frame_system::CheckEra::from(Era::mortal(256, 0)),
- frame_system::CheckNonce::from(nonce),
- frame_system::CheckWeight::new(),
+ (
+ frame_system::CheckNonZeroSender::new(),
+ frame_system::CheckSpecVersion::new(),
+ frame_system::CheckTxVersion::new(),
+ frame_system::CheckGenesis::new(),
+ frame_system::CheckEra::from(Era::mortal(256, 0)),
+ frame_system::CheckNonce::from(nonce),
+ frame_system::CheckWeight::new(),
+ )
+ .into(),
pallet_skip_feeless_payment::SkipCheckIfFeeless::from(
pallet_asset_conversion_tx_payment::ChargeAssetTxPayment::from(extra_fee, None),
),
diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs
index c2e24c73a7bda..deb72161768c8 100644
--- a/substrate/frame/babe/src/mock.rs
+++ b/substrate/frame/babe/src/mock.rs
@@ -36,8 +36,9 @@ use sp_core::{
use sp_io;
use sp_runtime::{
curve::PiecewiseLinear,
+ generic::UncheckedExtrinsic,
impl_opaque_keys,
- testing::{Digest, DigestItem, Header, TestXt},
+ testing::{Digest, DigestItem, Header},
traits::{Header as _, OpaqueKeys},
BuildStorage, Perbill,
};
diff --git a/substrate/frame/broker/src/weights.rs b/substrate/frame/broker/src/weights.rs
index 2f25fddc20509..1bd1e252e1fbc 100644
--- a/substrate/frame/broker/src/weights.rs
+++ b/substrate/frame/broker/src/weights.rs
@@ -148,7 +148,7 @@ impl WeightInfo for SubstrateWeight {
/// Storage: `Broker::Workplan` (r:0 w:10)
/// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`)
/// The range of component `n` is `[0, 1000]`.
- fn start_sales(n: u32, ) -> Weight {
+ fn start_sales(_n: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `6330`
// Estimated: `8499`
@@ -596,7 +596,7 @@ impl WeightInfo for () {
/// Storage: `Broker::Workplan` (r:0 w:10)
/// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`)
/// The range of component `n` is `[0, 1000]`.
- fn start_sales(n: u32, ) -> Weight {
+ fn start_sales(_n: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `6330`
// Estimated: `8499`
diff --git a/substrate/frame/examples/offchain-worker/src/tests.rs b/substrate/frame/examples/offchain-worker/src/tests.rs
index 755beb8b82ece..cc64853e58be9 100644
--- a/substrate/frame/examples/offchain-worker/src/tests.rs
+++ b/substrate/frame/examples/offchain-worker/src/tests.rs
@@ -72,7 +72,7 @@ impl frame_system::Config for Test {
type MaxConsumers = ConstU32<16>;
}
-type Extrinsic = TestXt;
+type Extrinsic = UncheckedExtrinsic;
type AccountId = <::Signer as IdentifyAccount>::AccountId;
impl frame_system::offchain::SigningTypes for Test {
diff --git a/substrate/frame/executive/src/tests.rs b/substrate/frame/executive/src/tests.rs
index 3841b010325b2..3f74d650fbe43 100644
--- a/substrate/frame/executive/src/tests.rs
+++ b/substrate/frame/executive/src/tests.rs
@@ -442,6 +442,32 @@ impl frame_support::traits::Get for RuntimeVersion {
}
}
+#[derive(Clone, Debug, Encode, codec::Decode, PartialEq, Eq, scale_info::TypeInfo)]
+pub struct AccountU64(u64);
+impl sp_runtime::traits::IdentifyAccount for AccountU64 {
+ type AccountId = u64;
+ fn into_account(self) -> u64 {
+ self.0
+ }
+}
+
+impl sp_runtime::traits::Verify for AccountU64 {
+ type Signer = AccountU64;
+ fn verify>(
+ &self,
+ _msg: L,
+ _signer: &::AccountId,
+ ) -> bool {
+ true
+ }
+}
+
+impl From for AccountU64 {
+ fn from(value: u64) -> Self {
+ Self(value)
+ }
+}
+
parameter_types! {
pub static RuntimeVersionTestValues: sp_version::RuntimeVersion =
Default::default();
diff --git a/substrate/frame/grandpa/src/mock.rs b/substrate/frame/grandpa/src/mock.rs
index cf4c29003a715..c90b9f8389a90 100644
--- a/substrate/frame/grandpa/src/mock.rs
+++ b/substrate/frame/grandpa/src/mock.rs
@@ -35,11 +35,8 @@ use sp_consensus_grandpa::{RoundNumber, SetId, GRANDPA_ENGINE_ID};
use sp_core::H256;
use sp_keyring::Ed25519Keyring;
use sp_runtime::{
- curve::PiecewiseLinear,
- impl_opaque_keys,
- testing::{TestXt, UintAuthorityId},
- traits::OpaqueKeys,
- BuildStorage, DigestItem, Perbill,
+ curve::PiecewiseLinear, generic::UncheckedExtrinsic, impl_opaque_keys,
+ testing::UintAuthorityId, traits::OpaqueKeys, BuildStorage, DigestItem, Perbill,
};
use sp_staking::{EraIndex, SessionIndex};
diff --git a/substrate/frame/identity/src/weights.rs b/substrate/frame/identity/src/weights.rs
index 008d5465bb4f3..55c6bc4fd2564 100644
--- a/substrate/frame/identity/src/weights.rs
+++ b/substrate/frame/identity/src/weights.rs
@@ -96,7 +96,7 @@ impl WeightInfo for SubstrateWeight {
/// Storage: `Identity::IdentityOf` (r:1 w:1)
/// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`)
/// The range of component `r` is `[1, 20]`.
- fn set_identity(r: u32, ) -> Weight {
+ fn set_identity(_r: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `6978 + r * (5 ±0)`
// Estimated: `11037`
@@ -155,7 +155,7 @@ impl WeightInfo for SubstrateWeight {
/// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`)
/// The range of component `r` is `[1, 20]`.
/// The range of component `s` is `[0, 100]`.
- fn clear_identity(r: u32, s: u32, ) -> Weight {
+ fn clear_identity(_r: u32, s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `7070 + r * (5 ±0) + s * (32 ±0)`
// Estimated: `11037`
@@ -462,7 +462,7 @@ impl WeightInfo for () {
/// Storage: `Identity::IdentityOf` (r:1 w:1)
/// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`)
/// The range of component `r` is `[1, 20]`.
- fn set_identity(r: u32, ) -> Weight {
+ fn set_identity(_r: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `6978 + r * (5 ±0)`
// Estimated: `11037`
@@ -521,7 +521,7 @@ impl WeightInfo for () {
/// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`)
/// The range of component `r` is `[1, 20]`.
/// The range of component `s` is `[0, 100]`.
- fn clear_identity(r: u32, s: u32, ) -> Weight {
+ fn clear_identity(_r: u32, s: u32, ) -> Weight {
// Proof Size summary in bytes:
// Measured: `7070 + r * (5 ±0) + s * (32 ±0)`
// Estimated: `11037`
diff --git a/substrate/frame/meta-tx/Cargo.toml b/substrate/frame/meta-tx/Cargo.toml
new file mode 100644
index 0000000000000..4a5a0cf2e6c40
--- /dev/null
+++ b/substrate/frame/meta-tx/Cargo.toml
@@ -0,0 +1,54 @@
+[package]
+name = "pallet-meta-tx"
+description = "Dispatch Meta Transaction"
+license = "Apache-2.0"
+version = "0.0.1"
+edition.workspace = true
+authors.workspace = true
+repository.workspace = true
+
+[dependencies]
+codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["max-encoded-len"] }
+docify = "0.2.7"
+scale-info = { version = "2.1.2", default-features = false, features = ["derive"] }
+serde = { features = ["derive"], optional = true, workspace = true, default-features = true }
+
+frame-support = { path = "../support", default-features = false }
+frame-system = { path = "../system", default-features = false }
+sp-core = { path = "../../primitives/core", default-features = false }
+sp-runtime = { path = "../../primitives/runtime", default-features = false }
+sp-std = { path = "../../primitives/std", default-features = false }
+frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true }
+
+[dev-dependencies]
+pallet-balances = { path = "../balances", features = ["std"] }
+sp-io = { path = "../../primitives/io", features = ["std"] }
+keyring = { package = "sp-keyring", path = "../../primitives/keyring" }
+pallet-transaction-payment = { path = "../../frame/transaction-payment" }
+
+[features]
+default = ["std"]
+std = [
+ "codec/std",
+ "frame-benchmarking?/std",
+ "frame-support/std",
+ "frame-system/std",
+ "scale-info/std",
+ "serde",
+ "sp-core/std",
+ "sp-runtime/std",
+ "sp-std/std",
+]
+runtime-benchmarks = [
+ "pallet-balances/runtime-benchmarks",
+ "frame-benchmarking/runtime-benchmarks",
+ "frame-support/runtime-benchmarks",
+ "frame-system/runtime-benchmarks",
+ "sp-runtime/runtime-benchmarks",
+]
+try-runtime = [
+ "pallet-balances/try-runtime",
+ "frame-support/try-runtime",
+ "frame-system/try-runtime",
+ "sp-runtime/try-runtime",
+]
diff --git a/substrate/frame/meta-tx/src/lib.rs b/substrate/frame/meta-tx/src/lib.rs
new file mode 100644
index 0000000000000..dea857284f56d
--- /dev/null
+++ b/substrate/frame/meta-tx/src/lib.rs
@@ -0,0 +1,262 @@
+// This file is part of Substrate.
+
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! # Meta Tx or Meta Transaction pallet.
+//!
+//! The pallet provides a way to dispatch a transaction authorized by one party (the signer) and
+//! executed by an untrusted third party (the relayer) that covers the transaction fees.
+//!
+//! ## Pallet API
+//!
+//! See the [`pallet`] module for more information about the interfaces this pallet exposes,
+//! including its configuration trait, dispatchables, storage items, events and errors.
+//!
+//! ## Overview
+//!
+//! The pallet exposes a client level API which usually not meant to be used directly by the end
+//! user. Meta transaction constructed with a wallet help will contain a target call, required
+//! extensions and a signer signature then will be gossiped with the world and can be picked up by
+//! anyone who is interested in relaying the transaction. The relayer will publish a regular
+//! transaction with the [`dispatch`](`Pallet::dispatch`) call and the meta transaction as an
+//! argument to execute the target call on behalf of the signer and cover the fees.
+//!
+//! The pallet exposes a client-level API, which is usually not meant to be used directly by the
+//! end-user. A meta transaction constructed with a wallet's help will contain a target call,
+//! required extensions, and a signer's signature. It will then be shared with the world and can
+//! be picked up by anyone interested in relaying the transaction. The relayer will publish a
+//! regular transaction with the [`dispatch`](`Pallet::dispatch`) call and the meta transaction as
+//! an argument to execute the target call on behalf of the signer and cover the fees.
+//!
+//! ### Example
+#![doc = docify::embed!("src/tests.rs", sign_and_execute_meta_tx)]
+//!
+//! ## Low Level / Implementation Details
+//!
+//! The layout of the Meta Transaction is identical to the regular transaction. It contains the
+//! signer's address, the signature, the target call, and a configurable set of extensions. The
+//! signed payload concatenates the call, the extensions, and the implicit data of the extensions
+//! and can be represented as the [sp_runtime::generic::SignedPayload] type. The extensions are
+//! presented under the same [TransactionExtension] contract, and types like
+//! [frame_system::CheckGenesis], [frame_system::CheckMortality], [frame_system::CheckNonce], etc.,
+//! can be used and are generally relevant in the context of meta transactions.
+
+#![cfg_attr(not(feature = "std"), no_std)]
+
+#[cfg(test)]
+mod mock;
+#[cfg(test)]
+mod tests;
+pub use pallet::*;
+
+use frame_support::{
+ dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo},
+ pallet_prelude::*,
+ traits::OriginTrait,
+};
+use frame_system::pallet_prelude::*;
+use sp_runtime::traits::{
+ Dispatchable, IdentifyAccount, TransactionExtension, TransactionExtensionBase, Verify,
+};
+use sp_std::prelude::*;
+
+/// Meta Transaction type.
+///
+/// The data that is provided and signed by the signer and shared with the relayer.
+#[derive(Encode, Decode, PartialEq, Eq, TypeInfo, Clone, RuntimeDebug)]
+pub struct MetaTx {
+ /// The proof of the authenticity of the meta transaction.
+ proof: Proof,
+ /// The target call to be executed on behalf of the signer.
+ call: Box,
+ /// The required extension/s.
+ ///
+ /// This might include the nonce check, expiration, etc.
+ extension: Extension,
+}
+
+impl MetaTx {
+ /// Create a new meta transaction.
+ pub fn new_signed(
+ address: Address,
+ signature: Signature,
+ call: Call,
+ extension: Extension,
+ ) -> Self {
+ Self { proof: Proof::Signed(address, signature), call: Box::new(call), extension }
+ }
+}
+
+/// Proof of the authenticity of the meta transaction.
+// It could potentially be extended to support additional types of proofs, similar to the
+// sp_runtime::generic::Preamble::Bare transaction type.
+#[derive(Encode, Decode, PartialEq, Eq, TypeInfo, Clone, RuntimeDebug)]
+pub enum Proof {
+ /// Signature of the meta transaction payload and the signer's address.
+ Signed(Address, Signature),
+}
+
+/// The [`MetaTx`] for the given config.
+pub type MetaTxFor = MetaTx<
+ <::PublicKey as IdentifyAccount>::AccountId,
+ ::Signature,
+ ::RuntimeCall,
+ ::Extension,
+>;
+
+/// The [`sp_runtime::generic::SignedPayload`] for the given config.
+pub type SignedPayloadFor =
+ sp_runtime::generic::SignedPayload<::RuntimeCall, ::Extension>;
+
+#[frame_support::pallet(dev_mode)]
+pub mod pallet {
+ use super::*;
+
+ #[pallet::config]
+ pub trait Config: frame_system::Config {
+ /// The overarching event type.
+ type RuntimeEvent: From> + IsType<::RuntimeEvent>;
+ /// The overarching call type.
+ type RuntimeCall: Parameter
+ + GetDispatchInfo
+ + Dispatchable<
+ Info = DispatchInfo,
+ PostInfo = PostDispatchInfo,
+ RuntimeOrigin = Self::RuntimeOrigin,
+ > + IsType<::RuntimeCall>;
+ /// Signature type for meta transactions.
+ type Signature: Parameter + Verify;
+ /// Public key type used for signature verification.
+ type PublicKey: IdentifyAccount;
+ /// The context type of `Self::Extension`.
+ type Context: Member + Default;
+ /// Transaction extension/s for meta transactions.
+ ///
+ /// The extensions that must be present in every meta transaction. This
+ /// generally includes extensions like [frame_system::CheckSpecVersion],
+ /// [frame_system::CheckTxVersion], [frame_system::CheckGenesis],
+ /// [frame_system::CheckMortality], [frame_system::CheckNonce], etc.
+ type Extension: TransactionExtension<::RuntimeCall, Self::Context>;
+ }
+
+ #[pallet::error]
+ pub enum Error {
+ /// Invalid proof (e.g. signature).
+ BadProof,
+ /// The meta transaction is not yet valid (e.g. nonce too high).
+ Future,
+ /// The meta transaction is outdated (e.g. nonce too low).
+ Stale,
+ /// The meta transactions's birth block is ancient.
+ AncientBirthBlock,
+ /// The meta transaction is invalid.
+ Invalid,
+ }
+
+ #[pallet::event]
+ #[pallet::generate_deposit(pub(crate) fn deposit_event)]
+ pub enum Event {
+ /// A call was dispatched.
+ Dispatched { result: DispatchResultWithPostInfo },
+ }
+
+ #[pallet::pallet]
+ pub struct Pallet(_);
+
+ #[pallet::call]
+ impl Pallet {
+ /// Dispatch a given meta transaction.
+ ///
+ /// - `_origin`: Can be any kind of origin.
+ /// - `meta_tx`: Meta Transaction with a target call to be dispatched.
+ #[pallet::call_index(0)]
+ #[pallet::weight({
+ let dispatch_info = meta_tx.call.get_dispatch_info();
+ // TODO: plus T::WeightInfo::dispatch() which must include the weight of T::Extension
+ (
+ dispatch_info.weight,
+ dispatch_info.class,
+ )
+ })]
+ pub fn dispatch(
+ _origin: OriginFor,
+ meta_tx: MetaTxFor,
+ ) -> DispatchResultWithPostInfo {
+ let meta_tx_size = meta_tx.encoded_size();
+
+ let (signer, signature) = match meta_tx.proof {
+ Proof::Signed(signer, signature) => (signer, signature),
+ };
+
+ let signed_payload = SignedPayloadFor::::new(*meta_tx.call, meta_tx.extension)
+ .map_err(|_| Error::::Invalid)?;
+
+ if !signed_payload.using_encoded(|payload| signature.verify(payload, &signer)) {
+ return Err(Error::::BadProof.into());
+ }
+
+ let origin = T::RuntimeOrigin::signed(signer);
+ let (call, extension, _) = signed_payload.deconstruct();
+ let info = call.get_dispatch_info();
+ let mut ctx = T::Context::default();
+
+ let (_, val, origin) = T::Extension::validate(
+ &extension,
+ origin,
+ &call,
+ &info,
+ meta_tx_size,
+ &mut ctx,
+ extension.implicit().map_err(|_| Error::::Invalid)?,
+ &call,
+ )
+ .map_err(Error::::from)?;
+
+ let pre =
+ T::Extension::prepare(extension, val, &origin, &call, &info, meta_tx_size, &ctx)
+ .map_err(Error::::from)?;
+
+ let res = call.dispatch(origin);
+ let post_info = res.unwrap_or_else(|err| err.post_info);
+ let pd_res = res.map(|_| ()).map_err(|e| e.error);
+
+ T::Extension::post_dispatch(pre, &info, &post_info, meta_tx_size, &pd_res, &ctx)
+ .map_err(Error::