--- a/runtime/common/config/orml.rs +++ b/runtime/common/config/orml.rs @@ -14,19 +14,87 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -use frame_support::parameter_types; +use frame_support::{ + parameter_types, + traits::{Contains, Everything}, + weights::Weight, +}; use frame_system::EnsureSigned; -use crate::{Runtime, Event, RelayChainBlockNumberProvider}; +use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key}; +use sp_runtime::traits::Convert; +use xcm::v1::{Junction::*, Junctions::*, MultiLocation, NetworkId}; +use xcm_builder::LocationInverter; +use xcm_executor::XcmExecutor; +use sp_std::{vec, vec::Vec}; +use pallet_foreing_assets::{CurrencyId, NativeCurrency}; +use crate::{ + Runtime, Event, RelayChainBlockNumberProvider, + runtime_common::config::{ + xcm::{ + SelfLocation, Weigher, XcmConfig, Ancestry, + xcm_assets::{CurrencyIdConvert}, + }, + pallets::TreasuryAccountId, + substrate::{MaxLocks, MaxReserves}, + }, +}; + use up_common::{ types::{AccountId, Balance}, constants::*, }; +// Signed version of balance +pub type Amount = i128; + parameter_types! { pub const MinVestedTransfer: Balance = 10 * UNIQUE; pub const MaxVestingSchedules: u32 = 28; + + pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this + pub const MaxAssetsForTransfer: usize = 2; +} + +parameter_type_with_key! { + pub ParachainMinFee: |_location: MultiLocation| -> Option { + Some(100_000_000_000) + }; +} + +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 fn get_all_module_accounts() -> Vec { + vec![TreasuryAccountId::get()] } +pub struct DustRemovalWhitelist; +impl Contains for DustRemovalWhitelist { + fn contains(a: &AccountId) -> bool { + get_all_module_accounts().contains(a) + } +} + +pub struct AccountIdToMultiLocation; +impl Convert for AccountIdToMultiLocation { + fn convert(account: AccountId) -> MultiLocation { + X1(AccountId32 { + network: NetworkId::Any, + id: account.into(), + }) + .into() + } +} + impl orml_vesting::Config for Runtime { type Event = Event; type Currency = pallet_balances::Pallet; @@ -36,3 +104,38 @@ type MaxVestingSchedules = MaxVestingSchedules; type BlockNumberProvider = RelayChainBlockNumberProvider; } + +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; + 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>; + type Weigher = Weigher; + type BaseXcmWeight = BaseXcmWeight; + type LocationInverter = LocationInverter; + type MaxAssetsForTransfer = MaxAssetsForTransfer; + type MinXcmFee = ParachainMinFee; + type MultiLocationsFilter = Everything; + type ReserveProvider = AbsoluteReserveProvider; +} --- 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> for CurrencyIdConvert { + fn convert(id: AssetIds) -> Option { + 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::::get_multi_location(foreign_asset_id) + } + } + } +} + +impl Convert> for CurrencyIdConvert { + fn convert(location: MultiLocation) -> Option { + 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::::get_currency_id(location.clone()) + { + return Some(currency_id); + } + + None + } +} --- 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 . -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, ); - -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(origin: &MultiLocation, message: &mut Xcm) -> Result<(), ()>; @@ -169,6 +172,40 @@ } } +// Allow xcm exchange only with locations in list +pub struct DenyExchangeWithUnknownLocation(PhantomData); +impl>> TryPass for DenyExchangeWithUnknownLocation { + fn try_pass(origin: &MultiLocation, message: &mut Xcm) -> 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; + pub struct XcmConfig(PhantomData); impl Config for XcmConfig where @@ -183,7 +220,7 @@ type IsTeleporter = (); // Teleportation is disabled type LocationInverter = LocationInverter; type Barrier = Barrier; - type Weigher = FixedWeightBounds; + type Weigher = Weigher; type Trader = Trader; type ResponseHandler = (); // Don't handle responses for now. type SubscriptionService = PolkadotXcm; --- 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> for CurrencyIdConvert { + fn convert(id: AssetIds) -> Option { + match id { + AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new( + 1, + X1(Parachain(ParachainInfo::get().into())), + )), + _ => None, + } + } +} --- 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 . 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 = { @@ -83,123 +61,3 @@ AllowAllDebug, ), >; - -impl Convert> for CurrencyIdConvert { - fn convert(location: MultiLocation) -> Option { - 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::::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; - 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>; - type Weigher = FixedWeightBounds; - type BaseXcmWeight = BaseXcmWeight; - type LocationInverter = LocationInverter; - 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 for DustRemovalWhitelist { - fn contains(a: &AccountId) -> bool { - get_all_module_accounts().contains(a) - } -} - -pub struct CurrencyIdConvert; -impl Convert> for CurrencyIdConvert { - fn convert(id: AssetIds) -> Option { - 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::::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 { - Some(100_000_000_000) - }; -} - -pub fn get_all_module_accounts() -> Vec { - vec![TreasuryModuleId::get().into_account_truncating()] -} -pub struct AccountIdToMultiLocation; -impl Convert for AccountIdToMultiLocation { - fn convert(account: AccountId) -> MultiLocation { - X1(AccountId32 { - network: NetworkId::Any, - id: account.into(), - }) - .into() - } -} --- 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 . 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 = { @@ -54,22 +41,8 @@ }; } -pub type Barrier = DenyThenTry< - (DenyTransact, DenyExchangeWithUnknownLocation), - ( - TakeWeightCredit, - AllowTopLevelPaidExecutionFrom, - // Parent and its exec plurality get free execution - AllowUnpaidExecutionFrom, - // Expected responses are OK. - AllowKnownQueryResponses, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), ->; - -pub fn get_allowed_locations() -> Vec { - vec![ +parameter_types! { + pub QuartzAllowedLocations: Vec = 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(origin: &MultiLocation, message: &mut Xcm) -> 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; - 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>; - type Weigher = FixedWeightBounds; - type BaseXcmWeight = BaseXcmWeight; - type LocationInverter = LocationInverter; - 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 for DustRemovalWhitelist { - fn contains(a: &AccountId) -> bool { - get_all_module_accounts().contains(a) - } -} - -pub struct CurrencyIdConvert; -impl Convert> for CurrencyIdConvert { - fn convert(id: AssetIds) -> Option { - 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 { - Some(100_000_000) - }; -} - -pub fn get_all_module_accounts() -> Vec { - vec![TreasuryModuleId::get().into_account_truncating()] -} - -pub struct AccountIdToMultiLocation; -impl Convert for AccountIdToMultiLocation { - fn convert(account: AccountId) -> MultiLocation { - X1(AccountId32 { - network: NetworkId::Any, - id: account.into(), - }) - .into() - } -} +pub type Barrier = DenyThenTry< + ( + DenyTransact, + DenyExchangeWithUnknownLocation, + ), + ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom, + // Parent and its exec plurality get free execution + AllowUnpaidExecutionFrom, + // Expected responses are OK. + AllowKnownQueryResponses, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), +>; --- 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 . 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 = { @@ -54,22 +41,8 @@ }; } -pub type Barrier = DenyThenTry< - (DenyTransact, DenyExchangeWithUnknownLocation), - ( - TakeWeightCredit, - AllowTopLevelPaidExecutionFrom, - // Parent and its exec plurality get free execution - AllowUnpaidExecutionFrom, - // Expected responses are OK. - AllowKnownQueryResponses, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), ->; - -pub fn get_allowed_locations() -> Vec { - vec![ +parameter_types! { + pub UniqueAllowedLocations: Vec = 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(origin: &MultiLocation, message: &mut Xcm) -> 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; - 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>; - type Weigher = FixedWeightBounds; - type BaseXcmWeight = BaseXcmWeight; - type LocationInverter = LocationInverter; - 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 for DustRemovalWhitelist { - fn contains(a: &AccountId) -> bool { - get_all_module_accounts().contains(a) - } -} - -pub struct CurrencyIdConvert; -impl Convert> for CurrencyIdConvert { - fn convert(id: AssetIds) -> Option { - 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 { - Some(100_000_000) - }; -} - -pub fn get_all_module_accounts() -> Vec { - vec![TreasuryModuleId::get().into_account_truncating()] -} - -pub struct AccountIdToMultiLocation; -impl Convert for AccountIdToMultiLocation { - fn convert(account: AccountId) -> MultiLocation { - X1(AccountId32 { - network: NetworkId::Any, - id: account.into(), - }) - .into() - } -} +pub type Barrier = DenyThenTry< + ( + DenyTransact, + DenyExchangeWithUnknownLocation, + ), + ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom, + // Parent and its exec plurality get free execution + AllowUnpaidExecutionFrom, + // Expected responses are OK. + AllowKnownQueryResponses, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), +>;