git.delta.rocks / unique-network / refs/commits / 25b276d53c18

difftreelog

fix(xcm) get rid of xcm warns, fix quartz CurrencyIdConvert

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

19 files changed

modifiedpallets/foreing-assets/src/lib.rsdiffbeforeafterboth
--- a/pallets/foreing-assets/src/lib.rs
+++ b/pallets/foreing-assets/src/lib.rs
@@ -54,7 +54,7 @@
 
 // NOTE:v1::MultiLocation is used in storages, we would need to do migration if upgrade the
 // MultiLocation in the future.
-use xcm::opaque::latest::{prelude::XcmError, MultiAsset};
+use xcm::opaque::latest::prelude::XcmError;
 use xcm::{v1::MultiLocation, VersionedMultiLocation};
 use xcm_executor::{traits::WeightTrader, Assets};
 
@@ -445,8 +445,6 @@
 	}
 }
 
-use sp_runtime::SaturatedConversion;
-use sp_runtime::traits::Saturating;
 pub use frame_support::{
 	traits::{
 		fungibles::{Balanced, CreditOf},
@@ -455,8 +453,6 @@
 	},
 	weights::{WeightToFeePolynomial, WeightToFee},
 };
-
-use xcm::latest::{Fungibility::Fungible as XcmFungible};
 
 pub struct FreeForAll<
 	WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,
