--- a/Cargo.lock +++ b/Cargo.lock @@ -5541,6 +5541,7 @@ "pallet-inflation", "pallet-maintenance", "pallet-nonfungible", + "pallet-preimage", "pallet-randomness-collective-flip", "pallet-refungible", "pallet-session", @@ -6480,6 +6481,7 @@ "frame-system", "parity-scale-codec", "scale-info", + "sp-core", "sp-std", ] @@ -8968,6 +8970,7 @@ "pallet-inflation", "pallet-maintenance", "pallet-nonfungible", + "pallet-preimage", "pallet-randomness-collective-flip", "pallet-refungible", "pallet-session", @@ -13198,6 +13201,7 @@ "pallet-inflation", "pallet-maintenance", "pallet-nonfungible", + "pallet-preimage", "pallet-randomness-collective-flip", "pallet-refungible", "pallet-session", --- a/Cargo.toml +++ b/Cargo.toml @@ -98,6 +98,7 @@ pallet-aura = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" } pallet-authorship = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" } pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" } +pallet-preimage = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" } pallet-randomness-collective-flip = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" } pallet-session = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" } pallet-sudo = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" } --- a/pallets/maintenance/Cargo.toml +++ b/pallets/maintenance/Cargo.toml @@ -18,10 +18,11 @@ frame-benchmarking = { workspace = true, optional = true } frame-support = { workspace = true } frame-system = { workspace = true } +sp-core = { workspace = true } sp-std = { workspace = true } [features] default = ["std"] runtime-benchmarks = ["frame-benchmarking", "frame-support/runtime-benchmarks", "frame-system/runtime-benchmarks"] -std = ["codec/std", "frame-benchmarking/std", "frame-support/std", "frame-system/std", "scale-info/std", "sp-std/std"] +std = ["codec/std", "frame-benchmarking/std", "frame-support/std", "frame-system/std", "scale-info/std", "sp-core/std", "sp-std/std"] try-runtime = ["frame-support/try-runtime"] --- a/pallets/maintenance/src/lib.rs +++ b/pallets/maintenance/src/lib.rs @@ -25,13 +25,37 @@ #[frame_support::pallet] pub mod pallet { - use frame_support::pallet_prelude::*; + use frame_support::{ + dispatch::*, + pallet_prelude::*, + traits::{QueryPreimage, StorePreimage}, + }; use frame_system::pallet_prelude::*; + use sp_core::H256; + use crate::weights::WeightInfo; #[pallet::config] pub trait Config: frame_system::Config { + /// The overarching event type. type RuntimeEvent: From> + IsType<::RuntimeEvent>; + + /// The runtime origin type. + type RuntimeOrigin: From> + + IsType<::RuntimeOrigin>; + + /// The aggregated call type. + type RuntimeCall: Parameter + + Dispatchable< + RuntimeOrigin = ::RuntimeOrigin, + PostInfo = PostDispatchInfo, + > + GetDispatchInfo + + From>; + + /// The preimage provider with which we look up call hashes to get the call. + type Preimages: QueryPreimage + StorePreimage; + + /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; } @@ -78,5 +102,23 @@ Ok(()) } + + #[pallet::call_index(2)] + #[pallet::weight(::WeightInfo::execute_preimage())] + pub fn execute_preimage(origin: OriginFor, hash: H256) -> DispatchResult { + ensure_root(origin)?; + + let len = T::Preimages::len(&hash).ok_or(DispatchError::Unavailable)?; + let bounded = T::Preimages::pick::<::RuntimeCall>(hash, len); + let (call, _) = + T::Preimages::realize(&bounded).map_err(|_| DispatchError::Unavailable)?; + + let result = match call.dispatch(frame_system::RawOrigin::Root.into()) { + Ok(_) => Ok(()), + Err(error_and_info) => Err(error_and_info.error), + }; + + result + } } } --- a/pallets/scheduler-v2/Cargo.toml +++ b/pallets/scheduler-v2/Cargo.toml @@ -24,7 +24,7 @@ sp-std = { workspace = true } [dev-dependencies] -pallet-preimage = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" } +pallet-preimage = { workspace = true } substrate-test-utils = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" } [features] --- /dev/null +++ b/runtime/common/config/pallets/governance.rs @@ -0,0 +1,34 @@ +// 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 frame_support::parameter_types; +use frame_system::EnsureRoot; +use crate::{AccountId, Balance, Balances, Runtime, RuntimeEvent}; +use up_common::constants::*; + +parameter_types! { + pub PreimageBaseDeposit: Balance = 1000 * UNIQUE; // deposit(2, 64); + // pub PreimageByteDeposit: Balance = 1 * CENTIUNIQUE; // deposit(0, 1); +} + +impl pallet_preimage::Config for Runtime { + type WeightInfo = pallet_preimage::weights::SubstrateWeight; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type ManagerOrigin = EnsureRoot; + type BaseDeposit = PreimageBaseDeposit; + type ByteDeposit = TransactionByteFee; +} --- a/runtime/common/config/pallets/mod.rs +++ b/runtime/common/config/pallets/mod.rs @@ -23,7 +23,7 @@ weights::CommonWeights, RelayChainBlockNumberProvider, }, - Runtime, RuntimeEvent, RuntimeCall, Balances, + Runtime, RuntimeEvent, RuntimeCall, RuntimeOrigin, Balances, Preimage, }; use frame_support::traits::{ConstU32, ConstU64}; use up_common::{ @@ -47,6 +47,10 @@ #[cfg(feature = "collator-selection")] pub mod collator_selection; +// todo:governance replace the feature with governance +#[cfg(feature = "collator-selection")] +pub mod governance; + parameter_types! { pub TreasuryAccountId: AccountId = TreasuryModuleId::get().into_account_truncating(); pub const CollectionCreationPrice: Balance = 2 * UNIQUE; @@ -123,5 +127,8 @@ impl pallet_maintenance::Config for Runtime { type RuntimeEvent = RuntimeEvent; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Preimages = Preimage; type WeightInfo = pallet_maintenance::weights::SubstrateWeight; } --- a/runtime/common/construct_runtime.rs +++ b/runtime/common/construct_runtime.rs @@ -56,6 +56,10 @@ #[cfg(feature = "collator-selection")] Identity: pallet_identity::{Pallet, Call, Storage, Event} = 40, + // todo:governance switch feature to governance + #[cfg(feature = "collator-selection")] + Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 41, + // XCM helpers. XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 50, PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin} = 51, --- a/runtime/common/maintenance.rs +++ b/runtime/common/maintenance.rs @@ -86,6 +86,10 @@ | RuntimeCall::Session(_) | RuntimeCall::Identity(_) => Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + // todo:governance switch the feature to governance + #[cfg(feature = "collator-selection")] + RuntimeCall::Preimage(_) => Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + #[cfg(feature = "pallet-test-utils")] RuntimeCall::TestUtils(_) => Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), --- a/runtime/common/runtime_apis.rs +++ b/runtime/common/runtime_apis.rs @@ -565,6 +565,10 @@ #[cfg(feature = "collator-selection")] list_benchmark!(list, extra, pallet_identity, Identity); + // todo:governance switch feature to governance + #[cfg(feature = "collator-selection")] + list_benchmark!(list, extra, pallet_preimage, Preimage); + #[cfg(feature = "foreign-assets")] list_benchmark!(list, extra, pallet_foreign_assets, ForeignAssets); @@ -629,6 +633,10 @@ #[cfg(feature = "collator-selection")] add_benchmark!(params, batches, pallet_identity, Identity); + // todo:governance switch feature to governance + #[cfg(feature = "collator-selection")] + add_benchmark!(params, batches, pallet_preimage, Preimage); + #[cfg(feature = "foreign-assets")] add_benchmark!(params, batches, pallet_foreign_assets, ForeignAssets); --- a/runtime/opal/Cargo.toml +++ b/runtime/opal/Cargo.toml @@ -41,6 +41,7 @@ 'pallet-inflation/runtime-benchmarks', 'pallet-maintenance/runtime-benchmarks', 'pallet-nonfungible/runtime-benchmarks', + "pallet-preimage/runtime-benchmarks", 'pallet-refungible/runtime-benchmarks', 'pallet-structure/runtime-benchmarks', 'pallet-timestamp/runtime-benchmarks', @@ -69,6 +70,7 @@ # 'pallet-contracts-primitives/std', # 'pallet-contracts-rpc-runtime-api/std', # 'pallet-contract-helpers/std', + "pallet-preimage/std", "pallet-authorship/std", "pallet-session/std", "sp-consensus-aura/std", @@ -139,6 +141,7 @@ "pallet-collator-selection/try-runtime", "pallet-identity/try-runtime", "pallet-session/try-runtime", + "pallet-preimage/try-runtime", 'cumulus-pallet-aura-ext/try-runtime', 'cumulus-pallet-dmp-queue/try-runtime', 'cumulus-pallet-parachain-system/try-runtime', @@ -218,6 +221,7 @@ pallet-aura = { workspace = true } pallet-authorship = { workspace = true } pallet-balances = { workspace = true } +pallet-preimage = { workspace = true } pallet-randomness-collective-flip = { workspace = true } pallet-session = { workspace = true } pallet-sudo = { workspace = true } --- a/runtime/quartz/Cargo.toml +++ b/runtime/quartz/Cargo.toml @@ -42,6 +42,7 @@ 'pallet-inflation/runtime-benchmarks', 'pallet-maintenance/runtime-benchmarks', 'pallet-nonfungible/runtime-benchmarks', + "pallet-preimage/runtime-benchmarks", 'pallet-refungible/runtime-benchmarks', 'pallet-structure/runtime-benchmarks', 'pallet-timestamp/runtime-benchmarks', @@ -69,6 +70,7 @@ # 'pallet-contracts-primitives/std', # 'pallet-contracts-rpc-runtime-api/std', # 'pallet-contract-helpers/std', + "pallet-preimage/std", "pallet-authorship/std", "pallet-identity/std", "pallet-session/std", @@ -136,6 +138,7 @@ "pallet-collator-selection/try-runtime", "pallet-identity/try-runtime", "pallet-session/try-runtime", + "pallet-preimage/try-runtime", 'cumulus-pallet-aura-ext/try-runtime', 'cumulus-pallet-dmp-queue/try-runtime', 'cumulus-pallet-parachain-system/try-runtime', @@ -210,6 +213,7 @@ pallet-aura = { workspace = true } pallet-authorship = { workspace = true } pallet-balances = { workspace = true } +pallet-preimage = { workspace = true } pallet-randomness-collective-flip = { workspace = true } pallet-session = { workspace = true } pallet-sudo = { workspace = true } --- a/runtime/unique/Cargo.toml +++ b/runtime/unique/Cargo.toml @@ -39,6 +39,7 @@ 'pallet-inflation/runtime-benchmarks', 'pallet-maintenance/runtime-benchmarks', 'pallet-nonfungible/runtime-benchmarks', + "pallet-preimage/runtime-benchmarks", 'pallet-refungible/runtime-benchmarks', 'pallet-structure/runtime-benchmarks', 'pallet-timestamp/runtime-benchmarks', @@ -67,6 +68,7 @@ # 'pallet-contracts-primitives/std', # 'pallet-contracts-rpc-runtime-api/std', # 'pallet-contract-helpers/std', + "pallet-preimage/std", "pallet-authorship/std", "pallet-identity/std", "pallet-session/std", @@ -134,6 +136,7 @@ "pallet-collator-selection/try-runtime", "pallet-identity/try-runtime", "pallet-session/try-runtime", + "pallet-preimage/try-runtime", 'cumulus-pallet-aura-ext/try-runtime', 'cumulus-pallet-dmp-queue/try-runtime', 'cumulus-pallet-parachain-system/try-runtime', @@ -209,6 +212,7 @@ pallet-aura = { workspace = true } pallet-authorship = { workspace = true } pallet-balances = { workspace = true } +pallet-preimage = { workspace = true } pallet-randomness-collective-flip = { workspace = true } pallet-session = { workspace = true } pallet-sudo = { workspace = true }