git.delta.rocks / unique-network / refs/commits / c9cd7476b100

difftreelog

feat(xcm) reenable xtokens on qtz/unq, allow moonbeam on unq

Daniel Shiposha2022-09-02parent: #7b07931.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,7 +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/opal/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/opal/src/xcm_config.rs
+++ b/runtime/opal/src/xcm_config.rs
@@ -498,7 +498,7 @@
 impl orml_xtokens::Config for Runtime {
 	type Event = Event;
 	type Balance = Balance;
-	type CurrencyId = AssetIds;
+	type CurrencyId = CurrencyId;
 	type CurrencyIdConvert = CurrencyIdConvert;
 	type AccountIdToMultiLocation = AccountIdToMultiLocation;
 	type SelfLocation = SelfLocation;
modifiedruntime/quartz/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/quartz/src/xcm_config.rs
+++ b/runtime/quartz/src/xcm_config.rs
@@ -180,11 +180,10 @@
     type OnKilledTokenAccount = ();
 }
 
-/*
 impl orml_xtokens::Config for Runtime {
     type Event = Event;
     type Balance = Balance;
-    type CurrencyId = AssetIds;
+    type CurrencyId = CurrencyId;
     type CurrencyIdConvert = CurrencyIdConvert;
     type AccountIdToMultiLocation = AccountIdToMultiLocation;
     type SelfLocation = SelfLocation;
@@ -197,8 +196,8 @@
     type MultiLocationsFilter = Everything;
     type ReserveProvider = AbsoluteReserveProvider;
 }
- */
 
+
 parameter_type_with_key! {
 	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
 		match currency_id {
@@ -218,7 +217,7 @@
     }
 }
 
