git.delta.rocks / unique-network / refs/commits / 568279d1cd8f

difftreelog

refactor move common xcm parts to common

Daniel Shiposha2022-09-06parent: #25b276d.patch.diff
in: master

7 files changed

modifiedruntime/common/config/orml.rsdiffbeforeafterboth
14// You should have received a copy of the GNU General Public License14// You should have received a copy of the GNU General Public License
15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
1616
17use frame_support::parameter_types;17use frame_support::{
18 parameter_types,
19 traits::{Contains, Everything},
20 weights::Weight,
21};
18use frame_system::EnsureSigned;22use frame_system::EnsureSigned;
23use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
24use sp_runtime::traits::Convert;
25use xcm::v1::{Junction::*, Junctions::*, MultiLocation, NetworkId};
26use xcm_builder::LocationInverter;
27use xcm_executor::XcmExecutor;
28use sp_std::{vec, vec::Vec};
29use pallet_foreing_assets::{CurrencyId, NativeCurrency};
19use crate::{Runtime, Event, RelayChainBlockNumberProvider};30use crate::{
31 Runtime, Event, RelayChainBlockNumberProvider,
32 runtime_common::config::{
33 xcm::{
34 SelfLocation, Weigher, XcmConfig, Ancestry,
35 xcm_assets::{CurrencyIdConvert},
36 },
37 pallets::TreasuryAccountId,
38 substrate::{MaxLocks, MaxReserves},
39 },
40};
41
20use up_common::{42use up_common::{
21 types::{AccountId, Balance},43 types::{AccountId, Balance},
22 constants::*,44 constants::*,
23};45};
46
47// Signed version of balance
48pub type Amount = i128;
2449
25parameter_types! {50parameter_types! {
26 pub const MinVestedTransfer: Balance = 10 * UNIQUE;51 pub const MinVestedTransfer: Balance = 10 * UNIQUE;
27 pub const MaxVestingSchedules: u32 = 28;52 pub const MaxVestingSchedules: u32 = 28;
53
54 pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this
55 pub const MaxAssetsForTransfer: usize = 2;
28}56}
57
58parameter_type_with_key! {
59 pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
60 Some(100_000_000_000)
61 };
62}
63
64parameter_type_with_key! {
65 pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
66 match currency_id {
67 CurrencyId::NativeAssetId(symbol) => match symbol {
68 NativeCurrency::Here => 0,
69 NativeCurrency::Parent=> 0,
70 },
71 _ => 100_000
72 }
73 };
74}
75
76pub fn get_all_module_accounts() -> Vec<AccountId> {
77 vec![TreasuryAccountId::get()]
78}
79
80pub struct DustRemovalWhitelist;
81impl Contains<AccountId> for DustRemovalWhitelist {
82 fn contains(a: &AccountId) -> bool {
83 get_all_module_accounts().contains(a)
84 }
85}
86
87pub struct AccountIdToMultiLocation;
88impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {
89 fn convert(account: AccountId) -> MultiLocation {
90 X1(AccountId32 {
91 network: NetworkId::Any,
92 id: account.into(),
93 })
94 .into()
95 }
96}
2997
30impl orml_vesting::Config for Runtime {98impl orml_vesting::Config for Runtime {
31 type Event = Event;99 type Event = Event;
37 type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;105 type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;
38}106}
107
108impl orml_tokens::Config for Runtime {
109 type Event = Event;
110 type Balance = Balance;
111 type Amount = Amount;
112 type CurrencyId = CurrencyId;
113 type WeightInfo = ();
114 type ExistentialDeposits = ExistentialDeposits;
115 type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;
116 type MaxLocks = MaxLocks;
117 type MaxReserves = MaxReserves;
118 // TODO: Add all module accounts
119 type DustRemovalWhitelist = DustRemovalWhitelist;
120 /// The id type for named reserves.
121 type ReserveIdentifier = ();
122 type OnNewTokenAccount = ();
123 type OnKilledTokenAccount = ();
124}
125
126impl orml_xtokens::Config for Runtime {
127 type Event = Event;
128 type Balance = Balance;
129 type CurrencyId = CurrencyId;
130 type CurrencyIdConvert = CurrencyIdConvert;
131 type AccountIdToMultiLocation = AccountIdToMultiLocation;
132 type SelfLocation = SelfLocation;
133 type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
134 type Weigher = Weigher;
135 type BaseXcmWeight = BaseXcmWeight;
136 type LocationInverter = LocationInverter<Ancestry>;
137 type MaxAssetsForTransfer = MaxAssetsForTransfer;
138 type MinXcmFee = ParachainMinFee;
139 type MultiLocationsFilter = Everything;
140 type ReserveProvider = AbsoluteReserveProvider;
141}
39142
modifiedruntime/common/config/xcm/foreignassets.rsdiffbeforeafterboth
--- a/runtime/common/config/xcm/foreignassets.rs
+++ b/runtime/common/config/xcm/foreignassets.rs
@@ -18,14 +18,14 @@
 	traits::{Contains, Get, fungibles},
 	parameter_types,
 };