deletedruntime/common/config/xcm.rsdiffbeforeafterboth
--- a/runtime/common/config/xcm.rs
+++ /dev/null
@@ -1,493 +0,0 @@
-// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
-// This file is part of Unique Network.
-
-// Unique Network is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// Unique Network is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// 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::{
-		Contains, tokens::currency::Currency as CurrencyT, OnUnbalanced as OnUnbalancedT, Get,
-		Everything, fungibles,
-	},
-	weights::{Weight, WeightToFeePolynomial, WeightToFee},
-	parameter_types, match_types,
-};
-use frame_system::EnsureRoot;
-use sp_runtime::{
-	traits::{Saturating, CheckedConversion, Zero},
-	SaturatedConversion,
-};
-use pallet_xcm::XcmPassthrough;
-use polkadot_parachain::primitives::Sibling;
-use xcm::v1::{BodyId, Junction::*, MultiLocation, NetworkId, Junctions::*};
-use xcm::latest::{
-	AssetId::{Concrete},
-	Fungibility::Fungible as XcmFungible,
-	MultiAsset, Error as XcmError, Instruction, Xcm,
-};
-use xcm_builder::{
-	AccountId32Aliases, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin,
-	FixedWeightBounds, FungiblesAdapter, LocationInverter, NativeAsset, ParentAsSuperuser,
-	RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,
-	SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,
-	ParentIsPreset, ConvertedConcreteAssetId,
-};
-use xcm_executor::{Config, XcmExecutor, Assets};
-use xcm_executor::traits::{
-	Convert as ConvertXcm, JustTry, MatchesFungible, WeightTrader, FilterAssetLocation,
-	ShouldExecute,
-};
-use pallet_foreing_assets::{
-	AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency, FreeForAll,
-	TryAsForeing, ForeignAssetId,
-};
-use sp_std::{borrow::Borrow, marker::PhantomData, vec, vec::Vec};
-use crate::{
-	Runtime, Call, Event, Origin, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, XcmpQueue,
-	xcm_config::Barrier,
-};
-#[cfg(feature = "foreign-assets")]
-use crate::ForeingAssets;
-
-use up_common::{
-	types::{AccountId, Balance},
-	constants::*,
-};
-
-parameter_types! {
-	pub const RelayLocation: MultiLocation = MultiLocation::parent();
-	pub const RelayNetwork: NetworkId = NetworkId::Polkadot;
-	pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();
-	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
-}
-
-/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used
-/// when determining ownership of accounts for asset transacting and when attempting to use XCM
-/// `Transact` in order to determine the dispatch Origin.
-pub type LocationToAccountId = (
-	// The parent (Relay-chain) origin converts to the default `AccountId`.
-	ParentIsPreset<AccountId>,
-	// Sibling parachain origins convert to AccountId via the `ParaId::into`.
-	SiblingParachainConvertsVia<Sibling, AccountId>,
-	// Straight up local `AccountId32` origins just alias directly to `AccountId`.
-	AccountId32Aliases<RelayNetwork, AccountId>,
-);
-
-pub struct OnlySelfCurrency;
-impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {
-	fn matches_fungible(a: &MultiAsset) -> Option<B> {
-		let paraid = Parachain(ParachainInfo::parachain_id().into());
-		match (&a.id, &a.fun) {
-			(
-				Concrete(MultiLocation {
-					parents: 1,
-					interior: X1(loc),
-				}),
-				XcmFungible(ref amount),
-			) if paraid == *loc => CheckedConversion::checked_from(*amount),
-			(
-				Concrete(MultiLocation {
-					parents: 0,
-					interior: Here,
-				}),
-				XcmFungible(ref amount),
-			) => CheckedConversion::checked_from(*amount),
-			_ => None,
-		}
-	}
-}
-
-/// Means for transacting assets on this chain.
-pub type LocalAssetTransactor = CurrencyAdapter<
-	// Use this currency:
-	Balances,
-	// Use this currency when it is a fungible asset matching the given location or name:
-	OnlySelfCurrency,
-	// Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:
-	LocationToAccountId,
-	// Our chain's account ID type (we can't get away without mentioning it explicitly):
-	AccountId,
-	// We don't track any teleports.
-	(),
->;
-
-/// No local origins on this chain are allowed to dispatch XCM sends/executions.
-pub type LocalOriginToLocation = (SignedToAccountId32<Origin, AccountId, RelayNetwork>,);
-
-/// The means for routing XCM messages which are not for local execution into the right message
-/// queues.
-pub type XcmRouter = (
-	// Two routers - use UMP to communicate with the relay chain:
-	cumulus_primitives_utility::ParentAsUmp<ParachainSystem, ()>,
-	// ..and XCMP to communicate with the sibling chains.
-	XcmpQueue,
-);
-
-/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,
-/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can
-/// biases the kind of local `Origin` it will become.
-pub type XcmOriginToTransactDispatchOrigin = (
-	// Sovereign account converter; this attempts to derive an `AccountId` from the origin location
-	// using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for
-	// foreign chains who want to have a local sovereign account on this chain which they control.
-	SovereignSignedViaLocation<LocationToAccountId, Origin>,
-	// Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when
-	// recognised.
-	RelayChainAsNative<RelayOrigin, Origin>,
-	// Native converter for sibling Parachains; will convert to a `SiblingPara` origin when
-	// recognised.
-	SiblingParachainAsNative<cumulus_pallet_xcm::Origin, Origin>,
-	// Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a
-	// transaction from the Root origin.
-	ParentAsSuperuser<Origin>,
-	// Native signed account converter; this just converts an `AccountId32` origin into a normal
-	// `Origin::Signed` origin of the same 32-byte value.
-	SignedAccountId32AsNative<RelayNetwork, Origin>,
-	// 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;
-	// 1200 UNIQUEs buy 1 second of weight.
-	pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::parent(), 1_200 * UNIQUE);
-	pub const MaxInstructions: u32 = 100;
-}
-
-match_types! {
-	pub type ParentOrParentsUnitPlurality: impl Contains<MultiLocation> = {
-		MultiLocation { parents: 1, interior: Here } |
-		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Unit, .. }) }
-	};
-}
-
-pub trait TryPass {
-	fn try_pass<Call>(
-		origin: &MultiLocation,
-		message: &mut Xcm<Call>,
-	) -> Result<(), ()>;
-}
-
-#[impl_trait_for_tuples::impl_for_tuples(30)]
-impl TryPass for Tuple {
-	fn try_pass<Call>(
-		origin: &MultiLocation,
-		message: &mut Xcm<Call>,
-	)  -> Result<(), ()> {
-		for_tuples!( #(
-			Tuple::try_pass(origin, message)?;
-		)* );
-
-		Ok(())
-	}
-}
-
-pub struct DenyTransact;
-impl TryPass for DenyTransact {
-	fn try_pass<Call>(
-		_origin: &MultiLocation,
-		message: &mut Xcm<Call>,
-	) -> Result<(), ()> {
-		let transact_inst = message
-			.0
-			.iter()
-			.find(|inst| matches![inst, Instruction::Transact { .. }]);
-
-		match transact_inst {
-			Some(_) => {
-				log::warn!(
-					target: "xcm::barrier",
-					"transact XCM rejected"
-				);
-
-				Err(())
-			}
-			None => Ok(()),
-		}
-	}
-}
-
-/// Deny executing the XCM if it matches any of the Deny filter regardless of anything else.
-/// If it passes the Deny, and matches one of the Allow cases then it is let through.
-pub struct DenyThenTry<Deny, Allow>(PhantomData<Deny>, PhantomData<Allow>)
-where
-	Deny: TryPass,
-	Allow: ShouldExecute;
-
-impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>
-where
-	Deny: TryPass,
-	Allow: ShouldExecute,
-{
-	fn should_execute<Call>(
-		origin: &MultiLocation,
-		message: &mut Xcm<Call>,
-		max_weight: Weight,
-		weight_credit: &mut Weight,
-	) -> Result<(), ()> {
-		Deny::try_pass(origin, message)?;
-		Allow::should_execute(origin, message, max_weight, weight_credit)
-	}
-}
-
-pub struct UsingOnlySelfCurrencyComponents<
-	WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,
-	AssetId: Get<MultiLocation>,
-	AccountId,
-	Currency: CurrencyT<AccountId>,
-	OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,
->(
-	Weight,
-	Currency::Balance,
-	PhantomData<(WeightToFee, AssetId, AccountId, Currency, OnUnbalanced)>,
-);
-impl<
-		WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,
-		AssetId: Get<MultiLocation>,
-		AccountId,
-		Currency: CurrencyT<AccountId>,
-		OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,
-	> WeightTrader
-	for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>
-{
-	fn new() -> Self {
-		Self(0, Zero::zero(), PhantomData)
-	}
-
-	fn buy_weight(&mut self, weight: Weight, payment: Assets) -> Result<Assets, XcmError> {
-		Ok(payment)
-	}
-}
-impl<
-		WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,
-		AssetId: Get<MultiLocation>,
-		AccountId,
-		Currency: CurrencyT<AccountId>,
-		OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,
-	> Drop
-	for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>
-{
-	fn drop(&mut self) {
-		OnUnbalanced::on_unbalanced(Currency::issue(self.1));
-	}
-}
-
-parameter_types! {
-	pub CheckingAccount: AccountId = PolkadotXcm::check_account();
-}
-/// Allow checking in assets that have issuance > 0.
-#[cfg(feature = "foreign-assets")]
-pub struct NonZeroIssuance<AccountId, ForeingAssets>(PhantomData<(AccountId, ForeingAssets)>);
-
-#[cfg(feature = "foreign-assets")]
-impl<AccountId, ForeingAssets> Contains<<ForeingAssets as fungibles::Inspect<AccountId>>::AssetId>
-	for NonZeroIssuance<AccountId, ForeingAssets>
-where
-	ForeingAssets: fungibles::Inspect<AccountId>,
-{
-	fn contains(id: &<ForeingAssets as fungibles::Inspect<AccountId>>::AssetId) -> bool {
-		!ForeingAssets::total_issuance(*id).is_zero()
-	}
-}
-
-#[cfg(feature = "foreign-assets")]
-pub struct AsInnerId<AssetId, ConvertAssetId>(PhantomData<(AssetId, ConvertAssetId)>);
-#[cfg(feature = "foreign-assets")]
-impl<AssetId: Clone + PartialEq, ConvertAssetId: ConvertXcm<AssetId, AssetId>>
-	ConvertXcm<MultiLocation, AssetId> for AsInnerId<AssetId, ConvertAssetId>
-where
-	AssetId: Borrow<AssetId>,
-	AssetId: TryAsForeing<AssetId, ForeignAssetId>,
-	AssetIds: Borrow<AssetId>,
-{
-	fn convert_ref(id: impl Borrow<MultiLocation>) -> Result<AssetId, ()> {
-		let id = id.borrow();
-
-		log::trace!(
-			target: "xcm::AsInnerId::Convert",
-			"AsInnerId {:?}",
-			id
-		);
-
-		let parent = MultiLocation::parent();
-		let here = MultiLocation::here();
-		let self_location = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
-
-		if *id == parent {
-			return ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Parent));
-		}
-
-		if *id == here || *id == self_location {
-			return ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Here));
-		}
-
-		match XcmForeignAssetIdMapping::<Runtime>::get_currency_id(id.clone()) {
-			Some(AssetIds::ForeignAssetId(foreign_asset_id)) => {
-				ConvertAssetId::convert_ref(AssetIds::ForeignAssetId(foreign_asset_id))
-			}
-			_ => ConvertAssetId::convert_ref(AssetIds::ForeignAssetId(0)),
-		}
-	}
-
-	fn reverse_ref(what: impl Borrow<AssetId>) -> Result<MultiLocation, ()> {
-		log::trace!(
-			target: "xcm::AsInnerId::Reverse",
-			"AsInnerId",
-		);
-
-		let asset_id = what.borrow();
-
-		let parent_id =
-			ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Parent)).unwrap();
-		let here_id =
-			ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Here)).unwrap();
-
-		if asset_id.clone() == parent_id {
-			return Ok(MultiLocation::parent());
-		}
-
-		if asset_id.clone() == here_id {
-			return Ok(MultiLocation::new(
-				1,
-				X1(Parachain(ParachainInfo::get().into())),
-			));
-		}
-
-		match <AssetId as TryAsForeing<AssetId, ForeignAssetId>>::try_as_foreing(asset_id.clone()) {
-			Some(fid) => match XcmForeignAssetIdMapping::<Runtime>::get_multi_location(fid) {
-				Some(location) => Ok(location),
-				None => Err(()),
-			},
-			None => Err(()),
-		}
-	}
-}
-
-/// Means for transacting assets besides the native currency on this chain.
-#[cfg(feature = "foreign-assets")]
-pub type FungiblesTransactor = FungiblesAdapter<
-	// Use this fungibles implementation:
-	ForeingAssets,
-	// Use this currency when it is a fungible asset matching the given location or name:
-	ConvertedConcreteAssetId<AssetIds, Balance, AsInnerId<AssetIds, JustTry>, JustTry>,
-	// Convert an XCM MultiLocation into a local account id:
-	LocationToAccountId,
-	// Our chain's account ID type (we can't get away without mentioning it explicitly):
-	AccountId,
-	// We only want to allow teleports of known assets. We use non-zero issuance as an indication
-	// that this asset is known.
-	NonZeroIssuance<AccountId, ForeingAssets>,
-	// The account to use for tracking teleports.
-	CheckingAccount,
->;
-
-/// Means for transacting assets on this chain.
-#[cfg(feature = "foreign-assets")]
-pub type AssetTransactors = FungiblesTransactor;
-
-#[cfg(not(feature = "foreign-assets"))]
-pub type AssetTransactors = LocalAssetTransactor;
-
-#[cfg(feature = "foreign-assets")]
-pub struct AllAsset;
-#[cfg(feature = "foreign-assets")]
-impl FilterAssetLocation for AllAsset {
-	fn filter_asset_location(asset: &MultiAsset, origin: &MultiLocation) -> bool {
-		true
-	}
-}
-
-#[cfg(feature = "foreign-assets")]
-pub type IsReserve = AllAsset;
-#[cfg(not(feature = "foreign-assets"))]
-pub type IsReserve = NativeAsset;
-
-#[cfg(feature = "foreign-assets")]
-type Trader<T> = FreeForAll<
-	pallet_configuration::WeightToFee<T, Balance>,
-	RelayLocation,
-	AccountId,
-	Balances,
-	(),
->;
-#[cfg(not(feature = "foreign-assets"))]
-type Trader<T> = UsingOnlySelfCurrencyComponents<
-	pallet_configuration::WeightToFee<T, Balance>,
-	RelayLocation,
-	AccountId,
-	Balances,
-	(),
->;
-
-pub struct XcmConfig<T>(PhantomData<T>);
-impl<T> Config for XcmConfig<T>
-where
-	T: pallet_configuration::Config,
-{
-	type Call = Call;
-	type XcmSender = XcmRouter;
-	// How to withdraw and deposit an asset.
-	type AssetTransactor = AssetTransactors;
-	type OriginConverter = XcmOriginToTransactDispatchOrigin;
-	type IsReserve = IsReserve;
-	type IsTeleporter = (); // Teleportation is disabled
-	type LocationInverter = LocationInverter<Ancestry>;
-	type Barrier = Barrier;
-	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
-	type Trader = Trader<T>;
-	type ResponseHandler = (); // Don't handle responses for now.
-	type SubscriptionService = PolkadotXcm;
-
-	type AssetTrap = PolkadotXcm;
-	type AssetClaims = PolkadotXcm;
-}
-
-impl pallet_xcm::Config for Runtime {
-	type Event = Event;
-	type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;
-	type XcmRouter = XcmRouter;
-	type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;
-	type XcmExecuteFilter = Everything;
-	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
-	type XcmTeleportFilter = Everything;
-	type XcmReserveTransferFilter = Everything;
-	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
-	type LocationInverter = LocationInverter<Ancestry>;
-	type Origin = Origin;
-	type Call = Call;
-	const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;
-	type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;
-}
-
-impl cumulus_pallet_xcm::Config for Runtime {
-	type Event = Event;
-	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
-}
-
-impl cumulus_pallet_xcmp_queue::Config for Runtime {
-	type WeightInfo = ();
-	type Event = Event;
-	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
-	type ChannelInfo = ParachainSystem;
-	type VersionWrapper = ();
-	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;
-	type ControllerOrigin = EnsureRoot<AccountId>;
-	type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;
-}
-
-impl cumulus_pallet_dmp_queue::Config for Runtime {
-	type Event = Event;
-	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
-	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;
-}
addedruntime/common/config/xcm/foreignassets.rsdiffbeforeafterboth
--- /dev/null
+++ b/runtime/common/config/xcm/foreignassets.rs
@@ -0,0 +1,160 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// 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::{Contains, Get, fungibles},
+	parameter_types,
+};
+use sp_runtime::traits::Zero;
+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,
+};
+use sp_std::{borrow::Borrow, marker::PhantomData};
+use crate::{Runtime, Balances, ParachainInfo, PolkadotXcm, ForeingAssets};
+
+use super::{LocationToAccountId, RelayLocation};
+
+use up_common::types::{AccountId, Balance};
+
+parameter_types! {
+	pub CheckingAccount: AccountId = PolkadotXcm::check_account();
+}
+
+/// Allow checking in assets that have issuance > 0.
+pub struct NonZeroIssuance<AccountId, ForeingAssets>(PhantomData<(AccountId, ForeingAssets)>);
+
+impl<AccountId, ForeingAssets> Contains<<ForeingAssets as fungibles::Inspect<AccountId>>::AssetId>
+	for NonZeroIssuance<AccountId, ForeingAssets>
+where
+	ForeingAssets: fungibles::Inspect<AccountId>,
+{
+	fn contains(id: &<ForeingAssets as fungibles::Inspect<AccountId>>::AssetId) -> bool {
+		!ForeingAssets::total_issuance(*id).is_zero()
+	}
+}
+
+pub struct AsInnerId<AssetId, ConvertAssetId>(PhantomData<(AssetId, ConvertAssetId)>);
+impl<AssetId: Clone + PartialEq, ConvertAssetId: ConvertXcm<AssetId, AssetId>>
+	ConvertXcm<MultiLocation, AssetId> for AsInnerId<AssetId, ConvertAssetId>
+where
+	AssetId: Borrow<AssetId>,
+	AssetId: TryAsForeing<AssetId, ForeignAssetId>,
+	AssetIds: Borrow<AssetId>,
+{
+	fn convert_ref(id: impl Borrow<MultiLocation>) -> Result<AssetId, ()> {
+		let id = id.borrow();
+
+		log::trace!(
+			target: "xcm::AsInnerId::Convert",
+			"AsInnerId {:?}",
+			id
+		);
+
+		let parent = MultiLocation::parent();
+		let here = MultiLocation::here();
+		let self_location = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
+
+		if *id == parent {
+			return ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Parent));
+		}
+
+		if *id == here || *id == self_location {
+			return ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Here));
+		}
+
+		match XcmForeignAssetIdMapping::<Runtime>::get_currency_id(id.clone()) {
+			Some(AssetIds::ForeignAssetId(foreign_asset_id)) => {
+				ConvertAssetId::convert_ref(AssetIds::ForeignAssetId(foreign_asset_id))
+			}
+			_ => ConvertAssetId::convert_ref(AssetIds::ForeignAssetId(0)),
+		}
+	}
+
+	fn reverse_ref(what: impl Borrow<AssetId>) -> Result<MultiLocation, ()> {
+		log::trace!(
+			target: "xcm::AsInnerId::Reverse",
+			"AsInnerId",
+		);
+
+		let asset_id = what.borrow();
+
+		let parent_id =
+			ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Parent)).unwrap();
+		let here_id =
+			ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Here)).unwrap();
+
+		if asset_id.clone() == parent_id {
+			return Ok(MultiLocation::parent());
+		}
+
+		if asset_id.clone() == here_id {
+			return Ok(MultiLocation::new(
+				1,
+				X1(Parachain(ParachainInfo::get().into())),
+			));
+		}
+
+		match <AssetId as TryAsForeing<AssetId, ForeignAssetId>>::try_as_foreing(asset_id.clone()) {
+			Some(fid) => match XcmForeignAssetIdMapping::<Runtime>::get_multi_location(fid) {
+				Some(location) => Ok(location),
+				None => Err(()),
+			},
+			None => Err(()),
+		}
+	}
+}
+
+/// Means for transacting assets besides the native currency on this chain.
+pub type FungiblesTransactor = FungiblesAdapter<
+	// Use this fungibles implementation:
+	ForeingAssets,
+	// Use this currency when it is a fungible asset matching the given location or name:
+	ConvertedConcreteAssetId<AssetIds, Balance, AsInnerId<AssetIds, JustTry>, JustTry>,
+	// Convert an XCM MultiLocation into a local account id:
+	LocationToAccountId,
+	// Our chain's account ID type (we can't get away without mentioning it explicitly):
+	AccountId,
+	// We only want to allow teleports of known assets. We use non-zero issuance as an indication
+	// that this asset is known.
+	NonZeroIssuance<AccountId, ForeingAssets>,
+	// The account to use for tracking teleports.
+	CheckingAccount,
+>;
+
+/// Means for transacting assets on this chain.
+pub type AssetTransactors = FungiblesTransactor;
+
+pub struct AllAsset;
+impl FilterAssetLocation for AllAsset {
+	fn filter_asset_location(_asset: &MultiAsset, _origin: &MultiLocation) -> bool {
+		true
+	}
+}
+
+pub type IsReserve = AllAsset;
+
+pub type Trader<T> = FreeForAll<
+	pallet_configuration::WeightToFee<T, Balance>,
+	RelayLocation,
+	AccountId,
+	Balances,
+	(),
+>;
addedruntime/common/config/xcm/mod.rsdiffbeforeafterboth
--- /dev/null
+++ b/runtime/common/config/xcm/mod.rs
@@ -0,0 +1,232 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// 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_system::EnsureRoot;
+use pallet_xcm::XcmPassthrough;
+use polkadot_parachain::primitives::Sibling;
+use xcm::v1::{Junction::*, MultiLocation, NetworkId};
+use xcm::latest::{Instruction, Xcm};
+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 crate::{
+	Runtime, Call, Event, Origin, ParachainInfo, ParachainSystem, PolkadotXcm, XcmpQueue,
+	xcm_config::Barrier,
+};
+
+use up_common::types::AccountId;
+
+#[cfg(feature = "foreign-assets")]
+mod foreignassets;
+
+#[cfg(not(feature = "foreign-assets"))]
+mod nativeassets;
+
+#[cfg(feature = "foreign-assets")]
+use foreignassets as xcm_assets;
+
+#[cfg(not(feature = "foreign-assets"))]
+use nativeassets as xcm_assets;
+
+use xcm_assets::{AssetTransactors, IsReserve, Trader};
+
+parameter_types! {
+	pub const RelayLocation: MultiLocation = MultiLocation::parent();
+	pub const RelayNetwork: NetworkId = NetworkId::Polkadot;
+	pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();
+	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
+}
+
+/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used
+/// when determining ownership of accounts for asset transacting and when attempting to use XCM
+/// `Transact` in order to determine the dispatch Origin.
+pub type LocationToAccountId = (
+	// The parent (Relay-chain) origin converts to the default `AccountId`.
+	ParentIsPreset<AccountId>,
+	// Sibling parachain origins convert to AccountId via the `ParaId::into`.
+	SiblingParachainConvertsVia<Sibling, AccountId>,
+	// Straight up local `AccountId32` origins just alias directly to `AccountId`.
+	AccountId32Aliases<RelayNetwork, AccountId>,
+);
+
+/// No local origins on this chain are allowed to dispatch XCM sends/executions.
+pub type LocalOriginToLocation = (SignedToAccountId32<Origin, AccountId, RelayNetwork>,);
+
+/// The means for routing XCM messages which are not for local execution into the right message
+/// queues.
+pub type XcmRouter = (
+	// Two routers - use UMP to communicate with the relay chain:
+	cumulus_primitives_utility::ParentAsUmp<ParachainSystem, ()>,
+	// ..and XCMP to communicate with the sibling chains.
+	XcmpQueue,
+);
+
+/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,
+/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can
+/// biases the kind of local `Origin` it will become.
+pub type XcmOriginToTransactDispatchOrigin = (
+	// Sovereign account converter; this attempts to derive an `AccountId` from the origin location
+	// using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for
+	// foreign chains who want to have a local sovereign account on this chain which they control.
+	SovereignSignedViaLocation<LocationToAccountId, Origin>,
+	// Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when
+	// recognised.
+	RelayChainAsNative<RelayOrigin, Origin>,
+	// Native converter for sibling Parachains; will convert to a `SiblingPara` origin when
+	// recognised.
+	SiblingParachainAsNative<cumulus_pallet_xcm::Origin, Origin>,
+	// Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a
+	// transaction from the Root origin.
+	ParentAsSuperuser<Origin>,
+	// Native signed account converter; this just converts an `AccountId32` origin into a normal
+	// `Origin::Signed` origin of the same 32-byte value.
+	SignedAccountId32AsNative<RelayNetwork, Origin>,
+	// 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<(), ()>;
+}
+
+#[impl_trait_for_tuples::impl_for_tuples(30)]
+impl TryPass for Tuple {
+	fn try_pass<Call>(origin: &MultiLocation, message: &mut Xcm<Call>) -> Result<(), ()> {
+		for_tuples!( #(
+			Tuple::try_pass(origin, message)?;
+		)* );
+
+		Ok(())
+	}
+}
+
+pub struct DenyTransact;
+impl TryPass for DenyTransact {
+	fn try_pass<Call>(_origin: &MultiLocation, message: &mut Xcm<Call>) -> Result<(), ()> {
+		let transact_inst = message
+			.0
+			.iter()
+			.find(|inst| matches![inst, Instruction::Transact { .. }]);
+
+		match transact_inst {
+			Some(_) => {
+				log::warn!(
+					target: "xcm::barrier",
+					"transact XCM rejected"
+				);
+
+				Err(())
+			}
+			None => Ok(()),
+		}
+	}
+}
+
+/// Deny executing the XCM if it matches any of the Deny filter regardless of anything else.
+/// If it passes the Deny, and matches one of the Allow cases then it is let through.
+pub struct DenyThenTry<Deny, Allow>(PhantomData<Deny>, PhantomData<Allow>)
+where
+	Deny: TryPass,
+	Allow: ShouldExecute;
+
+impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>
+where
+	Deny: TryPass,
+	Allow: ShouldExecute,
+{
+	fn should_execute<Call>(
+		origin: &MultiLocation,
+		message: &mut Xcm<Call>,
+		max_weight: Weight,
+		weight_credit: &mut Weight,
+	) -> Result<(), ()> {
+		Deny::try_pass(origin, message)?;
+		Allow::should_execute(origin, message, max_weight, weight_credit)
+	}
+}
+
+pub struct XcmConfig<T>(PhantomData<T>);
+impl<T> Config for XcmConfig<T>
+where
+	T: pallet_configuration::Config,
+{
+	type Call = Call;
+	type XcmSender = XcmRouter;
+	// How to withdraw and deposit an asset.
+	type AssetTransactor = AssetTransactors;
+	type OriginConverter = XcmOriginToTransactDispatchOrigin;
+	type IsReserve = IsReserve;
+	type IsTeleporter = (); // Teleportation is disabled
+	type LocationInverter = LocationInverter<Ancestry>;
+	type Barrier = Barrier;
+	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
+	type Trader = Trader<T>;
+	type ResponseHandler = (); // Don't handle responses for now.
+	type SubscriptionService = PolkadotXcm;
+
+	type AssetTrap = PolkadotXcm;
+	type AssetClaims = PolkadotXcm;
+}
+
+impl pallet_xcm::Config for Runtime {
+	type Event = Event;
+	type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;
+	type XcmRouter = XcmRouter;
+	type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;
+	type XcmExecuteFilter = Everything;
+	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
+	type XcmTeleportFilter = Everything;
+	type XcmReserveTransferFilter = Everything;
+	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
+	type LocationInverter = LocationInverter<Ancestry>;
+	type Origin = Origin;
+	type Call = Call;
+	const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;
+	type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;
+}
+
+impl cumulus_pallet_xcm::Config for Runtime {
+	type Event = Event;
+	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
+}
+
+impl cumulus_pallet_xcmp_queue::Config for Runtime {
+	type WeightInfo = ();
+	type Event = Event;
+	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
+	type ChannelInfo = ParachainSystem;
+	type VersionWrapper = ();
+	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;
+	type ControllerOrigin = EnsureRoot<AccountId>;
+	type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;
+}
+
+impl cumulus_pallet_dmp_queue::Config for Runtime {
+	type Event = Event;
+	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
+	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;
+}
addedruntime/common/config/xcm/nativeassets.rsdiffbeforeafterboth
--- /dev/null
+++ b/runtime/common/config/xcm/nativeassets.rs
@@ -0,0 +1,129 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// 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::{tokens::currency::Currency as CurrencyT, OnUnbalanced as OnUnbalancedT, Get},
+	weights::{Weight, WeightToFeePolynomial},
+};
+use sp_runtime::traits::{CheckedConversion, Zero};
+use xcm::v1::{Junction::*, MultiLocation, Junctions::*};
+use xcm::latest::{
+	AssetId::{Concrete},
+	Fungibility::Fungible as XcmFungible,
+	MultiAsset, Error as XcmError,
+};
+use xcm_builder::{CurrencyAdapter, NativeAsset};
+use xcm_executor::{
+	Assets,
+	traits::{MatchesFungible, WeightTrader},
+};
+use sp_std::marker::PhantomData;
+use crate::{Balances, ParachainInfo};
+use super::{LocationToAccountId, RelayLocation};
+
+use up_common::types::{AccountId, Balance};
+
+pub struct OnlySelfCurrency;
+impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {
+	fn matches_fungible(a: &MultiAsset) -> Option<B> {
+		let paraid = Parachain(ParachainInfo::parachain_id().into());
+		match (&a.id, &a.fun) {
+			(
+				Concrete(MultiLocation {
+					parents: 1,
+					interior: X1(loc),
+				}),
+				XcmFungible(ref amount),
+			) if paraid == *loc => CheckedConversion::checked_from(*amount),
+			(
+				Concrete(MultiLocation {
+					parents: 0,
+					interior: Here,
+				}),
+				XcmFungible(ref amount),
+			) => CheckedConversion::checked_from(*amount),
+			_ => None,
+		}
+	}
+}
+
+/// Means for transacting assets on this chain.
+pub type LocalAssetTransactor = CurrencyAdapter<
+	// Use this currency:
+	Balances,
+	// Use this currency when it is a fungible asset matching the given location or name:
+	OnlySelfCurrency,
+	// Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:
+	LocationToAccountId,
+	// Our chain's account ID type (we can't get away without mentioning it explicitly):
+	AccountId,
+	// We don't track any teleports.
+	(),
+>;
+
+pub type AssetTransactors = LocalAssetTransactor;
+
+pub type IsReserve = NativeAsset;
+
+pub struct UsingOnlySelfCurrencyComponents<
+	WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,
+	AssetId: Get<MultiLocation>,
+	AccountId,
+	Currency: CurrencyT<AccountId>,
+	OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,
+>(
+	Weight,
+	Currency::Balance,
+	PhantomData<(WeightToFee, AssetId, AccountId, Currency, OnUnbalanced)>,
+);
+impl<
+		WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,
+		AssetId: Get<MultiLocation>,
+		AccountId,
+		Currency: CurrencyT<AccountId>,
+		OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,
+	> WeightTrader
+	for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>
+{
+	fn new() -> Self {
+		Self(0, Zero::zero(), PhantomData)
+	}
+
+	fn buy_weight(&mut self, _weight: Weight, payment: Assets) -> Result<Assets, XcmError> {
+		Ok(payment)
+	}
+}
+impl<
+		WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,
+		AssetId: Get<MultiLocation>,
+		AccountId,
+		Currency: CurrencyT<AccountId>,
+		OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,
+	> Drop
+	for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>
+{
+	fn drop(&mut self) {
+		OnUnbalanced::on_unbalanced(Currency::issue(self.1));
+	}
+}
+
+pub type Trader<T> = UsingOnlySelfCurrencyComponents<
+	pallet_configuration::WeightToFee<T, Balance>,
+	RelayLocation,
+	AccountId,
+	Balances,
+	(),
+>;
modifiedruntime/common/tests/mod.rsdiffbeforeafterboth
--- a/runtime/common/tests/mod.rs
+++ b/runtime/common/tests/mod.rs
@@ -29,20 +29,18 @@
 }
 
 fn new_test_ext(para_id: u32) -> sp_io::TestExternalities {
-    let cfg = GenesisConfig {
-        aura: AuraConfig {
-            authorities: vec![
-                get_from_seed::<AuraId>("Alice"),
-                get_from_seed::<AuraId>("Bob"),
-            ],
-        },
-        parachain_info: ParachainInfoConfig {
-            parachain_id: para_id.into(),
-        },
-        ..GenesisConfig::default()
-    };
+	let cfg = GenesisConfig {
+		aura: AuraConfig {
+			authorities: vec![
+				get_from_seed::<AuraId>("Alice"),
+				get_from_seed::<AuraId>("Bob"),
+			],
+		},
+		parachain_info: ParachainInfoConfig {
+			parachain_id: para_id.into(),
+		},
+		..GenesisConfig::default()
+	};
 
-	cfg.build_storage()
-        .unwrap()
-		.into()
+	cfg.build_storage().unwrap().into()
 }
