From 90234543f3039ce29bf0c9badfc6ec2037308eea Mon Sep 17 00:00:00 2001
From: Tsvetomir Dimitrov <tsvetomir@parity.io>
Date: Tue, 26 Mar 2024 17:54:24 +0200
Subject: [PATCH] Migrate parachain swaps to Coretime (#3714)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This PR notifies broker pallet for any parachain slot swaps performed on
the relay chain. This is achieved by registering an `OnSwap` for the the
`coretime` pallet. The hook sends XCM message to the broker chain and
invokes a new extrinsic `swap_leases` which updates `Leases` storage
item (which keeps the legacy parachain leases).

I made two assumptions in this PR:
1.
[`Leases`](https://github.com/paritytech/polkadot-sdk/blob/4987d7982461e2e5ffe219cdf71ec697284cea7c/substrate/frame/broker/src/lib.rs#L120)
in `broker` pallet and
[`Leases`](https://github.com/paritytech/polkadot-sdk/blob/4987d7982461e2e5ffe219cdf71ec697284cea7c/polkadot/runtime/common/src/slots/mod.rs#L118)
in `slots` pallet are in sync.
2. `swap_leases` extrinsic from `broker` pallet can be triggered only by
root or by the XCM message from the relay chain. If not - the extrinsic
will generate an error and do nothing.

As a side effect from the changes `OnSwap` trait is moved from
runtime/common/traits.rs to runtime/parachains. Otherwise it is not
accessible from `broker` pallet.

Closes https://github.com/paritytech/polkadot-sdk/issues/3552

TODOs:

- [x] Weights
- [x] Tests

---------

Co-authored-by: command-bot <>
Co-authored-by: eskimor <eskimor@users.noreply.github.com>
Co-authored-by: Bastian Köcher <git@kchr.de>
---
 .../src/weights/pallet_broker.rs              | 158 ++++----
 .../src/weights/pallet_broker.rs              | 160 ++++----
 .../runtime/parachains/src/coretime/mod.rs    |  20 +
 polkadot/runtime/rococo/src/lib.rs            |  12 +-
 polkadot/runtime/westend/src/lib.rs           |  12 +-
 prdoc/pr_3714.prdoc                           |  10 +
 substrate/frame/broker/src/benchmarking.rs    |  17 +
 .../frame/broker/src/dispatchable_impls.rs    |  18 +
 substrate/frame/broker/src/lib.rs             |   8 +
 substrate/frame/broker/src/weights.rs         | 368 ++++++++++--------
 10 files changed, 461 insertions(+), 322 deletions(-)
 create mode 100644 prdoc/pr_3714.prdoc

diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs
index 2d30ddc612c..89b1c4c8663 100644
--- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs
+++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs
@@ -16,26 +16,24 @@
 
 //! Autogenerated weights for `pallet_broker`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
+//! DATE: 2024-03-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
-//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
+//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024
 
 // Executed Command:
-// ./target/production/polkadot-parachain
+// target/production/polkadot-parachain
 // benchmark
 // pallet
-// --chain=coretime-rococo-dev
-// --wasm-execution=compiled
-// --pallet=pallet_broker
-// --no-storage-info
-// --no-median-slopes
-// --no-min-squares
-// --extrinsic=*
 // --steps=50
 // --repeat=20
-// --json
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json
+// --pallet=pallet_broker
+// --chain=coretime-rococo-dev
 // --header=./cumulus/file_header.txt
 // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/
 
@@ -56,8 +54,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_462_000 picoseconds.
-		Weight::from_parts(2_552_000, 0)
+		// Minimum execution time: 1_918_000 picoseconds.
+		Weight::from_parts(2_092_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -67,8 +65,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `10888`
 		//  Estimated: `13506`
-		// Minimum execution time: 25_494_000 picoseconds.
-		Weight::from_parts(26_063_000, 0)
+		// Minimum execution time: 21_943_000 picoseconds.
+		Weight::from_parts(22_570_000, 0)
 			.saturating_add(Weight::from_parts(0, 13506))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -79,8 +77,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `12090`
 		//  Estimated: `13506`
-		// Minimum execution time: 22_299_000 picoseconds.
-		Weight::from_parts(22_911_000, 0)
+		// Minimum execution time: 20_923_000 picoseconds.
+		Weight::from_parts(21_354_000, 0)
 			.saturating_add(Weight::from_parts(0, 13506))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -95,8 +93,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `466`
 		//  Estimated: `1951`
-		// Minimum execution time: 11_590_000 picoseconds.
-		Weight::from_parts(12_007_000, 0)
+		// Minimum execution time: 10_687_000 picoseconds.
+		Weight::from_parts(11_409_000, 0)
 			.saturating_add(Weight::from_parts(0, 1951))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -124,11 +122,11 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `12567`
 		//  Estimated: `14052`
-		// Minimum execution time: 120_928_000 picoseconds.
-		Weight::from_parts(124_947_252, 0)
+		// Minimum execution time: 111_288_000 picoseconds.
+		Weight::from_parts(117_804_282, 0)
 			.saturating_add(Weight::from_parts(0, 14052))
-			// Standard Error: 435
-			.saturating_add(Weight::from_parts(1_246, 0).saturating_mul(n.into()))
+			// Standard Error: 391
+			.saturating_add(Weight::from_parts(1_243, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(8))
 			.saturating_add(T::DbWeight::get().writes(66))
 	}
@@ -144,8 +142,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `316`
 		//  Estimated: `3593`
-		// Minimum execution time: 32_826_000 picoseconds.
-		Weight::from_parts(33_889_000, 0)
+		// Minimum execution time: 33_006_000 picoseconds.
+		Weight::from_parts(34_256_000, 0)
 			.saturating_add(Weight::from_parts(0, 3593))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -166,8 +164,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `434`
 		//  Estimated: `4698`
-		// Minimum execution time: 57_362_000 picoseconds.
-		Weight::from_parts(58_994_000, 0)
+		// Minimum execution time: 61_473_000 picoseconds.
+		Weight::from_parts(66_476_000, 0)
 			.saturating_add(Weight::from_parts(0, 4698))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(4))
@@ -178,8 +176,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `357`
 		//  Estimated: `3550`
-		// Minimum execution time: 13_982_000 picoseconds.
-		Weight::from_parts(14_447_000, 0)
+		// Minimum execution time: 13_771_000 picoseconds.
+		Weight::from_parts(14_374_000, 0)
 			.saturating_add(Weight::from_parts(0, 3550))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -190,8 +188,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `357`
 		//  Estimated: `3550`
-		// Minimum execution time: 15_070_000 picoseconds.
-		Weight::from_parts(15_735_000, 0)
+		// Minimum execution time: 15_162_000 picoseconds.
+		Weight::from_parts(15_742_000, 0)
 			.saturating_add(Weight::from_parts(0, 3550))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -202,8 +200,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `357`
 		//  Estimated: `3550`
-		// Minimum execution time: 16_527_000 picoseconds.
-		Weight::from_parts(16_894_000, 0)
+		// Minimum execution time: 16_196_000 picoseconds.
+		Weight::from_parts(16_796_000, 0)
 			.saturating_add(Weight::from_parts(0, 3550))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(3))
@@ -220,8 +218,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `936`
 		//  Estimated: `4681`
-		// Minimum execution time: 25_493_000 picoseconds.
-		Weight::from_parts(26_091_000, 0)
+		// Minimum execution time: 25_653_000 picoseconds.
+		Weight::from_parts(27_006_000, 0)
 			.saturating_add(Weight::from_parts(0, 4681))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -240,8 +238,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `1002`
 		//  Estimated: `5996`
-		// Minimum execution time: 31_498_000 picoseconds.
-		Weight::from_parts(32_560_000, 0)
+		// Minimum execution time: 31_114_000 picoseconds.
+		Weight::from_parts(32_235_000, 0)
 			.saturating_add(Weight::from_parts(0, 5996))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(5))
@@ -257,11 +255,11 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `652`
 		//  Estimated: `6196 + m * (2520 ±0)`
-		// Minimum execution time: 57_183_000 picoseconds.
-		Weight::from_parts(58_024_898, 0)
+		// Minimum execution time: 57_280_000 picoseconds.
+		Weight::from_parts(58_127_480, 0)
 			.saturating_add(Weight::from_parts(0, 6196))
-			// Standard Error: 35_831
-			.saturating_add(Weight::from_parts(1_384_446, 0).saturating_mul(m.into()))
+			// Standard Error: 41_670
+			.saturating_add(Weight::from_parts(1_203_066, 0).saturating_mul(m.into()))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into())))
 			.saturating_add(T::DbWeight::get().writes(5))