-use sp_runtime::traits::Zero;
+use sp_runtime::traits::{Zero, Convert};
 use xcm::v1::{Junction::*, MultiLocation, Junctions::*};
 use xcm::latest::MultiAsset;
 use xcm_builder::{FungiblesAdapter, ConvertedConcreteAssetId};
 use xcm_executor::traits::{Convert as ConvertXcm, JustTry, FilterAssetLocation};
 use pallet_foreing_assets::{
 	AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, NativeCurrency, FreeForAll, TryAsForeing,
-	ForeignAssetId,
+	ForeignAssetId, CurrencyId,
 };
 use sp_std::{borrow::Borrow, marker::PhantomData};
 use crate::{Runtime, Balances, ParachainInfo, PolkadotXcm, ForeingAssets};
@@ -158,3 +158,41 @@
 	Balances,
 	(),
 >;
+
+pub struct CurrencyIdConvert;
+impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
+	fn convert(id: AssetIds) -> Option<MultiLocation> {
+		match id {
+			AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
+				1,
+				X1(Parachain(ParachainInfo::get().into())),
+			)),
+			AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),
+			AssetIds::ForeignAssetId(foreign_asset_id) => {
+				XcmForeignAssetIdMapping::<Runtime>::get_multi_location(foreign_asset_id)
+			}
+		}
+	}
+}
+
+impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {
+	fn convert(location: MultiLocation) -> Option<CurrencyId> {
+		if location == MultiLocation::here()
+			|| location == MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())))
+		{
+			return Some(AssetIds::NativeAssetId(NativeCurrency::Here));
+		}
+
+		if location == MultiLocation::parent() {
+			return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));
+		}
+
+		if let Some(currency_id) =
+			XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())
+		{
+			return Some(currency_id);
+		}
+
+		None
+	}
+}
modifiedruntime/common/config/xcm/mod.rsdiffbeforeafterboth
--- a/runtime/common/config/xcm/mod.rs
+++ b/runtime/common/config/xcm/mod.rs
@@ -14,19 +14,23 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-use frame_support::{traits::Everything, weights::Weight, parameter_types};
+use frame_support::{
+	traits::{Everything, Get},
+	weights::Weight,
+	parameter_types,
+};
 use frame_system::EnsureRoot;
 use pallet_xcm::XcmPassthrough;
 use polkadot_parachain::primitives::Sibling;
 use xcm::v1::{Junction::*, MultiLocation, NetworkId};
-use xcm::latest::{Instruction, Xcm};
+use xcm::latest::prelude::*;
 use xcm_builder::{
 	AccountId32Aliases, EnsureXcmOrigin, FixedWeightBounds, LocationInverter, ParentAsSuperuser,
 	RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,
 	SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, ParentIsPreset,
 };
 use xcm_executor::{Config, XcmExecutor, traits::ShouldExecute};
