From 795b1c81f3e86d3578ef56bd3b1e0ed0882f0733 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Thu, 6 Apr 2023 12:10:40 +0200 Subject: [PATCH 01/10] **Foreign** global consensus parachain LocationToAccount converter --- xcm/xcm-builder/src/location_conversion.rs | 123 +++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/xcm/xcm-builder/src/location_conversion.rs b/xcm/xcm-builder/src/location_conversion.rs index a3ced7ba6d90..706bc5477e32 100644 --- a/xcm/xcm-builder/src/location_conversion.rs +++ b/xcm/xcm-builder/src/location_conversion.rs @@ -147,6 +147,39 @@ impl>, AccountId: From<[u8; 20]> + Into<[u8; 20]> } } +/// Tries to convert **foreign** global consensus parachain to accountId. +/// +/// **foreign** means `parents > 1` +/// +/// (E.g.: can be used for sovereign account conversion) +pub struct GlobalConsensusParachainConvert(PhantomData); +impl + Clone> Convert + for GlobalConsensusParachainConvert +{ + fn convert_ref(location: impl Borrow) -> Result { + match location.borrow() { + MultiLocation { + parents, + interior: X2(GlobalConsensus(network), Parachain(para_id)), + } if parents > &1_u8 => + Ok(AccountId::from(GlobalConsensusParachainConvert::::from_params( + network, para_id, *parents, + ))), + _ => Err(()), + } + } + + fn reverse_ref(_: impl Borrow) -> Result { + // if this will be needed, we could implement some kind of guessing, if we have configuration for supported foreign networkId+paraId + Err(()) + } +} +impl GlobalConsensusParachainConvert { + fn from_params(network: &NetworkId, para_id: &u32, parents: u8) -> [u8; 32] { + (network, para_id, parents).using_encoded(blake2_256) + } +} + #[cfg(test)] mod tests { use super::*; @@ -225,4 +258,94 @@ mod tests { let inverted = UniversalLocation::get().invert_target(&input); assert_eq!(inverted, Err(())); } + + #[test] + fn global_consensus_parachain_convert_works() { + let test_data = vec![ + ( + MultiLocation::new(0, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + false, + ), + ( + MultiLocation::new(1, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + false, + ), + ( + MultiLocation::new( + 2, + X3( + GlobalConsensus(ByGenesis([0; 32])), + Parachain(1000), + AccountId32 { network: None, id: [1; 32].into() }, + ), + ), + false, + ), + (MultiLocation::new(2, X1(GlobalConsensus(ByGenesis([0; 32])))), false), + (MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), + (MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), + (MultiLocation::new(4, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), + ( + MultiLocation::new(10, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + true, + ), + ]; + + for (location, expected_result) in test_data { + let result = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref(&location); + match result { + Ok(account) => { + assert_eq!( + true, expected_result, + "expected_result: {}, but conversion passed: {:?}, location: {:?}", + expected_result, account, location + ); + match &location { + MultiLocation { parents, interior: X2(GlobalConsensus(network), Parachain(para_id)) } => + assert_eq!( + account, + GlobalConsensusParachainConvert::<[u8; 32]>::from_params(network, para_id, *parents), + "expected_result: {}, but conversion passed: {:?}, location: {:?}", expected_result, account, location + ), + _ => assert_eq!( + true, + expected_result, + "expected_result: {}, conversion passed: {:?}, but MultiLocation does not match expected pattern, location: {:?}", expected_result, account, location + ) + } + }, + Err(_) => { + assert_eq!( + false, expected_result, + "expected_result: {} - but conversion failed, location: {:?}", + expected_result, location + ); + }, + } + } + + // all success + let res_2_1000 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + ) + .expect("conversion is ok"); + let res_2_1001 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1001))), + ) + .expect("conversion is ok"); + let res_3_1000 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( + MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + ) + .expect("conversion is ok"); + let res_3_1001 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( + MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1001))), + ) + .expect("conversion is ok"); + assert_ne!(res_2_1000, res_2_1001); + assert_ne!(res_2_1000, res_3_1000); + assert_ne!(res_2_1000, res_3_1001); + assert_ne!(res_2_1001, res_3_1000); + assert_ne!(res_2_1001, res_3_1001); + assert_ne!(res_3_1000, res_3_1001); + } } From cf2eac79f91d523109f00667a65ee93774f44946 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 11 Apr 2023 10:07:45 +0200 Subject: [PATCH 02/10] Review fix --- xcm/xcm-builder/src/location_conversion.rs | 51 +++++++++------------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/xcm/xcm-builder/src/location_conversion.rs b/xcm/xcm-builder/src/location_conversion.rs index 706bc5477e32..6ecad482f891 100644 --- a/xcm/xcm-builder/src/location_conversion.rs +++ b/xcm/xcm-builder/src/location_conversion.rs @@ -147,9 +147,7 @@ impl>, AccountId: From<[u8; 20]> + Into<[u8; 20]> } } -/// Tries to convert **foreign** global consensus parachain to accountId. -/// -/// **foreign** means `parents > 1` +/// Tries to convert global consensus parachain to accountId. /// /// (E.g.: can be used for sovereign account conversion) pub struct GlobalConsensusParachainConvert(PhantomData); @@ -159,24 +157,22 @@ impl + Clone> Convert fn convert_ref(location: impl Borrow) -> Result { match location.borrow() { MultiLocation { - parents, - interior: X2(GlobalConsensus(network), Parachain(para_id)), - } if parents > &1_u8 => - Ok(AccountId::from(GlobalConsensusParachainConvert::::from_params( - network, para_id, *parents, - ))), + interior: X2(GlobalConsensus(network), Parachain(para_id)), .. + } => Ok(AccountId::from(GlobalConsensusParachainConvert::::from_params( + network, para_id, + ))), _ => Err(()), } } fn reverse_ref(_: impl Borrow) -> Result { - // if this will be needed, we could implement some kind of guessing, if we have configuration for supported foreign networkId+paraId + // if this will be needed, we could implement some kind of guessing, if we have configuration for supported networkId+paraId Err(()) } } impl GlobalConsensusParachainConvert { - fn from_params(network: &NetworkId, para_id: &u32, parents: u8) -> [u8; 32] { - (network, para_id, parents).using_encoded(blake2_256) + fn from_params(network: &NetworkId, para_id: &u32) -> [u8; 32] { + (network, para_id).using_encoded(blake2_256) } } @@ -262,14 +258,9 @@ mod tests { #[test] fn global_consensus_parachain_convert_works() { let test_data = vec![ - ( - MultiLocation::new(0, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - false, - ), - ( - MultiLocation::new(1, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - false, - ), + (MultiLocation::parent(), false), + (MultiLocation::new(0, X1(Parachain(1000))), false), + (MultiLocation::new(1, X1(Parachain(1000))), false), ( MultiLocation::new( 2, @@ -282,13 +273,11 @@ mod tests { false, ), (MultiLocation::new(2, X1(GlobalConsensus(ByGenesis([0; 32])))), false), + (MultiLocation::new(0, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), + (MultiLocation::new(1, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), (MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), (MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), - (MultiLocation::new(4, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), - ( - MultiLocation::new(10, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - true, - ), + (MultiLocation::new(9, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), ]; for (location, expected_result) in test_data { @@ -301,10 +290,10 @@ mod tests { expected_result, account, location ); match &location { - MultiLocation { parents, interior: X2(GlobalConsensus(network), Parachain(para_id)) } => + MultiLocation { interior: X2(GlobalConsensus(network), Parachain(para_id)), .. } => assert_eq!( account, - GlobalConsensusParachainConvert::<[u8; 32]>::from_params(network, para_id, *parents), + GlobalConsensusParachainConvert::<[u8; 32]>::from_params(network, para_id), "expected_result: {}, but conversion passed: {:?}, location: {:?}", expected_result, account, location ), _ => assert_eq!( @@ -342,10 +331,12 @@ mod tests { ) .expect("conversion is ok"); assert_ne!(res_2_1000, res_2_1001); - assert_ne!(res_2_1000, res_3_1000); + assert_ne!(res_3_1000, res_3_1001); + assert_ne!(res_2_1000, res_3_1001); assert_ne!(res_2_1001, res_3_1000); - assert_ne!(res_2_1001, res_3_1001); - assert_ne!(res_3_1000, res_3_1001); + + assert_eq!(res_2_1000, res_3_1000); + assert_eq!(res_2_1001, res_3_1001); } } From 791954bf10199a0fd7c6a869dbba8fd5647375ff Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 18 Apr 2023 15:09:03 +0200 Subject: [PATCH 03/10] Added `UniversalLocation` + `ensure_is_remote` handling --- xcm/xcm-builder/src/location_conversion.rs | 101 +++++++++++++-------- xcm/xcm-builder/src/universal_exports.rs | 2 +- 2 files changed, 62 insertions(+), 41 deletions(-) diff --git a/xcm/xcm-builder/src/location_conversion.rs b/xcm/xcm-builder/src/location_conversion.rs index 450595beecd9..b6cec6e380ed 100644 --- a/xcm/xcm-builder/src/location_conversion.rs +++ b/xcm/xcm-builder/src/location_conversion.rs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +use crate::universal_exports::ensure_is_remote; use frame_support::traits::Get; use parity_scale_codec::{Decode, Encode}; use sp_io::hashing::blake2_256; @@ -150,17 +151,29 @@ impl>, AccountId: From<[u8; 20]> + Into<[u8; 20]> /// Tries to convert global consensus parachain to accountId. /// /// (E.g.: can be used for sovereign account conversion) -pub struct GlobalConsensusParachainConvert(PhantomData); -impl + Clone> Convert - for GlobalConsensusParachainConvert +pub struct GlobalConsensusParachainConvertsFor( + PhantomData<(UniversalLocation, AccountId)>, +); +impl, AccountId: From<[u8; 32]> + Clone> + Convert + for GlobalConsensusParachainConvertsFor { fn convert_ref(location: impl Borrow) -> Result { - match location.borrow() { - MultiLocation { - interior: X2(GlobalConsensus(network), Parachain(para_id)), .. - } => Ok(AccountId::from(GlobalConsensusParachainConvert::::from_params( - network, para_id, - ))), + let universal_source = UniversalLocation::get(); + log::trace!( + target: "xcm::location_conversion", + "GlobalConsensusParachainConvertsFor universal_source: {:?}, location: {:?}", + universal_source, location.borrow(), + ); + let devolved = ensure_is_remote(universal_source, *location.borrow()).map_err(|_| ())?; + let (remote_network, remote_location) = devolved; + + match remote_location { + X1(Parachain(remote_network_para_id)) => + Ok(AccountId::from(GlobalConsensusParachainConvertsFor::< + UniversalLocation, + AccountId, + >::from_params(&remote_network, &remote_network_para_id))), _ => Err(()), } } @@ -170,7 +183,9 @@ impl + Clone> Convert Err(()) } } -impl GlobalConsensusParachainConvert { +impl + GlobalConsensusParachainConvertsFor +{ fn from_params(network: &NetworkId, para_id: &u32) -> [u8; 32] { (network, para_id).using_encoded(blake2_256) } @@ -256,7 +271,11 @@ mod tests { } #[test] - fn global_consensus_parachain_convert_works() { + fn global_consensus_parachain_converts_for_works() { + parameter_types! { + pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(ByGenesis([9; 32])), Parachain(1234)); + } + let test_data = vec![ (MultiLocation::parent(), false), (MultiLocation::new(0, X1(Parachain(1000))), false), @@ -273,15 +292,30 @@ mod tests { false, ), (MultiLocation::new(2, X1(GlobalConsensus(ByGenesis([0; 32])))), false), - (MultiLocation::new(0, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), - (MultiLocation::new(1, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), + ( + MultiLocation::new(0, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + false, + ), + ( + MultiLocation::new(1, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + false, + ), (MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), - (MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), - (MultiLocation::new(9, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), + ( + MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + false, + ), + ( + MultiLocation::new(9, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + false, + ), ]; for (location, expected_result) in test_data { - let result = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref(&location); + let result = + GlobalConsensusParachainConvertsFor::::convert_ref( + &location, + ); match result { Ok(account) => { assert_eq!( @@ -293,7 +327,7 @@ mod tests { MultiLocation { interior: X2(GlobalConsensus(network), Parachain(para_id)), .. } => assert_eq!( account, - GlobalConsensusParachainConvert::<[u8; 32]>::from_params(network, para_id), + GlobalConsensusParachainConvertsFor::::from_params(network, para_id), "expected_result: {}, but conversion passed: {:?}, location: {:?}", expected_result, account, location ), _ => assert_eq!( @@ -314,29 +348,16 @@ mod tests { } // all success - let res_2_1000 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( - MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - ) - .expect("conversion is ok"); - let res_2_1001 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( - MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1001))), - ) - .expect("conversion is ok"); - let res_3_1000 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( - MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - ) - .expect("conversion is ok"); - let res_3_1001 = GlobalConsensusParachainConvert::<[u8; 32]>::convert_ref( - MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1001))), - ) - .expect("conversion is ok"); + let res_2_1000 = + GlobalConsensusParachainConvertsFor::::convert_ref( + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + ) + .expect("conversion is ok"); + let res_2_1001 = + GlobalConsensusParachainConvertsFor::::convert_ref( + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1001))), + ) + .expect("conversion is ok"); assert_ne!(res_2_1000, res_2_1001); - assert_ne!(res_3_1000, res_3_1001); - - assert_ne!(res_2_1000, res_3_1001); - assert_ne!(res_2_1001, res_3_1000); - - assert_eq!(res_2_1000, res_3_1000); - assert_eq!(res_2_1001, res_3_1001); } } diff --git a/xcm/xcm-builder/src/universal_exports.rs b/xcm/xcm-builder/src/universal_exports.rs index 81042a1ad4a3..6e784d73293e 100644 --- a/xcm/xcm-builder/src/universal_exports.rs +++ b/xcm/xcm-builder/src/universal_exports.rs @@ -23,7 +23,7 @@ use xcm::prelude::*; use xcm_executor::traits::{validate_export, ExportXcm}; use SendError::*; -fn ensure_is_remote( +pub fn ensure_is_remote( universal_local: impl Into, dest: impl Into, ) -> Result<(NetworkId, InteriorMultiLocation), MultiLocation> { From 517d851a3456374d133d01e4afdf9e65ae20bb1a Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 18 Apr 2023 15:18:42 +0200 Subject: [PATCH 04/10] Added unique id to encoding --- xcm/xcm-builder/src/location_conversion.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xcm/xcm-builder/src/location_conversion.rs b/xcm/xcm-builder/src/location_conversion.rs index b6cec6e380ed..b88d29700838 100644 --- a/xcm/xcm-builder/src/location_conversion.rs +++ b/xcm/xcm-builder/src/location_conversion.rs @@ -187,7 +187,7 @@ impl GlobalConsensusParachainConvertsFor { fn from_params(network: &NetworkId, para_id: &u32) -> [u8; 32] { - (network, para_id).using_encoded(blake2_256) + (b"glblcnsnss/prchn_", network, para_id).using_encoded(blake2_256) } } From e25229f5a382559ce405b49f0c27e0f915da1053 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 18 Apr 2023 15:21:44 +0200 Subject: [PATCH 05/10] Update xcm/xcm-builder/src/location_conversion.rs Co-authored-by: Gavin Wood --- xcm/xcm-builder/src/location_conversion.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/xcm/xcm-builder/src/location_conversion.rs b/xcm/xcm-builder/src/location_conversion.rs index b88d29700838..5c60c1c73656 100644 --- a/xcm/xcm-builder/src/location_conversion.rs +++ b/xcm/xcm-builder/src/location_conversion.rs @@ -148,9 +148,21 @@ impl>, AccountId: From<[u8; 20]> + Into<[u8; 20]> } } -/// Tries to convert global consensus parachain to accountId. +/// Converts a location which is a top-level parachain (i.e. a parachain held on a +/// Relay-chain which provides its own consensus) into a 32-byte `AccountId`. /// -/// (E.g.: can be used for sovereign account conversion) +/// This will always result in the *same account ID* being returned for the same +/// parachain index under the same Relay-chain, regardless of the relative security of +/// this Relay-chain compared to the local chain. +/// +/// Note: No distinction is made when the local chain happens to be the parachain in +/// question or its Relay-chain. +/// +/// WARNING: This results in the same `AccountId` value being generated regardless +/// of the relative security of the local chain and the Relay-chain of the input +/// location. This may not have any immediate security risks, however since it creates +/// commonalities between chains with different security characteristics, it could +/// possibly form part of a more sophisticated attack scenario. pub struct GlobalConsensusParachainConvertsFor( PhantomData<(UniversalLocation, AccountId)>, ); From 071bf48f2c3bc24101938773d80eaf170dd9e746 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 18 Apr 2023 15:46:55 +0200 Subject: [PATCH 06/10] Re-export `ensure_is_remote` --- xcm/xcm-builder/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xcm/xcm-builder/src/lib.rs b/xcm/xcm-builder/src/lib.rs index 2508a43a3226..4b48083dea07 100644 --- a/xcm/xcm-builder/src/lib.rs +++ b/xcm/xcm-builder/src/lib.rs @@ -81,7 +81,7 @@ pub use filter_asset_location::{Case, NativeAsset}; mod universal_exports; pub use universal_exports::{ - BridgeBlobDispatcher, BridgeMessage, DispatchBlob, DispatchBlobError, ExporterFor, HaulBlob, - HaulBlobError, HaulBlobExporter, NetworkExportTable, SovereignPaidRemoteExporter, - UnpaidLocalExporter, UnpaidRemoteExporter, + ensure_is_remote, BridgeBlobDispatcher, BridgeMessage, DispatchBlob, DispatchBlobError, + ExporterFor, HaulBlob, HaulBlobError, HaulBlobExporter, NetworkExportTable, + SovereignPaidRemoteExporter, UnpaidLocalExporter, UnpaidRemoteExporter, }; From 90d35898a579e305bc83628bc24b60d1bd50eac2 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 18 Apr 2023 15:52:14 +0200 Subject: [PATCH 07/10] Test --- xcm/xcm-builder/src/location_conversion.rs | 25 +++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/xcm/xcm-builder/src/location_conversion.rs b/xcm/xcm-builder/src/location_conversion.rs index 5c60c1c73656..570586b82749 100644 --- a/xcm/xcm-builder/src/location_conversion.rs +++ b/xcm/xcm-builder/src/location_conversion.rs @@ -360,16 +360,31 @@ mod tests { } // all success - let res_2_1000 = + let res_gc_a_p1000 = GlobalConsensusParachainConvertsFor::::convert_ref( - MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([3; 32])), Parachain(1000))), ) .expect("conversion is ok"); - let res_2_1001 = + let res_gc_a_p1001 = GlobalConsensusParachainConvertsFor::::convert_ref( - MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1001))), + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([3; 32])), Parachain(1001))), ) .expect("conversion is ok"); - assert_ne!(res_2_1000, res_2_1001); + let res_gc_b_p1000 = + GlobalConsensusParachainConvertsFor::::convert_ref( + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([4; 32])), Parachain(1000))), + ) + .expect("conversion is ok"); + let res_gc_b_p1001 = + GlobalConsensusParachainConvertsFor::::convert_ref( + MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([4; 32])), Parachain(1001))), + ) + .expect("conversion is ok"); + assert_ne!(res_gc_a_p1000, res_gc_a_p1001); + assert_ne!(res_gc_a_p1000, res_gc_b_p1000); + assert_ne!(res_gc_a_p1000, res_gc_b_p1001); + assert_ne!(res_gc_b_p1000, res_gc_b_p1001); + assert_ne!(res_gc_b_p1000, res_gc_a_p1001); + assert_ne!(res_gc_b_p1001, res_gc_a_p1001); } } From 94a6b09fac49ce82122b223813afd8cf2979545e Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 18 Apr 2023 15:53:15 +0200 Subject: [PATCH 08/10] fmt --- xcm/xcm-builder/src/location_conversion.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xcm/xcm-builder/src/location_conversion.rs b/xcm/xcm-builder/src/location_conversion.rs index 570586b82749..7d3f60260b8f 100644 --- a/xcm/xcm-builder/src/location_conversion.rs +++ b/xcm/xcm-builder/src/location_conversion.rs @@ -374,12 +374,12 @@ mod tests { GlobalConsensusParachainConvertsFor::::convert_ref( MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([4; 32])), Parachain(1000))), ) - .expect("conversion is ok"); + .expect("conversion is ok"); let res_gc_b_p1001 = GlobalConsensusParachainConvertsFor::::convert_ref( MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([4; 32])), Parachain(1001))), ) - .expect("conversion is ok"); + .expect("conversion is ok"); assert_ne!(res_gc_a_p1000, res_gc_a_p1001); assert_ne!(res_gc_a_p1000, res_gc_b_p1000); assert_ne!(res_gc_a_p1000, res_gc_b_p1001); From 01b21a89932a6105255c08873fd7a5c39b59bc48 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 15 May 2023 20:37:09 +0100 Subject: [PATCH 09/10] Update xcm/xcm-builder/src/location_conversion.rs --- xcm/xcm-builder/src/location_conversion.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/xcm/xcm-builder/src/location_conversion.rs b/xcm/xcm-builder/src/location_conversion.rs index fdba7969704f..66c9fc6dd31d 100644 --- a/xcm/xcm-builder/src/location_conversion.rs +++ b/xcm/xcm-builder/src/location_conversion.rs @@ -287,10 +287,7 @@ impl, AccountId: From<[u8; 32]> + match remote_location { X1(Parachain(remote_network_para_id)) => - Ok(AccountId::from(GlobalConsensusParachainConvertsFor::< - UniversalLocation, - AccountId, - >::from_params(&remote_network, &remote_network_para_id))), + Ok(AccountId::from(Self::from_params(&remote_network, &remote_network_para_id))), _ => Err(()), } } From 1f54bc04ef854b419b6c61e0cbd661040417036d Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 16 May 2023 09:57:02 +0200 Subject: [PATCH 10/10] Update xcm/xcm-builder/src/universal_exports.rs Co-authored-by: Gavin Wood --- xcm/xcm-builder/src/universal_exports.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xcm/xcm-builder/src/universal_exports.rs b/xcm/xcm-builder/src/universal_exports.rs index 6e784d73293e..1a8fe0a5a573 100644 --- a/xcm/xcm-builder/src/universal_exports.rs +++ b/xcm/xcm-builder/src/universal_exports.rs @@ -23,6 +23,10 @@ use xcm::prelude::*; use xcm_executor::traits::{validate_export, ExportXcm}; use SendError::*; +/// Returns the network ID and consensus location within that network of the remote +/// location `dest` which is itself specified as a location relative to the local +/// chain, itself situated at `universal_local` within the consensus universe. If +/// `dest` is not a location in remote consensus, then an error is returned. pub fn ensure_is_remote( universal_local: impl Into, dest: impl Into,