git.delta.rocks / unique-network / refs/commits / 2fd0e86ac3cf

difftreelog

source

runtime/opal/src/xcm_config.rs17.2 KiBsourcehistory
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, EnsureXcmOrigin,36	FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser, ParentIsPreset,37	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, ForeingAssets, Origin, ParachainInfo, ParachainSystem,53	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::*;5960use pallet_foreing_assets::{61	AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency, FreeForAll,62	TryAsForeing, ForeignAssetId,63};6465// Signed version of balance66pub type Amount = i128;6768/*69parameter_types! {70	pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;71	pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;72}7374impl cumulus_pallet_parachain_system::Config for Runtime {75	type Event = Event;76	type SelfParaId = parachain_info::Pallet<Self>;77	type OnSystemEvent = ();78	type OutboundXcmpMessageSource = XcmpQueue;79	type DmpMessageHandler = DmpQueue;80	type ReservedDmpWeight = ReservedDmpWeight;81	type ReservedXcmpWeight = ReservedXcmpWeight;82	type XcmpMessageHandler = XcmpQueue;83}8485impl parachain_info::Config for Runtime {}8687impl cumulus_pallet_aura_ext::Config for Runtime {}88 */8990parameter_types! {91	pub const RelayLocation: MultiLocation = MultiLocation::parent();92	pub const RelayNetwork: NetworkId = NetworkId::Polkadot;93	pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();94	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();95	pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));96}9798/*99/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used100/// when determining ownership of accounts for asset transacting and when attempting to use XCM101/// `Transact` in order to determine the dispatch Origin.102pub type LocationToAccountId = (103	// The parent (Relay-chain) origin converts to the default `AccountId`.104	ParentIsPreset<AccountId>,105	// Sibling parachain origins convert to AccountId via the `ParaId::into`.106	SiblingParachainConvertsVia<Sibling, AccountId>,107	// Straight up local `AccountId32` origins just alias directly to `AccountId`.108	AccountId32Aliases<RelayNetwork, AccountId>,109);110111pub struct OnlySelfCurrency;112113impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {114	fn matches_fungible(a: &MultiAsset) -> Option<B> {115		match (&a.id, &a.fun) {116			(Concrete(_), XcmFungible(ref amount)) => CheckedConversion::checked_from(*amount),117			_ => None,118		}119	}120}121122/// Means for transacting assets on this chain.123pub type LocalAssetTransactor = CurrencyAdapter<124	// Use this currency:125	Balances,126	// Use this currency when it is a fungible asset matching the given location or name:127	OnlySelfCurrency,128	// Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:129	LocationToAccountId,130	// Our chain's account ID type (we can't get away without mentioning it explicitly):131	AccountId,132	// We don't track any teleports.133	(),134>;135136 */137138/*139parameter_types! {140	pub CheckingAccount: AccountId = PolkadotXcm::check_account();141}142143/// Allow checking in assets that have issuance > 0.144pub struct NonZeroIssuance<AccountId, ForeingAssets>(PhantomData<(AccountId, ForeingAssets)>);145impl<AccountId, ForeingAssets> Contains<<ForeingAssets as fungibles::Inspect<AccountId>>::AssetId>146	for NonZeroIssuance<AccountId, ForeingAssets>147where148	ForeingAssets: fungibles::Inspect<AccountId>,149{150	fn contains(id: &<ForeingAssets as fungibles::Inspect<AccountId>>::AssetId) -> bool {151		!ForeingAssets::total_issuance(*id).is_zero()152	}153}154155pub struct AsInnerId<AssetId, ConvertAssetId>(PhantomData<(AssetId, ConvertAssetId)>);156impl<AssetId: Clone + PartialEq, ConvertAssetId: ConvertXcm<AssetId, AssetId>>157	ConvertXcm<MultiLocation, AssetId> for AsInnerId<AssetId, ConvertAssetId>158where159	AssetId: Borrow<AssetId>,160	AssetId: TryAsForeing<AssetId, ForeignAssetId>,161	AssetIds: Borrow<AssetId>,162{163	fn convert_ref(id: impl Borrow<MultiLocation>) -> Result<AssetId, ()> {164		let id = id.borrow();165166		log::trace!(167			target: "xcm::AsInnerId::Convert",168			"AsInnerId {:?}",169			id170		);171172		let parent = MultiLocation::parent();173		let here = MultiLocation::here();174		let self_location = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));175176		if *id == parent {177			return ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Parent));178		}179180		if *id == here || *id == self_location {181			return ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Here));182		}183184		match XcmForeignAssetIdMapping::<Runtime>::get_currency_id(id.clone()) {185			Some(AssetIds::ForeignAssetId(foreign_asset_id)) => {186				ConvertAssetId::convert_ref(AssetIds::ForeignAssetId(foreign_asset_id))187			}188			_ => ConvertAssetId::convert_ref(AssetIds::ForeignAssetId(0)),189		}190	}191192	fn reverse_ref(what: impl Borrow<AssetId>) -> Result<MultiLocation, ()> {193		log::trace!(194			target: "xcm::AsInnerId::Reverse",195			"AsInnerId",196		);197198		let asset_id = what.borrow();199200		let parent_id =201			ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Parent)).unwrap();202		let here_id =203			ConvertAssetId::convert_ref(AssetIds::NativeAssetId(NativeCurrency::Here)).unwrap();204205		if asset_id.clone() == parent_id {206			return Ok(MultiLocation::parent());207		}208209		if asset_id.clone() == here_id {210			return Ok(MultiLocation::new(211				1,212				X1(Parachain(ParachainInfo::get().into())),213			));214		}215216		match <AssetId as TryAsForeing<AssetId, ForeignAssetId>>::try_as_foreing(asset_id.clone()) {217			Some(fid) => match XcmForeignAssetIdMapping::<Runtime>::get_multi_location(fid) {218				Some(location) => Ok(location),219				None => Err(()),220			},221			None => Err(()),222		}223	}224}225226/// Means for transacting assets besides the native currency on this chain.227pub type FungiblesTransactor = FungiblesAdapter<228	// Use this fungibles implementation:229	ForeingAssets,230	// Use this currency when it is a fungible asset matching the given location or name:231	ConvertedConcreteAssetId<AssetIds, Balance, AsInnerId<AssetIds, JustTry>, JustTry>,232	// Convert an XCM MultiLocation into a local account id:233	LocationToAccountId,234	// Our chain's account ID type (we can't get away without mentioning it explicitly):235	AccountId,236	// We only want to allow teleports of known assets. We use non-zero issuance as an indication237	// that this asset is known.238	NonZeroIssuance<AccountId, ForeingAssets>,239	// The account to use for tracking teleports.240	CheckingAccount,241>;242243/// Means for transacting assets on this chain.244pub type AssetTransactors = FungiblesTransactor;245 */246247/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,248/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can249/// biases the kind of local `Origin` it will become.250pub type XcmOriginToTransactDispatchOrigin = (251	// Sovereign account converter; this attempts to derive an `AccountId` from the origin location252	// using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for253	// foreign chains who want to have a local sovereign account on this chain which they control.254	SovereignSignedViaLocation<LocationToAccountId, Origin>,255	// Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when256	// recognised.257	RelayChainAsNative<RelayOrigin, Origin>,258	// Native converter for sibling Parachains; will convert to a `SiblingPara` origin when259	// recognised.260	SiblingParachainAsNative<cumulus_pallet_xcm::Origin, Origin>,261	// Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a262	// transaction from the Root origin.263	ParentAsSuperuser<Origin>,264	// Native signed account converter; this just converts an `AccountId32` origin into a normal265	// `Origin::Signed` origin of the same 32-byte value.266	SignedAccountId32AsNative<RelayNetwork, Origin>,267	// Xcm origins can be represented natively under the Xcm pallet's Xcm origin.268	XcmPassthrough<Origin>,269);270271parameter_types! {272	// One XCM operation is 1_000_000 weight - almost certainly a conservative estimate.273	pub UnitWeightCost: Weight = 1_000_000;274	// 1200 UNIQUEs buy 1 second of weight.275	pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::parent(), 1_200 * UNIQUE);276	pub const MaxInstructions: u32 = 100;277	pub const MaxAuthorities: u32 = 100_000;278}279280match_types! {281	pub type ParentOrParentsUnitPlurality: impl Contains<MultiLocation> = {282		MultiLocation { parents: 1, interior: Here } |283		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Unit, .. }) }284	};285}286287/// Execution barrier that just takes `max_weight` from `weight_credit`.288///289/// Useful to allow XCM execution by local chain users via extrinsics.290/// E.g. `pallet_xcm::reserve_asset_transfer` to transfer a reserve asset291/// out of the local chain to another one.292pub struct AllowAllDebug;293impl ShouldExecute for AllowAllDebug {294	fn should_execute<Call>(295		_origin: &MultiLocation,296		_message: &mut Xcm<Call>,297		max_weight: Weight,298		weight_credit: &mut Weight,299	) -> Result<(), ()> {300		Ok(())301	}302}303304pub type Barrier = (305	TakeWeightCredit,306	AllowTopLevelPaidExecutionFrom<Everything>,307	AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,308	// ^^^ Parent & its unit plurality gets free execution309	AllowAllDebug,310);311312pub struct AllAsset;313impl FilterAssetLocation for AllAsset {314	fn filter_asset_location(asset: &MultiAsset, origin: &MultiLocation) -> bool {315		true316	}317}318319/* /// CHANGEME!!!320pub struct XcmConfig;321impl Config for XcmConfig {322	type Call = Call;323	type XcmSender = XcmRouter;324	// How to withdraw and deposit an asset.325	type AssetTransactor = AssetTransactors;326	type OriginConverter = XcmOriginToTransactDispatchOrigin;327	type IsReserve = AllAsset; //NativeAsset;328	type IsTeleporter = (); // Teleportation is disabled329	type LocationInverter = LocationInverter<Ancestry>;330	type Barrier = Barrier;331	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;332	type Trader =333		FreeForAll<LinearFee<Balance>, RelayLocation, AccountId, Balances, ()>;334	type ResponseHandler = (); // Don't handle responses for now.335	type SubscriptionService = PolkadotXcm;336	type AssetTrap = PolkadotXcm;337	type AssetClaims = PolkadotXcm;338}339 */340341/*342/// No local origins on this chain are allowed to dispatch XCM sends/executions.343pub type LocalOriginToLocation = (SignedToAccountId32<Origin, AccountId, RelayNetwork>,);344345/// The means for routing XCM messages which are not for local execution into the right message346/// queues.347pub type XcmRouter = (348	// Two routers - use UMP to communicate with the relay chain:349	cumulus_primitives_utility::ParentAsUmp<ParachainSystem, ()>,350	// ..and XCMP to communicate with the sibling chains.351	XcmpQueue,352);353 */354355/*356impl pallet_xcm::Config for Runtime {357	type Event = Event;358	type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;359	type XcmRouter = XcmRouter;360	type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;361	type XcmExecuteFilter = Everything;362	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;363	type XcmTeleportFilter = Everything;364	type XcmReserveTransferFilter = Everything;365	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;366	type LocationInverter = LocationInverter<Ancestry>;367	type Origin = Origin;368	type Call = Call;369	const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;370	type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;371}372 */373374/*375impl cumulus_pallet_xcm::Config for Runtime {376	type Event = Event;377	type XcmExecutor = XcmExecutor<XcmConfig>;378}379380impl cumulus_pallet_xcmp_queue::Config for Runtime {381	type WeightInfo = ();382	type Event = Event;383	type XcmExecutor = XcmExecutor<XcmConfig>;384	type ChannelInfo = ParachainSystem;385	type VersionWrapper = ();386	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;387	type ControllerOrigin = EnsureRoot<AccountId>;388	type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;389}390391impl cumulus_pallet_dmp_queue::Config for Runtime {392	type Event = Event;393	type XcmExecutor = XcmExecutor<XcmConfig>;394	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;395}396 */397398pub struct CurrencyIdConvert;399impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {400	fn convert(id: AssetIds) -> Option<MultiLocation> {401		match id {402			AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(403				1,404				X1(Parachain(ParachainInfo::get().into())),405			)),406			AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),407			AssetIds::ForeignAssetId(foreign_asset_id) => {408				XcmForeignAssetIdMapping::<Runtime>::get_multi_location(foreign_asset_id)409			}410		}411	}412}413impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {414	fn convert(location: MultiLocation) -> Option<CurrencyId> {415		if location == MultiLocation::here()416			|| location == MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())))417		{418			return Some(AssetIds::NativeAssetId(NativeCurrency::Here));419		}420421		if location == MultiLocation::parent() {422			return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));423		}424425		if let Some(currency_id) =426			XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())427		{428			return Some(currency_id);429		}430431		None432	}433}434435pub fn get_all_module_accounts() -> Vec<AccountId> {436	vec![TreasuryModuleId::get().into_account_truncating()]437}438439pub struct DustRemovalWhitelist;440impl Contains<AccountId> for DustRemovalWhitelist {441	fn contains(a: &AccountId) -> bool {442		get_all_module_accounts().contains(a)443	}444}445446parameter_type_with_key! {447	pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {448		match currency_id {449			CurrencyId::NativeAssetId(symbol) => match symbol {450				NativeCurrency::Here => 0,451				NativeCurrency::Parent=> 0,452			},453			_ => 100_000454		}455	};456}457458impl orml_tokens::Config for Runtime {459	type Event = Event;460	type Balance = Balance;461	type Amount = Amount;462	type CurrencyId = CurrencyId;463	type WeightInfo = ();464	type ExistentialDeposits = ExistentialDeposits;465	type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;466	type MaxLocks = MaxLocks;467	type MaxReserves = MaxReserves;468	// TODO: Add all module accounts469	type DustRemovalWhitelist = DustRemovalWhitelist;470	/// The id type for named reserves.471	type ReserveIdentifier = ();472	type OnNewTokenAccount = ();473	type OnKilledTokenAccount = ();474}475476parameter_types! {477	pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this478	pub const MaxAssetsForTransfer: usize = 2;479}480481parameter_type_with_key! {482	pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {483		Some(100_000_000_000)484	};485}486487pub struct AccountIdToMultiLocation;488impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {489	fn convert(account: AccountId) -> MultiLocation {490		X1(AccountId32 {491			network: NetworkId::Any,492			id: account.into(),493		})494		.into()495	}496}497498impl orml_xtokens::Config for Runtime {499	type Event = Event;500	type Balance = Balance;501	type CurrencyId = AssetIds;502	type CurrencyIdConvert = CurrencyIdConvert;503	type AccountIdToMultiLocation = AccountIdToMultiLocation;504	type SelfLocation = SelfLocation;505	type XcmExecutor = XcmExecutor<XcmConfig<Self>>;506	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;507	type BaseXcmWeight = BaseXcmWeight;508	type LocationInverter = LocationInverter<Ancestry>;509	type MaxAssetsForTransfer = MaxAssetsForTransfer;510	type MinXcmFee = ParachainMinFee;511	type MultiLocationsFilter = Everything;512	type ReserveProvider = AbsoluteReserveProvider;513}