-/*
+
 pub struct CurrencyIdConvert;
 impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
     fn convert(id: AssetIds) -> Option<MultiLocation> {
@@ -228,12 +227,11 @@
                 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)
-            }
+            AssetIds::ForeignAssetId(_) => None,
         }
     }
 }
+/*
 impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {
     fn convert(location: MultiLocation) -> Option<CurrencyId> {
         if location == MultiLocation::here()
modifiedruntime/unique/src/xcm_config.rsdiffbeforeafterboth
before · runtime/unique/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;676869pub type Barrier = DenyThenTry<70    DenyExchangeWithUnknownLocation,71    (72        TakeWeightCredit,73        AllowTopLevelPaidExecutionFrom<Everything>,74        // Parent and its exec plurality get free execution75        AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,76        // Expected responses are OK.77        AllowKnownQueryResponses<PolkadotXcm>,78        // Subscriptions for version tracking are OK.79        AllowSubscriptionsFrom<ParentOrSiblings>,80    ),81>;8283pub fn get_allowed_locations() -> Vec<MultiLocation> {84    vec![85        // Self location86        MultiLocation { parents: 0, interior: Here },87        // Parent location88        MultiLocation { parents: 1, interior: Here },89        // Karura/Acala location90        MultiLocation { parents: 1, interior: X1(Parachain(2000)) },91        // Self parachain address92        MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },93    ]94}9596pub struct DenyThenTry<Deny, Allow>(PhantomData<Deny>, PhantomData<Allow>)97    where98        Deny: ShouldExecute,99        Allow: ShouldExecute;100101impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>102    where103        Deny: ShouldExecute,104        Allow: ShouldExecute,105{106    fn should_execute<Call>(107        origin: &MultiLocation,108        message: &mut Xcm<Call>,109        max_weight: Weight,110        weight_credit: &mut Weight,111    ) -> Result<(), ()> {112        Deny::should_execute(origin, message, max_weight, weight_credit)?;113        Allow::should_execute(origin, message, max_weight, weight_credit)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}150151152match_types! {153	pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {154		MultiLocation { parents: 1, interior: Here } |155		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) }156	};157	pub type ParentOrSiblings: impl Contains<MultiLocation> = {158		MultiLocation { parents: 1, interior: Here } |159		MultiLocation { parents: 1, interior: X1(_) }160	};161}162163pub fn get_all_module_accounts() -> Vec<AccountId> {164    vec![TreasuryModuleId::get().into_account_truncating()]165}166167pub struct DustRemovalWhitelist;168impl Contains<AccountId> for DustRemovalWhitelist {169    fn contains(a: &AccountId) -> bool {170        get_all_module_accounts().contains(a)171    }172}173174parameter_type_with_key! {175	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {176		match currency_id {177			CurrencyId::NativeAssetId(symbol) => match symbol {178				NativeCurrency::Here => 0,179				NativeCurrency::Parent=> 0,180			},181			_ => 100_000182		}183	};184}185186impl orml_tokens::Config for Runtime {187    type Event = Event;188    type Balance = Balance;189    type Amount = Amount;190    type CurrencyId = CurrencyId;191    type WeightInfo = ();192    type ExistentialDeposits = ExistentialDeposits;193    type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;194    type MaxLocks = MaxLocks;195    type MaxReserves = MaxReserves;196    // TODO: Add all module accounts197    type DustRemovalWhitelist = DustRemovalWhitelist;198    /// The id type for named reserves.199    type ReserveIdentifier = ();200    type OnNewTokenAccount = ();201    type OnKilledTokenAccount = ();202}203204205parameter_types! {206	pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this207	pub const MaxAssetsForTransfer: usize = 2;208}209210parameter_type_with_key! {211	pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {212		Some(100_000_000)213	};214}215216217pub struct AccountIdToMultiLocation;218impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {219    fn convert(account: AccountId) -> MultiLocation {220        X1(AccountId32 {221            network: NetworkId::Any,222            id: account.into(),223        })224            .into()225    }226}
after · runtime/unique/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;676869pub type Barrier = DenyThenTry<70    DenyExchangeWithUnknownLocation,71    (72        TakeWeightCredit,73        AllowTopLevelPaidExecutionFrom<Everything>,74        // Parent and its exec plurality get free execution75        AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,76        // Expected responses are OK.77        AllowKnownQueryResponses<PolkadotXcm>,78        // Subscriptions for version tracking are OK.79        AllowSubscriptionsFrom<ParentOrSiblings>,80    ),81>;8283pub fn get_allowed_locations() -> Vec<MultiLocation> {84    vec![85        // Self location86        MultiLocation { parents: 0, interior: Here },87        // Parent location88        MultiLocation { parents: 1, interior: Here },89        // Karura/Acala location90        MultiLocation { parents: 1, interior: X1(Parachain(2000)) },91        // Moonbeam location92        MultiLocation { parents: 1, interior: X1(Parachain(2004)) },93        // Self parachain address94        MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },95    ]96}9798pub struct DenyThenTry<Deny, Allow>(PhantomData<Deny>, PhantomData<Allow>)99    where100        Deny: ShouldExecute,101        Allow: ShouldExecute;102103impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>104    where105        Deny: ShouldExecute,106        Allow: ShouldExecute,107{108    fn should_execute<Call>(109        origin: &MultiLocation,110        message: &mut Xcm<Call>,111        max_weight: Weight,112        weight_credit: &mut Weight,113    ) -> Result<(), ()> {114        Deny::should_execute(origin, message, max_weight, weight_credit)?;115        Allow::should_execute(origin, message, max_weight, weight_credit)116    }117}118119// Allow xcm exchange only with locations in list120pub struct DenyExchangeWithUnknownLocation;121impl ShouldExecute for DenyExchangeWithUnknownLocation {122    fn should_execute<Call>(123        origin: &MultiLocation,124        message: &mut Xcm<Call>,125        _max_weight: Weight,126        _weight_credit: &mut Weight,127    ) -> Result<(), ()> {128129        // Check if deposit or transfer belongs to allowed parachains130        let mut allowed = get_allowed_locations().contains(origin);131132        message.0.iter().for_each(|inst| {133            match inst {134                DepositReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }135                TransferReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }136                _ => {}137            }138        });139140        if allowed {141            return Ok(());142        }143144        log::warn!(145			target: "xcm::barrier",146			"Unexpected deposit or transfer location"147		);148        // Deny149        Err(())150    }151}152153154match_types! {155	pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {156		MultiLocation { parents: 1, interior: Here } |157		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) }158	};159	pub type ParentOrSiblings: impl Contains<MultiLocation> = {160		MultiLocation { parents: 1, interior: Here } |161		MultiLocation { parents: 1, interior: X1(_) }162	};163}164165pub fn get_all_module_accounts() -> Vec<AccountId> {166    vec![TreasuryModuleId::get().into_account_truncating()]167}168169pub struct DustRemovalWhitelist;170impl Contains<AccountId> for DustRemovalWhitelist {171    fn contains(a: &AccountId) -> bool {172        get_all_module_accounts().contains(a)173    }174}175176parameter_type_with_key! {177	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {178		match currency_id {179			CurrencyId::NativeAssetId(symbol) => match symbol {180				NativeCurrency::Here => 0,181				NativeCurrency::Parent=> 0,182			},183			_ => 100_000184		}185	};186}187188impl orml_tokens::Config for Runtime {189    type Event = Event;190    type Balance = Balance;191    type Amount = Amount;192    type CurrencyId = CurrencyId;193    type WeightInfo = ();194    type ExistentialDeposits = ExistentialDeposits;195    type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;196    type MaxLocks = MaxLocks;197    type MaxReserves = MaxReserves;198    // TODO: Add all module accounts199    type DustRemovalWhitelist = DustRemovalWhitelist;200    /// The id type for named reserves.201    type ReserveIdentifier = ();202    type OnNewTokenAccount = ();203    type OnKilledTokenAccount = ();204}205206impl orml_xtokens::Config for Runtime {207    type Event = Event;208    type Balance = Balance;209    type CurrencyId = CurrencyId;210    type CurrencyIdConvert = CurrencyIdConvert;211    type AccountIdToMultiLocation = AccountIdToMultiLocation;212    type SelfLocation = SelfLocation;213    type XcmExecutor = XcmExecutor<XcmConfig<Self>>;214    type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;215    type BaseXcmWeight = BaseXcmWeight;216    type LocationInverter = LocationInverter<Ancestry>;217    type MaxAssetsForTransfer = MaxAssetsForTransfer;218    type MinXcmFee = ParachainMinFee;219    type MultiLocationsFilter = Everything;220    type ReserveProvider = AbsoluteReserveProvider;221}222223pub struct CurrencyIdConvert;224impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {225    fn convert(id: AssetIds) -> Option<MultiLocation> {226        match id {227            AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(228                1,229                X1(Parachain(ParachainInfo::get().into())),230            )),231            _ => None,232        }233    }234}235236parameter_types! {237	pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this238	pub const MaxAssetsForTransfer: usize = 2;239240    pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();241    pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));242}243244parameter_type_with_key! {245	pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {246		Some(100_000_000)247	};248}249250251pub struct AccountIdToMultiLocation;252impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {253    fn convert(account: AccountId) -> MultiLocation {254        X1(AccountId32 {255            network: NetworkId::Any,256            id: account.into(),257        })258            .into()259    }260}