@@ -283,8 +281,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `215`
 		//  Estimated: `3680`
-		// Minimum execution time: 59_762_000 picoseconds.
-		Weight::from_parts(61_114_000, 0)
+		// Minimum execution time: 59_968_000 picoseconds.
+		Weight::from_parts(62_315_000, 0)
 			.saturating_add(Weight::from_parts(0, 3680))
 			.saturating_add(T::DbWeight::get().reads(6))
 			.saturating_add(T::DbWeight::get().writes(3))
@@ -297,8 +295,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `465`
 		//  Estimated: `3550`
-		// Minimum execution time: 41_473_000 picoseconds.
-		Weight::from_parts(44_155_000, 0)
+		// Minimum execution time: 50_887_000 picoseconds.
+		Weight::from_parts(57_366_000, 0)
 			.saturating_add(Weight::from_parts(0, 3550))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -313,8 +311,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `463`
 		//  Estimated: `3533`
-		// Minimum execution time: 56_672_000 picoseconds.
-		Weight::from_parts(58_086_000, 0)
+		// Minimum execution time: 84_472_000 picoseconds.
+		Weight::from_parts(96_536_000, 0)
 			.saturating_add(Weight::from_parts(0, 3533))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -331,8 +329,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `857`
 		//  Estimated: `3593`
-		// Minimum execution time: 64_460_000 picoseconds.
-		Weight::from_parts(65_894_000, 0)
+		// Minimum execution time: 96_371_000 picoseconds.
+		Weight::from_parts(104_659_000, 0)
 			.saturating_add(Weight::from_parts(0, 3593))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -345,8 +343,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `957`
 		//  Estimated: `4698`
-		// Minimum execution time: 37_447_000 picoseconds.
-		Weight::from_parts(42_318_000, 0)
+		// Minimum execution time: 51_741_000 picoseconds.
+		Weight::from_parts(54_461_000, 0)
 			.saturating_add(Weight::from_parts(0, 4698))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -366,8 +364,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `74`
 		//  Estimated: `3539`
-		// Minimum execution time: 21_219_000 picoseconds.
-		Weight::from_parts(22_084_648, 0)
+		// Minimum execution time: 19_901_000 picoseconds.
+		Weight::from_parts(21_028_116, 0)
 			.saturating_add(Weight::from_parts(0, 3539))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -379,11 +377,11 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `266`
 		//  Estimated: `1487`
-		// Minimum execution time: 5_792_000 picoseconds.
-		Weight::from_parts(6_358_588, 0)
+		// Minimum execution time: 5_987_000 picoseconds.
+		Weight::from_parts(6_412_478, 0)
 			.saturating_add(Weight::from_parts(0, 1487))