-use sp_std::marker::PhantomData;
+use sp_std::{marker::PhantomData, vec::Vec};
 use crate::{
 	Runtime, Call, Event, Origin, ParachainInfo, ParachainSystem, PolkadotXcm, XcmpQueue,
 	xcm_config::Barrier,
@@ -35,16 +39,16 @@
 use up_common::types::AccountId;
 
 #[cfg(feature = "foreign-assets")]
-mod foreignassets;
+pub mod foreignassets;
 
 #[cfg(not(feature = "foreign-assets"))]
-mod nativeassets;
+pub mod nativeassets;
 
 #[cfg(feature = "foreign-assets")]
-use foreignassets as xcm_assets;
+pub use foreignassets as xcm_assets;
 
 #[cfg(not(feature = "foreign-assets"))]
-use nativeassets as xcm_assets;
+pub use nativeassets as xcm_assets;
 
 use xcm_assets::{AssetTransactors, IsReserve, Trader};
 
@@ -53,6 +57,11 @@
 	pub const RelayNetwork: NetworkId = NetworkId::Polkadot;
 	pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();
 	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
+	pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
+
+	// One XCM operation is 1_000_000 weight - almost certainly a conservative estimate.
+	pub UnitWeightCost: Weight = 1_000_000;
+	pub const MaxInstructions: u32 = 100;
 }
 
 /// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used
@@ -102,12 +111,6 @@
 	// Xcm origins can be represented natively under the Xcm pallet's Xcm origin.
 	XcmPassthrough<Origin>,
 );
-
-parameter_types! {
-	// One XCM operation is 1_000_000 weight - almost certainly a conservative estimate.
-	pub UnitWeightCost: Weight = 1_000_000;
-	pub const MaxInstructions: u32 = 100;
-}
 
 pub trait TryPass {
 	fn try_pass<Call>(origin: &MultiLocation, message: &mut Xcm<Call>) -> Result<(), ()>;
@@ -169,6 +172,40 @@
 	}
 }
 
+// Allow xcm exchange only with locations in list
+pub struct DenyExchangeWithUnknownLocation<T>(PhantomData<T>);
+impl<T: Get<Vec<MultiLocation>>> TryPass for DenyExchangeWithUnknownLocation<T> {
+	fn try_pass<Call>(origin: &MultiLocation, message: &mut Xcm<Call>) -> Result<(), ()> {
+		let allowed_locations = T::get();
+
+		// Check if deposit or transfer belongs to allowed parachains
+		let mut allowed = allowed_locations.contains(origin);
+
+		message.0.iter().for_each(|inst| match inst {
+			DepositReserveAsset { dest: dst, .. } => {
+				allowed |= allowed_locations.contains(dst);
+			}
+			TransferReserveAsset { dest: dst, .. } => {
+				allowed |= allowed_locations.contains(dst);
+			}
+			_ => {}
+		});
+
+		if allowed {
+			return Ok(());
+		}
+
+		log::warn!(
+			target: "xcm::barrier",
+			"Unexpected deposit or transfer location"
+		);
+		// Deny
+		Err(())
+	}
+}
+
+pub type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
+
 pub struct XcmConfig<T>(PhantomData<T>);
 impl<T> Config for XcmConfig<T>
 where
@@ -183,7 +220,7 @@
 	type IsTeleporter = (); // Teleportation is disabled
 	type LocationInverter = LocationInverter<Ancestry>;
 	type Barrier = Barrier;
-	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
+	type Weigher = Weigher;
 	type Trader = Trader<T>;
 	type ResponseHandler = (); // Don't handle responses for now.
 	type SubscriptionService = PolkadotXcm;
modifiedruntime/common/config/xcm/nativeassets.rsdiffbeforeafterboth
--- a/runtime/common/config/xcm/nativeassets.rs
+++ b/runtime/common/config/xcm/nativeassets.rs
@@ -18,7 +18,7 @@
 	traits::{tokens::currency::Currency as CurrencyT, OnUnbalanced as OnUnbalancedT, Get},
 	weights::{Weight, WeightToFeePolynomial},
 };
-use sp_runtime::traits::{CheckedConversion, Zero};
+use sp_runtime::traits::{CheckedConversion, Zero, Convert};
 use xcm::v1::{Junction::*, MultiLocation, Junctions::*};
 use xcm::latest::{
 	AssetId::{Concrete},
@@ -30,6 +30,7 @@
 	Assets,
 	traits::{MatchesFungible, WeightTrader},
 };