modifiedruntime/common/tests/xcm.rsdiffbeforeafterboth
before · runtime/common/tests/xcm.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617use xcm_executor::traits::ShouldExecute;18use xcm::latest::prelude::*;19use logtest::Logger;20use crate::Call;21use super::new_test_ext;2223fn catch_xcm_barrier_log(24    logger: &mut Logger,25    expected_msg: &str26) -> Result<(), String> {27    for record in logger {28        if record.target() == "xcm::barrier"29        && record.args() == expected_msg {30            return Ok(());31        }32    }3334    Err(format!("the expected XCM barrier log `{}` is not found", expected_msg))35}3637/// WARNING: Uses log capturing38/// See https://docs.rs/logtest/latest/logtest/index.html#constraints39pub fn barrier_denies_transact<B: ShouldExecute>(logger: &mut Logger) {40    let location = MultiLocation {41        parents: 0,42        interior: Junctions::Here,43    };4445    // We will never decode this "call",46    // so it is irrelevant what we are passing to the `transact` cmd.47    let fake_encoded_call = vec![0u8];4849    let transact_inst = Transact {50        origin_type: OriginKind::Superuser,51        require_weight_at_most: 0,52        call: fake_encoded_call.into(),53    };5455    let mut xcm_program = Xcm::<Call>(vec![transact_inst]);5657    let max_weight = 100_000;58    let mut weight_credit = 100_000_000;5960    let result = B::should_execute(61        &location,62        &mut xcm_program,63        max_weight,64        &mut weight_credit65    );6667    assert!(result.is_err(), "the barrier should disallow the XCM transact cmd");6869    catch_xcm_barrier_log(logger, "transact XCM rejected").unwrap();70}7172fn xcm_execute<B: ShouldExecute>(73    self_para_id: u32,74    location: &MultiLocation,75    xcm: &mut Xcm<Call>76) -> Result<(), ()> {77    new_test_ext(self_para_id).execute_with(|| {78        let max_weight = 100_000;79        let mut weight_credit = 100_000_000;8081        B::should_execute(82            &location,83            xcm,84            max_weight,85            &mut weight_credit86        )87    })88}8990fn make_multiassets(location: &MultiLocation) -> MultiAssets {91    let id = AssetId::Concrete(location.clone());92    let fun = Fungibility::Fungible(42);93    let multiasset = MultiAsset {94        id,95        fun,96    };9798    multiasset.into()99}100101fn make_transfer_reserve_asset(location: &MultiLocation) -> Xcm<Call> {102    let assets = make_multiassets(location);103    let inst = TransferReserveAsset {104        assets,105        dest: location.clone(),106        xcm: Xcm(vec![]),107    };108109    Xcm::<Call>(vec![inst])110}111112fn make_deposit_reserve_asset(location: &MultiLocation) -> Xcm<Call> {113    let assets = make_multiassets(location);114    let inst = DepositReserveAsset {115        assets: assets.into(),116        max_assets: 42,117        dest: location.clone(),118        xcm: Xcm(vec![]),119    };120121    Xcm::<Call>(vec![inst])122}123124fn expect_transfer_location_denied<B: ShouldExecute>(125    logger: &mut Logger,126    self_para_id: u32,127    location: &MultiLocation,128    xcm: &mut Xcm<Call>129) -> Result<(), String> {130    let result = xcm_execute::<B>(self_para_id, location, xcm);131132    if result.is_ok() {133        return Err("the barrier should deny the unknown location".into());134    }135136    catch_xcm_barrier_log(logger, "Unexpected deposit or transfer location")137}138139/// WARNING: Uses log capturing140/// See https://docs.rs/logtest/latest/logtest/index.html#constraints141pub fn barrier_denies_transfer_from_unknown_location<B>(142    logger: &mut Logger,143    self_para_id: u32,144) -> Result<(), String>145where146    B: ShouldExecute147{148    const UNKNOWN_PARACHAIN_ID: u32 = 4057;149150    let unknown_location = MultiLocation {151        parents: 1,152        interior: X1(Parachain(UNKNOWN_PARACHAIN_ID)),153    };154155    let mut transfer_reserve_asset = make_transfer_reserve_asset(&unknown_location);156    let mut deposit_reserve_asset = make_deposit_reserve_asset(&unknown_location);157158    expect_transfer_location_denied::<B>(159        logger,160        self_para_id,161        &unknown_location,162        &mut transfer_reserve_asset163    )?;164165    expect_transfer_location_denied::<B>(166        logger,167        self_para_id,168        &unknown_location,169        &mut deposit_reserve_asset170    )?;171172    Ok(())173}
after · runtime/common/tests/xcm.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617use xcm_executor::traits::ShouldExecute;18use xcm::latest::prelude::*;19use logtest::Logger;20use crate::Call;21use super::new_test_ext;2223fn catch_xcm_barrier_log(logger: &mut Logger, expected_msg: &str) -> Result<(), String> {24	for record in logger {25		if record.target() == "xcm::barrier" && record.args() == expected_msg {26			return Ok(());27		}28	}2930	Err(format!(31		"the expected XCM barrier log `{}` is not found",32		expected_msg33	))34}3536/// WARNING: Uses log capturing37/// See https://docs.rs/logtest/latest/logtest/index.html#constraints38pub fn barrier_denies_transact<B: ShouldExecute>(logger: &mut Logger) {39	let location = MultiLocation {40		parents: 0,41		interior: Junctions::Here,42	};4344	// We will never decode this "call",45	// so it is irrelevant what we are passing to the `transact` cmd.46	let fake_encoded_call = vec![0u8];4748	let transact_inst = Transact {49		origin_type: OriginKind::Superuser,50		require_weight_at_most: 0,51		call: fake_encoded_call.into(),52	};5354	let mut xcm_program = Xcm::<Call>(vec![transact_inst]);5556	let max_weight = 100_000;57	let mut weight_credit = 100_000_000;5859	let result = B::should_execute(&location, &mut xcm_program, max_weight, &mut weight_credit);6061	assert!(62		result.is_err(),63		"the barrier should disallow the XCM transact cmd"64	);6566	catch_xcm_barrier_log(logger, "transact XCM rejected").unwrap();67}6869fn xcm_execute<B: ShouldExecute>(70	self_para_id: u32,71	location: &MultiLocation,72	xcm: &mut Xcm<Call>,73) -> Result<(), ()> {74	new_test_ext(self_para_id).execute_with(|| {75		let max_weight = 100_000;76		let mut weight_credit = 100_000_000;7778		B::should_execute(&location, xcm, max_weight, &mut weight_credit)79	})80}8182fn make_multiassets(location: &MultiLocation) -> MultiAssets {83	let id = AssetId::Concrete(location.clone());84	let fun = Fungibility::Fungible(42);85	let multiasset = MultiAsset { id, fun };8687	multiasset.into()88}8990fn make_transfer_reserve_asset(location: &MultiLocation) -> Xcm<Call> {91	let assets = make_multiassets(location);92	let inst = TransferReserveAsset {93		assets,94		dest: location.clone(),95		xcm: Xcm(vec![]),96	};9798	Xcm::<Call>(vec![inst])99}100101fn make_deposit_reserve_asset(location: &MultiLocation) -> Xcm<Call> {102	let assets = make_multiassets(location);103	let inst = DepositReserveAsset {104		assets: assets.into(),105		max_assets: 42,106		dest: location.clone(),107		xcm: Xcm(vec![]),108	};109110	Xcm::<Call>(vec![inst])111}112113fn expect_transfer_location_denied<B: ShouldExecute>(114	logger: &mut Logger,115	self_para_id: u32,116	location: &MultiLocation,117	xcm: &mut Xcm<Call>,118) -> Result<(), String> {119	let result = xcm_execute::<B>(self_para_id, location, xcm);120121	if result.is_ok() {122		return Err("the barrier should deny the unknown location".into());123	}124125	catch_xcm_barrier_log(logger, "Unexpected deposit or transfer location")126}127128/// WARNING: Uses log capturing129/// See https://docs.rs/logtest/latest/logtest/index.html#constraints130pub fn barrier_denies_transfer_from_unknown_location<B>(131	logger: &mut Logger,132	self_para_id: u32,133) -> Result<(), String>134where135	B: ShouldExecute,136{137	const UNKNOWN_PARACHAIN_ID: u32 = 4057;138139	let unknown_location = MultiLocation {140		parents: 1,141		interior: X1(Parachain(UNKNOWN_PARACHAIN_ID)),142	};143144	let mut transfer_reserve_asset = make_transfer_reserve_asset(&unknown_location);145	let mut deposit_reserve_asset = make_deposit_reserve_asset(&unknown_location);146147	expect_transfer_location_denied::<B>(148		logger,149		self_para_id,150		&unknown_location,151		&mut transfer_reserve_asset,152	)?;153154	expect_transfer_location_denied::<B>(155		logger,156		self_para_id,157		&unknown_location,158		&mut deposit_reserve_asset,159	)?;160161	Ok(())162}
modifiedruntime/opal/src/tests/logcapture.rsdiffbeforeafterboth
--- a/runtime/opal/src/tests/logcapture.rs
+++ b/runtime/opal/src/tests/logcapture.rs
@@ -19,7 +19,7 @@
 
 #[test]
 fn opal_log_capture_tests() {
-    let mut logger = Logger::start();
-    
-    opal_xcm_tests(&mut logger);
+	let mut logger = Logger::start();
+
+	opal_xcm_tests(&mut logger);
 }
