difftreelog
Buildable Opal, Quartz and Unique runtimes.
in: master
4 files changed
runtime/common/construct_runtime/mod.rsdiffbeforeafterboth--- a/runtime/common/construct_runtime/mod.rs
+++ b/runtime/common/construct_runtime/mod.rs
@@ -42,6 +42,7 @@
Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>} = 34,
Sudo: pallet_sudo::{Pallet, Call, Storage, Config<T>, Event<T>} = 35,
Vesting: orml_vesting::{Pallet, Storage, Call, Event<T>, Config<T>} = 37,
+ #[runtimes(opal)]
XTokens: orml_xtokens = 38,
Tokens: orml_tokens = 39,
// Vesting: pallet_vesting::{Pallet, Call, Config<T>, Storage, Event<T>} = 37,
runtime/quartz/src/xcm_config.rsdiffbeforeafterboth32 v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},32 v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},33};33};34use xcm_builder::{34use xcm_builder::{35 AllowKnownQueryResponses, AllowSubscriptionsFrom,35 AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,36 AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,36 EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser,37 EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser,37 ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,38 ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,47 constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},48 constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},48 types::{AccountId, Balance},49 types::{AccountId, Balance},49};50};5051use pallet_foreing_assets::{52 AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,53 UsingAnyCurrencyComponents, TryAsForeing, ForeignAssetId,54};51use crate::{55use crate::{52 Balances, Call, DmpQueue, Event, Origin, ParachainInfo,56 Balances, Call, DmpQueue, Event, Origin, ParachainInfo,53 ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,57 ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,56use crate::runtime_common::config::pallets::TreasuryAccountId;60use crate::runtime_common::config::pallets::TreasuryAccountId;57use crate::runtime_common::config::xcm::*;61use crate::runtime_common::config::xcm::*;58use crate::*;62use crate::*;63use xcm::opaque::latest::prelude::{ DepositReserveAsset, DepositAsset, TransferAsset, TransferReserveAsset };596460// Signed version of balance65// Signed version of balance61pub type Amount = i128;66pub type Amount = i128;94 }99 }95}100}101102pub fn get_allowed_locations() -> Vec<MultiLocation> {103 vec![104 // Self location105 MultiLocation { parents: 0, interior: Here },106 // Parent location107 MultiLocation { parents: 1, interior: Here },108 // Karura/Acala location109 MultiLocation { parents: 1, interior: X1(Parachain(2000)) },110 // Moonriver location111 MultiLocation { parents: 1, interior: X1(Parachain(2023)) },112 // Self parachain address113 MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },114 ]115}116117// Allow xcm exchange only with locations in list118pub 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 // Check if deposit or transfer belongs to allowed parachains128 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 // Deny147 Err(())148 }149}9615097pub type Barrier = DenyThenTry<151pub type Barrier = DenyThenTry<98 DenyExchangeWithUnknownLocation,152 DenyExchangeWithUnknownLocation,108 ),162 ),109>;163>;164165impl orml_tokens::Config for Runtime {166 type Event = Event;167 type Balance = Balance;168 type Amount = Amount;169 type CurrencyId = CurrencyId;170 type WeightInfo = ();171 type ExistentialDeposits = ExistentialDeposits;172 type OnDust = orml_tokens::TransferDust<Runtime, TreasuryAccountId>;173 type MaxLocks = MaxLocks;174 type MaxReserves = MaxReserves;175 // TODO: Add all module accounts176 type DustRemovalWhitelist = DustRemovalWhitelist;177 /// The id type for named reserves.178 type ReserveIdentifier = ();179 type OnNewTokenAccount = ();180 type OnKilledTokenAccount = ();181}182183/*184impl orml_xtokens::Config for Runtime {185 type Event = Event;186 type Balance = Balance;187 type CurrencyId = AssetIds;188 type CurrencyIdConvert = CurrencyIdConvert;189 type AccountIdToMultiLocation = AccountIdToMultiLocation;190 type SelfLocation = SelfLocation;191 type XcmExecutor = XcmExecutor<XcmConfig<Self>>;192 type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;193 type BaseXcmWeight = BaseXcmWeight;194 type LocationInverter = LocationInverter<Ancestry>;195 type MaxAssetsForTransfer = MaxAssetsForTransfer;196 type MinXcmFee = ParachainMinFee;197 type MultiLocationsFilter = Everything;198 type ReserveProvider = AbsoluteReserveProvider;199}200 */201202parameter_type_with_key! {203 pub ExistentialDeposits: |currency_id: CurrencyId| -> Balance {204 match currency_id {205 CurrencyId::NativeAssetId(symbol) => match symbol {206 NativeCurrency::Here => 0,207 NativeCurrency::Parent=> 0,208 },209 _ => 100_000210 }211 };212}213214pub struct DustRemovalWhitelist;215impl Contains<AccountId> for DustRemovalWhitelist {216 fn contains(a: &AccountId) -> bool {217 get_all_module_accounts().contains(a)218 }219}220221/*222pub struct CurrencyIdConvert;223impl Convert<AssetIds, Option<MultiLocation>> for CurrencyIdConvert {224 fn convert(id: AssetIds) -> Option<MultiLocation> {225 match id {226 AssetIds::NativeAssetId(NativeCurrency::Here) => Some(MultiLocation::new(227 1,228 X1(Parachain(ParachainInfo::get().into())),229 )),230 AssetIds::NativeAssetId(NativeCurrency::Parent) => Some(MultiLocation::parent()),231 AssetIds::ForeignAssetId(foreign_asset_id) => {232 XcmForeignAssetIdMapping::<Runtime>::get_multi_location(foreign_asset_id)233 }234 }235 }236}237impl Convert<MultiLocation, Option<CurrencyId>> for CurrencyIdConvert {238 fn convert(location: MultiLocation) -> Option<CurrencyId> {239 if location == MultiLocation::here()240 || location == MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())))241 {242 return Some(AssetIds::NativeAssetId(NativeCurrency::Here));243 }244245 if location == MultiLocation::parent() {246 return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));247 }248249 if let Some(currency_id) =250 XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())251 {252 return Some(currency_id);253 }254255 None256 }257}258259 */260261262parameter_types! {263 pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this264 pub const MaxAssetsForTransfer: usize = 2;265}266267parameter_types! {268 pub const RelayLocation: MultiLocation = MultiLocation::parent();269 pub const RelayNetwork: NetworkId = NetworkId::Polkadot;270 pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();271 pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();272 pub SelfLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(ParachainInfo::get().into())));273}274275parameter_type_with_key! {276 pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {277 Some(100_000_000)278 };279}280281pub fn get_all_module_accounts() -> Vec<AccountId> {282 vec![TreasuryModuleId::get().into_account_truncating()]283}284285pub struct AccountIdToMultiLocation;286impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {287 fn convert(account: AccountId) -> MultiLocation {288 X1(AccountId32 {289 network: NetworkId::Any,290 id: account.into(),291 })292 .into()293 }294}295runtime/unique/src/lib.rsdiffbeforeafterboth--- a/runtime/unique/src/lib.rs
+++ b/runtime/unique/src/lib.rs
@@ -35,6 +35,8 @@
#[path = "../../common/mod.rs"]
mod runtime_common;
+pub mod xcm_config;
+
pub use runtime_common::*;
pub const RUNTIME_NAME: &str = "unique";
runtime/unique/src/xcm_config.rsdiffbeforeafterboth--- a/runtime/unique/src/xcm_config.rs
+++ b/runtime/unique/src/xcm_config.rs
@@ -0,0 +1,226 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// 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 cumulus_pallet_xcm;
+use frame_support::{
+ {match_types, parameter_types, weights::Weight},
+ pallet_prelude::Get,
+ traits::{Contains, Everything, fungibles},
+};
+use frame_system::EnsureRoot;
+use orml_traits::{location::AbsoluteReserveProvider, parameter_type_with_key};
+use pallet_xcm::XcmPassthrough;
+use polkadot_parachain::primitives::Sibling;
+use sp_runtime::traits::{AccountIdConversion, CheckedConversion, Convert, Zero};
+use sp_std::{borrow::Borrow, marker::PhantomData, vec, vec::Vec};
+use xcm::{
+ latest::{MultiAsset, Xcm},
+ prelude::{Concrete, Fungible as XcmFungible},
+ v1::{BodyId, Junction::*, Junctions::*, MultiLocation, NetworkId},
+};
+use xcm_builder::{
+ AllowKnownQueryResponses, AllowSubscriptionsFrom,
+ AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,
+ EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, LocationInverter, ParentAsSuperuser,
+ ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,
+ SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,
+ ConvertedConcreteAssetId,
+};
+use xcm_executor::{
+ {Config, XcmExecutor},
+ traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible, ShouldExecute},
+};
+
+use up_common::{
+ constants::{MAXIMUM_BLOCK_WEIGHT, UNIQUE},
+ types::{AccountId, Balance},
+};
+use pallet_foreing_assets::{
+ AssetIds, AssetIdMapping, XcmForeignAssetIdMapping, CurrencyId, NativeCurrency,
+ UsingAnyCurrencyComponents, TryAsForeing, ForeignAssetId,
+};
+use crate::{
+ Balances, Call, DmpQueue, Event, Origin, ParachainInfo,
+ ParachainSystem, PolkadotXcm, Runtime, XcmpQueue,
+};
+use crate::runtime_common::config::substrate::{TreasuryModuleId, MaxLocks, MaxReserves};
+use crate::runtime_common::config::pallets::TreasuryAccountId;
+use crate::runtime_common::config::xcm::*;
+use crate::*;
+use xcm::opaque::latest::prelude::{ DepositReserveAsset, DepositAsset, TransferAsset, TransferReserveAsset };
+
+// Signed version of balance
+pub type Amount = i128;
+
+
+pub type Barrier = DenyThenTry<
+ 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![
+ // Self location
+ MultiLocation { parents: 0, interior: Here },
+ // Parent location
+ MultiLocation { parents: 1, interior: Here },
+ // Karura/Acala location
+ MultiLocation { parents: 1, interior: X1(Parachain(2000)) },
+ // Self parachain address
+ MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },
+ ]
+}
+
+pub struct DenyThenTry<Deny, Allow>(PhantomData<Deny>, PhantomData<Allow>)
+ where
+ Deny: ShouldExecute,
+ Allow: ShouldExecute;
+
+impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>
+ where
+ Deny: ShouldExecute,
+ Allow: ShouldExecute,
+{
+ fn should_execute<Call>(
+ origin: &MultiLocation,
+ message: &mut Xcm<Call>,
+ max_weight: Weight,
+ weight_credit: &mut Weight,
+ ) -> Result<(), ()> {
+ Deny::should_execute(origin, message, max_weight, weight_credit)?;
+ Allow::should_execute(origin, message, max_weight, weight_credit)
+ }
+}
+
+// Allow xcm exchange only with locations in list
+pub struct DenyExchangeWithUnknownLocation;
+impl ShouldExecute for DenyExchangeWithUnknownLocation {
+ fn should_execute<Call>(
+ origin: &MultiLocation,
+ message: &mut Xcm<Call>,
+ _max_weight: Weight,
+ _weight_credit: &mut Weight,
+ ) -> 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(())
+ }
+}
+
+
+match_types! {
+ pub type ParentOrParentsExecutivePlurality: impl Contains<MultiLocation> = {
+ MultiLocation { parents: 1, interior: Here } |
+ MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) }
+ };
+ pub type ParentOrSiblings: impl Contains<MultiLocation> = {
+ MultiLocation { parents: 1, interior: Here } |
+ MultiLocation { parents: 1, interior: X1(_) }
+ };
+}
+
+pub fn get_all_module_accounts() -> Vec<AccountId> {
+ vec![TreasuryModuleId::get().into_account_truncating()]
+}
+
+pub struct DustRemovalWhitelist;
+impl Contains<AccountId> for DustRemovalWhitelist {
+ fn contains(a: &AccountId) -> bool {
+ get_all_module_accounts().contains(a)
+ }
+}
+
+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
+ }
+ };
+}
+
+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 = ();
+}
+
+
+parameter_types! {
+ pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this
+ pub const MaxAssetsForTransfer: usize = 2;
+}
+
+parameter_type_with_key! {
+ pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
+ Some(100_000_000)
+ };
+}
+
+
+pub struct AccountIdToMultiLocation;
+impl Convert<AccountId, MultiLocation> for AccountIdToMultiLocation {
+ fn convert(account: AccountId) -> MultiLocation {
+ X1(AccountId32 {
+ network: NetworkId::Any,
+ id: account.into(),
+ })
+ .into()
+ }
+}
\ No newline at end of file