+use pallet_foreing_assets::{AssetIds, NativeCurrency};
 use sp_std::marker::PhantomData;
 use crate::{Balances, ParachainInfo};
 use super::{LocationToAccountId, RelayLocation};
@@ -127,3 +128,16 @@
 	Balances,
 	(),
 >;
+
+pub struct CurrencyIdConvert;
+impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
+	fn convert(id: AssetIds) -> Option<MultiLocation> {
+		match id {
+			AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
+				1,
+				X1(Parachain(ParachainInfo::get().into())),
+			)),
+			_ => None,
+		}
+	}
+}
modifiedruntime/opal/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/opal/src/xcm_config.rs
+++ b/runtime/opal/src/xcm_config.rs
@@ -15,39 +15,17 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 use frame_support::{
-	{match_types, parameter_types, weights::Weight},
-	pallet_prelude::Get,
-	traits::{Contains, Everything},
+	{match_types, weights::Weight},
+	traits::Everything,
 };
-use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
-use sp_runtime::traits::{AccountIdConversion, Convert};
-use sp_std::{vec, vec::Vec};
 use xcm::{
 	latest::Xcm,
-	v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
-};
-use xcm_builder::{
-	AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, FixedWeightBounds, LocationInverter,
-	TakeWeightCredit,
-};
-use xcm_executor::{XcmExecutor, traits::ShouldExecute};
-
-use up_common::types::{AccountId, Balance};
-use crate::{
-	Call, Event, ParachainInfo, Runtime,
-	runtime_common::config::{
-		substrate::{TreasuryModuleId, MaxLocks, MaxReserves},
-		pallets::TreasuryAccountId,
-		xcm::*,
-	},
+	v1::{BodyId, Junction::*, Junctions::*, MultiLocation},
 };
-
-use pallet_foreing_assets::{
-	AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,
-};
+use xcm_builder::{AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, TakeWeightCredit};
+use xcm_executor::traits::ShouldExecute;
 