modifiedruntime/opal/src/tests/mod.rsdiffbeforeafterboth
--- a/runtime/opal/src/tests/mod.rs
+++ b/runtime/opal/src/tests/mod.rs
@@ -14,5 +14,5 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+mod logcapture;
 mod xcm;
-mod logcapture;
modifiedruntime/opal/src/tests/xcm.rsdiffbeforeafterboth
--- a/runtime/opal/src/tests/xcm.rs
+++ b/runtime/opal/src/tests/xcm.rs
@@ -15,18 +15,13 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 use logtest::Logger;
-use crate::{
-    runtime_common::tests::xcm::*,
-    xcm_config::Barrier,
-};
+use crate::{runtime_common::tests::xcm::*, xcm_config::Barrier};
 
 const OPAL_PARA_ID: u32 = 2095; // Same as Quartz
 
 pub fn opal_xcm_tests(logger: &mut Logger) {
-    barrier_denies_transact::<Barrier>(logger);
+	barrier_denies_transact::<Barrier>(logger);
 
-    barrier_denies_transfer_from_unknown_location::<Barrier>(
-        logger,
-        OPAL_PARA_ID,
-    ).expect_err("opal runtime allows any location");
+	barrier_denies_transfer_from_unknown_location::<Barrier>(logger, OPAL_PARA_ID)
+		.expect_err("opal runtime allows any location");
 }
