difftreelog
feat(xcm) move DenyThenTry to common, add DenyTransact
in: master
4 files changed
runtime/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>,
runtime/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 {
runtime/quartz/src/xcm_config.rsdiffbeforeafterboth1// 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}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}runtime/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