-// Signed version of balance
-pub type Amount = i128;
+use crate::runtime_common::config::xcm::{DenyThenTry, DenyTransact};
 
 match_types! {
 	pub type ParentOrParentsUnitPlurality: impl Contains<MultiLocation> = {
@@ -83,123 +61,3 @@
 		AllowAllDebug,
 	),
 >;
-
-impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {
-	fn convert(location: MultiLocation) -> Option<CurrencyId> {
-		if location == MultiLocation::here()
-			|| location == MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())))
-		{
-			return Some(AssetIds::NativeAssetId(NativeCurrency::Here));
-		}
-
-		if location == MultiLocation::parent() {
-			return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));
-		}
-
-		if let Some(currency_id) =
-			XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())
-		{
-			return Some(currency_id);
-		}
-
-		None
-	}
-}
-
-impl orml_tokens::Config for Runtime {
-	type Event = Event;
-	type Balance = Balance;
-	type Amount = Amount;
-	type CurrencyId = CurrencyId;
-	type WeightInfo = ();
-	type ExistentialDeposits = ExistentialDeposits;
-	type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;
-	type MaxLocks = MaxLocks;
-	type MaxReserves = MaxReserves;
-	// TODO: Add all module accounts
-	type DustRemovalWhitelist = DustRemovalWhitelist;
-	/// The id type for named reserves.
-	type ReserveIdentifier = ();
-	type OnNewTokenAccount = ();
-	type OnKilledTokenAccount = ();
-}
-
-impl orml_xtokens::Config for Runtime {
-	type Event = Event;
-	type Balance = Balance;
-	type CurrencyId = CurrencyId;
-	type CurrencyIdConvert = CurrencyIdConvert;
-	type AccountIdToMultiLocation = AccountIdToMultiLocation;
-	type SelfLocation = SelfLocation;
-	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
-	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
-	type BaseXcmWeight = BaseXcmWeight;
-	type LocationInverter = LocationInverter<Ancestry>;
-	type MaxAssetsForTransfer = MaxAssetsForTransfer;
-	type MinXcmFee = ParachainMinFee;
-	type MultiLocationsFilter = Everything;
-	type ReserveProvider = AbsoluteReserveProvider;
-}
-
-parameter_type_with_key! {
-	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
-		match currency_id {
-			CurrencyId::NativeAssetId(symbol) => match symbol {
-				NativeCurrency::Here => 0,
-				NativeCurrency::Parent=> 0,
-			},
-			_ => 100_000
-		}
-	};
-}
-
-pub struct DustRemovalWhitelist;
-impl Contains<AccountId> for DustRemovalWhitelist {
-	fn contains(a: &AccountId) -> bool {
-		get_all_module_accounts().contains(a)
-	}
-}
-
-pub struct CurrencyIdConvert;
-impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
-	fn convert(id: AssetIds) -> Option<MultiLocation> {
-		match id {
-			AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
-				1,
-				X1(Parachain(ParachainInfo::get().into())),
-			)),
-			AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),
-			AssetIds::ForeignAssetId(foreign_asset_id) => {
-				XcmForeignAssetIdMapping::<Runtime>::get_multi_location(foreign_asset_id)
-			}
-		}
-	}
-}
-
-parameter_types! {
-	pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this
-	pub const MaxAssetsForTransfer: usize = 2;
-
-	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
-	pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
-}
-
-parameter_type_with_key! {
-	pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
-		Some(100_000_000_000)
-	};
-}
-
-pub fn get_all_module_accounts() -> Vec<AccountId> {
-	vec![TreasuryModuleId::get().into_account_truncating()]
-}
-pub struct AccountIdToMultiLocation;
-impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {
-	fn convert(account: AccountId) -> MultiLocation {
-		X1(AccountId32 {
-			network: NetworkId::Any,
-			id: account.into(),
-		})
-		.into()
-	}
-}
modifiedruntime/quartz/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/quartz/src/xcm_config.rs
+++ b/runtime/quartz/src/xcm_config.rs
@@ -15,33 +15,20 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 use frame_support::{
-	{match_types, parameter_types, weights::Weight},
-	pallet_prelude::Get,
-	traits::{Contains, Everything},
+	match_types, parameter_types,
+	traits::{Everything, Get},
 };
-use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
-use sp_runtime::traits::{AccountIdConversion, Convert};
 use sp_std::{vec, vec::Vec};
-use xcm::{
-	latest::Xcm,
-	v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
-};
+use xcm::v1::{BodyId, Junction::*, Junctions::*, MultiLocation};
 use xcm_builder::{
 	AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom,
-	AllowUnpaidExecutionFrom, FixedWeightBounds, LocationInverter, TakeWeightCredit,
+	AllowUnpaidExecutionFrom, TakeWeightCredit,
 };
-use xcm_executor::XcmExecutor;
 
-use up_common::types::{AccountId, Balance};
-use pallet_foreing_assets::{AssetIds, CurrencyId, NativeCurrency};
-use crate::{Call, Event, ParachainInfo, PolkadotXcm, Runtime};
-use crate::runtime_common::config::substrate::{TreasuryModuleId, MaxLocks, MaxReserves};
-use crate::runtime_common::config::pallets::TreasuryAccountId;
-use crate::runtime_common::config::xcm::*;
-use xcm::opaque::latest::prelude::{DepositReserveAsset, TransferReserveAsset};
-
-// Signed version of balance
-pub type Amount = i128;
+use crate::{
+	ParachainInfo, PolkadotXcm,
+	runtime_common::config::xcm::{DenyThenTry, DenyTransact, DenyExchangeWithUnknownLocation},
+};
 
 match_types! {
 	pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {
@@ -54,22 +41,8 @@
 	};
 }
 
