diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs index 77248e72ed..406843a0fe 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs @@ -25,7 +25,7 @@ parameter_types! { pub RemoteUniversalLocation: Junctions = X2(GlobalConsensus(Remote::get()), Parachain(1)); } type TheBridge = - TestBridge>; + TestBridge>; type Router = TestTopic, UniversalLocation>>; diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs index ff2b714718..02c454bb21 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs @@ -25,7 +25,7 @@ parameter_types! { pub RemoteUniversalLocation: Junctions = X1(GlobalConsensus(Remote::get())); } type TheBridge = - TestBridge>; + TestBridge>; type Router = TestTopic, UniversalLocation>>; diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs index 5472a3bd54..2f9bfcc2d8 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs @@ -33,7 +33,7 @@ parameter_types! { // x (10 + 10) weight each). } type TheBridge = - TestBridge>; + TestBridge>; type RelayExporter = HaulBlobExporter; type LocalInnerRouter = ExecutingRouter; type LocalBridgeRouter = SovereignPaidRemoteExporter< diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs index b760e6829e..124a909bc0 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs @@ -27,8 +27,9 @@ parameter_types! { pub BridgeTable: Vec<(NetworkId, MultiLocation, Option)> = vec![(Remote::get(), (Parent, Parachain(1)).into(), None)]; } -type TheBridge = - TestBridge>; +type TheBridge = TestBridge< + BridgeBlobDispatcher, +>; type RelayExporter = HaulBlobExporter; type LocalInnerRouter = UnpaidExecutingRouter; diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs index 9dc94e27e9..2ff1f9fb97 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs @@ -27,8 +27,9 @@ parameter_types! { pub BridgeTable: Vec<(NetworkId, MultiLocation, Option)> = vec![(Remote::get(), Parachain(1).into(), None)]; } -type TheBridge = - TestBridge>; +type TheBridge = TestBridge< + BridgeBlobDispatcher, +>; type RelayExporter = HaulBlobExporter; type LocalInnerRouter = UnpaidExecutingRouter; diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs index 2b34c93c07..cdd6b89b7b 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs @@ -28,7 +28,7 @@ parameter_types! { = vec![(Remote::get(), MultiLocation::parent(), None)]; } type TheBridge = - TestBridge>; + TestBridge>; type RelayExporter = HaulBlobExporter; type LocalInnerRouter = UnpaidExecutingRouter; diff --git a/polkadot/xcm/xcm-builder/src/universal_exports.rs b/polkadot/xcm/xcm-builder/src/universal_exports.rs index 38795042d0..9a65ec7dfe 100644 --- a/polkadot/xcm/xcm-builder/src/universal_exports.rs +++ b/polkadot/xcm/xcm-builder/src/universal_exports.rs @@ -332,9 +332,14 @@ pub enum DispatchBlobError { WrongGlobal, } -pub struct BridgeBlobDispatcher(PhantomData<(Router, OurPlace)>); -impl> DispatchBlob - for BridgeBlobDispatcher +pub struct BridgeBlobDispatcher( + PhantomData<(Router, OurPlace, OurPlaceBridgeInstance)>, +); +impl< + Router: SendXcm, + OurPlace: Get, + OurPlaceBridgeInstance: Get>, + > DispatchBlob for BridgeBlobDispatcher { fn dispatch_blob(blob: Vec) -> Result<(), DispatchBlobError> { let our_universal = OurPlace::get(); @@ -352,8 +357,16 @@ impl> DispatchBlob .map_err(|()| DispatchBlobError::NonUniversalDestination)?; ensure!(intended_global == our_global, DispatchBlobError::WrongGlobal); let dest = universal_dest.relative_to(&our_universal); - let message: Xcm<()> = + let mut message: Xcm<()> = message.try_into().map_err(|_| DispatchBlobError::UnsupportedXcmVersion)?; + + // Prepend our bridge instance discriminator. + // Can be used for fine-grained control of origin on destination in case of multiple bridge instances, + // e.g. restrict `type UniversalAliases` and `UniversalOrigin` instruction to trust just particular bridge instance for `NetworkId`. + if let Some(bridge_instance) = OurPlaceBridgeInstance::get() { + message.0.insert(0, DescendOrigin(bridge_instance)); + } + let _ = send_xcm::(dest, message).map_err(|_| DispatchBlobError::RoutingError)?; Ok(()) }