git.delta.rocks / unique-network / refs/commits / 0b95edb08466

difftreelog

Buildable Opal, Quartz and Unique runtimes.

Ilja Khabarov2022-08-23parent: #ce442c5.patch.diff
in: master

4 files changed

modifiedruntime/common/construct_runtime/mod.rsdiffbeforeafterboth
--- a/runtime/common/construct_runtime/mod.rs
+++ b/runtime/common/construct_runtime/mod.rs
@@ -42,6 +42,7 @@
                 Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>} = 34,
                 Sudo: pallet_sudo::{Pallet, Call, Storage, Config<T>, Event<T>} = 35,
                 Vesting: orml_vesting::{Pallet, Storage, Call, Event<T>, Config<T>} = 37,
+                #[runtimes(opal)]
                 XTokens: orml_xtokens = 38,
                 Tokens: orml_tokens = 39,
                 // Vesting: pallet_vesting::{Pallet, Call, Config<T>, Storage, Event<T>} = 37,
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    AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,36    EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser,37    ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,38    SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,39    ConvertedConcreteAssetId,40};41use xcm_executor::{42    {Config, XcmExecutor},43    traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible, ShouldExecute},44};4546use up_common::{47    constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},48    types::{AccountId, Balance},49};5051use crate::{52    Balances, Call, DmpQueue, Event, Origin, ParachainInfo,53    ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,54};55use crate::runtime_common::config::substrate::{TreasuryModuleId, MaxLocks, MaxReserves};56use crate::runtime_common::config::pallets::TreasuryAccountId;57use crate::runtime_common::config::xcm::*;58use crate::*;5960// Signed version of balance61pub type Amount = i128;6263match_types! {64	pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {65		MultiLocation { parents: 1, interior: Here } |66		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) }67	};68	pub type ParentOrSiblings: impl Contains<MultiLocation> = {69		MultiLocation { parents: 1, interior: Here } |70		MultiLocation { parents: 1, interior: X1(_) }71	};72}7374/// Deny executing the XCM if it matches any of the Deny filter regardless of anything else.75/// If it passes the Deny, and matches one of the Allow cases then it is let through.76pub struct DenyThenTry<Deny, Allow>(PhantomData<Deny>, PhantomData<Allow>)77    where78        Deny: ShouldExecute,79        Allow: ShouldExecute;8081impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>82    where83        Deny: ShouldExecute,84        Allow: ShouldExecute,85{86    fn should_execute<Call>(87        origin: &MultiLocation,88        message: &mut Xcm<Call>,89        max_weight: Weight,90        weight_credit: &mut Weight,91    ) -> Result<(), ()> {92        Deny::should_execute(origin, message, max_weight, weight_credit)?;93        Allow::should_execute(origin, message, max_weight, weight_credit)94    }95}9697pub type Barrier = DenyThenTry<98    DenyExchangeWithUnknownLocation,99    (100        TakeWeightCredit,101        AllowTopLevelPaidExecutionFrom<Everything>,102        // Parent and its exec plurality get free execution103        AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,104        // Expected responses are OK.105        AllowKnownQueryResponses<PolkadotXcm>,106        // Subscriptions for version tracking are OK.107        AllowSubscriptionsFrom<ParentOrSiblings>,108    ),109>;
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    UsingAnyCurrencyComponents, 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}182183/*184impl orml_xtokens::Config for Runtime {185    type Event = Event;186    type Balance = Balance;187    type CurrencyId = AssetIds;188    type CurrencyIdConvert = CurrencyIdConvert;189    type AccountIdToMultiLocation = AccountIdToMultiLocation;190    type SelfLocation = SelfLocation;191    type XcmExecutor = XcmExecutor<XcmConfig<Self>>;192    type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;193    type BaseXcmWeight = BaseXcmWeight;194    type LocationInverter = LocationInverter<Ancestry>;195    type MaxAssetsForTransfer = MaxAssetsForTransfer;196    type MinXcmFee = ParachainMinFee;197    type MultiLocationsFilter = Everything;198    type ReserveProvider = AbsoluteReserveProvider;199}200 */201202parameter_type_with_key! {203	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {204		match currency_id {205			CurrencyId::NativeAssetId(symbol) => match symbol {206				NativeCurrency::Here => 0,207				NativeCurrency::Parent=> 0,208			},209			_ => 100_000210		}211	};212}213214pub struct DustRemovalWhitelist;215impl Contains<AccountId> for DustRemovalWhitelist {216    fn contains(a: &AccountId) -> bool {217        get_all_module_accounts().contains(a)218    }219}220221/*222pub struct CurrencyIdConvert;223impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {224    fn convert(id: AssetIds) -> Option<MultiLocation> {225        match id {226            AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(227                1,228                X1(Parachain(ParachainInfo::get().into())),229            )),230            AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),231            AssetIds::ForeignAssetId(foreign_asset_id) => {232                XcmForeignAssetIdMapping::<Runtime>::get_multi_location(foreign_asset_id)233            }234        }235    }236}237impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {238    fn convert(location: MultiLocation) -> Option<CurrencyId> {239        if location == MultiLocation::here()240            || location == MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())))241        {242            return Some(AssetIds::NativeAssetId(NativeCurrency::Here));243        }244245        if location == MultiLocation::parent() {246            return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));247        }248249        if let Some(currency_id) =250        XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())251        {252            return Some(currency_id);253        }254255        None256    }257}258259 */260261262parameter_types! {263	pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this264	pub const MaxAssetsForTransfer: usize = 2;265}266267parameter_types! {268	pub const RelayLocation: MultiLocation = MultiLocation::parent();269	pub const RelayNetwork: NetworkId = NetworkId::Polkadot;270	pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();271	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();272	pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));273}274275parameter_type_with_key! {276	pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {277		Some(100_000_000)278	};279}280281pub fn get_all_module_accounts() -> Vec<AccountId> {282    vec![TreasuryModuleId::get().into_account_truncating()]283}284285pub struct AccountIdToMultiLocation;286impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {287    fn convert(account: AccountId) -> MultiLocation {288        X1(AccountId32 {289            network: NetworkId::Any,290            id: account.into(),291        })292            .into()293    }294}
modifiedruntime/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";
modifiedruntime/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