-pub type Barrier = DenyThenTry<
-	(DenyTransact, DenyExchangeWithUnknownLocation),
-	(
-		TakeWeightCredit,
-		AllowTopLevelPaidExecutionFrom<Everything>,
-		// Parent and its exec plurality get free execution
-		AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,
-		// Expected responses are OK.
-		AllowKnownQueryResponses<PolkadotXcm>,
-		// Subscriptions for version tracking are OK.
-		AllowSubscriptionsFrom<ParentOrSiblings>,
-	),
->;
-
-pub fn get_allowed_locations() -> Vec<MultiLocation> {
-	vec![
+parameter_types! {
+	pub QuartzAllowedLocations: Vec<MultiLocation> = vec![
 		// Self location
 		MultiLocation {
 			parents: 0,
@@ -95,131 +68,22 @@
 			parents: 1,
 			interior: X1(Parachain(ParachainInfo::get().into())),
 		},
-	]
-}
-
-// Allow xcm exchange only with locations in list
-pub struct DenyExchangeWithUnknownLocation;
-impl TryPass for DenyExchangeWithUnknownLocation {
-	fn try_pass<Call>(origin: &MultiLocation, message: &mut Xcm<Call>) -> Result<(), ()> {
-		// Check if deposit or transfer belongs to allowed parachains
-		let mut allowed = get_allowed_locations().contains(origin);
-
-		message.0.iter().for_each(|inst| match inst {
-			DepositReserveAsset { dest: dst, .. } => {
-				allowed |= get_allowed_locations().contains(dst);
-			}
-			TransferReserveAsset { dest: dst, .. } => {
-				allowed |= get_allowed_locations().contains(dst);
-			}
-			_ => {}
-		});
-
-		if allowed {
-			return Ok(());
-		}
-
-		log::warn!(
-			target: "xcm::barrier",
-			"Unexpected deposit or transfer location"
-		);
-		// Deny
-		Err(())
-	}
+	];
 }
 
-impl orml_tokens::Config for Runtime {
-	type Event = Event;
-	type Balance = Balance;
-	type Amount = Amount;
-	type CurrencyId = CurrencyId;
-	type WeightInfo = ();
-	type ExistentialDeposits = ExistentialDeposits;
-	type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;
-	type MaxLocks = MaxLocks;
-	type MaxReserves = MaxReserves;
-	// TODO: Add all module accounts
-	type DustRemovalWhitelist = DustRemovalWhitelist;
-	/// The id type for named reserves.
-	type ReserveIdentifier = ();
-	type OnNewTokenAccount = ();
-	type OnKilledTokenAccount = ();
-}
-
-impl orml_xtokens::Config for Runtime {
-	type Event = Event;
-	type Balance = Balance;
-	type CurrencyId = CurrencyId;
-	type CurrencyIdConvert = CurrencyIdConvert;
-	type AccountIdToMultiLocation = AccountIdToMultiLocation;
-	type SelfLocation = SelfLocation;
-	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
-	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
-	type BaseXcmWeight = BaseXcmWeight;
-	type LocationInverter = LocationInverter<Ancestry>;
-	type MaxAssetsForTransfer = MaxAssetsForTransfer;
-	type MinXcmFee = ParachainMinFee;
-	type MultiLocationsFilter = Everything;
-	type ReserveProvider = AbsoluteReserveProvider;
-}
-
-parameter_type_with_key! {
-	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
-		match currency_id {
-			CurrencyId::NativeAssetId(symbol) => match symbol {
-				NativeCurrency::Here => 0,
-				NativeCurrency::Parent=> 0,
-			},
-			_ => 100_000
-		}
-	};
-}
-
-pub struct DustRemovalWhitelist;
-impl Contains<AccountId> for DustRemovalWhitelist {
-	fn contains(a: &AccountId) -> bool {
-		get_all_module_accounts().contains(a)
-	}
-}
-
-pub struct CurrencyIdConvert;
-impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
-	fn convert(id: AssetIds) -> Option<MultiLocation> {
-		match id {
-			AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
-				1,
-				X1(Parachain(ParachainInfo::get().into())),
-			)),
-			_ => None,
-		}
-	}
-}
-
-parameter_types! {
-	pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this
-	pub const MaxAssetsForTransfer: usize = 2;
-
-	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
-	pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
-}
-
-parameter_type_with_key! {
-	pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
-		Some(100_000_000)
-	};
-}
-
-pub fn get_all_module_accounts() -> Vec<AccountId> {
-	vec![TreasuryModuleId::get().into_account_truncating()]
-}
-
-pub struct AccountIdToMultiLocation;
-impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {
-	fn convert(account: AccountId) -> MultiLocation {
-		X1(AccountId32 {
-			network: NetworkId::Any,
-			id: account.into(),
-		})
-		.into()
-	}
-}
+pub type Barrier = DenyThenTry<
+	(
+		DenyTransact,
+		DenyExchangeWithUnknownLocation<QuartzAllowedLocations>,
+	),
+	(
+		TakeWeightCredit,
+		AllowTopLevelPaidExecutionFrom<Everything>,
+		// Parent and its exec plurality get free execution
+		AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,
+		// Expected responses are OK.
+		AllowKnownQueryResponses<PolkadotXcm>,
+		// Subscriptions for version tracking are OK.
+		AllowSubscriptionsFrom<ParentOrSiblings>,
+	),
+>;
modifiedruntime/unique/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/unique/src/xcm_config.rs
+++ b/runtime/unique/src/xcm_config.rs
@@ -15,33 +15,20 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 use frame_support::{
-	{match_types, parameter_types, weights::Weight},
-	pallet_prelude::Get,
-	traits::{Contains, Everything},
+	match_types, parameter_types,
+	traits::{Everything, Get},
 };
