difftreelog
Buildable Opal, Quartz and Unique runtimes.
in: master
4 files changed
runtime/common/construct_runtime/mod.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/>.1617mod util;1819#[macro_export]20macro_rules! construct_runtime {21 ($select_runtime:ident) => {22 $crate::construct_runtime_impl! {23 select_runtime($select_runtime);2425 pub enum Runtime where26 Block = Block,27 NodeBlock = opaque::Block,28 UncheckedExtrinsic = UncheckedExtrinsic29 {30 System: frame_system = 0,3132 ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Config, Storage, Inherent, Event<T>, ValidateUnsigned} = 20,33 ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21,3435 Aura: pallet_aura::{Pallet, Config<T>} = 22,36 AuraExt: cumulus_pallet_aura_ext::{Pallet, Config} = 23,3738 Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>} = 30,39 RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Storage} = 31,40 Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 32,41 TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event<T>} = 33,42 Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>} = 34,43 Sudo: pallet_sudo::{Pallet, Call, Storage, Config<T>, Event<T>} = 35,44 Vesting: orml_vesting::{Pallet, Storage, Call, Event<T>, Config<T>} = 37,45 XTokens: orml_xtokens = 38,46 Tokens: orml_tokens = 39,47 // Vesting: pallet_vesting::{Pallet, Call, Config<T>, Storage, Event<T>} = 37,48 // Contracts: pallet_contracts::{Pallet, Call, Storage, Event<T>} = 38,4950 // XCM helpers.51 XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event<T>} = 50,52 PolkadotXcm: pallet_xcm::{Pallet, Call, Event<T>, Origin} = 51,53 CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Event<T>, Origin} = 52,54 DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event<T>} = 53,5556 // Unique Pallets57 Inflation: pallet_inflation::{Pallet, Call, Storage} = 60,58 Unique: pallet_unique::{Pallet, Call, Storage, Event<T>} = 61,5960 #[runtimes(opal)]61 Scheduler: pallet_unique_scheduler::{Pallet, Call, Storage, Event<T>} = 62,6263 Configuration: pallet_configuration::{Pallet, Call, Storage} = 63,6465 Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64,66 // ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65,67 Common: pallet_common::{Pallet, Storage, Event<T>} = 66,68 Fungible: pallet_fungible::{Pallet, Storage} = 67,6970 #[runtimes(opal)]71 Refungible: pallet_refungible::{Pallet, Storage} = 68,7273 Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69,74 Structure: pallet_structure::{Pallet, Call, Storage, Event<T>} = 70,7576 #[runtimes(opal)]77 RmrkCore: pallet_proxy_rmrk_core::{Pallet, Call, Storage, Event<T>} = 71,7879 #[runtimes(opal)]80 RmrkEquip: pallet_proxy_rmrk_equip::{Pallet, Call, Storage, Event<T>} = 72,8182 #[runtimes(opal)]83 ForeingAssets: pallet_foreing_assets::{Pallet, Call, Storage, Event<T>} = 80,8485 // Frontier86 EVM: pallet_evm::{Pallet, Config, Call, Storage, Event<T>} = 100,87 Ethereum: pallet_ethereum::{Pallet, Config, Call, Storage, Event, Origin} = 101,8889 EvmCoderSubstrate: pallet_evm_coder_substrate::{Pallet, Storage} = 150,90 EvmContractHelpers: pallet_evm_contract_helpers::{Pallet, Storage} = 151,91 EvmTransactionPayment: pallet_evm_transaction_payment::{Pallet} = 152,92 EvmMigration: pallet_evm_migration::{Pallet, Call, Storage} = 153,93 }94 }95 }96}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/>.1617mod util;1819#[macro_export]20macro_rules! construct_runtime {21 ($select_runtime:ident) => {22 $crate::construct_runtime_impl! {23 select_runtime($select_runtime);2425 pub enum Runtime where26 Block = Block,27 NodeBlock = opaque::Block,28 UncheckedExtrinsic = UncheckedExtrinsic29 {30 System: frame_system = 0,3132 ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Config, Storage, Inherent, Event<T>, ValidateUnsigned} = 20,33 ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21,3435 Aura: pallet_aura::{Pallet, Config<T>} = 22,36 AuraExt: cumulus_pallet_aura_ext::{Pallet, Config} = 23,3738 Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>} = 30,39 RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Storage} = 31,40 Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 32,41 TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event<T>} = 33,42 Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>} = 34,43 Sudo: pallet_sudo::{Pallet, Call, Storage, Config<T>, Event<T>} = 35,44 Vesting: orml_vesting::{Pallet, Storage, Call, Event<T>, Config<T>} = 37,45 #[runtimes(opal)]46 XTokens: orml_xtokens = 38,47 Tokens: orml_tokens = 39,48 // Vesting: pallet_vesting::{Pallet, Call, Config<T>, Storage, Event<T>} = 37,49 // Contracts: pallet_contracts::{Pallet, Call, Storage, Event<T>} = 38,5051 // XCM helpers.52 XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event<T>} = 50,53 PolkadotXcm: pallet_xcm::{Pallet, Call, Event<T>, Origin} = 51,54 CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Event<T>, Origin} = 52,55 DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event<T>} = 53,5657 // Unique Pallets58 Inflation: pallet_inflation::{Pallet, Call, Storage} = 60,59 Unique: pallet_unique::{Pallet, Call, Storage, Event<T>} = 61,6061 #[runtimes(opal)]62 Scheduler: pallet_unique_scheduler::{Pallet, Call, Storage, Event<T>} = 62,6364 Configuration: pallet_configuration::{Pallet, Call, Storage} = 63,6566 Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64,67 // ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65,68 Common: pallet_common::{Pallet, Storage, Event<T>} = 66,69 Fungible: pallet_fungible::{Pallet, Storage} = 67,7071 #[runtimes(opal)]72 Refungible: pallet_refungible::{Pallet, Storage} = 68,7374 Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69,75 Structure: pallet_structure::{Pallet, Call, Storage, Event<T>} = 70,7677 #[runtimes(opal)]78 RmrkCore: pallet_proxy_rmrk_core::{Pallet, Call, Storage, Event<T>} = 71,7980 #[runtimes(opal)]81 RmrkEquip: pallet_proxy_rmrk_equip::{Pallet, Call, Storage, Event<T>} = 72,8283 #[runtimes(opal)]84 ForeingAssets: pallet_foreing_assets::{Pallet, Call, Storage, Event<T>} = 80,8586 // Frontier87 EVM: pallet_evm::{Pallet, Config, Call, Storage, Event<T>} = 100,88 Ethereum: pallet_ethereum::{Pallet, Config, Call, Storage, Event, Origin} = 101,8990 EvmCoderSubstrate: pallet_evm_coder_substrate::{Pallet, Storage} = 150,91 EvmContractHelpers: pallet_evm_contract_helpers::{Pallet, Storage} = 151,92 EvmTransactionPayment: pallet_evm_transaction_payment::{Pallet} = 152,93 EvmMigration: pallet_evm_migration::{Pallet, Call, Storage} = 153,94 }95 }96 }97}runtime/quartz/src/xcm_config.rsdiffbeforeafterboth--- a/runtime/quartz/src/xcm_config.rs
+++ b/runtime/quartz/src/xcm_config.rs
@@ -32,6 +32,7 @@
v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
};
use xcm_builder::{
+ AllowKnownQueryResponses, AllowSubscriptionsFrom,
AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,
EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser,
ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,
@@ -47,7 +48,10 @@
constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},
types::{AccountId, Balance},
};
-
+use pallet_foreing_assets::{
+ AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,
+ UsingAnyCurrencyComponents, TryAsForeing, ForeignAssetId,
+};
use crate::{
Balances, Call, DmpQueue, Event, Origin, ParachainInfo,
ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,
@@ -56,6 +60,7 @@
use crate::runtime_common::config::pallets::TreasuryAccountId;
use crate::runtime_common::config::xcm::*;
use crate::*;
+use xcm::opaque::latest::prelude::{ DepositReserveAsset, DepositAsset, TransferAsset, TransferReserveAsset };
// Signed version of balance
pub type Amount = i128;
@@ -94,6 +99,55 @@
}
}
+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())) },
+ ]
+}
+
+// Allow xcm exchange only with locations in list
+pub struct DenyExchangeWithUnknownLocation;
+impl ShouldExecute for DenyExchangeWithUnknownLocation {
+ fn should_execute<Call>(
+ origin: &MultiLocation,
+ message: &mut Xcm<Call>,
+ _max_weight: Weight,
+ _weight_credit: &mut Weight,
+ ) -> Result<(), ()> {
+
+ // Check if deposit or transfer belongs to allowed parachains
+ let mut allowed = get_allowed_locations().contains(origin);
+
+ message.0.iter().for_each(|inst| {
+ match inst {
+ DepositReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }
+ TransferReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }
+ _ => {}
+ }
+ });
+
+ if allowed {
+ return Ok(());
+ }
+
+ log::warn!(
+ target: "xcm::barrier",
+ "Unexpected deposit or transfer location"
+ );
+ // Deny
+ Err(())
+ }
+}
+
pub type Barrier = DenyThenTry<
DenyExchangeWithUnknownLocation,
(
@@ -106,4 +160,135 @@
// Subscriptions for version tracking are OK.
AllowSubscriptionsFrom<ParentOrSiblings>,
),
->;
\ No newline at end of file
+>;
+
+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 = AssetIds;
+ type CurrencyIdConvert = CurrencyIdConvert;
+ type AccountIdToMultiLocation = AccountIdToMultiLocation;
+ type SelfLocation = SelfLocation;
+ type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
+ type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
+ type BaseXcmWeight = BaseXcmWeight;
+ type LocationInverter = LocationInverter<Ancestry>;
+ type MaxAssetsForTransfer = MaxAssetsForTransfer;
+ type MinXcmFee = ParachainMinFee;
+ type MultiLocationsFilter = Everything;
+ type ReserveProvider = AbsoluteReserveProvider;
+}
+ */
+
+parameter_type_with_key! {
+ pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
+ match currency_id {
+ CurrencyId::NativeAssetId(symbol) => match symbol {
+ NativeCurrency::Here => 0,
+ NativeCurrency::Parent=> 0,
+ },
+ _ => 100_000
+ }
+ };
+}
+
+pub struct DustRemovalWhitelist;
+impl Contains<AccountId> for DustRemovalWhitelist {
+ fn contains(a: &AccountId) -> bool {
+ get_all_module_accounts().contains(a)
+ }
+}
+
+/*
+pub struct CurrencyIdConvert;
+impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
+ fn convert(id: AssetIds) -> Option<MultiLocation> {
+ match id {
+ AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
+ 1,
+ X1(Parachain(ParachainInfo::get().into())),
+ )),
+ AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),
+ AssetIds::ForeignAssetId(foreign_asset_id) => {
+ XcmForeignAssetIdMapping::<Runtime>::get_multi_location(foreign_asset_id)
+ }
+ }
+ }
+}
+impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {
+ fn convert(location: MultiLocation) -> Option<CurrencyId> {
+ if location == MultiLocation::here()
+ || location == MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())))
+ {
+ return Some(AssetIds::NativeAssetId(NativeCurrency::Here));
+ }
+
+ if location == MultiLocation::parent() {
+ return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));
+ }
+
+ if let Some(currency_id) =
+ XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())
+ {
+ return Some(currency_id);
+ }
+
+ None
+ }
+}
+
+ */
+
+
+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())));
+}
+
+parameter_type_with_key! {
+ pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
+ Some(100_000_000)
+ };
+}
+
+pub fn get_all_module_accounts() -> Vec<AccountId> {
+ vec![TreasuryModuleId::get().into_account_truncating()]
+}
+
+pub struct AccountIdToMultiLocation;
+impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {
+ fn convert(account: AccountId) -> MultiLocation {
+ X1(AccountId32 {
+ network: NetworkId::Any,
+ id: account.into(),
+ })
+ .into()
+ }
+}
runtime/unique/src/lib.rsdiffbeforeafterboth--- a/runtime/unique/src/lib.rs
+++ b/runtime/unique/src/lib.rs
@@ -35,6 +35,8 @@
#[path = "../../common/mod.rs"]
mod runtime_common;
+pub mod xcm_config;
+
pub use runtime_common::*;
pub const RUNTIME_NAME: &str = "unique";
runtime/unique/src/xcm_config.rsdiffbeforeafterboth--- a/runtime/unique/src/xcm_config.rs
+++ b/runtime/unique/src/xcm_config.rs
@@ -0,0 +1,226 @@
+// 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 cumulus_pallet_xcm;
+use frame_support::{
+ {match_types, parameter_types, weights::Weight},
+ pallet_prelude::Get,
+ traits::{Contains, Everything, fungibles},
+};
+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 xcm::{
+ latest::{MultiAsset, Xcm},
+ prelude::{Concrete, Fungible as XcmFungible},
+ 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,
+};
+use xcm_executor::{
+ {Config, XcmExecutor},
+ traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible, ShouldExecute},
+};
+
+use up_common::{
+ constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},
+ types::{AccountId, Balance},
+};
+use pallet_foreing_assets::{
+ AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,
+ UsingAnyCurrencyComponents, TryAsForeing, ForeignAssetId,
+};
+use crate::{
+ Balances, Call, DmpQueue, Event, Origin, ParachainInfo,
+ ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,
+};
+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 };
+
+// Signed version of balance
+pub type Amount = i128;
+
+
+pub type Barrier = DenyThenTry<
+ 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)) },
+ // 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
+pub struct DenyExchangeWithUnknownLocation;
+impl ShouldExecute for DenyExchangeWithUnknownLocation {
+ fn should_execute<Call>(
+ origin: &MultiLocation,
+ message: &mut Xcm<Call>,
+ _max_weight: Weight,
+ _weight_credit: &mut Weight,
+ ) -> Result<(), ()> {
+
+ // Check if deposit or transfer belongs to allowed parachains
+ let mut allowed = get_allowed_locations().contains(origin);
+
+ message.0.iter().for_each(|inst| {
+ match inst {
+ DepositReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }
+ TransferReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }
+ _ => {}
+ }
+ });
+
+ if allowed {
+ return Ok(());
+ }
+
+ log::warn!(
+ target: "xcm::barrier",
+ "Unexpected deposit or transfer location"
+ );
+ // Deny
+ Err(())
+ }
+}
+
+
+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 fn get_all_module_accounts() -> Vec<AccountId> {
+ vec![TreasuryModuleId::get().into_account_truncating()]
+}
+
+pub struct DustRemovalWhitelist;
+impl Contains<AccountId> for DustRemovalWhitelist {
+ fn contains(a: &AccountId) -> bool {
+ get_all_module_accounts().contains(a)
+ }
+}
+
+parameter_type_with_key! {
+ pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
+ match currency_id {
+ CurrencyId::NativeAssetId(symbol) => match symbol {
+ NativeCurrency::Here => 0,
+ NativeCurrency::Parent=> 0,
+ },
+ _ => 100_000
+ }
+ };
+}
+
+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 = ();
+}
+
+
+parameter_types! {
+ pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this
+ pub const MaxAssetsForTransfer: usize = 2;
+}
+
+parameter_type_with_key! {
+ pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
+ Some(100_000_000)
+ };
+}
+
+
+pub struct AccountIdToMultiLocation;
+impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {
+ fn convert(account: AccountId) -> MultiLocation {
+ X1(AccountId32 {
+ network: NetworkId::Any,
+ id: account.into(),
+ })
+ .into()
+ }
+}
\ No newline at end of file