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}difftreelog
source
runtime/opal/src/xcm_config.rs17.2 KiBsourcehistory