From 44d02634621c368e67bc64dfa789455a77fe5b84 Mon Sep 17 00:00:00 2001 From: Daniel Shiposha Date: Mon, 12 Dec 2022 12:13:47 +0000 Subject: [PATCH] feat: add overridable xcm allowed locations --- --- a/Cargo.lock +++ b/Cargo.lock @@ -5934,6 +5934,7 @@ "sp-core", "sp-runtime", "sp-std", + "xcm", ] [[package]] --- a/pallets/configuration/Cargo.toml +++ b/pallets/configuration/Cargo.toml @@ -18,6 +18,7 @@ sp-arithmetic = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } fp-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30-2" } smallvec = "1.6.1" +xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.30" } [features] default = ["std"] --- a/pallets/configuration/src/lib.rs +++ b/pallets/configuration/src/lib.rs @@ -35,16 +35,21 @@ use super::*; use frame_support::{ traits::Get, - pallet_prelude::{StorageValue, ValueQuery, DispatchResult}, + pallet_prelude::{StorageValue, ValueQuery, DispatchResult, OptionQuery}, BoundedVec, }; use frame_system::{pallet_prelude::OriginFor, ensure_root}; + use xcm::v1::MultiLocation; #[pallet::config] pub trait Config: frame_system::Config { #[pallet::constant] type DefaultWeightToFeeCoefficient: Get; + #[pallet::constant] type DefaultMinGasPrice: Get; + + #[pallet::constant] + type MaxOverridedAllowedLocations: Get; } #[pallet::storage] @@ -58,6 +63,12 @@ pub type MinGasPriceOverride = StorageValue; + #[pallet::storage] + pub type XcmAllowedLocationsOverride = StorageValue< + Value = BoundedVec, + QueryKind = OptionQuery, + >; + #[pallet::call] impl Pallet { #[pallet::weight(T::DbWeight::get().writes(1))] @@ -87,6 +98,16 @@ } Ok(()) } + + #[pallet::weight(T::DbWeight::get().writes(1))] + pub fn set_xcm_allowed_locations( + origin: OriginFor, + locations: Option>, + ) -> DispatchResult { + let _sender = ensure_root(origin)?; + >::set(locations); + Ok(()) + } } #[pallet::pallet] --- a/runtime/common/config/pallets/mod.rs +++ b/runtime/common/config/pallets/mod.rs @@ -102,6 +102,7 @@ impl pallet_configuration::Config for Runtime { type DefaultWeightToFeeCoefficient = ConstU32<{ up_common::constants::WEIGHT_TO_FEE_COEFF }>; type DefaultMinGasPrice = ConstU64<{ up_common::constants::MIN_GAS_PRICE }>; + type MaxOverridedAllowedLocations = ConstU32<16>; } impl pallet_maintenance::Config for Runtime { --- a/runtime/common/mod.rs +++ b/runtime/common/mod.rs @@ -21,6 +21,7 @@ pub mod instance; pub mod maintenance; pub mod runtime_apis; +pub mod xcm; #[cfg(feature = "scheduler")] pub mod scheduler; --- /dev/null +++ b/runtime/common/xcm.rs @@ -0,0 +1,36 @@ +// 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 . + +use sp_std::{vec::Vec, marker::PhantomData}; +use xcm::v1::MultiLocation; +use frame_support::traits::Get; + +pub struct OverridableAllowedLocations(PhantomData<(T, L)>) +where + T: pallet_configuration::Config, + L: Get>; + +impl Get> for OverridableAllowedLocations +where + T: pallet_configuration::Config, + L: Get> +{ + fn get() -> Vec { + >::get() + .map(|bounded| bounded.into_inner()) + .unwrap_or_else(|| L::get()) + } +} --- a/runtime/quartz/src/xcm_barrier.rs +++ b/runtime/quartz/src/xcm_barrier.rs @@ -26,8 +26,11 @@ }; use crate::{ - ParachainInfo, PolkadotXcm, - runtime_common::config::xcm::{DenyThenTry, DenyTransact, DenyExchangeWithUnknownLocation}, + Runtime, ParachainInfo, PolkadotXcm, + runtime_common::{ + config::xcm::{DenyThenTry, DenyTransact, DenyExchangeWithUnknownLocation}, + xcm::OverridableAllowedLocations, + } }; match_types! { @@ -38,7 +41,7 @@ } parameter_types! { - pub QuartzAllowedLocations: Vec = vec![ + pub QuartzDefaultAllowedLocations: Vec = vec![ // Self location MultiLocation { parents: 0, @@ -70,7 +73,9 @@ pub type Barrier = DenyThenTry< ( DenyTransact, - DenyExchangeWithUnknownLocation, + DenyExchangeWithUnknownLocation< + OverridableAllowedLocations + >, ), ( TakeWeightCredit, --- a/runtime/unique/src/xcm_barrier.rs +++ b/runtime/unique/src/xcm_barrier.rs @@ -26,8 +26,11 @@ }; use crate::{ - ParachainInfo, PolkadotXcm, - runtime_common::config::xcm::{DenyThenTry, DenyTransact, DenyExchangeWithUnknownLocation}, + Runtime, ParachainInfo, PolkadotXcm, + runtime_common::{ + config::xcm::{DenyThenTry, DenyTransact, DenyExchangeWithUnknownLocation}, + xcm::OverridableAllowedLocations, + } }; match_types! { @@ -38,7 +41,7 @@ } parameter_types! { - pub UniqueAllowedLocations: Vec = vec![ + pub UniqueDefaultAllowedLocations: Vec = vec![ // Self location MultiLocation { parents: 0, @@ -70,7 +73,9 @@ pub type Barrier = DenyThenTry< ( DenyTransact, - DenyExchangeWithUnknownLocation, + DenyExchangeWithUnknownLocation< + OverridableAllowedLocations + >, ), ( TakeWeightCredit, -- gitstuff