diff --git a/.github/workflows/check-semver.yml b/.github/workflows/check-semver.yml
index 11b386da21e9..16028c8de770 100644
--- a/.github/workflows/check-semver.yml
+++ b/.github/workflows/check-semver.yml
@@ -74,7 +74,7 @@ jobs:
 
       - name: install parity-publish
         # Set the target dir to cache the build.
-        run: CARGO_TARGET_DIR=./target/ cargo install parity-publish@0.10.2 --locked -q
+        run: CARGO_TARGET_DIR=./target/ cargo install parity-publish@0.10.3 --locked -q
 
       - name: check semver
         run: |
diff --git a/.github/workflows/publish-check-compile.yml b/.github/workflows/publish-check-compile.yml
index 83cd3ff8fa90..ada8635e314e 100644
--- a/.github/workflows/publish-check-compile.yml
+++ b/.github/workflows/publish-check-compile.yml
@@ -31,7 +31,7 @@ jobs:
           cache-on-failure: true
 
       - name: install parity-publish
-        run: cargo install parity-publish@0.10.2 --locked -q
+        run: cargo install parity-publish@0.10.3 --locked -q
 
       - name: parity-publish update plan
         run: parity-publish --color always plan --skip-check --prdoc prdoc/
diff --git a/.github/workflows/publish-check-crates.yml b/.github/workflows/publish-check-crates.yml
index 1e5a8054e2c7..3150cb9dd405 100644
--- a/.github/workflows/publish-check-crates.yml
+++ b/.github/workflows/publish-check-crates.yml
@@ -24,7 +24,7 @@ jobs:
           cache-on-failure: true
 
       - name: install parity-publish
-        run: cargo install parity-publish@0.10.2 --locked -q
+        run: cargo install parity-publish@0.10.3 --locked -q
 
       - name: parity-publish check
         run: parity-publish --color always check --allow-unpublished
diff --git a/.github/workflows/publish-claim-crates.yml b/.github/workflows/publish-claim-crates.yml
index 845b57a61b96..a6efc8a5599e 100644
--- a/.github/workflows/publish-claim-crates.yml
+++ b/.github/workflows/publish-claim-crates.yml
@@ -18,7 +18,7 @@ jobs:
           cache-on-failure: true
 
       - name: install parity-publish
-        run: cargo install parity-publish@0.10.2 --locked -q
+        run: cargo install parity-publish@0.10.3 --locked -q
 
       - name: parity-publish claim
         env:
diff --git a/Cargo.lock b/Cargo.lock
index 956c5efb06a7..d62d23045f64 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -7189,6 +7189,7 @@ dependencies = [
  "sc-client-db",
  "sc-executor 0.32.0",
  "sc-executor-common 0.29.0",
+ "sc-runtime-utilities",
  "sc-service",
  "sc-sysinfo",
  "serde",
@@ -18112,6 +18113,7 @@ dependencies = [
  "cumulus-primitives-aura 0.7.0",
  "cumulus-primitives-core 0.7.0",
  "cumulus-relay-chain-interface",
+ "cumulus-test-runtime",
  "docify",
  "frame-benchmarking 28.0.0",
  "frame-benchmarking-cli",
@@ -18140,29 +18142,36 @@ dependencies = [
  "sc-executor 0.32.0",
  "sc-network",
  "sc-rpc",
+ "sc-runtime-utilities",
  "sc-service",
  "sc-sysinfo",
  "sc-telemetry",
  "sc-tracing",
  "sc-transaction-pool",
+ "scale-info",
  "serde",
  "serde_json",
  "sp-api 26.0.0",
  "sp-block-builder 26.0.0",
  "sp-consensus-aura 0.32.0",
  "sp-core 28.0.0",
+ "sp-crypto-hashing 0.1.0",
  "sp-genesis-builder 0.8.0",
  "sp-inherents 26.0.0",
+ "sp-io 30.0.0",
  "sp-keystore 0.34.0",
  "sp-runtime 31.0.1",
  "sp-session 27.0.0",
+ "sp-storage 19.0.0",
  "sp-timestamp 26.0.0",
  "sp-transaction-pool 26.0.0",
  "sp-version 29.0.0",
+ "sp-wasm-interface 20.0.0",
  "sp-weights 27.0.0",
  "substrate-frame-rpc-system",
  "substrate-prometheus-endpoint",
  "substrate-state-trie-migration-rpc",
+ "subxt-metadata",
  "tokio",
  "wait-timeout",
 ]
@@ -18900,6 +18909,7 @@ dependencies = [
  "sc-rpc-api",
  "sc-rpc-server",
  "sc-rpc-spec-v2",
+ "sc-runtime-utilities",
  "sc-service",
  "sc-state-db",
  "sc-statement-store",
@@ -23526,6 +23536,25 @@ dependencies = [
  "substrate-wasm-builder 17.0.0",
 ]
 
+[[package]]
+name = "sc-runtime-utilities"
+version = "0.1.0"
+dependencies = [
+ "cumulus-primitives-proof-size-hostfunction 0.2.0",
+ "cumulus-test-runtime",
+ "parity-scale-codec",
+ "sc-executor 0.32.0",
+ "sc-executor-common 0.29.0",
+ "sp-core 28.0.0",
+ "sp-crypto-hashing 0.1.0",
+ "sp-io 30.0.0",
+ "sp-state-machine 0.35.0",
+ "sp-version 29.0.0",
+ "sp-wasm-interface 20.0.0",
+ "subxt",
+ "thiserror",
+]
+
 [[package]]
 name = "sc-service"
 version = "0.35.0"
diff --git a/Cargo.toml b/Cargo.toml
index ef84abecfd5d..8a416c5659fd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -300,6 +300,7 @@ members = [
 	"substrate/client/rpc-api",
 	"substrate/client/rpc-servers",
 	"substrate/client/rpc-spec-v2",
+	"substrate/client/runtime-utilities",
 	"substrate/client/service",
 	"substrate/client/service/test",
 	"substrate/client/state-db",
@@ -1190,6 +1191,7 @@ sc-rpc-api = { path = "substrate/client/rpc-api", default-features = false }
 sc-rpc-server = { path = "substrate/client/rpc-servers", default-features = false }
 sc-rpc-spec-v2 = { path = "substrate/client/rpc-spec-v2", default-features = false }
 sc-runtime-test = { path = "substrate/client/executor/runtime-test" }
+sc-runtime-utilities = { path = "substrate/client/runtime-utilities", default-features = true }
 sc-service = { path = "substrate/client/service", default-features = false }
 sc-service-test = { path = "substrate/client/service/test" }
 sc-state-db = { path = "substrate/client/state-db", default-features = false }
@@ -1331,6 +1333,7 @@ substrate-test-runtime-transaction-pool = { path = "substrate/test-utils/runtime
 substrate-test-utils = { path = "substrate/test-utils" }
 substrate-wasm-builder = { path = "substrate/utils/wasm-builder", default-features = false }
 subxt = { version = "0.38", default-features = false }
+subxt-metadata = { version = "0.38.0", default-features = false }
 subxt-signer = { version = "0.38" }
 syn = { version = "2.0.87" }
 sysinfo = { version = "0.30" }
diff --git a/bridges/snowbridge/pallets/outbound-queue-v2/src/test.rs b/bridges/snowbridge/pallets/outbound-queue-v2/src/test.rs
index 8f53485328d1..f415d8f31e87 100644
--- a/bridges/snowbridge/pallets/outbound-queue-v2/src/test.rs
+++ b/bridges/snowbridge/pallets/outbound-queue-v2/src/test.rs
@@ -1,7 +1,7 @@
-use alloy_primitives::FixedBytes;
 // SPDX-License-Identifier: Apache-2.0
 // SPDX-FileCopyrightText: 2023 Snowfork <hello@snowfork.com>
 use crate::{mock::*, *};
+use alloy_core::primitives::FixedBytes;
 
 use frame_support::{
 	assert_err, assert_noop, assert_ok,
@@ -257,7 +257,7 @@ fn encode_mock_message() {
 		.map(|command| CommandWrapper {
 			kind: command.index(),
 			gas: <Test as Config>::GasMeter::maximum_dispatch_gas_used_at_most(&command),
-			payload: command.abi_encode(),
+			payload: Bytes::from(command.abi_encode()),
 		})
 		.collect();
 
diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/snowbridge_common.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/snowbridge_common.rs
index 2d12b7fe7ee4..2f7099873277 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/snowbridge_common.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/snowbridge_common.rs
@@ -1,3 +1,18 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 use crate::{
 	create_pool_with_native_on,
 	imports::*,
diff --git a/cumulus/polkadot-omni-node/lib/Cargo.toml b/cumulus/polkadot-omni-node/lib/Cargo.toml
index cca4ac3b2b69..4d003a69456e 100644
--- a/cumulus/polkadot-omni-node/lib/Cargo.toml
+++ b/cumulus/polkadot-omni-node/lib/Cargo.toml
@@ -28,10 +28,13 @@ docify = { workspace = true }
 # Local
 jsonrpsee = { features = ["server"], workspace = true }
 parachains-common = { workspace = true, default-features = true }
+scale-info = { workspace = true }
+subxt-metadata = { workspace = true, default-features = true }
 
 # Substrate
 frame-benchmarking = { optional = true, workspace = true, default-features = true }
 frame-benchmarking-cli = { workspace = true, default-features = true }
+sp-crypto-hashing = { workspace = true }
 sp-runtime = { workspace = true }
 sp-core = { workspace = true, default-features = true }
 sp-session = { workspace = true, default-features = true }
@@ -57,12 +60,16 @@ sc-rpc = { workspace = true, default-features = true }
 sp-version = { workspace = true, default-features = true }
 sp-weights = { workspace = true, default-features = true }
 sc-tracing = { workspace = true, default-features = true }
+sc-runtime-utilities = { workspace = true, default-features = true }
+sp-storage = { workspace = true, default-features = true }
 frame-system-rpc-runtime-api = { workspace = true, default-features = true }
 pallet-transaction-payment = { workspace = true, default-features = true }
 pallet-transaction-payment-rpc-runtime-api = { workspace = true, default-features = true }
 sp-inherents = { workspace = true, default-features = true }
 sp-api = { workspace = true, default-features = true }
 sp-consensus-aura = { workspace = true, default-features = true }
+sp-io = { workspace = true, default-features = true }
+sp-wasm-interface = { workspace = true, default-features = true }
 sc-consensus-manual-seal = { workspace = true, default-features = true }
 sc-sysinfo = { workspace = true, default-features = true }
 prometheus-endpoint = { workspace = true, default-features = true }
@@ -93,15 +100,12 @@ assert_cmd = { workspace = true }
 nix = { features = ["signal"], workspace = true }
 tokio = { version = "1.32.0", features = ["macros", "parking_lot", "time"] }
 wait-timeout = { workspace = true }
+cumulus-test-runtime = { workspace = true }
 
 [features]
 default = []
-rococo-native = [
-	"polkadot-cli/rococo-native",
-]
-westend-native = [
-	"polkadot-cli/westend-native",
-]
+rococo-native = ["polkadot-cli/rococo-native"]
+westend-native = ["polkadot-cli/westend-native"]
 runtime-benchmarks = [
 	"cumulus-primitives-core/runtime-benchmarks",
 	"frame-benchmarking-cli/runtime-benchmarks",
diff --git a/cumulus/polkadot-omni-node/lib/src/common/runtime.rs b/cumulus/polkadot-omni-node/lib/src/common/runtime.rs
index 509d13b9d7a2..2a95f41495a6 100644
--- a/cumulus/polkadot-omni-node/lib/src/common/runtime.rs
+++ b/cumulus/polkadot-omni-node/lib/src/common/runtime.rs
@@ -16,7 +16,19 @@
 
 //! Runtime parameters.
 
+use codec::Decode;
+use cumulus_client_service::ParachainHostFunctions;
 use sc_chain_spec::ChainSpec;
+use sc_executor::WasmExecutor;
+use sc_runtime_utilities::fetch_latest_metadata_from_code_blob;
+use scale_info::{form::PortableForm, TypeDef, TypeDefPrimitive};
+use std::fmt::Display;
+use subxt_metadata::{Metadata, StorageEntryType};
+
+/// Expected parachain system pallet runtime type name.
+pub const DEFAULT_PARACHAIN_SYSTEM_PALLET_NAME: &str = "ParachainSystem";
+/// Expected frame system pallet runtime type name.
+pub const DEFAULT_FRAME_SYSTEM_PALLET_NAME: &str = "System";
 
 /// The Aura ID used by the Aura consensus
 #[derive(PartialEq)]
@@ -35,7 +47,7 @@ pub enum Consensus {
 }
 
 /// The choice of block number for the parachain omni-node.
-#[derive(PartialEq)]
+#[derive(PartialEq, Debug)]
 pub enum BlockNumber {
 	/// u32
 	U32,
@@ -43,6 +55,34 @@ pub enum BlockNumber {
 	U64,
 }
 
+impl Display for BlockNumber {
+	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+		match self {
+			BlockNumber::U32 => write!(f, "u32"),
+			BlockNumber::U64 => write!(f, "u64"),
+		}
+	}
+}
+
+impl Into<TypeDefPrimitive> for BlockNumber {
+	fn into(self) -> TypeDefPrimitive {
+		match self {
+			BlockNumber::U32 => TypeDefPrimitive::U32,
+			BlockNumber::U64 => TypeDefPrimitive::U64,
+		}
+	}
+}
+
+impl BlockNumber {
+	fn from_type_def(type_def: &TypeDef<PortableForm>) -> Option<BlockNumber> {
+		match type_def {
+			TypeDef::Primitive(TypeDefPrimitive::U32) => Some(BlockNumber::U32),
+			TypeDef::Primitive(TypeDefPrimitive::U64) => Some(BlockNumber::U64),
+			_ => None,
+		}
+	}
+}
+
 /// Helper enum listing the supported Runtime types
 #[derive(PartialEq)]
 pub enum Runtime {
@@ -62,7 +102,108 @@ pub trait RuntimeResolver {
 pub struct DefaultRuntimeResolver;
 
 impl RuntimeResolver for DefaultRuntimeResolver {
-	fn runtime(&self, _chain_spec: &dyn ChainSpec) -> sc_cli::Result<Runtime> {
-		Ok(Runtime::Omni(BlockNumber::U32, Consensus::Aura(AuraConsensusId::Sr25519)))
+	fn runtime(&self, chain_spec: &dyn ChainSpec) -> sc_cli::Result<Runtime> {
+		let metadata_inspector = MetadataInspector::new(chain_spec)?;
+		let block_number = match metadata_inspector.block_number() {
+			Some(inner) => inner,
+			None => {
+				log::warn!(
+					r#"⚠️  There isn't a runtime type named `System`, corresponding to the `frame-system`
+                pallet (https://docs.rs/frame-system/latest/frame_system/). Please check Omni Node docs for runtime conventions:
+                https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/omni_node/index.html#runtime-conventions.
+                Note: We'll assume a block number size of `u32`."#
+				);
+				BlockNumber::U32
+			},
+		};
+
+		if !metadata_inspector.pallet_exists(DEFAULT_PARACHAIN_SYSTEM_PALLET_NAME) {
+			log::warn!(
+				r#"⚠️  The parachain system pallet (https://docs.rs/crate/cumulus-pallet-parachain-system/latest) is
+			   missing from the runtime’s metadata. Please check Omni Node docs for runtime conventions:
+			   https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/omni_node/index.html#runtime-conventions."#
+			);
+		}
+
+		Ok(Runtime::Omni(block_number, Consensus::Aura(AuraConsensusId::Sr25519)))
+	}
+}
+
+struct MetadataInspector(Metadata);
+
+impl MetadataInspector {
+	fn new(chain_spec: &dyn ChainSpec) -> Result<MetadataInspector, sc_cli::Error> {
+		MetadataInspector::fetch_metadata(chain_spec).map(MetadataInspector)
+	}
+
+	fn pallet_exists(&self, name: &str) -> bool {
+		self.0.pallet_by_name(name).is_some()
+	}
+
+	fn block_number(&self) -> Option<BlockNumber> {
+		let pallet_metadata = self.0.pallet_by_name(DEFAULT_FRAME_SYSTEM_PALLET_NAME);
+		pallet_metadata
+			.and_then(|inner| inner.storage())
+			.and_then(|inner| inner.entry_by_name("Number"))
+			.and_then(|number_ty| match number_ty.entry_type() {
+				StorageEntryType::Plain(ty_id) => Some(ty_id),
+				_ => None,
+			})
+			.and_then(|ty_id| self.0.types().resolve(*ty_id))
+			.and_then(|portable_type| BlockNumber::from_type_def(&portable_type.type_def))
+	}
+
+	fn fetch_metadata(chain_spec: &dyn ChainSpec) -> Result<Metadata, sc_cli::Error> {
+		let mut storage = chain_spec.build_storage()?;
+		let code_bytes = storage
+			.top
+			.remove(sp_storage::well_known_keys::CODE)
+			.ok_or("chain spec genesis does not contain code")?;
+		let opaque_metadata = fetch_latest_metadata_from_code_blob(
+			&WasmExecutor::<ParachainHostFunctions>::builder()
+				.with_allow_missing_host_functions(true)
+				.build(),
+			sp_runtime::Cow::Borrowed(code_bytes.as_slice()),
+		)
+		.map_err(|err| err.to_string())?;
+
+		Metadata::decode(&mut (*opaque_metadata).as_slice()).map_err(Into::into)
+	}
+}
+
+#[cfg(test)]
+mod tests {
+	use crate::runtime::{
+		BlockNumber, MetadataInspector, DEFAULT_FRAME_SYSTEM_PALLET_NAME,
+		DEFAULT_PARACHAIN_SYSTEM_PALLET_NAME,
+	};
+	use codec::Decode;
+	use cumulus_client_service::ParachainHostFunctions;
+	use sc_executor::WasmExecutor;
+	use sc_runtime_utilities::fetch_latest_metadata_from_code_blob;
+
+	fn cumulus_test_runtime_metadata() -> subxt_metadata::Metadata {
+		let opaque_metadata = fetch_latest_metadata_from_code_blob(
+			&WasmExecutor::<ParachainHostFunctions>::builder()
+				.with_allow_missing_host_functions(true)
+				.build(),
+			sp_runtime::Cow::Borrowed(cumulus_test_runtime::WASM_BINARY.unwrap()),
+		)
+		.unwrap();
+
+		subxt_metadata::Metadata::decode(&mut (*opaque_metadata).as_slice()).unwrap()
+	}
+
+	#[test]
+	fn test_pallet_exists() {
+		let metadata_inspector = MetadataInspector(cumulus_test_runtime_metadata());
+		assert!(metadata_inspector.pallet_exists(DEFAULT_PARACHAIN_SYSTEM_PALLET_NAME));
+		assert!(metadata_inspector.pallet_exists(DEFAULT_FRAME_SYSTEM_PALLET_NAME));
+	}
+
+	#[test]
+	fn test_runtime_block_number() {
+		let metadata_inspector = MetadataInspector(cumulus_test_runtime_metadata());
+		assert_eq!(metadata_inspector.block_number().unwrap(), BlockNumber::U32);
 	}
 }
diff --git a/cumulus/polkadot-omni-node/lib/src/common/spec.rs b/cumulus/polkadot-omni-node/lib/src/common/spec.rs
index 259f89049c92..38f0e7d72881 100644
--- a/cumulus/polkadot-omni-node/lib/src/common/spec.rs
+++ b/cumulus/polkadot-omni-node/lib/src/common/spec.rs
@@ -208,151 +208,151 @@ pub(crate) trait NodeSpec: BaseNodeSpec {
 	where
 		Net: NetworkBackend<Self::Block, Hash>,
 	{
-		Box::pin(
-			async move {
-				let parachain_config = prepare_node_config(parachain_config);
-
-				let params = Self::new_partial(&parachain_config)?;
-				let (block_import, mut telemetry, telemetry_worker_handle) = params.other;
-
-				let client = params.client.clone();
-				let backend = params.backend.clone();
-
-				let mut task_manager = params.task_manager;
-				let (relay_chain_interface, collator_key) = build_relay_chain_interface(
-					polkadot_config,
-					&parachain_config,
-					telemetry_worker_handle,
-					&mut task_manager,
-					collator_options.clone(),
-					hwbench.clone(),
-				)
-				.await
-				.map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?;
-
-				let validator = parachain_config.role.is_authority();
-				let prometheus_registry = parachain_config.prometheus_registry().cloned();
-				let transaction_pool = params.transaction_pool.clone();
-				let import_queue_service = params.import_queue.service();
-				let net_config = FullNetworkConfiguration::<_, _, Net>::new(
-					&parachain_config.network,
-					prometheus_registry.clone(),
-				);
-
-				let (network, system_rpc_tx, tx_handler_controller, sync_service) =
-					build_network(BuildNetworkParams {
-						parachain_config: &parachain_config,
-						net_config,
-						client: client.clone(),
-						transaction_pool: transaction_pool.clone(),
-						para_id,
-						spawn_handle: task_manager.spawn_handle(),
-						relay_chain_interface: relay_chain_interface.clone(),
-						import_queue: params.import_queue,
-						sybil_resistance_level: Self::SYBIL_RESISTANCE,
-					})
-					.await?;
-
-				let rpc_builder = {
-					let client = client.clone();
-					let transaction_pool = transaction_pool.clone();
-					let backend_for_rpc = backend.clone();
-
-					Box::new(move |_| {
-						Self::BuildRpcExtensions::build_rpc_extensions(
-							client.clone(),
-							backend_for_rpc.clone(),
-							transaction_pool.clone(),
-						)
-					})
-				};
-
-				sc_service::spawn_tasks(sc_service::SpawnTasksParams {
-					rpc_builder,
+		let fut = async move {
+			let parachain_config = prepare_node_config(parachain_config);
+
+			let params = Self::new_partial(&parachain_config)?;
+			let (block_import, mut telemetry, telemetry_worker_handle) = params.other;
+			let client = params.client.clone();
+			let backend = params.backend.clone();
+			let mut task_manager = params.task_manager;
+			let (relay_chain_interface, collator_key) = build_relay_chain_interface(
+				polkadot_config,
+				&parachain_config,
+				telemetry_worker_handle,
+				&mut task_manager,
+				collator_options.clone(),
+				hwbench.clone(),
+			)
+			.await
+			.map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?;
+
+			let validator = parachain_config.role.is_authority();
+			let prometheus_registry = parachain_config.prometheus_registry().cloned();
+			let transaction_pool = params.transaction_pool.clone();
+			let import_queue_service = params.import_queue.service();
+			let net_config = FullNetworkConfiguration::<_, _, Net>::new(
+				&parachain_config.network,
+				prometheus_registry.clone(),
+			);
+
+			let (network, system_rpc_tx, tx_handler_controller, sync_service) =
+				build_network(BuildNetworkParams {
+					parachain_config: &parachain_config,
+					net_config,
 					client: client.clone(),
 					transaction_pool: transaction_pool.clone(),
-					task_manager: &mut task_manager,
-					config: parachain_config,
-					keystore: params.keystore_container.keystore(),
-					backend: backend.clone(),
-					network: network.clone(),
-					sync_service: sync_service.clone(),
-					system_rpc_tx,
-					tx_handler_controller,
-					telemetry: telemetry.as_mut(),
-				})?;
-
-				if let Some(hwbench) = hwbench {
-					sc_sysinfo::print_hwbench(&hwbench);
-					if validator {
-						warn_if_slow_hardware(&hwbench);
-					}
-
-					if let Some(ref mut telemetry) = telemetry {
-						let telemetry_handle = telemetry.handle();
-						task_manager.spawn_handle().spawn(
-							"telemetry_hwbench",
-							None,
-							sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench),
-						);
-					}
-				}
-
-				let announce_block = {
-					let sync_service = sync_service.clone();
-					Arc::new(move |hash, data| sync_service.announce_block(hash, data))
-				};
-
-				let relay_chain_slot_duration = Duration::from_secs(6);
-
-				let overseer_handle = relay_chain_interface
-					.overseer_handle()
-					.map_err(|e| sc_service::Error::Application(Box::new(e)))?;
-
-				start_relay_chain_tasks(StartRelayChainTasksParams {
-					client: client.clone(),
-					announce_block: announce_block.clone(),
 					para_id,
+					spawn_handle: task_manager.spawn_handle(),
 					relay_chain_interface: relay_chain_interface.clone(),
-					task_manager: &mut task_manager,
-					da_recovery_profile: if validator {
-						DARecoveryProfile::Collator
-					} else {
-						DARecoveryProfile::FullNode
-					},
-					import_queue: import_queue_service,
-					relay_chain_slot_duration,
-					recovery_handle: Box::new(overseer_handle.clone()),
-					sync_service,
-				})?;
-
-				if validator {
-					Self::StartConsensus::start_consensus(
+					import_queue: params.import_queue,
+					sybil_resistance_level: Self::SYBIL_RESISTANCE,
+				})
+				.await?;
+
+			let rpc_builder = {
+				let client = client.clone();
+				let transaction_pool = transaction_pool.clone();
+				let backend_for_rpc = backend.clone();
+
+				Box::new(move |_| {
+					Self::BuildRpcExtensions::build_rpc_extensions(
 						client.clone(),
-						block_import,
-						prometheus_registry.as_ref(),
-						telemetry.as_ref().map(|t| t.handle()),
-						&task_manager,
-						relay_chain_interface.clone(),
-						transaction_pool,
-						params.keystore_container.keystore(),
-						relay_chain_slot_duration,
-						para_id,
-						collator_key.expect("Command line arguments do not allow this. qed"),
-						overseer_handle,
-						announce_block,
-						backend.clone(),
-						node_extra_args,
-					)?;
+						backend_for_rpc.clone(),
+						transaction_pool.clone(),
+					)
+				})
+			};
+
+			sc_service::spawn_tasks(sc_service::SpawnTasksParams {
+				rpc_builder,
+				client: client.clone(),
+				transaction_pool: transaction_pool.clone(),
+				task_manager: &mut task_manager,
+				config: parachain_config,
+				keystore: params.keystore_container.keystore(),
+				backend: backend.clone(),
+				network: network.clone(),
+				sync_service: sync_service.clone(),
+				system_rpc_tx,
+				tx_handler_controller,
+				telemetry: telemetry.as_mut(),
+			})?;
+
+			if let Some(hwbench) = hwbench {
+				sc_sysinfo::print_hwbench(&hwbench);
+				if validator {
+					warn_if_slow_hardware(&hwbench);
 				}
 
-				Ok(task_manager)
+				if let Some(ref mut telemetry) = telemetry {
+					let telemetry_handle = telemetry.handle();
+					task_manager.spawn_handle().spawn(
+						"telemetry_hwbench",
+						None,
+						sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench),
+					);
+				}
 			}
-			.instrument(sc_tracing::tracing::info_span!(
+
+			let announce_block = {
+				let sync_service = sync_service.clone();
+				Arc::new(move |hash, data| sync_service.announce_block(hash, data))
+			};
+
+			let relay_chain_slot_duration = Duration::from_secs(6);
+
+			let overseer_handle = relay_chain_interface
+				.overseer_handle()
+				.map_err(|e| sc_service::Error::Application(Box::new(e)))?;
+
+			start_relay_chain_tasks(StartRelayChainTasksParams {
+				client: client.clone(),
+				announce_block: announce_block.clone(),
+				para_id,
+				relay_chain_interface: relay_chain_interface.clone(),
+				task_manager: &mut task_manager,
+				da_recovery_profile: if validator {
+					DARecoveryProfile::Collator
+				} else {
+					DARecoveryProfile::FullNode
+				},
+				import_queue: import_queue_service,
+				relay_chain_slot_duration,
+				recovery_handle: Box::new(overseer_handle.clone()),
+				sync_service,
+			})?;
+
+			if validator {
+				Self::StartConsensus::start_consensus(
+					client.clone(),
+					block_import,
+					prometheus_registry.as_ref(),
+					telemetry.as_ref().map(|t| t.handle()),
+					&task_manager,
+					relay_chain_interface.clone(),
+					transaction_pool,
+					params.keystore_container.keystore(),
+					relay_chain_slot_duration,
+					para_id,
+					collator_key.expect("Command line arguments do not allow this. qed"),
+					overseer_handle,
+					announce_block,
+					backend.clone(),
+					node_extra_args,
+				)?;
+			}
+
+			Ok(task_manager)
+		};
+
+		Box::pin(Instrument::instrument(
+			fut,
+			sc_tracing::tracing::info_span!(
 				sc_tracing::logging::PREFIX_LOG_SPAN,
-				name = "Parachain",
-			)),
-		)
+				name = "Parachain"
+			),
+		))
 	}
 }
 
diff --git a/docs/sdk/src/reference_docs/omni_node.rs b/docs/sdk/src/reference_docs/omni_node.rs
index 44d63704a458..150755fb29a2 100644
--- a/docs/sdk/src/reference_docs/omni_node.rs
+++ b/docs/sdk/src/reference_docs/omni_node.rs
@@ -177,9 +177,25 @@
 //! [This](https://github.com/paritytech/polkadot-sdk/issues/5565) future improvement to OmniNode
 //! aims to make such checks automatic.
 //!
+//! ### Runtime conventions
+//!
+//! The Omni Node needs to make some assumptions about the runtime. During startup, the node fetches
+//! the runtime metadata and asserts that the runtime represents a compatible parachain.
+//! The checks are best effort and will generate warning level logs in the Omni Node log file on
+//! failure.
+//!
+//! The list of checks may evolve in the future and for now only few rules are implemented:
+//! * runtimes must define a type for [`cumulus-pallet-parachain-system`], which is recommended to
+//!   be named as `ParachainSystem`.
+//! * runtimes must define a type for [`frame-system`] pallet, which is recommended to be named as
+//!   `System`. The configured [`block number`] here will be used by Omni Node to configure AURA
+//!   accordingly.
 //!
 //! [`templates`]: crate::polkadot_sdk::templates
 //! [`parachain-template`]: https://github.com/paritytech/polkadot-sdk-parachain-template
 //! [`--dev-block-time`]: polkadot_omni_node_lib::cli::Cli::dev_block_time
 //! [`polkadot-omni-node`]: https://crates.io/crates/polkadot-omni-node
 //! [`chain-spec-builder`]: https://crates.io/crates/staging-chain-spec-builder
+//! [`cumulus-pallet-parachain-system`]: https://docs.rs/cumulus-pallet-parachain-system/latest/cumulus_pallet_parachain_system/
+//! [`frame-system`]: https://docs.rs/frame-system/latest/frame_system/
+//! [`block number`]: https://docs.rs/frame-system/latest/frame_system/pallet/storage_types/struct.Number.html
diff --git a/polkadot/node/service/src/overseer.rs b/polkadot/node/service/src/overseer.rs
index 279b6ff80704..e4ea6efeaac2 100644
--- a/polkadot/node/service/src/overseer.rs
+++ b/polkadot/node/service/src/overseer.rs
@@ -210,7 +210,7 @@ pub fn validator_overseer_builder<Spawner, RuntimeClient>(
 			AuthorityDiscoveryService,
 		>,
 		ChainApiSubsystem<RuntimeClient>,
-		CollationGenerationSubsystem,
+		DummySubsystem,
 		CollatorProtocolSubsystem,
 		ApprovalDistributionSubsystem,
 		ApprovalVotingSubsystem,
@@ -237,6 +237,7 @@ where
 	let network_bridge_metrics: NetworkBridgeMetrics = Metrics::register(registry)?;
 	let approval_voting_parallel_metrics: ApprovalVotingParallelMetrics =
 		Metrics::register(registry)?;
+
 	let builder = Overseer::builder()
 		.network_bridge_tx(NetworkBridgeTxSubsystem::new(
 			network_service.clone(),
@@ -295,7 +296,7 @@ where
 		))
 		.pvf_checker(PvfCheckerSubsystem::new(keystore.clone(), Metrics::register(registry)?))
 		.chain_api(ChainApiSubsystem::new(runtime_client.clone(), Metrics::register(registry)?))
-		.collation_generation(CollationGenerationSubsystem::new(Metrics::register(registry)?))
+		.collation_generation(DummySubsystem)
 		.collator_protocol({
 			let side = match is_parachain_node {
 				IsParachainNode::Collator(_) | IsParachainNode::FullNode =>
@@ -434,7 +435,7 @@ pub fn validator_with_parallel_overseer_builder<Spawner, RuntimeClient>(
 			AuthorityDiscoveryService,
 		>,
 		ChainApiSubsystem<RuntimeClient>,
-		CollationGenerationSubsystem,
+		DummySubsystem,
 		CollatorProtocolSubsystem,
 		DummySubsystem,
 		DummySubsystem,
@@ -519,7 +520,7 @@ where
 		))
 		.pvf_checker(PvfCheckerSubsystem::new(keystore.clone(), Metrics::register(registry)?))
 		.chain_api(ChainApiSubsystem::new(runtime_client.clone(), Metrics::register(registry)?))
-		.collation_generation(CollationGenerationSubsystem::new(Metrics::register(registry)?))
+		.collation_generation(DummySubsystem)
 		.collator_protocol({
 			let side = match is_parachain_node {
 				IsParachainNode::Collator(_) | IsParachainNode::FullNode =>
diff --git a/prdoc/pr_6450.prdoc b/prdoc/pr_6450.prdoc
new file mode 100644
index 000000000000..a9e927e45106
--- /dev/null
+++ b/prdoc/pr_6450.prdoc
@@ -0,0 +1,21 @@
+# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0
+# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json
+
+title: Add omni-node checks for runtime parachain compatibility 
+
+doc:
+  - audience: [ Node Dev, Runtime Dev ]
+    description: |
+      OmniNode parses runtime metadata and checks against the existence of `cumulus-pallet-parachain-system`
+      and `frame-system`, by filtering pallets by names: `ParachainSystem` and `System`. It also checks the
+      `frame-system` pallet storage `Number` type, and then uses it to configure AURA if `u32` or `u64`.
+
+crates:
+  - name: polkadot-omni-node-lib
+    bump: minor
+  - name: polkadot-sdk
+    bump: minor
+  - name: sc-runtime-utilities
+    bump: patch
+  - name: frame-benchmarking-cli
+    bump: major
diff --git a/prdoc/pr_6832.prdoc b/prdoc/pr_6832.prdoc
new file mode 100644
index 000000000000..bd0abbfba853
--- /dev/null
+++ b/prdoc/pr_6832.prdoc
@@ -0,0 +1,13 @@
+# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0
+# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json
+
+title: "Remove collation-generation subsystem from validator nodes"
+
+doc:
+  - audience: Node Dev
+    description: |
+      Collation-generation is only needed for Collators, and therefore not needed for validators
+
+crates: 
+  - name: polkadot-service
+    bump: patch
\ No newline at end of file
diff --git a/prdoc/pr_6835.prdoc b/prdoc/pr_6835.prdoc
new file mode 100644
index 000000000000..73d1a81e761c
--- /dev/null
+++ b/prdoc/pr_6835.prdoc
@@ -0,0 +1,12 @@
+title: '[pallet-revive] implement the call data load API'
+doc:
+- audience: Runtime Dev
+  description: |-
+    This PR implements the call data load API akin to [how it works on ethereum](https://www.evm.codes/?fork=cancun#35).
+crates:
+- name: pallet-revive-fixtures
+  bump: minor
+- name: pallet-revive
+  bump: minor
+- name: pallet-revive-uapi
+  bump: minor
diff --git a/prdoc/pr_6844.prdoc b/prdoc/pr_6844.prdoc
new file mode 100644
index 000000000000..32901bf04df9
--- /dev/null
+++ b/prdoc/pr_6844.prdoc
@@ -0,0 +1,8 @@
+title: 'pallet-revive: disable host functions unused in solidity PolkaVM compiler'
+doc:
+- audience: Runtime Dev
+  description: Disables host functions in contracts that are not enabled
+    in solidity PolkaVM compiler to reduce surface of possible attack vectors.
+crates:
+- name: pallet-revive
+  bump: major
diff --git a/substrate/client/runtime-utilities/Cargo.toml b/substrate/client/runtime-utilities/Cargo.toml
new file mode 100644
index 000000000000..5e026a5eff1a
--- /dev/null
+++ b/substrate/client/runtime-utilities/Cargo.toml
@@ -0,0 +1,36 @@
+[package]
+description = "Substrate client utilities for frame runtime functions calls."
+name = "sc-runtime-utilities"
+version = "0.1.0"
+license = "GPL-3.0-or-later WITH Classpath-exception-2.0"
+authors.workspace = true
+edition.workspace = true
+homepage.workspace = true
+repository.workspace = true
+documentation = "https://docs.rs/sc-metadata"
+
+[lints]
+workspace = true
+
+[package.metadata.docs.rs]
+targets = ["x86_64-unknown-linux-gnu"]
+
+[dependencies]
+codec = { workspace = true, default-features = true }
+
+sc-executor = { workspace = true, default-features = true }
+sc-executor-common = { workspace = true, default-features = true }
+sp-core = { workspace = true, default-features = true }
+sp-crypto-hashing = { workspace = true, default-features = true }
+sp-wasm-interface = { workspace = true, default-features = true }
+sp-state-machine = { workspace = true, default-features = true }
+
+
+thiserror = { workspace = true }
+
+[dev-dependencies]
+cumulus-primitives-proof-size-hostfunction = { workspace = true, default-features = true }
+cumulus-test-runtime = { workspace = true, default-features = true }
+sp-version = { workspace = true, default-features = true }
+sp-io = { workspace = true, default-features = true }
+subxt = { workspace = true, features = ["native"] }
diff --git a/substrate/client/runtime-utilities/src/error.rs b/substrate/client/runtime-utilities/src/error.rs
new file mode 100644
index 000000000000..a0f1e45a5e57
--- /dev/null
+++ b/substrate/client/runtime-utilities/src/error.rs
@@ -0,0 +1,35 @@
+// This file is part of Substrate.
+
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <https://www.gnu.org/licenses/>.
+//! Errors types of runtime utilities.
+
+/// Generic result for the runtime utilities.
+pub type Result<T> = std::result::Result<T, Error>;
+
+/// Error type for the runtime utilities.
+#[derive(Debug, thiserror::Error)]
+#[allow(missing_docs)]
+pub enum Error {
+	#[error("Scale codec error: {0}")]
+	ScaleCodec(#[from] codec::Error),
+	#[error("Opaque metadata not found")]
+	OpaqueMetadataNotFound,
+	#[error("Stable metadata version not found")]
+	StableMetadataVersionNotFound,
+	#[error("WASM executor error: {0}")]
+	Executor(#[from] sc_executor_common::error::Error),
+}
diff --git a/substrate/utils/frame/benchmarking-cli/src/overhead/runtime_utilities.rs b/substrate/client/runtime-utilities/src/lib.rs
similarity index 60%
rename from substrate/utils/frame/benchmarking-cli/src/overhead/runtime_utilities.rs
rename to substrate/client/runtime-utilities/src/lib.rs
index 3081197dc033..1ae3e2f1105a 100644
--- a/substrate/utils/frame/benchmarking-cli/src/overhead/runtime_utilities.rs
+++ b/substrate/client/runtime-utilities/src/lib.rs
@@ -1,21 +1,29 @@
 // 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.
+// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+//! Substrate client runtime utilities.
+//!
+//! Provides convenient APIs to ease calling functions contained by a FRAME
+//! runtime WASM blob.
+#![warn(missing_docs)]
 
 use codec::{Decode, Encode};
+use error::{Error, Result};
 use sc_executor::WasmExecutor;
 use sp_core::{
 	traits::{CallContext, CodeExecutor, FetchRuntimeCode, RuntimeCode},
@@ -25,41 +33,35 @@ use sp_state_machine::BasicExternalities;
 use sp_wasm_interface::HostFunctions;
 use std::borrow::Cow;
 
+pub mod error;
+
 /// Fetches the latest metadata from the given runtime blob.
 pub fn fetch_latest_metadata_from_code_blob<HF: HostFunctions>(
 	executor: &WasmExecutor<HF>,
 	code_bytes: Cow<[u8]>,
-) -> sc_cli::Result<subxt::Metadata> {
+) -> Result<OpaqueMetadata> {
 	let runtime_caller = RuntimeCaller::new(executor, code_bytes);
 	let version_result = runtime_caller.call("Metadata_metadata_versions", ());
 
-	let opaque_metadata: OpaqueMetadata = match version_result {
+	match version_result {
 		Ok(supported_versions) => {
-			let supported_versions = Vec::<u32>::decode(&mut supported_versions.as_slice())
-				.map_err(|e| format!("Unable to decode version list: {e}"))?;
-
+			let supported_versions = Vec::<u32>::decode(&mut supported_versions.as_slice())?;
 			let latest_stable = supported_versions
 				.into_iter()
 				.filter(|v| *v != u32::MAX)
 				.max()
-				.ok_or("No stable metadata versions supported".to_string())?;
+				.ok_or(Error::StableMetadataVersionNotFound)?;
 
-			let encoded = runtime_caller
-				.call("Metadata_metadata_at_version", latest_stable)
-				.map_err(|_| "Unable to fetch metadata from blob".to_string())?;
+			let encoded = runtime_caller.call("Metadata_metadata_at_version", latest_stable)?;
 
 			Option::<OpaqueMetadata>::decode(&mut encoded.as_slice())?
-				.ok_or_else(|| "Metadata not found".to_string())?
+				.ok_or(Error::OpaqueMetadataNotFound)
 		},
 		Err(_) => {
-			let encoded = runtime_caller
-				.call("Metadata_metadata", ())
-				.map_err(|_| "Unable to fetch metadata from blob".to_string())?;
-			Decode::decode(&mut encoded.as_slice())?
+			let encoded = runtime_caller.call("Metadata_metadata", ())?;
+			Decode::decode(&mut encoded.as_slice()).map_err(Into::into)
 		},
-	};
-
-	Ok(subxt::Metadata::decode(&mut (*opaque_metadata).as_slice())?)
+	}
 }
 
 struct BasicCodeFetcher<'a> {
@@ -74,11 +76,11 @@ impl<'a> FetchRuntimeCode for BasicCodeFetcher<'a> {
 }
 
 impl<'a> BasicCodeFetcher<'a> {
-	pub fn new(code: Cow<'a, [u8]>) -> Self {
+	fn new(code: Cow<'a, [u8]>) -> Self {
 		Self { hash: sp_crypto_hashing::blake2_256(&code).to_vec(), code }
 	}
 
-	pub fn runtime_code(&'a self) -> RuntimeCode<'a> {
+	fn runtime_code(&'a self) -> RuntimeCode<'a> {
 		RuntimeCode {
 			code_fetcher: self as &'a dyn FetchRuntimeCode,
 			heap_pages: None,
@@ -88,17 +90,20 @@ impl<'a> BasicCodeFetcher<'a> {
 }
 
 /// Simple utility that is used to call into the runtime.
-struct RuntimeCaller<'a, 'b, HF: HostFunctions> {
+pub struct RuntimeCaller<'a, 'b, HF: HostFunctions> {
 	executor: &'b WasmExecutor<HF>,
 	code_fetcher: BasicCodeFetcher<'a>,
 }
 
 impl<'a, 'b, HF: HostFunctions> RuntimeCaller<'a, 'b, HF> {
+	/// Instantiate a new runtime caller.
 	pub fn new(executor: &'b WasmExecutor<HF>, code_bytes: Cow<'a, [u8]>) -> Self {
 		Self { executor, code_fetcher: BasicCodeFetcher::new(code_bytes) }
 	}
 
-	fn call(&self, method: &str, data: impl Encode) -> sc_executor_common::error::Result<Vec<u8>> {
+	/// Calls a runtime function represented by a `method` name and `parity-scale-codec`
+	/// encodable arguments that will be passed to it.
+	pub fn call(&self, method: &str, data: impl Encode) -> Result<Vec<u8>> {
 		let mut ext = BasicExternalities::default();
 		self.executor
 			.call(
@@ -109,24 +114,33 @@ impl<'a, 'b, HF: HostFunctions> RuntimeCaller<'a, 'b, HF> {
 				CallContext::Offchain,
 			)
 			.0
+			.map_err(Into::into)
 	}
 }
 
 #[cfg(test)]
 mod tests {
-	use crate::overhead::command::ParachainHostFunctions;
 	use codec::Decode;
 	use sc_executor::WasmExecutor;
 	use sp_version::RuntimeVersion;
 
+	type ParachainHostFunctions = (
+		cumulus_primitives_proof_size_hostfunction::storage_proof_size::HostFunctions,
+		sp_io::SubstrateHostFunctions,
+	);
+
 	#[test]
 	fn test_fetch_latest_metadata_from_blob_fetches_metadata() {
 		let executor: WasmExecutor<ParachainHostFunctions> = WasmExecutor::builder().build();
 		let code_bytes = cumulus_test_runtime::WASM_BINARY
 			.expect("To run this test, build the wasm binary of cumulus-test-runtime")
 			.to_vec();
-		let metadata =
-			super::fetch_latest_metadata_from_code_blob(&executor, code_bytes.into()).unwrap();
+		let metadata = subxt::Metadata::decode(
+			&mut (*super::fetch_latest_metadata_from_code_blob(&executor, code_bytes.into())
+				.unwrap())
+			.as_slice(),
+		)
+		.unwrap();
 		assert!(metadata.pallet_by_name("ParachainInfo").is_some());
 	}
 
diff --git a/substrate/frame/revive/fixtures/contracts/call_data_load.rs b/substrate/frame/revive/fixtures/contracts/call_data_load.rs
new file mode 100644
index 000000000000..d3df9433f5d1
--- /dev/null
+++ b/substrate/frame/revive/fixtures/contracts/call_data_load.rs
@@ -0,0 +1,44 @@
+// This file is part of Substrate.
+
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! This uses the call data load API to first the first input byte.
+//! This single input byte is used as the offset for a second call
+//! to the call data load API.
+//! The output of the second API call is returned.
+
+#![no_std]
+#![no_main]
+
+extern crate common;
+use uapi::{HostFn, HostFnImpl as api, ReturnFlags};
+
+#[no_mangle]
+#[polkavm_derive::polkavm_export]
+pub extern "C" fn deploy() {}
+
+#[no_mangle]
+#[polkavm_derive::polkavm_export]
+pub extern "C" fn call() {
+	let mut buf = [0; 32];
+	api::call_data_load(&mut buf, 0);
+
+	let offset = buf[31] as u32;
+	let mut buf = [0; 32];
+	api::call_data_load(&mut buf, offset);
+
+	api::return_value(ReturnFlags::empty(), &buf);
+}
diff --git a/substrate/frame/revive/src/benchmarking/mod.rs b/substrate/frame/revive/src/benchmarking/mod.rs
index ebdea8675824..94fac13d78e8 100644
--- a/substrate/frame/revive/src/benchmarking/mod.rs
+++ b/substrate/frame/revive/src/benchmarking/mod.rs
@@ -838,6 +838,21 @@ mod benchmarks {
 		assert_eq!(U256::from_little_endian(&memory[..]), runtime.ext().get_weight_price(weight));
 	}
 
+	#[benchmark(pov_mode = Measured)]
+	fn seal_call_data_load() {
+		let mut setup = CallSetup::<T>::default();
+		let (mut ext, _) = setup.ext();
+		let mut runtime = crate::wasm::Runtime::new(&mut ext, vec![42u8; 32]);
+		let mut memory = memory!(vec![0u8; 32],);
+		let result;
+		#[block]
+		{
+			result = runtime.bench_call_data_load(memory.as_mut_slice(), 0, 0);
+		}
+		assert_ok!(result);
+		assert_eq!(&memory[..], &vec![42u8; 32]);
+	}
+
 	#[benchmark(pov_mode = Measured)]
 	fn seal_input(n: Linear<0, { limits::code::BLOB_BYTES - 4 }>) {
 		let mut setup = CallSetup::<T>::default();
diff --git a/substrate/frame/revive/src/tests.rs b/substrate/frame/revive/src/tests.rs
index a000de1491fa..b3cd591e4d0c 100644
--- a/substrate/frame/revive/src/tests.rs
+++ b/substrate/frame/revive/src/tests.rs
@@ -4407,6 +4407,48 @@ fn chain_id_works() {
 	});
 }
 
+#[test]
+fn call_data_load_api_works() {
+	let (code, _) = compile_module("call_data_load").unwrap();
+
+	ExtBuilder::default().existential_deposit(100).build().execute_with(|| {
+		let _ = <Test as Config>::Currency::set_balance(&ALICE, 1_000_000);
+
+		// Create fixture: Constructor does nothing
+		let Contract { addr, .. } =
+			builder::bare_instantiate(Code::Upload(code)).build_and_unwrap_contract();
+
+		// Call the contract: It reads a byte for the offset and then returns
+		// what call data load returned using this byte as the offset.
+		let input = (3u8, U256::max_value(), U256::max_value()).encode();
+		let received = builder::bare_call(addr).data(input).build().result.unwrap();
+		assert_eq!(received.flags, ReturnFlags::empty());
+		assert_eq!(U256::from_little_endian(&received.data), U256::max_value());
+
+		// Edge case
+		let input = (2u8, U256::from(255).to_big_endian()).encode();
+		let received = builder::bare_call(addr).data(input).build().result.unwrap();
+		assert_eq!(received.flags, ReturnFlags::empty());
+		assert_eq!(U256::from_little_endian(&received.data), U256::from(65280));
+
+		// Edge case
+		let received = builder::bare_call(addr).data(vec![1]).build().result.unwrap();
+		assert_eq!(received.flags, ReturnFlags::empty());
+		assert_eq!(U256::from_little_endian(&received.data), U256::zero());
+
+		// OOB case
+		let input = (42u8).encode();
+		let received = builder::bare_call(addr).data(input).build().result.unwrap();
+		assert_eq!(received.flags, ReturnFlags::empty());
+		assert_eq!(U256::from_little_endian(&received.data), U256::zero());
+
+		// No calldata should return the zero value
+		let received = builder::bare_call(addr).build().result.unwrap();
+		assert_eq!(received.flags, ReturnFlags::empty());
+		assert_eq!(U256::from_little_endian(&received.data), U256::zero());
+	});
+}
+
 #[test]
 fn return_data_api_works() {
 	let (code_return_data_api, _) = compile_module("return_data_api").unwrap();
diff --git a/substrate/frame/revive/src/wasm/runtime.rs b/substrate/frame/revive/src/wasm/runtime.rs
index 8d54b7fd0ddf..d8b856b0b766 100644
--- a/substrate/frame/revive/src/wasm/runtime.rs
+++ b/substrate/frame/revive/src/wasm/runtime.rs
@@ -267,6 +267,8 @@ pub enum RuntimeCosts {
 	CopyFromContract(u32),
 	/// Weight charged for copying data to the sandbox.
 	CopyToContract(u32),
+	/// Weight of calling `seal_call_data_load``.
+	CallDataLoad,
 	/// Weight of calling `seal_caller`.
 	Caller,
 	/// Weight of calling `seal_origin`.
@@ -429,6 +431,7 @@ impl<T: Config> Token<T> for RuntimeCosts {
 			HostFn => cost_args!(noop_host_fn, 1),
 			CopyToContract(len) => T::WeightInfo::seal_input(len),
 			CopyFromContract(len) => T::WeightInfo::seal_return(len),
+			CallDataLoad => T::WeightInfo::seal_call_data_load(),
 			Caller => T::WeightInfo::seal_caller(),
 			Origin => T::WeightInfo::seal_origin(),
 			IsContract => T::WeightInfo::seal_is_contract(),
@@ -1145,7 +1148,6 @@ pub mod env {
 
 	/// Clear the value at the given key in the contract storage.
 	/// See [`pallet_revive_uapi::HostFn::clear_storage`]
-	#[stable]
 	#[mutating]
 	fn clear_storage(
 		&mut self,
@@ -1174,7 +1176,6 @@ pub mod env {
 
 	/// Checks whether there is a value stored under the given key.
 	/// See [`pallet_revive_uapi::HostFn::contains_storage`]
-	#[stable]
 	fn contains_storage(
 		&mut self,
 		memory: &mut M,
@@ -1187,7 +1188,6 @@ pub mod env {
 
 	/// Retrieve and remove the value under the given key from storage.
 	/// See [`pallet_revive_uapi::HostFn::take_storage`]
-	#[stable]
 	#[mutating]
 	fn take_storage(
 		&mut self,
@@ -1298,7 +1298,6 @@ pub mod env {
 
 	/// Remove the calling account and transfer remaining **free** balance.
 	/// See [`pallet_revive_uapi::HostFn::terminate`].
-	#[stable]
 	#[mutating]
 	fn terminate(&mut self, memory: &mut M, beneficiary_ptr: u32) -> Result<(), TrapReason> {
 		self.terminate(memory, beneficiary_ptr)
@@ -1319,6 +1318,37 @@ pub mod env {
 		}
 	}
 
+	/// Stores the U256 value at given call input `offset` into the supplied buffer.
+	/// See [`pallet_revive_uapi::HostFn::call_data_load`].
+	#[stable]
+	fn call_data_load(
+		&mut self,
+		memory: &mut M,
+		out_ptr: u32,
+		offset: u32,
+	) -> Result<(), TrapReason> {
+		self.charge_gas(RuntimeCosts::CallDataLoad)?;
+
+		let Some(input) = self.input_data.as_ref() else {
+			return Err(Error::<E::T>::InputForwarded.into());
+		};
+
+		let mut data = [0; 32];
+		let start = offset as usize;
+		let data = if start >= input.len() {
+			data // Any index is valid to request; OOB offsets return zero.
+		} else {
+			let end = start.saturating_add(32).min(input.len());
+			data[..end - start].copy_from_slice(&input[start..end]);
+			data.reverse();
+			data // Solidity expects right-padded data
+		};
+
+		self.write_fixed_sandbox_output(memory, out_ptr, &data, false, already_charged)?;
+
+		Ok(())
+	}
+
 	/// Cease contract execution and save a data buffer as a result of the execution.
 	/// See [`pallet_revive_uapi::HostFn::return_value`].
 	#[stable]
@@ -1365,7 +1395,6 @@ pub mod env {
 
 	/// Checks whether a specified address belongs to a contract.
 	/// See [`pallet_revive_uapi::HostFn::is_contract`].
-	#[stable]
 	fn is_contract(&mut self, memory: &mut M, account_ptr: u32) -> Result<u32, TrapReason> {
 		self.charge_gas(RuntimeCosts::IsContract)?;
 		let address = memory.read_h160(account_ptr)?;
@@ -1404,7 +1433,6 @@ pub mod env {
 
 	/// Retrieve the code hash of the currently executing contract.
 	/// See [`pallet_revive_uapi::HostFn::own_code_hash`].
-	#[stable]
 	fn own_code_hash(&mut self, memory: &mut M, out_ptr: u32) -> Result<(), TrapReason> {
 		self.charge_gas(RuntimeCosts::OwnCodeHash)?;
 		let code_hash = *self.ext.own_code_hash();
@@ -1419,7 +1447,6 @@ pub mod env {
 
 	/// Checks whether the caller of the current contract is the origin of the whole call stack.
 	/// See [`pallet_revive_uapi::HostFn::caller_is_origin`].
-	#[stable]
 	fn caller_is_origin(&mut self, _memory: &mut M) -> Result<u32, TrapReason> {
 		self.charge_gas(RuntimeCosts::CallerIsOrigin)?;
 		Ok(self.ext.caller_is_origin() as u32)
@@ -1427,7 +1454,6 @@ pub mod env {
 
 	/// Checks whether the caller of the current contract is root.
 	/// See [`pallet_revive_uapi::HostFn::caller_is_root`].
-	#[stable]
 	fn caller_is_root(&mut self, _memory: &mut M) -> Result<u32, TrapReason> {
 		self.charge_gas(RuntimeCosts::CallerIsRoot)?;
 		Ok(self.ext.caller_is_root() as u32)
@@ -1471,7 +1497,6 @@ pub mod env {
 
 	/// Stores the amount of weight left into the supplied buffer.
 	/// See [`pallet_revive_uapi::HostFn::weight_left`].
-	#[stable]
 	fn weight_left(
 		&mut self,
 		memory: &mut M,
@@ -1597,7 +1622,6 @@ pub mod env {
 
 	/// Stores the minimum balance (a.k.a. existential deposit) into the supplied buffer.
 	/// See [`pallet_revive_uapi::HostFn::minimum_balance`].
-	#[stable]
 	fn minimum_balance(&mut self, memory: &mut M, out_ptr: u32) -> Result<(), TrapReason> {
 		self.charge_gas(RuntimeCosts::MinimumBalance)?;
 		Ok(self.write_fixed_sandbox_output(
@@ -1686,7 +1710,6 @@ pub mod env {
 
 	/// Computes the SHA2 256-bit hash on the given input buffer.
 	/// See [`pallet_revive_uapi::HostFn::hash_sha2_256`].
-	#[stable]
 	fn hash_sha2_256(
 		&mut self,
 		memory: &mut M,
@@ -1718,7 +1741,6 @@ pub mod env {
 
 	/// Computes the BLAKE2 256-bit hash on the given input buffer.
 	/// See [`pallet_revive_uapi::HostFn::hash_blake2_256`].
-	#[stable]
 	fn hash_blake2_256(
 		&mut self,
 		memory: &mut M,
@@ -1734,7 +1756,6 @@ pub mod env {
 
 	/// Computes the BLAKE2 128-bit hash on the given input buffer.
 	/// See [`pallet_revive_uapi::HostFn::hash_blake2_128`].
-	#[stable]
 	fn hash_blake2_128(
 		&mut self,
 		memory: &mut M,
@@ -1780,7 +1801,6 @@ pub mod env {
 
 	/// Emit a custom debug message.
 	/// See [`pallet_revive_uapi::HostFn::debug_message`].
-	#[stable]
 	fn debug_message(
 		&mut self,
 		memory: &mut M,
@@ -1898,7 +1918,6 @@ pub mod env {
 
 	/// Recovers the ECDSA public key from the given message hash and signature.
 	/// See [`pallet_revive_uapi::HostFn::ecdsa_recover`].
-	#[stable]
 	fn ecdsa_recover(
 		&mut self,
 		memory: &mut M,
@@ -1929,7 +1948,6 @@ pub mod env {
 
 	/// Verify a sr25519 signature
 	/// See [`pallet_revive_uapi::HostFn::sr25519_verify`].
-	#[stable]
 	fn sr25519_verify(
 		&mut self,
 		memory: &mut M,
@@ -1970,7 +1988,6 @@ pub mod env {
 
 	/// Calculates Ethereum address from the ECDSA compressed public key and stores
 	/// See [`pallet_revive_uapi::HostFn::ecdsa_to_eth_address`].
-	#[stable]
 	fn ecdsa_to_eth_address(
 		&mut self,
 		memory: &mut M,
@@ -1992,7 +2009,6 @@ pub mod env {
 
 	/// Adds a new delegate dependency to the contract.
 	/// See [`pallet_revive_uapi::HostFn::lock_delegate_dependency`].
-	#[stable]
 	#[mutating]
 	fn lock_delegate_dependency(
 		&mut self,
@@ -2007,7 +2023,6 @@ pub mod env {
 
 	/// Removes the delegate dependency from the contract.
 	/// see [`pallet_revive_uapi::HostFn::unlock_delegate_dependency`].
-	#[stable]
 	#[mutating]
 	fn unlock_delegate_dependency(
 		&mut self,
diff --git a/substrate/frame/revive/src/weights.rs b/substrate/frame/revive/src/weights.rs
index 96654432a5cc..e9178287f8f9 100644
--- a/substrate/frame/revive/src/weights.rs
+++ b/substrate/frame/revive/src/weights.rs
@@ -18,28 +18,28 @@
 //! Autogenerated weights for `pallet_revive`
 //!
 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
-//! DATE: 2024-11-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2024-12-11, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
-//! HOSTNAME: `runner-wiukf8gn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
+//! HOSTNAME: `9fd11f1b2ec3`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024`
 
 // Executed Command:
-// ./target/production/substrate-node
+// target/production/substrate-node
 // benchmark
 // pallet
+// --extrinsic=*
 // --chain=dev
+// --pallet=pallet_revive
+// --header=/__w/polkadot-sdk/polkadot-sdk/substrate/HEADER-APACHE2
+// --output=/__w/polkadot-sdk/polkadot-sdk/substrate/frame/revive/src/weights.rs
+// --wasm-execution=compiled
 // --steps=50
 // --repeat=20
-// --pallet=pallet_revive
+// --heap-pages=4096
+// --template=substrate/.maintain/frame-weight-template.hbs
 // --no-storage-info
-// --no-median-slopes
 // --no-min-squares
-// --extrinsic=*
-// --wasm-execution=compiled
-// --heap-pages=4096
-// --output=./substrate/frame/revive/src/weights.rs
-// --header=./substrate/HEADER-APACHE2
-// --template=./substrate/.maintain/frame-weight-template.hbs
+// --no-median-slopes
 
 #![cfg_attr(rustfmt, rustfmt_skip)]
 #![allow(unused_parens)]
@@ -84,6 +84,7 @@ pub trait WeightInfo {
 	fn seal_block_hash() -> Weight;
 	fn seal_now() -> Weight;
 	fn seal_weight_to_fee() -> Weight;
+	fn seal_call_data_load() -> Weight;
 	fn seal_input(n: u32, ) -> Weight;
 	fn seal_return(n: u32, ) -> Weight;
 	fn seal_terminate(n: u32, ) -> Weight;
@@ -133,8 +134,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `109`
 		//  Estimated: `1594`
-		// Minimum execution time: 2_818_000 picoseconds.
-		Weight::from_parts(3_058_000, 1594)
+		// Minimum execution time: 2_874_000 picoseconds.
+		Weight::from_parts(3_131_000, 1594)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -144,10 +145,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `425 + k * (69 ±0)`
 		//  Estimated: `415 + k * (70 ±0)`
-		// Minimum execution time: 15_916_000 picoseconds.
-		Weight::from_parts(16_132_000, 415)
-			// Standard Error: 1_482
-			.saturating_add(Weight::from_parts(1_185_583, 0).saturating_mul(k.into()))
+		// Minimum execution time: 16_079_000 picoseconds.
+		Weight::from_parts(5_747_743, 415)
+			// Standard Error: 1_130
+			.saturating_add(Weight::from_parts(1_181_775, 0).saturating_mul(k.into()))
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(k.into())))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
@@ -169,10 +170,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// The range of component `c` is `[0, 262144]`.
 	fn call_with_code_per_byte(_c: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1502`
-		//  Estimated: `7442`
-		// Minimum execution time: 88_115_000 picoseconds.
-		Weight::from_parts(92_075_651, 7442)
+		//  Measured:  `1536`
+		//  Estimated: `7476`
+		// Minimum execution time: 94_513_000 picoseconds.
+		Weight::from_parts(99_111_938, 7476)
 			.saturating_add(T::DbWeight::get().reads(7_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -194,14 +195,14 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// The range of component `i` is `[0, 262144]`.
 	fn instantiate_with_code(c: u32, i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `403`
-		//  Estimated: `6326`
-		// Minimum execution time: 188_274_000 picoseconds.
-		Weight::from_parts(157_773_869, 6326)
-			// Standard Error: 11
-			.saturating_add(Weight::from_parts(16, 0).saturating_mul(c.into()))
-			// Standard Error: 11
-			.saturating_add(Weight::from_parts(4_464, 0).saturating_mul(i.into()))
+		//  Measured:  `416`
+		//  Estimated: `6345`
+		// Minimum execution time: 195_917_000 picoseconds.
+		Weight::from_parts(175_835_928, 6345)
+			// Standard Error: 10
+			.saturating_add(Weight::from_parts(10, 0).saturating_mul(c.into()))
+			// Standard Error: 10
+			.saturating_add(Weight::from_parts(4_554, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(7_u64))
 			.saturating_add(T::DbWeight::get().writes(6_u64))
 	}
@@ -223,11 +224,11 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	fn instantiate(i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `1296`
-		//  Estimated: `4739`
-		// Minimum execution time: 158_616_000 picoseconds.
-		Weight::from_parts(134_329_076, 4739)
-			// Standard Error: 15
-			.saturating_add(Weight::from_parts(4_358, 0).saturating_mul(i.into()))
+		//  Estimated: `4753`
+		// Minimum execution time: 162_583_000 picoseconds.
+		Weight::from_parts(143_621_658, 4753)
+			// Standard Error: 16
+			.saturating_add(Weight::from_parts(4_499, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(7_u64))
 			.saturating_add(T::DbWeight::get().writes(4_u64))
 	}
@@ -245,10 +246,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`)
 	fn call() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1502`
-		//  Estimated: `7442`
-		// Minimum execution time: 134_935_000 picoseconds.
-		Weight::from_parts(141_040_000, 7442)
+		//  Measured:  `1536`
+		//  Estimated: `7476`
+		// Minimum execution time: 145_642_000 picoseconds.
+		Weight::from_parts(152_866_000, 7476)
 			.saturating_add(T::DbWeight::get().reads(7_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -263,8 +264,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `109`
 		//  Estimated: `3574`
-		// Minimum execution time: 51_026_000 picoseconds.
-		Weight::from_parts(53_309_143, 3574)
+		// Minimum execution time: 51_664_000 picoseconds.
+		Weight::from_parts(53_863_257, 3574)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 			.saturating_add(T::DbWeight::get().writes(3_u64))
 	}
@@ -278,8 +279,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `285`
 		//  Estimated: `3750`
-		// Minimum execution time: 44_338_000 picoseconds.
-		Weight::from_parts(45_398_000, 3750)
+		// Minimum execution time: 44_879_000 picoseconds.
+		Weight::from_parts(46_401_000, 3750)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 			.saturating_add(T::DbWeight::get().writes(3_u64))
 	}
@@ -291,8 +292,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `529`
 		//  Estimated: `6469`
-		// Minimum execution time: 26_420_000 picoseconds.
-		Weight::from_parts(27_141_000, 6469)
+		// Minimum execution time: 27_833_000 picoseconds.
+		Weight::from_parts(29_013_000, 6469)
 			.saturating_add(T::DbWeight::get().reads(3_u64))
 			.saturating_add(T::DbWeight::get().writes(3_u64))
 	}
@@ -304,8 +305,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `109`
 		//  Estimated: `3574`
-		// Minimum execution time: 39_735_000 picoseconds.
-		Weight::from_parts(41_260_000, 3574)
+		// Minimum execution time: 40_611_000 picoseconds.
+		Weight::from_parts(41_336_000, 3574)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -317,8 +318,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `56`
 		//  Estimated: `3521`
-		// Minimum execution time: 32_059_000 picoseconds.
-		Weight::from_parts(32_776_000, 3521)
+		// Minimum execution time: 32_576_000 picoseconds.
+		Weight::from_parts(33_300_000, 3521)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -330,8 +331,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `145`
 		//  Estimated: `3610`
-		// Minimum execution time: 13_553_000 picoseconds.
-		Weight::from_parts(14_121_000, 3610)
+		// Minimum execution time: 13_978_000 picoseconds.
+		Weight::from_parts(14_573_000, 3610)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 	}
 	/// The range of component `r` is `[0, 1600]`.
@@ -339,24 +340,24 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 6_392_000 picoseconds.
-		Weight::from_parts(7_692_248, 0)
-			// Standard Error: 105
-			.saturating_add(Weight::from_parts(180_036, 0).saturating_mul(r.into()))
+		// Minimum execution time: 6_877_000 picoseconds.
+		Weight::from_parts(8_471_206, 0)
+			// Standard Error: 226
+			.saturating_add(Weight::from_parts(165_314, 0).saturating_mul(r.into()))
 	}
 	fn seal_caller() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 287_000 picoseconds.
-		Weight::from_parts(317_000, 0)
+		// Minimum execution time: 290_000 picoseconds.
+		Weight::from_parts(345_000, 0)
 	}
 	fn seal_origin() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 235_000 picoseconds.
-		Weight::from_parts(288_000, 0)
+		// Minimum execution time: 243_000 picoseconds.
+		Weight::from_parts(303_000, 0)
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
 	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(1779), added: 4254, mode: `Measured`)
@@ -364,8 +365,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `306`
 		//  Estimated: `3771`
-		// Minimum execution time: 10_101_000 picoseconds.
-		Weight::from_parts(10_420_000, 3771)
+		// Minimum execution time: 10_441_000 picoseconds.
+		Weight::from_parts(10_812_000, 3771)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
@@ -374,16 +375,16 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `403`
 		//  Estimated: `3868`
-		// Minimum execution time: 11_422_000 picoseconds.
-		Weight::from_parts(11_829_000, 3868)
+		// Minimum execution time: 11_403_000 picoseconds.
+		Weight::from_parts(11_913_000, 3868)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	fn seal_own_code_hash() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 247_000 picoseconds.
-		Weight::from_parts(282_000, 0)
+		// Minimum execution time: 259_000 picoseconds.
+		Weight::from_parts(306_000, 0)
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
 	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(1779), added: 4254, mode: `Measured`)
@@ -393,44 +394,44 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `473`
 		//  Estimated: `3938`
-		// Minimum execution time: 14_856_000 picoseconds.
-		Weight::from_parts(15_528_000, 3938)
+		// Minimum execution time: 14_887_000 picoseconds.
+		Weight::from_parts(15_625_000, 3938)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 	}
 	fn seal_caller_is_origin() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 303_000 picoseconds.
-		Weight::from_parts(361_000, 0)
+		// Minimum execution time: 315_000 picoseconds.
+		Weight::from_parts(389_000, 0)
 	}
 	fn seal_caller_is_root() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 253_000 picoseconds.
-		Weight::from_parts(287_000, 0)
+		// Minimum execution time: 294_000 picoseconds.
+		Weight::from_parts(322_000, 0)
 	}
 	fn seal_address() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 231_000 picoseconds.
-		Weight::from_parts(263_000, 0)
+		// Minimum execution time: 239_000 picoseconds.
+		Weight::from_parts(299_000, 0)
 	}
 	fn seal_weight_left() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
 		// Minimum execution time: 628_000 picoseconds.
-		Weight::from_parts(697_000, 0)
+		Weight::from_parts(703_000, 0)
 	}
 	fn seal_balance() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `103`
 		//  Estimated: `0`
-		// Minimum execution time: 4_531_000 picoseconds.
-		Weight::from_parts(4_726_000, 0)
+		// Minimum execution time: 4_816_000 picoseconds.
+		Weight::from_parts(5_078_000, 0)
 	}
 	/// Storage: `Revive::AddressSuffix` (r:1 w:0)
 	/// Proof: `Revive::AddressSuffix` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `Measured`)
@@ -440,8 +441,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `264`
 		//  Estimated: `3729`
-		// Minimum execution time: 8_787_000 picoseconds.
-		Weight::from_parts(9_175_000, 3729)
+		// Minimum execution time: 8_965_000 picoseconds.
+		Weight::from_parts(9_533_000, 3729)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 	}
 	/// Storage: `Revive::ImmutableDataOf` (r:1 w:0)
@@ -451,10 +452,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `238 + n * (1 ±0)`
 		//  Estimated: `3703 + n * (1 ±0)`
-		// Minimum execution time: 5_760_000 picoseconds.
-		Weight::from_parts(6_591_336, 3703)
+		// Minimum execution time: 6_174_000 picoseconds.
+		Weight::from_parts(6_755_842, 3703)
 			// Standard Error: 4
-			.saturating_add(Weight::from_parts(628, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(699, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -465,32 +466,32 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_971_000 picoseconds.
-		Weight::from_parts(2_206_252, 0)
-			// Standard Error: 3
-			.saturating_add(Weight::from_parts(529, 0).saturating_mul(n.into()))
+		// Minimum execution time: 1_977_000 picoseconds.
+		Weight::from_parts(2_175_653, 0)
+			// Standard Error: 2
+			.saturating_add(Weight::from_parts(633, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
 	fn seal_value_transferred() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 246_000 picoseconds.
-		Weight::from_parts(279_000, 0)
+		// Minimum execution time: 259_000 picoseconds.
+		Weight::from_parts(298_000, 0)
 	}
 	fn seal_minimum_balance() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 223_000 picoseconds.
-		Weight::from_parts(274_000, 0)
+		// Minimum execution time: 277_000 picoseconds.
+		Weight::from_parts(330_000, 0)
 	}
 	fn seal_block_number() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 213_000 picoseconds.
-		Weight::from_parts(270_000, 0)
+		// Minimum execution time: 260_000 picoseconds.
+		Weight::from_parts(295_000, 0)
 	}
 	/// Storage: `System::BlockHash` (r:1 w:0)
 	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `Measured`)
@@ -498,43 +499,50 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `30`
 		//  Estimated: `3495`
-		// Minimum execution time: 3_502_000 picoseconds.
-		Weight::from_parts(3_777_000, 3495)
+		// Minimum execution time: 3_607_000 picoseconds.
+		Weight::from_parts(3_760_000, 3495)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	fn seal_now() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 232_000 picoseconds.
-		Weight::from_parts(277_000, 0)
+		// Minimum execution time: 271_000 picoseconds.
+		Weight::from_parts(299_000, 0)
 	}
 	fn seal_weight_to_fee() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_293_000 picoseconds.
-		Weight::from_parts(1_426_000, 0)
+		// Minimum execution time: 1_320_000 picoseconds.
+		Weight::from_parts(1_406_000, 0)
+	}
+	fn seal_call_data_load() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 250_000 picoseconds.
+		Weight::from_parts(285_000, 0)
 	}
 	/// The range of component `n` is `[0, 262140]`.
 	fn seal_input(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 449_000 picoseconds.
-		Weight::from_parts(446_268, 0)
+		// Minimum execution time: 411_000 picoseconds.
+		Weight::from_parts(514_738, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(113, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(148, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 262140]`.
 	fn seal_return(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 244_000 picoseconds.
-		Weight::from_parts(612_733, 0)
+		// Minimum execution time: 282_000 picoseconds.
+		Weight::from_parts(463_520, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(200, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(295, 0).saturating_mul(n.into()))
 	}
 	/// Storage: `Revive::AddressSuffix` (r:1 w:0)
 	/// Proof: `Revive::AddressSuffix` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `Measured`)
@@ -550,11 +558,11 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	fn seal_terminate(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `324 + n * (88 ±0)`
-		//  Estimated: `3789 + n * (2563 ±0)`
-		// Minimum execution time: 21_822_000 picoseconds.
-		Weight::from_parts(22_468_601, 3789)
-			// Standard Error: 7_303
-			.saturating_add(Weight::from_parts(4_138_073, 0).saturating_mul(n.into()))
+		//  Estimated: `3791 + n * (2563 ±0)`
+		// Minimum execution time: 22_960_000 picoseconds.
+		Weight::from_parts(23_432_764, 3791)
+			// Standard Error: 12_030
+			.saturating_add(Weight::from_parts(4_292_055, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(3_u64))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into())))
 			.saturating_add(T::DbWeight::get().writes(4_u64))
@@ -567,22 +575,22 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 4_127_000 picoseconds.
-		Weight::from_parts(4_043_097, 0)
-			// Standard Error: 3_136
-			.saturating_add(Weight::from_parts(209_603, 0).saturating_mul(t.into()))
-			// Standard Error: 28
-			.saturating_add(Weight::from_parts(988, 0).saturating_mul(n.into()))
+		// Minimum execution time: 4_346_000 picoseconds.
+		Weight::from_parts(4_208_327, 0)
+			// Standard Error: 2_509
+			.saturating_add(Weight::from_parts(194_145, 0).saturating_mul(t.into()))
+			// Standard Error: 22
+			.saturating_add(Weight::from_parts(1_084, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `i` is `[0, 262144]`.
 	fn seal_debug_message(i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 276_000 picoseconds.
-		Weight::from_parts(1_111_301, 0)
+		// Minimum execution time: 360_000 picoseconds.
+		Weight::from_parts(374_000, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(706, 0).saturating_mul(i.into()))
+			.saturating_add(Weight::from_parts(816, 0).saturating_mul(i.into()))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
 	/// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`)
@@ -590,8 +598,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `744`
 		//  Estimated: `744`
-		// Minimum execution time: 7_869_000 picoseconds.
-		Weight::from_parts(8_190_000, 744)
+		// Minimum execution time: 8_066_000 picoseconds.
+		Weight::from_parts(8_425_000, 744)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -600,8 +608,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `10754`
 		//  Estimated: `10754`
-		// Minimum execution time: 42_793_000 picoseconds.
-		Weight::from_parts(43_861_000, 10754)
+		// Minimum execution time: 43_707_000 picoseconds.
+		Weight::from_parts(44_613_000, 10754)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -610,8 +618,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `744`
 		//  Estimated: `744`
-		// Minimum execution time: 8_753_000 picoseconds.
-		Weight::from_parts(9_235_000, 744)
+		// Minimum execution time: 9_101_000 picoseconds.
+		Weight::from_parts(9_425_000, 744)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -621,8 +629,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `10754`
 		//  Estimated: `10754`
-		// Minimum execution time: 44_446_000 picoseconds.
-		Weight::from_parts(45_586_000, 10754)
+		// Minimum execution time: 45_990_000 picoseconds.
+		Weight::from_parts(46_945_000, 10754)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -634,12 +642,12 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `248 + o * (1 ±0)`
 		//  Estimated: `247 + o * (1 ±0)`
-		// Minimum execution time: 9_214_000 picoseconds.
-		Weight::from_parts(9_888_060, 247)
-			// Standard Error: 41
-			.saturating_add(Weight::from_parts(151, 0).saturating_mul(n.into()))
-			// Standard Error: 41
-			.saturating_add(Weight::from_parts(315, 0).saturating_mul(o.into()))
+		// Minimum execution time: 9_229_000 picoseconds.
+		Weight::from_parts(10_039_961, 247)
+			// Standard Error: 39
+			.saturating_add(Weight::from_parts(359, 0).saturating_mul(n.into()))
+			// Standard Error: 39
+			.saturating_add(Weight::from_parts(424, 0).saturating_mul(o.into()))
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(o.into()))
@@ -651,10 +659,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `248 + n * (1 ±0)`
 		//  Estimated: `247 + n * (1 ±0)`
-		// Minimum execution time: 8_647_000 picoseconds.
-		Weight::from_parts(9_553_009, 247)
-			// Standard Error: 48
-			.saturating_add(Weight::from_parts(651, 0).saturating_mul(n.into()))
+		// Minimum execution time: 9_038_000 picoseconds.
+		Weight::from_parts(9_855_448, 247)
+			// Standard Error: 55
+			.saturating_add(Weight::from_parts(544, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
@@ -666,10 +674,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `248 + n * (1 ±0)`
 		//  Estimated: `247 + n * (1 ±0)`
-		// Minimum execution time: 8_457_000 picoseconds.
-		Weight::from_parts(9_199_745, 247)
-			// Standard Error: 59
-			.saturating_add(Weight::from_parts(1_562, 0).saturating_mul(n.into()))
+		// Minimum execution time: 8_533_000 picoseconds.
+		Weight::from_parts(9_485_405, 247)
+			// Standard Error: 60
+			.saturating_add(Weight::from_parts(1_436, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -680,10 +688,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `248 + n * (1 ±0)`
 		//  Estimated: `247 + n * (1 ±0)`
-		// Minimum execution time: 8_025_000 picoseconds.
-		Weight::from_parts(8_700_911, 247)
-			// Standard Error: 49
-			.saturating_add(Weight::from_parts(635, 0).saturating_mul(n.into()))
+		// Minimum execution time: 8_300_000 picoseconds.
+		Weight::from_parts(8_914_778, 247)
+			// Standard Error: 46
+			.saturating_add(Weight::from_parts(774, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -694,10 +702,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `248 + n * (1 ±0)`
 		//  Estimated: `247 + n * (1 ±0)`
-		// Minimum execution time: 9_346_000 picoseconds.
-		Weight::from_parts(10_297_284, 247)
-			// Standard Error: 62
-			.saturating_add(Weight::from_parts(1_396, 0).saturating_mul(n.into()))
+		// Minimum execution time: 9_384_000 picoseconds.
+		Weight::from_parts(10_500_656, 247)
+			// Standard Error: 64
+			.saturating_add(Weight::from_parts(1_400, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
@@ -706,36 +714,36 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_428_000 picoseconds.
-		Weight::from_parts(1_517_000, 0)
+		// Minimum execution time: 1_478_000 picoseconds.
+		Weight::from_parts(1_625_000, 0)
 	}
 	fn set_transient_storage_full() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_868_000 picoseconds.
-		Weight::from_parts(1_942_000, 0)
+		// Minimum execution time: 1_842_000 picoseconds.
+		Weight::from_parts(1_969_000, 0)
 	}
 	fn get_transient_storage_empty() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_403_000 picoseconds.
-		Weight::from_parts(1_539_000, 0)
+		// Minimum execution time: 1_437_000 picoseconds.
+		Weight::from_parts(1_557_000, 0)
 	}
 	fn get_transient_storage_full() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_676_000 picoseconds.
-		Weight::from_parts(1_760_000, 0)
+		// Minimum execution time: 1_600_000 picoseconds.
+		Weight::from_parts(1_679_000, 0)
 	}
 	fn rollback_transient_storage() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_119_000 picoseconds.
-		Weight::from_parts(1_205_000, 0)
+		// Minimum execution time: 1_114_000 picoseconds.
+		Weight::from_parts(1_191_000, 0)
 	}
 	/// The range of component `n` is `[0, 512]`.
 	/// The range of component `o` is `[0, 512]`.
@@ -743,50 +751,50 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_146_000 picoseconds.
-		Weight::from_parts(2_315_339, 0)
-			// Standard Error: 13
-			.saturating_add(Weight::from_parts(327, 0).saturating_mul(n.into()))
-			// Standard Error: 13
-			.saturating_add(Weight::from_parts(366, 0).saturating_mul(o.into()))
+		// Minimum execution time: 2_326_000 picoseconds.
+		Weight::from_parts(2_451_799, 0)
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(391, 0).saturating_mul(n.into()))
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(361, 0).saturating_mul(o.into()))
 	}
 	/// The range of component `n` is `[0, 512]`.
 	fn seal_clear_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_950_000 picoseconds.
-		Weight::from_parts(2_271_073, 0)
-			// Standard Error: 15
-			.saturating_add(Weight::from_parts(373, 0).saturating_mul(n.into()))
+		// Minimum execution time: 1_951_000 picoseconds.
+		Weight::from_parts(2_353_245, 0)
+			// Standard Error: 16
+			.saturating_add(Weight::from_parts(369, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 512]`.
 	fn seal_get_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_839_000 picoseconds.
-		Weight::from_parts(2_049_659, 0)
+		// Minimum execution time: 1_822_000 picoseconds.
+		Weight::from_parts(2_059_181, 0)
 			// Standard Error: 14
-			.saturating_add(Weight::from_parts(291, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(398, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 512]`.
 	fn seal_contains_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_716_000 picoseconds.
-		Weight::from_parts(1_893_932, 0)
+		// Minimum execution time: 1_697_000 picoseconds.
+		Weight::from_parts(1_905_887, 0)
 			// Standard Error: 12
-			.saturating_add(Weight::from_parts(172, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(215, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 512]`.
 	fn seal_take_transient_storage(_n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_448_000 picoseconds.
-		Weight::from_parts(2_676_764, 0)
+		// Minimum execution time: 2_533_000 picoseconds.
+		Weight::from_parts(2_759_660, 0)
 	}
 	/// Storage: `Revive::AddressSuffix` (r:1 w:0)
 	/// Proof: `Revive::AddressSuffix` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `Measured`)
@@ -802,30 +810,32 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// The range of component `i` is `[0, 262144]`.
 	fn seal_call(t: u32, i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1294 + t * (242 ±0)`
+		//  Measured:  `1294 + t * (243 ±0)`
 		//  Estimated: `4759 + t * (2501 ±0)`
-		// Minimum execution time: 39_786_000 picoseconds.
-		Weight::from_parts(41_175_457, 4759)
-			// Standard Error: 45_251
-			.saturating_add(Weight::from_parts(2_375_617, 0).saturating_mul(t.into()))
+		// Minimum execution time: 43_295_000 picoseconds.
+		Weight::from_parts(44_592_141, 4759)
+			// Standard Error: 60_598
+			.saturating_add(Weight::from_parts(1_458_798, 0).saturating_mul(t.into()))
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(2, 0).saturating_mul(i.into()))
+			.saturating_add(Weight::from_parts(3, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(4_u64))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(t.into())))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 			.saturating_add(Weight::from_parts(0, 2501).saturating_mul(t.into()))
 	}
+	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
+	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(1779), added: 4254, mode: `Measured`)
 	/// Storage: `Revive::CodeInfoOf` (r:1 w:0)
 	/// Proof: `Revive::CodeInfoOf` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `Measured`)
 	/// Storage: `Revive::PristineCode` (r:1 w:0)
 	/// Proof: `Revive::PristineCode` (`max_values`: None, `max_size`: Some(262180), added: 264655, mode: `Measured`)
 	fn seal_delegate_call() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1064`
-		//  Estimated: `4529`
-		// Minimum execution time: 29_762_000 picoseconds.
-		Weight::from_parts(31_345_000, 4529)
-			.saturating_add(T::DbWeight::get().reads(2_u64))
+		//  Measured:  `1237`
+		//  Estimated: `4702`
+		// Minimum execution time: 37_787_000 picoseconds.
+		Weight::from_parts(38_510_000, 4702)
+			.saturating_add(T::DbWeight::get().reads(3_u64))
 	}
 	/// Storage: `Revive::CodeInfoOf` (r:1 w:1)
 	/// Proof: `Revive::CodeInfoOf` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `Measured`)
@@ -838,12 +848,12 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// The range of component `i` is `[0, 262144]`.
 	fn seal_instantiate(i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1310`
-		//  Estimated: `4748`
-		// Minimum execution time: 117_791_000 picoseconds.
-		Weight::from_parts(105_413_907, 4748)
-			// Standard Error: 11
-			.saturating_add(Weight::from_parts(4_038, 0).saturating_mul(i.into()))
+		//  Measured:  `1273`
+		//  Estimated: `4736`
+		// Minimum execution time: 121_346_000 picoseconds.
+		Weight::from_parts(115_747_843, 4736)
+			// Standard Error: 10
+			.saturating_add(Weight::from_parts(4_189, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(4_u64))
 			.saturating_add(T::DbWeight::get().writes(3_u64))
 	}
@@ -852,64 +862,64 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 638_000 picoseconds.
-		Weight::from_parts(4_703_710, 0)
+		// Minimum execution time: 696_000 picoseconds.
+		Weight::from_parts(3_319_775, 0)
 			// Standard Error: 3
-			.saturating_add(Weight::from_parts(1_349, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(1_500, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 262144]`.
 	fn seal_hash_keccak_256(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_085_000 picoseconds.
-		Weight::from_parts(3_630_716, 0)
+		// Minimum execution time: 1_070_000 picoseconds.
+		Weight::from_parts(4_463_019, 0)
 			// Standard Error: 3
-			.saturating_add(Weight::from_parts(3_567, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(3_689, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 262144]`.
 	fn seal_hash_blake2_256(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 643_000 picoseconds.
-		Weight::from_parts(3_733_026, 0)
+		// Minimum execution time: 617_000 picoseconds.
+		Weight::from_parts(3_175_243, 0)
 			// Standard Error: 3
-			.saturating_add(Weight::from_parts(1_492, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(1_617, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 262144]`.
 	fn seal_hash_blake2_128(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 653_000 picoseconds.
-		Weight::from_parts(4_627_285, 0)
+		// Minimum execution time: 616_000 picoseconds.
+		Weight::from_parts(3_420_409, 0)
 			// Standard Error: 3
-			.saturating_add(Weight::from_parts(1_478, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(1_623, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 261889]`.
 	fn seal_sr25519_verify(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 45_786_000 picoseconds.
-		Weight::from_parts(36_383_470, 0)
-			// Standard Error: 10
-			.saturating_add(Weight::from_parts(5_396, 0).saturating_mul(n.into()))
+		// Minimum execution time: 45_562_000 picoseconds.
+		Weight::from_parts(34_462_046, 0)
+			// Standard Error: 11
+			.saturating_add(Weight::from_parts(5_259, 0).saturating_mul(n.into()))
 	}
 	fn seal_ecdsa_recover() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 48_140_000 picoseconds.
-		Weight::from_parts(49_720_000, 0)
+		// Minimum execution time: 49_472_000 picoseconds.
+		Weight::from_parts(50_517_000, 0)
 	}
 	fn seal_ecdsa_to_eth_address() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 12_565_000 picoseconds.
-		Weight::from_parts(12_704_000, 0)
+		// Minimum execution time: 12_716_000 picoseconds.
+		Weight::from_parts(12_812_000, 0)
 	}
 	/// Storage: `Revive::CodeInfoOf` (r:1 w:1)
 	/// Proof: `Revive::CodeInfoOf` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `Measured`)
@@ -917,8 +927,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `300`
 		//  Estimated: `3765`
-		// Minimum execution time: 17_208_000 picoseconds.
-		Weight::from_parts(18_307_000, 3765)
+		// Minimum execution time: 17_891_000 picoseconds.
+		Weight::from_parts(18_833_000, 3765)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -928,8 +938,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `338`
 		//  Estimated: `3803`
-		// Minimum execution time: 13_686_000 picoseconds.
-		Weight::from_parts(14_186_000, 3803)
+		// Minimum execution time: 14_523_000 picoseconds.
+		Weight::from_parts(14_812_000, 3803)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -939,8 +949,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `338`
 		//  Estimated: `3561`
-		// Minimum execution time: 12_381_000 picoseconds.
-		Weight::from_parts(13_208_000, 3561)
+		// Minimum execution time: 13_114_000 picoseconds.
+		Weight::from_parts(13_567_000, 3561)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -949,10 +959,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 8_118_000 picoseconds.
-		Weight::from_parts(9_813_514, 0)
-			// Standard Error: 40
-			.saturating_add(Weight::from_parts(71_154, 0).saturating_mul(r.into()))
+		// Minimum execution time: 8_717_000 picoseconds.
+		Weight::from_parts(9_983_815, 0)
+			// Standard Error: 115
+			.saturating_add(Weight::from_parts(72_253, 0).saturating_mul(r.into()))
 	}
 }
 
@@ -964,8 +974,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `109`
 		//  Estimated: `1594`
-		// Minimum execution time: 2_818_000 picoseconds.
-		Weight::from_parts(3_058_000, 1594)
+		// Minimum execution time: 2_874_000 picoseconds.
+		Weight::from_parts(3_131_000, 1594)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -975,10 +985,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `425 + k * (69 ±0)`
 		//  Estimated: `415 + k * (70 ±0)`
-		// Minimum execution time: 15_916_000 picoseconds.
-		Weight::from_parts(16_132_000, 415)
-			// Standard Error: 1_482
-			.saturating_add(Weight::from_parts(1_185_583, 0).saturating_mul(k.into()))
+		// Minimum execution time: 16_079_000 picoseconds.
+		Weight::from_parts(5_747_743, 415)
+			// Standard Error: 1_130
+			.saturating_add(Weight::from_parts(1_181_775, 0).saturating_mul(k.into()))
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 			.saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(k.into())))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
@@ -1000,10 +1010,10 @@ impl WeightInfo for () {
 	/// The range of component `c` is `[0, 262144]`.
 	fn call_with_code_per_byte(_c: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1502`
-		//  Estimated: `7442`
-		// Minimum execution time: 88_115_000 picoseconds.
-		Weight::from_parts(92_075_651, 7442)
+		//  Measured:  `1536`
+		//  Estimated: `7476`
+		// Minimum execution time: 94_513_000 picoseconds.
+		Weight::from_parts(99_111_938, 7476)
 			.saturating_add(RocksDbWeight::get().reads(7_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -1025,14 +1035,14 @@ impl WeightInfo for () {
 	/// The range of component `i` is `[0, 262144]`.
 	fn instantiate_with_code(c: u32, i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `403`
-		//  Estimated: `6326`
-		// Minimum execution time: 188_274_000 picoseconds.
-		Weight::from_parts(157_773_869, 6326)
-			// Standard Error: 11
-			.saturating_add(Weight::from_parts(16, 0).saturating_mul(c.into()))
-			// Standard Error: 11
-			.saturating_add(Weight::from_parts(4_464, 0).saturating_mul(i.into()))
+		//  Measured:  `416`
+		//  Estimated: `6345`
+		// Minimum execution time: 195_917_000 picoseconds.
+		Weight::from_parts(175_835_928, 6345)
+			// Standard Error: 10
+			.saturating_add(Weight::from_parts(10, 0).saturating_mul(c.into()))
+			// Standard Error: 10
+			.saturating_add(Weight::from_parts(4_554, 0).saturating_mul(i.into()))
 			.saturating_add(RocksDbWeight::get().reads(7_u64))
 			.saturating_add(RocksDbWeight::get().writes(6_u64))
 	}
@@ -1054,11 +1064,11 @@ impl WeightInfo for () {
 	fn instantiate(i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `1296`
-		//  Estimated: `4739`
-		// Minimum execution time: 158_616_000 picoseconds.
-		Weight::from_parts(134_329_076, 4739)
-			// Standard Error: 15
-			.saturating_add(Weight::from_parts(4_358, 0).saturating_mul(i.into()))
+		//  Estimated: `4753`
+		// Minimum execution time: 162_583_000 picoseconds.
+		Weight::from_parts(143_621_658, 4753)
+			// Standard Error: 16
+			.saturating_add(Weight::from_parts(4_499, 0).saturating_mul(i.into()))
 			.saturating_add(RocksDbWeight::get().reads(7_u64))
 			.saturating_add(RocksDbWeight::get().writes(4_u64))
 	}
@@ -1076,10 +1086,10 @@ impl WeightInfo for () {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`)
 	fn call() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1502`
-		//  Estimated: `7442`
-		// Minimum execution time: 134_935_000 picoseconds.
-		Weight::from_parts(141_040_000, 7442)
+		//  Measured:  `1536`
+		//  Estimated: `7476`
+		// Minimum execution time: 145_642_000 picoseconds.
+		Weight::from_parts(152_866_000, 7476)
 			.saturating_add(RocksDbWeight::get().reads(7_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -1094,8 +1104,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `109`
 		//  Estimated: `3574`
-		// Minimum execution time: 51_026_000 picoseconds.
-		Weight::from_parts(53_309_143, 3574)
+		// Minimum execution time: 51_664_000 picoseconds.
+		Weight::from_parts(53_863_257, 3574)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 			.saturating_add(RocksDbWeight::get().writes(3_u64))
 	}
@@ -1109,8 +1119,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `285`
 		//  Estimated: `3750`
-		// Minimum execution time: 44_338_000 picoseconds.
-		Weight::from_parts(45_398_000, 3750)
+		// Minimum execution time: 44_879_000 picoseconds.
+		Weight::from_parts(46_401_000, 3750)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 			.saturating_add(RocksDbWeight::get().writes(3_u64))
 	}
@@ -1122,8 +1132,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `529`
 		//  Estimated: `6469`
-		// Minimum execution time: 26_420_000 picoseconds.
-		Weight::from_parts(27_141_000, 6469)
+		// Minimum execution time: 27_833_000 picoseconds.
+		Weight::from_parts(29_013_000, 6469)
 			.saturating_add(RocksDbWeight::get().reads(3_u64))
 			.saturating_add(RocksDbWeight::get().writes(3_u64))
 	}
@@ -1135,8 +1145,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `109`
 		//  Estimated: `3574`
-		// Minimum execution time: 39_735_000 picoseconds.
-		Weight::from_parts(41_260_000, 3574)
+		// Minimum execution time: 40_611_000 picoseconds.
+		Weight::from_parts(41_336_000, 3574)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -1148,8 +1158,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `56`
 		//  Estimated: `3521`
-		// Minimum execution time: 32_059_000 picoseconds.
-		Weight::from_parts(32_776_000, 3521)
+		// Minimum execution time: 32_576_000 picoseconds.
+		Weight::from_parts(33_300_000, 3521)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -1161,8 +1171,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `145`
 		//  Estimated: `3610`
-		// Minimum execution time: 13_553_000 picoseconds.
-		Weight::from_parts(14_121_000, 3610)
+		// Minimum execution time: 13_978_000 picoseconds.
+		Weight::from_parts(14_573_000, 3610)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 	}
 	/// The range of component `r` is `[0, 1600]`.
@@ -1170,24 +1180,24 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 6_392_000 picoseconds.
-		Weight::from_parts(7_692_248, 0)
-			// Standard Error: 105
-			.saturating_add(Weight::from_parts(180_036, 0).saturating_mul(r.into()))
+		// Minimum execution time: 6_877_000 picoseconds.
+		Weight::from_parts(8_471_206, 0)
+			// Standard Error: 226
+			.saturating_add(Weight::from_parts(165_314, 0).saturating_mul(r.into()))
 	}
 	fn seal_caller() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 287_000 picoseconds.
-		Weight::from_parts(317_000, 0)
+		// Minimum execution time: 290_000 picoseconds.
+		Weight::from_parts(345_000, 0)
 	}
 	fn seal_origin() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 235_000 picoseconds.
-		Weight::from_parts(288_000, 0)
+		// Minimum execution time: 243_000 picoseconds.
+		Weight::from_parts(303_000, 0)
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
 	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(1779), added: 4254, mode: `Measured`)
@@ -1195,8 +1205,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `306`
 		//  Estimated: `3771`
-		// Minimum execution time: 10_101_000 picoseconds.
-		Weight::from_parts(10_420_000, 3771)
+		// Minimum execution time: 10_441_000 picoseconds.
+		Weight::from_parts(10_812_000, 3771)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
@@ -1205,16 +1215,16 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `403`
 		//  Estimated: `3868`
-		// Minimum execution time: 11_422_000 picoseconds.
-		Weight::from_parts(11_829_000, 3868)
+		// Minimum execution time: 11_403_000 picoseconds.
+		Weight::from_parts(11_913_000, 3868)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	fn seal_own_code_hash() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 247_000 picoseconds.
-		Weight::from_parts(282_000, 0)
+		// Minimum execution time: 259_000 picoseconds.
+		Weight::from_parts(306_000, 0)
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
 	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(1779), added: 4254, mode: `Measured`)
@@ -1224,44 +1234,44 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `473`
 		//  Estimated: `3938`
-		// Minimum execution time: 14_856_000 picoseconds.
-		Weight::from_parts(15_528_000, 3938)
+		// Minimum execution time: 14_887_000 picoseconds.
+		Weight::from_parts(15_625_000, 3938)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 	}
 	fn seal_caller_is_origin() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 303_000 picoseconds.
-		Weight::from_parts(361_000, 0)
+		// Minimum execution time: 315_000 picoseconds.
+		Weight::from_parts(389_000, 0)
 	}
 	fn seal_caller_is_root() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 253_000 picoseconds.
-		Weight::from_parts(287_000, 0)
+		// Minimum execution time: 294_000 picoseconds.
+		Weight::from_parts(322_000, 0)
 	}
 	fn seal_address() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 231_000 picoseconds.
-		Weight::from_parts(263_000, 0)
+		// Minimum execution time: 239_000 picoseconds.
+		Weight::from_parts(299_000, 0)
 	}
 	fn seal_weight_left() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
 		// Minimum execution time: 628_000 picoseconds.
-		Weight::from_parts(697_000, 0)
+		Weight::from_parts(703_000, 0)
 	}
 	fn seal_balance() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `103`
 		//  Estimated: `0`
-		// Minimum execution time: 4_531_000 picoseconds.
-		Weight::from_parts(4_726_000, 0)
+		// Minimum execution time: 4_816_000 picoseconds.
+		Weight::from_parts(5_078_000, 0)
 	}
 	/// Storage: `Revive::AddressSuffix` (r:1 w:0)
 	/// Proof: `Revive::AddressSuffix` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `Measured`)
@@ -1271,8 +1281,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `264`
 		//  Estimated: `3729`
-		// Minimum execution time: 8_787_000 picoseconds.
-		Weight::from_parts(9_175_000, 3729)
+		// Minimum execution time: 8_965_000 picoseconds.
+		Weight::from_parts(9_533_000, 3729)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 	}
 	/// Storage: `Revive::ImmutableDataOf` (r:1 w:0)
@@ -1282,10 +1292,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `238 + n * (1 ±0)`
 		//  Estimated: `3703 + n * (1 ±0)`
-		// Minimum execution time: 5_760_000 picoseconds.
-		Weight::from_parts(6_591_336, 3703)
+		// Minimum execution time: 6_174_000 picoseconds.
+		Weight::from_parts(6_755_842, 3703)
 			// Standard Error: 4
-			.saturating_add(Weight::from_parts(628, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(699, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -1296,32 +1306,32 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_971_000 picoseconds.
-		Weight::from_parts(2_206_252, 0)
-			// Standard Error: 3
-			.saturating_add(Weight::from_parts(529, 0).saturating_mul(n.into()))
+		// Minimum execution time: 1_977_000 picoseconds.
+		Weight::from_parts(2_175_653, 0)
+			// Standard Error: 2
+			.saturating_add(Weight::from_parts(633, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
 	fn seal_value_transferred() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 246_000 picoseconds.
-		Weight::from_parts(279_000, 0)
+		// Minimum execution time: 259_000 picoseconds.
+		Weight::from_parts(298_000, 0)
 	}
 	fn seal_minimum_balance() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 223_000 picoseconds.
-		Weight::from_parts(274_000, 0)
+		// Minimum execution time: 277_000 picoseconds.
+		Weight::from_parts(330_000, 0)
 	}
 	fn seal_block_number() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 213_000 picoseconds.
-		Weight::from_parts(270_000, 0)
+		// Minimum execution time: 260_000 picoseconds.
+		Weight::from_parts(295_000, 0)
 	}
 	/// Storage: `System::BlockHash` (r:1 w:0)
 	/// Proof: `System::BlockHash` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `Measured`)
@@ -1329,43 +1339,50 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `30`
 		//  Estimated: `3495`
-		// Minimum execution time: 3_502_000 picoseconds.
-		Weight::from_parts(3_777_000, 3495)
+		// Minimum execution time: 3_607_000 picoseconds.
+		Weight::from_parts(3_760_000, 3495)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	fn seal_now() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 232_000 picoseconds.
-		Weight::from_parts(277_000, 0)
+		// Minimum execution time: 271_000 picoseconds.
+		Weight::from_parts(299_000, 0)
 	}
 	fn seal_weight_to_fee() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_293_000 picoseconds.
-		Weight::from_parts(1_426_000, 0)
+		// Minimum execution time: 1_320_000 picoseconds.
+		Weight::from_parts(1_406_000, 0)
+	}
+	fn seal_call_data_load() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 250_000 picoseconds.
+		Weight::from_parts(285_000, 0)
 	}
 	/// The range of component `n` is `[0, 262140]`.
 	fn seal_input(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 449_000 picoseconds.
-		Weight::from_parts(446_268, 0)
+		// Minimum execution time: 411_000 picoseconds.
+		Weight::from_parts(514_738, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(113, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(148, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 262140]`.
 	fn seal_return(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 244_000 picoseconds.
-		Weight::from_parts(612_733, 0)
+		// Minimum execution time: 282_000 picoseconds.
+		Weight::from_parts(463_520, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(200, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(295, 0).saturating_mul(n.into()))
 	}
 	/// Storage: `Revive::AddressSuffix` (r:1 w:0)
 	/// Proof: `Revive::AddressSuffix` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `Measured`)
@@ -1381,11 +1398,11 @@ impl WeightInfo for () {
 	fn seal_terminate(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `324 + n * (88 ±0)`
-		//  Estimated: `3789 + n * (2563 ±0)`
-		// Minimum execution time: 21_822_000 picoseconds.
-		Weight::from_parts(22_468_601, 3789)
-			// Standard Error: 7_303
-			.saturating_add(Weight::from_parts(4_138_073, 0).saturating_mul(n.into()))
+		//  Estimated: `3791 + n * (2563 ±0)`
+		// Minimum execution time: 22_960_000 picoseconds.
+		Weight::from_parts(23_432_764, 3791)
+			// Standard Error: 12_030
+			.saturating_add(Weight::from_parts(4_292_055, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(3_u64))
 			.saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into())))
 			.saturating_add(RocksDbWeight::get().writes(4_u64))
@@ -1398,22 +1415,22 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 4_127_000 picoseconds.
-		Weight::from_parts(4_043_097, 0)
-			// Standard Error: 3_136
-			.saturating_add(Weight::from_parts(209_603, 0).saturating_mul(t.into()))
-			// Standard Error: 28
-			.saturating_add(Weight::from_parts(988, 0).saturating_mul(n.into()))
+		// Minimum execution time: 4_346_000 picoseconds.
+		Weight::from_parts(4_208_327, 0)
+			// Standard Error: 2_509
+			.saturating_add(Weight::from_parts(194_145, 0).saturating_mul(t.into()))
+			// Standard Error: 22
+			.saturating_add(Weight::from_parts(1_084, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `i` is `[0, 262144]`.
 	fn seal_debug_message(i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 276_000 picoseconds.
-		Weight::from_parts(1_111_301, 0)
+		// Minimum execution time: 360_000 picoseconds.
+		Weight::from_parts(374_000, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(706, 0).saturating_mul(i.into()))
+			.saturating_add(Weight::from_parts(816, 0).saturating_mul(i.into()))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
 	/// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`)
@@ -1421,8 +1438,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `744`
 		//  Estimated: `744`
-		// Minimum execution time: 7_869_000 picoseconds.
-		Weight::from_parts(8_190_000, 744)
+		// Minimum execution time: 8_066_000 picoseconds.
+		Weight::from_parts(8_425_000, 744)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -1431,8 +1448,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `10754`
 		//  Estimated: `10754`
-		// Minimum execution time: 42_793_000 picoseconds.
-		Weight::from_parts(43_861_000, 10754)
+		// Minimum execution time: 43_707_000 picoseconds.
+		Weight::from_parts(44_613_000, 10754)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -1441,8 +1458,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `744`
 		//  Estimated: `744`
-		// Minimum execution time: 8_753_000 picoseconds.
-		Weight::from_parts(9_235_000, 744)
+		// Minimum execution time: 9_101_000 picoseconds.
+		Weight::from_parts(9_425_000, 744)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -1452,8 +1469,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `10754`
 		//  Estimated: `10754`
-		// Minimum execution time: 44_446_000 picoseconds.
-		Weight::from_parts(45_586_000, 10754)
+		// Minimum execution time: 45_990_000 picoseconds.
+		Weight::from_parts(46_945_000, 10754)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -1465,12 +1482,12 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `248 + o * (1 ±0)`
 		//  Estimated: `247 + o * (1 ±0)`
-		// Minimum execution time: 9_214_000 picoseconds.
-		Weight::from_parts(9_888_060, 247)
-			// Standard Error: 41
-			.saturating_add(Weight::from_parts(151, 0).saturating_mul(n.into()))
-			// Standard Error: 41
-			.saturating_add(Weight::from_parts(315, 0).saturating_mul(o.into()))
+		// Minimum execution time: 9_229_000 picoseconds.
+		Weight::from_parts(10_039_961, 247)
+			// Standard Error: 39
+			.saturating_add(Weight::from_parts(359, 0).saturating_mul(n.into()))
+			// Standard Error: 39
+			.saturating_add(Weight::from_parts(424, 0).saturating_mul(o.into()))
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(o.into()))
@@ -1482,10 +1499,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `248 + n * (1 ±0)`
 		//  Estimated: `247 + n * (1 ±0)`
-		// Minimum execution time: 8_647_000 picoseconds.
-		Weight::from_parts(9_553_009, 247)
-			// Standard Error: 48
-			.saturating_add(Weight::from_parts(651, 0).saturating_mul(n.into()))
+		// Minimum execution time: 9_038_000 picoseconds.
+		Weight::from_parts(9_855_448, 247)
+			// Standard Error: 55
+			.saturating_add(Weight::from_parts(544, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
@@ -1497,10 +1514,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `248 + n * (1 ±0)`
 		//  Estimated: `247 + n * (1 ±0)`
-		// Minimum execution time: 8_457_000 picoseconds.
-		Weight::from_parts(9_199_745, 247)
-			// Standard Error: 59
-			.saturating_add(Weight::from_parts(1_562, 0).saturating_mul(n.into()))
+		// Minimum execution time: 8_533_000 picoseconds.
+		Weight::from_parts(9_485_405, 247)
+			// Standard Error: 60
+			.saturating_add(Weight::from_parts(1_436, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -1511,10 +1528,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `248 + n * (1 ±0)`
 		//  Estimated: `247 + n * (1 ±0)`
-		// Minimum execution time: 8_025_000 picoseconds.
-		Weight::from_parts(8_700_911, 247)
-			// Standard Error: 49
-			.saturating_add(Weight::from_parts(635, 0).saturating_mul(n.into()))
+		// Minimum execution time: 8_300_000 picoseconds.
+		Weight::from_parts(8_914_778, 247)
+			// Standard Error: 46
+			.saturating_add(Weight::from_parts(774, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -1525,10 +1542,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `248 + n * (1 ±0)`
 		//  Estimated: `247 + n * (1 ±0)`
-		// Minimum execution time: 9_346_000 picoseconds.
-		Weight::from_parts(10_297_284, 247)
-			// Standard Error: 62
-			.saturating_add(Weight::from_parts(1_396, 0).saturating_mul(n.into()))
+		// Minimum execution time: 9_384_000 picoseconds.
+		Weight::from_parts(10_500_656, 247)
+			// Standard Error: 64
+			.saturating_add(Weight::from_parts(1_400, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
@@ -1537,36 +1554,36 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_428_000 picoseconds.
-		Weight::from_parts(1_517_000, 0)
+		// Minimum execution time: 1_478_000 picoseconds.
+		Weight::from_parts(1_625_000, 0)
 	}
 	fn set_transient_storage_full() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_868_000 picoseconds.
-		Weight::from_parts(1_942_000, 0)
+		// Minimum execution time: 1_842_000 picoseconds.
+		Weight::from_parts(1_969_000, 0)
 	}
 	fn get_transient_storage_empty() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_403_000 picoseconds.
-		Weight::from_parts(1_539_000, 0)
+		// Minimum execution time: 1_437_000 picoseconds.
+		Weight::from_parts(1_557_000, 0)
 	}
 	fn get_transient_storage_full() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_676_000 picoseconds.
-		Weight::from_parts(1_760_000, 0)
+		// Minimum execution time: 1_600_000 picoseconds.
+		Weight::from_parts(1_679_000, 0)
 	}
 	fn rollback_transient_storage() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_119_000 picoseconds.
-		Weight::from_parts(1_205_000, 0)
+		// Minimum execution time: 1_114_000 picoseconds.
+		Weight::from_parts(1_191_000, 0)
 	}
 	/// The range of component `n` is `[0, 512]`.
 	/// The range of component `o` is `[0, 512]`.
@@ -1574,50 +1591,50 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_146_000 picoseconds.
-		Weight::from_parts(2_315_339, 0)
-			// Standard Error: 13
-			.saturating_add(Weight::from_parts(327, 0).saturating_mul(n.into()))
-			// Standard Error: 13
-			.saturating_add(Weight::from_parts(366, 0).saturating_mul(o.into()))
+		// Minimum execution time: 2_326_000 picoseconds.
+		Weight::from_parts(2_451_799, 0)
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(391, 0).saturating_mul(n.into()))
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(361, 0).saturating_mul(o.into()))
 	}
 	/// The range of component `n` is `[0, 512]`.
 	fn seal_clear_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_950_000 picoseconds.
-		Weight::from_parts(2_271_073, 0)
-			// Standard Error: 15
-			.saturating_add(Weight::from_parts(373, 0).saturating_mul(n.into()))
+		// Minimum execution time: 1_951_000 picoseconds.
+		Weight::from_parts(2_353_245, 0)
+			// Standard Error: 16
+			.saturating_add(Weight::from_parts(369, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 512]`.
 	fn seal_get_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_839_000 picoseconds.
-		Weight::from_parts(2_049_659, 0)
+		// Minimum execution time: 1_822_000 picoseconds.
+		Weight::from_parts(2_059_181, 0)
 			// Standard Error: 14
-			.saturating_add(Weight::from_parts(291, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(398, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 512]`.
 	fn seal_contains_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_716_000 picoseconds.
-		Weight::from_parts(1_893_932, 0)
+		// Minimum execution time: 1_697_000 picoseconds.
+		Weight::from_parts(1_905_887, 0)
 			// Standard Error: 12
-			.saturating_add(Weight::from_parts(172, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(215, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 512]`.
 	fn seal_take_transient_storage(_n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_448_000 picoseconds.
-		Weight::from_parts(2_676_764, 0)
+		// Minimum execution time: 2_533_000 picoseconds.
+		Weight::from_parts(2_759_660, 0)
 	}
 	/// Storage: `Revive::AddressSuffix` (r:1 w:0)
 	/// Proof: `Revive::AddressSuffix` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `Measured`)
@@ -1633,30 +1650,32 @@ impl WeightInfo for () {
 	/// The range of component `i` is `[0, 262144]`.
 	fn seal_call(t: u32, i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1294 + t * (242 ±0)`
+		//  Measured:  `1294 + t * (243 ±0)`
 		//  Estimated: `4759 + t * (2501 ±0)`
-		// Minimum execution time: 39_786_000 picoseconds.
-		Weight::from_parts(41_175_457, 4759)
-			// Standard Error: 45_251
-			.saturating_add(Weight::from_parts(2_375_617, 0).saturating_mul(t.into()))
+		// Minimum execution time: 43_295_000 picoseconds.
+		Weight::from_parts(44_592_141, 4759)
+			// Standard Error: 60_598
+			.saturating_add(Weight::from_parts(1_458_798, 0).saturating_mul(t.into()))
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(2, 0).saturating_mul(i.into()))
+			.saturating_add(Weight::from_parts(3, 0).saturating_mul(i.into()))
 			.saturating_add(RocksDbWeight::get().reads(4_u64))
 			.saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(t.into())))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 			.saturating_add(Weight::from_parts(0, 2501).saturating_mul(t.into()))
 	}
+	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
+	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(1779), added: 4254, mode: `Measured`)
 	/// Storage: `Revive::CodeInfoOf` (r:1 w:0)
 	/// Proof: `Revive::CodeInfoOf` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `Measured`)
 	/// Storage: `Revive::PristineCode` (r:1 w:0)
 	/// Proof: `Revive::PristineCode` (`max_values`: None, `max_size`: Some(262180), added: 264655, mode: `Measured`)
 	fn seal_delegate_call() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1064`
-		//  Estimated: `4529`
-		// Minimum execution time: 29_762_000 picoseconds.
-		Weight::from_parts(31_345_000, 4529)
-			.saturating_add(RocksDbWeight::get().reads(2_u64))
+		//  Measured:  `1237`
+		//  Estimated: `4702`
+		// Minimum execution time: 37_787_000 picoseconds.
+		Weight::from_parts(38_510_000, 4702)
+			.saturating_add(RocksDbWeight::get().reads(3_u64))
 	}
 	/// Storage: `Revive::CodeInfoOf` (r:1 w:1)
 	/// Proof: `Revive::CodeInfoOf` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `Measured`)
@@ -1669,12 +1688,12 @@ impl WeightInfo for () {
 	/// The range of component `i` is `[0, 262144]`.
 	fn seal_instantiate(i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1310`
-		//  Estimated: `4748`
-		// Minimum execution time: 117_791_000 picoseconds.
-		Weight::from_parts(105_413_907, 4748)
-			// Standard Error: 11
-			.saturating_add(Weight::from_parts(4_038, 0).saturating_mul(i.into()))
+		//  Measured:  `1273`
+		//  Estimated: `4736`
+		// Minimum execution time: 121_346_000 picoseconds.
+		Weight::from_parts(115_747_843, 4736)
+			// Standard Error: 10
+			.saturating_add(Weight::from_parts(4_189, 0).saturating_mul(i.into()))
 			.saturating_add(RocksDbWeight::get().reads(4_u64))
 			.saturating_add(RocksDbWeight::get().writes(3_u64))
 	}
@@ -1683,64 +1702,64 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 638_000 picoseconds.
-		Weight::from_parts(4_703_710, 0)
+		// Minimum execution time: 696_000 picoseconds.
+		Weight::from_parts(3_319_775, 0)
 			// Standard Error: 3
-			.saturating_add(Weight::from_parts(1_349, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(1_500, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 262144]`.
 	fn seal_hash_keccak_256(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_085_000 picoseconds.
-		Weight::from_parts(3_630_716, 0)
+		// Minimum execution time: 1_070_000 picoseconds.
+		Weight::from_parts(4_463_019, 0)
 			// Standard Error: 3
-			.saturating_add(Weight::from_parts(3_567, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(3_689, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 262144]`.
 	fn seal_hash_blake2_256(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 643_000 picoseconds.
-		Weight::from_parts(3_733_026, 0)
+		// Minimum execution time: 617_000 picoseconds.
+		Weight::from_parts(3_175_243, 0)
 			// Standard Error: 3
-			.saturating_add(Weight::from_parts(1_492, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(1_617, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 262144]`.
 	fn seal_hash_blake2_128(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 653_000 picoseconds.
-		Weight::from_parts(4_627_285, 0)
+		// Minimum execution time: 616_000 picoseconds.
+		Weight::from_parts(3_420_409, 0)
 			// Standard Error: 3
-			.saturating_add(Weight::from_parts(1_478, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(1_623, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 261889]`.
 	fn seal_sr25519_verify(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 45_786_000 picoseconds.
-		Weight::from_parts(36_383_470, 0)
-			// Standard Error: 10
-			.saturating_add(Weight::from_parts(5_396, 0).saturating_mul(n.into()))
+		// Minimum execution time: 45_562_000 picoseconds.
+		Weight::from_parts(34_462_046, 0)
+			// Standard Error: 11
+			.saturating_add(Weight::from_parts(5_259, 0).saturating_mul(n.into()))
 	}
 	fn seal_ecdsa_recover() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 48_140_000 picoseconds.
-		Weight::from_parts(49_720_000, 0)
+		// Minimum execution time: 49_472_000 picoseconds.
+		Weight::from_parts(50_517_000, 0)
 	}
 	fn seal_ecdsa_to_eth_address() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 12_565_000 picoseconds.
-		Weight::from_parts(12_704_000, 0)
+		// Minimum execution time: 12_716_000 picoseconds.
+		Weight::from_parts(12_812_000, 0)
 	}
 	/// Storage: `Revive::CodeInfoOf` (r:1 w:1)
 	/// Proof: `Revive::CodeInfoOf` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `Measured`)
@@ -1748,8 +1767,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `300`
 		//  Estimated: `3765`
-		// Minimum execution time: 17_208_000 picoseconds.
-		Weight::from_parts(18_307_000, 3765)
+		// Minimum execution time: 17_891_000 picoseconds.
+		Weight::from_parts(18_833_000, 3765)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -1759,8 +1778,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `338`
 		//  Estimated: `3803`
-		// Minimum execution time: 13_686_000 picoseconds.
-		Weight::from_parts(14_186_000, 3803)
+		// Minimum execution time: 14_523_000 picoseconds.
+		Weight::from_parts(14_812_000, 3803)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -1770,8 +1789,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `338`
 		//  Estimated: `3561`
-		// Minimum execution time: 12_381_000 picoseconds.
-		Weight::from_parts(13_208_000, 3561)
+		// Minimum execution time: 13_114_000 picoseconds.
+		Weight::from_parts(13_567_000, 3561)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -1780,9 +1799,9 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 8_118_000 picoseconds.
-		Weight::from_parts(9_813_514, 0)
-			// Standard Error: 40
-			.saturating_add(Weight::from_parts(71_154, 0).saturating_mul(r.into()))
+		// Minimum execution time: 8_717_000 picoseconds.
+		Weight::from_parts(9_983_815, 0)
+			// Standard Error: 115
+			.saturating_add(Weight::from_parts(72_253, 0).saturating_mul(r.into()))
 	}
 }
diff --git a/substrate/frame/revive/uapi/src/host.rs b/substrate/frame/revive/uapi/src/host.rs
index 400a12879363..c6b9ef9d4fa2 100644
--- a/substrate/frame/revive/uapi/src/host.rs
+++ b/substrate/frame/revive/uapi/src/host.rs
@@ -436,6 +436,21 @@ pub trait HostFn: private::Sealed {
 	/// - `output`: A reference to the output data buffer to write the input data.
 	fn input(output: &mut &mut [u8]);
 
+	/// Stores the U256 value at given `offset` from the input passed by the caller
+	/// into the supplied buffer.
+	///
+	/// # Note
+	/// - If `offset` is out of bounds, a value of zero will be returned.
+	/// - If `offset` is in bounds but there is not enough call data, the available data
+	/// is right-padded in order to fill a whole U256 value.
+	/// - The data written to `output` is a little endian U256 integer value.
+	///
+	/// # Parameters
+	///
+	/// - `output`: A reference to the fixed output data buffer to write the value.
+	/// - `offset`: The offset (index) into the call data.
+	fn call_data_load(output: &mut [u8; 32], offset: u32);
+
 	/// Instantiate a contract with the specified code hash.
 	///
 	/// This function creates an account and executes the constructor defined in the code specified
diff --git a/substrate/frame/revive/uapi/src/host/riscv64.rs b/substrate/frame/revive/uapi/src/host/riscv64.rs
index b76320718a69..a208fef7055a 100644
--- a/substrate/frame/revive/uapi/src/host/riscv64.rs
+++ b/substrate/frame/revive/uapi/src/host/riscv64.rs
@@ -63,6 +63,7 @@ mod sys {
 		pub fn instantiate(ptr: *const u8) -> ReturnCode;
 		pub fn terminate(beneficiary_ptr: *const u8);
 		pub fn input(out_ptr: *mut u8, out_len_ptr: *mut u32);
+		pub fn call_data_load(out_ptr: *mut u8, offset: u32);
 		pub fn seal_return(flags: u32, data_ptr: *const u8, data_len: u32);
 		pub fn caller(out_ptr: *mut u8);
 		pub fn origin(out_ptr: *mut u8);
@@ -449,6 +450,10 @@ impl HostFn for HostFnImpl {
 		extract_from_slice(output, output_len as usize);
 	}
 
+	fn call_data_load(out_ptr: &mut [u8; 32], offset: u32) {
+		unsafe { sys::call_data_load(out_ptr.as_mut_ptr(), offset) };
+	}
+
 	fn return_value(flags: ReturnFlags, return_value: &[u8]) -> ! {
 		unsafe { sys::seal_return(flags.bits(), return_value.as_ptr(), return_value.len() as u32) }
 		panic!("seal_return does not return");
diff --git a/substrate/utils/frame/benchmarking-cli/Cargo.toml b/substrate/utils/frame/benchmarking-cli/Cargo.toml
index 8a4a06b1b40a..6d86346ee180 100644
--- a/substrate/utils/frame/benchmarking-cli/Cargo.toml
+++ b/substrate/utils/frame/benchmarking-cli/Cargo.toml
@@ -44,6 +44,7 @@ sc-executor = { workspace = true, default-features = true }
 sc-executor-common = { workspace = true }
 sc-service = { workspace = true }
 sc-sysinfo = { workspace = true, default-features = true }
+sc-runtime-utilities = { workspace = true, default-features = true }
 sp-api = { workspace = true, default-features = true }
 sp-blockchain = { workspace = true, default-features = true }
 sp-core = { workspace = true, default-features = true }
diff --git a/substrate/utils/frame/benchmarking-cli/src/lib.rs b/substrate/utils/frame/benchmarking-cli/src/lib.rs
index 1e8642e54d70..e1c3c5fe3706 100644
--- a/substrate/utils/frame/benchmarking-cli/src/lib.rs
+++ b/substrate/utils/frame/benchmarking-cli/src/lib.rs
@@ -30,7 +30,6 @@ pub use extrinsic::{ExtrinsicBuilder, ExtrinsicCmd, ExtrinsicFactory};
 pub use machine::{MachineCmd, SUBSTRATE_REFERENCE_HARDWARE};
 pub use overhead::{
 	remark_builder::{DynamicRemarkBuilder, SubstrateRemarkBuilder},
-	runtime_utilities::fetch_latest_metadata_from_code_blob,
 	OpaqueBlock, OverheadCmd,
 };
 pub use pallet::PalletCmd;
diff --git a/substrate/utils/frame/benchmarking-cli/src/overhead/command.rs b/substrate/utils/frame/benchmarking-cli/src/overhead/command.rs
index 8102f14b4f4b..8df8ee5464f7 100644
--- a/substrate/utils/frame/benchmarking-cli/src/overhead/command.rs
+++ b/substrate/utils/frame/benchmarking-cli/src/overhead/command.rs
@@ -18,7 +18,6 @@
 //! Contains the [`OverheadCmd`] as entry point for the CLI to execute
 //! the *overhead* benchmarks.
 
-use super::runtime_utilities::*;
 use crate::{
 	extrinsic::{
 		bench::{Benchmark, BenchmarkParams as ExtrinsicBenchmarkParams},
@@ -37,7 +36,7 @@ use crate::{
 	},
 };
 use clap::{error::ErrorKind, Args, CommandFactory, Parser};
-use codec::Encode;
+use codec::{Decode, Encode};
 use cumulus_client_parachain_inherent::MockValidationDataInherentDataProvider;
 use fake_runtime_api::RuntimeApi as FakeRuntimeApi;
 use frame_support::Deserialize;
@@ -50,6 +49,7 @@ use sc_cli::{CliConfiguration, Database, ImportParams, Result, SharedParams};
 use sc_client_api::{execution_extensions::ExecutionExtensions, UsageProvider};
 use sc_client_db::{BlocksPruning, DatabaseSettings};
 use sc_executor::WasmExecutor;
+use sc_runtime_utilities::fetch_latest_metadata_from_code_blob;
 use sc_service::{new_client, new_db_backend, BasePath, ClientConfig, TFullClient, TaskManager};
 use serde::Serialize;
 use serde_json::{json, Value};
@@ -317,7 +317,7 @@ impl OverheadCmd {
 					Some(self.params.genesis_builder_preset.clone()),
 				),
 				self.params.para_id,
-			))
+			));
 		};
 
 		Err("Neither a runtime nor a chain-spec were specified".to_string().into())
@@ -335,7 +335,7 @@ impl OverheadCmd {
 				ErrorKind::MissingRequiredArgument,
 				"Provide either a runtime via `--runtime` or a chain spec via `--chain`"
 					.to_string(),
-			))
+			));
 		}
 
 		match self.params.genesis_builder {
@@ -344,7 +344,7 @@ impl OverheadCmd {
 					return Err((
 						ErrorKind::MissingRequiredArgument,
 						"Provide a chain spec via `--chain`.".to_string(),
-					))
+					));
 				},
 			_ => {},
 		};
@@ -400,8 +400,12 @@ impl OverheadCmd {
 			.with_allow_missing_host_functions(true)
 			.build();
 
-		let metadata =
-			fetch_latest_metadata_from_code_blob(&executor, state_handler.get_code_bytes()?)?;
+		let opaque_metadata =
+			fetch_latest_metadata_from_code_blob(&executor, state_handler.get_code_bytes()?)
+				.map_err(|_| {
+					<&str as Into<sc_cli::Error>>::into("Unable to fetch latest stable metadata")
+				})?;
+		let metadata = subxt::Metadata::decode(&mut (*opaque_metadata).as_slice())?;
 
 		// At this point we know what kind of chain we are dealing with.
 		let chain_type = identify_chain(&metadata, para_id);
@@ -682,6 +686,7 @@ mod tests {
 		OverheadCmd,
 	};
 	use clap::Parser;
+	use codec::Decode;
 	use sc_executor::WasmExecutor;
 
 	#[test]
@@ -690,8 +695,9 @@ mod tests {
 		let code_bytes = westend_runtime::WASM_BINARY
 			.expect("To run this test, build the wasm binary of westend-runtime")
 			.to_vec();
-		let metadata =
+		let opaque_metadata =
 			super::fetch_latest_metadata_from_code_blob(&executor, code_bytes.into()).unwrap();
+		let metadata = subxt::Metadata::decode(&mut (*opaque_metadata).as_slice()).unwrap();
 		let chain_type = identify_chain(&metadata, None);
 		assert_eq!(chain_type, ChainType::Relaychain);
 		assert_eq!(chain_type.requires_proof_recording(), false);
@@ -703,8 +709,9 @@ mod tests {
 		let code_bytes = cumulus_test_runtime::WASM_BINARY
 			.expect("To run this test, build the wasm binary of cumulus-test-runtime")
 			.to_vec();
-		let metadata =
+		let opaque_metadata =
 			super::fetch_latest_metadata_from_code_blob(&executor, code_bytes.into()).unwrap();
+		let metadata = subxt::Metadata::decode(&mut (*opaque_metadata).as_slice()).unwrap();
 		let chain_type = identify_chain(&metadata, Some(100));
 		assert_eq!(chain_type, ChainType::Parachain(100));
 		assert!(chain_type.requires_proof_recording());
@@ -717,8 +724,9 @@ mod tests {
 		let code_bytes = substrate_test_runtime::WASM_BINARY
 			.expect("To run this test, build the wasm binary of substrate-test-runtime")
 			.to_vec();
-		let metadata =
+		let opaque_metadata =
 			super::fetch_latest_metadata_from_code_blob(&executor, code_bytes.into()).unwrap();
+		let metadata = subxt::Metadata::decode(&mut (*opaque_metadata).as_slice()).unwrap();
 		let chain_type = identify_chain(&metadata, None);
 		assert_eq!(chain_type, ChainType::Unknown);
 		assert_eq!(chain_type.requires_proof_recording(), false);
diff --git a/substrate/utils/frame/benchmarking-cli/src/overhead/mod.rs b/substrate/utils/frame/benchmarking-cli/src/overhead/mod.rs
index 89c23d1fb6c1..de524d9ebc18 100644
--- a/substrate/utils/frame/benchmarking-cli/src/overhead/mod.rs
+++ b/substrate/utils/frame/benchmarking-cli/src/overhead/mod.rs
@@ -20,6 +20,5 @@ pub mod template;
 
 mod fake_runtime_api;
 pub mod remark_builder;
-pub mod runtime_utilities;
 
 pub use command::{OpaqueBlock, OverheadCmd};
diff --git a/umbrella/Cargo.toml b/umbrella/Cargo.toml
index a72af30e2abe..b2adcdf92312 100644
--- a/umbrella/Cargo.toml
+++ b/umbrella/Cargo.toml
@@ -610,7 +610,7 @@ runtime = [
 	"sp-wasm-interface",
 	"sp-weights",
 ]
-node = ["asset-test-utils", "bridge-hub-test-utils", "cumulus-client-cli", "cumulus-client-collator", "cumulus-client-consensus-aura", "cumulus-client-consensus-common", "cumulus-client-consensus-proposer", "cumulus-client-consensus-relay-chain", "cumulus-client-network", "cumulus-client-parachain-inherent", "cumulus-client-pov-recovery", "cumulus-client-service", "cumulus-relay-chain-inprocess-interface", "cumulus-relay-chain-interface", "cumulus-relay-chain-minimal-node", "cumulus-relay-chain-rpc-interface", "cumulus-test-relay-sproof-builder", "emulated-integration-tests-common", "fork-tree", "frame-benchmarking-cli", "frame-remote-externalities", "frame-support-procedural-tools", "generate-bags", "mmr-gadget", "mmr-rpc", "pallet-contracts-mock-network", "pallet-revive-eth-rpc", "pallet-revive-mock-network", "pallet-transaction-payment-rpc", "parachains-runtimes-test-utils", "polkadot-approval-distribution", "polkadot-availability-bitfield-distribution", "polkadot-availability-distribution", "polkadot-availability-recovery", "polkadot-cli", "polkadot-collator-protocol", "polkadot-dispute-distribution", "polkadot-erasure-coding", "polkadot-gossip-support", "polkadot-network-bridge", "polkadot-node-collation-generation", "polkadot-node-core-approval-voting", "polkadot-node-core-approval-voting-parallel", "polkadot-node-core-av-store", "polkadot-node-core-backing", "polkadot-node-core-bitfield-signing", "polkadot-node-core-candidate-validation", "polkadot-node-core-chain-api", "polkadot-node-core-chain-selection", "polkadot-node-core-dispute-coordinator", "polkadot-node-core-parachains-inherent", "polkadot-node-core-prospective-parachains", "polkadot-node-core-provisioner", "polkadot-node-core-pvf", "polkadot-node-core-pvf-checker", "polkadot-node-core-pvf-common", "polkadot-node-core-pvf-execute-worker", "polkadot-node-core-pvf-prepare-worker", "polkadot-node-core-runtime-api", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-types", "polkadot-node-subsystem-util", "polkadot-omni-node-lib", "polkadot-overseer", "polkadot-rpc", "polkadot-service", "polkadot-statement-distribution", "polkadot-statement-table", "sc-allocator", "sc-authority-discovery", "sc-basic-authorship", "sc-block-builder", "sc-chain-spec", "sc-cli", "sc-client-api", "sc-client-db", "sc-consensus", "sc-consensus-aura", "sc-consensus-babe", "sc-consensus-babe-rpc", "sc-consensus-beefy", "sc-consensus-beefy-rpc", "sc-consensus-epochs", "sc-consensus-grandpa", "sc-consensus-grandpa-rpc", "sc-consensus-manual-seal", "sc-consensus-pow", "sc-consensus-slots", "sc-executor", "sc-executor-common", "sc-executor-polkavm", "sc-executor-wasmtime", "sc-informant", "sc-keystore", "sc-mixnet", "sc-network", "sc-network-common", "sc-network-gossip", "sc-network-light", "sc-network-statement", "sc-network-sync", "sc-network-transactions", "sc-network-types", "sc-offchain", "sc-proposer-metrics", "sc-rpc", "sc-rpc-api", "sc-rpc-server", "sc-rpc-spec-v2", "sc-service", "sc-state-db", "sc-statement-store", "sc-storage-monitor", "sc-sync-state-rpc", "sc-sysinfo", "sc-telemetry", "sc-tracing", "sc-transaction-pool", "sc-transaction-pool-api", "sc-utils", "snowbridge-runtime-test-common", "sp-blockchain", "sp-consensus", "sp-core-hashing", "sp-core-hashing-proc-macro", "sp-database", "sp-maybe-compressed-blob", "sp-panic-handler", "sp-rpc", "staging-chain-spec-builder", "staging-node-inspect", "staging-tracking-allocator", "std", "subkey", "substrate-build-script-utils", "substrate-frame-rpc-support", "substrate-frame-rpc-system", "substrate-prometheus-endpoint", "substrate-rpc-client", "substrate-state-trie-migration-rpc", "substrate-wasm-builder", "tracing-gum", "xcm-emulator", "xcm-simulator"]
+node = ["asset-test-utils", "bridge-hub-test-utils", "cumulus-client-cli", "cumulus-client-collator", "cumulus-client-consensus-aura", "cumulus-client-consensus-common", "cumulus-client-consensus-proposer", "cumulus-client-consensus-relay-chain", "cumulus-client-network", "cumulus-client-parachain-inherent", "cumulus-client-pov-recovery", "cumulus-client-service", "cumulus-relay-chain-inprocess-interface", "cumulus-relay-chain-interface", "cumulus-relay-chain-minimal-node", "cumulus-relay-chain-rpc-interface", "cumulus-test-relay-sproof-builder", "emulated-integration-tests-common", "fork-tree", "frame-benchmarking-cli", "frame-remote-externalities", "frame-support-procedural-tools", "generate-bags", "mmr-gadget", "mmr-rpc", "pallet-contracts-mock-network", "pallet-revive-eth-rpc", "pallet-revive-mock-network", "pallet-transaction-payment-rpc", "parachains-runtimes-test-utils", "polkadot-approval-distribution", "polkadot-availability-bitfield-distribution", "polkadot-availability-distribution", "polkadot-availability-recovery", "polkadot-cli", "polkadot-collator-protocol", "polkadot-dispute-distribution", "polkadot-erasure-coding", "polkadot-gossip-support", "polkadot-network-bridge", "polkadot-node-collation-generation", "polkadot-node-core-approval-voting", "polkadot-node-core-approval-voting-parallel", "polkadot-node-core-av-store", "polkadot-node-core-backing", "polkadot-node-core-bitfield-signing", "polkadot-node-core-candidate-validation", "polkadot-node-core-chain-api", "polkadot-node-core-chain-selection", "polkadot-node-core-dispute-coordinator", "polkadot-node-core-parachains-inherent", "polkadot-node-core-prospective-parachains", "polkadot-node-core-provisioner", "polkadot-node-core-pvf", "polkadot-node-core-pvf-checker", "polkadot-node-core-pvf-common", "polkadot-node-core-pvf-execute-worker", "polkadot-node-core-pvf-prepare-worker", "polkadot-node-core-runtime-api", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-types", "polkadot-node-subsystem-util", "polkadot-omni-node-lib", "polkadot-overseer", "polkadot-rpc", "polkadot-service", "polkadot-statement-distribution", "polkadot-statement-table", "sc-allocator", "sc-authority-discovery", "sc-basic-authorship", "sc-block-builder", "sc-chain-spec", "sc-cli", "sc-client-api", "sc-client-db", "sc-consensus", "sc-consensus-aura", "sc-consensus-babe", "sc-consensus-babe-rpc", "sc-consensus-beefy", "sc-consensus-beefy-rpc", "sc-consensus-epochs", "sc-consensus-grandpa", "sc-consensus-grandpa-rpc", "sc-consensus-manual-seal", "sc-consensus-pow", "sc-consensus-slots", "sc-executor", "sc-executor-common", "sc-executor-polkavm", "sc-executor-wasmtime", "sc-informant", "sc-keystore", "sc-mixnet", "sc-network", "sc-network-common", "sc-network-gossip", "sc-network-light", "sc-network-statement", "sc-network-sync", "sc-network-transactions", "sc-network-types", "sc-offchain", "sc-proposer-metrics", "sc-rpc", "sc-rpc-api", "sc-rpc-server", "sc-rpc-spec-v2", "sc-runtime-utilities", "sc-service", "sc-state-db", "sc-statement-store", "sc-storage-monitor", "sc-sync-state-rpc", "sc-sysinfo", "sc-telemetry", "sc-tracing", "sc-transaction-pool", "sc-transaction-pool-api", "sc-utils", "snowbridge-runtime-test-common", "sp-blockchain", "sp-consensus", "sp-core-hashing", "sp-core-hashing-proc-macro", "sp-database", "sp-maybe-compressed-blob", "sp-panic-handler", "sp-rpc", "staging-chain-spec-builder", "staging-node-inspect", "staging-tracking-allocator", "std", "subkey", "substrate-build-script-utils", "substrate-frame-rpc-support", "substrate-frame-rpc-system", "substrate-prometheus-endpoint", "substrate-rpc-client", "substrate-state-trie-migration-rpc", "substrate-wasm-builder", "tracing-gum", "xcm-emulator", "xcm-simulator"]
 tuples-96 = [
 	"frame-support-procedural?/tuples-96",
 	"frame-support?/tuples-96",
@@ -2353,6 +2353,11 @@ path = "../substrate/client/rpc-spec-v2"
 default-features = false
 optional = true
 
+[dependencies.sc-runtime-utilities]
+path = "../substrate/client/runtime-utilities"
+default-features = false
+optional = true
+
 [dependencies.sc-service]
 path = "../substrate/client/service"
 default-features = false
diff --git a/umbrella/src/lib.rs b/umbrella/src/lib.rs
index 471a3141bac0..83f3d5408b20 100644
--- a/umbrella/src/lib.rs
+++ b/umbrella/src/lib.rs
@@ -71,7 +71,8 @@ pub use bridge_hub_common;
 #[cfg(feature = "bridge-hub-test-utils")]
 pub use bridge_hub_test_utils;
 
-/// Common types and functions that may be used by substrate-based runtimes of all bridged chains.
+/// Common types and functions that may be used by substrate-based runtimes of all bridged
+/// chains.
 #[cfg(feature = "bridge-runtime-common")]
 pub use bridge_runtime_common;
 
@@ -103,7 +104,8 @@ pub use cumulus_client_consensus_relay_chain;
 #[cfg(feature = "cumulus-client-network")]
 pub use cumulus_client_network;
 
-/// Inherent that needs to be present in every parachain block. Contains messages and a relay chain storage-proof.
+/// Inherent that needs to be present in every parachain block. Contains messages and a relay
+/// chain storage-proof.
 #[cfg(feature = "cumulus-client-parachain-inherent")]
 pub use cumulus_client_parachain_inherent;
 
@@ -159,7 +161,8 @@ pub use cumulus_primitives_aura;
 #[cfg(feature = "cumulus-primitives-core")]
 pub use cumulus_primitives_core;
 
-/// Inherent that needs to be present in every parachain block. Contains messages and a relay chain storage-proof.
+/// Inherent that needs to be present in every parachain block. Contains messages and a relay
+/// chain storage-proof.
 #[cfg(feature = "cumulus-primitives-parachain-inherent")]
 pub use cumulus_primitives_parachain_inherent;
 
@@ -203,7 +206,8 @@ pub use cumulus_test_relay_sproof_builder;
 #[cfg(feature = "emulated-integration-tests-common")]
 pub use emulated_integration_tests_common;
 
-/// Utility library for managing tree-like ordered data with logic for pruning the tree while finalizing nodes.
+/// Utility library for managing tree-like ordered data with logic for pruning the tree while
+/// finalizing nodes.
 #[cfg(feature = "fork-tree")]
 pub use fork_tree;
 
@@ -235,7 +239,8 @@ pub use frame_executive;
 #[cfg(feature = "frame-metadata-hash-extension")]
 pub use frame_metadata_hash_extension;
 
-/// An externalities provided environment that can load itself from remote nodes or cached files.
+/// An externalities provided environment that can load itself from remote nodes or cached
+/// files.
 #[cfg(feature = "frame-remote-externalities")]
 pub use frame_remote_externalities;
 
@@ -331,7 +336,8 @@ pub use pallet_authority_discovery;
 #[cfg(feature = "pallet-authorship")]
 pub use pallet_authorship;
 
-/// Consensus extension module for BABE consensus. Collects on-chain randomness from VRF outputs and manages epoch transitions.
+/// Consensus extension module for BABE consensus. Collects on-chain randomness from VRF
+/// outputs and manages epoch transitions.
 #[cfg(feature = "pallet-babe")]
 pub use pallet_babe;
 
@@ -355,7 +361,8 @@ pub use pallet_beefy_mmr;
 #[cfg(feature = "pallet-bounties")]
 pub use pallet_bounties;
 
-/// Module implementing GRANDPA on-chain light client used for bridging consensus of substrate-based chains.
+/// Module implementing GRANDPA on-chain light client used for bridging consensus of
+/// substrate-based chains.
 #[cfg(feature = "pallet-bridge-grandpa")]
 pub use pallet_bridge_grandpa;
 
@@ -383,7 +390,8 @@ pub use pallet_child_bounties;
 #[cfg(feature = "pallet-collator-selection")]
 pub use pallet_collator_selection;
 
-/// Collective system: Members of a set of account IDs can make their collective feelings known through dispatched calls from one of two specialized origins.
+/// Collective system: Members of a set of account IDs can make their collective feelings known
+/// through dispatched calls from one of two specialized origins.
 #[cfg(feature = "pallet-collective")]
 pub use pallet_collective;
 
@@ -551,7 +559,8 @@ pub use pallet_preimage;
 #[cfg(feature = "pallet-proxy")]
 pub use pallet_proxy;
 
-/// Ranked collective system: Members of a set of account IDs can make their collective feelings known through dispatched calls from one of two specialized origins.
+/// Ranked collective system: Members of a set of account IDs can make their collective
+/// feelings known through dispatched calls from one of two specialized origins.
 #[cfg(feature = "pallet-ranked-collective")]
 pub use pallet_ranked_collective;
 
@@ -619,7 +628,8 @@ pub use pallet_session;
 #[cfg(feature = "pallet-session-benchmarking")]
 pub use pallet_session_benchmarking;
 
-/// Pallet to skip payments for calls annotated with `feeless_if` if the respective conditions are satisfied.
+/// Pallet to skip payments for calls annotated with `feeless_if` if the respective conditions
+/// are satisfied.
 #[cfg(feature = "pallet-skip-feeless-payment")]
 pub use pallet_skip_feeless_payment;
 
@@ -731,19 +741,23 @@ pub use parachains_common;
 #[cfg(feature = "parachains-runtimes-test-utils")]
 pub use parachains_runtimes_test_utils;
 
-/// Polkadot Approval Distribution subsystem for the distribution of assignments and approvals for approval checks on candidates over the network.
+/// Polkadot Approval Distribution subsystem for the distribution of assignments and approvals
+/// for approval checks on candidates over the network.
 #[cfg(feature = "polkadot-approval-distribution")]
 pub use polkadot_approval_distribution;
 
-/// Polkadot Bitfiled Distribution subsystem, which gossips signed availability bitfields used to compactly determine which backed candidates are available or not based on a 2/3+ quorum.
+/// Polkadot Bitfiled Distribution subsystem, which gossips signed availability bitfields used
+/// to compactly determine which backed candidates are available or not based on a 2/3+ quorum.
 #[cfg(feature = "polkadot-availability-bitfield-distribution")]
 pub use polkadot_availability_bitfield_distribution;
 
-/// The Availability Distribution subsystem. Requests the required availability data. Also distributes availability data and chunks to requesters.
+/// The Availability Distribution subsystem. Requests the required availability data. Also
+/// distributes availability data and chunks to requesters.
 #[cfg(feature = "polkadot-availability-distribution")]
 pub use polkadot_availability_distribution;
 
-/// The Availability Recovery subsystem. Handles requests for recovering the availability data of included candidates.
+/// The Availability Recovery subsystem. Handles requests for recovering the availability data
+/// of included candidates.
 #[cfg(feature = "polkadot-availability-recovery")]
 pub use polkadot_availability_recovery;
 
@@ -751,7 +765,8 @@ pub use polkadot_availability_recovery;
 #[cfg(feature = "polkadot-cli")]
 pub use polkadot_cli;
 
-/// Polkadot Collator Protocol subsystem. Allows collators and validators to talk to each other.
+/// Polkadot Collator Protocol subsystem. Allows collators and validators to talk to each
+/// other.
 #[cfg(feature = "polkadot-collator-protocol")]
 pub use polkadot_collator_protocol;
 
@@ -759,7 +774,8 @@ pub use polkadot_collator_protocol;
 #[cfg(feature = "polkadot-core-primitives")]
 pub use polkadot_core_primitives;
 
-/// Polkadot Dispute Distribution subsystem, which ensures all concerned validators are aware of a dispute and have the relevant votes.
+/// Polkadot Dispute Distribution subsystem, which ensures all concerned validators are aware
+/// of a dispute and have the relevant votes.
 #[cfg(feature = "polkadot-dispute-distribution")]
 pub use polkadot_dispute_distribution;
 
@@ -767,7 +783,8 @@ pub use polkadot_dispute_distribution;
 #[cfg(feature = "polkadot-erasure-coding")]
 pub use polkadot_erasure_coding;
 
-/// Polkadot Gossip Support subsystem. Responsible for keeping track of session changes and issuing a connection request to the relevant validators on every new session.
+/// Polkadot Gossip Support subsystem. Responsible for keeping track of session changes and
+/// issuing a connection request to the relevant validators on every new session.
 #[cfg(feature = "polkadot-gossip-support")]
 pub use polkadot_gossip_support;
 
@@ -787,11 +804,13 @@ pub use polkadot_node_core_approval_voting;
 #[cfg(feature = "polkadot-node-core-approval-voting-parallel")]
 pub use polkadot_node_core_approval_voting_parallel;
 
-/// The Availability Store subsystem. Wrapper over the DB that stores availability data and chunks.
+/// The Availability Store subsystem. Wrapper over the DB that stores availability data and
+/// chunks.
 #[cfg(feature = "polkadot-node-core-av-store")]
 pub use polkadot_node_core_av_store;
 
-/// The Candidate Backing Subsystem. Tracks parachain candidates that can be backed, as well as the issuance of statements about candidates.
+/// The Candidate Backing Subsystem. Tracks parachain candidates that can be backed, as well as
+/// the issuance of statements about candidates.
 #[cfg(feature = "polkadot-node-core-backing")]
 pub use polkadot_node_core_backing;
 
@@ -799,11 +818,13 @@ pub use polkadot_node_core_backing;
 #[cfg(feature = "polkadot-node-core-bitfield-signing")]
 pub use polkadot_node_core_bitfield_signing;
 
-/// Polkadot crate that implements the Candidate Validation subsystem. Handles requests to validate candidates according to a PVF.
+/// Polkadot crate that implements the Candidate Validation subsystem. Handles requests to
+/// validate candidates according to a PVF.
 #[cfg(feature = "polkadot-node-core-candidate-validation")]
 pub use polkadot_node_core_candidate_validation;
 
-/// The Chain API subsystem provides access to chain related utility functions like block number to hash conversions.
+/// The Chain API subsystem provides access to chain related utility functions like block
+/// number to hash conversions.
 #[cfg(feature = "polkadot-node-core-chain-api")]
 pub use polkadot_node_core_chain_api;
 
@@ -823,27 +844,33 @@ pub use polkadot_node_core_parachains_inherent;
 #[cfg(feature = "polkadot-node-core-prospective-parachains")]
 pub use polkadot_node_core_prospective_parachains;
 
-/// Responsible for assembling a relay chain block from a set of available parachain candidates.
+/// Responsible for assembling a relay chain block from a set of available parachain
+/// candidates.
 #[cfg(feature = "polkadot-node-core-provisioner")]
 pub use polkadot_node_core_provisioner;
 
-/// Polkadot crate that implements the PVF validation host. Responsible for coordinating preparation and execution of PVFs.
+/// Polkadot crate that implements the PVF validation host. Responsible for coordinating
+/// preparation and execution of PVFs.
 #[cfg(feature = "polkadot-node-core-pvf")]
 pub use polkadot_node_core_pvf;
 
-/// Polkadot crate that implements the PVF pre-checking subsystem. Responsible for checking and voting for PVFs that are pending approval.
+/// Polkadot crate that implements the PVF pre-checking subsystem. Responsible for checking and
+/// voting for PVFs that are pending approval.
 #[cfg(feature = "polkadot-node-core-pvf-checker")]
 pub use polkadot_node_core_pvf_checker;
 
-/// Polkadot crate that contains functionality related to PVFs that is shared by the PVF host and the PVF workers.
+/// Polkadot crate that contains functionality related to PVFs that is shared by the PVF host
+/// and the PVF workers.
 #[cfg(feature = "polkadot-node-core-pvf-common")]
 pub use polkadot_node_core_pvf_common;
 
-/// Polkadot crate that contains the logic for executing PVFs. Used by the polkadot-execute-worker binary.
+/// Polkadot crate that contains the logic for executing PVFs. Used by the
+/// polkadot-execute-worker binary.
 #[cfg(feature = "polkadot-node-core-pvf-execute-worker")]
 pub use polkadot_node_core_pvf_execute_worker;
 
-/// Polkadot crate that contains the logic for preparing PVFs. Used by the polkadot-prepare-worker binary.
+/// Polkadot crate that contains the logic for preparing PVFs. Used by the
+/// polkadot-prepare-worker binary.
 #[cfg(feature = "polkadot-node-core-pvf-prepare-worker")]
 pub use polkadot_node_core_pvf_prepare_worker;
 
@@ -907,7 +934,8 @@ pub use polkadot_runtime_metrics;
 #[cfg(feature = "polkadot-runtime-parachains")]
 pub use polkadot_runtime_parachains;
 
-/// Experimental: The single package to get you started with building frame pallets and runtimes.
+/// Experimental: The single package to get you started with building frame pallets and
+/// runtimes.
 #[cfg(feature = "polkadot-sdk-frame")]
 pub use polkadot_sdk_frame;
 
@@ -1091,7 +1119,12 @@ pub use sc_rpc_server;
 #[cfg(feature = "sc-rpc-spec-v2")]
 pub use sc_rpc_spec_v2;
 
-/// Substrate service. Starts a thread that spins up the network, client, and extrinsic pool. Manages communication between them.
+/// Substrate client utilities for frame runtime functions calls.
+#[cfg(feature = "sc-runtime-utilities")]
+pub use sc_runtime_utilities;
+
+/// Substrate service. Starts a thread that spins up the network, client, and extrinsic pool.
+/// Manages communication between them.
 #[cfg(feature = "sc-service")]
 pub use sc_service;
 
@@ -1283,7 +1316,8 @@ pub use sp_core;
 #[cfg(feature = "sp-core-hashing")]
 pub use sp_core_hashing;
 
-/// Procedural macros for calculating static hashes (deprecated in favor of `sp-crypto-hashing-proc-macro`).
+/// Procedural macros for calculating static hashes (deprecated in favor of
+/// `sp-crypto-hashing-proc-macro`).
 #[cfg(feature = "sp-core-hashing-proc-macro")]
 pub use sp_core_hashing_proc_macro;
 
@@ -1371,7 +1405,8 @@ pub use sp_runtime;
 #[cfg(feature = "sp-runtime-interface")]
 pub use sp_runtime_interface;
 
-/// This crate provides procedural macros for usage within the context of the Substrate runtime interface.
+/// This crate provides procedural macros for usage within the context of the Substrate runtime
+/// interface.
 #[cfg(feature = "sp-runtime-interface-proc-macro")]
 pub use sp_runtime_interface_proc_macro;
 
@@ -1379,7 +1414,8 @@ pub use sp_runtime_interface_proc_macro;
 #[cfg(feature = "sp-session")]
 pub use sp_session;
 
-/// A crate which contains primitives that are useful for implementation that uses staking approaches in general. Definitions related to sessions, slashing, etc go here.
+/// A crate which contains primitives that are useful for implementation that uses staking
+/// approaches in general. Definitions related to sessions, slashing, etc go here.
 #[cfg(feature = "sp-staking")]
 pub use sp_staking;
 
@@ -1391,7 +1427,8 @@ pub use sp_state_machine;
 #[cfg(feature = "sp-statement-store")]
 pub use sp_statement_store;
 
-/// Lowest-abstraction level for the Substrate runtime: just exports useful primitives from std or client/alloc to be used with any code that depends on the runtime.
+/// Lowest-abstraction level for the Substrate runtime: just exports useful primitives from std
+/// or client/alloc to be used with any code that depends on the runtime.
 #[cfg(feature = "sp-std")]
 pub use sp_std;
 
@@ -1419,7 +1456,8 @@ pub use sp_transaction_storage_proof;
 #[cfg(feature = "sp-trie")]
 pub use sp_trie;
 
-/// Version module for the Substrate runtime; Provides a function that returns the runtime version.
+/// Version module for the Substrate runtime; Provides a function that returns the runtime
+/// version.
 #[cfg(feature = "sp-version")]
 pub use sp_version;
 
@@ -1435,7 +1473,8 @@ pub use sp_wasm_interface;
 #[cfg(feature = "sp-weights")]
 pub use sp_weights;
 
-/// Utility for building chain-specification files for Substrate-based runtimes based on `sp-genesis-builder`.
+/// Utility for building chain-specification files for Substrate-based runtimes based on
+/// `sp-genesis-builder`.
 #[cfg(feature = "staging-chain-spec-builder")]
 pub use staging_chain_spec_builder;
 
@@ -1463,7 +1502,8 @@ pub use staging_xcm_builder;
 #[cfg(feature = "staging-xcm-executor")]
 pub use staging_xcm_executor;
 
-/// Generate and restore keys for Substrate based chains such as Polkadot, Kusama and a growing number of parachains and Substrate based projects.
+/// Generate and restore keys for Substrate based chains such as Polkadot, Kusama and a growing
+/// number of parachains and Substrate based projects.
 #[cfg(feature = "subkey")]
 pub use subkey;
 
@@ -1507,7 +1547,8 @@ pub use testnet_parachains_constants;
 #[cfg(feature = "tracing-gum")]
 pub use tracing_gum;
 
-/// Generate an overseer including builder pattern and message wrapper from a single annotated struct definition.
+/// Generate an overseer including builder pattern and message wrapper from a single annotated
+/// struct definition.
 #[cfg(feature = "tracing-gum-proc-macro")]
 pub use tracing_gum_proc_macro;