1234567891011121314151617use cumulus_pallet_xcm;18use frame_support::{19 {match_types, parameter_types, weights::Weight},20 pallet_prelude::Get,21 traits::{Contains, Everything, fungibles},22};23use frame_system::EnsureRoot;24use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};25use pallet_xcm::XcmPassthrough;26use polkadot_parachain::primitives::Sibling;27use sp_runtime::traits::{AccountIdConversion, CheckedConversion, Convert, Zero};28use sp_std::{borrow::Borrow, marker::PhantomData, vec, vec::Vec};29use xcm::{30 latest::{MultiAsset, Xcm},31 prelude::{Concrete, Fungible as XcmFungible},32 v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},33};34use xcm_builder::{35 AllowKnownQueryResponses, AllowSubscriptionsFrom,36 AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,37 EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser,38 ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,39 SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,40 ConvertedConcreteAssetId,41};42use xcm_executor::{43 {Config, XcmExecutor},44 traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible, ShouldExecute},45};4647use up_common::{48 constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},49 types::{AccountId, Balance},50};51use pallet_foreing_assets::{52 AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,53 FreeForAll, TryAsForeing, ForeignAssetId,54};55use crate::{56 Balances, Call, DmpQueue, Event, Origin, ParachainInfo,57 ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,58};59use crate::runtime_common::config::substrate::{TreasuryModuleId, MaxLocks, MaxReserves};60use crate::runtime_common::config::pallets::TreasuryAccountId;61use crate::runtime_common::config::xcm::*;62use crate::*;63use xcm::opaque::latest::prelude::{ DepositReserveAsset, DepositAsset, TransferAsset, TransferReserveAsset };646566pub type Amount = i128;676869pub type Barrier = DenyThenTry<70 DenyExchangeWithUnknownLocation,71 (72 TakeWeightCredit,73 AllowTopLevelPaidExecutionFrom<Everything>,74 75 AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,76 77 AllowKnownQueryResponses<PolkadotXcm>,78 79 AllowSubscriptionsFrom<ParentOrSiblings>,80 ),81>;8283pub fn get_allowed_locations() -> Vec<MultiLocation> {84 vec![85 86 MultiLocation { parents: 0, interior: Here },87 88 MultiLocation { parents: 1, interior: Here },89 90 MultiLocation { parents: 1, interior: X1(Parachain(2000)) },91 92 MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },93 ]94}9596pub struct DenyThenTry<Deny, Allow>(PhantomData<Deny>, PhantomData<Allow>)97 where98 Deny: ShouldExecute,99 Allow: ShouldExecute;100101impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>102 where103 Deny: ShouldExecute,104 Allow: ShouldExecute,105{106 fn should_execute<Call>(107 origin: &MultiLocation,108 message: &mut Xcm<Call>,109 max_weight: Weight,110 weight_credit: &mut Weight,111 ) -> Result<(), ()> {112 Deny::should_execute(origin, message, max_weight, weight_credit)?;113 Allow::should_execute(origin, message, max_weight, weight_credit)114 }115}116117118pub struct DenyExchangeWithUnknownLocation;119impl ShouldExecute for DenyExchangeWithUnknownLocation {120 fn should_execute<Call>(121 origin: &MultiLocation,122 message: &mut Xcm<Call>,123 _max_weight: Weight,124 _weight_credit: &mut Weight,125 ) -> Result<(), ()> {126127 128 let mut allowed = get_allowed_locations().contains(origin);129130 message.0.iter().for_each(|inst| {131 match inst {132 DepositReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }133 TransferReserveAsset { dest: dst, .. } => { allowed |= get_allowed_locations().contains(dst); }134 _ => {}135 }136 });137138 if allowed {139 return Ok(());140 }141142 log::warn!(143 target: "xcm::barrier",144 "Unexpected deposit or transfer location"145 );146 147 Err(())148 }149}150151152match_types! {153 pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {154 MultiLocation { parents: 1, interior: Here } |155 MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) }156 };157 pub type ParentOrSiblings: impl Contains<MultiLocation> = {158 MultiLocation { parents: 1, interior: Here } |159 MultiLocation { parents: 1, interior: X1(_) }160 };161}162163pub fn get_all_module_accounts() -> Vec<AccountId> {164 vec![TreasuryModuleId::get().into_account_truncating()]165}166167pub struct DustRemovalWhitelist;168impl Contains<AccountId> for DustRemovalWhitelist {169 fn contains(a: &AccountId) -> bool {170 get_all_module_accounts().contains(a)171 }172}173174parameter_type_with_key! {175 pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {176 match currency_id {177 CurrencyId::NativeAssetId(symbol) => match symbol {178 NativeCurrency::Here => 0,179 NativeCurrency::Parent=> 0,180 },181 _ => 100_000182 }183 };184}185186impl orml_tokens::Config for Runtime {187 type Event = Event;188 type Balance = Balance;189 type Amount = Amount;190 type CurrencyId = CurrencyId;191 type WeightInfo = ();192 type ExistentialDeposits = ExistentialDeposits;193 type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;194 type MaxLocks = MaxLocks;195 type MaxReserves = MaxReserves;196 197 type DustRemovalWhitelist = DustRemovalWhitelist;198 199 type ReserveIdentifier = ();200 type OnNewTokenAccount = ();201 type OnKilledTokenAccount = ();202}203204205parameter_types! {206 pub const BaseXcmWeight: Weight = 100_000_000; 207 pub const MaxAssetsForTransfer: usize = 2;208}209210parameter_type_with_key! {211 pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {212 Some(100_000_000)213 };214}215216217pub struct AccountIdToMultiLocation;218impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {219 fn convert(account: AccountId) -> MultiLocation {220 X1(AccountId32 {221 network: NetworkId::Any,222 id: account.into(),223 })224 .into()225 }226}