-			// Standard Error: 20
-			.saturating_add(Weight::from_parts(26, 0).saturating_mul(n.into()))
+			// Standard Error: 16
+			.saturating_add(Weight::from_parts(47, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -397,8 +395,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `447`
 		//  Estimated: `6196`
-		// Minimum execution time: 38_690_000 picoseconds.
-		Weight::from_parts(39_706_000, 0)
+		// Minimum execution time: 38_623_000 picoseconds.
+		Weight::from_parts(39_773_000, 0)
 			.saturating_add(Weight::from_parts(0, 6196))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
@@ -414,15 +412,13 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 	/// Storage: `Broker::Workplan` (r:0 w:60)
 	/// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`)
 	/// The range of component `n` is `[0, 1000]`.
-	fn rotate_sale(n: u32, ) -> Weight {
+	fn rotate_sale(_n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `12514`
 		//  Estimated: `13506`
-		// Minimum execution time: 93_531_000 picoseconds.
-		Weight::from_parts(95_836_318, 0)
+		// Minimum execution time: 97_074_000 picoseconds.
+		Weight::from_parts(101_247_740, 0)
 			.saturating_add(Weight::from_parts(0, 13506))
-			// Standard Error: 113
-			.saturating_add(Weight::from_parts(329, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(65))
 	}
@@ -434,8 +430,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `42`
 		//  Estimated: `3493`
-		// Minimum execution time: 6_506_000 picoseconds.
-		Weight::from_parts(6_783_000, 0)
+		// Minimum execution time: 6_317_000 picoseconds.
+		Weight::from_parts(6_521_000, 0)
 			.saturating_add(Weight::from_parts(0, 3493))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -458,8 +454,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `1321`
 		//  Estimated: `4786`
-		// Minimum execution time: 31_927_000 picoseconds.
-		Weight::from_parts(32_748_000, 0)
+		// Minimum execution time: 32_575_000 picoseconds.
+		Weight::from_parts(33_299_000, 0)
 			.saturating_add(Weight::from_parts(0, 4786))
 			.saturating_add(T::DbWeight::get().reads(7))
 			.saturating_add(T::DbWeight::get().writes(4))
@@ -478,8 +474,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `74`
 		//  Estimated: `3539`
-		// Minimum execution time: 15_682_000 picoseconds.
-		Weight::from_parts(16_012_000, 0)
+		// Minimum execution time: 15_256_000 picoseconds.
+		Weight::from_parts(15_927_000, 0)
 			.saturating_add(Weight::from_parts(0, 3539))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -490,8 +486,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 2_147_000 picoseconds.
-		Weight::from_parts(2_281_000, 0)
+		// Minimum execution time: 1_783_000 picoseconds.
+		Weight::from_parts(1_904_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -509,10 +505,22 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `398`
 		//  Estimated: `3863`
-		// Minimum execution time: 12_015_000 picoseconds.
-		Weight::from_parts(12_619_000, 0)
+		// Minimum execution time: 12_307_000 picoseconds.
+		Weight::from_parts(12_967_000, 0)
 			.saturating_add(Weight::from_parts(0, 3863))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
+	/// Storage: `Broker::Leases` (r:1 w:1)
+	/// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(401), added: 896, mode: `MaxEncodedLen`)
+	fn swap_leases() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `470`
+		//  Estimated: `1886`
+		// Minimum execution time: 6_597_000 picoseconds.
+		Weight::from_parts(6_969_000, 0)
+			.saturating_add(Weight::from_parts(0, 1886))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
 }
diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs
index 8727b9633b1..13d5fcf3898 100644
--- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs
+++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs
@@ -17,25 +17,23 @@
 //! Autogenerated weights for `pallet_broker`
 //!
 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
-//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2024-03-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
-//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
+//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024
 
 // Executed Command:
-// ./target/production/polkadot-parachain
+// target/production/polkadot-parachain
 // benchmark
 // pallet
-// --chain=coretime-westend-dev
-// --wasm-execution=compiled
-// --pallet=pallet_broker
-// --no-storage-info
-// --no-median-slopes
-// --no-min-squares
-// --extrinsic=*
 // --steps=50
 // --repeat=20
-// --json
+// --extrinsic=*
+// --wasm-execution=compiled
+// --heap-pages=4096
+// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json
+// --pallet=pallet_broker
+// --chain=coretime-westend-dev
 // --header=./cumulus/file_header.txt
 // --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/
 
@@ -56,8 +54,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_944_000 picoseconds.
-		Weight::from_parts(2_045_000, 0)
+		// Minimum execution time: 1_897_000 picoseconds.
+		Weight::from_parts(2_053_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -67,8 +65,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `10888`
 		//  Estimated: `13506`
-		// Minimum execution time: 21_158_000 picoseconds.
-		Weight::from_parts(21_572_000, 0)
+		// Minimum execution time: 22_550_000 picoseconds.
+		Weight::from_parts(22_871_000, 0)
 			.saturating_add(Weight::from_parts(0, 13506))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -79,8 +77,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `12090`
 		//  Estimated: `13506`
-		// Minimum execution time: 20_497_000 picoseconds.
-		Weight::from_parts(20_995_000, 0)
+		// Minimum execution time: 21_170_000 picoseconds.
+		Weight::from_parts(21_645_000, 0)
 			.saturating_add(Weight::from_parts(0, 13506))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -95,8 +93,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `146`
 		//  Estimated: `1631`
-		// Minimum execution time: 10_280_000 picoseconds.
-		Weight::from_parts(10_686_000, 0)
+		// Minimum execution time: 10_494_000 picoseconds.
+		Weight::from_parts(10_942_000, 0)
 			.saturating_add(Weight::from_parts(0, 1631))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -120,15 +118,13 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 	/// Storage: `Broker::Workplan` (r:0 w:20)
 	/// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`)
 	/// The range of component `n` is `[0, 1000]`.
-	fn start_sales(n: u32, ) -> Weight {
+	fn start_sales(_n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `12247`
 		//  Estimated: `13732`
-		// Minimum execution time: 61_020_000 picoseconds.
-		Weight::from_parts(63_240_622, 0)
+		// Minimum execution time: 61_014_000 picoseconds.
+		Weight::from_parts(63_267_651, 0)
 			.saturating_add(Weight::from_parts(0, 13732))
-			// Standard Error: 102
-			.saturating_add(Weight::from_parts(255, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(8))
 			.saturating_add(T::DbWeight::get().writes(26))
 	}
@@ -144,8 +140,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `316`
 		//  Estimated: `3593`
-		// Minimum execution time: 30_627_000 picoseconds.
-		Weight::from_parts(31_648_000, 0)
+		// Minimum execution time: 30_931_000 picoseconds.
+		Weight::from_parts(31_941_000, 0)
 			.saturating_add(Weight::from_parts(0, 3593))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -166,8 +162,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `434`
 		//  Estimated: `4698`
-		// Minimum execution time: 57_701_000 picoseconds.
-		Weight::from_parts(59_825_000, 0)
+		// Minimum execution time: 57_466_000 picoseconds.
+		Weight::from_parts(65_042_000, 0)
 			.saturating_add(Weight::from_parts(0, 4698))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(4))
@@ -178,8 +174,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `357`
 		//  Estimated: `3550`
-		// Minimum execution time: 12_898_000 picoseconds.
-		Weight::from_parts(13_506_000, 0)
+		// Minimum execution time: 12_799_000 picoseconds.
+		Weight::from_parts(13_401_000, 0)
 			.saturating_add(Weight::from_parts(0, 3550))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -190,8 +186,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `357`
 		//  Estimated: `3550`
-		// Minimum execution time: 14_284_000 picoseconds.
-		Weight::from_parts(14_791_000, 0)
+		// Minimum execution time: 14_107_000 picoseconds.
+		Weight::from_parts(14_630_000, 0)
 			.saturating_add(Weight::from_parts(0, 3550))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -202,8 +198,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `357`
 		//  Estimated: `3550`
-		// Minimum execution time: 15_570_000 picoseconds.
-		Weight::from_parts(16_158_000, 0)
+		// Minimum execution time: 15_254_000 picoseconds.
+		Weight::from_parts(16_062_000, 0)
 			.saturating_add(Weight::from_parts(0, 3550))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(3))
@@ -220,8 +216,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `735`
 		//  Estimated: `4681`
-		// Minimum execution time: 23_329_000 picoseconds.
-		Weight::from_parts(24_196_000, 0)
+		// Minimum execution time: 23_557_000 picoseconds.
+		Weight::from_parts(24_382_000, 0)
 			.saturating_add(Weight::from_parts(0, 4681))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -240,8 +236,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `801`
 		//  Estimated: `5996`
-		// Minimum execution time: 29_288_000 picoseconds.
-		Weight::from_parts(30_066_000, 0)
+		// Minimum execution time: 29_371_000 picoseconds.
+		Weight::from_parts(30_200_000, 0)
 			.saturating_add(Weight::from_parts(0, 5996))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(5))
@@ -257,11 +253,11 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `652`
 		//  Estimated: `6196 + m * (2520 ±0)`
-		// Minimum execution time: 54_833_000 picoseconds.
-		Weight::from_parts(55_577_423, 0)
+		// Minimum execution time: 54_331_000 picoseconds.
+		Weight::from_parts(55_322_165, 0)
 			.saturating_add(Weight::from_parts(0, 6196))
-			// Standard Error: 35_105
-			.saturating_add(Weight::from_parts(1_267_911, 0).saturating_mul(m.into()))
+			// Standard Error: 35_225
+			.saturating_add(Weight::from_parts(1_099_614, 0).saturating_mul(m.into()))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into())))
 			.saturating_add(T::DbWeight::get().writes(5))
@@ -283,8 +279,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `215`
 		//  Estimated: `3680`
-		// Minimum execution time: 55_289_000 picoseconds.
-		Weight::from_parts(56_552_000, 0)
+		// Minimum execution time: 53_789_000 picoseconds.
+		Weight::from_parts(55_439_000, 0)
 			.saturating_add(Weight::from_parts(0, 3680))
 			.saturating_add(T::DbWeight::get().reads(6))
 			.saturating_add(T::DbWeight::get().writes(3))
@@ -297,8 +293,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `465`
 		//  Estimated: `3550`
-		// Minimum execution time: 39_736_000 picoseconds.
-		Weight::from_parts(41_346_000, 0)
+		// Minimum execution time: 43_941_000 picoseconds.
+		Weight::from_parts(49_776_000, 0)
 			.saturating_add(Weight::from_parts(0, 3550))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -313,8 +309,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `463`
 		//  Estimated: `3533`
-		// Minimum execution time: 57_319_000 picoseconds.
-		Weight::from_parts(60_204_000, 0)
+		// Minimum execution time: 64_917_000 picoseconds.
+		Weight::from_parts(70_403_000, 0)
 			.saturating_add(Weight::from_parts(0, 3533))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -331,8 +327,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `857`
 		//  Estimated: `3593`
-		// Minimum execution time: 85_216_000 picoseconds.
-		Weight::from_parts(91_144_000, 0)
+		// Minimum execution time: 72_633_000 picoseconds.
+		Weight::from_parts(79_305_000, 0)
 			.saturating_add(Weight::from_parts(0, 3593))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -345,8 +341,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `556`
 		//  Estimated: `4698`
-		// Minimum execution time: 32_331_000 picoseconds.
-		Weight::from_parts(39_877_000, 0)
+		// Minimum execution time: 36_643_000 picoseconds.
+		Weight::from_parts(48_218_000, 0)
 			.saturating_add(Weight::from_parts(0, 4698))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -362,28 +358,28 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 	/// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1)
 	/// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 	/// The range of component `n` is `[0, 1000]`.
-	fn request_core_count(n: u32, ) -> Weight {
+	fn request_core_count(_n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `74`
 		//  Estimated: `3539`
-		// Minimum execution time: 18_128_000 picoseconds.
-		Weight::from_parts(19_061_234, 0)
+		// Minimum execution time: 17_617_000 picoseconds.
+		Weight::from_parts(18_904_788, 0)
 			.saturating_add(Weight::from_parts(0, 3539))
-			// Standard Error: 48
-			.saturating_add(Weight::from_parts(141, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
 	/// Storage: `Broker::CoreCountInbox` (r:1 w:1)
 	/// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
 	/// The range of component `n` is `[0, 1000]`.
-	fn process_core_count(_n: u32, ) -> Weight {
+	fn process_core_count(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `266`
 		//  Estimated: `1487`
-		// Minimum execution time: 5_368_000 picoseconds.
-		Weight::from_parts(5_837_005, 0)
+		// Minimum execution time: 5_575_000 picoseconds.
+		Weight::from_parts(5_887_598, 0)
 			.saturating_add(Weight::from_parts(0, 1487))
+			// Standard Error: 16
+			.saturating_add(Weight::from_parts(41, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -397,8 +393,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `447`
 		//  Estimated: `6196`
-		// Minimum execution time: 36_047_000 picoseconds.
-		Weight::from_parts(37_101_000, 0)
+		// Minimum execution time: 36_415_000 picoseconds.
+		Weight::from_parts(37_588_000, 0)
 			.saturating_add(Weight::from_parts(0, 6196))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
@@ -414,13 +410,15 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 	/// Storage: `Broker::Workplan` (r:0 w:20)
 	/// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`)
 	/// The range of component `n` is `[0, 1000]`.
-	fn rotate_sale(_n: u32, ) -> Weight {
+	fn rotate_sale(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `12194`
 		//  Estimated: `13506`
-		// Minimum execution time: 48_158_000 picoseconds.
-		Weight::from_parts(49_891_920, 0)
+		// Minimum execution time: 48_362_000 picoseconds.
+		Weight::from_parts(49_616_106, 0)
 			.saturating_add(Weight::from_parts(0, 13506))
+			// Standard Error: 61
+			.saturating_add(Weight::from_parts(59, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(25))
 	}
@@ -432,8 +430,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `42`
 		//  Estimated: `3493`
-		// Minimum execution time: 5_911_000 picoseconds.
-		Weight::from_parts(6_173_000, 0)
+		// Minimum execution time: 6_148_000 picoseconds.
+		Weight::from_parts(6_374_000, 0)
 			.saturating_add(Weight::from_parts(0, 3493))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -456,8 +454,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `1321`
 		//  Estimated: `4786`
-		// Minimum execution time: 30_140_000 picoseconds.
-		Weight::from_parts(30_912_000, 0)
+		// Minimum execution time: 30_267_000 picoseconds.
+		Weight::from_parts(30_825_000, 0)
 			.saturating_add(Weight::from_parts(0, 4786))
 			.saturating_add(T::DbWeight::get().reads(7))
 			.saturating_add(T::DbWeight::get().writes(4))
@@ -476,8 +474,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `74`
 		//  Estimated: `3539`
-		// Minimum execution time: 13_684_000 picoseconds.
-		Weight::from_parts(14_252_000, 0)
+		// Minimum execution time: 13_491_000 picoseconds.
+		Weight::from_parts(13_949_000, 0)
 			.saturating_add(Weight::from_parts(0, 3539))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -488,8 +486,8 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 1_718_000 picoseconds.
-		Weight::from_parts(1_843_000, 0)
+		// Minimum execution time: 1_711_000 picoseconds.
+		Weight::from_parts(1_913_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 			.saturating_add(T::DbWeight::get().writes(1))
 	}
@@ -507,10 +505,22 @@ impl<T: frame_system::Config> pallet_broker::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `398`
 		//  Estimated: `3863`
-		// Minimum execution time: 11_771_000 picoseconds.
-		Weight::from_parts(12_120_000, 0)
+		// Minimum execution time: 12_035_000 picoseconds.
+		Weight::from_parts(12_383_000, 0)
 			.saturating_add(Weight::from_parts(0, 3863))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(2))
 	}
+	/// Storage: `Broker::Leases` (r:1 w:1)
+	/// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(81), added: 576, mode: `MaxEncodedLen`)
+	fn swap_leases() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `150`
+		//  Estimated: `1566`
+		// Minimum execution time: 6_142_000 picoseconds.
+		Weight::from_parts(6_538_000, 0)
+			.saturating_add(Weight::from_parts(0, 1566))
+			.saturating_add(T::DbWeight::get().reads(1))
+			.saturating_add(T::DbWeight::get().writes(1))
+	}
 }
diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs
index eb9646d7e86..9095cd90ae0 100644
--- a/polkadot/runtime/parachains/src/coretime/mod.rs
+++ b/polkadot/runtime/parachains/src/coretime/mod.rs
@@ -83,6 +83,8 @@ enum CoretimeCalls {
 	SetLease(pallet_broker::TaskId, pallet_broker::Timeslice),
 	#[codec(index = 19)]
 	NotifyCoreCount(u16),
+	#[codec(index = 99)]
+	SwapLeases(ParaId, ParaId),
 }
 
 #[frame_support::pallet]
@@ -233,6 +235,24 @@ impl<T: Config> Pallet<T> {
 			}
 		}
 	}
+
+	// Handle legacy swaps in coretime. Notifies broker parachain that a lease swap has occurred via
+	// XCM message. This function is meant to be used in an implementation of `OnSwap` trait.
+	pub fn on_legacy_lease_swap(one: ParaId, other: ParaId) {
+		let message = Xcm(vec![
+			Instruction::UnpaidExecution {
+				weight_limit: WeightLimit::Unlimited,
+				check_origin: None,
+			},
+			mk_coretime_call(crate::coretime::CoretimeCalls::SwapLeases(one, other)),
+		]);
+		if let Err(err) = send_xcm::<T::SendXcm>(
+			Location::new(0, [Junction::Parachain(T::BrokerId::get())]),
+			message,
+		) {
+			log::error!("Sending `SwapLeases` to coretime chain failed: {:?}", err);
+		}
+	}
 }
 
 impl<T: Config> OnNewSession<BlockNumberFor<T>> for Pallet<T> {
diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs
index 90824a2f6f0..b26317490cd 100644
--- a/polkadot/runtime/rococo/src/lib.rs
+++ b/polkadot/runtime/rococo/src/lib.rs
@@ -38,7 +38,7 @@ use runtime_common::{
 		LocatableAssetConverter, ToAuthor, VersionedLocatableAsset, VersionedLocationConverter,
 	},
 	paras_registrar, paras_sudo_wrapper, prod_or_fast, slots,
-	traits::Leaser,
+	traits::{Leaser, OnSwap},
 	BlockHashCount, BlockLength, SlowAdjustingFeeUpdate,
 };
 use scale_info::TypeInfo;
@@ -1078,7 +1078,7 @@ impl paras_registrar::Config for Runtime {
 	type RuntimeOrigin = RuntimeOrigin;
 	type RuntimeEvent = RuntimeEvent;
 	type Currency = Balances;
-	type OnSwap = (Crowdloan, Slots);
+	type OnSwap = (Crowdloan, Slots, SwapLeases);
 	type ParaDeposit = ParaDeposit;
 	type DataDepositPerByte = DataDepositPerByte;
 	type WeightInfo = weights::runtime_common_paras_registrar::WeightInfo<Runtime>;
@@ -1306,6 +1306,14 @@ impl pallet_asset_rate::Config for Runtime {
 	type BenchmarkHelper = runtime_common::impls::benchmarks::AssetRateArguments;
 }
 
+// Notify `coretime` pallet when a lease swap occurs
+pub struct SwapLeases;
+impl OnSwap for SwapLeases {
+	fn on_swap(one: ParaId, other: ParaId) {
+		coretime::Pallet::<Runtime>::on_legacy_lease_swap(one, other);
+	}
+}
+
 construct_runtime! {
 	pub enum Runtime
 	{
diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs
index 664044b713e..12e6174ab6c 100644
--- a/polkadot/runtime/westend/src/lib.rs
+++ b/polkadot/runtime/westend/src/lib.rs
@@ -62,7 +62,7 @@ use runtime_common::{
 		LocatableAssetConverter, ToAuthor, VersionedLocatableAsset, VersionedLocationConverter,
 	},
 	paras_registrar, paras_sudo_wrapper, prod_or_fast, slots,
-	traits::Leaser,
+	traits::{Leaser, OnSwap},
 	BalanceToU256, BlockHashCount, BlockLength, CurrencyToVote, SlowAdjustingFeeUpdate,
 	U256ToBalance,
 };
@@ -1302,7 +1302,7 @@ impl paras_registrar::Config for Runtime {
 	type RuntimeOrigin = RuntimeOrigin;
 	type RuntimeEvent = RuntimeEvent;
 	type Currency = Balances;
-	type OnSwap = (Crowdloan, Slots);
+	type OnSwap = (Crowdloan, Slots, SwapLeases);
 	type ParaDeposit = ParaDeposit;
 	type DataDepositPerByte = RegistrarDataDepositPerByte;
 	type WeightInfo = weights::runtime_common_paras_registrar::WeightInfo<Runtime>;
@@ -1414,6 +1414,14 @@ impl pallet_asset_rate::Config for Runtime {
 	type BenchmarkHelper = runtime_common::impls::benchmarks::AssetRateArguments;
 }
 
+// Notify `coretime` pallet when a lease swap occurs
+pub struct SwapLeases;
+impl OnSwap for SwapLeases {
+	fn on_swap(one: ParaId, other: ParaId) {
+		coretime::Pallet::<Runtime>::on_legacy_lease_swap(one, other);
+	}
+}
+
 #[frame_support::runtime(legacy_ordering)]
 mod runtime {
 	#[runtime::runtime]
diff --git a/prdoc/pr_3714.prdoc b/prdoc/pr_3714.prdoc
new file mode 100644
index 00000000000..e276d0d2d37
--- /dev/null
+++ b/prdoc/pr_3714.prdoc
@@ -0,0 +1,10 @@
+title: Handle legacy lease swaps on coretime
+
+doc:
+  - audience: Runtime Dev
+    description: |
+      When a `registar::swap` extrinsic is executed it swaps two leases on the relay chain but the
+      broker chain never knows about this swap. This change notifies the broker chain via a XCM
+      message for a swap so that it can update its state.
+crates:
+  - name: pallet-broker
diff --git a/substrate/frame/broker/src/benchmarking.rs b/substrate/frame/broker/src/benchmarking.rs
index 70f488e998c..98ac074ca91 100644
--- a/substrate/frame/broker/src/benchmarking.rs
+++ b/substrate/frame/broker/src/benchmarking.rs
@@ -918,6 +918,23 @@ mod benches {
 		Ok(())
 	}
 
+	#[benchmark]
+	fn swap_leases() -> Result<(), BenchmarkError> {
+		let admin_origin =
+			T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
+
+		// Add two leases in `Leases`
+		let n = (T::MaxLeasedCores::get() / 2) as usize;
+		let mut leases = vec![LeaseRecordItem { task: 1, until: 10u32.into() }; n];
+		leases.extend(vec![LeaseRecordItem { task: 2, until: 20u32.into() }; n]);
+		Leases::<T>::put(BoundedVec::try_from(leases).unwrap());
+
+		#[extrinsic_call]
+		_(admin_origin as T::RuntimeOrigin, 1, 2);
+
+		Ok(())
+	}
+
 	// Implements a test for each benchmark. Execute with:
 	// `cargo test -p pallet-broker --features runtime-benchmarks`.
 	impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test);
diff --git a/substrate/frame/broker/src/dispatchable_impls.rs b/substrate/frame/broker/src/dispatchable_impls.rs
index f2451013251..74cda9c4f4c 100644
--- a/substrate/frame/broker/src/dispatchable_impls.rs
+++ b/substrate/frame/broker/src/dispatchable_impls.rs
@@ -437,4 +437,22 @@ impl<T: Config> Pallet<T> {
 		Self::deposit_event(Event::AllowedRenewalDropped { core, when });
 		Ok(())
 	}
+
+	pub(crate) fn do_swap_leases(id: TaskId, other: TaskId) -> DispatchResult {
+		let mut id_leases_count = 0;
+		let mut other_leases_count = 0;
+		Leases::<T>::mutate(|leases| {
+			leases.iter_mut().for_each(|lease| {
+				if lease.task == id {
+					lease.task = other;
+					id_leases_count += 1;
+				} else if lease.task == other {
+					lease.task = id;
+					other_leases_count += 1;
+				}
+			})
+		});
+
+		Ok(())
+	}
 }
diff --git a/substrate/frame/broker/src/lib.rs b/substrate/frame/broker/src/lib.rs
index f1b49a73a52..b9b5e309ca9 100644
--- a/substrate/frame/broker/src/lib.rs
+++ b/substrate/frame/broker/src/lib.rs
@@ -786,5 +786,13 @@ pub mod pallet {
 			Self::do_notify_core_count(core_count)?;
 			Ok(())
 		}
+
+		#[pallet::call_index(99)]
+		#[pallet::weight(T::WeightInfo::swap_leases())]
+		pub fn swap_leases(origin: OriginFor<T>, id: TaskId, other: TaskId) -> DispatchResult {
+			T::AdminOrigin::ensure_origin_or_root(origin)?;
+			Self::do_swap_leases(id, other)?;
+			Ok(())
+		}
 	}
 }
diff --git a/substrate/frame/broker/src/weights.rs b/substrate/frame/broker/src/weights.rs
index a8f50eeee6e..a8b9fb598b8 100644
--- a/substrate/frame/broker/src/weights.rs
+++ b/substrate/frame/broker/src/weights.rs
@@ -17,10 +17,10 @@
 
 //! Autogenerated weights for `pallet_broker`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2023-09-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
+//! DATE: 2024-03-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
-//! HOSTNAME: `runner-pzhd7p6z-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
+//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024`
 
 // Executed Command:
@@ -76,6 +76,7 @@ pub trait WeightInfo {
 	fn request_revenue_info_at() -> Weight;
 	fn notify_core_count() -> Weight;
 	fn do_tick_base() -> Weight;
+	fn swap_leases() -> Weight;
 }
 
 /// Weights for `pallet_broker` using the Substrate node and recommended hardware.
@@ -87,8 +88,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_040_000 picoseconds.
-		Weight::from_parts(3_344_000, 0)
+		// Minimum execution time: 2_865_000 picoseconds.
+		Weight::from_parts(3_061_000, 0)
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
 	/// Storage: `Broker::Reservations` (r:1 w:1)
@@ -97,8 +98,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `5016`
 		//  Estimated: `7496`
-		// Minimum execution time: 21_259_000 picoseconds.
-		Weight::from_parts(22_110_000, 7496)
+		// Minimum execution time: 18_431_000 picoseconds.
+		Weight::from_parts(19_558_000, 7496)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -108,8 +109,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `6218`
 		//  Estimated: `7496`
-		// Minimum execution time: 20_330_000 picoseconds.
-		Weight::from_parts(20_826_000, 7496)
+		// Minimum execution time: 17_724_000 picoseconds.
+		Weight::from_parts(18_688_000, 7496)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -119,8 +120,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `239`
 		//  Estimated: `1526`
-		// Minimum execution time: 13_411_000 picoseconds.
-		Weight::from_parts(13_960_000, 1526)
+		// Minimum execution time: 10_513_000 picoseconds.
+		Weight::from_parts(11_138_000, 1526)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -139,14 +140,12 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// Storage: `Broker::Workplan` (r:0 w:10)
 	/// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`)
 	/// The range of component `n` is `[0, 1000]`.
-	fn start_sales(n: u32, ) -> Weight {
+	fn start_sales(_n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `6330`
 		//  Estimated: `8499`
-		// Minimum execution time: 57_770_000 picoseconds.
-		Weight::from_parts(61_047_512, 8499)
-			// Standard Error: 165
-			.saturating_add(Weight::from_parts(3, 0).saturating_mul(n.into()))
+		// Minimum execution time: 50_864_000 picoseconds.
+		Weight::from_parts(54_000_280, 8499)
 			.saturating_add(T::DbWeight::get().reads(6_u64))
 			.saturating_add(T::DbWeight::get().writes(16_u64))
 	}
@@ -162,10 +161,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`)
 	fn purchase() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `568`
-		//  Estimated: `2053`
-		// Minimum execution time: 51_196_000 picoseconds.
-		Weight::from_parts(52_382_000, 2053)
+		//  Measured:  `635`
+		//  Estimated: `2120`
+		// Minimum execution time: 43_630_000 picoseconds.
+		Weight::from_parts(44_622_000, 2120)
 			.saturating_add(T::DbWeight::get().reads(4_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -185,10 +184,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`)
 	fn renew() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `686`
+		//  Measured:  `753`
 		//  Estimated: `4698`
-		// Minimum execution time: 71_636_000 picoseconds.
-		Weight::from_parts(73_679_000, 4698)
+		// Minimum execution time: 62_453_000 picoseconds.
+		Weight::from_parts(63_882_000, 4698)
 			.saturating_add(T::DbWeight::get().reads(6_u64))
 			.saturating_add(T::DbWeight::get().writes(4_u64))
 	}
@@ -198,8 +197,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `495`
 		//  Estimated: `3550`
-		// Minimum execution time: 19_182_000 picoseconds.
-		Weight::from_parts(19_775_000, 3550)
+		// Minimum execution time: 17_237_000 picoseconds.
+		Weight::from_parts(17_757_000, 3550)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -209,21 +208,21 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `495`
 		//  Estimated: `3550`
-		// Minimum execution time: 20_688_000 picoseconds.
-		Weight::from_parts(21_557_000, 3550)
+		// Minimum execution time: 18_504_000 picoseconds.
+		Weight::from_parts(19_273_000, 3550)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
-	/// Storage: `Broker::Regions` (r:1 w:2)
+	/// Storage: `Broker::Regions` (r:1 w:3)
 	/// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`)
 	fn interlace() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `495`
 		//  Estimated: `3550`
-		// Minimum execution time: 21_190_000 picoseconds.
-		Weight::from_parts(22_215_000, 3550)
+		// Minimum execution time: 20_477_000 picoseconds.
+		Weight::from_parts(21_328_000, 3550)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
-			.saturating_add(T::DbWeight::get().writes(2_u64))
+			.saturating_add(T::DbWeight::get().writes(3_u64))
 	}
 	/// Storage: `Broker::Configuration` (r:1 w:0)
 	/// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`)
@@ -237,8 +236,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `740`
 		//  Estimated: `4681`
-		// Minimum execution time: 34_591_000 picoseconds.
-		Weight::from_parts(36_227_000, 4681)
+		// Minimum execution time: 31_815_000 picoseconds.
+		Weight::from_parts(32_700_000, 4681)
 			.saturating_add(T::DbWeight::get().reads(4_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -256,8 +255,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `775`
 		//  Estimated: `5996`
-		// Minimum execution time: 40_346_000 picoseconds.
-		Weight::from_parts(41_951_000, 5996)
+		// Minimum execution time: 38_313_000 picoseconds.
+		Weight::from_parts(38_985_000, 5996)
 			.saturating_add(T::DbWeight::get().reads(5_u64))
 			.saturating_add(T::DbWeight::get().writes(5_u64))
 	}
@@ -272,10 +271,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `859`
 		//  Estimated: `6196 + m * (2520 ±0)`
-		// Minimum execution time: 75_734_000 picoseconds.
-		Weight::from_parts(78_168_395, 6196)
-			// Standard Error: 63_180
-			.saturating_add(Weight::from_parts(1_076_259, 0).saturating_mul(m.into()))
+		// Minimum execution time: 70_170_000 picoseconds.
+		Weight::from_parts(71_245_388, 6196)
+			// Standard Error: 54_382
+			.saturating_add(Weight::from_parts(1_488_794, 0).saturating_mul(m.into()))
 			.saturating_add(T::DbWeight::get().reads(3_u64))
 			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into())))
 			.saturating_add(T::DbWeight::get().writes(5_u64))
