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

difftreelog

fix get rid of unneeded comments in xcm configs

Daniel Shiposha2022-09-05parent: #f8304b7.patch.diff
in: master

2 files changed

modifiedruntime/opal/src/xcm_config.rsdiffbeforeafterboth
--- a/runtime/opal/src/xcm_config.rs
+++ b/runtime/opal/src/xcm_config.rs
@@ -65,185 +65,14 @@
 // Signed version of balance
 pub type Amount = i128;
 
-/*
-parameter_types! {
-	pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;
-	pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;
-}
-
-impl cumulus_pallet_parachain_system::Config for Runtime {
-	type Event = Event;
-	type SelfParaId = parachain_info::Pallet<Self>;
-	type OnSystemEvent = ();
-	type OutboundXcmpMessageSource = XcmpQueue;
-	type DmpMessageHandler = DmpQueue;
-	type ReservedDmpWeight = ReservedDmpWeight;
-	type ReservedXcmpWeight = ReservedXcmpWeight;
-	type XcmpMessageHandler = XcmpQueue;
-}
-
-impl parachain_info::Config for Runtime {}
-
-impl cumulus_pallet_aura_ext::Config for Runtime {}
- */
-
 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())));
-}
-
-/*
-/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used
-/// when determining ownership of accounts for asset transacting and when attempting to use XCM
-/// `Transact` in order to determine the dispatch Origin.
-pub type LocationToAccountId = (
-	// The parent (Relay-chain) origin converts to the default `AccountId`.
-	ParentIsPreset<AccountId>,
-	// Sibling parachain origins convert to AccountId via the `ParaId::into`.
-	SiblingParachainConvertsVia<Sibling, AccountId>,
-	// Straight up local `AccountId32` origins just alias directly to `AccountId`.
-	AccountId32Aliases<RelayNetwork, AccountId>,
-);
-
-pub struct OnlySelfCurrency;
-
-impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {
-	fn matches_fungible(a: &MultiAsset) -> Option<B> {
-		match (&a.id, &a.fun) {
-			(Concrete(_), XcmFungible(ref amount)) => CheckedConversion::checked_from(*amount),
-			_ => None,
-		}
-	}
-}
-
-/// Means for transacting assets on this chain.
-pub type LocalAssetTransactor = CurrencyAdapter<
-	// Use this currency:
-	Balances,
-	// Use this currency when it is a fungible asset matching the given location or name:
-	OnlySelfCurrency,
-	// Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:
-	LocationToAccountId,
-	// Our chain's account ID type (we can't get away without mentioning it explicitly):
-	AccountId,
-	// We don't track any teleports.
-	(),
->;
-
- */
-
-/*
-parameter_types! {
-	pub CheckingAccount: AccountId = PolkadotXcm::check_account();
-}
-
-/// Allow checking in assets that have issuance > 0.
-pub struct NonZeroIssuance<AccountId, ForeingAssets>(PhantomData<(AccountId, ForeingAssets)>);
-impl<AccountId, ForeingAssets> Contains<<ForeingAssets as fungibles::Inspect<AccountId>>::AssetId>
-	for NonZeroIssuance<AccountId, ForeingAssets>
-where
-	ForeingAssets: fungibles::Inspect<AccountId>,
-{
-	fn contains(id: &<ForeingAssets as fungibles::Inspect<AccountId>>::AssetId) -> bool {
-		!ForeingAssets::total_issuance(*id).is_zero()
-	}
-}
-
-pub struct AsInnerId<AssetId, ConvertAssetId>(PhantomData<(AssetId, ConvertAssetId)>);
-impl<AssetId: Clone + PartialEq, ConvertAssetId: ConvertXcm<AssetId, AssetId>>
-	ConvertXcm<MultiLocation, AssetId> for AsInnerId<AssetId, ConvertAssetId>
-where
-	AssetId: Borrow<AssetId>,
-	AssetId: TryAsForeing<AssetId, ForeignAssetId>,
-	AssetIds: Borrow<AssetId>,
-{
-	fn convert_ref(id: impl Borrow<MultiLocation>) -> Result<AssetId, ()> {
-		let id = id.borrow();
-
-		log::trace!(
-			target: "xcm::AsInnerId::Convert",
-			"AsInnerId {:?}",
-			id
-		);
-
-		let parent = MultiLocation::parent();
-		let here = MultiLocation::here();
-		let self_location = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
-
-		if *id == parent {
-			return ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Parent));
-		}
-
-		if *id == here || *id == self_location {
-			return ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Here));
-		}
-
-		match XcmForeignAssetIdMapping::<Runtime>::get_currency_id(id.clone()) {
-			Some(AssetIds::ForeignAssetId(foreign_asset_id)) => {
-				ConvertAssetId::convert_ref(AssetIds::ForeignAssetId(foreign_asset_id))
-			}
-			_ => ConvertAssetId::convert_ref(AssetIds::ForeignAssetId(0)),
-		}
-	}
-
-	fn reverse_ref(what: impl Borrow<AssetId>) -> Result<MultiLocation, ()> {
-		log::trace!(
-			target: "xcm::AsInnerId::Reverse",
-			"AsInnerId",
-		);
-
-		let asset_id = what.borrow();
-
-		let parent_id =
-			ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Parent)).unwrap();
-		let here_id =
-			ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Here)).unwrap();
-
-		if asset_id.clone() == parent_id {
-			return Ok(MultiLocation::parent());
-		}
-
-		if asset_id.clone() == here_id {
-			return Ok(MultiLocation::new(
-				1,
-				X1(Parachain(ParachainInfo::get().into())),
-			));
-		}
-
-		match <AssetId as TryAsForeing<AssetId, ForeignAssetId>>::try_as_foreing(asset_id.clone()) {
-			Some(fid) => match XcmForeignAssetIdMapping::<Runtime>::get_multi_location(fid) {
-				Some(location) => Ok(location),
-				None => Err(()),
-			},
-			None => Err(()),
-		}
-	}
 }
 
-/// Means for transacting assets besides the native currency on this chain.
-pub type FungiblesTransactor = FungiblesAdapter<
-	// Use this fungibles implementation:
-	ForeingAssets,
-	// Use this currency when it is a fungible asset matching the given location or name:
-	ConvertedConcreteAssetId<AssetIds, Balance, AsInnerId<AssetIds, JustTry>, JustTry>,
-	// Convert an XCM MultiLocation into a local account id:
-	LocationToAccountId,
-	// Our chain's account ID type (we can't get away without mentioning it explicitly):
-	AccountId,
-	// We only want to allow teleports of known assets. We use non-zero issuance as an indication
-	// that this asset is known.
-	NonZeroIssuance<AccountId, ForeingAssets>,
-	// The account to use for tracking teleports.
-	CheckingAccount,
->;
-
-/// Means for transacting assets on this chain.
-pub type AssetTransactors = FungiblesTransactor;
- */
-
 /// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,
 /// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can
 /// biases the kind of local `Origin` it will become.
