From 60146ba5d291530880e008e6650e2cfa74c9105c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20Thei=C3=9Fen?= <alex.theissen@me.com>
Date: Fri, 14 Feb 2025 14:16:08 +0100
Subject: [PATCH] pallet-revive: Fix the contract size related benchmarks
 (#7568)

Partly addresses https://github.com/paritytech/polkadot-sdk/issues/6157

The benchmarks measuring the impact of contract sizes on calling or
instantiating a contract were bogus because they needed to be written in
assembly in order to tightly control the basic block size.

This fixes the benchmarks for:
- call_with_code_per_byte
- upload_code
- instantiate_with_code

And adds a new benchmark that accounts for the fact that the interpreter
will always compile whole basic blocks:
- basic_block_compilation

After this PR only the weight we assign to instructions need to be
addressed.

---------

Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: PG Herveou <pgherveou@gmail.com>
---
 Cargo.lock                                    |  56 +-
 prdoc/pr_7568.prdoc                           |  24 +
 substrate/frame/revive/Cargo.toml             |   5 +-
 substrate/frame/revive/fixtures/Cargo.toml    |   2 +-
 .../frame/revive/fixtures/build/_Cargo.toml   |   2 +-
 .../fixtures/contracts/caller_contract.rs     |   9 +-
 .../frame/revive/src/benchmarking/code.rs     |  46 +-
 .../frame/revive/src/benchmarking/mod.rs      |  58 +-
 substrate/frame/revive/src/lib.rs             |   1 +
 substrate/frame/revive/src/limits.rs          |  24 +-
 substrate/frame/revive/src/tests.rs           |   5 +-
 substrate/frame/revive/src/wasm/mod.rs        |   8 +
 substrate/frame/revive/src/wasm/runtime.rs    |  10 +
 substrate/frame/revive/src/weights.rs         | 949 ++++++++++--------
 substrate/frame/revive/uapi/Cargo.toml        |   2 +-
 15 files changed, 701 insertions(+), 500 deletions(-)
 create mode 100644 prdoc/pr_7568.prdoc

diff --git a/Cargo.lock b/Cargo.lock
index 4882caf032b..a86f82efc2d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -14847,7 +14847,8 @@ dependencies = [
  "pallet-utility 28.0.0",
  "parity-scale-codec",
  "paste",
- "polkavm 0.19.0",
+ "polkavm 0.21.0",
+ "polkavm-common 0.21.0",
  "pretty_assertions",
  "rlp 0.6.1",
  "scale-info",
@@ -14941,7 +14942,7 @@ name = "pallet-revive-fixtures"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "polkavm-linker 0.19.0",
+ "polkavm-linker 0.21.0",
  "sp-core 28.0.0",
  "sp-io 30.0.0",
  "toml 0.8.19",
@@ -15056,7 +15057,7 @@ dependencies = [
  "pallet-revive-proc-macro 0.1.0",
  "parity-scale-codec",
  "paste",
- "polkavm-derive 0.19.0",
+ "polkavm-derive 0.21.0",
  "scale-info",
 ]
 
@@ -19937,15 +19938,15 @@ dependencies = [
 
 [[package]]
 name = "polkavm"
-version = "0.19.0"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8379bb48ff026aa8ae0645ea45f27920bfd21c82b2e82ed914224bb233d59f83"
+checksum = "cfd34e2f74206fff33482ae1718e275f11365ef8c4de7f0e69217f8845303867"
 dependencies = [
  "libc",
  "log",
- "polkavm-assembler 0.19.0",
- "polkavm-common 0.19.0",
- "polkavm-linux-raw 0.19.0",
+ "polkavm-assembler 0.21.0",
+ "polkavm-common 0.21.0",
+ "polkavm-linux-raw 0.21.0",
 ]
 
 [[package]]
@@ -19977,9 +19978,9 @@ dependencies = [
 
 [[package]]
 name = "polkavm-assembler"
-version = "0.19.0"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57513b596cf0bafb052dab48e9c168f473c35f7522e17f70cc9f96603012d9b7"
+checksum = "f512bc80cb10439391a7c13a9eb2d37cf66b7305e7df0a06d662eff4f5b07625"
 dependencies = [
  "log",
 ]
@@ -20015,12 +20016,13 @@ dependencies = [
 
 [[package]]
 name = "polkavm-common"
-version = "0.19.0"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a972bd305ba8cbf0de79951d6d49d2abfad47c277596be5a2c6a0924a163abbd"
+checksum = "5c16b809cfd398f861261c045a8745e6c78b71ea7e0d3ef6f7cc553eb27bc17e"
 dependencies = [
+ "blake3",
  "log",
- "polkavm-assembler 0.19.0",
+ "polkavm-assembler 0.21.0",
 ]
 
 [[package]]
@@ -20052,11 +20054,11 @@ dependencies = [
 
 [[package]]
 name = "polkavm-derive"
-version = "0.19.0"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8d866972a7532d82d05c26b4516563660dd6676d7ab9e64e681d8ef0e29255c"
+checksum = "47239245f87329541932c0d7fec750a66a75b13aa87dfe4fbfd637bab86ad387"
 dependencies = [
- "polkavm-derive-impl-macro 0.19.0",
+ "polkavm-derive-impl-macro 0.21.0",
 ]
 
 [[package]]
@@ -20097,11 +20099,11 @@ dependencies = [
 
 [[package]]
 name = "polkavm-derive-impl"
-version = "0.19.0"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cffca9d51b21153395a192b65698457687bc51daa41026629895542ccaa65c2"
+checksum = "24fd6c6215450c3e57511df5c38a82eb4bde208de15ee15046ac33852f3c3eaa"
 dependencies = [
- "polkavm-common 0.19.0",
+ "polkavm-common 0.21.0",
  "proc-macro2 1.0.93",
  "quote 1.0.38",
  "syn 2.0.98",
@@ -20139,11 +20141,11 @@ dependencies = [
 
 [[package]]
 name = "polkavm-derive-impl-macro"
-version = "0.19.0"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc0dc0cf2e8f4d30874131eccfa36bdabd4a52cfb79c15f8630508abaf06a2a6"
+checksum = "36837f6b7edfd6f4498f8d25d81da16cf03bd6992c3e56f3d477dfc90f4fefca"
 dependencies = [
- "polkavm-derive-impl 0.19.0",
+ "polkavm-derive-impl 0.21.0",
  "syn 2.0.98",
 ]
 
@@ -20195,16 +20197,16 @@ dependencies = [
 
 [[package]]
 name = "polkavm-linker"
-version = "0.19.0"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "caec2308f1328b5a667da45322c04fad7ff97ad8b36817d18c7635ea4dd6c6f4"
+checksum = "23bc764986c4a63f9ab9890c3f4eb9b4c13b6ff80d79685bd48ade147234aab4"
 dependencies = [
  "dirs",
  "gimli 0.31.1",
  "hashbrown 0.14.5",
  "log",
  "object 0.36.1",
- "polkavm-common 0.19.0",
+ "polkavm-common 0.21.0",
  "regalloc2 0.9.3",
  "rustc-demangle",
 ]
@@ -20229,9 +20231,9 @@ checksum = "23eff02c070c70f31878a3d915e88a914ecf3e153741e2fb572dde28cce20fde"
 
 [[package]]
 name = "polkavm-linux-raw"
-version = "0.19.0"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136ae072ab6fa38e584a06d12b1b216cff19f54d5cd202a8f8c5ec2e92e7e4bb"
+checksum = "be6cd1d48c5e7814d287a3e12a339386a5dfa2f3ac72f932335f4cf56467f1b3"
 
 [[package]]
 name = "polling"
diff --git a/prdoc/pr_7568.prdoc b/prdoc/pr_7568.prdoc
new file mode 100644
index 00000000000..1c896415fd0
--- /dev/null
+++ b/prdoc/pr_7568.prdoc
@@ -0,0 +1,24 @@
+title: 'pallet-revive: Fix the contract size related benchmarks'
+doc:
+- audience: Runtime Dev
+  description: |-
+    Partly addresses https://github.com/paritytech/polkadot-sdk/issues/6157
+
+    The benchmarks measuring the impact of contract sizes on calling or instantiating a contract were bogus because they needed to be written in assembly in order to tightly control the basic block size.
+
+    This fixes the benchmarks for:
+    - call_with_code_per_byte
+    - upload_code
+    - instantiate_with_code
+
+    And adds a new benchmark that accounts for the fact that the interpreter will always compile whole basic blocks:
+    - basic_block_compilation
+
+    After this PR only the weight we assign to instructions need to be addressed.
+crates:
+- name: pallet-revive
+  bump: major
+- name: pallet-revive-fixtures
+  bump: major
+- name: pallet-revive-uapi
+  bump: major
diff --git a/substrate/frame/revive/Cargo.toml b/substrate/frame/revive/Cargo.toml
index 09cbf0b49f5..77f0f7eb1e6 100644
--- a/substrate/frame/revive/Cargo.toml
+++ b/substrate/frame/revive/Cargo.toml
@@ -27,7 +27,8 @@ hex = { workspace = true }
 impl-trait-for-tuples = { workspace = true }
 log = { workspace = true }
 paste = { workspace = true }
-polkavm = { version = "0.19.0", default-features = false }
+polkavm = { version = "0.21.0", default-features = false }
+polkavm-common = { version = "0.21.0", default-features = false, optional = true }
 rlp = { workspace = true }
 scale-info = { features = ["derive"], workspace = true }
 serde = { features = [
@@ -93,6 +94,7 @@ std = [
 	"pallet-timestamp/std",
 	"pallet-transaction-payment/std",
 	"pallet-utility/std",
+	"polkavm-common?/std",
 	"polkavm/std",
 	"rlp/std",
 	"scale-info/std",
@@ -122,6 +124,7 @@ runtime-benchmarks = [
 	"pallet-timestamp/runtime-benchmarks",
 	"pallet-transaction-payment/runtime-benchmarks",
 	"pallet-utility/runtime-benchmarks",
+	"polkavm-common/alloc",
 	"sp-consensus-aura",
 	"sp-consensus-babe",
 	"sp-consensus-slots",
diff --git a/substrate/frame/revive/fixtures/Cargo.toml b/substrate/frame/revive/fixtures/Cargo.toml
index a6f25cc26f3..eaa2deefdc7 100644
--- a/substrate/frame/revive/fixtures/Cargo.toml
+++ b/substrate/frame/revive/fixtures/Cargo.toml
@@ -21,7 +21,7 @@ sp-io = { workspace = true, default-features = true, optional = true }
 
 [build-dependencies]
 anyhow = { workspace = true, default-features = true }
-polkavm-linker = { version = "0.19.0" }
+polkavm-linker = { version = "0.21.0" }
 toml = { workspace = true }
 
 [features]
diff --git a/substrate/frame/revive/fixtures/build/_Cargo.toml b/substrate/frame/revive/fixtures/build/_Cargo.toml
index 1a0a635420a..a5d505e066e 100644
--- a/substrate/frame/revive/fixtures/build/_Cargo.toml
+++ b/substrate/frame/revive/fixtures/build/_Cargo.toml
@@ -15,7 +15,7 @@ edition = "2021"
 uapi = { package = 'pallet-revive-uapi', path = "", features = ["unstable-hostfn"], default-features = false }
 common = { package = 'pallet-revive-fixtures-common', path = "" }
 hex-literal = { version = "0.4.1", default-features = false }
-polkavm-derive = { version = "0.19.0" }
+polkavm-derive = { version = "0.21.0" }
 
 [profile.release]
 opt-level = 3
diff --git a/substrate/frame/revive/fixtures/contracts/caller_contract.rs b/substrate/frame/revive/fixtures/contracts/caller_contract.rs
index 236aec2e863..bb5e76b7fb4 100644
--- a/substrate/frame/revive/fixtures/contracts/caller_contract.rs
+++ b/substrate/frame/revive/fixtures/contracts/caller_contract.rs
@@ -31,7 +31,7 @@ pub extern "C" fn deploy() {}
 #[no_mangle]
 #[polkavm_derive::polkavm_export]
 pub extern "C" fn call() {
-	input!(code_hash: &[u8; 32], load_code_ref_time: u64,);
+	input!(code_hash: &[u8; 32], load_code_ref_time: u64, load_code_proof_size: u64,);
 
 	// The value to transfer on instantiation and calls. Chosen to be greater than existential
 	// deposit.
@@ -122,9 +122,8 @@ pub extern "C" fn call() {
 	let res = api::call(
 		uapi::CallFlags::empty(),
 		&callee,
-		load_code_ref_time, // Too little ref_time weight.
-		u64::MAX,           /* How much proof_size weight to devote for the execution. u64::MAX
-		                     * = use all. */
+		load_code_ref_time, // just enough to load the contract
+		load_code_proof_size, // just enough to load the contract
 		&[u8::MAX; 32], // No deposit limit.
 		&value,
 		&INPUT,
@@ -137,7 +136,7 @@ pub extern "C" fn call() {
 		uapi::CallFlags::empty(),
 		&callee,
 		u64::MAX, // How much ref_time weight to devote for the execution. u64::MAX = use all.
-		1u64,     // too little proof_size weight
+		load_code_proof_size, //just enough to load the contract
 		&[u8::MAX; 32], // No deposit limit.
 		&value,
 		&INPUT,
diff --git a/substrate/frame/revive/src/benchmarking/code.rs b/substrate/frame/revive/src/benchmarking/code.rs
index ede3bb69b11..ba498461074 100644
--- a/substrate/frame/revive/src/benchmarking/code.rs
+++ b/substrate/frame/revive/src/benchmarking/code.rs
@@ -24,7 +24,8 @@
 //! we define this simple definition of a contract that can be passed to `create_code` that
 //! compiles it down into a `WasmModule` that can be used as a contract's code.
 
-use alloc::vec::Vec;
+use crate::limits;
+use alloc::{fmt::Write, string::ToString, vec::Vec};
 use pallet_revive_fixtures::bench as bench_fixtures;
 use sp_core::H256;
 use sp_io::hashing::keccak_256;
@@ -47,9 +48,46 @@ impl WasmModule {
 		Self::new(bench_fixtures::dummy_unique(replace_with))
 	}
 
-	/// A contract code of specified sizte that does nothing.
-	pub fn sized(_size: u32) -> Self {
-		Self::dummy()
+	/// Same as as `with_num_instructions` but based on the blob size.
+	///
+	/// This is needed when we weigh a blob without knowing how much instructions it
+	/// contains.
+	pub fn sized(size: u32) -> Self {
+		// Due to variable length encoding of instructions this is not precise. But we only
+		// need rough numbers for our benchmarks.
+		Self::with_num_instructions(size / 3)
+	}
+
+	/// A contract code of specified number of instructions that uses all its bytes for instructions
+	/// but will return immediately.
+	///
+	/// All the basic blocks are maximum sized (only the first is important though). This is to
+	/// account for the fact that the interpreter will compile one basic block at a time even
+	/// when no code is executed. Hence this contract will trigger the compilation of a maximum
+	/// sized basic block and then return with its first instruction.
+	///
+	/// All the code will be put into the "call" export. Hence this code can be safely used for the
+	/// `instantiate_with_code` benchmark where no compilation of any block should be measured.
+	pub fn with_num_instructions(num_instructions: u32) -> Self {
+		let mut text = "
+		pub @deploy:
+		ret
+		pub @call:
+		"
+		.to_string();
+		for i in 0..num_instructions {
+			match i {
+				// return execution right away without breaking up basic block
+				// SENTINEL is a hard coded syscall that terminates execution
+				0 => writeln!(text, "ecalli {}", crate::SENTINEL).unwrap(),
+				i if i % (limits::code::BASIC_BLOCK_SIZE - 1) == 0 =>
+					text.push_str("fallthrough\n"),
+				_ => text.push_str("a0 = a1 + a2\n"),
+			}
+		}
+		text.push_str("ret\n");
+		let code = polkavm_common::assembler::assemble(&text).unwrap();
+		Self::new(code)
 	}
 
 	/// A contract code that calls the "noop" host function in a loop depending in the input.
diff --git a/substrate/frame/revive/src/benchmarking/mod.rs b/substrate/frame/revive/src/benchmarking/mod.rs
index 94d8edef777..f72b9f206c8 100644
--- a/substrate/frame/revive/src/benchmarking/mod.rs
+++ b/substrate/frame/revive/src/benchmarking/mod.rs
@@ -259,14 +259,19 @@ mod benchmarks {
 	}
 
 	// This benchmarks the overhead of loading a code of size `c` byte from storage and into
-	// the execution engine. This does **not** include the actual execution for which the gas meter
-	// is responsible. This is achieved by generating all code to the `deploy` function
-	// which is in the wasm module but not executed on `call`.
-	// The results are supposed to be used as `call_with_code_per_byte(c) -
-	// call_with_code_per_byte(0)`.
+	// the execution engine.
+	//
+	// `call_with_code_per_byte(c) - call_with_code_per_byte(0)`
+	//
+	// This does **not** include the actual execution for which the gas meter
+	// is responsible. The code used here will just return on call.
+	//
+	// We expect the influence of `c` to be none in this benchmark because every instruction that
+	// is not in the first basic block is never read. We are primarily interested in the
+	// `proof_size` result of this benchmark.
 	#[benchmark(pov_mode = Measured)]
 	fn call_with_code_per_byte(
-		c: Linear<0, { limits::code::BLOB_BYTES }>,
+		c: Linear<0, { limits::code::STATIC_MEMORY_BYTES / limits::code::BYTES_PER_INSTRUCTION }>,
 	) -> Result<(), BenchmarkError> {
 		let instance =
 			Contract::<T>::with_caller(whitelisted_caller(), WasmModule::sized(c), vec![])?;
@@ -286,11 +291,46 @@ mod benchmarks {
 		Ok(())
 	}
 
+	// Measure the amount of time it takes to compile a single basic block.
+	//
+	// (basic_block_compilation(1) - basic_block_compilation(0)).ref_time()
+	//
+	// This is needed because the interpreter will always compile a whole basic block at
+	// a time. To prevent a contract from triggering compilation without doing any execution
+	// we will always charge one max sized block per contract call.
+	//
+	// We ignore the proof size component when using this benchmark as this is already accounted
+	// for in `call_with_code_per_byte`.
+	#[benchmark(pov_mode = Measured)]
+	fn basic_block_compilation(b: Linear<0, 1>) -> Result<(), BenchmarkError> {
+		let instance = Contract::<T>::with_caller(
+			whitelisted_caller(),
+			WasmModule::with_num_instructions(limits::code::BASIC_BLOCK_SIZE),
+			vec![],
+		)?;
+		let value = Pallet::<T>::min_balance();
+		let storage_deposit = default_deposit_limit::<T>();
+
+		#[block]
+		{
+			Pallet::<T>::call(
+				RawOrigin::Signed(instance.caller.clone()).into(),
+				instance.address,
+				value,
+				Weight::MAX,
+				storage_deposit,
+				vec![],
+			)?;
+		}
+
+		Ok(())
+	}
+
 	// `c`: Size of the code in bytes.
 	// `i`: Size of the input in bytes.
 	#[benchmark(pov_mode = Measured)]
 	fn instantiate_with_code(
-		c: Linear<0, { limits::code::BLOB_BYTES }>,
+		c: Linear<0, { limits::code::STATIC_MEMORY_BYTES / limits::code::BYTES_PER_INSTRUCTION }>,
 		i: Linear<0, { limits::code::BLOB_BYTES }>,
 	) {
 		let input = vec![42u8; i as usize];
@@ -416,7 +456,9 @@ mod benchmarks {
 	// It creates a maximum number of metering blocks per byte.
 	// `c`: Size of the code in bytes.
 	#[benchmark(pov_mode = Measured)]
-	fn upload_code(c: Linear<0, { limits::code::BLOB_BYTES }>) {
+	fn upload_code(
+		c: Linear<0, { limits::code::STATIC_MEMORY_BYTES / limits::code::BYTES_PER_INSTRUCTION }>,
+	) {
 		let caller = whitelisted_caller();
 		T::Currency::set_balance(&caller, caller_funding::<T>());
 		let WasmModule { code, hash, .. } = WasmModule::sized(c);
diff --git a/substrate/frame/revive/src/lib.rs b/substrate/frame/revive/src/lib.rs
index 9a86f6bf97d..5487a8eb069 100644
--- a/substrate/frame/revive/src/lib.rs
+++ b/substrate/frame/revive/src/lib.rs
@@ -654,6 +654,7 @@ pub mod pallet {
 					num_topic: 0,
 					len: max_payload_size,
 				})
+				.saturating_add(<RuntimeCosts as gas::Token<T>>::weight(&RuntimeCosts::HostFn))
 				.ref_time()))
 			.saturating_mul(max_payload_size as u64))
 			.try_into()
diff --git a/substrate/frame/revive/src/limits.rs b/substrate/frame/revive/src/limits.rs
index 96f8131a723..09c611a9b64 100644
--- a/substrate/frame/revive/src/limits.rs
+++ b/substrate/frame/revive/src/limits.rs
@@ -91,22 +91,22 @@ pub mod code {
 	/// the allowed code size by [`BYTE_PER_INSTRUCTION`].
 	pub const STATIC_MEMORY_BYTES: u32 = 2 * 1024 * 1024;
 
+	/// The maximum size of a basic block in number of instructions.
+	///
+	/// We need to limit the size of basic blocks because the interpreters lazy compilation
+	/// compiles one basic block at a time. A malicious program could trigger the compilation
+	/// of the whole program by creating one giant basic block otherwise.
+	pub const BASIC_BLOCK_SIZE: u32 = 1000;
+
 	/// How much memory each instruction will take in-memory after compilation.
 	///
 	/// This is `size_of<usize>() + 16`. But we don't use `usize` here so it isn't
 	/// different on the native runtime (used for testing).
-	const BYTES_PER_INSTRUCTION: u32 = 20;
+	pub const BYTES_PER_INSTRUCTION: u32 = 20;
 
 	/// The code is stored multiple times as part of the compiled program.
 	const EXTRA_OVERHEAD_PER_CODE_BYTE: u32 = 4;
 
-	/// The maximum size of a basic block in number of instructions.
-	///
-	/// We need to limit the size of basic blocks because the interpreters lazy compilation
-	/// compiles one basic block at a time. A malicious program could trigger the compilation
-	/// of the whole program by creating one giant basic block otherwise.
-	const BASIC_BLOCK_SIZE: u32 = 1000;
-
 	/// Make sure that the various program parts are within the defined limits.
 	pub fn enforce<T: Config>(
 		blob: Vec<u8>,
@@ -179,6 +179,14 @@ pub mod code {
 					log::debug!(target: LOG_TARGET, "sbrk instruction is not allowed. offset {}", inst.offset);
 					return Err(<Error<T>>::InvalidInstruction.into())
 				},
+				// Only benchmarking code is allowed to circumvent the import table. We might want
+				// to remove this magic syscall number later. Hence we need to prevent contracts
+				// from using it.
+				#[cfg(not(feature = "runtime-benchmarks"))]
+				Instruction::ecalli(idx) if idx == crate::SENTINEL => {
+					log::debug!(target: LOG_TARGET, "reserved syscall idx {idx}. offset {}", inst.offset);
+					return Err(<Error<T>>::InvalidInstruction.into())
+				},
 				_ => (),
 			}
 		}
diff --git a/substrate/frame/revive/src/tests.rs b/substrate/frame/revive/src/tests.rs
index 39ac6fcaf34..44f2afc8b0e 100644
--- a/substrate/frame/revive/src/tests.rs
+++ b/substrate/frame/revive/src/tests.rs
@@ -1034,7 +1034,10 @@ fn deploy_and_call_other_contract() {
 		// Call BOB contract, which attempts to instantiate and call the callee contract and
 		// makes various assertions on the results from those calls.
 		assert_ok!(builder::call(caller_addr)
-			.data((callee_code_hash, code_load_weight.ref_time()).encode())
+			.data(
+				(callee_code_hash, code_load_weight.ref_time(), code_load_weight.proof_size())
+					.encode()
+			)
 			.build());
 
 		assert_eq!(
diff --git a/substrate/frame/revive/src/wasm/mod.rs b/substrate/frame/revive/src/wasm/mod.rs
index 34244735201..512b8574eb1 100644
--- a/substrate/frame/revive/src/wasm/mod.rs
+++ b/substrate/frame/revive/src/wasm/mod.rs
@@ -110,8 +110,16 @@ struct CodeLoadToken(u32);
 
 impl<T: Config> Token<T> for CodeLoadToken {
 	fn weight(&self) -> Weight {
+		// the proof size impact is accounted for in the `call_with_code_per_byte`
+		// strictly speaking we are double charging for the first BASIC_BLOCK_SIZE
+		// instructions here. Let's consider this as a safety margin.
 		T::WeightInfo::call_with_code_per_byte(self.0)
 			.saturating_sub(T::WeightInfo::call_with_code_per_byte(0))
+			.saturating_add(
+				T::WeightInfo::basic_block_compilation(1)
+					.saturating_sub(T::WeightInfo::basic_block_compilation(0))
+					.set_proof_size(0),
+			)
 	}
 }
 
diff --git a/substrate/frame/revive/src/wasm/runtime.rs b/substrate/frame/revive/src/wasm/runtime.rs
index 279d72b97ee..b15d461c62f 100644
--- a/substrate/frame/revive/src/wasm/runtime.rs
+++ b/substrate/frame/revive/src/wasm/runtime.rs
@@ -601,6 +601,16 @@ impl<'a, E: Ext, M: PolkaVmInstance<E::T>> Runtime<'a, E, M> {
 			Ok(NotEnoughGas) => Some(Err(Error::<E::T>::OutOfGas.into())),
 			Ok(Step) => None,
 			Ok(Ecalli(idx)) => {
+				// This is a special hard coded syscall index which is used by benchmarks
+				// to abort contract execution. It is used to terminate the execution without
+				// breaking up a basic block. The fixed index is used so that the benchmarks
+				// don't have to deal with import tables.
+				if cfg!(feature = "runtime-benchmarks") && idx == SENTINEL {
+					return Some(Ok(ExecReturnValue {
+						flags: ReturnFlags::empty(),
+						data: Vec::new(),
+					}))
+				}
 				let Some(syscall_symbol) = module.imports().get(idx) else {
 					return Some(Err(<Error<E::T>>::InvalidSyscall.into()));
 				};
diff --git a/substrate/frame/revive/src/weights.rs b/substrate/frame/revive/src/weights.rs
index 42b8a9e5e72..217800798af 100644
--- a/substrate/frame/revive/src/weights.rs
+++ b/substrate/frame/revive/src/weights.rs
@@ -18,9 +18,9 @@
 //! Autogenerated weights for `pallet_revive`
 //!
 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
-//! DATE: 2025-02-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2025-02-13, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
-//! HOSTNAME: `11670a4f427b`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
+//! HOSTNAME: `5bca1e6a0b2d`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `None`, DB CACHE: `1024`
 
 // Executed Command:
@@ -48,7 +48,7 @@
 #![allow(unused_parens)]
 #![allow(unused_imports)]
 #![allow(missing_docs)]
-#[allow(dead_code)]
+#![allow(dead_code)]
 
 use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}};
 use core::marker::PhantomData;
@@ -58,6 +58,7 @@ pub trait WeightInfo {
 	fn on_process_deletion_queue_batch() -> Weight;
 	fn on_initialize_per_trie_key(k: u32, ) -> Weight;
 	fn call_with_code_per_byte(c: u32, ) -> Weight;
+	fn basic_block_compilation(b: u32, ) -> Weight;
 	fn instantiate_with_code(c: u32, i: u32, ) -> Weight;
 	fn instantiate(i: u32, ) -> Weight;
 	fn call() -> Weight;
@@ -144,8 +145,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `1485`
-		// Minimum execution time: 695_000 picoseconds.
-		Weight::from_parts(750_000, 1485)
+		// Minimum execution time: 657_000 picoseconds.
+		Weight::from_parts(703_000, 1485)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -155,10 +156,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `230 + k * (69 ±0)`
 		//  Estimated: `222 + k * (70 ±0)`
-		// Minimum execution time: 10_509_000 picoseconds.
-		Weight::from_parts(10_896_000, 222)
-			// Standard Error: 2_549
-			.saturating_add(Weight::from_parts(1_264_033, 0).saturating_mul(k.into()))
+		// Minimum execution time: 10_768_000 picoseconds.
+		Weight::from_parts(10_953_000, 222)
+			// Standard Error: 951
+			.saturating_add(Weight::from_parts(1_172_145, 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))
@@ -177,13 +178,40 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`)
 	/// Storage: `System::Account` (r:1 w:1)
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`)
-	/// The range of component `c` is `[0, 262144]`.
-	fn call_with_code_per_byte(_c: u32, ) -> Weight {
+	/// The range of component `c` is `[0, 104857]`.
+	fn call_with_code_per_byte(c: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1194`
-		//  Estimated: `7134`
-		// Minimum execution time: 84_008_000 picoseconds.
-		Weight::from_parts(91_138_296, 7134)
+		//  Measured:  `524 + c * (1 ±0)`
+		//  Estimated: `6458 + c * (1 ±0)`
+		// Minimum execution time: 71_766_000 picoseconds.
+		Weight::from_parts(97_749_536, 6458)
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(1_777, 0).saturating_mul(c.into()))
+			.saturating_add(T::DbWeight::get().reads(7_u64))
+			.saturating_add(T::DbWeight::get().writes(2_u64))
+			.saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into()))
+	}
+	/// Storage: `Revive::AddressSuffix` (r:2 w:0)
+	/// Proof: `Revive::AddressSuffix` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `Measured`)
+	/// Storage: `Revive::ContractInfoOf` (r:1 w:1)
+	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(242), added: 2717, 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`)
+	/// Storage: `Timestamp::Now` (r:1 w:0)
+	/// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`)
+	/// The range of component `b` is `[0, 1]`.
+	fn basic_block_compilation(b: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `3892`
+		//  Estimated: `9832`
+		// Minimum execution time: 111_124_000 picoseconds.
+		Weight::from_parts(114_011_830, 9832)
+			// Standard Error: 218_655
+			.saturating_add(Weight::from_parts(475_869, 0).saturating_mul(b.into()))
 			.saturating_add(T::DbWeight::get().reads(7_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -201,16 +229,18 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`)
 	/// Storage: `Revive::PristineCode` (r:0 w:1)
 	/// Proof: `Revive::PristineCode` (`max_values`: None, `max_size`: Some(262180), added: 264655, mode: `Measured`)
-	/// The range of component `c` is `[0, 262144]`.
+	/// The range of component `c` is `[0, 104857]`.
 	/// The range of component `i` is `[0, 262144]`.
-	fn instantiate_with_code(_c: u32, i: u32, ) -> Weight {
+	fn instantiate_with_code(c: u32, i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `93`
 		//  Estimated: `6033`
-		// Minimum execution time: 172_907_000 picoseconds.
-		Weight::from_parts(153_592_465, 6033)
-			// Standard Error: 12
-			.saturating_add(Weight::from_parts(4_544, 0).saturating_mul(i.into()))
+		// Minimum execution time: 1_482_086_000 picoseconds.
+		Weight::from_parts(107_627_972, 6033)
+			// Standard Error: 39
+			.saturating_add(Weight::from_parts(19_180, 0).saturating_mul(c.into()))
+			// Standard Error: 15
+			.saturating_add(Weight::from_parts(5_307, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(7_u64))
 			.saturating_add(T::DbWeight::get().writes(6_u64))
 	}
@@ -233,10 +263,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `987`
 		//  Estimated: `4452`
-		// Minimum execution time: 143_169_000 picoseconds.
-		Weight::from_parts(120_653_436, 4452)
-			// Standard Error: 16
-			.saturating_add(Weight::from_parts(4_444, 0).saturating_mul(i.into()))
+		// Minimum execution time: 139_661_000 picoseconds.
+		Weight::from_parts(75_448_171, 4452)
+			// Standard Error: 24
+			.saturating_add(Weight::from_parts(5_303, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(7_u64))
 			.saturating_add(T::DbWeight::get().writes(4_u64))
 	}
@@ -256,8 +286,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `1194`
 		//  Estimated: `7134`
-		// Minimum execution time: 138_392_000 picoseconds.
-		Weight::from_parts(143_329_000, 7134)
+		// Minimum execution time: 74_015_000 picoseconds.
+		Weight::from_parts(76_281_000, 7134)
 			.saturating_add(T::DbWeight::get().reads(7_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -267,13 +297,15 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(409), added: 2884, mode: `Measured`)
 	/// Storage: `Revive::PristineCode` (r:0 w:1)
 	/// Proof: `Revive::PristineCode` (`max_values`: None, `max_size`: Some(262180), added: 264655, mode: `Measured`)
-	/// The range of component `c` is `[0, 262144]`.
-	fn upload_code(_c: u32, ) -> Weight {
+	/// The range of component `c` is `[0, 104857]`.
+	fn upload_code(c: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3465`
-		// Minimum execution time: 43_420_000 picoseconds.
-		Weight::from_parts(45_143_767, 3465)
+		// Minimum execution time: 39_512_000 picoseconds.
+		Weight::from_parts(19_845_671, 3465)
+			// Standard Error: 20
+			.saturating_add(Weight::from_parts(14_190, 0).saturating_mul(c.into()))
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 			.saturating_add(T::DbWeight::get().writes(3_u64))
 	}
@@ -287,8 +319,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `181`
 		//  Estimated: `3646`
-		// Minimum execution time: 35_828_000 picoseconds.
-		Weight::from_parts(36_853_000, 3646)
+		// Minimum execution time: 35_130_000 picoseconds.
+		Weight::from_parts(35_831_000, 3646)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 			.saturating_add(T::DbWeight::get().writes(3_u64))
 	}
@@ -300,8 +332,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `424`
 		//  Estimated: `6364`
-		// Minimum execution time: 19_678_000 picoseconds.
-		Weight::from_parts(21_266_000, 6364)
+		// Minimum execution time: 19_092_000 picoseconds.
+		Weight::from_parts(19_813_000, 6364)
 			.saturating_add(T::DbWeight::get().reads(3_u64))
 			.saturating_add(T::DbWeight::get().writes(3_u64))
 	}
@@ -313,8 +345,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3465`
-		// Minimum execution time: 37_024_000 picoseconds.
-		Weight::from_parts(37_440_000, 3465)
+		// Minimum execution time: 35_711_000 picoseconds.
+		Weight::from_parts(36_640_000, 3465)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -326,8 +358,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `56`
 		//  Estimated: `3521`
-		// Minimum execution time: 31_228_000 picoseconds.
-		Weight::from_parts(32_183_000, 3521)
+		// Minimum execution time: 29_945_000 picoseconds.
+		Weight::from_parts(30_805_000, 3521)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -339,8 +371,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3465`
-		// Minimum execution time: 6_241_000 picoseconds.
-		Weight::from_parts(6_467_000, 3465)
+		// Minimum execution time: 6_070_000 picoseconds.
+		Weight::from_parts(6_521_000, 3465)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 	}
 	/// The range of component `r` is `[0, 1600]`.
@@ -348,24 +380,24 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 6_397_000 picoseconds.
-		Weight::from_parts(7_159_300, 0)
-			// Standard Error: 173
-			.saturating_add(Weight::from_parts(167_265, 0).saturating_mul(r.into()))
+		// Minimum execution time: 6_281_000 picoseconds.
+		Weight::from_parts(8_053_095, 0)
+			// Standard Error: 290
+			.saturating_add(Weight::from_parts(162_796, 0).saturating_mul(r.into()))
 	}
 	fn seal_caller() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 267_000 picoseconds.
-		Weight::from_parts(296_000, 0)
+		// Minimum execution time: 259_000 picoseconds.
+		Weight::from_parts(285_000, 0)
 	}
 	fn seal_origin() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 227_000 picoseconds.
-		Weight::from_parts(252_000, 0)
+		// Minimum execution time: 233_000 picoseconds.
+		Weight::from_parts(253_000, 0)
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
 	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(242), added: 2717, mode: `Measured`)
@@ -373,8 +405,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `202`
 		//  Estimated: `3667`
-		// Minimum execution time: 6_591_000 picoseconds.
-		Weight::from_parts(6_770_000, 3667)
+		// Minimum execution time: 6_459_000 picoseconds.
+		Weight::from_parts(6_695_000, 3667)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Revive::AddressSuffix` (r:1 w:0)
@@ -383,8 +415,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `144`
 		//  Estimated: `3609`
-		// Minimum execution time: 6_182_000 picoseconds.
-		Weight::from_parts(6_372_000, 3609)
+		// Minimum execution time: 6_068_000 picoseconds.
+		Weight::from_parts(6_312_000, 3609)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
@@ -393,16 +425,16 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `298`
 		//  Estimated: `3763`
-		// Minimum execution time: 7_327_000 picoseconds.
-		Weight::from_parts(7_612_000, 3763)
+		// Minimum execution time: 7_412_000 picoseconds.
+		Weight::from_parts(7_660_000, 3763)
 			.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: 232_000 picoseconds.
-		Weight::from_parts(287_000, 0)
+		// Minimum execution time: 266_000 picoseconds.
+		Weight::from_parts(282_000, 0)
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
 	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(242), added: 2717, mode: `Measured`)
@@ -412,51 +444,51 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `368`
 		//  Estimated: `3833`
-		// Minimum execution time: 10_918_000 picoseconds.
-		Weight::from_parts(11_323_000, 3833)
+		// Minimum execution time: 10_570_000 picoseconds.
+		Weight::from_parts(11_027_000, 3833)
 			.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: 310_000 picoseconds.
-		Weight::from_parts(340_000, 0)
+		// Minimum execution time: 263_000 picoseconds.
+		Weight::from_parts(315_000, 0)
 	}
 	fn seal_caller_is_root() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 257_000 picoseconds.
-		Weight::from_parts(292_000, 0)
+		// Minimum execution time: 239_000 picoseconds.
+		Weight::from_parts(278_000, 0)
 	}
 	fn seal_address() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 240_000 picoseconds.
-		Weight::from_parts(249_000, 0)
+		// Minimum execution time: 229_000 picoseconds.
+		Weight::from_parts(246_000, 0)
 	}
 	fn seal_weight_left() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 599_000 picoseconds.
-		Weight::from_parts(645_000, 0)
+		// Minimum execution time: 590_000 picoseconds.
+		Weight::from_parts(633_000, 0)
 	}
 	fn seal_ref_time_left() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 208_000 picoseconds.
-		Weight::from_parts(244_000, 0)
+		// Minimum execution time: 237_000 picoseconds.
+		Weight::from_parts(258_000, 0)
 	}
 	fn seal_balance() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `102`
 		//  Estimated: `0`
-		// Minimum execution time: 4_534_000 picoseconds.
-		Weight::from_parts(4_689_000, 0)
+		// Minimum execution time: 4_622_000 picoseconds.
+		Weight::from_parts(4_738_000, 0)
 	}
 	/// Storage: `Revive::AddressSuffix` (r:1 w:0)
 	/// Proof: `Revive::AddressSuffix` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `Measured`)
@@ -466,8 +498,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `160`
 		//  Estimated: `3625`
-		// Minimum execution time: 8_640_000 picoseconds.
-		Weight::from_parts(8_971_000, 3625)
+		// Minimum execution time: 8_552_000 picoseconds.
+		Weight::from_parts(8_860_000, 3625)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 	}
 	/// Storage: `Revive::ImmutableDataOf` (r:1 w:0)
@@ -477,10 +509,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `134 + n * (1 ±0)`
 		//  Estimated: `3599 + n * (1 ±0)`
-		// Minimum execution time: 4_875_000 picoseconds.
-		Weight::from_parts(6_212_863, 3599)
+		// Minimum execution time: 4_823_000 picoseconds.
+		Weight::from_parts(6_177_102, 3599)
 			// Standard Error: 7
-			.saturating_add(Weight::from_parts(671, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(522, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -491,67 +523,67 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_678_000 picoseconds.
-		Weight::from_parts(1_883_150, 0)
+		// Minimum execution time: 1_700_000 picoseconds.
+		Weight::from_parts(1_900_108, 0)
 			// Standard Error: 2
-			.saturating_add(Weight::from_parts(579, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(527, 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: 238_000 picoseconds.
-		Weight::from_parts(273_000, 0)
+		// Minimum execution time: 244_000 picoseconds.
+		Weight::from_parts(264_000, 0)
 	}
 	fn seal_minimum_balance() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 244_000 picoseconds.
-		Weight::from_parts(260_000, 0)
+		// Minimum execution time: 218_000 picoseconds.
+		Weight::from_parts(250_000, 0)
 	}
 	fn seal_return_data_size() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 249_000 picoseconds.
-		Weight::from_parts(265_000, 0)
+		// Minimum execution time: 211_000 picoseconds.
+		Weight::from_parts(253_000, 0)
 	}
 	fn seal_call_data_size() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 243_000 picoseconds.
-		Weight::from_parts(269_000, 0)
+		// Minimum execution time: 197_000 picoseconds.
+		Weight::from_parts(237_000, 0)
 	}
 	fn seal_gas_limit() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 228_000 picoseconds.
-		Weight::from_parts(268_000, 0)
+		// Minimum execution time: 262_000 picoseconds.
+		Weight::from_parts(273_000, 0)
 	}
 	fn seal_gas_price() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 222_000 picoseconds.
-		Weight::from_parts(251_000, 0)
+		// Minimum execution time: 200_000 picoseconds.
+		Weight::from_parts(245_000, 0)
 	}
 	fn seal_base_fee() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 226_000 picoseconds.
+		// Minimum execution time: 215_000 picoseconds.
 		Weight::from_parts(250_000, 0)
 	}
 	fn seal_block_number() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 228_000 picoseconds.
-		Weight::from_parts(270_000, 0)
+		// Minimum execution time: 243_000 picoseconds.
+		Weight::from_parts(260_000, 0)
 	}
 	/// Storage: `Session::Validators` (r:1 w:0)
 	/// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
@@ -559,8 +591,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `1485`
-		// Minimum execution time: 13_597_000 picoseconds.
-		Weight::from_parts(13_770_000, 1485)
+		// Minimum execution time: 13_573_000 picoseconds.
+		Weight::from_parts(13_953_000, 1485)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	/// Storage: `System::BlockHash` (r:1 w:0)
@@ -569,60 +601,60 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3465`
-		// Minimum execution time: 2_199_000 picoseconds.
-		Weight::from_parts(2_402_000, 3465)
+		// Minimum execution time: 2_210_000 picoseconds.
+		Weight::from_parts(2_384_000, 3465)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	fn seal_now() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 230_000 picoseconds.
-		Weight::from_parts(256_000, 0)
+		// Minimum execution time: 216_000 picoseconds.
+		Weight::from_parts(253_000, 0)
 	}
 	fn seal_weight_to_fee() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_214_000 picoseconds.
-		Weight::from_parts(1_283_000, 0)
+		// Minimum execution time: 1_166_000 picoseconds.
+		Weight::from_parts(1_294_000, 0)
 	}
 	/// The range of component `n` is `[0, 262140]`.
 	fn seal_copy_to_contract(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 376_000 picoseconds.
-		Weight::from_parts(569_136, 0)
+		// Minimum execution time: 377_000 picoseconds.
+		Weight::from_parts(521_343, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(236, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(201, 0).saturating_mul(n.into()))
 	}
 	fn seal_call_data_load() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 243_000 picoseconds.
-		Weight::from_parts(260_000, 0)
+		// Minimum execution time: 235_000 picoseconds.
+		Weight::from_parts(250_000, 0)
 	}
 	/// The range of component `n` is `[0, 262144]`.
 	fn seal_call_data_copy(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 231_000 picoseconds.
-		Weight::from_parts(379_088, 0)
+		// Minimum execution time: 202_000 picoseconds.
+		Weight::from_parts(195_833, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(148, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(113, 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: 227_000 picoseconds.
-		Weight::from_parts(400_572, 0)
+		// Minimum execution time: 229_000 picoseconds.
+		Weight::from_parts(500_671, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(237, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(199, 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`)
@@ -638,8 +670,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `215`
 		//  Estimated: `3680`
-		// Minimum execution time: 14_216_000 picoseconds.
-		Weight::from_parts(14_533_000, 3680)
+		// Minimum execution time: 14_217_000 picoseconds.
+		Weight::from_parts(14_778_000, 3680)
 			.saturating_add(T::DbWeight::get().reads(3_u64))
 			.saturating_add(T::DbWeight::get().writes(4_u64))
 	}
@@ -649,12 +681,12 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_877_000 picoseconds.
-		Weight::from_parts(3_856_832, 0)
-			// Standard Error: 2_622
-			.saturating_add(Weight::from_parts(201_206, 0).saturating_mul(t.into()))
-			// Standard Error: 28
-			.saturating_add(Weight::from_parts(1_128, 0).saturating_mul(n.into()))
+		// Minimum execution time: 3_733_000 picoseconds.
+		Weight::from_parts(3_684_334, 0)
+			// Standard Error: 2_341
+			.saturating_add(Weight::from_parts(198_319, 0).saturating_mul(t.into()))
+			// Standard Error: 25
+			.saturating_add(Weight::from_parts(939, 0).saturating_mul(n.into()))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
 	/// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`)
@@ -662,8 +694,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `552`
 		//  Estimated: `552`
-		// Minimum execution time: 5_806_000 picoseconds.
-		Weight::from_parts(6_037_000, 552)
+		// Minimum execution time: 5_787_000 picoseconds.
+		Weight::from_parts(5_937_000, 552)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -672,8 +704,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `10562`
 		//  Estimated: `10562`
-		// Minimum execution time: 39_517_000 picoseconds.
-		Weight::from_parts(40_698_000, 10562)
+		// Minimum execution time: 38_632_000 picoseconds.
+		Weight::from_parts(40_015_000, 10562)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -682,8 +714,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `552`
 		//  Estimated: `552`
-		// Minimum execution time: 6_747_000 picoseconds.
-		Weight::from_parts(7_003_000, 552)
+		// Minimum execution time: 6_669_000 picoseconds.
+		Weight::from_parts(6_890_000, 552)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -693,8 +725,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `10562`
 		//  Estimated: `10562`
-		// Minimum execution time: 40_158_000 picoseconds.
-		Weight::from_parts(41_394_000, 10562)
+		// Minimum execution time: 40_347_000 picoseconds.
+		Weight::from_parts(41_382_000, 10562)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -706,12 +738,12 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `152 + o * (1 ±0)`
 		//  Estimated: `151 + o * (1 ±0)`
-		// Minimum execution time: 6_360_000 picoseconds.
-		Weight::from_parts(7_335_152, 151)
-			// Standard Error: 80
-			.saturating_add(Weight::from_parts(716, 0).saturating_mul(n.into()))
-			// Standard Error: 80
-			.saturating_add(Weight::from_parts(1_127, 0).saturating_mul(o.into()))
+		// Minimum execution time: 6_380_000 picoseconds.
+		Weight::from_parts(7_382_453, 151)
+			// Standard Error: 75
+			.saturating_add(Weight::from_parts(447, 0).saturating_mul(n.into()))
+			// Standard Error: 75
+			.saturating_add(Weight::from_parts(1_308, 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()))
@@ -723,10 +755,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `152 + n * (1 ±0)`
 		//  Estimated: `151 + n * (1 ±0)`
-		// Minimum execution time: 5_980_000 picoseconds.
-		Weight::from_parts(7_164_266, 151)
-			// Standard Error: 130
-			.saturating_add(Weight::from_parts(1_893, 0).saturating_mul(n.into()))
+		// Minimum execution time: 6_054_000 picoseconds.
+		Weight::from_parts(7_366_811, 151)
+			// Standard Error: 152
+			.saturating_add(Weight::from_parts(1_752, 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()))
@@ -738,10 +770,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `152 + n * (1 ±0)`
 		//  Estimated: `151 + n * (1 ±0)`
-		// Minimum execution time: 5_823_000 picoseconds.
-		Weight::from_parts(7_045_557, 151)
-			// Standard Error: 123
-			.saturating_add(Weight::from_parts(2_222, 0).saturating_mul(n.into()))
+		// Minimum execution time: 5_698_000 picoseconds.
+		Weight::from_parts(7_111_906, 151)
+			// Standard Error: 130
+			.saturating_add(Weight::from_parts(2_353, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -752,10 +784,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `152 + n * (1 ±0)`
 		//  Estimated: `151 + n * (1 ±0)`
-		// Minimum execution time: 5_349_000 picoseconds.
-		Weight::from_parts(6_506_216, 151)
-			// Standard Error: 127
-			.saturating_add(Weight::from_parts(1_605, 0).saturating_mul(n.into()))
+		// Minimum execution time: 5_343_000 picoseconds.
+		Weight::from_parts(6_656_245, 151)
+			// Standard Error: 122
+			.saturating_add(Weight::from_parts(1_423, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -766,10 +798,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `152 + n * (1 ±0)`
 		//  Estimated: `151 + n * (1 ±0)`
-		// Minimum execution time: 6_151_000 picoseconds.
-		Weight::from_parts(7_812_180, 151)
-			// Standard Error: 159
-			.saturating_add(Weight::from_parts(2_277, 0).saturating_mul(n.into()))
+		// Minimum execution time: 6_398_000 picoseconds.
+		Weight::from_parts(7_807_591, 151)
+			// Standard Error: 140
+			.saturating_add(Weight::from_parts(2_397, 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()))
@@ -778,36 +810,36 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_344_000 picoseconds.
-		Weight::from_parts(1_462_000, 0)
+		// Minimum execution time: 1_357_000 picoseconds.
+		Weight::from_parts(1_421_000, 0)
 	}
 	fn set_transient_storage_full() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_680_000 picoseconds.
-		Weight::from_parts(1_785_000, 0)
+		// Minimum execution time: 1_738_000 picoseconds.
+		Weight::from_parts(1_859_000, 0)
 	}
 	fn get_transient_storage_empty() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_380_000 picoseconds.
-		Weight::from_parts(1_502_000, 0)
+		// Minimum execution time: 1_366_000 picoseconds.
+		Weight::from_parts(1_451_000, 0)
 	}
 	fn get_transient_storage_full() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_506_000 picoseconds.
-		Weight::from_parts(1_604_000, 0)
+		// Minimum execution time: 1_528_000 picoseconds.
+		Weight::from_parts(1_597_000, 0)
 	}
 	fn rollback_transient_storage() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 972_000 picoseconds.
-		Weight::from_parts(1_054_000, 0)
+		// Minimum execution time: 988_000 picoseconds.
+		Weight::from_parts(1_065_000, 0)
 	}
 	/// The range of component `n` is `[0, 416]`.
 	/// The range of component `o` is `[0, 416]`.
@@ -815,52 +847,52 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_048_000 picoseconds.
-		Weight::from_parts(2_304_120, 0)
-			// Standard Error: 17
-			.saturating_add(Weight::from_parts(254, 0).saturating_mul(n.into()))
-			// Standard Error: 17
-			.saturating_add(Weight::from_parts(321, 0).saturating_mul(o.into()))
+		// Minimum execution time: 2_089_000 picoseconds.
+		Weight::from_parts(2_254_604, 0)
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(300, 0).saturating_mul(n.into()))
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(299, 0).saturating_mul(o.into()))
 	}
 	/// The range of component `n` is `[0, 416]`.
 	fn seal_clear_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_790_000 picoseconds.
-		Weight::from_parts(2_141_874, 0)
-			// Standard Error: 31
-			.saturating_add(Weight::from_parts(378, 0).saturating_mul(n.into()))
+		// Minimum execution time: 1_830_000 picoseconds.
+		Weight::from_parts(2_116_394, 0)
+			// Standard Error: 17
+			.saturating_add(Weight::from_parts(339, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 416]`.
 	fn seal_get_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_662_000 picoseconds.
-		Weight::from_parts(1_938_172, 0)
-			// Standard Error: 14
-			.saturating_add(Weight::from_parts(316, 0).saturating_mul(n.into()))
+		// Minimum execution time: 1_739_000 picoseconds.
+		Weight::from_parts(1_905_386, 0)
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(321, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 416]`.
 	fn seal_contains_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_570_000 picoseconds.
-		Weight::from_parts(1_769_617, 0)
+		// Minimum execution time: 1_596_000 picoseconds.
+		Weight::from_parts(1_755_488, 0)
 			// Standard Error: 13
-			.saturating_add(Weight::from_parts(152, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(183, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 416]`.
 	fn seal_take_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_266_000 picoseconds.
-		Weight::from_parts(2_497_430, 0)
-			// Standard Error: 21
-			.saturating_add(Weight::from_parts(38, 0).saturating_mul(n.into()))
+		// Minimum execution time: 2_290_000 picoseconds.
+		Weight::from_parts(2_476_305, 0)
+			// Standard Error: 15
+			.saturating_add(Weight::from_parts(30, 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`)
@@ -878,10 +910,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `1163 + t * (206 ±0)`
 		//  Estimated: `4628 + t * (2417 ±0)`
-		// Minimum execution time: 30_368_000 picoseconds.
-		Weight::from_parts(31_023_429, 4628)
-			// Standard Error: 43_250
-			.saturating_add(Weight::from_parts(5_949_452, 0).saturating_mul(t.into()))
+		// Minimum execution time: 29_060_000 picoseconds.
+		Weight::from_parts(29_968_423, 4628)
+			// Standard Error: 33_731
+			.saturating_add(Weight::from_parts(6_570_214, 0).saturating_mul(t.into()))
 			// Standard Error: 0
 			.saturating_add(Weight::from_parts(2, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(4_u64))
@@ -899,8 +931,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `1108`
 		//  Estimated: `4573`
-		// Minimum execution time: 24_707_000 picoseconds.
-		Weight::from_parts(25_410_000, 4573)
+		// Minimum execution time: 23_974_000 picoseconds.
+		Weight::from_parts(24_501_000, 4573)
 			.saturating_add(T::DbWeight::get().reads(3_u64))
 	}
 	/// Storage: `Revive::CodeInfoOf` (r:1 w:1)
@@ -914,12 +946,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:  `1094`
-		//  Estimated: `4579`
-		// Minimum execution time: 107_232_000 picoseconds.
-		Weight::from_parts(94_844_854, 4579)
-			// Standard Error: 10
-			.saturating_add(Weight::from_parts(4_159, 0).saturating_mul(i.into()))
+		//  Measured:  `1093`
+		//  Estimated: `4569`
+		// Minimum execution time: 105_123_000 picoseconds.
+		Weight::from_parts(92_491_823, 4569)
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(4_068, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(4_u64))
 			.saturating_add(T::DbWeight::get().writes(3_u64))
 	}
@@ -928,64 +960,64 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 617_000 picoseconds.
-		Weight::from_parts(3_460_054, 0)
+		// Minimum execution time: 592_000 picoseconds.
+		Weight::from_parts(2_630_580, 0)
 			// Standard Error: 2
-			.saturating_add(Weight::from_parts(1_374, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(1_331, 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_040_000 picoseconds.
-		Weight::from_parts(3_026_644, 0)
-			// Standard Error: 2
-			.saturating_add(Weight::from_parts(3_607, 0).saturating_mul(n.into()))
+		// Minimum execution time: 1_046_000 picoseconds.
+		Weight::from_parts(3_027_925, 0)
+			// Standard Error: 3
+			.saturating_add(Weight::from_parts(3_551, 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: 633_000 picoseconds.
-		Weight::from_parts(3_375_104, 0)
-			// Standard Error: 2
-			.saturating_add(Weight::from_parts(1_494, 0).saturating_mul(n.into()))
+		// Minimum execution time: 600_000 picoseconds.
+		Weight::from_parts(3_041_920, 0)
+			// Standard Error: 3
+			.saturating_add(Weight::from_parts(1_457, 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: 601_000 picoseconds.
-		Weight::from_parts(3_802_060, 0)
-			// Standard Error: 2
-			.saturating_add(Weight::from_parts(1_493, 0).saturating_mul(n.into()))
+		// Minimum execution time: 611_000 picoseconds.
+		Weight::from_parts(3_545_939, 0)
+			// Standard Error: 3
+			.saturating_add(Weight::from_parts(1_444, 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: 42_419_000 picoseconds.
-		Weight::from_parts(26_760_986, 0)
-			// Standard Error: 12
-			.saturating_add(Weight::from_parts(5_421, 0).saturating_mul(n.into()))
+		// Minimum execution time: 41_720_000 picoseconds.
+		Weight::from_parts(28_703_157, 0)
+			// Standard Error: 11
+			.saturating_add(Weight::from_parts(5_264, 0).saturating_mul(n.into()))
 	}
 	fn seal_ecdsa_recover() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 48_672_000 picoseconds.
-		Weight::from_parts(49_840_000, 0)
+		// Minimum execution time: 46_815_000 picoseconds.
+		Weight::from_parts(47_603_000, 0)
 	}
 	fn seal_ecdsa_to_eth_address() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 12_307_000 picoseconds.
-		Weight::from_parts(12_500_000, 0)
+		// Minimum execution time: 12_477_000 picoseconds.
+		Weight::from_parts(12_598_000, 0)
 	}
 	/// Storage: `Revive::CodeInfoOf` (r:1 w:1)
 	/// Proof: `Revive::CodeInfoOf` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `Measured`)
@@ -993,8 +1025,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `196`
 		//  Estimated: `3661`
-		// Minimum execution time: 10_142_000 picoseconds.
-		Weight::from_parts(10_458_000, 3661)
+		// Minimum execution time: 9_829_000 picoseconds.
+		Weight::from_parts(10_206_000, 3661)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -1003,10 +1035,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 7_893_000 picoseconds.
-		Weight::from_parts(9_362_667, 0)
-			// Standard Error: 84
-			.saturating_add(Weight::from_parts(74_272, 0).saturating_mul(r.into()))
+		// Minimum execution time: 7_771_000 picoseconds.
+		Weight::from_parts(9_469_115, 0)
+			// Standard Error: 99
+			.saturating_add(Weight::from_parts(72_761, 0).saturating_mul(r.into()))
 	}
 }
 
@@ -1018,8 +1050,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `1485`
-		// Minimum execution time: 695_000 picoseconds.
-		Weight::from_parts(750_000, 1485)
+		// Minimum execution time: 657_000 picoseconds.
+		Weight::from_parts(703_000, 1485)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -1029,10 +1061,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `230 + k * (69 ±0)`
 		//  Estimated: `222 + k * (70 ±0)`
-		// Minimum execution time: 10_509_000 picoseconds.
-		Weight::from_parts(10_896_000, 222)
-			// Standard Error: 2_549
-			.saturating_add(Weight::from_parts(1_264_033, 0).saturating_mul(k.into()))
+		// Minimum execution time: 10_768_000 picoseconds.
+		Weight::from_parts(10_953_000, 222)
+			// Standard Error: 951
+			.saturating_add(Weight::from_parts(1_172_145, 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))
@@ -1051,13 +1083,40 @@ impl WeightInfo for () {
 	/// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`)
 	/// Storage: `System::Account` (r:1 w:1)
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`)
-	/// The range of component `c` is `[0, 262144]`.
-	fn call_with_code_per_byte(_c: u32, ) -> Weight {
+	/// The range of component `c` is `[0, 104857]`.
+	fn call_with_code_per_byte(c: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1194`
-		//  Estimated: `7134`
-		// Minimum execution time: 84_008_000 picoseconds.
-		Weight::from_parts(91_138_296, 7134)
+		//  Measured:  `524 + c * (1 ±0)`
+		//  Estimated: `6458 + c * (1 ±0)`
+		// Minimum execution time: 71_766_000 picoseconds.
+		Weight::from_parts(97_749_536, 6458)
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(1_777, 0).saturating_mul(c.into()))
+			.saturating_add(RocksDbWeight::get().reads(7_u64))
+			.saturating_add(RocksDbWeight::get().writes(2_u64))
+			.saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into()))
+	}
+	/// Storage: `Revive::AddressSuffix` (r:2 w:0)
+	/// Proof: `Revive::AddressSuffix` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `Measured`)
+	/// Storage: `Revive::ContractInfoOf` (r:1 w:1)
+	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(242), added: 2717, 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`)
+	/// Storage: `Timestamp::Now` (r:1 w:0)
+	/// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`)
+	/// The range of component `b` is `[0, 1]`.
+	fn basic_block_compilation(b: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `3892`
+		//  Estimated: `9832`
+		// Minimum execution time: 111_124_000 picoseconds.
+		Weight::from_parts(114_011_830, 9832)
+			// Standard Error: 218_655
+			.saturating_add(Weight::from_parts(475_869, 0).saturating_mul(b.into()))
 			.saturating_add(RocksDbWeight::get().reads(7_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -1075,16 +1134,18 @@ impl WeightInfo for () {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`)
 	/// Storage: `Revive::PristineCode` (r:0 w:1)
 	/// Proof: `Revive::PristineCode` (`max_values`: None, `max_size`: Some(262180), added: 264655, mode: `Measured`)
-	/// The range of component `c` is `[0, 262144]`.
+	/// The range of component `c` is `[0, 104857]`.
 	/// The range of component `i` is `[0, 262144]`.
-	fn instantiate_with_code(_c: u32, i: u32, ) -> Weight {
+	fn instantiate_with_code(c: u32, i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `93`
 		//  Estimated: `6033`
-		// Minimum execution time: 172_907_000 picoseconds.
-		Weight::from_parts(153_592_465, 6033)
-			// Standard Error: 12
-			.saturating_add(Weight::from_parts(4_544, 0).saturating_mul(i.into()))
+		// Minimum execution time: 1_482_086_000 picoseconds.
+		Weight::from_parts(107_627_972, 6033)
+			// Standard Error: 39
+			.saturating_add(Weight::from_parts(19_180, 0).saturating_mul(c.into()))
+			// Standard Error: 15
+			.saturating_add(Weight::from_parts(5_307, 0).saturating_mul(i.into()))
 			.saturating_add(RocksDbWeight::get().reads(7_u64))
 			.saturating_add(RocksDbWeight::get().writes(6_u64))
 	}
@@ -1107,10 +1168,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `987`
 		//  Estimated: `4452`
-		// Minimum execution time: 143_169_000 picoseconds.
-		Weight::from_parts(120_653_436, 4452)
-			// Standard Error: 16
-			.saturating_add(Weight::from_parts(4_444, 0).saturating_mul(i.into()))
+		// Minimum execution time: 139_661_000 picoseconds.
+		Weight::from_parts(75_448_171, 4452)
+			// Standard Error: 24
+			.saturating_add(Weight::from_parts(5_303, 0).saturating_mul(i.into()))
 			.saturating_add(RocksDbWeight::get().reads(7_u64))
 			.saturating_add(RocksDbWeight::get().writes(4_u64))
 	}
@@ -1130,8 +1191,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `1194`
 		//  Estimated: `7134`
-		// Minimum execution time: 138_392_000 picoseconds.
-		Weight::from_parts(143_329_000, 7134)
+		// Minimum execution time: 74_015_000 picoseconds.
+		Weight::from_parts(76_281_000, 7134)
 			.saturating_add(RocksDbWeight::get().reads(7_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -1141,13 +1202,15 @@ impl WeightInfo for () {
 	/// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(409), added: 2884, mode: `Measured`)
 	/// Storage: `Revive::PristineCode` (r:0 w:1)
 	/// Proof: `Revive::PristineCode` (`max_values`: None, `max_size`: Some(262180), added: 264655, mode: `Measured`)
-	/// The range of component `c` is `[0, 262144]`.
-	fn upload_code(_c: u32, ) -> Weight {
+	/// The range of component `c` is `[0, 104857]`.
+	fn upload_code(c: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3465`
-		// Minimum execution time: 43_420_000 picoseconds.
-		Weight::from_parts(45_143_767, 3465)
+		// Minimum execution time: 39_512_000 picoseconds.
+		Weight::from_parts(19_845_671, 3465)
+			// Standard Error: 20
+			.saturating_add(Weight::from_parts(14_190, 0).saturating_mul(c.into()))
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 			.saturating_add(RocksDbWeight::get().writes(3_u64))
 	}
@@ -1161,8 +1224,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `181`
 		//  Estimated: `3646`
-		// Minimum execution time: 35_828_000 picoseconds.
-		Weight::from_parts(36_853_000, 3646)
+		// Minimum execution time: 35_130_000 picoseconds.
+		Weight::from_parts(35_831_000, 3646)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 			.saturating_add(RocksDbWeight::get().writes(3_u64))
 	}
@@ -1174,8 +1237,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `424`
 		//  Estimated: `6364`
-		// Minimum execution time: 19_678_000 picoseconds.
-		Weight::from_parts(21_266_000, 6364)
+		// Minimum execution time: 19_092_000 picoseconds.
+		Weight::from_parts(19_813_000, 6364)
 			.saturating_add(RocksDbWeight::get().reads(3_u64))
 			.saturating_add(RocksDbWeight::get().writes(3_u64))
 	}
@@ -1187,8 +1250,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3465`
-		// Minimum execution time: 37_024_000 picoseconds.
-		Weight::from_parts(37_440_000, 3465)
+		// Minimum execution time: 35_711_000 picoseconds.
+		Weight::from_parts(36_640_000, 3465)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -1200,8 +1263,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `56`
 		//  Estimated: `3521`
-		// Minimum execution time: 31_228_000 picoseconds.
-		Weight::from_parts(32_183_000, 3521)
+		// Minimum execution time: 29_945_000 picoseconds.
+		Weight::from_parts(30_805_000, 3521)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -1213,8 +1276,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3465`
-		// Minimum execution time: 6_241_000 picoseconds.
-		Weight::from_parts(6_467_000, 3465)
+		// Minimum execution time: 6_070_000 picoseconds.
+		Weight::from_parts(6_521_000, 3465)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 	}
 	/// The range of component `r` is `[0, 1600]`.
@@ -1222,24 +1285,24 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 6_397_000 picoseconds.
-		Weight::from_parts(7_159_300, 0)
-			// Standard Error: 173
-			.saturating_add(Weight::from_parts(167_265, 0).saturating_mul(r.into()))
+		// Minimum execution time: 6_281_000 picoseconds.
+		Weight::from_parts(8_053_095, 0)
+			// Standard Error: 290
+			.saturating_add(Weight::from_parts(162_796, 0).saturating_mul(r.into()))
 	}
 	fn seal_caller() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 267_000 picoseconds.
-		Weight::from_parts(296_000, 0)
+		// Minimum execution time: 259_000 picoseconds.
+		Weight::from_parts(285_000, 0)
 	}
 	fn seal_origin() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 227_000 picoseconds.
-		Weight::from_parts(252_000, 0)
+		// Minimum execution time: 233_000 picoseconds.
+		Weight::from_parts(253_000, 0)
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
 	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(242), added: 2717, mode: `Measured`)
@@ -1247,8 +1310,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `202`
 		//  Estimated: `3667`
-		// Minimum execution time: 6_591_000 picoseconds.
-		Weight::from_parts(6_770_000, 3667)
+		// Minimum execution time: 6_459_000 picoseconds.
+		Weight::from_parts(6_695_000, 3667)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Revive::AddressSuffix` (r:1 w:0)
@@ -1257,8 +1320,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `144`
 		//  Estimated: `3609`
-		// Minimum execution time: 6_182_000 picoseconds.
-		Weight::from_parts(6_372_000, 3609)
+		// Minimum execution time: 6_068_000 picoseconds.
+		Weight::from_parts(6_312_000, 3609)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
@@ -1267,16 +1330,16 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `298`
 		//  Estimated: `3763`
-		// Minimum execution time: 7_327_000 picoseconds.
-		Weight::from_parts(7_612_000, 3763)
+		// Minimum execution time: 7_412_000 picoseconds.
+		Weight::from_parts(7_660_000, 3763)
 			.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: 232_000 picoseconds.
-		Weight::from_parts(287_000, 0)
+		// Minimum execution time: 266_000 picoseconds.
+		Weight::from_parts(282_000, 0)
 	}
 	/// Storage: `Revive::ContractInfoOf` (r:1 w:0)
 	/// Proof: `Revive::ContractInfoOf` (`max_values`: None, `max_size`: Some(242), added: 2717, mode: `Measured`)
@@ -1286,51 +1349,51 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `368`
 		//  Estimated: `3833`
-		// Minimum execution time: 10_918_000 picoseconds.
-		Weight::from_parts(11_323_000, 3833)
+		// Minimum execution time: 10_570_000 picoseconds.
+		Weight::from_parts(11_027_000, 3833)
 			.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: 310_000 picoseconds.
-		Weight::from_parts(340_000, 0)
+		// Minimum execution time: 263_000 picoseconds.
+		Weight::from_parts(315_000, 0)
 	}
 	fn seal_caller_is_root() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 257_000 picoseconds.
-		Weight::from_parts(292_000, 0)
+		// Minimum execution time: 239_000 picoseconds.
+		Weight::from_parts(278_000, 0)
 	}
 	fn seal_address() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 240_000 picoseconds.
-		Weight::from_parts(249_000, 0)
+		// Minimum execution time: 229_000 picoseconds.
+		Weight::from_parts(246_000, 0)
 	}
 	fn seal_weight_left() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 599_000 picoseconds.
-		Weight::from_parts(645_000, 0)
+		// Minimum execution time: 590_000 picoseconds.
+		Weight::from_parts(633_000, 0)
 	}
 	fn seal_ref_time_left() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 208_000 picoseconds.
-		Weight::from_parts(244_000, 0)
+		// Minimum execution time: 237_000 picoseconds.
+		Weight::from_parts(258_000, 0)
 	}
 	fn seal_balance() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `102`
 		//  Estimated: `0`
-		// Minimum execution time: 4_534_000 picoseconds.
-		Weight::from_parts(4_689_000, 0)
+		// Minimum execution time: 4_622_000 picoseconds.
+		Weight::from_parts(4_738_000, 0)
 	}
 	/// Storage: `Revive::AddressSuffix` (r:1 w:0)
 	/// Proof: `Revive::AddressSuffix` (`max_values`: None, `max_size`: Some(32), added: 2507, mode: `Measured`)
@@ -1340,8 +1403,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `160`
 		//  Estimated: `3625`
-		// Minimum execution time: 8_640_000 picoseconds.
-		Weight::from_parts(8_971_000, 3625)
+		// Minimum execution time: 8_552_000 picoseconds.
+		Weight::from_parts(8_860_000, 3625)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 	}
 	/// Storage: `Revive::ImmutableDataOf` (r:1 w:0)
@@ -1351,10 +1414,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `134 + n * (1 ±0)`
 		//  Estimated: `3599 + n * (1 ±0)`
-		// Minimum execution time: 4_875_000 picoseconds.
-		Weight::from_parts(6_212_863, 3599)
+		// Minimum execution time: 4_823_000 picoseconds.
+		Weight::from_parts(6_177_102, 3599)
 			// Standard Error: 7
-			.saturating_add(Weight::from_parts(671, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(522, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -1365,67 +1428,67 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_678_000 picoseconds.
-		Weight::from_parts(1_883_150, 0)
+		// Minimum execution time: 1_700_000 picoseconds.
+		Weight::from_parts(1_900_108, 0)
 			// Standard Error: 2
-			.saturating_add(Weight::from_parts(579, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(527, 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: 238_000 picoseconds.
-		Weight::from_parts(273_000, 0)
+		// Minimum execution time: 244_000 picoseconds.
+		Weight::from_parts(264_000, 0)
 	}
 	fn seal_minimum_balance() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 244_000 picoseconds.
-		Weight::from_parts(260_000, 0)
+		// Minimum execution time: 218_000 picoseconds.
+		Weight::from_parts(250_000, 0)
 	}
 	fn seal_return_data_size() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 249_000 picoseconds.
-		Weight::from_parts(265_000, 0)
+		// Minimum execution time: 211_000 picoseconds.
+		Weight::from_parts(253_000, 0)
 	}
 	fn seal_call_data_size() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 243_000 picoseconds.
-		Weight::from_parts(269_000, 0)
+		// Minimum execution time: 197_000 picoseconds.
+		Weight::from_parts(237_000, 0)
 	}
 	fn seal_gas_limit() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 228_000 picoseconds.
-		Weight::from_parts(268_000, 0)
+		// Minimum execution time: 262_000 picoseconds.
+		Weight::from_parts(273_000, 0)
 	}
 	fn seal_gas_price() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 222_000 picoseconds.
-		Weight::from_parts(251_000, 0)
+		// Minimum execution time: 200_000 picoseconds.
+		Weight::from_parts(245_000, 0)
 	}
 	fn seal_base_fee() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 226_000 picoseconds.
+		// Minimum execution time: 215_000 picoseconds.
 		Weight::from_parts(250_000, 0)
 	}
 	fn seal_block_number() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 228_000 picoseconds.
-		Weight::from_parts(270_000, 0)
+		// Minimum execution time: 243_000 picoseconds.
+		Weight::from_parts(260_000, 0)
 	}
 	/// Storage: `Session::Validators` (r:1 w:0)
 	/// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
@@ -1433,8 +1496,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `1485`
-		// Minimum execution time: 13_597_000 picoseconds.
-		Weight::from_parts(13_770_000, 1485)
+		// Minimum execution time: 13_573_000 picoseconds.
+		Weight::from_parts(13_953_000, 1485)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	/// Storage: `System::BlockHash` (r:1 w:0)
@@ -1443,60 +1506,60 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `3465`
-		// Minimum execution time: 2_199_000 picoseconds.
-		Weight::from_parts(2_402_000, 3465)
+		// Minimum execution time: 2_210_000 picoseconds.
+		Weight::from_parts(2_384_000, 3465)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	fn seal_now() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 230_000 picoseconds.
-		Weight::from_parts(256_000, 0)
+		// Minimum execution time: 216_000 picoseconds.
+		Weight::from_parts(253_000, 0)
 	}
 	fn seal_weight_to_fee() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_214_000 picoseconds.
-		Weight::from_parts(1_283_000, 0)
+		// Minimum execution time: 1_166_000 picoseconds.
+		Weight::from_parts(1_294_000, 0)
 	}
 	/// The range of component `n` is `[0, 262140]`.
 	fn seal_copy_to_contract(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 376_000 picoseconds.
-		Weight::from_parts(569_136, 0)
+		// Minimum execution time: 377_000 picoseconds.
+		Weight::from_parts(521_343, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(236, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(201, 0).saturating_mul(n.into()))
 	}
 	fn seal_call_data_load() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 243_000 picoseconds.
-		Weight::from_parts(260_000, 0)
+		// Minimum execution time: 235_000 picoseconds.
+		Weight::from_parts(250_000, 0)
 	}
 	/// The range of component `n` is `[0, 262144]`.
 	fn seal_call_data_copy(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 231_000 picoseconds.
-		Weight::from_parts(379_088, 0)
+		// Minimum execution time: 202_000 picoseconds.
+		Weight::from_parts(195_833, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(148, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(113, 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: 227_000 picoseconds.
-		Weight::from_parts(400_572, 0)
+		// Minimum execution time: 229_000 picoseconds.
+		Weight::from_parts(500_671, 0)
 			// Standard Error: 0
-			.saturating_add(Weight::from_parts(237, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(199, 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`)
@@ -1512,8 +1575,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `215`
 		//  Estimated: `3680`
-		// Minimum execution time: 14_216_000 picoseconds.
-		Weight::from_parts(14_533_000, 3680)
+		// Minimum execution time: 14_217_000 picoseconds.
+		Weight::from_parts(14_778_000, 3680)
 			.saturating_add(RocksDbWeight::get().reads(3_u64))
 			.saturating_add(RocksDbWeight::get().writes(4_u64))
 	}
@@ -1523,12 +1586,12 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_877_000 picoseconds.
-		Weight::from_parts(3_856_832, 0)
-			// Standard Error: 2_622
-			.saturating_add(Weight::from_parts(201_206, 0).saturating_mul(t.into()))
-			// Standard Error: 28
-			.saturating_add(Weight::from_parts(1_128, 0).saturating_mul(n.into()))
+		// Minimum execution time: 3_733_000 picoseconds.
+		Weight::from_parts(3_684_334, 0)
+			// Standard Error: 2_341
+			.saturating_add(Weight::from_parts(198_319, 0).saturating_mul(t.into()))
+			// Standard Error: 25
+			.saturating_add(Weight::from_parts(939, 0).saturating_mul(n.into()))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
 	/// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`)
@@ -1536,8 +1599,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `552`
 		//  Estimated: `552`
-		// Minimum execution time: 5_806_000 picoseconds.
-		Weight::from_parts(6_037_000, 552)
+		// Minimum execution time: 5_787_000 picoseconds.
+		Weight::from_parts(5_937_000, 552)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -1546,8 +1609,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `10562`
 		//  Estimated: `10562`
-		// Minimum execution time: 39_517_000 picoseconds.
-		Weight::from_parts(40_698_000, 10562)
+		// Minimum execution time: 38_632_000 picoseconds.
+		Weight::from_parts(40_015_000, 10562)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 	}
 	/// Storage: `Skipped::Metadata` (r:0 w:0)
@@ -1556,8 +1619,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `552`
 		//  Estimated: `552`
-		// Minimum execution time: 6_747_000 picoseconds.
-		Weight::from_parts(7_003_000, 552)
+		// Minimum execution time: 6_669_000 picoseconds.
+		Weight::from_parts(6_890_000, 552)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -1567,8 +1630,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `10562`
 		//  Estimated: `10562`
-		// Minimum execution time: 40_158_000 picoseconds.
-		Weight::from_parts(41_394_000, 10562)
+		// Minimum execution time: 40_347_000 picoseconds.
+		Weight::from_parts(41_382_000, 10562)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -1580,12 +1643,12 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `152 + o * (1 ±0)`
 		//  Estimated: `151 + o * (1 ±0)`
-		// Minimum execution time: 6_360_000 picoseconds.
-		Weight::from_parts(7_335_152, 151)
-			// Standard Error: 80
-			.saturating_add(Weight::from_parts(716, 0).saturating_mul(n.into()))
-			// Standard Error: 80
-			.saturating_add(Weight::from_parts(1_127, 0).saturating_mul(o.into()))
+		// Minimum execution time: 6_380_000 picoseconds.
+		Weight::from_parts(7_382_453, 151)
+			// Standard Error: 75
+			.saturating_add(Weight::from_parts(447, 0).saturating_mul(n.into()))
+			// Standard Error: 75
+			.saturating_add(Weight::from_parts(1_308, 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()))
@@ -1597,10 +1660,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `152 + n * (1 ±0)`
 		//  Estimated: `151 + n * (1 ±0)`
-		// Minimum execution time: 5_980_000 picoseconds.
-		Weight::from_parts(7_164_266, 151)
-			// Standard Error: 130
-			.saturating_add(Weight::from_parts(1_893, 0).saturating_mul(n.into()))
+		// Minimum execution time: 6_054_000 picoseconds.
+		Weight::from_parts(7_366_811, 151)
+			// Standard Error: 152
+			.saturating_add(Weight::from_parts(1_752, 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()))
@@ -1612,10 +1675,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `152 + n * (1 ±0)`
 		//  Estimated: `151 + n * (1 ±0)`
-		// Minimum execution time: 5_823_000 picoseconds.
-		Weight::from_parts(7_045_557, 151)
-			// Standard Error: 123
-			.saturating_add(Weight::from_parts(2_222, 0).saturating_mul(n.into()))
+		// Minimum execution time: 5_698_000 picoseconds.
+		Weight::from_parts(7_111_906, 151)
+			// Standard Error: 130
+			.saturating_add(Weight::from_parts(2_353, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -1626,10 +1689,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `152 + n * (1 ±0)`
 		//  Estimated: `151 + n * (1 ±0)`
-		// Minimum execution time: 5_349_000 picoseconds.
-		Weight::from_parts(6_506_216, 151)
-			// Standard Error: 127
-			.saturating_add(Weight::from_parts(1_605, 0).saturating_mul(n.into()))
+		// Minimum execution time: 5_343_000 picoseconds.
+		Weight::from_parts(6_656_245, 151)
+			// Standard Error: 122
+			.saturating_add(Weight::from_parts(1_423, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into()))
 	}
@@ -1640,10 +1703,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `152 + n * (1 ±0)`
 		//  Estimated: `151 + n * (1 ±0)`
-		// Minimum execution time: 6_151_000 picoseconds.
-		Weight::from_parts(7_812_180, 151)
-			// Standard Error: 159
-			.saturating_add(Weight::from_parts(2_277, 0).saturating_mul(n.into()))
+		// Minimum execution time: 6_398_000 picoseconds.
+		Weight::from_parts(7_807_591, 151)
+			// Standard Error: 140
+			.saturating_add(Weight::from_parts(2_397, 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()))
@@ -1652,36 +1715,36 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_344_000 picoseconds.
-		Weight::from_parts(1_462_000, 0)
+		// Minimum execution time: 1_357_000 picoseconds.
+		Weight::from_parts(1_421_000, 0)
 	}
 	fn set_transient_storage_full() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_680_000 picoseconds.
-		Weight::from_parts(1_785_000, 0)
+		// Minimum execution time: 1_738_000 picoseconds.
+		Weight::from_parts(1_859_000, 0)
 	}
 	fn get_transient_storage_empty() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_380_000 picoseconds.
-		Weight::from_parts(1_502_000, 0)
+		// Minimum execution time: 1_366_000 picoseconds.
+		Weight::from_parts(1_451_000, 0)
 	}
 	fn get_transient_storage_full() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_506_000 picoseconds.
-		Weight::from_parts(1_604_000, 0)
+		// Minimum execution time: 1_528_000 picoseconds.
+		Weight::from_parts(1_597_000, 0)
 	}
 	fn rollback_transient_storage() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 972_000 picoseconds.
-		Weight::from_parts(1_054_000, 0)
+		// Minimum execution time: 988_000 picoseconds.
+		Weight::from_parts(1_065_000, 0)
 	}
 	/// The range of component `n` is `[0, 416]`.
 	/// The range of component `o` is `[0, 416]`.
@@ -1689,52 +1752,52 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_048_000 picoseconds.
-		Weight::from_parts(2_304_120, 0)
-			// Standard Error: 17
-			.saturating_add(Weight::from_parts(254, 0).saturating_mul(n.into()))
-			// Standard Error: 17
-			.saturating_add(Weight::from_parts(321, 0).saturating_mul(o.into()))
+		// Minimum execution time: 2_089_000 picoseconds.
+		Weight::from_parts(2_254_604, 0)
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(300, 0).saturating_mul(n.into()))
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(299, 0).saturating_mul(o.into()))
 	}
 	/// The range of component `n` is `[0, 416]`.
 	fn seal_clear_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_790_000 picoseconds.
-		Weight::from_parts(2_141_874, 0)
-			// Standard Error: 31
-			.saturating_add(Weight::from_parts(378, 0).saturating_mul(n.into()))
+		// Minimum execution time: 1_830_000 picoseconds.
+		Weight::from_parts(2_116_394, 0)
+			// Standard Error: 17
+			.saturating_add(Weight::from_parts(339, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 416]`.
 	fn seal_get_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_662_000 picoseconds.
-		Weight::from_parts(1_938_172, 0)
-			// Standard Error: 14
-			.saturating_add(Weight::from_parts(316, 0).saturating_mul(n.into()))
+		// Minimum execution time: 1_739_000 picoseconds.
+		Weight::from_parts(1_905_386, 0)
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(321, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 416]`.
 	fn seal_contains_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_570_000 picoseconds.
-		Weight::from_parts(1_769_617, 0)
+		// Minimum execution time: 1_596_000 picoseconds.
+		Weight::from_parts(1_755_488, 0)
 			// Standard Error: 13
-			.saturating_add(Weight::from_parts(152, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(183, 0).saturating_mul(n.into()))
 	}
 	/// The range of component `n` is `[0, 416]`.
 	fn seal_take_transient_storage(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_266_000 picoseconds.
-		Weight::from_parts(2_497_430, 0)
-			// Standard Error: 21
-			.saturating_add(Weight::from_parts(38, 0).saturating_mul(n.into()))
+		// Minimum execution time: 2_290_000 picoseconds.
+		Weight::from_parts(2_476_305, 0)
+			// Standard Error: 15
+			.saturating_add(Weight::from_parts(30, 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`)
@@ -1752,10 +1815,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `1163 + t * (206 ±0)`
 		//  Estimated: `4628 + t * (2417 ±0)`
-		// Minimum execution time: 30_368_000 picoseconds.
-		Weight::from_parts(31_023_429, 4628)
-			// Standard Error: 43_250
-			.saturating_add(Weight::from_parts(5_949_452, 0).saturating_mul(t.into()))
+		// Minimum execution time: 29_060_000 picoseconds.
+		Weight::from_parts(29_968_423, 4628)
+			// Standard Error: 33_731
+			.saturating_add(Weight::from_parts(6_570_214, 0).saturating_mul(t.into()))
 			// Standard Error: 0
 			.saturating_add(Weight::from_parts(2, 0).saturating_mul(i.into()))
 			.saturating_add(RocksDbWeight::get().reads(4_u64))
@@ -1773,8 +1836,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `1108`
 		//  Estimated: `4573`
-		// Minimum execution time: 24_707_000 picoseconds.
-		Weight::from_parts(25_410_000, 4573)
+		// Minimum execution time: 23_974_000 picoseconds.
+		Weight::from_parts(24_501_000, 4573)
 			.saturating_add(RocksDbWeight::get().reads(3_u64))
 	}
 	/// Storage: `Revive::CodeInfoOf` (r:1 w:1)
@@ -1788,12 +1851,12 @@ impl WeightInfo for () {
 	/// The range of component `i` is `[0, 262144]`.
 	fn seal_instantiate(i: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `1094`
-		//  Estimated: `4579`
-		// Minimum execution time: 107_232_000 picoseconds.
-		Weight::from_parts(94_844_854, 4579)
-			// Standard Error: 10
-			.saturating_add(Weight::from_parts(4_159, 0).saturating_mul(i.into()))
+		//  Measured:  `1093`
+		//  Estimated: `4569`
+		// Minimum execution time: 105_123_000 picoseconds.
+		Weight::from_parts(92_491_823, 4569)
+			// Standard Error: 12
+			.saturating_add(Weight::from_parts(4_068, 0).saturating_mul(i.into()))
 			.saturating_add(RocksDbWeight::get().reads(4_u64))
 			.saturating_add(RocksDbWeight::get().writes(3_u64))
 	}
@@ -1802,64 +1865,64 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 617_000 picoseconds.
-		Weight::from_parts(3_460_054, 0)
+		// Minimum execution time: 592_000 picoseconds.
+		Weight::from_parts(2_630_580, 0)
 			// Standard Error: 2
-			.saturating_add(Weight::from_parts(1_374, 0).saturating_mul(n.into()))
+			.saturating_add(Weight::from_parts(1_331, 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_040_000 picoseconds.
-		Weight::from_parts(3_026_644, 0)
-			// Standard Error: 2
-			.saturating_add(Weight::from_parts(3_607, 0).saturating_mul(n.into()))
+		// Minimum execution time: 1_046_000 picoseconds.
+		Weight::from_parts(3_027_925, 0)
+			// Standard Error: 3
+			.saturating_add(Weight::from_parts(3_551, 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: 633_000 picoseconds.
-		Weight::from_parts(3_375_104, 0)
-			// Standard Error: 2
-			.saturating_add(Weight::from_parts(1_494, 0).saturating_mul(n.into()))
+		// Minimum execution time: 600_000 picoseconds.
+		Weight::from_parts(3_041_920, 0)
+			// Standard Error: 3
+			.saturating_add(Weight::from_parts(1_457, 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: 601_000 picoseconds.
-		Weight::from_parts(3_802_060, 0)
-			// Standard Error: 2
-			.saturating_add(Weight::from_parts(1_493, 0).saturating_mul(n.into()))
+		// Minimum execution time: 611_000 picoseconds.
+		Weight::from_parts(3_545_939, 0)
+			// Standard Error: 3
+			.saturating_add(Weight::from_parts(1_444, 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: 42_419_000 picoseconds.
-		Weight::from_parts(26_760_986, 0)
-			// Standard Error: 12
-			.saturating_add(Weight::from_parts(5_421, 0).saturating_mul(n.into()))
+		// Minimum execution time: 41_720_000 picoseconds.
+		Weight::from_parts(28_703_157, 0)
+			// Standard Error: 11
+			.saturating_add(Weight::from_parts(5_264, 0).saturating_mul(n.into()))
 	}
 	fn seal_ecdsa_recover() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 48_672_000 picoseconds.
-		Weight::from_parts(49_840_000, 0)
+		// Minimum execution time: 46_815_000 picoseconds.
+		Weight::from_parts(47_603_000, 0)
 	}
 	fn seal_ecdsa_to_eth_address() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 12_307_000 picoseconds.
-		Weight::from_parts(12_500_000, 0)
+		// Minimum execution time: 12_477_000 picoseconds.
+		Weight::from_parts(12_598_000, 0)
 	}
 	/// Storage: `Revive::CodeInfoOf` (r:1 w:1)
 	/// Proof: `Revive::CodeInfoOf` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `Measured`)
@@ -1867,8 +1930,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `196`
 		//  Estimated: `3661`
-		// Minimum execution time: 10_142_000 picoseconds.
-		Weight::from_parts(10_458_000, 3661)
+		// Minimum execution time: 9_829_000 picoseconds.
+		Weight::from_parts(10_206_000, 3661)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -1877,9 +1940,9 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 7_893_000 picoseconds.
-		Weight::from_parts(9_362_667, 0)
-			// Standard Error: 84
-			.saturating_add(Weight::from_parts(74_272, 0).saturating_mul(r.into()))
+		// Minimum execution time: 7_771_000 picoseconds.
+		Weight::from_parts(9_469_115, 0)
+			// Standard Error: 99
+			.saturating_add(Weight::from_parts(72_761, 0).saturating_mul(r.into()))
 	}
 }
diff --git a/substrate/frame/revive/uapi/Cargo.toml b/substrate/frame/revive/uapi/Cargo.toml
index cf006941cfd..33a2506d5fe 100644
--- a/substrate/frame/revive/uapi/Cargo.toml
+++ b/substrate/frame/revive/uapi/Cargo.toml
@@ -22,7 +22,7 @@ paste = { workspace = true }
 scale-info = { features = ["derive"], optional = true, workspace = true }
 
 [target.'cfg(target_arch = "riscv64")'.dependencies]
-polkavm-derive = { version = "0.19.0" }
+polkavm-derive = { version = "0.21.0" }
 
 [package.metadata.docs.rs]
 features = ["unstable-hostfn"]
-- 
GitLab