@@ -287,8 +286,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `103`
 		//  Estimated: `3593`
-		// Minimum execution time: 46_383_000 picoseconds.
-		Weight::from_parts(47_405_000, 3593)
+		// Minimum execution time: 43_414_000 picoseconds.
+		Weight::from_parts(44_475_000, 3593)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -300,8 +299,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `603`
 		//  Estimated: `3550`
-		// Minimum execution time: 30_994_000 picoseconds.
-		Weight::from_parts(31_979_000, 3550)
+		// Minimum execution time: 31_327_000 picoseconds.
+		Weight::from_parts(32_050_000, 3550)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -315,8 +314,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `601`
 		//  Estimated: `3533`
-		// Minimum execution time: 37_584_000 picoseconds.
-		Weight::from_parts(44_010_000, 3533)
+		// Minimum execution time: 41_315_000 picoseconds.
+		Weight::from_parts(42_421_000, 3533)
 			.saturating_add(T::DbWeight::get().reads(3_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -330,10 +329,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
 	fn drop_history() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `830`
+		//  Measured:  `995`
 		//  Estimated: `3593`
-		// Minimum execution time: 45_266_000 picoseconds.
-		Weight::from_parts(48_000_000, 3593)
+		// Minimum execution time: 49_707_000 picoseconds.
+		Weight::from_parts(51_516_000, 3593)
 			.saturating_add(T::DbWeight::get().reads(4_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -343,10 +342,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// Proof: `Broker::AllowedRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
 	fn drop_renewal() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `525`
+		//  Measured:  `661`
 		//  Estimated: `4698`
-		// Minimum execution time: 25_365_000 picoseconds.
-		Weight::from_parts(26_920_000, 4698)
+		// Minimum execution time: 26_207_000 picoseconds.
+		Weight::from_parts(27_227_000, 4698)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -355,22 +354,22 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 6_519_000 picoseconds.
-		Weight::from_parts(7_098_698, 0)
-			// Standard Error: 20
-			.saturating_add(Weight::from_parts(8, 0).saturating_mul(n.into()))
+		// Minimum execution time: 4_670_000 picoseconds.
+		Weight::from_parts(5_170_450, 0)
+			// Standard Error: 16
+			.saturating_add(Weight::from_parts(37, 0).saturating_mul(n.into()))
 	}
-	/// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1)
-	/// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1)
+	/// Storage: `Broker::CoreCountInbox` (r:1 w:1)
+	/// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
 	/// The range of component `n` is `[0, 1000]`.
 	fn process_core_count(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `98`
-		//  Estimated: `3563`
-		// Minimum execution time: 7_608_000 picoseconds.
-		Weight::from_parts(8_157_815, 3563)
-			// Standard Error: 26
-			.saturating_add(Weight::from_parts(48, 0).saturating_mul(n.into()))
+		//  Measured:  `404`
+		//  Estimated: `1487`
+		// Minimum execution time: 6_916_000 picoseconds.
+		Weight::from_parts(7_485_053, 1487)
+			// Standard Error: 23
+			.saturating_add(Weight::from_parts(30, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -386,10 +385,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 	fn process_revenue() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `905`
-		//  Estimated: `4370`
-		// Minimum execution time: 59_993_000 picoseconds.
-		Weight::from_parts(61_752_000, 4370)
+		//  Measured:  `972`
+		//  Estimated: `4437`
+		// Minimum execution time: 50_987_000 picoseconds.
+		Weight::from_parts(52_303_000, 4437)
 			.saturating_add(T::DbWeight::get().reads(5_u64))
 			.saturating_add(T::DbWeight::get().writes(3_u64))
 	}
@@ -408,10 +407,10 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `6281`
 		//  Estimated: `8499`
-		// Minimum execution time: 41_863_000 picoseconds.
-		Weight::from_parts(44_033_031, 8499)
-			// Standard Error: 116
-			.saturating_add(Weight::from_parts(764, 0).saturating_mul(n.into()))
+		// Minimum execution time: 38_334_000 picoseconds.
+		Weight::from_parts(40_517_609, 8499)
+			// Standard Error: 90
+			.saturating_add(Weight::from_parts(338, 0).saturating_mul(n.into()))
 			.saturating_add(T::DbWeight::get().reads(5_u64))
 			.saturating_add(T::DbWeight::get().writes(15_u64))
 	}
@@ -423,8 +422,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `180`
 		//  Estimated: `3493`
-		// Minimum execution time: 9_588_000 picoseconds.
-		Weight::from_parts(9_925_000, 3493)
+		// Minimum execution time: 7_850_000 picoseconds.
+		Weight::from_parts(8_157_000, 3493)
 			.saturating_add(T::DbWeight::get().reads(1_u64))
 			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
@@ -436,8 +435,8 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `1423`
 		//  Estimated: `4681`
-		// Minimum execution time: 19_308_000 picoseconds.
-		Weight::from_parts(20_482_000, 4681)
+		// Minimum execution time: 17_313_000 picoseconds.
+		Weight::from_parts(17_727_000, 4681)
 			.saturating_add(T::DbWeight::get().reads(2_u64))
 			.saturating_add(T::DbWeight::get().writes(2_u64))
 	}
@@ -445,28 +444,46 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 147_000 picoseconds.
-		Weight::from_parts(184_000, 0)
+		// Minimum execution time: 171_000 picoseconds.
+		Weight::from_parts(196_000, 0)
 	}
+	/// Storage: `Broker::CoreCountInbox` (r:0 w:1)
+	/// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
 	fn notify_core_count() -> Weight {
-		T::DbWeight::get().reads_writes(1, 1)
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 2_413_000 picoseconds.
+		Weight::from_parts(2_587_000, 0)
+			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
 	/// Storage: `Broker::Status` (r:1 w:1)
 	/// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`)
 	/// Storage: `Broker::Configuration` (r:1 w:0)
 	/// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`)
-	/// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1)
-	/// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1)
+	/// Storage: `Broker::CoreCountInbox` (r:1 w:0)
+	/// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
 	/// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1)
 	/// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1)
 	fn do_tick_base() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `699`
-		//  Estimated: `4164`
-		// Minimum execution time: 19_824_000 picoseconds.
-		Weight::from_parts(20_983_000, 4164)
+		//  Measured:  `603`
+		//  Estimated: `4068`
+		// Minimum execution time: 13_121_000 picoseconds.
+		Weight::from_parts(13_685_000, 4068)
 			.saturating_add(T::DbWeight::get().reads(4_u64))
-			.saturating_add(T::DbWeight::get().writes(3_u64))
+			.saturating_add(T::DbWeight::get().writes(2_u64))
+	}
+	/// Storage: `Broker::Leases` (r:1 w:1)
+	/// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`)
+	fn swap_leases() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `239`
+		//  Estimated: `1526`
+		// Minimum execution time: 6_847_000 picoseconds.
+		Weight::from_parts(7_185_000, 1526)
+			.saturating_add(T::DbWeight::get().reads(1_u64))
+			.saturating_add(T::DbWeight::get().writes(1_u64))
 	}
 }
 