modifiedruntime/opal/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/opal/src/xcm_config.rs
+++ b/runtime/opal/src/xcm_config.rs
@@ -14,98 +14,41 @@
 // 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 cumulus_pallet_xcm;
 use frame_support::{
 	{match_types, parameter_types, weights::Weight},
 	pallet_prelude::Get,
-	traits::{Contains, Everything, fungibles},
+	traits::{Contains, Everything},
 };
-use frame_system::EnsureRoot;
 use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
-use pallet_xcm::XcmPassthrough;
-use polkadot_parachain::primitives::Sibling;
-use sp_runtime::traits::{AccountIdConversion, CheckedConversion, Convert, Zero};
-use sp_std::{borrow::Borrow, marker::PhantomData, vec, vec::Vec};
+use sp_runtime::traits::{AccountIdConversion, Convert};
+use sp_std::{vec, vec::Vec};
 use xcm::{
-	latest::{MultiAsset, Xcm},
-	prelude::{Concrete, Fungible as XcmFungible},
+	latest::Xcm,
 	v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
 };
 use xcm_builder::{
-	AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, EnsureXcmOrigin,
-	FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser, ParentIsPreset,
-	RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,
-	SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,
-	ConvertedConcreteAssetId,
-};
-use xcm_executor::{
-	{Config, XcmExecutor},
-	traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible, ShouldExecute},
+	AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, FixedWeightBounds, LocationInverter,
+	TakeWeightCredit,
 };