-use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
-use sp_runtime::traits::{AccountIdConversion, Convert};
 use sp_std::{vec, vec::Vec};
-use xcm::{
-	latest::Xcm,
-	v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
-};
+use xcm::v1::{BodyId, Junction::*, Junctions::*, MultiLocation};
 use xcm_builder::{
 	AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom,
-	AllowUnpaidExecutionFrom, FixedWeightBounds, LocationInverter, TakeWeightCredit,
+	AllowUnpaidExecutionFrom, TakeWeightCredit,
 };
-use xcm_executor::XcmExecutor;
 
-use up_common::types::{AccountId, Balance};
-use pallet_foreing_assets::{AssetIds, CurrencyId, NativeCurrency};
-use crate::{Call, Event, ParachainInfo, PolkadotXcm, Runtime};
-use crate::runtime_common::config::substrate::{TreasuryModuleId, MaxLocks, MaxReserves};
-use crate::runtime_common::config::pallets::TreasuryAccountId;
-use crate::runtime_common::config::xcm::*;
-use xcm::opaque::latest::prelude::{DepositReserveAsset, TransferReserveAsset};
-
-// Signed version of balance
-pub type Amount = i128;
+use crate::{
+	ParachainInfo, PolkadotXcm,
+	runtime_common::config::xcm::{DenyThenTry, DenyTransact, DenyExchangeWithUnknownLocation},
+};
 
 match_types! {
 	pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {
@@ -54,22 +41,8 @@
 	};
 }
 
