difftreelog
refactor move common xcm parts to common
in: master
7 files changed
runtime/common/config/orml.rsdiffbeforeafterboth14// You should have received a copy of the GNU General Public License14// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.161617use frame_support::parameter_types;17use frame_support::{18 parameter_types,19 traits::{Contains, Everything},20 weights::Weight,21};18use frame_system::EnsureSigned;22use frame_system::EnsureSigned;23use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};24use sp_runtime::traits::Convert;25use xcm::v1::{Junction::*, Junctions::*, MultiLocation, NetworkId};26use xcm_builder::LocationInverter;27use xcm_executor::XcmExecutor;28use sp_std::{vec, vec::Vec};29use pallet_foreing_assets::{CurrencyId, NativeCurrency};19use crate::{Runtime, Event, RelayChainBlockNumberProvider};30use crate::{31 Runtime, Event, RelayChainBlockNumberProvider,32 runtime_common::config::{33 xcm::{34 SelfLocation, Weigher, XcmConfig, Ancestry,35 xcm_assets::{CurrencyIdConvert},36 },37 pallets::TreasuryAccountId,38 substrate::{MaxLocks, MaxReserves},39 },40};4120use up_common::{42use up_common::{21 types::{AccountId, Balance},43 types::{AccountId, Balance},22 constants::*,44 constants::*,23};45};4647// Signed version of balance48pub type Amount = i128;244925parameter_types! {50parameter_types! {26 pub const MinVestedTransfer: Balance = 10 * UNIQUE;51 pub const MinVestedTransfer: Balance = 10 * UNIQUE;27 pub const MaxVestingSchedules: u32 = 28;52 pub const MaxVestingSchedules: u32 = 28;5354 pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this55 pub const MaxAssetsForTransfer: usize = 2;28}56}5758parameter_type_with_key! {59 pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {60 Some(100_000_000_000)61 };62}6364parameter_type_with_key! {65 pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {66 match currency_id {67 CurrencyId::NativeAssetId(symbol) => match symbol {68 NativeCurrency::Here => 0,69 NativeCurrency::Parent=> 0,70 },71 _ => 100_00072 }73 };74}7576pub fn get_all_module_accounts() -> Vec<AccountId> {77 vec![TreasuryAccountId::get()]78}7980pub struct DustRemovalWhitelist;81impl Contains<AccountId> for DustRemovalWhitelist {82 fn contains(a: &AccountId) -> bool {83 get_all_module_accounts().contains(a)84 }85}8687pub struct AccountIdToMultiLocation;88impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {89 fn convert(account: AccountId) -> MultiLocation {90 X1(AccountId32 {91 network: NetworkId::Any,92 id: account.into(),93 })94 .into()95 }96}299730impl orml_vesting::Config for Runtime {98impl orml_vesting::Config for Runtime {31 type Event = Event;99 type Event = Event;37 type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;105 type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;38}106}107108impl orml_tokens::Config for Runtime {109 type Event = Event;110 type Balance = Balance;111 type Amount = Amount;112 type CurrencyId = CurrencyId;113 type WeightInfo = ();114 type ExistentialDeposits = ExistentialDeposits;115 type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;116 type MaxLocks = MaxLocks;117 type MaxReserves = MaxReserves;118 // TODO: Add all module accounts119 type DustRemovalWhitelist = DustRemovalWhitelist;120 /// The id type for named reserves.121 type ReserveIdentifier = ();122 type OnNewTokenAccount = ();123 type OnKilledTokenAccount = ();124}125126impl orml_xtokens::Config for Runtime {127 type Event = Event;128 type Balance = Balance;129 type CurrencyId = CurrencyId;130 type CurrencyIdConvert = CurrencyIdConvert;131 type AccountIdToMultiLocation = AccountIdToMultiLocation;132 type SelfLocation = SelfLocation;133 type XcmExecutor = XcmExecutor<XcmConfig<Self>>;134 type Weigher = Weigher;135 type BaseXcmWeight = BaseXcmWeight;136 type LocationInverter = LocationInverter<Ancestry>;137 type MaxAssetsForTransfer = MaxAssetsForTransfer;138 type MinXcmFee = ParachainMinFee;139 type MultiLocationsFilter = Everything;140 type ReserveProvider = AbsoluteReserveProvider;141}39142runtime/common/config/xcm/foreignassets.rsdiffbeforeafterboth--- a/runtime/common/config/xcm/foreignassets.rs
+++ b/runtime/common/config/xcm/foreignassets.rs
@@ -18,14 +18,14 @@
traits::{Contains, Get, fungibles},
parameter_types,
};
-use sp_runtime::traits::Zero;
+use sp_runtime::traits::{Zero, Convert};
use xcm::v1::{Junction::*, MultiLocation, Junctions::*};
use xcm::latest::MultiAsset;
use xcm_builder::{FungiblesAdapter, ConvertedConcreteAssetId};
use xcm_executor::traits::{Convert as ConvertXcm, JustTry, FilterAssetLocation};
use pallet_foreing_assets::{
AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, NativeCurrency, FreeForAll, TryAsForeing,
- ForeignAssetId,
+ ForeignAssetId, CurrencyId,
};
use sp_std::{borrow::Borrow, marker::PhantomData};
use crate::{Runtime, Balances, ParachainInfo, PolkadotXcm, ForeingAssets};
@@ -158,3 +158,41 @@
Balances,
(),
>;
+
+pub struct CurrencyIdConvert;
+impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
+ fn convert(id: AssetIds) -> Option<MultiLocation> {
+ match id {
+ AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
+ 1,
+ X1(Parachain(ParachainInfo::get().into())),
+ )),
+ AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),
+ AssetIds::ForeignAssetId(foreign_asset_id) => {
+ XcmForeignAssetIdMapping::<Runtime>::get_multi_location(foreign_asset_id)
+ }
+ }
+ }
+}
+
+impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {
+ fn convert(location: MultiLocation) -> Option<CurrencyId> {
+ if location == MultiLocation::here()
+ || location == MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())))
+ {
+ return Some(AssetIds::NativeAssetId(NativeCurrency::Here));
+ }
+
+ if location == MultiLocation::parent() {
+ return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));
+ }
+
+ if let Some(currency_id) =
+ XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())
+ {
+ return Some(currency_id);
+ }
+
+ None
+ }
+}
runtime/common/config/xcm/mod.rsdiffbeforeafterboth--- a/runtime/common/config/xcm/mod.rs
+++ b/runtime/common/config/xcm/mod.rs
@@ -14,19 +14,23 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
-use frame_support::{traits::Everything, weights::Weight, parameter_types};
+use frame_support::{
+ traits::{Everything, Get},
+ weights::Weight,
+ parameter_types,
+};
use frame_system::EnsureRoot;
use pallet_xcm::XcmPassthrough;
use polkadot_parachain::primitives::Sibling;
use xcm::v1::{Junction::*, MultiLocation, NetworkId};
-use xcm::latest::{Instruction, Xcm};
+use xcm::latest::prelude::*;
use xcm_builder::{
AccountId32Aliases, EnsureXcmOrigin, FixedWeightBounds, LocationInverter, ParentAsSuperuser,
RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,
SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, ParentIsPreset,
};
use xcm_executor::{Config, XcmExecutor, traits::ShouldExecute};
-use sp_std::marker::PhantomData;
+use sp_std::{marker::PhantomData, vec::Vec};
use crate::{
Runtime, Call, Event, Origin, ParachainInfo, ParachainSystem, PolkadotXcm, XcmpQueue,
xcm_config::Barrier,
@@ -35,16 +39,16 @@
use up_common::types::AccountId;
#[cfg(feature = "foreign-assets")]
-mod foreignassets;
+pub mod foreignassets;
#[cfg(not(feature = "foreign-assets"))]
-mod nativeassets;
+pub mod nativeassets;
#[cfg(feature = "foreign-assets")]
-use foreignassets as xcm_assets;
+pub use foreignassets as xcm_assets;
#[cfg(not(feature = "foreign-assets"))]
-use nativeassets as xcm_assets;
+pub use nativeassets as xcm_assets;
use xcm_assets::{AssetTransactors, IsReserve, Trader};
@@ -53,6 +57,11 @@
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())));
+
+ // One XCM operation is 1_000_000 weight - almost certainly a conservative estimate.
+ pub UnitWeightCost: Weight = 1_000_000;
+ pub const MaxInstructions: u32 = 100;
}
/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used
@@ -102,12 +111,6 @@
// Xcm origins can be represented natively under the Xcm pallet's Xcm origin.
XcmPassthrough<Origin>,
);
-
-parameter_types! {
- // One XCM operation is 1_000_000 weight - almost certainly a conservative estimate.
- pub UnitWeightCost: Weight = 1_000_000;
- pub const MaxInstructions: u32 = 100;
-}
pub trait TryPass {
fn try_pass<Call>(origin: &MultiLocation, message: &mut Xcm<Call>) -> Result<(), ()>;
@@ -169,6 +172,40 @@
}
}
+// Allow xcm exchange only with locations in list
+pub struct DenyExchangeWithUnknownLocation<T>(PhantomData<T>);
+impl<T: Get<Vec<MultiLocation>>> TryPass for DenyExchangeWithUnknownLocation<T> {
+ fn try_pass<Call>(origin: &MultiLocation, message: &mut Xcm<Call>) -> Result<(), ()> {
+ let allowed_locations = T::get();
+
+ // Check if deposit or transfer belongs to allowed parachains
+ let mut allowed = allowed_locations.contains(origin);
+
+ message.0.iter().for_each(|inst| match inst {
+ DepositReserveAsset { dest: dst, .. } => {
+ allowed |= allowed_locations.contains(dst);
+ }
+ TransferReserveAsset { dest: dst, .. } => {
+ allowed |= allowed_locations.contains(dst);
+ }
+ _ => {}
+ });
+
+ if allowed {
+ return Ok(());
+ }
+
+ log::warn!(
+ target: "xcm::barrier",
+ "Unexpected deposit or transfer location"
+ );
+ // Deny
+ Err(())
+ }
+}
+
+pub type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
+
pub struct XcmConfig<T>(PhantomData<T>);
impl<T> Config for XcmConfig<T>
where
@@ -183,7 +220,7 @@
type IsTeleporter = (); // Teleportation is disabled
type LocationInverter = LocationInverter<Ancestry>;
type Barrier = Barrier;
- type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
+ type Weigher = Weigher;
type Trader = Trader<T>;
type ResponseHandler = (); // Don't handle responses for now.
type SubscriptionService = PolkadotXcm;
runtime/common/config/xcm/nativeassets.rsdiffbeforeafterboth--- a/runtime/common/config/xcm/nativeassets.rs
+++ b/runtime/common/config/xcm/nativeassets.rs
@@ -18,7 +18,7 @@
traits::{tokens::currency::Currency as CurrencyT, OnUnbalanced as OnUnbalancedT, Get},
weights::{Weight, WeightToFeePolynomial},
};
-use sp_runtime::traits::{CheckedConversion, Zero};
+use sp_runtime::traits::{CheckedConversion, Zero, Convert};
use xcm::v1::{Junction::*, MultiLocation, Junctions::*};
use xcm::latest::{
AssetId::{Concrete},
@@ -30,6 +30,7 @@
Assets,
traits::{MatchesFungible, WeightTrader},
};
+use pallet_foreing_assets::{AssetIds, NativeCurrency};
use sp_std::marker::PhantomData;
use crate::{Balances, ParachainInfo};
use super::{LocationToAccountId, RelayLocation};
@@ -127,3 +128,16 @@
Balances,
(),
>;
+
+pub struct CurrencyIdConvert;
+impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
+ fn convert(id: AssetIds) -> Option<MultiLocation> {
+ match id {
+ AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
+ 1,
+ X1(Parachain(ParachainInfo::get().into())),
+ )),
+ _ => None,
+ }
+ }
+}
runtime/opal/src/xcm_config.rsdiffbeforeafterboth--- a/runtime/opal/src/xcm_config.rs
+++ b/runtime/opal/src/xcm_config.rs
@@ -15,39 +15,17 @@
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
use frame_support::{
- {match_types, parameter_types, weights::Weight},
- pallet_prelude::Get,
- traits::{Contains, Everything},
+ {match_types, weights::Weight},
+ traits::Everything,
};
-use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
-use sp_runtime::traits::{AccountIdConversion, Convert};
-use sp_std::{vec, vec::Vec};
use xcm::{
latest::Xcm,
- v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
-};
-use xcm_builder::{
- AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, FixedWeightBounds, LocationInverter,
- TakeWeightCredit,
-};
-use xcm_executor::{XcmExecutor, traits::ShouldExecute};
-
-use up_common::types::{AccountId, Balance};
-use crate::{
- Call, Event, ParachainInfo, Runtime,
- runtime_common::config::{
- substrate::{TreasuryModuleId, MaxLocks, MaxReserves},
- pallets::TreasuryAccountId,
- xcm::*,
- },
+ v1::{BodyId, Junction::*, Junctions::*, MultiLocation},
};
-
-use pallet_foreing_assets::{
- AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,
-};
+use xcm_builder::{AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, TakeWeightCredit};
+use xcm_executor::traits::ShouldExecute;
-// Signed version of balance
-pub type Amount = i128;
+use crate::runtime_common::config::xcm::{DenyThenTry, DenyTransact};
match_types! {
pub type ParentOrParentsUnitPlurality: impl Contains<MultiLocation> = {
@@ -83,123 +61,3 @@
AllowAllDebug,
),
>;
-
-impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {
- fn convert(location: MultiLocation) -> Option<CurrencyId> {
- if location == MultiLocation::here()
- || location == MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())))
- {
- return Some(AssetIds::NativeAssetId(NativeCurrency::Here));
- }
-
- if location == MultiLocation::parent() {
- return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));
- }
-
- if let Some(currency_id) =
- XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())
- {
- return Some(currency_id);
- }
-
- None
- }
-}
-
-impl orml_tokens::Config for Runtime {
- type Event = Event;
- type Balance = Balance;
- type Amount = Amount;
- type CurrencyId = CurrencyId;
- type WeightInfo = ();
- type ExistentialDeposits = ExistentialDeposits;
- type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;
- type MaxLocks = MaxLocks;
- type MaxReserves = MaxReserves;
- // TODO: Add all module accounts
- type DustRemovalWhitelist = DustRemovalWhitelist;
- /// The id type for named reserves.
- type ReserveIdentifier = ();
- type OnNewTokenAccount = ();
- type OnKilledTokenAccount = ();
-}
-
-impl orml_xtokens::Config for Runtime {
- type Event = Event;
- type Balance = Balance;
- type CurrencyId = CurrencyId;
- type CurrencyIdConvert = CurrencyIdConvert;
- type AccountIdToMultiLocation = AccountIdToMultiLocation;
- type SelfLocation = SelfLocation;
- type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
- type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
- type BaseXcmWeight = BaseXcmWeight;
- type LocationInverter = LocationInverter<Ancestry>;
- type MaxAssetsForTransfer = MaxAssetsForTransfer;
- type MinXcmFee = ParachainMinFee;
- type MultiLocationsFilter = Everything;
- type ReserveProvider = AbsoluteReserveProvider;
-}
-
-parameter_type_with_key! {
- pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
- match currency_id {
- CurrencyId::NativeAssetId(symbol) => match symbol {
- NativeCurrency::Here => 0,
- NativeCurrency::Parent=> 0,
- },
- _ => 100_000
- }
- };
-}
-
-pub struct DustRemovalWhitelist;
-impl Contains<AccountId> for DustRemovalWhitelist {
- fn contains(a: &AccountId) -> bool {
- get_all_module_accounts().contains(a)
- }
-}
-
-pub struct CurrencyIdConvert;
-impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
- fn convert(id: AssetIds) -> Option<MultiLocation> {
- match id {
- AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
- 1,
- X1(Parachain(ParachainInfo::get().into())),
- )),
- AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),
- AssetIds::ForeignAssetId(foreign_asset_id) => {
- XcmForeignAssetIdMapping::<Runtime>::get_multi_location(foreign_asset_id)
- }
- }
- }
-}
-
-parameter_types! {
- pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this
- pub const MaxAssetsForTransfer: usize = 2;
-
- pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
- pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
-}
-
-parameter_type_with_key! {
- pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
- Some(100_000_000_000)
- };
-}
-
-pub fn get_all_module_accounts() -> Vec<AccountId> {
- vec![TreasuryModuleId::get().into_account_truncating()]
-}
-pub struct AccountIdToMultiLocation;
-impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {
- fn convert(account: AccountId) -> MultiLocation {
- X1(AccountId32 {
- network: NetworkId::Any,
- id: account.into(),
- })
- .into()
- }
-}
runtime/quartz/src/xcm_config.rsdiffbeforeafterboth--- a/runtime/quartz/src/xcm_config.rs
+++ b/runtime/quartz/src/xcm_config.rs
@@ -15,33 +15,20 @@
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
use frame_support::{
- {match_types, parameter_types, weights::Weight},
- pallet_prelude::Get,
- traits::{Contains, Everything},
+ match_types, parameter_types,
+ traits::{Everything, Get},
};
-use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
-use sp_runtime::traits::{AccountIdConversion, Convert};
use sp_std::{vec, vec::Vec};
-use xcm::{
- latest::Xcm,
- v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
-};
+use xcm::v1::{BodyId, Junction::*, Junctions::*, MultiLocation};
use xcm_builder::{
AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom,
- AllowUnpaidExecutionFrom, FixedWeightBounds, LocationInverter, TakeWeightCredit,
+ AllowUnpaidExecutionFrom, TakeWeightCredit,
};
-use xcm_executor::XcmExecutor;
-use up_common::types::{AccountId, Balance};
-use pallet_foreing_assets::{AssetIds, CurrencyId, NativeCurrency};
-use crate::{Call, Event, ParachainInfo, PolkadotXcm, Runtime};
-use crate::runtime_common::config::substrate::{TreasuryModuleId, MaxLocks, MaxReserves};
-use crate::runtime_common::config::pallets::TreasuryAccountId;
-use crate::runtime_common::config::xcm::*;
-use xcm::opaque::latest::prelude::{DepositReserveAsset, TransferReserveAsset};
-
-// Signed version of balance
-pub type Amount = i128;
+use crate::{
+ ParachainInfo, PolkadotXcm,
+ runtime_common::config::xcm::{DenyThenTry, DenyTransact, DenyExchangeWithUnknownLocation},
+};
match_types! {
pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {
@@ -54,22 +41,8 @@
};
}
-pub type Barrier = DenyThenTry<
- (DenyTransact, DenyExchangeWithUnknownLocation),
- (
- TakeWeightCredit,
- AllowTopLevelPaidExecutionFrom<Everything>,
- // Parent and its exec plurality get free execution
- AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,
- // Expected responses are OK.
- AllowKnownQueryResponses<PolkadotXcm>,
- // Subscriptions for version tracking are OK.
- AllowSubscriptionsFrom<ParentOrSiblings>,
- ),
->;
-
-pub fn get_allowed_locations() -> Vec<MultiLocation> {
- vec![
+parameter_types! {
+ pub QuartzAllowedLocations: Vec<MultiLocation> = vec![
// Self location
MultiLocation {
parents: 0,
@@ -95,131 +68,22 @@
parents: 1,
interior: X1(Parachain(ParachainInfo::get().into())),
},
- ]
-}
-
-// Allow xcm exchange only with locations in list
-pub struct DenyExchangeWithUnknownLocation;
-impl TryPass for DenyExchangeWithUnknownLocation {
- fn try_pass<Call>(origin: &MultiLocation, message: &mut Xcm<Call>) -> Result<(), ()> {
- // Check if deposit or transfer belongs to allowed parachains
- let mut allowed = get_allowed_locations().contains(origin);
-
- message.0.iter().for_each(|inst| match inst {
- DepositReserveAsset { dest: dst, .. } => {
- allowed |= get_allowed_locations().contains(dst);
- }
- TransferReserveAsset { dest: dst, .. } => {
- allowed |= get_allowed_locations().contains(dst);
- }
- _ => {}
- });
-
- if allowed {
- return Ok(());
- }
-
- log::warn!(
- target: "xcm::barrier",
- "Unexpected deposit or transfer location"
- );
- // Deny
- Err(())
- }
+ ];
}
-impl orml_tokens::Config for Runtime {
- type Event = Event;
- type Balance = Balance;
- type Amount = Amount;
- type CurrencyId = CurrencyId;
- type WeightInfo = ();
- type ExistentialDeposits = ExistentialDeposits;
- type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;
- type MaxLocks = MaxLocks;
- type MaxReserves = MaxReserves;
- // TODO: Add all module accounts
- type DustRemovalWhitelist = DustRemovalWhitelist;
- /// The id type for named reserves.
- type ReserveIdentifier = ();
- type OnNewTokenAccount = ();
- type OnKilledTokenAccount = ();
-}
-
-impl orml_xtokens::Config for Runtime {
- type Event = Event;
- type Balance = Balance;
- type CurrencyId = CurrencyId;
- type CurrencyIdConvert = CurrencyIdConvert;
- type AccountIdToMultiLocation = AccountIdToMultiLocation;
- type SelfLocation = SelfLocation;
- type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
- type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
- type BaseXcmWeight = BaseXcmWeight;
- type LocationInverter = LocationInverter<Ancestry>;
- type MaxAssetsForTransfer = MaxAssetsForTransfer;
- type MinXcmFee = ParachainMinFee;
- type MultiLocationsFilter = Everything;
- type ReserveProvider = AbsoluteReserveProvider;
-}
-
-parameter_type_with_key! {
- pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
- match currency_id {
- CurrencyId::NativeAssetId(symbol) => match symbol {
- NativeCurrency::Here => 0,
- NativeCurrency::Parent=> 0,
- },
- _ => 100_000
- }
- };
-}
-
-pub struct DustRemovalWhitelist;
-impl Contains<AccountId> for DustRemovalWhitelist {
- fn contains(a: &AccountId) -> bool {
- get_all_module_accounts().contains(a)
- }
-}
-
-pub struct CurrencyIdConvert;
-impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
- fn convert(id: AssetIds) -> Option<MultiLocation> {
- match id {
- AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
- 1,
- X1(Parachain(ParachainInfo::get().into())),
- )),
- _ => None,
- }
- }
-}
-
-parameter_types! {
- pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this
- pub const MaxAssetsForTransfer: usize = 2;
-
- pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
- pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
-}
-
-parameter_type_with_key! {
- pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
- Some(100_000_000)
- };
-}
-
-pub fn get_all_module_accounts() -> Vec<AccountId> {
- vec![TreasuryModuleId::get().into_account_truncating()]
-}
-
-pub struct AccountIdToMultiLocation;
-impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {
- fn convert(account: AccountId) -> MultiLocation {
- X1(AccountId32 {
- network: NetworkId::Any,
- id: account.into(),
- })
- .into()
- }
-}
+pub type Barrier = DenyThenTry<
+ (
+ DenyTransact,
+ DenyExchangeWithUnknownLocation<QuartzAllowedLocations>,
+ ),
+ (
+ TakeWeightCredit,
+ AllowTopLevelPaidExecutionFrom<Everything>,
+ // Parent and its exec plurality get free execution
+ AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,
+ // Expected responses are OK.
+ AllowKnownQueryResponses<PolkadotXcm>,
+ // Subscriptions for version tracking are OK.
+ AllowSubscriptionsFrom<ParentOrSiblings>,
+ ),
+>;
runtime/unique/src/xcm_config.rsdiffbeforeafterboth--- a/runtime/unique/src/xcm_config.rs
+++ b/runtime/unique/src/xcm_config.rs
@@ -15,33 +15,20 @@
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
use frame_support::{
- {match_types, parameter_types, weights::Weight},
- pallet_prelude::Get,
- traits::{Contains, Everything},
+ match_types, parameter_types,
+ traits::{Everything, Get},
};
-use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
-use sp_runtime::traits::{AccountIdConversion, Convert};
use sp_std::{vec, vec::Vec};
-use xcm::{
- latest::Xcm,
- v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
-};
+use xcm::v1::{BodyId, Junction::*, Junctions::*, MultiLocation};
use xcm_builder::{
AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom,
- AllowUnpaidExecutionFrom, FixedWeightBounds, LocationInverter, TakeWeightCredit,
+ AllowUnpaidExecutionFrom, TakeWeightCredit,
};
-use xcm_executor::XcmExecutor;
-use up_common::types::{AccountId, Balance};
-use pallet_foreing_assets::{AssetIds, CurrencyId, NativeCurrency};
-use crate::{Call, Event, ParachainInfo, PolkadotXcm, Runtime};
-use crate::runtime_common::config::substrate::{TreasuryModuleId, MaxLocks, MaxReserves};
-use crate::runtime_common::config::pallets::TreasuryAccountId;
-use crate::runtime_common::config::xcm::*;
-use xcm::opaque::latest::prelude::{DepositReserveAsset, TransferReserveAsset};
-
-// Signed version of balance
-pub type Amount = i128;
+use crate::{
+ ParachainInfo, PolkadotXcm,
+ runtime_common::config::xcm::{DenyThenTry, DenyTransact, DenyExchangeWithUnknownLocation},
+};
match_types! {
pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {
@@ -54,22 +41,8 @@
};
}
-pub type Barrier = DenyThenTry<
- (DenyTransact, DenyExchangeWithUnknownLocation),
- (
- TakeWeightCredit,
- AllowTopLevelPaidExecutionFrom<Everything>,
- // Parent and its exec plurality get free execution
- AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,
- // Expected responses are OK.
- AllowKnownQueryResponses<PolkadotXcm>,
- // Subscriptions for version tracking are OK.
- AllowSubscriptionsFrom<ParentOrSiblings>,
- ),
->;
-
-pub fn get_allowed_locations() -> Vec<MultiLocation> {
- vec![
+parameter_types! {
+ pub UniqueAllowedLocations: Vec<MultiLocation> = vec![
// Self location
MultiLocation {
parents: 0,
@@ -95,131 +68,22 @@
parents: 1,
interior: X1(Parachain(ParachainInfo::get().into())),
},
- ]
-}
-
-// Allow xcm exchange only with locations in list
-pub struct DenyExchangeWithUnknownLocation;
-impl TryPass for DenyExchangeWithUnknownLocation {
- fn try_pass<Call>(origin: &MultiLocation, message: &mut Xcm<Call>) -> Result<(), ()> {
- // Check if deposit or transfer belongs to allowed parachains
- let mut allowed = get_allowed_locations().contains(origin);
-
- message.0.iter().for_each(|inst| match inst {
- DepositReserveAsset { dest: dst, .. } => {
- allowed |= get_allowed_locations().contains(dst);
- }
- TransferReserveAsset { dest: dst, .. } => {
- allowed |= get_allowed_locations().contains(dst);
- }
- _ => {}
- });
-
- if allowed {
- return Ok(());
- }
-
- log::warn!(
- target: "xcm::barrier",
- "Unexpected deposit or transfer location"
- );
- // Deny
- Err(())
- }
+ ];
}
-impl orml_tokens::Config for Runtime {
- type Event = Event;
- type Balance = Balance;
- type Amount = Amount;
- type CurrencyId = CurrencyId;
- type WeightInfo = ();
- type ExistentialDeposits = ExistentialDeposits;
- type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;
- type MaxLocks = MaxLocks;
- type MaxReserves = MaxReserves;
- // TODO: Add all module accounts
- type DustRemovalWhitelist = DustRemovalWhitelist;
- /// The id type for named reserves.
- type ReserveIdentifier = ();
- type OnNewTokenAccount = ();
- type OnKilledTokenAccount = ();
-}
-
-impl orml_xtokens::Config for Runtime {
- type Event = Event;
- type Balance = Balance;
- type CurrencyId = CurrencyId;
- type CurrencyIdConvert = CurrencyIdConvert;
- type AccountIdToMultiLocation = AccountIdToMultiLocation;
- type SelfLocation = SelfLocation;
- type XcmExecutor = XcmExecutor<XcmConfig<Self>>;
- type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
- type BaseXcmWeight = BaseXcmWeight;
- type LocationInverter = LocationInverter<Ancestry>;
- type MaxAssetsForTransfer = MaxAssetsForTransfer;
- type MinXcmFee = ParachainMinFee;
- type MultiLocationsFilter = Everything;
- type ReserveProvider = AbsoluteReserveProvider;
-}
-
-parameter_type_with_key! {
- pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {
- match currency_id {
- CurrencyId::NativeAssetId(symbol) => match symbol {
- NativeCurrency::Here => 0,
- NativeCurrency::Parent=> 0,
- },
- _ => 100_000
- }
- };
-}
-
-pub struct DustRemovalWhitelist;
-impl Contains<AccountId> for DustRemovalWhitelist {
- fn contains(a: &AccountId) -> bool {
- get_all_module_accounts().contains(a)
- }
-}
-
-pub struct CurrencyIdConvert;
-impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {
- fn convert(id: AssetIds) -> Option<MultiLocation> {
- match id {
- AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(
- 1,
- X1(Parachain(ParachainInfo::get().into())),
- )),
- _ => None,
- }
- }
-}
-
-parameter_types! {
- pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this
- pub const MaxAssetsForTransfer: usize = 2;
-
- pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
- pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));
-}
-
-parameter_type_with_key! {
- pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
- Some(100_000_000)
- };
-}
-
-pub fn get_all_module_accounts() -> Vec<AccountId> {
- vec![TreasuryModuleId::get().into_account_truncating()]
-}
-
-pub struct AccountIdToMultiLocation;
-impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {
- fn convert(account: AccountId) -> MultiLocation {
- X1(AccountId32 {
- network: NetworkId::Any,
- id: account.into(),
- })
- .into()
- }
-}
+pub type Barrier = DenyThenTry<
+ (
+ DenyTransact,
+ DenyExchangeWithUnknownLocation<UniqueAllowedLocations>,
+ ),
+ (
+ TakeWeightCredit,
+ AllowTopLevelPaidExecutionFrom<Everything>,
+ // Parent and its exec plurality get free execution
+ AllowUnpaidExecutionFrom<ParentOrParentsExecutivePlurality>,
+ // Expected responses are OK.
+ AllowKnownQueryResponses<PolkadotXcm>,
+ // Subscriptions for version tracking are OK.
+ AllowSubscriptionsFrom<ParentOrSiblings>,
+ ),
+>;