From de6733baedf5406c37393c20912536600d3ef6fa Mon Sep 17 00:00:00 2001
From: Branislav Kontur <bkontur@gmail.com>
Date: Thu, 25 Jul 2024 08:56:18 +0200
Subject: [PATCH] Bridges improved tests and nits (#5128)

This PR adds `exporter_is_compatible_with_pallet_xcm_bridge_hub_router`,
which ensures that our `pallet_xcm_bridge_hub` and
`pallet_xcm_bridge_hub_router` are compatible when handling
`ExportMessage`. Other changes are just small nits and cosmetics which
makes others stuff easier.

---------

Co-authored-by: Svyatoslav Nikolsky <svyatonik@gmail.com>
---
 Cargo.lock                                    |   3 +-
 bridges/bin/runtime-common/src/integrity.rs   |  21 ++-
 bridges/modules/messages/src/proofs.rs        |   2 +-
 bridges/modules/messages/src/tests/mock.rs    |   2 +-
 bridges/modules/xcm-bridge-hub/Cargo.toml     |   5 +
 .../modules/xcm-bridge-hub/src/exporter.rs    |  44 ++++-
 bridges/modules/xcm-bridge-hub/src/mock.rs    | 150 ++++++++++++++++--
 .../bridge-hubs/bridge-hub-rococo/Cargo.toml  |   1 -
 .../src/bridge_to_bulletin_config.rs          |   3 -
 .../src/bridge_to_westend_config.rs           |   2 -
 .../bridge-hubs/bridge-hub-rococo/src/lib.rs  |   3 +-
 .../bridge-hub-rococo/src/xcm_config.rs       |  17 +-
 .../bridge-hub-rococo/tests/tests.rs          |  43 +++--
 .../bridge-hubs/bridge-hub-westend/Cargo.toml |   1 -
 .../src/bridge_to_rococo_config.rs            |   2 -
 .../bridge-hubs/bridge-hub-westend/src/lib.rs |   3 +-
 .../bridge-hub-westend/tests/tests.rs         |  19 ++-
 .../src/test_cases/from_grandpa_chain.rs      |  32 ++--
 .../src/test_cases/from_parachain.rs          |  34 ++--
 .../test-utils/src/test_cases/helpers.rs      |   4 +
 .../test-utils/src/test_cases/mod.rs          |  10 +-
 .../src/test_data/from_grandpa_chain.rs       |   8 +-
 .../src/test_data/from_parachain.rs           |   4 +-
 .../test-utils/src/test_data/mod.rs           |  18 +--
 24 files changed, 284 insertions(+), 147 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index bb4636f8965..630503f6041 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2171,7 +2171,6 @@ dependencies = [
  "staging-xcm",
  "staging-xcm-builder",
  "staging-xcm-executor",
- "static_assertions",
  "substrate-wasm-builder",
  "testnet-parachains-constants",
  "xcm-runtime-apis",
@@ -2329,7 +2328,6 @@ dependencies = [
  "staging-xcm",
  "staging-xcm-builder",
  "staging-xcm-executor",
- "static_assertions",
  "substrate-wasm-builder",
  "testnet-parachains-constants",
  "westend-runtime-constants",
@@ -11989,6 +11987,7 @@ dependencies = [
  "log",
  "pallet-balances",
  "pallet-bridge-messages",
+ "pallet-xcm-bridge-hub-router",
  "parity-scale-codec",
  "scale-info",
  "sp-core",
diff --git a/bridges/bin/runtime-common/src/integrity.rs b/bridges/bin/runtime-common/src/integrity.rs
index f661db8a220..a0a9367dd14 100644
--- a/bridges/bin/runtime-common/src/integrity.rs
+++ b/bridges/bin/runtime-common/src/integrity.rs
@@ -27,17 +27,25 @@ use frame_support::{storage::generator::StorageValue, traits::Get, weights::Weig
 use frame_system::limits;
 use pallet_bridge_messages::WeightInfoExt as _;
 
+// Re-export to avoid include all dependencies everywhere.
+#[doc(hidden)]
+pub mod __private {
+	pub use bp_xcm_bridge_hub;
+	pub use static_assertions;
+}
+
 /// Macro that ensures that the runtime configuration and chain primitives crate are sharing
 /// the same types (nonce, block number, hash, hasher, account id and header).
 #[macro_export]
 macro_rules! assert_chain_types(
 	( runtime: $r:path, this_chain: $this:path ) => {
 		{
+			use frame_system::{Config as SystemConfig, pallet_prelude::{BlockNumberFor, HeaderFor}};
+			use $crate::integrity::__private::static_assertions::assert_type_eq_all;
+
 			// if one of asserts fail, then either bridge isn't configured properly (or alternatively - non-standard
 			// configuration is used), or something has broke existing configuration (meaning that all bridged chains
 			// and relays will stop functioning)
-			use frame_system::{Config as SystemConfig, pallet_prelude::{BlockNumberFor, HeaderFor}};
-			use static_assertions::assert_type_eq_all;
 
 			assert_type_eq_all!(<$r as SystemConfig>::Nonce, bp_runtime::NonceOf<$this>);
 			assert_type_eq_all!(BlockNumberFor<$r>, bp_runtime::BlockNumberOf<$this>);
@@ -60,14 +68,15 @@ macro_rules! assert_bridge_messages_pallet_types(
 		bridged_chain: $bridged:path,
 	) => {
 		{
-			// if one of asserts fail, then either bridge isn't configured properly (or alternatively - non-standard
-			// configuration is used), or something has broke existing configuration (meaning that all bridged chains
-			// and relays will stop functioning)
 			use $crate::messages_xcm_extension::XcmAsPlainPayload;
+			use $crate::integrity::__private::static_assertions::assert_type_eq_all;
 			use bp_messages::ChainWithMessages;
 			use bp_runtime::Chain;
 			use pallet_bridge_messages::Config as MessagesConfig;
-			use static_assertions::assert_type_eq_all;
+
+			// if one of asserts fail, then either bridge isn't configured properly (or alternatively - non-standard
+			// configuration is used), or something has broke existing configuration (meaning that all bridged chains
+			// and relays will stop functioning)
 
 			assert_type_eq_all!(<$r as MessagesConfig<$i>>::ThisChain, $this);
 			assert_type_eq_all!(<$r as MessagesConfig<$i>>::BridgedChain, $bridged);
diff --git a/bridges/modules/messages/src/proofs.rs b/bridges/modules/messages/src/proofs.rs
index 18367029d72..a3318833fa6 100644
--- a/bridges/modules/messages/src/proofs.rs
+++ b/bridges/modules/messages/src/proofs.rs
@@ -63,7 +63,7 @@ pub fn verify_messages_proof<T: Config<I>, I: 'static>(
 	let nonces_range = nonces_start..=nonces_end;
 
 	// receiving proofs where end < begin is ok (if proof includes outbound lane state)
-	let messages_in_the_proof = nonces_range.checked_len().unwrap_or(0);
+	let messages_in_the_proof = nonces_range.saturating_len();
 	if messages_in_the_proof != MessageNonce::from(messages_count) {
 		return Err(VerificationError::MessagesCountMismatch)
 	}
diff --git a/bridges/modules/messages/src/tests/mock.rs b/bridges/modules/messages/src/tests/mock.rs
index ffdd536830b..99da019dc08 100644
--- a/bridges/modules/messages/src/tests/mock.rs
+++ b/bridges/modules/messages/src/tests/mock.rs
@@ -225,7 +225,7 @@ impl crate::benchmarking::Config<()> for TestRuntime {
 		use bp_runtime::RangeInclusiveExt;
 
 		let dispatch_weight =
-			REGULAR_PAYLOAD.declared_weight * params.message_nonces.checked_len().unwrap_or(0);
+			REGULAR_PAYLOAD.declared_weight * params.message_nonces.saturating_len();
 		(
 			*prepare_messages_proof(
 				params.message_nonces.into_iter().map(|n| message(n, REGULAR_PAYLOAD)).collect(),
diff --git a/bridges/modules/xcm-bridge-hub/Cargo.toml b/bridges/modules/xcm-bridge-hub/Cargo.toml
index 092df477265..8fbf61a0a53 100644
--- a/bridges/modules/xcm-bridge-hub/Cargo.toml
+++ b/bridges/modules/xcm-bridge-hub/Cargo.toml
@@ -38,6 +38,8 @@ xcm-executor = { workspace = true }
 bp-header-chain = { workspace = true, default-features = true }
 pallet-balances = { workspace = true, default-features = true }
 sp-io = { workspace = true, default-features = true }
+bp-runtime = { features = ["test-helpers"], workspace = true }
+pallet-xcm-bridge-hub-router = { workspace = true }
 
 [features]
 default = ["std"]
@@ -51,6 +53,7 @@ std = [
 	"frame-system/std",
 	"log/std",
 	"pallet-bridge-messages/std",
+	"pallet-xcm-bridge-hub-router/std",
 	"scale-info/std",
 	"sp-core/std",
 	"sp-runtime/std",
@@ -65,6 +68,7 @@ runtime-benchmarks = [
 	"frame-system/runtime-benchmarks",
 	"pallet-balances/runtime-benchmarks",
 	"pallet-bridge-messages/runtime-benchmarks",
+	"pallet-xcm-bridge-hub-router/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
@@ -74,5 +78,6 @@ try-runtime = [
 	"frame-system/try-runtime",
 	"pallet-balances/try-runtime",
 	"pallet-bridge-messages/try-runtime",
+	"pallet-xcm-bridge-hub-router/try-runtime",
 	"sp-runtime/try-runtime",
 ]
diff --git a/bridges/modules/xcm-bridge-hub/src/exporter.rs b/bridges/modules/xcm-bridge-hub/src/exporter.rs
index 94ec8b5f106..5bca3ad8e27 100644
--- a/bridges/modules/xcm-bridge-hub/src/exporter.rs
+++ b/bridges/modules/xcm-bridge-hub/src/exporter.rs
@@ -131,6 +131,7 @@ impl HaulBlob for DummyHaulBlob {
 mod tests {
 	use super::*;
 	use crate::mock::*;
+	use bp_runtime::RangeInclusiveExt;
 	use frame_support::assert_ok;
 	use xcm_executor::traits::export_xcm;
 
@@ -138,8 +139,8 @@ mod tests {
 		[GlobalConsensus(RelayNetwork::get()), Parachain(SIBLING_ASSET_HUB_ID)].into()
 	}
 
-	fn universal_destination() -> InteriorLocation {
-		BridgedDestination::get()
+	fn bridged_relative_destination() -> InteriorLocation {
+		BridgedRelativeDestination::get()
 	}
 
 	#[test]
@@ -149,7 +150,7 @@ mod tests {
 				BridgedRelayNetwork::get(),
 				0,
 				universal_source(),
-				universal_destination(),
+				bridged_relative_destination(),
 				vec![Instruction::ClearOrigin].into(),
 			));
 		})
@@ -163,7 +164,7 @@ mod tests {
 					BridgedRelayNetwork::get(),
 					0,
 					&mut None,
-					&mut Some(universal_destination()),
+					&mut Some(bridged_relative_destination()),
 					&mut Some(Vec::new().into()),
 				),
 				Err(SendError::MissingArgument),
@@ -192,7 +193,7 @@ mod tests {
 					BridgedRelayNetwork::get(),
 					0,
 					&mut Some(universal_source()),
-					&mut Some(universal_destination()),
+					&mut Some(bridged_relative_destination()),
 					&mut Some(Vec::new().into()),
 				)
 				.unwrap()
@@ -203,4 +204,37 @@ mod tests {
 			);
 		})
 	}
+
+	#[test]
+	fn exporter_is_compatible_with_pallet_xcm_bridge_hub_router() {
+		run_test(|| {
+			// valid routable destination
+			let dest = Location::new(2, BridgedUniversalDestination::get());
+			let expected_lane_id = TEST_LANE_ID;
+
+			// check before - no messages
+			assert_eq!(
+				pallet_bridge_messages::Pallet::<TestRuntime, ()>::outbound_lane_data(
+					expected_lane_id
+				)
+				.queued_messages()
+				.saturating_len(),
+				0
+			);
+
+			// send `ExportMessage(message)` by `pallet_xcm_bridge_hub_router`.
+			TestExportXcmWithXcmOverBridge::set_origin_for_execute(SiblingLocation::get());
+			assert_ok!(send_xcm::<XcmOverBridgeRouter>(dest, Xcm::<()>::default()));
+
+			// check after - a message ready to be relayed
+			assert_eq!(
+				pallet_bridge_messages::Pallet::<TestRuntime, ()>::outbound_lane_data(
+					expected_lane_id
+				)
+				.queued_messages()
+				.saturating_len(),
+				1
+			);
+		})
+	}
 }
diff --git a/bridges/modules/xcm-bridge-hub/src/mock.rs b/bridges/modules/xcm-bridge-hub/src/mock.rs
index df72e7a3c4f..0cca32ba9e5 100644
--- a/bridges/modules/xcm-bridge-hub/src/mock.rs
+++ b/bridges/modules/xcm-bridge-hub/src/mock.rs
@@ -25,14 +25,24 @@ use bp_messages::{
 use bp_runtime::{messages::MessageDispatchResult, Chain, ChainId, HashOf};
 use bridge_runtime_common::messages_xcm_extension::{SenderAndLane, XcmBlobHauler};
 use codec::Encode;
-use frame_support::{derive_impl, parameter_types, weights::RuntimeDbWeight};
+use frame_support::{
+	assert_ok, derive_impl, parameter_types,
+	traits::{Everything, NeverEnsureOrigin},
+	weights::RuntimeDbWeight,
+};
 use sp_core::H256;
 use sp_runtime::{
 	testing::Header as SubstrateHeader,
-	traits::{BlakeTwo256, IdentityLookup},
+	traits::{BlakeTwo256, ConstU128, ConstU32, IdentityLookup},
 	AccountId32, BuildStorage, StateVersion,
 };
+use sp_std::cell::RefCell;
 use xcm::prelude::*;
+use xcm_builder::{
+	AllowUnpaidExecutionFrom, FixedWeightBounds, InspectMessageQueues, NetworkExportTable,
+	NetworkExportTableItem,
+};
+use xcm_executor::XcmExecutor;
 
 pub type AccountId = AccountId32;
 pub type Balance = u64;
@@ -50,6 +60,7 @@ frame_support::construct_runtime! {
 		Balances: pallet_balances::{Pallet, Event<T>},
 		Messages: pallet_bridge_messages::{Pallet, Call, Event<T>},
 		XcmOverBridge: pallet_xcm_bridge_hub::{Pallet},
+		XcmOverBridgeRouter: pallet_xcm_bridge_hub_router,
 	}
 }
 
@@ -137,15 +148,34 @@ impl pallet_bridge_messages::WeightInfoExt for TestMessagesWeights {
 
 parameter_types! {
 	pub const RelayNetwork: NetworkId = NetworkId::Kusama;
-	pub const BridgedRelayNetwork: NetworkId = NetworkId::Polkadot;
-	pub BridgedRelayNetworkLocation: Location = (Parent, GlobalConsensus(BridgedRelayNetwork::get())).into();
-	pub const NonBridgedRelayNetwork: NetworkId = NetworkId::Rococo;
-	pub const BridgeReserve: Balance = 100_000;
 	pub UniversalLocation: InteriorLocation = [
 		GlobalConsensus(RelayNetwork::get()),
 		Parachain(THIS_BRIDGE_HUB_ID),
 	].into();
+	pub SiblingLocation: Location = Location::new(1, [Parachain(SIBLING_ASSET_HUB_ID)]);
+
+	pub const BridgedRelayNetwork: NetworkId = NetworkId::Polkadot;
+	pub BridgedRelayNetworkLocation: Location = (Parent, GlobalConsensus(BridgedRelayNetwork::get())).into();
+	pub BridgedRelativeDestination: InteriorLocation = [Parachain(BRIDGED_ASSET_HUB_ID)].into();
+	pub BridgedUniversalDestination: InteriorLocation = [GlobalConsensus(BridgedRelayNetwork::get()), Parachain(BRIDGED_ASSET_HUB_ID)].into();
+	pub const NonBridgedRelayNetwork: NetworkId = NetworkId::Rococo;
+
+	pub const BridgeDeposit: Balance = 100_000;
 	pub const Penalty: Balance = 1_000;
+
+	// configuration for pallet_xcm_bridge_hub_router
+	pub BridgeHubLocation: Location = Here.into();
+	pub BridgeFeeAsset: AssetId = Location::here().into();
+	pub BridgeTable: Vec<NetworkExportTableItem>
+		= vec![
+			NetworkExportTableItem::new(
+				BridgedRelayNetwork::get(),
+				None,
+				BridgeHubLocation::get(),
+				None
+			)
+		];
+	pub UnitWeightCost: Weight = Weight::from_parts(10, 10);
 }
 
 impl pallet_xcm_bridge_hub::Config for TestRuntime {
@@ -160,16 +190,114 @@ impl pallet_xcm_bridge_hub::Config for TestRuntime {
 	type LanesSupport = TestXcmBlobHauler;
 }
 
+impl pallet_xcm_bridge_hub_router::Config<()> for TestRuntime {
+	type WeightInfo = ();
+
+	type UniversalLocation = UniversalLocation;
+	type BridgedNetworkId = BridgedRelayNetwork;
+	type Bridges = NetworkExportTable<BridgeTable>;
+	type DestinationVersion = AlwaysLatest;
+
+	type BridgeHubOrigin = NeverEnsureOrigin<AccountId>;
+	type ToBridgeHubSender = TestExportXcmWithXcmOverBridge;
+
+	type ByteFee = ConstU128<0>;
+	type FeeAsset = BridgeFeeAsset;
+
+	type WithBridgeHubChannel = ();
+}
+
+pub struct XcmConfig;
+impl xcm_executor::Config for XcmConfig {
+	type RuntimeCall = RuntimeCall;
+	type XcmSender = ();
+	type AssetTransactor = ();
+	type OriginConverter = ();
+	type IsReserve = ();
+	type IsTeleporter = ();
+	type UniversalLocation = UniversalLocation;
+	type Barrier = AllowUnpaidExecutionFrom<Everything>;
+	type Weigher = FixedWeightBounds<UnitWeightCost, RuntimeCall, ConstU32<100>>;
+	type Trader = ();
+	type ResponseHandler = ();
+	type AssetTrap = ();
+	type AssetClaims = ();
+	type SubscriptionService = ();
+	type PalletInstancesInfo = ();
+	type MaxAssetsIntoHolding = ();
+	type AssetLocker = ();
+	type AssetExchanger = ();
+	type FeeManager = ();
+	// We just set `MessageExporter` as our `pallet_xcm_bridge_hub` instance.
+	type MessageExporter = (XcmOverBridge,);
+	type UniversalAliases = ();
+	type CallDispatcher = RuntimeCall;
+	type SafeCallFilter = Everything;
+	type Aliasers = ();
+	type TransactionalProcessor = ();
+	type HrmpNewChannelOpenRequestHandler = ();
+	type HrmpChannelAcceptedHandler = ();
+	type HrmpChannelClosingHandler = ();
+	type XcmRecorder = ();
+}
+
+thread_local! {
+	pub static EXECUTE_XCM_ORIGIN: RefCell<Option<Location>> = RefCell::new(None);
+}
+
+/// The `SendXcm` implementation directly executes XCM using `XcmExecutor`.
+///
+/// We ensure that the `ExportMessage` produced by `pallet_xcm_bridge_hub_router` is compatible with
+/// the `ExportXcm` implementation of `pallet_xcm_bridge_hub`.
+///
+/// Note: The crucial part is that `ExportMessage` is processed by `XcmExecutor`, which calls the
+/// `ExportXcm` implementation of `pallet_xcm_bridge_hub` as `MessageExporter`.
+pub struct TestExportXcmWithXcmOverBridge;
+impl SendXcm for TestExportXcmWithXcmOverBridge {
+	type Ticket = Xcm<()>;
+
+	fn validate(
+		_: &mut Option<Location>,
+		message: &mut Option<Xcm<()>>,
+	) -> SendResult<Self::Ticket> {
+		Ok((message.take().unwrap(), Assets::new()))
+	}
+
+	fn deliver(ticket: Self::Ticket) -> Result<XcmHash, SendError> {
+		let xcm: Xcm<RuntimeCall> = ticket.into();
+
+		let origin = EXECUTE_XCM_ORIGIN.with(|o| o.borrow().clone().unwrap());
+		let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256);
+		let outcome = XcmExecutor::<XcmConfig>::prepare_and_execute(
+			origin,
+			xcm,
+			&mut hash,
+			Weight::MAX,
+			Weight::zero(),
+		);
+		assert_ok!(outcome.ensure_complete());
+
+		Ok(hash)
+	}
+}
+impl InspectMessageQueues for TestExportXcmWithXcmOverBridge {
+	fn get_messages() -> Vec<(VersionedLocation, Vec<VersionedXcm<()>>)> {
+		todo!()
+	}
+}
+impl TestExportXcmWithXcmOverBridge {
+	pub fn set_origin_for_execute(origin: Location) {
+		EXECUTE_XCM_ORIGIN.with(|o| *o.borrow_mut() = Some(origin));
+	}
+}
+
 parameter_types! {
 	pub TestSenderAndLane: SenderAndLane = SenderAndLane {
-		location: Location::new(1, [Parachain(SIBLING_ASSET_HUB_ID)]),
+		location: SiblingLocation::get(),
 		lane: TEST_LANE_ID,
 	};
-	pub BridgedDestination: InteriorLocation = [
-		Parachain(BRIDGED_ASSET_HUB_ID)
-	].into();
 	pub TestLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = sp_std::vec![
-		(TestSenderAndLane::get(), (BridgedRelayNetwork::get(), BridgedDestination::get()))
+		(TestSenderAndLane::get(), (BridgedRelayNetwork::get(), BridgedRelativeDestination::get()))
 	];
 }
 
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml
index 98737298468..7a60a3f6484 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml
@@ -121,7 +121,6 @@ snowbridge-runtime-common = { workspace = true }
 bridge-hub-common = { workspace = true }
 
 [dev-dependencies]
-static_assertions = { workspace = true, default-features = true }
 bridge-hub-test-utils = { workspace = true, default-features = true }
 bridge-runtime-common = { features = [
 	"integrity-test",
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs
index d97e6a1d88e..83b92918dc4 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs
@@ -28,7 +28,6 @@ use bp_messages::{
 	source_chain::FromBridgedChainMessagesDeliveryProof,
 	target_chain::FromBridgedChainMessagesProof, LaneId,
 };
-use bp_runtime::Chain;
 use bridge_runtime_common::{
 	extensions::refund_relayer_extension::{
 		ActualFeeRefund, RefundBridgedMessages, RefundSignedExtensionAdapter,
@@ -48,8 +47,6 @@ use xcm::{
 use xcm_builder::BridgeBlobDispatcher;
 
 parameter_types! {
-	/// Bridge specific chain (network) identifier of the Rococo Bulletin Chain.
-	pub const RococoBulletinChainId: bp_runtime::ChainId = bp_polkadot_bulletin::PolkadotBulletin::ID;
 	/// Interior location (relative to this runtime) of the with-RococoBulletin messages pallet.
 	pub BridgeRococoToRococoBulletinMessagesPalletInstance: InteriorLocation = [
 		PalletInstance(<BridgeRococoBulletinMessages as PalletInfoAccess>::index() as u8)
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs
index fe854e20c24..9880e8a17c2 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs
@@ -26,7 +26,6 @@ use bp_messages::{
 	source_chain::FromBridgedChainMessagesDeliveryProof,
 	target_chain::FromBridgedChainMessagesProof, LaneId,
 };
-use bp_runtime::Chain;
 use bridge_runtime_common::{
 	extensions::refund_relayer_extension::{
 		ActualFeeRefund, RefundBridgedMessages, RefundSignedExtensionAdapter,
@@ -47,7 +46,6 @@ use xcm::{
 use xcm_builder::BridgeBlobDispatcher;
 
 parameter_types! {
-	pub const BridgeHubWestendChainId: bp_runtime::ChainId = bp_bridge_hub_westend::BridgeHubWestend::ID;
 	pub BridgeRococoToWestendMessagesPalletInstance: InteriorLocation = [PalletInstance(<BridgeWestendMessages as PalletInfoAccess>::index() as u8)].into();
 	pub WestendGlobalConsensusNetwork: NetworkId = NetworkId::Westend;
 	pub WestendGlobalConsensusNetworkLocation: Location = Location::new(
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs
index 512c1199f43..062996ad411 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs
@@ -1416,7 +1416,8 @@ impl_runtime_apis! {
 			impl BridgeMessagesConfig<bridge_to_westend_config::WithBridgeHubWestendMessagesInstance> for Runtime {
 				fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool {
 					let bench_lane_id = <Self as BridgeMessagesConfig<bridge_to_westend_config::WithBridgeHubWestendMessagesInstance>>::bench_lane_id();
-					let bridged_chain_id = bridge_to_westend_config::BridgeHubWestendChainId::get();
+					use bp_runtime::Chain;
+					let bridged_chain_id =<Self as pallet_bridge_messages::Config<bridge_to_westend_config::WithBridgeHubWestendMessagesInstance>>::BridgedChain::ID;
 					pallet_bridge_relayers::Pallet::<Runtime>::relayer_reward(
 						relayer,
 						bp_relayers::RewardsAccountParams::new(
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs
index 2f11b4694e3..8c077470ba1 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs
@@ -21,7 +21,6 @@ use super::{
 };
 use bp_messages::LaneId;
 use bp_relayers::{PayRewardFromAccount, RewardsAccountOwner, RewardsAccountParams};
-use bp_runtime::ChainId;
 use core::marker::PhantomData;
 use frame_support::{
 	parameter_types,
@@ -212,7 +211,7 @@ impl xcm_executor::Config for XcmConfig {
 				Self::AssetTransactor,
 				crate::bridge_to_westend_config::WestendGlobalConsensusNetwork,
 				crate::bridge_to_westend_config::AssetHubWestendParaId,
-				crate::bridge_to_westend_config::BridgeHubWestendChainId,
+				bp_bridge_hub_westend::BridgeHubWestend,
 				crate::bridge_to_westend_config::AssetHubRococoToAssetHubWestendMessagesLane,
 			>,
 			XcmExportFeeToSibling<
@@ -302,22 +301,22 @@ pub struct XcmExportFeeToRelayerRewardAccounts<
 	AssetTransactor,
 	DestNetwork,
 	DestParaId,
-	DestBridgedChainId,
+	DestBridgedChain,
 	BridgeLaneId,
->(PhantomData<(AssetTransactor, DestNetwork, DestParaId, DestBridgedChainId, BridgeLaneId)>);
+>(PhantomData<(AssetTransactor, DestNetwork, DestParaId, DestBridgedChain, BridgeLaneId)>);
 
 impl<
 		AssetTransactor: TransactAsset,
 		DestNetwork: Get<NetworkId>,
 		DestParaId: Get<cumulus_primitives_core::ParaId>,
-		DestBridgedChainId: Get<ChainId>,
+		DestBridgedChain: bp_runtime::Chain,
 		BridgeLaneId: Get<LaneId>,
 	> HandleFee
 	for XcmExportFeeToRelayerRewardAccounts<
 		AssetTransactor,
 		DestNetwork,
 		DestParaId,
-		DestBridgedChainId,
+		DestBridgedChain,
 		BridgeLaneId,
 	>
 {
@@ -326,6 +325,8 @@ impl<
 				if bridged_network == DestNetwork::get() &&
 					destination == [Parachain(DestParaId::get().into())])
 		{
+			let bridged_chain_id = DestBridgedChain::ID;
+
 			// We have 2 relayer rewards accounts:
 			// - the SA of the source parachain on this BH: this pays the relayers for delivering
 			//   Source para -> Target Para message delivery confirmations
@@ -337,7 +338,7 @@ impl<
 				AccountId,
 			>::rewards_account(RewardsAccountParams::new(
 				BridgeLaneId::get(),
-				DestBridgedChainId::get(),
+				bridged_chain_id,
 				RewardsAccountOwner::ThisChain,
 			));
 
@@ -346,7 +347,7 @@ impl<
 				AccountId,
 			>::rewards_account(RewardsAccountParams::new(
 				BridgeLaneId::get(),
-				DestBridgedChainId::get(),
+				bridged_chain_id,
 				RewardsAccountOwner::BridgedChain,
 			));
 
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs
index 1d3d9e55f7e..ca0d89f038c 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs
@@ -147,7 +147,7 @@ mod bridge_hub_westend_tests {
 	};
 	use bridge_hub_test_utils::test_cases::from_parachain;
 	use bridge_to_westend_config::{
-		BridgeHubWestendChainId, BridgeHubWestendLocation, WestendGlobalConsensusNetwork,
+		BridgeHubWestendLocation, WestendGlobalConsensusNetwork,
 		WithBridgeHubWestendMessagesInstance, XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND,
 	};
 
@@ -313,11 +313,14 @@ mod bridge_hub_westend_tests {
 				}
 			}),
 			|| ExportMessage { network: Westend, destination: [Parachain(bridge_to_westend_config::AssetHubWestendParaId::get().into())].into(), xcm: Xcm(vec![]) },
-			XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND,
 			Some((TokenLocation::get(), ExistentialDeposit::get()).into()),
 			// value should be >= than value generated by `can_calculate_weight_for_paid_export_message_with_reserve_transfer`
 			Some((TokenLocation::get(), bp_bridge_hub_rococo::BridgeHubRococoBaseXcmFeeInRocs::get()).into()),
-			|| PolkadotXcm::force_xcm_version(RuntimeOrigin::root(), Box::new(BridgeHubWestendLocation::get()), XCM_VERSION).expect("version saved!"),
+			|| {
+				PolkadotXcm::force_xcm_version(RuntimeOrigin::root(), Box::new(BridgeHubWestendLocation::get()), XCM_VERSION).expect("version saved!");
+
+				XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND
+			},
 		)
 	}
 
@@ -350,8 +353,7 @@ mod bridge_hub_westend_tests {
 					_ => None,
 				}
 			}),
-			XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND,
-			|| (),
+			|| XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND,
 		)
 	}
 
@@ -363,11 +365,9 @@ mod bridge_hub_westend_tests {
 			slot_durations(),
 			bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID,
 			bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID,
-			BridgeHubWestendChainId::get(),
 			SIBLING_PARACHAIN_ID,
 			Rococo,
-			XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND,
-			|| (),
+			|| XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND,
 			construct_and_apply_extrinsic,
 		)
 	}
@@ -380,11 +380,9 @@ mod bridge_hub_westend_tests {
 			slot_durations(),
 			bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID,
 			bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID,
-			BridgeHubWestendChainId::get(),
 			SIBLING_PARACHAIN_ID,
 			Rococo,
-			XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND,
-			|| (),
+			|| XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND,
 			construct_and_apply_extrinsic,
 		)
 	}
@@ -454,9 +452,8 @@ mod bridge_hub_bulletin_tests {
 	use bridge_common_config::BridgeGrandpaRococoBulletinInstance;
 	use bridge_hub_test_utils::test_cases::from_grandpa_chain;
 	use bridge_to_bulletin_config::{
-		RococoBulletinChainId, RococoBulletinGlobalConsensusNetwork,
-		RococoBulletinGlobalConsensusNetworkLocation, WithRococoBulletinMessagesInstance,
-		XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN,
+		RococoBulletinGlobalConsensusNetwork, RococoBulletinGlobalConsensusNetworkLocation,
+		WithRococoBulletinMessagesInstance, XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN,
 	};
 
 	// Para id of sibling chain used in tests.
@@ -519,10 +516,13 @@ mod bridge_hub_bulletin_tests {
 				destination: Here,
 				xcm: Xcm(vec![]),
 			},
-			XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN,
 			Some((TokenLocation::get(), ExistentialDeposit::get()).into()),
 			None,
-			|| PolkadotXcm::force_xcm_version(RuntimeOrigin::root(), Box::new(RococoBulletinGlobalConsensusNetworkLocation::get()), XCM_VERSION).expect("version saved!"),
+			|| {
+				PolkadotXcm::force_xcm_version(RuntimeOrigin::root(), Box::new(RococoBulletinGlobalConsensusNetworkLocation::get()), XCM_VERSION).expect("version saved!");
+
+				XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN
+			},
 		)
 	}
 
@@ -555,8 +555,7 @@ mod bridge_hub_bulletin_tests {
 					_ => None,
 				}
 			}),
-			XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN,
-			|| (),
+			|| XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN,
 		)
 	}
 
@@ -567,11 +566,9 @@ mod bridge_hub_bulletin_tests {
 			collator_session_keys(),
 			slot_durations(),
 			bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID,
-			RococoBulletinChainId::get(),
 			SIBLING_PARACHAIN_ID,
 			Rococo,
-			XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN,
-			|| (),
+			|| XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN,
 			construct_and_apply_extrinsic,
 		)
 	}
@@ -583,11 +580,9 @@ mod bridge_hub_bulletin_tests {
 			collator_session_keys(),
 			slot_durations(),
 			bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID,
-			RococoBulletinChainId::get(),
 			SIBLING_PARACHAIN_ID,
 			Rococo,
-			XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN,
-			|| (),
+			|| XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN,
 			construct_and_apply_extrinsic,
 		)
 	}
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml
index e2671d3d606..4326cbf926d 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml
@@ -101,7 +101,6 @@ bridge-runtime-common = { workspace = true }
 bridge-hub-common = { workspace = true }
 
 [dev-dependencies]
-static_assertions = { workspace = true, default-features = true }
 bridge-hub-test-utils = { workspace = true, default-features = true }
 bridge-runtime-common = { features = ["integrity-test"], workspace = true, default-features = true }
 sp-keyring = { workspace = true, default-features = true }
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs
index 42d5ef3eebd..be4d40c2275 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs
@@ -25,7 +25,6 @@ use bp_messages::{
 	target_chain::FromBridgedChainMessagesProof, LaneId,
 };
 use bp_parachains::SingleParaStoredHeaderDataBuilder;
-use bp_runtime::Chain;
 use bridge_runtime_common::{
 	extensions::refund_relayer_extension::{
 		ActualFeeRefund, RefundBridgedMessages, RefundSignedExtensionAdapter,
@@ -54,7 +53,6 @@ parameter_types! {
 	pub const RococoBridgeParachainPalletName: &'static str = "Paras";
 	pub const MaxRococoParaHeadDataSize: u32 = bp_rococo::MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE;
 
-	pub const BridgeHubRococoChainId: bp_runtime::ChainId = bp_bridge_hub_rococo::BridgeHubRococo::ID;
 	pub BridgeWestendToRococoMessagesPalletInstance: InteriorLocation = [PalletInstance(<BridgeRococoMessages as PalletInfoAccess>::index() as u8)].into();
 	pub RococoGlobalConsensusNetwork: NetworkId = NetworkId::Rococo;
 	pub RococoGlobalConsensusNetworkLocation: Location = Location::new(
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs
index 5d4c35d6610..42c768861bd 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs
@@ -1100,7 +1100,8 @@ impl_runtime_apis! {
 			impl BridgeMessagesConfig<bridge_to_rococo_config::WithBridgeHubRococoMessagesInstance> for Runtime {
 				fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool {
 					let bench_lane_id = <Self as BridgeMessagesConfig<bridge_to_rococo_config::WithBridgeHubRococoMessagesInstance>>::bench_lane_id();
-					let bridged_chain_id = bridge_to_rococo_config::BridgeHubRococoChainId::get();
+					use bp_runtime::Chain;
+					let bridged_chain_id =<Self as pallet_bridge_messages::Config<bridge_to_rococo_config::WithBridgeHubRococoMessagesInstance>>::BridgedChain::ID;
 					pallet_bridge_relayers::Pallet::<Runtime>::relayer_reward(
 						relayer,
 						bp_relayers::RewardsAccountParams::new(
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs
index 763271fd7af..98a789eb4e0 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs
@@ -27,9 +27,8 @@ use bridge_hub_westend_runtime::{
 	SignedExtra, TransactionPayment, UncheckedExtrinsic,
 };
 use bridge_to_rococo_config::{
-	BridgeGrandpaRococoInstance, BridgeHubRococoChainId, BridgeHubRococoLocation,
-	BridgeParachainRococoInstance, WithBridgeHubRococoMessagesInstance,
-	XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO,
+	BridgeGrandpaRococoInstance, BridgeHubRococoLocation, BridgeParachainRococoInstance,
+	WithBridgeHubRococoMessagesInstance, XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO,
 };
 use codec::{Decode, Encode};
 use frame_support::{dispatch::GetDispatchInfo, parameter_types, traits::ConstU8};
@@ -212,11 +211,14 @@ fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() {
 				}
 			}),
 			|| ExportMessage { network: Rococo, destination: [Parachain(bridge_to_rococo_config::AssetHubRococoParaId::get().into())].into(), xcm: Xcm(vec![]) },
-			XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO,
 			Some((WestendLocation::get(), ExistentialDeposit::get()).into()),
 			// value should be >= than value generated by `can_calculate_weight_for_paid_export_message_with_reserve_transfer`
 			Some((WestendLocation::get(), bp_bridge_hub_westend::BridgeHubWestendBaseXcmFeeInWnds::get()).into()),
-			|| PolkadotXcm::force_xcm_version(RuntimeOrigin::root(), Box::new(BridgeHubRococoLocation::get()), XCM_VERSION).expect("version saved!"),
+			|| {
+				PolkadotXcm::force_xcm_version(RuntimeOrigin::root(), Box::new(BridgeHubRococoLocation::get()), XCM_VERSION).expect("version saved!");
+
+				XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO
+			},
 		)
 }
 
@@ -248,8 +250,7 @@ fn message_dispatch_routing_works() {
 				_ => None,
 			}
 		}),
-		XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO,
-		|| (),
+		|| XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO,
 	)
 }
 
@@ -260,11 +261,9 @@ fn relayed_incoming_message_works() {
 		slot_durations(),
 		bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID,
 		bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID,
-		BridgeHubRococoChainId::get(),
 		SIBLING_PARACHAIN_ID,
 		Westend,
-		XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO,
-		|| (),
+		|| XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO,
 		construct_and_apply_extrinsic,
 	)
 }
diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs
index d6dfa93731a..f2f0ccecba1 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs
@@ -94,11 +94,9 @@ pub fn relayed_incoming_message_works<RuntimeHelper>(
 	collator_session_key: CollatorSessionKeys<RuntimeHelper::Runtime>,
 	slot_durations: SlotDurations,
 	runtime_para_id: u32,
-	bridged_chain_id: bp_runtime::ChainId,
 	sibling_parachain_id: u32,
 	local_relay_chain_id: NetworkId,
-	lane_id: LaneId,
-	prepare_configuration: impl Fn(),
+	prepare_configuration: impl Fn() -> LaneId,
 	construct_and_apply_extrinsic: fn(
 		sp_keyring::AccountKeyring,
 		RuntimeCallOf<RuntimeHelper::Runtime>,
@@ -125,10 +123,11 @@ pub fn relayed_incoming_message_works<RuntimeHelper>(
 		 relayer_id_at_bridged_chain,
 		 message_destination,
 		 message_nonce,
-		 xcm| {
+		 xcm,
+		 bridged_chain_id| {
 			let relay_header_number = 5u32.into();
 
-			prepare_configuration();
+			let lane_id = prepare_configuration();
 
 			// start with bridged relay chain block#0
 			helpers::initialize_bridge_grandpa_pallet::<RuntimeHelper::Runtime, RuntimeHelper::GPI>(
@@ -141,7 +140,6 @@ pub fn relayed_incoming_message_works<RuntimeHelper>(
 				test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::<
 					BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 					ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-					(),
 				>(
 					lane_id,
 					xcm.into(),
@@ -197,11 +195,9 @@ pub fn free_relay_extrinsic_works<RuntimeHelper>(
 	collator_session_key: CollatorSessionKeys<RuntimeHelper::Runtime>,
 	slot_durations: SlotDurations,
 	runtime_para_id: u32,
-	bridged_chain_id: bp_runtime::ChainId,
 	sibling_parachain_id: u32,
 	local_relay_chain_id: NetworkId,
-	lane_id: LaneId,
-	prepare_configuration: impl Fn(),
+	prepare_configuration: impl Fn() -> LaneId,
 	construct_and_apply_extrinsic: fn(
 		sp_keyring::AccountKeyring,
 		RuntimeCallOf<RuntimeHelper::Runtime>,
@@ -235,8 +231,9 @@ pub fn free_relay_extrinsic_works<RuntimeHelper>(
 		 relayer_id_at_bridged_chain,
 		 message_destination,
 		 message_nonce,
-		 xcm| {
-			prepare_configuration();
+		 xcm,
+		 bridged_chain_id| {
+			let lane_id = prepare_configuration();
 
 			// start with bridged relay chain block#0
 			let initial_block_number = 0;
@@ -266,7 +263,6 @@ pub fn free_relay_extrinsic_works<RuntimeHelper>(
 				test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::<
 					BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 					ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-					(),
 				>(
 					lane_id,
 					xcm.into(),
@@ -328,10 +324,8 @@ pub fn complex_relay_extrinsic_works<RuntimeHelper>(
 	slot_durations: SlotDurations,
 	runtime_para_id: u32,
 	sibling_parachain_id: u32,
-	bridged_chain_id: bp_runtime::ChainId,
 	local_relay_chain_id: NetworkId,
-	lane_id: LaneId,
-	prepare_configuration: impl Fn(),
+	prepare_configuration: impl Fn() -> LaneId,
 	construct_and_apply_extrinsic: fn(
 		sp_keyring::AccountKeyring,
 		RuntimeCallOf<RuntimeHelper::Runtime>,
@@ -361,10 +355,11 @@ pub fn complex_relay_extrinsic_works<RuntimeHelper>(
 		 relayer_id_at_bridged_chain,
 		 message_destination,
 		 message_nonce,
-		 xcm| {
+		 xcm,
+		 bridged_chain_id| {
 			let relay_header_number = 1u32.into();
 
-			prepare_configuration();
+			let lane_id = prepare_configuration();
 
 			// start with bridged relay chain block#0
 			helpers::initialize_bridge_grandpa_pallet::<RuntimeHelper::Runtime, RuntimeHelper::GPI>(
@@ -377,7 +372,6 @@ pub fn complex_relay_extrinsic_works<RuntimeHelper>(
 				test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::<
 					BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 					ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-					(),
 				>(
 					lane_id,
 					xcm.into(),
@@ -452,7 +446,6 @@ where
 			test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::<
 				BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 				ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-				(),
 			>(
 				LaneId::default(),
 				vec![Instruction::<()>::ClearOrigin; 1_024].into(),
@@ -557,7 +550,6 @@ where
 			test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::<
 				BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 				ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-				(),
 			>(
 				LaneId::default(),
 				vec![Instruction::<()>::ClearOrigin; 1_024].into(),
diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs
index 728b4e76b10..0988528c3f2 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs
@@ -104,11 +104,9 @@ pub fn relayed_incoming_message_works<RuntimeHelper>(
 	slot_durations: SlotDurations,
 	runtime_para_id: u32,
 	bridged_para_id: u32,
-	bridged_chain_id: bp_runtime::ChainId,
 	sibling_parachain_id: u32,
 	local_relay_chain_id: NetworkId,
-	lane_id: LaneId,
-	prepare_configuration: impl Fn(),
+	prepare_configuration: impl Fn() -> LaneId,
 	construct_and_apply_extrinsic: fn(
 		sp_keyring::AccountKeyring,
 		<RuntimeHelper::Runtime as frame_system::Config>::RuntimeCall,
@@ -138,11 +136,12 @@ pub fn relayed_incoming_message_works<RuntimeHelper>(
 		 relayer_id_at_bridged_chain,
 		 message_destination,
 		 message_nonce,
-		 xcm| {
+		 xcm,
+		 bridged_chain_id| {
 			let para_header_number = 5;
 			let relay_header_number = 1;
 
-			prepare_configuration();
+			let lane_id = prepare_configuration();
 
 			// start with bridged relay chain block#0
 			helpers::initialize_bridge_grandpa_pallet::<RuntimeHelper::Runtime, RuntimeHelper::GPI>(
@@ -162,7 +161,6 @@ pub fn relayed_incoming_message_works<RuntimeHelper>(
 				<RuntimeHelper::Runtime as BridgeGrandpaConfig<RuntimeHelper::GPI>>::BridgedChain,
 				BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 				ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-				(),
 			>(
 				lane_id,
 				xcm.into(),
@@ -234,11 +232,9 @@ pub fn free_relay_extrinsic_works<RuntimeHelper>(
 	slot_durations: SlotDurations,
 	runtime_para_id: u32,
 	bridged_para_id: u32,
-	bridged_chain_id: bp_runtime::ChainId,
 	sibling_parachain_id: u32,
 	local_relay_chain_id: NetworkId,
-	lane_id: LaneId,
-	prepare_configuration: impl Fn(),
+	prepare_configuration: impl Fn() -> LaneId,
 	construct_and_apply_extrinsic: fn(
 		sp_keyring::AccountKeyring,
 		<RuntimeHelper::Runtime as frame_system::Config>::RuntimeCall,
@@ -275,8 +271,9 @@ pub fn free_relay_extrinsic_works<RuntimeHelper>(
 		 relayer_id_at_bridged_chain,
 		 message_destination,
 		 message_nonce,
-		 xcm| {
-			prepare_configuration();
+		 xcm,
+		 bridged_chain_id| {
+			let lane_id = prepare_configuration();
 
 			// start with bridged relay chain block#0
 			let initial_block_number = 0;
@@ -315,7 +312,6 @@ pub fn free_relay_extrinsic_works<RuntimeHelper>(
 				<RuntimeHelper::Runtime as BridgeGrandpaConfig<RuntimeHelper::GPI>>::BridgedChain,
 				BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 				ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-				(),
 			>(
 				lane_id,
 				xcm.into(),
@@ -399,10 +395,8 @@ pub fn complex_relay_extrinsic_works<RuntimeHelper>(
 	runtime_para_id: u32,
 	bridged_para_id: u32,
 	sibling_parachain_id: u32,
-	bridged_chain_id: bp_runtime::ChainId,
 	local_relay_chain_id: NetworkId,
-	lane_id: LaneId,
-	prepare_configuration: impl Fn(),
+	prepare_configuration: impl Fn() -> LaneId,
 	construct_and_apply_extrinsic: fn(
 		sp_keyring::AccountKeyring,
 		<RuntimeHelper::Runtime as frame_system::Config>::RuntimeCall,
@@ -435,11 +429,12 @@ pub fn complex_relay_extrinsic_works<RuntimeHelper>(
 		 relayer_id_at_bridged_chain,
 		 message_destination,
 		 message_nonce,
-		 xcm| {
+		 xcm,
+		 bridged_chain_id| {
 			let para_header_number = 5;
 			let relay_header_number = 1;
 
-			prepare_configuration();
+			let lane_id = prepare_configuration();
 
 			// start with bridged relay chain block#0
 			helpers::initialize_bridge_grandpa_pallet::<RuntimeHelper::Runtime, RuntimeHelper::GPI>(
@@ -459,7 +454,6 @@ pub fn complex_relay_extrinsic_works<RuntimeHelper>(
 				<RuntimeHelper::Runtime as BridgeGrandpaConfig<RuntimeHelper::GPI>>::BridgedChain,
 				BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 				ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-				(),
 			>(
 				lane_id,
 				xcm.into(),
@@ -557,7 +551,6 @@ where
 			<RuntimeHelper::Runtime as pallet_bridge_grandpa::Config<RuntimeHelper::GPI>>::BridgedChain,
 			BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 			ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-			(),
 		>(
 			LaneId::default(),
 			vec![Instruction::<()>::ClearOrigin; 1_024].into(),
@@ -628,7 +621,6 @@ where
 			<RuntimeHelper::Runtime as BridgeGrandpaConfig<RuntimeHelper::GPI>>::BridgedChain,
 			BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 			ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-			(),
 		>(
 			LaneId::default(),
 			1,
@@ -691,7 +683,6 @@ where
 			<RuntimeHelper::Runtime as pallet_bridge_grandpa::Config<RuntimeHelper::GPI>>::BridgedChain,
 			BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 			ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-			(),
 		>(
 			LaneId::default(),
 			vec![Instruction::<()>::ClearOrigin; 1_024].into(),
@@ -747,7 +738,6 @@ where
 				<RuntimeHelper::Runtime as BridgeGrandpaConfig<RuntimeHelper::GPI>>::BridgedChain,
 				BridgedChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
 				ThisChainOf<RuntimeHelper::Runtime, RuntimeHelper::MPI>,
-				(),
 			>(
 				LaneId::default(),
 				1,
diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs
index 78b8a170f0d..c4b5e5583ba 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs
@@ -22,6 +22,7 @@ use asset_test_utils::BasicParachainRuntime;
 use bp_messages::{LaneId, MessageNonce};
 use bp_polkadot_core::parachains::{ParaHash, ParaId};
 use bp_relayers::RewardsAccountParams;
+use bp_runtime::Chain;
 use codec::Decode;
 use core::marker::PhantomData;
 use frame_support::{
@@ -267,6 +268,7 @@ pub fn relayed_incoming_message_works<Runtime, AllPalletsWithoutSystem, MPI>(
 		InteriorLocation,
 		MessageNonce,
 		Xcm<()>,
+		bp_runtime::ChainId,
 	) -> CallsAndVerifiers<Runtime>,
 ) where
 	Runtime: BasicParachainRuntime + cumulus_pallet_xcmp_queue::Config + BridgeMessagesConfig<MPI>,
@@ -278,6 +280,7 @@ pub fn relayed_incoming_message_works<Runtime, AllPalletsWithoutSystem, MPI>(
 	let relayer_at_target = Bob;
 	let relayer_id_on_target: AccountId32 = relayer_at_target.public().into();
 	let relayer_id_on_source = relayer_id_at_bridged_chain::<Runtime, MPI>();
+	let bridged_chain_id = Runtime::BridgedChain::ID;
 
 	assert_ne!(runtime_para_id, sibling_parachain_id);
 
@@ -339,6 +342,7 @@ pub fn relayed_incoming_message_works<Runtime, AllPalletsWithoutSystem, MPI>(
 					message_destination,
 					message_nonce,
 					xcm.clone().into(),
+					bridged_chain_id,
 				),
 			);
 
diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs
index bc1c7ec5e03..a36a74dbbbc 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs
@@ -320,10 +320,9 @@ pub fn handle_export_message_from_system_parachain_to_outbound_queue_works<
 		dyn Fn(Vec<u8>) -> Option<pallet_bridge_messages::Event<Runtime, MessagesPalletInstance>>,
 	>,
 	export_message_instruction: fn() -> Instruction<XcmConfig::RuntimeCall>,
-	expected_lane_id: LaneId,
 	existential_deposit: Option<Asset>,
 	maybe_paid_export_message: Option<Asset>,
-	prepare_configuration: impl Fn(),
+	prepare_configuration: impl Fn() -> LaneId,
 ) where
 	Runtime: BasicParachainRuntime + BridgeMessagesConfig<MessagesPalletInstance>,
 	XcmConfig: xcm_executor::Config,
@@ -333,7 +332,7 @@ pub fn handle_export_message_from_system_parachain_to_outbound_queue_works<
 	let sibling_parachain_location = Location::new(1, [Parachain(sibling_parachain_id)]);
 
 	run_test::<Runtime, _>(collator_session_key, runtime_para_id, vec![], || {
-		prepare_configuration();
+		let expected_lane_id = prepare_configuration();
 
 		// check queue before
 		assert_eq!(
@@ -430,8 +429,7 @@ pub fn message_dispatch_routing_works<
 	unwrap_cumulus_pallet_xcmp_queue_event: Box<
 		dyn Fn(Vec<u8>) -> Option<cumulus_pallet_xcmp_queue::Event<Runtime>>,
 	>,
-	expected_lane_id: LaneId,
-	prepare_configuration: impl Fn(),
+	prepare_configuration: impl Fn() -> LaneId,
 ) where
 	Runtime: BasicParachainRuntime
 		+ cumulus_pallet_xcmp_queue::Config
@@ -459,7 +457,7 @@ pub fn message_dispatch_routing_works<
 	assert_ne!(runtime_para_id, sibling_parachain_id);
 
 	run_test::<Runtime, _>(collator_session_key, runtime_para_id, vec![], || {
-		prepare_configuration();
+		let expected_lane_id = prepare_configuration();
 
 		let mut alice = [0u8; 32];
 		alice[0] = 1;
diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs
index c61a31e5454..5c1dc492a9d 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs
@@ -152,13 +152,9 @@ where
 }
 
 /// Prepare storage proofs of messages, stored at the (bridged) source GRANDPA chain.
-pub fn make_complex_relayer_delivery_proofs<
-	BridgedChain,
-	ThisChainWithMessages,
-	InnerXcmRuntimeCall,
->(
+pub fn make_complex_relayer_delivery_proofs<BridgedChain, ThisChainWithMessages>(
 	lane_id: LaneId,
-	xcm_message: Xcm<InnerXcmRuntimeCall>,
+	xcm_message: Xcm<()>,
 	message_nonce: MessageNonce,
 	message_destination: Junctions,
 	header_number: BlockNumberOf<BridgedChain>,
diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs
index 897fe0d0b0f..b99c275bd0d 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs
@@ -195,10 +195,9 @@ pub fn make_complex_relayer_delivery_proofs<
 	BridgedRelayChain,
 	BridgedParachain,
 	ThisChainWithMessages,
-	InnerXcmRuntimeCall,
 >(
 	lane_id: LaneId,
-	xcm_message: Xcm<InnerXcmRuntimeCall>,
+	xcm_message: Xcm<()>,
 	message_nonce: MessageNonce,
 	message_destination: Junctions,
 	para_header_number: u32,
@@ -267,7 +266,6 @@ pub fn make_complex_relayer_confirmation_proofs<
 	BridgedRelayChain,
 	BridgedParachain,
 	ThisChainWithMessages,
-	InnerXcmRuntimeCall,
 >(
 	lane_id: LaneId,
 	para_header_number: u32,
diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs
index ee3fc1ed2c4..106eacd799c 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs
+++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs
@@ -32,20 +32,16 @@ use bp_messages::MessageNonce;
 use bp_runtime::BasicOperatingMode;
 use bp_test_utils::authority_list;
 use xcm::GetVersion;
-use xcm_builder::{HaulBlob, HaulBlobError, HaulBlobExporter};
+use xcm_builder::{BridgeMessage, HaulBlob, HaulBlobError, HaulBlobExporter};
 use xcm_executor::traits::{validate_export, ExportXcm};
 
-pub fn prepare_inbound_xcm<InnerXcmRuntimeCall>(
-	xcm_message: Xcm<InnerXcmRuntimeCall>,
-	destination: InteriorLocation,
-) -> Vec<u8> {
+pub fn prepare_inbound_xcm(xcm_message: Xcm<()>, destination: InteriorLocation) -> Vec<u8> {
 	let location = xcm::VersionedInteriorLocation::from(destination);
-	let xcm = xcm::VersionedXcm::<InnerXcmRuntimeCall>::from(xcm_message);
-	// this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor
-	// or public fields, so just tuple
-	// (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed
-	// to the storage)
-	(location, xcm).encode().encode()
+	let xcm = xcm::VersionedXcm::<()>::from(xcm_message);
+
+	// (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed to the
+	// storage)
+	BridgeMessage { universal_dest: location, message: xcm }.encode().encode()
 }
 
 /// Helper that creates InitializationData mock data, that can be used to initialize bridge
-- 
GitLab