mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-20 20:55:41 +00:00
[xcm] BridgeBlobDispatcher - prepend bridge instance discriminator. (#7438)
This commit is contained in:
@@ -25,7 +25,7 @@ parameter_types! {
|
|||||||
pub RemoteUniversalLocation: Junctions = X2(GlobalConsensus(Remote::get()), Parachain(1));
|
pub RemoteUniversalLocation: Junctions = X2(GlobalConsensus(Remote::get()), Parachain(1));
|
||||||
}
|
}
|
||||||
type TheBridge =
|
type TheBridge =
|
||||||
TestBridge<BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteUniversalLocation>>;
|
TestBridge<BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteUniversalLocation, ()>>;
|
||||||
type Router =
|
type Router =
|
||||||
TestTopic<UnpaidLocalExporter<HaulBlobExporter<TheBridge, Remote, Price>, UniversalLocation>>;
|
TestTopic<UnpaidLocalExporter<HaulBlobExporter<TheBridge, Remote, Price>, UniversalLocation>>;
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ parameter_types! {
|
|||||||
pub RemoteUniversalLocation: Junctions = X1(GlobalConsensus(Remote::get()));
|
pub RemoteUniversalLocation: Junctions = X1(GlobalConsensus(Remote::get()));
|
||||||
}
|
}
|
||||||
type TheBridge =
|
type TheBridge =
|
||||||
TestBridge<BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteUniversalLocation>>;
|
TestBridge<BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteUniversalLocation, ()>>;
|
||||||
type Router =
|
type Router =
|
||||||
TestTopic<UnpaidLocalExporter<HaulBlobExporter<TheBridge, Remote, Price>, UniversalLocation>>;
|
TestTopic<UnpaidLocalExporter<HaulBlobExporter<TheBridge, Remote, Price>, UniversalLocation>>;
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ parameter_types! {
|
|||||||
// x (10 + 10) weight each).
|
// x (10 + 10) weight each).
|
||||||
}
|
}
|
||||||
type TheBridge =
|
type TheBridge =
|
||||||
TestBridge<BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteUniversalLocation>>;
|
TestBridge<BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteUniversalLocation, ()>>;
|
||||||
type RelayExporter = HaulBlobExporter<TheBridge, Remote, Price>;
|
type RelayExporter = HaulBlobExporter<TheBridge, Remote, Price>;
|
||||||
type LocalInnerRouter = ExecutingRouter<UniversalLocation, RelayUniversalLocation, RelayExporter>;
|
type LocalInnerRouter = ExecutingRouter<UniversalLocation, RelayUniversalLocation, RelayExporter>;
|
||||||
type LocalBridgeRouter = SovereignPaidRemoteExporter<
|
type LocalBridgeRouter = SovereignPaidRemoteExporter<
|
||||||
|
|||||||
@@ -27,8 +27,9 @@ parameter_types! {
|
|||||||
pub BridgeTable: Vec<(NetworkId, MultiLocation, Option<MultiAsset>)>
|
pub BridgeTable: Vec<(NetworkId, MultiLocation, Option<MultiAsset>)>
|
||||||
= vec![(Remote::get(), (Parent, Parachain(1)).into(), None)];
|
= vec![(Remote::get(), (Parent, Parachain(1)).into(), None)];
|
||||||
}
|
}
|
||||||
type TheBridge =
|
type TheBridge = TestBridge<
|
||||||
TestBridge<BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteParaBridgeUniversalLocation>>;
|
BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteParaBridgeUniversalLocation, ()>,
|
||||||
|
>;
|
||||||
type RelayExporter = HaulBlobExporter<TheBridge, Remote, ()>;
|
type RelayExporter = HaulBlobExporter<TheBridge, Remote, ()>;
|
||||||
type LocalInnerRouter =
|
type LocalInnerRouter =
|
||||||
UnpaidExecutingRouter<UniversalLocation, ParaBridgeUniversalLocation, RelayExporter>;
|
UnpaidExecutingRouter<UniversalLocation, ParaBridgeUniversalLocation, RelayExporter>;
|
||||||
|
|||||||
@@ -27,8 +27,9 @@ parameter_types! {
|
|||||||
pub BridgeTable: Vec<(NetworkId, MultiLocation, Option<MultiAsset>)>
|
pub BridgeTable: Vec<(NetworkId, MultiLocation, Option<MultiAsset>)>
|
||||||
= vec![(Remote::get(), Parachain(1).into(), None)];
|
= vec![(Remote::get(), Parachain(1).into(), None)];
|
||||||
}
|
}
|
||||||
type TheBridge =
|
type TheBridge = TestBridge<
|
||||||
TestBridge<BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteParaBridgeUniversalLocation>>;
|
BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteParaBridgeUniversalLocation, ()>,
|
||||||
|
>;
|
||||||
type RelayExporter = HaulBlobExporter<TheBridge, Remote, ()>;
|
type RelayExporter = HaulBlobExporter<TheBridge, Remote, ()>;
|
||||||
type LocalInnerRouter =
|
type LocalInnerRouter =
|
||||||
UnpaidExecutingRouter<UniversalLocation, ParaBridgeUniversalLocation, RelayExporter>;
|
UnpaidExecutingRouter<UniversalLocation, ParaBridgeUniversalLocation, RelayExporter>;
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ parameter_types! {
|
|||||||
= vec![(Remote::get(), MultiLocation::parent(), None)];
|
= vec![(Remote::get(), MultiLocation::parent(), None)];
|
||||||
}
|
}
|
||||||
type TheBridge =
|
type TheBridge =
|
||||||
TestBridge<BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteUniversalLocation>>;
|
TestBridge<BridgeBlobDispatcher<TestRemoteIncomingRouter, RemoteUniversalLocation, ()>>;
|
||||||
type RelayExporter = HaulBlobExporter<TheBridge, Remote, ()>;
|
type RelayExporter = HaulBlobExporter<TheBridge, Remote, ()>;
|
||||||
type LocalInnerRouter =
|
type LocalInnerRouter =
|
||||||
UnpaidExecutingRouter<UniversalLocation, RelayUniversalLocation, RelayExporter>;
|
UnpaidExecutingRouter<UniversalLocation, RelayUniversalLocation, RelayExporter>;
|
||||||
|
|||||||
@@ -332,9 +332,14 @@ pub enum DispatchBlobError {
|
|||||||
WrongGlobal,
|
WrongGlobal,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct BridgeBlobDispatcher<Router, OurPlace>(PhantomData<(Router, OurPlace)>);
|
pub struct BridgeBlobDispatcher<Router, OurPlace, OurPlaceBridgeInstance>(
|
||||||
impl<Router: SendXcm, OurPlace: Get<InteriorMultiLocation>> DispatchBlob
|
PhantomData<(Router, OurPlace, OurPlaceBridgeInstance)>,
|
||||||
for BridgeBlobDispatcher<Router, OurPlace>
|
);
|
||||||
|
impl<
|
||||||
|
Router: SendXcm,
|
||||||
|
OurPlace: Get<InteriorMultiLocation>,
|
||||||
|
OurPlaceBridgeInstance: Get<Option<InteriorMultiLocation>>,
|
||||||
|
> DispatchBlob for BridgeBlobDispatcher<Router, OurPlace, OurPlaceBridgeInstance>
|
||||||
{
|
{
|
||||||
fn dispatch_blob(blob: Vec<u8>) -> Result<(), DispatchBlobError> {
|
fn dispatch_blob(blob: Vec<u8>) -> Result<(), DispatchBlobError> {
|
||||||
let our_universal = OurPlace::get();
|
let our_universal = OurPlace::get();
|
||||||
@@ -352,8 +357,16 @@ impl<Router: SendXcm, OurPlace: Get<InteriorMultiLocation>> DispatchBlob
|
|||||||
.map_err(|()| DispatchBlobError::NonUniversalDestination)?;
|
.map_err(|()| DispatchBlobError::NonUniversalDestination)?;
|
||||||
ensure!(intended_global == our_global, DispatchBlobError::WrongGlobal);
|
ensure!(intended_global == our_global, DispatchBlobError::WrongGlobal);
|
||||||
let dest = universal_dest.relative_to(&our_universal);
|
let dest = universal_dest.relative_to(&our_universal);
|
||||||
let message: Xcm<()> =
|
let mut message: Xcm<()> =
|
||||||
message.try_into().map_err(|_| DispatchBlobError::UnsupportedXcmVersion)?;
|
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::<Router>(dest, message).map_err(|_| DispatchBlobError::RoutingError)?;
|
let _ = send_xcm::<Router>(dest, message).map_err(|_| DispatchBlobError::RoutingError)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user