@@ -478,8 +495,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_040_000 picoseconds.
-		Weight::from_parts(3_344_000, 0)
+		// Minimum execution time: 2_865_000 picoseconds.
+		Weight::from_parts(3_061_000, 0)
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
 	/// Storage: `Broker::Reservations` (r:1 w:1)
@@ -488,8 +505,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `5016`
 		//  Estimated: `7496`
-		// Minimum execution time: 21_259_000 picoseconds.
-		Weight::from_parts(22_110_000, 7496)
+		// Minimum execution time: 18_431_000 picoseconds.
+		Weight::from_parts(19_558_000, 7496)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -499,8 +516,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `6218`
 		//  Estimated: `7496`
-		// Minimum execution time: 20_330_000 picoseconds.
-		Weight::from_parts(20_826_000, 7496)
+		// Minimum execution time: 17_724_000 picoseconds.
+		Weight::from_parts(18_688_000, 7496)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -510,8 +527,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `239`
 		//  Estimated: `1526`
-		// Minimum execution time: 13_411_000 picoseconds.
-		Weight::from_parts(13_960_000, 1526)
+		// Minimum execution time: 10_513_000 picoseconds.
+		Weight::from_parts(11_138_000, 1526)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -530,14 +547,12 @@ impl WeightInfo for () {
 	/// Storage: `Broker::Workplan` (r:0 w:10)
 	/// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`)
 	/// The range of component `n` is `[0, 1000]`.
-	fn start_sales(n: u32, ) -> Weight {
+	fn start_sales(_n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `6330`
 		//  Estimated: `8499`
-		// Minimum execution time: 57_770_000 picoseconds.
-		Weight::from_parts(61_047_512, 8499)
-			// Standard Error: 165
-			.saturating_add(Weight::from_parts(3, 0).saturating_mul(n.into()))
+		// Minimum execution time: 50_864_000 picoseconds.
+		Weight::from_parts(54_000_280, 8499)
 			.saturating_add(RocksDbWeight::get().reads(6_u64))
 			.saturating_add(RocksDbWeight::get().writes(16_u64))
 	}
@@ -553,10 +568,10 @@ impl WeightInfo for () {
 	/// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`)
 	fn purchase() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `568`
-		//  Estimated: `2053`
-		// Minimum execution time: 51_196_000 picoseconds.
-		Weight::from_parts(52_382_000, 2053)
+		//  Measured:  `635`
+		//  Estimated: `2120`
+		// Minimum execution time: 43_630_000 picoseconds.
+		Weight::from_parts(44_622_000, 2120)
 			.saturating_add(RocksDbWeight::get().reads(4_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -576,10 +591,10 @@ impl WeightInfo for () {
 	/// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`)
 	fn renew() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `686`
+		//  Measured:  `753`
 		//  Estimated: `4698`
-		// Minimum execution time: 71_636_000 picoseconds.
-		Weight::from_parts(73_679_000, 4698)
+		// Minimum execution time: 62_453_000 picoseconds.
+		Weight::from_parts(63_882_000, 4698)
 			.saturating_add(RocksDbWeight::get().reads(6_u64))
 			.saturating_add(RocksDbWeight::get().writes(4_u64))
 	}
@@ -589,8 +604,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `495`
 		//  Estimated: `3550`
-		// Minimum execution time: 19_182_000 picoseconds.
-		Weight::from_parts(19_775_000, 3550)
+		// Minimum execution time: 17_237_000 picoseconds.
+		Weight::from_parts(17_757_000, 3550)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -600,21 +615,21 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `495`
 		//  Estimated: `3550`
-		// Minimum execution time: 20_688_000 picoseconds.
-		Weight::from_parts(21_557_000, 3550)
+		// Minimum execution time: 18_504_000 picoseconds.
+		Weight::from_parts(19_273_000, 3550)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
-	/// Storage: `Broker::Regions` (r:1 w:2)
+	/// Storage: `Broker::Regions` (r:1 w:3)
 	/// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`)
 	fn interlace() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `495`
 		//  Estimated: `3550`
-		// Minimum execution time: 21_190_000 picoseconds.
-		Weight::from_parts(22_215_000, 3550)
+		// Minimum execution time: 20_477_000 picoseconds.
+		Weight::from_parts(21_328_000, 3550)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
-			.saturating_add(RocksDbWeight::get().writes(2_u64))
+			.saturating_add(RocksDbWeight::get().writes(3_u64))
 	}
 	/// Storage: `Broker::Configuration` (r:1 w:0)
 	/// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`)
@@ -628,8 +643,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `740`
 		//  Estimated: `4681`
-		// Minimum execution time: 34_591_000 picoseconds.
-		Weight::from_parts(36_227_000, 4681)
+		// Minimum execution time: 31_815_000 picoseconds.
+		Weight::from_parts(32_700_000, 4681)
 			.saturating_add(RocksDbWeight::get().reads(4_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -647,8 +662,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `775`
 		//  Estimated: `5996`
-		// Minimum execution time: 40_346_000 picoseconds.
-		Weight::from_parts(41_951_000, 5996)
+		// Minimum execution time: 38_313_000 picoseconds.
+		Weight::from_parts(38_985_000, 5996)
 			.saturating_add(RocksDbWeight::get().reads(5_u64))
 			.saturating_add(RocksDbWeight::get().writes(5_u64))
 	}
@@ -663,10 +678,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `859`
 		//  Estimated: `6196 + m * (2520 ±0)`
-		// Minimum execution time: 75_734_000 picoseconds.
-		Weight::from_parts(78_168_395, 6196)
-			// Standard Error: 63_180
-			.saturating_add(Weight::from_parts(1_076_259, 0).saturating_mul(m.into()))
+		// Minimum execution time: 70_170_000 picoseconds.
+		Weight::from_parts(71_245_388, 6196)
+			// Standard Error: 54_382
+			.saturating_add(Weight::from_parts(1_488_794, 0).saturating_mul(m.into()))
 			.saturating_add(RocksDbWeight::get().reads(3_u64))
 			.saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(m.into())))
 			.saturating_add(RocksDbWeight::get().writes(5_u64))
@@ -678,8 +693,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `103`
 		//  Estimated: `3593`
-		// Minimum execution time: 46_383_000 picoseconds.
-		Weight::from_parts(47_405_000, 3593)
+		// Minimum execution time: 43_414_000 picoseconds.
+		Weight::from_parts(44_475_000, 3593)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -691,8 +706,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `603`
 		//  Estimated: `3550`
-		// Minimum execution time: 30_994_000 picoseconds.
-		Weight::from_parts(31_979_000, 3550)
+		// Minimum execution time: 31_327_000 picoseconds.
+		Weight::from_parts(32_050_000, 3550)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -706,8 +721,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `601`
 		//  Estimated: `3533`
-		// Minimum execution time: 37_584_000 picoseconds.
-		Weight::from_parts(44_010_000, 3533)
+		// Minimum execution time: 41_315_000 picoseconds.
+		Weight::from_parts(42_421_000, 3533)
 			.saturating_add(RocksDbWeight::get().reads(3_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -721,10 +736,10 @@ impl WeightInfo for () {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`)
 	fn drop_history() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `830`
+		//  Measured:  `995`
 		//  Estimated: `3593`
-		// Minimum execution time: 45_266_000 picoseconds.
-		Weight::from_parts(48_000_000, 3593)
+		// Minimum execution time: 49_707_000 picoseconds.
+		Weight::from_parts(51_516_000, 3593)
 			.saturating_add(RocksDbWeight::get().reads(4_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -734,10 +749,10 @@ impl WeightInfo for () {
 	/// Proof: `Broker::AllowedRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`)
 	fn drop_renewal() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `525`
+		//  Measured:  `661`
 		//  Estimated: `4698`
-		// Minimum execution time: 25_365_000 picoseconds.
-		Weight::from_parts(26_920_000, 4698)
+		// Minimum execution time: 26_207_000 picoseconds.
+		Weight::from_parts(27_227_000, 4698)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -746,22 +761,22 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 6_519_000 picoseconds.
-		Weight::from_parts(7_098_698, 0)
-			// Standard Error: 20
-			.saturating_add(Weight::from_parts(8, 0).saturating_mul(n.into()))
+		// Minimum execution time: 4_670_000 picoseconds.
+		Weight::from_parts(5_170_450, 0)
+			// Standard Error: 16
+			.saturating_add(Weight::from_parts(37, 0).saturating_mul(n.into()))
 	}
-	/// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1)
-	/// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1)
+	/// Storage: `Broker::CoreCountInbox` (r:1 w:1)
+	/// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
 	/// The range of component `n` is `[0, 1000]`.
 	fn process_core_count(n: u32, ) -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `98`
-		//  Estimated: `3563`
-		// Minimum execution time: 7_608_000 picoseconds.
-		Weight::from_parts(8_157_815, 3563)
-			// Standard Error: 26
-			.saturating_add(Weight::from_parts(48, 0).saturating_mul(n.into()))
+		//  Measured:  `404`
+		//  Estimated: `1487`
+		// Minimum execution time: 6_916_000 picoseconds.
+		Weight::from_parts(7_485_053, 1487)
+			// Standard Error: 23
+			.saturating_add(Weight::from_parts(30, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -777,10 +792,10 @@ impl WeightInfo for () {
 	/// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
 	fn process_revenue() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `905`
-		//  Estimated: `4370`
-		// Minimum execution time: 59_993_000 picoseconds.
-		Weight::from_parts(61_752_000, 4370)
+		//  Measured:  `972`
+		//  Estimated: `4437`
+		// Minimum execution time: 50_987_000 picoseconds.
+		Weight::from_parts(52_303_000, 4437)
 			.saturating_add(RocksDbWeight::get().reads(5_u64))
 			.saturating_add(RocksDbWeight::get().writes(3_u64))
 	}
@@ -799,10 +814,10 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `6281`
 		//  Estimated: `8499`
-		// Minimum execution time: 41_863_000 picoseconds.
-		Weight::from_parts(44_033_031, 8499)
-			// Standard Error: 116
-			.saturating_add(Weight::from_parts(764, 0).saturating_mul(n.into()))
+		// Minimum execution time: 38_334_000 picoseconds.
+		Weight::from_parts(40_517_609, 8499)
+			// Standard Error: 90
+			.saturating_add(Weight::from_parts(338, 0).saturating_mul(n.into()))
 			.saturating_add(RocksDbWeight::get().reads(5_u64))
 			.saturating_add(RocksDbWeight::get().writes(15_u64))
 	}
@@ -814,8 +829,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `180`
 		//  Estimated: `3493`
-		// Minimum execution time: 9_588_000 picoseconds.
-		Weight::from_parts(9_925_000, 3493)
+		// Minimum execution time: 7_850_000 picoseconds.
+		Weight::from_parts(8_157_000, 3493)
 			.saturating_add(RocksDbWeight::get().reads(1_u64))
 			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
@@ -827,8 +842,8 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `1423`
 		//  Estimated: `4681`
-		// Minimum execution time: 19_308_000 picoseconds.
-		Weight::from_parts(20_482_000, 4681)
+		// Minimum execution time: 17_313_000 picoseconds.
+		Weight::from_parts(17_727_000, 4681)
 			.saturating_add(RocksDbWeight::get().reads(2_u64))
 			.saturating_add(RocksDbWeight::get().writes(2_u64))
 	}
@@ -836,28 +851,45 @@ impl WeightInfo for () {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 147_000 picoseconds.
-		Weight::from_parts(184_000, 0)
+		// Minimum execution time: 171_000 picoseconds.
+		Weight::from_parts(196_000, 0)
 	}
+	/// Storage: `Broker::CoreCountInbox` (r:0 w:1)
+	/// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
 	fn notify_core_count() -> Weight {
-		RocksDbWeight::get().reads(1)
-			.saturating_add(RocksDbWeight::get().writes(1))
+		// Proof Size summary in bytes:
+		//  Measured:  `0`
+		//  Estimated: `0`
+		// Minimum execution time: 2_413_000 picoseconds.
+		Weight::from_parts(2_587_000, 0)
+			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
 	/// Storage: `Broker::Status` (r:1 w:1)
 	/// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`)
 	/// Storage: `Broker::Configuration` (r:1 w:0)
 	/// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`)
-	/// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1)
-	/// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1)
+	/// Storage: `Broker::CoreCountInbox` (r:1 w:0)
+	/// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
 	/// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1)
 	/// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1)
 	fn do_tick_base() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `699`
-		//  Estimated: `4164`
-		// Minimum execution time: 19_824_000 picoseconds.
-		Weight::from_parts(20_983_000, 4164)
+		//  Measured:  `603`
+		//  Estimated: `4068`
+		// Minimum execution time: 13_121_000 picoseconds.
+		Weight::from_parts(13_685_000, 4068)
 			.saturating_add(RocksDbWeight::get().reads(4_u64))
-			.saturating_add(RocksDbWeight::get().writes(3_u64))
+			.saturating_add(RocksDbWeight::get().writes(2_u64))
+	}
+	/// Storage: `Broker::Leases` (r:1 w:1)
+	/// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`)
+	fn swap_leases() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `239`
+		//  Estimated: `1526`
+		// Minimum execution time: 6_847_000 picoseconds.
+		Weight::from_parts(7_185_000, 1526)
+			.saturating_add(RocksDbWeight::get().reads(1_u64))
+			.saturating_add(RocksDbWeight::get().writes(1_u64))
 	}
 }
-- 
GitLab