@@ -318,85 +147,6 @@
 		true
 	}
 }
-
-/* /// CHANGEME!!!
-pub struct XcmConfig;
-impl Config for XcmConfig {
-	type Call = Call;
-	type XcmSender = XcmRouter;
-	// How to withdraw and deposit an asset.
-	type AssetTransactor = AssetTransactors;
-	type OriginConverter = XcmOriginToTransactDispatchOrigin;
-	type IsReserve = AllAsset; //NativeAsset;
-	type IsTeleporter = (); // Teleportation is disabled
-	type LocationInverter = LocationInverter<Ancestry>;
-	type Barrier = Barrier;
-	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
-	type Trader =
-		FreeForAll<LinearFee<Balance>, RelayLocation, AccountId, Balances, ()>;
-	type ResponseHandler = (); // Don't handle responses for now.
-	type SubscriptionService = PolkadotXcm;
-	type AssetTrap = PolkadotXcm;
-	type AssetClaims = PolkadotXcm;
-}
- */
-
-/*
-/// No local origins on this chain are allowed to dispatch XCM sends/executions.
-pub type LocalOriginToLocation = (SignedToAccountId32<Origin, AccountId, RelayNetwork>,);
-
-/// The means for routing XCM messages which are not for local execution into the right message
-/// queues.
-pub type XcmRouter = (
-	// Two routers - use UMP to communicate with the relay chain:
-	cumulus_primitives_utility::ParentAsUmp<ParachainSystem, ()>,
-	// ..and XCMP to communicate with the sibling chains.
-	XcmpQueue,
-);
- */
-
-/*
-impl pallet_xcm::Config for Runtime {
-	type Event = Event;
-	type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;
-	type XcmRouter = XcmRouter;
-	type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;
-	type XcmExecuteFilter = Everything;
-	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
-	type XcmTeleportFilter = Everything;
-	type XcmReserveTransferFilter = Everything;
-	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
-	type LocationInverter = LocationInverter<Ancestry>;
-	type Origin = Origin;
-	type Call = Call;
-	const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;
-	type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;
-}
- */
-
-/*
-impl cumulus_pallet_xcm::Config for Runtime {
-	type Event = Event;
-	type XcmExecutor = XcmExecutor<XcmConfig>;
-}
-
-impl cumulus_pallet_xcmp_queue::Config for Runtime {
-	type WeightInfo = ();
-	type Event = Event;
-	type XcmExecutor = XcmExecutor<XcmConfig>;
-	type ChannelInfo = ParachainSystem;
-	type VersionWrapper = ();
-	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;
-	type ControllerOrigin = EnsureRoot<AccountId>;
-	type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;
-}
-
-impl cumulus_pallet_dmp_queue::Config for Runtime {
-	type Event = Event;
-	type XcmExecutor = XcmExecutor<XcmConfig>;
-	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;
-}
- */
 
 pub struct CurrencyIdConvert;
 impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
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},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 TryPass for DenyExchangeWithUnknownLocation {97    fn try_pass<Call>(98        origin: &MultiLocation,99        message: &mut Xcm<Call>,100    ) -> Result<(), ()> {101102        // Check if deposit or transfer belongs to allowed parachains103        let mut allowed = get_allowed_locations().contains(origin);104105        message.0.iter().for_each(|inst| {106            match inst {107                DepositReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }108                TransferReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }109                _ => {}110            }111        });112113        if allowed {114            return Ok(());115        }116117        log::warn!(118			target: "xcm::barrier",119			"Unexpected deposit or transfer location"120		);121        // Deny122        Err(())123    }124}125126pub type Barrier = DenyThenTry<127    (128        DenyTransact,129        DenyExchangeWithUnknownLocation,130    ),131    (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}
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},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 TryPass for DenyExchangeWithUnknownLocation {97    fn try_pass<Call>(98        origin: &MultiLocation,99        message: &mut Xcm<Call>,100    ) -> Result<(), ()> {101102        // Check if deposit or transfer belongs to allowed parachains103        let mut allowed = get_allowed_locations().contains(origin);104105        message.0.iter().for_each(|inst| {106            match inst {107                DepositReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }108                TransferReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }109                _ => {}110            }111        });112113        if allowed {114            return Ok(());115        }116117        log::warn!(118			target: "xcm::barrier",119			"Unexpected deposit or transfer location"120		);121        // Deny122        Err(())123    }124}125126pub type Barrier = DenyThenTry<127    (128        DenyTransact,129        DenyExchangeWithUnknownLocation,130    ),131    (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}177178parameter_type_with_key! {179	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {180		match currency_id {181			CurrencyId::NativeAssetId(symbol) => match symbol {182				NativeCurrency::Here => 0,183				NativeCurrency::Parent=> 0,184			},185			_ => 100_000186		}187	};188}189190pub struct DustRemovalWhitelist;191impl Contains<AccountId> for DustRemovalWhitelist {192    fn contains(a: &AccountId) -> bool {193        get_all_module_accounts().contains(a)194    }195}196197pub struct CurrencyIdConvert;198impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {199    fn convert(id: AssetIds) -> Option<MultiLocation> {200        match id {201            AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(202                1,203                X1(Parachain(ParachainInfo::get().into())),204            )),205            AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),206            AssetIds::ForeignAssetId(_) => None,207        }208    }209}210211parameter_types! {212	pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this213	pub const MaxAssetsForTransfer: usize = 2;214}215216parameter_types! {217	pub const RelayLocation: MultiLocation = MultiLocation::parent();218	pub const RelayNetwork: NetworkId = NetworkId::Polkadot;219	pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();220	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();221	pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));222}223224parameter_type_with_key! {225	pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {226		Some(100_000_000)227	};228}229230pub fn get_all_module_accounts() -> Vec<AccountId> {231    vec![TreasuryModuleId::get().into_account_truncating()]232}233234pub struct AccountIdToMultiLocation;235impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {236    fn convert(account: AccountId) -> MultiLocation {237        X1(AccountId32 {238            network: NetworkId::Any,239            id: account.into(),240        })241            .into()242    }243}