difftreelog
fix get rid of unneeded comments in xcm configs
in: master
2 files changed
runtime/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 {
runtime/quartz/src/xcm_config.rsdiffbeforeafterboth1// 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}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}