+use xcm_executor::{XcmExecutor, traits::ShouldExecute};
 
-use up_common::{
-	constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},
-	types::{AccountId, Balance},
-};
-
+use up_common::types::{AccountId, Balance};
 use crate::{
-	Balances, Call, DmpQueue, Event, ForeingAssets, Origin, ParachainInfo, ParachainSystem,
-	PolkadotXcm, Runtime, XcmpQueue,
+	Call, Event, ParachainInfo, Runtime,
+	runtime_common::config::{
+		substrate::{TreasuryModuleId, MaxLocks, MaxReserves},
+		pallets::TreasuryAccountId,
+		xcm::*,
+	},
 };
-use crate::runtime_common::config::substrate::{TreasuryModuleId, MaxLocks, MaxReserves};
-use crate::runtime_common::config::pallets::TreasuryAccountId;
-use crate::runtime_common::config::xcm::*;
-use crate::*;
 
 use pallet_foreing_assets::{
-	AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency, FreeForAll,
-	TryAsForeing, ForeignAssetId,
+	AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,
 };
 
 // Signed version of balance
 pub type Amount = i128;
-
-parameter_types! {
-	pub const RelayLocation: MultiLocation = MultiLocation::parent();
-	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())));
-}
 
-/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,
-/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can
-/// biases the kind of local `Origin` it will become.
-pub type XcmOriginToTransactDispatchOrigin = (
-	// Sovereign account converter; this attempts to derive an `AccountId` from the origin location
-	// using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for
-	// foreign chains who want to have a local sovereign account on this chain which they control.
-	SovereignSignedViaLocation<LocationToAccountId, Origin>,
-	// Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when
-	// recognised.
-	RelayChainAsNative<RelayOrigin, Origin>,
-	// Native converter for sibling Parachains; will convert to a `SiblingPara` origin when
-	// recognised.
-	SiblingParachainAsNative<cumulus_pallet_xcm::Origin, Origin>,
-	// Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a
-	// transaction from the Root origin.
-	ParentAsSuperuser<Origin>,
-	// Native signed account converter; this just converts an `AccountId32` origin into a normal
-	// `Origin::Signed` origin of the same 32-byte value.
-	SignedAccountId32AsNative<RelayNetwork, Origin>,
-	// 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;
-	// 1200 UNIQUEs buy 1 second of weight.
-	pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::parent(), 1_200 * UNIQUE);
-	pub const MaxInstructions: u32 = 100;
-	pub const MaxAuthorities: u32 = 100_000;
-}
-
 match_types! {
 	pub type ParentOrParentsUnitPlurality: impl Contains<MultiLocation> = {
 		MultiLocation { parents: 1, interior: Here } |
@@ -123,8 +66,8 @@
 	fn should_execute<Call>(
 		_origin: &MultiLocation,
 		_message: &mut Xcm<Call>,
-		max_weight: Weight,
-		weight_credit: &mut Weight,
+		_max_weight: Weight,
+		_weight_credit: &mut Weight,
 	) -> Result<(), ()> {
 		Ok(())
 	}
@@ -138,31 +81,9 @@
 		AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,
 		// ^^^ Parent & its unit plurality gets free execution
 		AllowAllDebug,
-	)
+	),
 >;
