git.delta.rocks / unique-network / refs/commits / 0b95edb08466

difftreelog

Buildable Opal, Quartz and Unique runtimes.

Ilja Khabarov2022-08-23parent: #ce442c5.patch.diff
in: master

4 files changed

modifiedruntime/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,
modifiedruntime/quartz/src/xcm_config.rsdiffbeforeafterboth
32 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 };
5964
60// Signed version of balance65// Signed version of balance
61pub type Amount = i128;66pub type Amount = i128;
94 }99 }
95}100}
101
102pub fn get_allowed_locations() -> Vec<MultiLocation> {
103 vec![
104 // Self location
105 MultiLocation { parents: 0, interior: Here },
106 // Parent location
107 MultiLocation { parents: 1, interior: Here },
108 // Karura/Acala location
109 MultiLocation { parents: 1, interior: X1(Parachain(2000)) },
110 // Moonriver location
111 MultiLocation { parents: 1, interior: X1(Parachain(2023)) },
112 // Self parachain address
113 MultiLocation { parents: 1, interior: X1(Parachain(ParachainInfo::get().into())) },
114 ]
115}
116
117// Allow xcm exchange only with locations in list
118pub 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<(), ()> {
126
127 // Check if deposit or transfer belongs to allowed parachains
128 let mut allowed = get_allowed_locations().contains(origin);
129
130 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 });
137
138 if allowed {
139 return Ok(());
140 }
141
142 log::warn!(
143 target: "xcm::barrier",
144 "Unexpected deposit or transfer location"
145 );
146 // Deny
147 Err(())
148 }
149}
96150
97pub type Barrier = DenyThenTry<151pub type Barrier = DenyThenTry<
98 DenyExchangeWithUnknownLocation,152 DenyExchangeWithUnknownLocation,
108 ),162 ),
109>;163>;
164
165impl 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 accounts
176 type DustRemovalWhitelist = DustRemovalWhitelist;
177 /// The id type for named reserves.
178 type ReserveIdentifier = ();
179 type OnNewTokenAccount = ();
180 type OnKilledTokenAccount = ();
181}
182
183/*
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 */
201
202parameter_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_000
210 }
211 };
212}
213
214pub struct DustRemovalWhitelist;
215impl Contains<AccountId> for DustRemovalWhitelist {
216 fn contains(a: &AccountId) -> bool {
217 get_all_module_accounts().contains(a)
218 }
219}
220
221/*
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 }
244
245 if location == MultiLocation::parent() {
246 return Some(AssetIds::NativeAssetId(NativeCurrency::Parent));
247 }
248
249 if let Some(currency_id) =
250 XcmForeignAssetIdMapping::<Runtime>::get_currency_id(location.clone())
251 {
252 return Some(currency_id);
253 }
254
255 None
256 }
257}
258
259 */
260
261
262parameter_types! {
263 pub const BaseXcmWeight: Weight = 100_000_000; // TODO: recheck this
264 pub const MaxAssetsForTransfer: usize = 2;
265}
266
267parameter_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}
274
275parameter_type_with_key! {
276 pub ParachainMinFee: |_location: MultiLocation| -> Option<u128> {
277 Some(100_000_000)
278 };
279}
280
281pub fn get_all_module_accounts() -> Vec<AccountId> {
282 vec![TreasuryModuleId::get().into_account_truncating()]
283}
284
285pub 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}
295
modifiedruntime/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";
modifiedruntime/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