-pub type Barrier = DenyThenTry<
-	(DenyTransact, DenyExchangeWithUnknownLocation),
-	(
-		TakeWeightCredit,
-		AllowTopLevelPaidExecutionFrom<Everything>,
-		// Parent and its exec plurality get free execution
-		AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,
-		// Expected responses are OK.
-		AllowKnownQueryResponses<PolkadotXcm>,
-		// Subscriptions for version tracking are OK.
-		AllowSubscriptionsFrom<ParentOrSiblings>,
-	),
->;
-
-pub fn get_allowed_locations() -> Vec<MultiLocation> {
-	vec![
+parameter_types! {
+	pub UniqueAllowedLocations: Vec<MultiLocation> = vec![
 		// Self location
 		MultiLocation {
 			parents: 0,
@@ -95,131 +68,22 @@
 			parents: 1,
 			interior: X1(Parachain(ParachainInfo::get().into())),
 		},
-	]
-}
-
-// Allow xcm exchange only with locations in list
-pub struct DenyExchangeWithUnknownLocation;
-impl TryPass for DenyExchangeWithUnknownLocation {
-	fn try_pass<Call>(origin: &MultiLocation, message: &mut Xcm<Call>) -> Result<(), ()> {
-		// Check if deposit or transfer belongs to allowed parachains
-		let mut allowed = get_allowed_locations().contains(origin);
-
-		message.0.iter().for_each(|inst| match inst {
-			DepositReserveAsset { dest: dst, .. } => {
-				allowed |= get_allowed_locations().contains(dst);
-			}
-			TransferReserveAsset { dest: dst, .. } => {
-				allowed |= get_allowed_locations().contains(dst);
-			}
-			_ => {}
-		});
-
-		if allowed {
-			return Ok(());
-		}
-
-		log::warn!(
-			target: "xcm::barrier",
-			"Unexpected deposit or transfer location"
-		);
-		// Deny
-		Err(())
-	}
+	];
 }
 
-impl orml_tokens::Config for Runtime {
-	type Event = Event;
-	type Balance = Balance;
-	type Amount = Amount;
-	type CurrencyId = CurrencyId;
-	type WeightInfo = ();
-	type ExistentialDeposits = ExistentialDeposits;
-	type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;
-	type MaxLocks = MaxLocks;
-	type MaxReserves = MaxReserves;
-	// TODO: Add all module accounts
-	type DustRemovalWhitelist = DustRemovalWhitelist;
-	/// The id type for named reserves.
-	type ReserveIdentifier = ();
-	type OnNewTokenAccount = ();
-	type OnKilledTokenAccount = ();
-}
-
-impl orml_xtokens::Config for Runtime {
-	type Event = Event;
-	type Balance = Balance;
-	type CurrencyId = CurrencyId;
-	type CurrencyIdConvert = CurrencyIdConvert;
-	type AccountIdToMultiLocation = AccountIdToMultiLocation;
-	type SelfLocation = SelfLocation;
-	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
-	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
-	type BaseXcmWeight = BaseXcmWeight;
-	type LocationInverter = LocationInverter<Ancestry>;
-	type MaxAssetsForTransfer = MaxAssetsForTransfer;
-	type MinXcmFee = ParachainMinFee;
-	type MultiLocationsFilter = Everything;
-	type ReserveProvider = AbsoluteReserveProvider;
-}
-
-parameter_type_with_key! {
-	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
-		match currency_id {
-			CurrencyId::NativeAssetId(symbol) => match symbol {
-				NativeCurrency::Here => 0,
-				NativeCurrency::Parent=> 0,
-			},
-			_ => 100_000
-		}
-	};
-}
-
-pub struct DustRemovalWhitelist;
-impl Contains<AccountId> for DustRemovalWhitelist {
-	fn contains(a: &AccountId) -> bool {
-		get_all_module_accounts().contains(a)
-	}
-}
-
-pub struct CurrencyIdConvert;
-impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
-	fn convert(id: AssetIds) -> Option<MultiLocation> {
-		match id {
-			AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
-				1,
-				X1(Parachain(ParachainInfo::get().into())),
-			)),
-			_ => None,
-		}
-	}
-}
-
-parameter_types! {
-	pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this
-	pub const MaxAssetsForTransfer: usize = 2;
-
-	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
-	pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
-}
-
-parameter_type_with_key! {
-	pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
-		Some(100_000_000)
-	};
-}
-
-pub fn get_all_module_accounts() -> Vec<AccountId> {
-	vec![TreasuryModuleId::get().into_account_truncating()]
-}
-
-pub struct AccountIdToMultiLocation;
-impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {
-	fn convert(account: AccountId) -> MultiLocation {
-		X1(AccountId32 {
-			network: NetworkId::Any,
-			id: account.into(),
-		})
-		.into()
-	}
-}
+pub type Barrier = DenyThenTry<
+	(
+		DenyTransact,
+		DenyExchangeWithUnknownLocation<UniqueAllowedLocations>,
+	),
+	(
+		TakeWeightCredit,
+		AllowTopLevelPaidExecutionFrom<Everything>,
+		// Parent and its exec plurality get free execution
+		AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,
+		// Expected responses are OK.
+		AllowKnownQueryResponses<PolkadotXcm>,
+		// Subscriptions for version tracking are OK.
+		AllowSubscriptionsFrom<ParentOrSiblings>,
+	),
+>;