-
-pub struct AllAsset;
-impl FilterAssetLocation for AllAsset {
-	fn filter_asset_location(asset: &MultiAsset, origin: &MultiLocation) -> bool {
-		true
-	}
-}
 
-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()
@@ -185,15 +106,39 @@
 	}
 }
 
-pub fn get_all_module_accounts() -> Vec<AccountId> {
-	vec![TreasuryModuleId::get().into_account_truncating()]
+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 = ();
 }
 
-pub struct DustRemovalWhitelist;
-impl Contains<AccountId> for DustRemovalWhitelist {
-	fn contains(a: &AccountId) -> bool {
-		get_all_module_accounts().contains(a)
-	}
+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! {
@@ -208,27 +153,35 @@
 	};
 }
 
-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 = ();
+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! {
@@ -237,6 +190,9 @@
 	};
 }
 
+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 {
@@ -246,21 +202,4 @@
 		})
 		.into()
 	}
-}
-
-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;
 }
modifiedruntime/quartz/src/tests/logcapture.rsdiffbeforeafterboth
--- a/runtime/quartz/src/tests/logcapture.rs
+++ b/runtime/quartz/src/tests/logcapture.rs
@@ -19,7 +19,7 @@
 
 #[test]
 fn quartz_log_capture_tests() {
-    let mut logger = Logger::start();
-    
-    quartz_xcm_tests(&mut logger);
+	let mut logger = Logger::start();
+
+	quartz_xcm_tests(&mut logger);
 }
modifiedruntime/quartz/src/tests/mod.rsdiffbeforeafterboth
--- a/runtime/quartz/src/tests/mod.rs
+++ b/runtime/quartz/src/tests/mod.rs
@@ -14,5 +14,5 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+mod logcapture;
 mod xcm;
-mod logcapture;
modifiedruntime/quartz/src/tests/xcm.rsdiffbeforeafterboth
--- a/runtime/quartz/src/tests/xcm.rs
+++ b/runtime/quartz/src/tests/xcm.rs
@@ -15,18 +15,13 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 use logtest::Logger;
-use crate::{
-    runtime_common::tests::xcm::*,
-    xcm_config::Barrier,
-};
+use crate::{runtime_common::tests::xcm::*, xcm_config::Barrier};
 
 const QUARTZ_PARA_ID: u32 = 2095;
 
 pub fn quartz_xcm_tests(logger: &mut Logger) {
-    barrier_denies_transact::<Barrier>(logger);
+	barrier_denies_transact::<Barrier>(logger);
 
-    barrier_denies_transfer_from_unknown_location::<Barrier>(
-        logger,
-        QUARTZ_PARA_ID,
-    ).expect("quartz runtime denies an unknown location");
+	barrier_denies_transfer_from_unknown_location::<Barrier>(logger, QUARTZ_PARA_ID)
+		.expect("quartz runtime denies an unknown location");
 }
modifiedruntime/quartz/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/quartz/src/xcm_config.rs
+++ b/runtime/quartz/src/xcm_config.rs
@@ -14,53 +14,31 @@
 // 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 cumulus_pallet_xcm;
 use frame_support::{
-    {match_types, parameter_types, weights::Weight},
-    pallet_prelude::Get,
-    traits::{Contains, Everything, fungibles},
+	{match_types, parameter_types, weights::Weight},
+	pallet_prelude::Get,
+	traits::{Contains, Everything},
 };
-use frame_system::EnsureRoot;
 use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
-use pallet_xcm::XcmPassthrough;
-use polkadot_parachain::primitives::Sibling;
-use sp_runtime::traits::{AccountIdConversion, CheckedConversion, Convert, Zero};
-use sp_std::{borrow::Borrow, marker::PhantomData, vec, vec::Vec};
+use sp_runtime::traits::{AccountIdConversion, Convert};
+use sp_std::{vec, vec::Vec};
 use xcm::{
-    latest::{MultiAsset, Xcm},
-    prelude::{Concrete, Fungible as XcmFungible},
-    v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
+	latest::Xcm,
+	v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
 };
 use xcm_builder::{
-    AllowKnownQueryResponses, AllowSubscriptionsFrom,
-    AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,
-    EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser,
-    ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,
-    SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,
-    ConvertedConcreteAssetId,
+	AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom,
+	AllowUnpaidExecutionFrom, FixedWeightBounds, LocationInverter, TakeWeightCredit,
 };
-use xcm_executor::{
-    {Config, XcmExecutor},
-    traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible},
-};
+use xcm_executor::XcmExecutor;
 
-use up_common::{
-    constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},
-    types::{AccountId, Balance},
-};
-use pallet_foreing_assets::{
-    AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,
-    FreeForAll, TryAsForeing, ForeignAssetId,
-};
-use crate::{
-    Balances, Call, DmpQueue, Event, Origin, ParachainInfo,
-    ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,
-};
+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 crate::*;
-use xcm::opaque::latest::prelude::{ DepositReserveAsset, DepositAsset, TransferAsset, TransferReserveAsset };
+use xcm::opaque::latest::prelude::{DepositReserveAsset, TransferReserveAsset};
 
 // Signed version of balance
 pub type Amount = i128;
@@ -76,103 +54,113 @@
 	};
 }
 
+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![
-        // Self location
-        MultiLocation { parents: 0, interior: Here },
-        // Parent location
-        MultiLocation { parents: 1, interior: Here },
-        // Karura/Acala location
-        MultiLocation { parents: 1, interior: X1(Parachain(2000)) },
-        // Moonriver location
-        MultiLocation { parents: 1, interior: X1(Parachain(2023)) },
-        // Self parachain address
-        MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },
-    ]
+	vec![
+		// Self location
+		MultiLocation {
+			parents: 0,
+			interior: Here,
+		},
+		// Parent location
+		MultiLocation {
+			parents: 1,
+			interior: Here,
+		},
+		// Karura/Acala location
+		MultiLocation {
+			parents: 1,
+			interior: X1(Parachain(2000)),
+		},
+		// Moonriver location
+		MultiLocation {
+			parents: 1,
+			interior: X1(Parachain(2023)),
+		},
+		// Self parachain address
+		MultiLocation {
+			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<(), ()> {
+	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);
 
-        // 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);
+			}
+			_ => {}
+		});
 
-        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(());
+		}
 
