--- /dev/null +++ b/pallets/configuration/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "pallet-configuration" +version = "0.1.0" +edition = "2021" + +[dependencies] +parity-scale-codec = { version = "3.1.5", features = [ + "derive", +], default-features = false } +scale-info = { version = "2.0.1", default-features = false, features = [ + "derive", +] } +frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" } +frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" } +sp-arithmetic = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" } +fp-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.24" } +smallvec = "1.6.1" + +[features] +default = ["std"] +std = [ + "parity-scale-codec/std", + "frame-support/std", + "frame-system/std", + "sp-runtime/std", + "sp-std/std", + "sp-core/std", + "sp-arithmetic/std", + "fp-evm/std", +] --- /dev/null +++ b/pallets/configuration/src/lib.rs @@ -0,0 +1,124 @@ +// 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 . + +#![cfg_attr(not(feature = "std"), no_std)] + +use core::marker::PhantomData; + +use frame_support::{ + pallet, + weights::{WeightToFeePolynomial, WeightToFeeCoefficients, WeightToFeeCoefficient}, + traits::Get, +}; +use sp_arithmetic::traits::{BaseArithmetic, Unsigned}; +use smallvec::smallvec; + +pub use pallet::*; +use sp_core::U256; +use sp_runtime::Perbill; + +#[pallet] +mod pallet { + use super::*; + use frame_support::{ + traits::Get, + pallet_prelude::{StorageValue, ValueQuery, DispatchResult}, + }; + use frame_system::{pallet_prelude::OriginFor, ensure_root}; + + #[pallet::config] + pub trait Config: frame_system::Config { + #[pallet::constant] + type DefaultWeightToFeeCoefficient: Get; + #[pallet::constant] + type DefaultMinGasPrice: Get; + } + + #[pallet::storage] + pub type WeightToFeeCoefficientOverride = StorageValue< + Value = u32, + QueryKind = ValueQuery, + OnEmpty = T::DefaultWeightToFeeCoefficient, + >; + + #[pallet::storage] + pub type MinGasPriceOverride = + StorageValue; + + #[pallet::call] + impl Pallet { + #[pallet::weight(T::DbWeight::get().writes(1))] + pub fn set_weight_to_fee_coefficient_override( + origin: OriginFor, + coeff: Option, + ) -> DispatchResult { + let _sender = ensure_root(origin)?; + if let Some(coeff) = coeff { + >::set(coeff); + } else { + >::kill(); + } + Ok(()) + } + + #[pallet::weight(T::DbWeight::get().writes(1))] + pub fn set_min_gas_price_override( + origin: OriginFor, + coeff: Option, + ) -> DispatchResult { + let _sender = ensure_root(origin)?; + if let Some(coeff) = coeff { + >::set(coeff); + } else { + >::kill(); + } + Ok(()) + } + } + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + pub struct Pallet(_); +} + +pub struct WeightToFee(PhantomData<(T, B)>); + +impl WeightToFeePolynomial for WeightToFee +where + T: Config, + B: BaseArithmetic + From + Copy + Unsigned, +{ + type Balance = B; + + fn polynomial() -> WeightToFeeCoefficients { + smallvec!(WeightToFeeCoefficient { + coeff_integer: >::get().into(), + coeff_frac: Perbill::zero(), + negative: false, + degree: 1, + }) + } +} + +pub struct FeeCalculator(PhantomData); +impl fp_evm::FeeCalculator for FeeCalculator { + fn min_gas_price() -> (U256, u64) { + ( + >::get().into(), + T::DbWeight::get().reads(1), + ) + } +} --- a/primitives/common/src/constants.rs +++ b/primitives/common/src/constants.rs @@ -36,10 +36,10 @@ pub const UNIQUE: Balance = 100 * CENTIUNIQUE; // Targeting 0.1 UNQ per transfer -pub const WEIGHT_TO_FEE_COEFF: u32 = 207_890_902; +pub const WEIGHT_TO_FEE_COEFF: u32 = /**/207_890_902/**/; // Targeting 0.15 UNQ per transfer via ETH -pub const MIN_GAS_PRICE: u64 = 1_019_493_469_850; +pub const MIN_GAS_PRICE: u64 = /**/1_019_493_469_850/**/; /// We assume that ~10% of the block weight is consumed by `on_initalize` handlers. /// This is used to limit the maximal weight of a single extrinsic. --- a/runtime/common/config/ethereum.rs +++ b/runtime/common/config/ethereum.rs @@ -50,13 +50,6 @@ } } -pub struct FixedFee; -impl pallet_evm::FeeCalculator for FixedFee { - fn min_gas_price() -> (U256, u64) { - (MIN_GAS_PRICE.into(), 0) - } -} - pub struct EthereumFindAuthor(core::marker::PhantomData); impl> FindAuthor for EthereumFindAuthor { fn find_author<'a, I>(digests: I) -> Option @@ -73,7 +66,7 @@ impl pallet_evm::Config for Runtime { type BlockGasLimit = BlockGasLimit; - type FeeCalculator = FixedFee; + type FeeCalculator = pallet_configuration::FeeCalculator; type GasWeightMapping = FixedGasWeightMapping; type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping; type CallOrigin = EnsureAddressTruncated; --- a/runtime/common/config/pallets/mod.rs +++ b/runtime/common/config/pallets/mod.rs @@ -25,6 +25,7 @@ }, Runtime, Event, Call, Balances, }; +use frame_support::traits::{ConstU32, ConstU64}; use up_common::{ types::{AccountId, Balance, BlockNumber}, constants::*, @@ -91,3 +92,8 @@ type CommonWeightInfo = CommonWeights; type RefungibleExtensionsWeightInfo = CommonWeights; } + +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 }>; +} --- a/runtime/common/config/substrate.rs +++ b/runtime/common/config/substrate.rs @@ -18,8 +18,7 @@ traits::{Everything, ConstU32}, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}, - DispatchClass, WeightToFeePolynomial, WeightToFeeCoefficients, ConstantMultiplier, - WeightToFeeCoefficient, + DispatchClass, ConstantMultiplier, }, parameter_types, PalletId, }; @@ -32,8 +31,6 @@ limits::{BlockLength, BlockWeights}, EnsureRoot, }; -use sp_arithmetic::traits::{BaseArithmetic, Unsigned}; -use smallvec::smallvec; use crate::{ runtime_common::DealWithFees, Runtime, Event, Call, Origin, PalletInfo, System, Balances, Treasury, SS58Prefix, Version, @@ -154,32 +151,13 @@ /// This value increases the priority of `Operational` transactions by adding /// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`. pub const OperationalFeeMultiplier: u8 = 5; -} - -/// Linear implementor of `WeightToFeePolynomial` -pub struct LinearFee(sp_std::marker::PhantomData); - -impl WeightToFeePolynomial for LinearFee -where - T: BaseArithmetic + From + Copy + Unsigned, -{ - type Balance = T; - - fn polynomial() -> WeightToFeeCoefficients { - smallvec!(WeightToFeeCoefficient { - coeff_integer: WEIGHT_TO_FEE_COEFF.into(), - coeff_frac: Perbill::zero(), - negative: false, - degree: 1, - }) - } } impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; type LengthToFee = ConstantMultiplier; type OperationalFeeMultiplier = OperationalFeeMultiplier; - type WeightToFee = LinearFee; + type WeightToFee = pallet_configuration::WeightToFee; type FeeMultiplierUpdate = (); } --- a/runtime/common/config/xcm.rs +++ b/runtime/common/config/xcm.rs @@ -44,8 +44,7 @@ use xcm_executor::{Config, XcmExecutor, Assets}; use sp_std::marker::PhantomData; use crate::{ - runtime_common::config::substrate::LinearFee, Runtime, Call, Event, Origin, Balances, - ParachainInfo, ParachainSystem, PolkadotXcm, XcmpQueue, + Runtime, Call, Event, Origin, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, XcmpQueue, }; use up_common::{ types::{AccountId, Balance}, @@ -234,8 +233,11 @@ } } -pub struct XcmConfig; -impl Config for XcmConfig { +pub struct XcmConfig(PhantomData); +impl Config for XcmConfig +where + T: pallet_configuration::Config, +{ type Call = Call; type XcmSender = XcmRouter; // How to withdraw and deposit an asset. @@ -246,8 +248,13 @@ type LocationInverter = LocationInverter; type Barrier = Barrier; type Weigher = FixedWeightBounds; - type Trader = - UsingOnlySelfCurrencyComponents, RelayLocation, AccountId, Balances, ()>; + type Trader = UsingOnlySelfCurrencyComponents< + pallet_configuration::WeightToFee, + RelayLocation, + AccountId, + Balances, + (), + >; type ResponseHandler = (); // Don't handle responses for now. type SubscriptionService = PolkadotXcm; @@ -261,7 +268,7 @@ type XcmRouter = XcmRouter; type ExecuteXcmOrigin = EnsureXcmOrigin; type XcmExecuteFilter = Everything; - type XcmExecutor = XcmExecutor; + type XcmExecutor = XcmExecutor>; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Everything; type Weigher = FixedWeightBounds; @@ -274,13 +281,13 @@ impl cumulus_pallet_xcm::Config for Runtime { type Event = Event; - type XcmExecutor = XcmExecutor; + type XcmExecutor = XcmExecutor>; } impl cumulus_pallet_xcmp_queue::Config for Runtime { type WeightInfo = (); type Event = Event; - type XcmExecutor = XcmExecutor; + type XcmExecutor = XcmExecutor>; type ChannelInfo = ParachainSystem; type VersionWrapper = (); type ExecuteOverweightOrigin = frame_system::EnsureRoot; @@ -290,6 +297,6 @@ impl cumulus_pallet_dmp_queue::Config for Runtime { type Event = Event; - type XcmExecutor = XcmExecutor; + type XcmExecutor = XcmExecutor>; type ExecuteOverweightOrigin = frame_system::EnsureRoot; } --- a/runtime/common/construct_runtime/mod.rs +++ b/runtime/common/construct_runtime/mod.rs @@ -57,7 +57,7 @@ #[runtimes(opal)] Scheduler: pallet_unique_scheduler::{Pallet, Call, Storage, Event} = 62, - // free = 63 + Configuration: pallet_configuration::{Pallet, Call, Storage} = 63, Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64, // ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65, --- a/runtime/opal/Cargo.toml +++ b/runtime/opal/Cargo.toml @@ -87,6 +87,7 @@ 'parachain-info/std', 'serde', 'pallet-inflation/std', + 'pallet-configuration/std', 'pallet-common/std', 'pallet-structure/std', 'pallet-fungible/std', @@ -414,6 +415,7 @@ fp-evm-mapping = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.24" } pallet-inflation = { path = '../../pallets/inflation', default-features = false } up-data-structs = { path = '../../primitives/data-structs', default-features = false } +pallet-configuration = { default-features = false, path = "../../pallets/configuration" } pallet-common = { default-features = false, path = "../../pallets/common" } pallet-structure = { default-features = false, path = "../../pallets/structure" } pallet-fungible = { default-features = false, path = "../../pallets/fungible" } --- a/runtime/quartz/Cargo.toml +++ b/runtime/quartz/Cargo.toml @@ -87,6 +87,7 @@ 'parachain-info/std', 'serde', 'pallet-inflation/std', + 'pallet-configuration/std', 'pallet-common/std', 'pallet-structure/std', 'pallet-fungible/std', @@ -418,6 +419,7 @@ fp-evm-mapping = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.24" } pallet-inflation = { path = '../../pallets/inflation', default-features = false } up-data-structs = { path = '../../primitives/data-structs', default-features = false } +pallet-configuration = { default-features = false, path = "../../pallets/configuration" } pallet-common = { default-features = false, path = "../../pallets/common" } pallet-structure = { default-features = false, path = "../../pallets/structure" } pallet-fungible = { default-features = false, path = "../../pallets/fungible" } --- a/runtime/unique/Cargo.toml +++ b/runtime/unique/Cargo.toml @@ -88,6 +88,7 @@ 'parachain-info/std', 'serde', 'pallet-inflation/std', + 'pallet-configuration/std', 'pallet-common/std', 'pallet-structure/std', 'pallet-fungible/std', @@ -411,6 +412,7 @@ rmrk-rpc = { path = "../../primitives/rmrk-rpc", default-features = false } pallet-inflation = { path = '../../pallets/inflation', default-features = false } up-data-structs = { path = '../../primitives/data-structs', default-features = false } +pallet-configuration = { default-features = false, path = "../../pallets/configuration" } pallet-common = { default-features = false, path = "../../pallets/common" } pallet-structure = { default-features = false, path = "../../pallets/structure" } pallet-fungible = { default-features = false, path = "../../pallets/fungible" }