git.delta.rocks / unique-network / refs/commits / 8c9b07c4c9bd

difftreelog

feat(xcm) move DenyThenTry to common, add DenyTransact

Daniel Shiposha2022-08-29parent: #6396c5b.patch.diff
in: master

4 files changed

modifiedruntime/common/config/xcm.rsdiffbeforeafterboth
--- a/runtime/common/config/xcm.rs
+++ b/runtime/common/config/xcm.rs
@@ -34,6 +34,7 @@
 	AssetId::{Concrete},
 	Fungibility::Fungible as XcmFungible,
 	MultiAsset, Error as XcmError,
+	Instruction, Xcm,
 };
 use xcm_builder::{
 	AccountId32Aliases, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin,
@@ -45,6 +46,7 @@
 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,
@@ -171,13 +173,53 @@
 	};
 }
 
-/*
-pub type Barrier = (
-	TakeWeightCredit,
-	AllowTopLevelPaidExecutionFrom<Everything>,
-	// ^^^ Parent & its unit plurality gets free execution
-);
- */
+pub struct DenyTransact;
+impl ShouldExecute for DenyTransact {
+	fn should_execute<Call>(
+		_origin: &MultiLocation,
+		message: &mut Xcm<Call>,
+		_max_weight: Weight,
+		_weight_credit: &mut Weight,
+	) -> 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: ShouldExecute,
+        Allow: ShouldExecute;
+
+impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>
+    where
+        Deny: ShouldExecute,
+        Allow: ShouldExecute,
+{
+    fn should_execute<Call>(
+        origin: &MultiLocation,
+        message: &mut Xcm<Call>,
+        max_weight: Weight,
+        weight_credit: &mut Weight,
+    ) -> Result<(), ()> {
+        Deny::should_execute(origin, message, max_weight, weight_credit)?;
+        Allow::should_execute(origin, message, max_weight, weight_credit)
+    }
+}
 
 pub struct UsingOnlySelfCurrencyComponents<
 	WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,
modifiedruntime/opal/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/opal/src/xcm_config.rs
+++ b/runtime/opal/src/xcm_config.rs
@@ -301,13 +301,16 @@
 	}
 }
 