-        if allowed {
-            return Ok(());
-        }
-
-        log::warn!(
+		log::warn!(
 			target: "xcm::barrier",
 			"Unexpected deposit or transfer location"
 		);
-        // Deny
-        Err(())
-    }
+		// Deny
+		Err(())
+	}
 }
 
-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>,
-    ),
->;
-
 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 = ();
+	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;
+	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! {
@@ -189,34 +177,28 @@
 
 pub struct DustRemovalWhitelist;
 impl Contains<AccountId> for DustRemovalWhitelist {
-    fn contains(a: &AccountId) -> bool {
-        get_all_module_accounts().contains(a)
-    }
+	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(_) => None,
-        }
-    }
+	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;
-}
 
-parameter_types! {
-	pub const RelayLocation: MultiLocation = MultiLocation::parent();
-	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())));
 }
@@ -228,16 +210,16 @@
 }
 
 pub fn get_all_module_accounts() -> Vec<AccountId> {
-    vec![TreasuryModuleId::get().into_account_truncating()]
+	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()
-    }
+	fn convert(account: AccountId) -> MultiLocation {
+		X1(AccountId32 {
+			network: NetworkId::Any,
+			id: account.into(),
+		})
+		.into()
+	}
 }
modifiedruntime/unique/src/tests/logcapture.rsdiffbeforeafterboth
--- a/runtime/unique/src/tests/logcapture.rs
+++ b/runtime/unique/src/tests/logcapture.rs
@@ -19,7 +19,7 @@
 
 #[test]
 fn unique_log_capture_tests() {
-    let mut logger = Logger::start();
-    
-    unique_xcm_tests(&mut logger);
+	let mut logger = Logger::start();
+
+	unique_xcm_tests(&mut logger);
 }
modifiedruntime/unique/src/tests/mod.rsdiffbeforeafterboth
--- a/runtime/unique/src/tests/mod.rs
+++ b/runtime/unique/src/tests/mod.rs
@@ -14,5 +14,5 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+mod logcapture;
 mod xcm;
-mod logcapture;
modifiedruntime/unique/src/tests/xcm.rsdiffbeforeafterboth
--- a/runtime/unique/src/tests/xcm.rs
+++ b/runtime/unique/src/tests/xcm.rs
@@ -15,18 +15,13 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 use logtest::Logger;
-use crate::{
-    runtime_common::tests::xcm::*,
-    xcm_config::Barrier,
-};
+use crate::{runtime_common::tests::xcm::*, xcm_config::Barrier};
 
 const UNIQUE_PARA_ID: u32 = 2037;
 
 pub fn unique_xcm_tests(logger: &mut Logger) {
-    barrier_denies_transact::<Barrier>(logger);
+	barrier_denies_transact::<Barrier>(logger);
 
-    barrier_denies_transfer_from_unknown_location::<Barrier>(
-        logger,
-        UNIQUE_PARA_ID,
-    ).expect("unique runtime denies an unknown location");
+	barrier_denies_transfer_from_unknown_location::<Barrier>(logger, UNIQUE_PARA_ID)
+		.expect("unique runtime denies an unknown location");
 }
modifiedruntime/unique/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/unique/src/xcm_config.rs
+++ b/runtime/unique/src/xcm_config.rs
@@ -14,143 +14,153 @@
 // 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 cumulus_pallet_xcm;
 use frame_support::{
-    {match_types, parameter_types, weights::Weight},
-    pallet_prelude::Get,
-    traits::{Contains, Everything, fungibles},
+	{match_types, parameter_types, weights::Weight},
+	pallet_prelude::Get,
+	traits::{Contains, Everything},
 };
-use frame_system::EnsureRoot;
 use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
-use pallet_xcm::XcmPassthrough;
-use polkadot_parachain::primitives::Sibling;
-use sp_runtime::traits::{AccountIdConversion, CheckedConversion, Convert, Zero};
-use sp_std::{borrow::Borrow, marker::PhantomData, vec, vec::Vec};
+use sp_runtime::traits::{AccountIdConversion, Convert};
+use sp_std::{vec, vec::Vec};
 use xcm::{
-    latest::{MultiAsset, Xcm},
-    prelude::{Concrete, Fungible as XcmFungible},
-    v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
+	latest::Xcm,
+	v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
 };
 use xcm_builder::{
-    AllowKnownQueryResponses, AllowSubscriptionsFrom,
-    AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,
-    EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser,
-    ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,
-    SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,
-    ConvertedConcreteAssetId,
+	AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom,
+	AllowUnpaidExecutionFrom, FixedWeightBounds, LocationInverter, TakeWeightCredit,
 };
-use xcm_executor::{
-    {Config, XcmExecutor},
-    traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible},
-};
+use xcm_executor::XcmExecutor;
 
-use up_common::{
-    constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},
-    types::{AccountId, Balance},
-};
-use pallet_foreing_assets::{
-    AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,
-    FreeForAll, TryAsForeing, ForeignAssetId,
-};
-use crate::{
-    Balances, Call, DmpQueue, Event, Origin, ParachainInfo,
-    ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,
-};
+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 crate::*;
-use xcm::opaque::latest::prelude::{ DepositReserveAsset, DepositAsset, TransferAsset, TransferReserveAsset };
+use xcm::opaque::latest::prelude::{DepositReserveAsset, TransferReserveAsset};
 
 // Signed version of balance
 pub type Amount = i128;
 
+match_types! {
+	pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {
+		MultiLocation { parents: 1, interior: Here } |
+		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) }
+	};
+	pub type ParentOrSiblings: impl Contains<MultiLocation> = {
+		MultiLocation { parents: 1, interior: Here } |
+		MultiLocation { parents: 1, interior: X1(_) }
+	};
+}
 
 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>,
-    ),
+	(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![
-        // Self location
-        MultiLocation { parents: 0, interior: Here },
-        // Parent location
-        MultiLocation { parents: 1, interior: Here },
-        // Karura/Acala location
-        MultiLocation { parents: 1, interior: X1(Parachain(2000)) },
-        // Moonbeam location
-        MultiLocation { parents: 1, interior: X1(Parachain(2004)) },
-        // Self parachain address
-        MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },
-    ]
+	vec![
+		// Self location
+		MultiLocation {
+			parents: 0,
+			interior: Here,
+		},
+		// Parent location
+		MultiLocation {
+			parents: 1,
+			interior: Here,
+		},
+		// Karura/Acala location
+		MultiLocation {
+			parents: 1,
+			interior: X1(Parachain(2000)),
+		},
+		// Moonbeam location
+		MultiLocation {
+			parents: 1,
+			interior: X1(Parachain(2004)),
+		},
+		// Self parachain address
+		MultiLocation {
+			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<(), ()> {
+	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);
 
-        // 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); }
-                _ => {}
-            }
-        });
+		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(());
-        }
+		if allowed {
+			return Ok(());
+		}
 
-        log::warn!(
+		log::warn!(
 			target: "xcm::barrier",
 			"Unexpected deposit or transfer location"
 		);
-        // Deny
-        Err(())
-    }
-}
-
-
-match_types! {
-	pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {
-		MultiLocation { parents: 1, interior: Here } |
-		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) }
-	};
-	pub type ParentOrSiblings: impl Contains<MultiLocation> = {
-		MultiLocation { parents: 1, interior: Here } |
-		MultiLocation { parents: 1, interior: X1(_) }
-	};
+		// Deny
+		Err(())
+	}
 }
 
-pub fn get_all_module_accounts() -> Vec<AccountId> {
-    vec![TreasuryModuleId::get().into_account_truncating()]
+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 = ();
 }
 
-pub struct DustRemovalWhitelist;
-impl Contains<AccountId> for DustRemovalWhitelist {
-    fn contains(a: &AccountId) -> bool {
-        get_all_module_accounts().contains(a)
-    }
+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! {
@@ -165,60 +175,32 @@
 	};
 }
 
-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;
+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,
-        }
-    }
+	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())));
+	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
+	pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
 }
 
 parameter_type_with_key! {
@@ -227,14 +209,17 @@
 	};
 }
 
+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()
-    }
+	fn convert(account: AccountId) -> MultiLocation {
+		X1(AccountId32 {
+			network: NetworkId::Any,
+			id: account.into(),
+		})
+		.into()
+	}
 }