-pub type Barrier = (
-	TakeWeightCredit,
-	AllowTopLevelPaidExecutionFrom<Everything>,
-	AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,
-	// ^^^ Parent & its unit plurality gets free execution
-	AllowAllDebug,
-);
+pub type Barrier = DenyThenTry<
+	DenyTransact,
+	(
+		TakeWeightCredit,
+		AllowTopLevelPaidExecutionFrom<Everything>,
+		AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,
+		// ^^^ Parent & its unit plurality gets free execution
+		AllowAllDebug,
+	)
+>;
 
 pub struct AllAsset;
 impl FilterAssetLocation for AllAsset {
modifiedruntime/quartz/src/xcm_config.rsdiffbeforeafterboth
before · runtime/quartz/src/xcm_config.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 cumulus_pallet_xcm;18use frame_support::{19    {match_types, parameter_types, weights::Weight},20    pallet_prelude::Get,21    traits::{Contains, Everything, fungibles},22};23use frame_system::EnsureRoot;24use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};25use pallet_xcm::XcmPassthrough;26use polkadot_parachain::primitives::Sibling;27use sp_runtime::traits::{AccountIdConversion, CheckedConversion, Convert, Zero};28use sp_std::{borrow::Borrow, marker::PhantomData, vec, vec::Vec};29use xcm::{30    latest::{MultiAsset, Xcm},31    prelude::{Concrete, Fungible as XcmFungible},32    v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},33};34use xcm_builder::{35    AllowKnownQueryResponses, AllowSubscriptionsFrom,36    AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,37    EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser,38    ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,39    SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,40    ConvertedConcreteAssetId,41};42use xcm_executor::{43    {Config, XcmExecutor},44    traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible, ShouldExecute},45};4647use up_common::{48    constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},49    types::{AccountId, Balance},50};51use pallet_foreing_assets::{52    AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,53    FreeForAll, TryAsForeing, ForeignAssetId,54};55use crate::{56    Balances, Call, DmpQueue, Event, Origin, ParachainInfo,57    ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,58};59use crate::runtime_common::config::substrate::{TreasuryModuleId, MaxLocks, MaxReserves};60use crate::runtime_common::config::pallets::TreasuryAccountId;61use crate::runtime_common::config::xcm::*;62use crate::*;63use xcm::opaque::latest::prelude::{ DepositReserveAsset, DepositAsset, TransferAsset, TransferReserveAsset };6465// Signed version of balance66pub type Amount = i128;6768match_types! {69	pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {70		MultiLocation { parents: 1, interior: Here } |71		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) }72	};73	pub type ParentOrSiblings: impl Contains<MultiLocation> = {74		MultiLocation { parents: 1, interior: Here } |75		MultiLocation { parents: 1, interior: X1(_) }76	};77}7879/// Deny executing the XCM if it matches any of the Deny filter regardless of anything else.80/// If it passes the Deny, and matches one of the Allow cases then it is let through.81pub struct DenyThenTry<Deny, Allow>(PhantomData<Deny>, PhantomData<Allow>)82    where83        Deny: ShouldExecute,84        Allow: ShouldExecute;8586impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>87    where88        Deny: ShouldExecute,89        Allow: ShouldExecute,90{91    fn should_execute<Call>(92        origin: &MultiLocation,93        message: &mut Xcm<Call>,94        max_weight: Weight,95        weight_credit: &mut Weight,96    ) -> Result<(), ()> {97        Deny::should_execute(origin, message, max_weight, weight_credit)?;98        Allow::should_execute(origin, message, max_weight, weight_credit)99    }100}101102pub fn get_allowed_locations() -> Vec<MultiLocation> {103    vec![104        // Self location105        MultiLocation { parents: 0, interior: Here },106        // Parent location107        MultiLocation { parents: 1, interior: Here },108        // Karura/Acala location109        MultiLocation { parents: 1, interior: X1(Parachain(2000)) },110        // Moonriver location111        MultiLocation { parents: 1, interior: X1(Parachain(2023)) },112        // Self parachain address113        MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },114    ]115}116117// Allow xcm exchange only with locations in list118pub struct DenyExchangeWithUnknownLocation;119impl ShouldExecute for DenyExchangeWithUnknownLocation {120    fn should_execute<Call>(121        origin: &MultiLocation,122        message: &mut Xcm<Call>,123        _max_weight: Weight,124        _weight_credit: &mut Weight,125    ) -> Result<(), ()> {126127        // Check if deposit or transfer belongs to allowed parachains128        let mut allowed = get_allowed_locations().contains(origin);129130        message.0.iter().for_each(|inst| {131            match inst {132                DepositReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }133                TransferReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }134                _ => {}135            }136        });137138        if allowed {139            return Ok(());140        }141142        log::warn!(143			target: "xcm::barrier",144			"Unexpected deposit or transfer location"145		);146        // Deny147        Err(())148    }149}150151pub type Barrier = DenyThenTry<152    DenyExchangeWithUnknownLocation,153    (154        TakeWeightCredit,155        AllowTopLevelPaidExecutionFrom<Everything>,156        // Parent and its exec plurality get free execution157        AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,158        // Expected responses are OK.159        AllowKnownQueryResponses<PolkadotXcm>,160        // Subscriptions for version tracking are OK.161        AllowSubscriptionsFrom<ParentOrSiblings>,162    ),163>;164165impl orml_tokens::Config for Runtime {166    type Event = Event;167    type Balance = Balance;168    type Amount = Amount;169    type CurrencyId = CurrencyId;170    type WeightInfo = ();171    type ExistentialDeposits = ExistentialDeposits;172    type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;173    type MaxLocks = MaxLocks;174    type MaxReserves = MaxReserves;175    // TODO: Add all module accounts176    type DustRemovalWhitelist = DustRemovalWhitelist;177    /// The id type for named reserves.178    type ReserveIdentifier = ();179    type OnNewTokenAccount = ();180    type OnKilledTokenAccount = ();181}182183impl orml_xtokens::Config for Runtime {184    type Event = Event;185    type Balance = Balance;186    type CurrencyId = CurrencyId;187    type CurrencyIdConvert = CurrencyIdConvert;188    type AccountIdToMultiLocation = AccountIdToMultiLocation;189    type SelfLocation = SelfLocation;190    type XcmExecutor = XcmExecutor<XcmConfig<Self>>;191    type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;192    type BaseXcmWeight = BaseXcmWeight;193    type LocationInverter = LocationInverter<Ancestry>;194    type MaxAssetsForTransfer = MaxAssetsForTransfer;195    type MinXcmFee = ParachainMinFee;196    type MultiLocationsFilter = Everything;197    type ReserveProvider = AbsoluteReserveProvider;198}199200201parameter_type_with_key! {202	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {203		match currency_id {204			CurrencyId::NativeAssetId(symbol) => match symbol {205				NativeCurrency::Here => 0,206				NativeCurrency::Parent=> 0,207			},208			_ => 100_000209		}210	};211}212213pub struct DustRemovalWhitelist;214impl Contains<AccountId> for DustRemovalWhitelist {215    fn contains(a: &AccountId) -> bool {216        get_all_module_accounts().contains(a)217    }218}219220221pub struct CurrencyIdConvert;222impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {223    fn convert(id: AssetIds) -> Option<MultiLocation> {224        match id {225            AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(226                1,227                X1(Parachain(ParachainInfo::get().into())),228            )),229            AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),230            AssetIds::ForeignAssetId(_) => None,231        }232    }233}234/*235impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {236    fn convert(location: MultiLocation) -> Option<CurrencyId> {237        if location == MultiLocation::here()238            || location == MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())))239        {240            return Some(AssetIds::NativeAssetId(NativeCurrency::Here));241        }242243        if location == MultiLocation::parent() {244            return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));245        }246247        if let Some(currency_id) =248        XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())249        {250            return Some(currency_id);251        }252253        None254    }255}256257 */258259260parameter_types! {261	pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this262	pub const MaxAssetsForTransfer: usize = 2;263}264265parameter_types! {266	pub const RelayLocation: MultiLocation = MultiLocation::parent();267	pub const RelayNetwork: NetworkId = NetworkId::Polkadot;268	pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();269	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();270	pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));271}272273parameter_type_with_key! {274	pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {275		Some(100_000_000)276	};277}278279pub fn get_all_module_accounts() -> Vec<AccountId> {280    vec![TreasuryModuleId::get().into_account_truncating()]281}282283pub struct AccountIdToMultiLocation;284impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {285    fn convert(account: AccountId) -> MultiLocation {286        X1(AccountId32 {287            network: NetworkId::Any,288            id: account.into(),289        })290            .into()291    }292}
after · runtime/quartz/src/xcm_config.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 cumulus_pallet_xcm;18use frame_support::{19    {match_types, parameter_types, weights::Weight},20    pallet_prelude::Get,21    traits::{Contains, Everything, fungibles},22};23use frame_system::EnsureRoot;24use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};25use pallet_xcm::XcmPassthrough;26use polkadot_parachain::primitives::Sibling;27use sp_runtime::traits::{AccountIdConversion, CheckedConversion, Convert, Zero};28use sp_std::{borrow::Borrow, marker::PhantomData, vec, vec::Vec};29use xcm::{30    latest::{MultiAsset, Xcm},31    prelude::{Concrete, Fungible as XcmFungible},32    v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},33};34use xcm_builder::{35    AllowKnownQueryResponses, AllowSubscriptionsFrom,36    AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,37    EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser,38    ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,39    SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,40    ConvertedConcreteAssetId,41};42use xcm_executor::{43    {Config, XcmExecutor},44    traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible, ShouldExecute},45};4647use up_common::{48    constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},49    types::{AccountId, Balance},50};51use pallet_foreing_assets::{52    AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,53    FreeForAll, TryAsForeing, ForeignAssetId,54};55use crate::{56    Balances, Call, DmpQueue, Event, Origin, ParachainInfo,57    ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,58};59use crate::runtime_common::config::substrate::{TreasuryModuleId, MaxLocks, MaxReserves};60use crate::runtime_common::config::pallets::TreasuryAccountId;61use crate::runtime_common::config::xcm::*;62use crate::*;63use xcm::opaque::latest::prelude::{ DepositReserveAsset, DepositAsset, TransferAsset, TransferReserveAsset };6465// Signed version of balance66pub type Amount = i128;6768match_types! {69	pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {70		MultiLocation { parents: 1, interior: Here } |71		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) }72	};73	pub type ParentOrSiblings: impl Contains<MultiLocation> = {74		MultiLocation { parents: 1, interior: Here } |75		MultiLocation { parents: 1, interior: X1(_) }76	};77}7879pub fn get_allowed_locations() -> Vec<MultiLocation> {80    vec![81        // Self location82        MultiLocation { parents: 0, interior: Here },83        // Parent location84        MultiLocation { parents: 1, interior: Here },85        // Karura/Acala location86        MultiLocation { parents: 1, interior: X1(Parachain(2000)) },87        // Moonriver location88        MultiLocation { parents: 1, interior: X1(Parachain(2023)) },89        // Self parachain address90        MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },91    ]92}9394// Allow xcm exchange only with locations in list95pub struct DenyExchangeWithUnknownLocation;96impl ShouldExecute for DenyExchangeWithUnknownLocation {97    fn should_execute<Call>(98        origin: &MultiLocation,99        message: &mut Xcm<Call>,100        _max_weight: Weight,101        _weight_credit: &mut Weight,102    ) -> Result<(), ()> {103104        // Check if deposit or transfer belongs to allowed parachains105        let mut allowed = get_allowed_locations().contains(origin);106107        message.0.iter().for_each(|inst| {108            match inst {109                DepositReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }110                TransferReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }111                _ => {}112            }113        });114115        if allowed {116            return Ok(());117        }118119        log::warn!(120			target: "xcm::barrier",121			"Unexpected deposit or transfer location"122		);123        // Deny124        Err(())125    }126}127128pub type Barrier = DenyThenTry<129    DenyExchangeWithUnknownLocation,130    (131        DenyTransact,132        TakeWeightCredit,133        AllowTopLevelPaidExecutionFrom<Everything>,134        // Parent and its exec plurality get free execution135        AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,136        // Expected responses are OK.137        AllowKnownQueryResponses<PolkadotXcm>,138        // Subscriptions for version tracking are OK.139        AllowSubscriptionsFrom<ParentOrSiblings>,140    ),141>;142143impl orml_tokens::Config for Runtime {144    type Event = Event;145    type Balance = Balance;146    type Amount = Amount;147    type CurrencyId = CurrencyId;148    type WeightInfo = ();149    type ExistentialDeposits = ExistentialDeposits;150    type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;151    type MaxLocks = MaxLocks;152    type MaxReserves = MaxReserves;153    // TODO: Add all module accounts154    type DustRemovalWhitelist = DustRemovalWhitelist;155    /// The id type for named reserves.156    type ReserveIdentifier = ();157    type OnNewTokenAccount = ();158    type OnKilledTokenAccount = ();159}160161impl orml_xtokens::Config for Runtime {162    type Event = Event;163    type Balance = Balance;164    type CurrencyId = CurrencyId;165    type CurrencyIdConvert = CurrencyIdConvert;166    type AccountIdToMultiLocation = AccountIdToMultiLocation;167    type SelfLocation = SelfLocation;168    type XcmExecutor = XcmExecutor<XcmConfig<Self>>;169    type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;170    type BaseXcmWeight = BaseXcmWeight;171    type LocationInverter = LocationInverter<Ancestry>;172    type MaxAssetsForTransfer = MaxAssetsForTransfer;173    type MinXcmFee = ParachainMinFee;174    type MultiLocationsFilter = Everything;175    type ReserveProvider = AbsoluteReserveProvider;176}177178179parameter_type_with_key! {180	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {181		match currency_id {182			CurrencyId::NativeAssetId(symbol) => match symbol {183				NativeCurrency::Here => 0,184				NativeCurrency::Parent=> 0,185			},186			_ => 100_000187		}188	};189}190191pub struct DustRemovalWhitelist;192impl Contains<AccountId> for DustRemovalWhitelist {193    fn contains(a: &AccountId) -> bool {194        get_all_module_accounts().contains(a)195    }196}197198199pub struct CurrencyIdConvert;200impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {201    fn convert(id: AssetIds) -> Option<MultiLocation> {202        match id {203            AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(204                1,205                X1(Parachain(ParachainInfo::get().into())),206            )),207            AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),208            AssetIds::ForeignAssetId(_) => None,209        }210    }211}212/*213impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {214    fn convert(location: MultiLocation) -> Option<CurrencyId> {215        if location == MultiLocation::here()216            || location == MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())))217        {218            return Some(AssetIds::NativeAssetId(NativeCurrency::Here));219        }220221        if location == MultiLocation::parent() {222            return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));223        }224225        if let Some(currency_id) =226        XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())227        {228            return Some(currency_id);229        }230231        None232    }233}234235 */236237238parameter_types! {239	pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this240	pub const MaxAssetsForTransfer: usize = 2;241}242243parameter_types! {244	pub const RelayLocation: MultiLocation = MultiLocation::parent();245	pub const RelayNetwork: NetworkId = NetworkId::Polkadot;246	pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();247	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();248	pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));249}250251parameter_type_with_key! {252	pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {253		Some(100_000_000)254	};255}256257pub fn get_all_module_accounts() -> Vec<AccountId> {258    vec![TreasuryModuleId::get().into_account_truncating()]259}260261pub struct AccountIdToMultiLocation;262impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {263    fn convert(account: AccountId) -> MultiLocation {264        X1(AccountId32 {265            network: NetworkId::Any,266            id: account.into(),267        })268            .into()269    }270}
modifiedruntime/unique/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/unique/src/xcm_config.rs
+++ b/runtime/unique/src/xcm_config.rs
@@ -69,6 +69,7 @@
 pub type Barrier = DenyThenTry<
     DenyExchangeWithUnknownLocation,
     (
+        DenyTransact,
         TakeWeightCredit,
         AllowTopLevelPaidExecutionFrom<Everything>,
         // Parent and its exec plurality get free execution
@@ -93,27 +94,6 @@
         // Self parachain address
         MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },
     ]
-}
-
-pub struct DenyThenTry<Deny, Allow>(PhantomData<Deny>, PhantomData<Allow>)
-    where
-        Deny: ShouldExecute,
-        Allow: ShouldExecute;
-
-impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>
-    where
-        Deny: ShouldExecute,
-        Allow: ShouldExecute,
-{
-    fn should_execute<Call>(
-        origin: &MultiLocation,
-        message: &mut Xcm<Call>,
-        max_weight: Weight,
-        weight_credit: &mut Weight,
-    ) -> Result<(), ()> {
-        Deny::should_execute(origin, message, max_weight, weight_credit)?;
-        Allow::should_execute(origin, message, max_weight, weight_credit)
-    }
 }
 
 // Allow xcm exchange only with locations in list