From 4ad9af73665a89ba32c8ef823e305182e37ee0c8 Mon Sep 17 00:00:00 2001 From: Daniel Shiposha Date: Mon, 31 Oct 2022 11:12:05 +0000 Subject: [PATCH] chore: remove old scheduler --- --- a/Cargo.lock +++ b/Cargo.lock @@ -5389,7 +5389,6 @@ "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", "pallet-unique", - "pallet-unique-scheduler", "pallet-unique-scheduler-v2", "pallet-xcm", "parachain-info", @@ -6850,25 +6849,6 @@ "sp-runtime", "sp-std", "up-data-structs", -] - -[[package]] -name = "pallet-unique-scheduler" -version = "0.1.1" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec 3.2.1", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "substrate-test-utils", - "up-sponsorship", ] [[package]] @@ -8881,7 +8861,6 @@ "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", "pallet-unique", - "pallet-unique-scheduler", "pallet-xcm", "parachain-info", "parity-scale-codec 3.2.1", @@ -13012,7 +12991,6 @@ "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", "pallet-unique", - "pallet-unique-scheduler", "pallet-xcm", "parachain-info", "parity-scale-codec 3.2.1", --- a/pallets/scheduler/CHANGELOG.md +++ /dev/null @@ -1,10 +0,0 @@ - -## [v0.1.1] 2022-08-16 - -### Other changes - -- build: Upgrade polkadot to v0.9.27 2c498572636f2b34d53b1c51b7283a761a7dc90a - -- build: Upgrade polkadot to v0.9.26 85515e54c4ca1b82a2630034e55dcc804c643bf8 - -- build: Upgrade polkadot to v0.9.25 cdfb9bdc7b205ff1b5134f034ef9973d769e5e6b \ No newline at end of file --- a/pallets/scheduler/Cargo.toml +++ /dev/null @@ -1,53 +0,0 @@ -[package] -name = "pallet-unique-scheduler" -version = "0.1.1" -authors = ["Unique Network "] -edition = "2021" -license = "GPLv3" -homepage = "https://unique.network" -repository = "https://github.com/UniqueNetwork/unique-chain" -description = "Unique Scheduler pallet" -readme = "README.md" - -[dependencies] -serde = { version = "1.0.130", default-features = false } -codec = { package = "parity-scale-codec", version = "3.1.2", 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.30" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-io = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.30' } -frame-benchmarking = { default-features = false, optional = true, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } - -up-sponsorship = { version = "0.1.0", default-features = false, git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.30" } -log = { version = "0.4.16", default-features = false } - -[dev-dependencies] -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } -substrate-test-utils = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.30" } - -[features] -default = ["std"] -std = [ - "codec/std", - "sp-runtime/std", - "frame-benchmarking/std", - "frame-support/std", - "frame-system/std", - "up-sponsorship/std", - "sp-io/std", - "sp-std/std", - "sp-core/std", - "log/std", -] -runtime-benchmarks = [ - "frame-benchmarking", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", -] -try-runtime = ["frame-support/try-runtime"] --- a/pallets/scheduler/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Scheduler -A module for scheduling dispatches. - -- [`scheduler::Trait`](https://docs.rs/pallet-scheduler/latest/pallet_scheduler/trait.Trait.html) -- [`Call`](https://docs.rs/pallet-scheduler/latest/pallet_scheduler/enum.Call.html) -- [`Module`](https://docs.rs/pallet-scheduler/latest/pallet_scheduler/struct.Module.html) - -## Overview - -This module exposes capabilities for scheduling dispatches to occur at a -specified block number or at a specified period. These scheduled dispatches -may be named or anonymous and may be canceled. - -**NOTE:** The scheduled calls will be dispatched with the default filter -for the origin: namely `frame_system::Config::BaseCallFilter` for all origin -except root which will get no filter. And not the filter contained in origin -use to call `fn schedule`. - -If a call is scheduled using proxy or whatever mecanism which adds filter, -then those filter will not be used when dispatching the schedule call. - -## Interface - -### Dispatchable Functions - -* `schedule` - schedule a dispatch, which may be periodic, to occur at a - specified block and with a specified priority. -* `cancel` - cancel a scheduled dispatch, specified by block number and - index. -* `schedule_named` - augments the `schedule` interface with an additional - `Vec` parameter that can be used for identification. -* `cancel_named` - the named complement to the cancel function. - -License: Unlicense --- a/pallets/scheduler/src/benchmarking.rs +++ /dev/null @@ -1,260 +0,0 @@ -// 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 . - -// Original license -// This file is part of Substrate. - -// Copyright (C) 2020-2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Scheduler pallet benchmarking. - -use super::*; -use frame_benchmarking::{benchmarks, account}; -use frame_support::{ - ensure, - traits::{OnInitialize}, -}; -use frame_system::RawOrigin; -use sp_runtime::traits::Hash; -use sp_std::{prelude::*, vec}; - -use crate::Pallet as Scheduler; -use frame_system::Pallet as System; -use frame_support::traits::Currency; - -const BLOCK_NUMBER: u32 = 2; - -fn make_scheduled_id(src: u32) -> ScheduledId { - let slice_id: [u8; 4] = src.encode().try_into().unwrap(); - let mut id: [u8; 16] = [0; 16]; - id[..4].clone_from_slice(&slice_id); - id -} - -/// Add `n` named items to the schedule. -/// -/// For `resolved`: -/// - `None`: aborted (hash without preimage) -/// - `Some(true)`: hash resolves into call if possible, plain call otherwise -/// - `Some(false)`: plain call -fn fill_schedule( - when: T::BlockNumber, - n: u32, - periodic: bool, - resolved: Option, -) -> Result<(), &'static str> { - let t = DispatchTime::At(when); - let caller = account("user", 0, 1); - - // Give the sender account max funds for transfer (their account will never reasonably be killed). - T::Currency::make_free_balance_be(&caller, T::Currency::minimum_balance()); - - for i in 0..n { - let (call, hash) = call_and_hash::(i); - let call_or_hash = match resolved { - Some(_) => call.into(), - None => CallOrHashOf::::Hash(hash), - }; - let period = match periodic { - true => Some(((i + 100).into(), 100)), - false => None, - }; - - let id = make_scheduled_id(i); - let origin = frame_system::RawOrigin::Signed(caller.clone()).into(); - Scheduler::::do_schedule_named(id, t, period, 0, origin, call_or_hash)?; - } - ensure!( - Agenda::::get(when).len() == n as usize, - "didn't fill schedule" - ); - Ok(()) -} - -fn call_and_hash(i: u32) -> (::RuntimeCall, T::Hash) { - // Essentially a no-op call. - let call: ::RuntimeCall = frame_system::Call::remark { remark: i.encode() }.into(); - let hash = T::Hashing::hash_of(&call); - (call, hash) -} - -benchmarks! { - on_initialize_periodic_named_resolved { - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - fill_schedule::(when, s, true, Some(true))?; - }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } - verify { - assert_eq!(System::::event_count(), s); - for i in 0..s { - assert_eq!(Agenda::::get(when + (i + 100).into()).len(), 1 as usize); - } - } - - on_initialize_named_resolved { - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - fill_schedule::(when, s, false, Some(true))?; - }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } - verify { - assert_eq!(System::::event_count(), s); - assert!(Agenda::::iter().count() == 0); - } - - on_initialize_periodic { - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - fill_schedule::(when, s, true, Some(false))?; - }: { Scheduler::::on_initialize(when); } - verify { - assert_eq!(System::::event_count(), s); - for i in 0..s { - assert_eq!(Agenda::::get(when + (i + 100).into()).len(), 1 as usize); - } - } - - on_initialize_periodic_resolved { - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - fill_schedule::(when, s, true, Some(true))?; - }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } - verify { - assert_eq!(System::::event_count(), s ); - for i in 0..s { - assert_eq!(Agenda::::get(when + (i + 100).into()).len(), 1 as usize); - } - } - - on_initialize_aborted { - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - fill_schedule::(when, s, false, None)?; - }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } - verify { - assert_eq!(System::::event_count(), 0); - } - - on_initialize_named_aborted { - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - fill_schedule::(when, s, false, Some(false))?; - }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } - verify { - } - - on_initialize_named { - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - fill_schedule::(when, s, false, None)?; - }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } - verify { - assert_eq!(System::::event_count(), 0); - } - - on_initialize { - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - fill_schedule::(when, s, false, Some(false))?; - }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } - verify { - assert_eq!(System::::event_count(), s); - assert!(Agenda::::iter().count() == 0); - } - - on_initialize_resolved { - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - fill_schedule::(when, s, false, Some(true))?; - }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } - verify { - assert_eq!(System::::event_count(), s); - assert!(Agenda::::iter().count() == 0); - } - - schedule_named { - let caller: T::AccountId = account("user", 0, 1); - let origin: RawOrigin = frame_system::RawOrigin::Signed(caller.clone()); - let s in 0 .. T::MaxScheduledPerBlock::get(); - let slice_id: [u8; 4] = s.encode().try_into().unwrap(); - let mut id: [u8; 16] = [0; 16]; - id[..4].clone_from_slice(&slice_id); - let when = BLOCK_NUMBER.into(); - let periodic = Some((T::BlockNumber::one(), 100)); - let priority = None; - // Essentially a no-op call. - let inner_call = frame_system::Call::set_storage { items: vec![] }.into(); - let call = Box::new(CallOrHashOf::::Value(inner_call)); - fill_schedule::(when, s, true, Some(false))?; - }: _(origin, id, when, periodic, priority, call) - verify { - ensure!( - Agenda::::get(when).len() == (s + 1) as usize, - "didn't add to schedule" - ); - } - - cancel_named { - let caller: T::AccountId = account("user", 0, 1); - let origin: RawOrigin = frame_system::RawOrigin::Signed(caller.clone()); - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - let idx = s - 1; - let id = make_scheduled_id(idx); - fill_schedule::(when, s, true, Some(false))?; - }: _(origin, id) - verify { - ensure!( - Lookup::::get(id).is_none(), - "didn't remove from lookup" - ); - // Removed schedule is NONE - ensure!( - Agenda::::get(when)[idx as usize].is_none(), - "didn't remove from schedule" - ); - } - - change_named_priority { - let origin: RawOrigin = frame_system::RawOrigin::Root; - let s in 1 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - let idx = s - 1; - let id = make_scheduled_id(idx); - let priority = 42; - fill_schedule::(when, s, true, Some(false))?; - }: _(origin, id, priority) - verify { - ensure!( - Agenda::::get(when)[idx as usize].clone().unwrap().priority == priority, - "didn't change the priority" - ); - } - - impl_benchmark_test_suite!(Scheduler, crate::mock::new_test_ext(), crate::mock::Test); -} --- a/pallets/scheduler/src/lib.rs +++ /dev/null @@ -1,802 +0,0 @@ -// 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 . - -// Original license: -// This file is part of Substrate. - -// Copyright (C) 2017-2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Unique scheduler -//! A Pallet for scheduling dispatches. -//! -//! - [`Config`] -//! - [`Call`] -//! - [`Pallet`] -//! -//! ## Overview -//! -//! This Pallet exposes capabilities for scheduling dispatches to occur at a -//! specified block number or at a specified period. These scheduled dispatches -//! should be named and may be canceled. -//! -//! **NOTE:** The unique scheduler is designed for deferred transaction calls by block number. -//! Any user can book a call of a certain transaction to a specific block number. -//! Also possible to book a call with a certain frequency. -//! -//! Key differences from the original pallet: -//! -//! Schedule Id restricted by 16 bytes. Identificator for booked call. -//! Priority limited by HARD DEADLINE (<= 63). Calls over maximum weight don't include to block. -//! The maximum weight that may be scheduled per block for any dispatchables of less priority than `schedule::HARD_DEADLINE`. -//! Maybe_periodic limit is 100 calls. Reserved for future sponsored transaction support. -//! At 100 calls reserved amount is not so much and this is avoid potential problems with balance locks. -//! Any account allowed to schedule any calls. Account withdraw implemented through default transaction logic. -//! -//! ## Interface -//! -//! ### Dispatchable Functions -//! -//! * `schedule_named` - augments the `schedule` interface with an additional `Vec` parameter -//! that can be used for identification. -//! * `cancel_named` - the named complement to the cancel function. - -// Ensure we're `no_std` when compiling for Wasm. -#![cfg_attr(not(feature = "std"), no_std)] - -#[cfg(feature = "runtime-benchmarks")] -mod benchmarking; - -pub mod weights; - -use sp_core::H160; -use codec::{Codec, Decode, Encode}; -use frame_system::{self as system, ensure_signed}; -pub use pallet::*; -use scale_info::TypeInfo; -use sp_runtime::{ - traits::{BadOrigin, One, Saturating, Zero}, - RuntimeDebug, DispatchErrorWithPostInfo, -}; -use sp_std::{borrow::Borrow, cmp::Ordering, marker::PhantomData, prelude::*}; - -use frame_support::{ - dispatch::{ - DispatchError, DispatchResult, Dispatchable, UnfilteredDispatchable, Parameter, - GetDispatchInfo, - }, - traits::{ - schedule::{self, DispatchTime, MaybeHashed}, - NamedReservableCurrency, EnsureOrigin, Get, IsType, OriginTrait, PrivilegeCmp, - StorageVersion, - }, - weights::{Weight}, -}; - -pub use weights::WeightInfo; - -/// The location of a scheduled task that can be used to remove it. -pub type TaskAddress = (BlockNumber, u32); -pub const MAX_TASK_ID_LENGTH_IN_BYTES: u8 = 16; - -pub type ScheduledId = [u8; MAX_TASK_ID_LENGTH_IN_BYTES as usize]; -pub type CallOrHashOf = - MaybeHashed<::RuntimeCall, ::Hash>; - -/// Information regarding an item to be executed in the future. -#[cfg_attr(any(feature = "std", test), derive(PartialEq, Eq))] -#[derive(Clone, RuntimeDebug, Encode, Decode, TypeInfo)] -pub struct ScheduledV3 { - /// The unique identity for this task, if there is one. - maybe_id: Option, - /// This task's priority. - priority: schedule::Priority, - /// The call to be dispatched. - call: Call, - /// If the call is periodic, then this points to the information concerning that. - maybe_periodic: Option>, - /// The origin to dispatch the call. - origin: PalletsOrigin, - _phantom: PhantomData, -} - -pub type ScheduledV3Of = ScheduledV3< - CallOrHashOf, - ::BlockNumber, - ::PalletsOrigin, - ::AccountId, ->; - -pub type ScheduledOf = ScheduledV3Of; - -/// The current version of Scheduled struct. -pub type Scheduled = - ScheduledV3; - -pub enum ScheduledEnsureOriginSuccess { - Root, - Signed(AccountId), -} - -#[cfg(feature = "runtime-benchmarks")] -mod preimage_provider { - use frame_support::traits::PreimageRecipient; - pub trait PreimageProviderAndMaybeRecipient: PreimageRecipient {} - impl> PreimageProviderAndMaybeRecipient for T {} -} - -#[cfg(not(feature = "runtime-benchmarks"))] -mod preimage_provider { - use frame_support::traits::PreimageProvider; - pub trait PreimageProviderAndMaybeRecipient: PreimageProvider {} - impl> PreimageProviderAndMaybeRecipient for T {} -} - -pub use preimage_provider::PreimageProviderAndMaybeRecipient; - -pub(crate) trait MarginalWeightInfo: WeightInfo { - fn item(periodic: bool, named: bool, resolved: Option) -> Weight { - match (periodic, named, resolved) { - (_, false, None) => Self::on_initialize_aborted(2) - Self::on_initialize_aborted(1), - (_, true, None) => { - Self::on_initialize_named_aborted(2) - Self::on_initialize_named_aborted(1) - } - (false, false, Some(false)) => Self::on_initialize(2) - Self::on_initialize(1), - (false, true, Some(false)) => { - Self::on_initialize_named(2) - Self::on_initialize_named(1) - } - (true, false, Some(false)) => { - Self::on_initialize_periodic(2) - Self::on_initialize_periodic(1) - } - (true, true, Some(false)) => { - Self::on_initialize_periodic_named_resolved(2) - - Self::on_initialize_periodic_named_resolved(1) - } - (false, false, Some(true)) => Self::on_initialize(2) - Self::on_initialize(1), - (false, true, Some(true)) => { - Self::on_initialize_named_resolved(2) - Self::on_initialize_named_resolved(1) - } - (true, false, Some(true)) => { - Self::on_initialize_periodic_resolved(2) - Self::on_initialize_periodic_resolved(1) - } - (true, true, Some(true)) => { - Self::on_initialize_periodic_named_resolved(2) - - Self::on_initialize_periodic_named_resolved(1) - } - } - } -} -impl MarginalWeightInfo for T {} - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::{ - dispatch::PostDispatchInfo, - pallet_prelude::*, - traits::{ - schedule::{LookupError, LOWEST_PRIORITY}, - PreimageProvider, - }, - }; - use frame_system::pallet_prelude::*; - - /// The current storage version. - const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); - - #[pallet::pallet] - #[pallet::generate_store(pub(super) trait Store)] - #[pallet::storage_version(STORAGE_VERSION)] - #[pallet::without_storage_info] - pub struct Pallet(_); - - /// `system::Config` should always be included in our implied traits. - #[pallet::config] - pub trait Config: frame_system::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// The aggregated origin which the dispatch will take. - type RuntimeOrigin: OriginTrait - + From - + IsType<::RuntimeOrigin>; - - /// The caller origin, overarching type of all pallets origins. - type PalletsOrigin: From> + Codec + Clone + Eq + TypeInfo; - - type Currency: NamedReservableCurrency; - - /// The aggregated call type. - type RuntimeCall: Parameter - + Dispatchable< - RuntimeOrigin = ::RuntimeOrigin, - PostInfo = PostDispatchInfo, - > + UnfilteredDispatchable::RuntimeOrigin> - + GetDispatchInfo - + From>; - - /// The maximum weight that may be scheduled per block for any dispatchables of less - /// priority than `schedule::HARD_DEADLINE`. - #[pallet::constant] - type MaximumWeight: Get; - - /// Required origin to schedule or cancel calls. - type ScheduleOrigin: EnsureOrigin< - ::RuntimeOrigin, - Success = ScheduledEnsureOriginSuccess, - >; - - /// Required origin to set/change calls' priority. - type PrioritySetOrigin: EnsureOrigin<::RuntimeOrigin>; - - /// Compare the privileges of origins. - /// - /// This will be used when canceling a task, to ensure that the origin that tries - /// to cancel has greater or equal privileges as the origin that created the scheduled task. - /// - /// For simplicity the [`EqualPrivilegeOnly`](frame_support::traits::EqualPrivilegeOnly) can - /// be used. This will only check if two given origins are equal. - type OriginPrivilegeCmp: PrivilegeCmp; - - /// The maximum number of scheduled calls in the queue for a single block. - /// Not strictly enforced, but used for weight estimation. - #[pallet::constant] - type MaxScheduledPerBlock: Get; - - /// Weight information for extrinsics in this pallet. - type WeightInfo: WeightInfo; - - /// The preimage provider with which we look up call hashes to get the call. - type PreimageProvider: PreimageProviderAndMaybeRecipient; - - /// If `Some` then the number of blocks to postpone execution for when the item is delayed. - type NoPreimagePostponement: Get>; - - /// Sponsoring function. - // type SponsorshipHandler: SponsorshipHandler::Call>; - - /// The helper type used for custom transaction fee logic. - type CallExecutor: DispatchCall; - } - - /// A Scheduler-Runtime interface for finer payment handling. - pub trait DispatchCall { - /// Reserve (lock) the maximum spendings on a call, calculated from its weight and the repetition count. - fn reserve_balance( - id: ScheduledId, - sponsor: ::AccountId, - call: ::RuntimeCall, - count: u32, - ) -> Result<(), DispatchError>; - - /// Unreserve (unlock) a certain amount from the payer's reserved funds, returning the change. - fn pay_for_call( - id: ScheduledId, - sponsor: ::AccountId, - call: ::RuntimeCall, - ) -> Result; - - /// Resolve the call dispatch, including any post-dispatch operations. - fn dispatch_call( - signer: Option, - function: ::RuntimeCall, - ) -> Result< - Result>, - TransactionValidityError, - >; - - /// Release unspent reserved funds in case of a schedule cancel. - fn cancel_reserve( - id: ScheduledId, - sponsor: ::AccountId, - ) -> Result; - } - - /// Items to be executed, indexed by the block number that they should be executed on. - #[pallet::storage] - pub type Agenda = - StorageMap<_, Twox64Concat, T::BlockNumber, Vec>>, ValueQuery>; - - /// Lookup from identity to the block number and index of the task. - #[pallet::storage] - pub(crate) type Lookup = - StorageMap<_, Twox64Concat, ScheduledId, TaskAddress>; - - /// Events type. - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// Scheduled some task. - Scheduled { when: T::BlockNumber, index: u32 }, - /// Canceled some task. - Canceled { when: T::BlockNumber, index: u32 }, - /// Scheduled task's priority has changed - PriorityChanged { - when: T::BlockNumber, - index: u32, - priority: schedule::Priority, - }, - /// Dispatched some task. - Dispatched { - task: TaskAddress, - id: Option, - result: DispatchResult, - }, - /// The call for the provided hash was not found so the task has been aborted. - CallLookupFailed { - task: TaskAddress, - id: Option, - error: LookupError, - }, - } - - #[pallet::error] - pub enum Error { - /// Failed to schedule a call - FailedToSchedule, - /// Cannot find the scheduled call. - NotFound, - /// Given target block number is in the past. - TargetBlockNumberInPast, - /// Reschedule failed because it does not change scheduled time. - RescheduleNoChange, - } - - #[pallet::hooks] - impl Hooks> for Pallet { - /// Execute the scheduled calls - fn on_initialize(now: T::BlockNumber) -> Weight { - let limit = T::MaximumWeight::get(); - - let mut queued = Agenda::::take(now) - .into_iter() - .enumerate() - .filter_map(|(index, s)| Some((index as u32, s?))) - .collect::>(); - - if queued.len() as u32 > T::MaxScheduledPerBlock::get() { - log::warn!( - target: "runtime::scheduler", - "Warning: This block has more items queued in Scheduler than \ - expected from the runtime configuration. An update might be needed." - ); - } - - queued.sort_by_key(|(_, s)| s.priority); - - let next = now + One::one(); - - let mut total_weight: Weight = T::WeightInfo::on_initialize(0); - for (order, (index, mut s)) in queued.into_iter().enumerate() { - let named = s.maybe_id.is_some(); - - let (call, maybe_completed) = s.call.resolved::(); - s.call = call; - - let resolved = if let Some(completed) = maybe_completed { - T::PreimageProvider::unrequest_preimage(&completed); - true - } else { - false - }; - let call = match s.call.as_value().cloned() { - Some(c) => c, - None => { - // Preimage not available - postpone until some block. - total_weight.saturating_accrue(T::WeightInfo::item(false, named, None)); - if let Some(delay) = T::NoPreimagePostponement::get() { - let until = now.saturating_add(delay); - if let Some(ref id) = s.maybe_id { - let index = Agenda::::decode_len(until).unwrap_or(0); - Lookup::::insert(id, (until, index as u32)); - } - Agenda::::append(until, Some(s)); - } else if let Some(ref id) = s.maybe_id { - Lookup::::remove(id); - } - continue; - } - }; - - let periodic = s.maybe_periodic.is_some(); - let call_weight = call.get_dispatch_info().weight; - let mut item_weight = T::WeightInfo::item(periodic, named, Some(resolved)); - let origin = <::RuntimeOrigin as From>::from( - s.origin.clone(), - ) - .into(); - if ensure_signed(origin).is_ok() { - // Weights of Signed dispatches expect their signing account to be whitelisted. - item_weight.saturating_accrue(T::DbWeight::get().reads_writes(1, 1)); - } - - // We allow a scheduled call if any is true: - // - It's priority is `HARD_DEADLINE` - // - It does not push the weight past the limit. - // - It is the first item in the schedule - let hard_deadline = s.priority <= schedule::HARD_DEADLINE; - let test_weight = total_weight - .saturating_add(call_weight) - .saturating_add(item_weight); - if !hard_deadline && order > 0 && test_weight.all_gt(limit) { - // Cannot be scheduled this block - postpone until next. - total_weight.saturating_accrue(T::WeightInfo::item(false, named, None)); - if let Some(ref id) = s.maybe_id { - // NOTE: We could reasonably not do this (in which case there would be one - // block where the named and delayed item could not be referenced by name), - // but we will do it anyway since it should be mostly free in terms of - // weight and it is slightly cleaner. - let index = Agenda::::decode_len(next).unwrap_or(0); - Lookup::::insert(id, (next, index as u32)); - } - Agenda::::append(next, Some(s)); - continue; - } - - let scheduled_origin = - <::RuntimeOrigin as From>::from( - s.origin.clone(), - ); - let ensured_origin = T::ScheduleOrigin::ensure_origin(scheduled_origin.into()); - - let r = match ensured_origin { - Ok(ScheduledEnsureOriginSuccess::Root) => { - Ok(call.dispatch_bypass_filter(frame_system::RawOrigin::Root.into())) - } - Ok(ScheduledEnsureOriginSuccess::Signed(sender)) => { - // Execute transaction via chain default pipeline - // That means dispatch will be processed like any user's extrinsic e.g. transaction fees will be taken - T::CallExecutor::dispatch_call(Some(sender), call.clone()) - } - Err(e) => Ok(Err(e.into())), - }; - - let mut actual_call_weight: Weight = item_weight; - let result: Result<_, DispatchError> = match r { - Ok(o) => match o { - Ok(di) => { - actual_call_weight = di.actual_weight.unwrap_or(item_weight); - Ok(()) - } - Err(err) => Err(err.error), - }, - Err(_) => { - log::error!( - target: "runtime::scheduler", - "Warning: Scheduler has failed to execute a post-dispatch transaction. \ - This block might have become invalid."); - Err(DispatchError::CannotLookup) - } // todo possibly force a skip/return here, do something with the error - }; - - total_weight.saturating_accrue(item_weight); - total_weight.saturating_accrue(actual_call_weight); - - Self::deposit_event(Event::Dispatched { - task: (now, index), - id: s.maybe_id.clone(), - result, - }); - - if let &Some((period, count)) = &s.maybe_periodic { - if count > 1 { - s.maybe_periodic = Some((period, count - 1)); - } else { - s.maybe_periodic = None; - } - let wake = now + period; - let is_canceled; - - // If scheduled is named, place its information in `Lookup` - if let Some(ref id) = s.maybe_id { - is_canceled = Lookup::::get(id).is_none(); - let wake_index = Agenda::::decode_len(wake).unwrap_or(0); - - if !is_canceled { - Lookup::::insert(id, (wake, wake_index as u32)); - } - } else { - is_canceled = false; - } - - if !is_canceled { - Agenda::::append(wake, Some(s)); - } - } else if let Some(ref id) = s.maybe_id { - Lookup::::remove(id); - } - } - total_weight - } - } - - #[pallet::call] - impl Pallet { - /// Schedule a named task. - #[pallet::weight(::WeightInfo::schedule_named(T::MaxScheduledPerBlock::get()))] - pub fn schedule_named( - origin: OriginFor, - id: ScheduledId, - when: T::BlockNumber, - maybe_periodic: Option>, - priority: Option, - call: Box>, - ) -> DispatchResult { - T::ScheduleOrigin::ensure_origin(origin.clone())?; - - if priority.is_some() { - T::PrioritySetOrigin::ensure_origin(origin.clone())?; - } - - let origin = ::RuntimeOrigin::from(origin); - Self::do_schedule_named( - id, - DispatchTime::At(when), - maybe_periodic, - priority.unwrap_or(LOWEST_PRIORITY), - origin.caller().clone(), - *call, - )?; - Ok(()) - } - - /// Cancel a named scheduled task. - #[pallet::weight(::WeightInfo::cancel_named(T::MaxScheduledPerBlock::get()))] - pub fn cancel_named(origin: OriginFor, id: ScheduledId) -> DispatchResult { - T::ScheduleOrigin::ensure_origin(origin.clone())?; - let origin = ::RuntimeOrigin::from(origin); - Self::do_cancel_named(Some(origin.caller().clone()), id)?; - Ok(()) - } - - /// Schedule a named task after a delay. - /// - /// # - /// Same as [`schedule_named`](Self::schedule_named). - /// # - #[pallet::weight(::WeightInfo::schedule_named(T::MaxScheduledPerBlock::get()))] - pub fn schedule_named_after( - origin: OriginFor, - id: ScheduledId, - after: T::BlockNumber, - maybe_periodic: Option>, - priority: Option, - call: Box>, - ) -> DispatchResult { - T::ScheduleOrigin::ensure_origin(origin.clone())?; - - if priority.is_some() { - T::PrioritySetOrigin::ensure_origin(origin.clone())?; - } - - let origin = ::RuntimeOrigin::from(origin); - Self::do_schedule_named( - id, - DispatchTime::After(after), - maybe_periodic, - priority.unwrap_or(LOWEST_PRIORITY), - origin.caller().clone(), - *call, - )?; - Ok(()) - } - - #[pallet::weight(::WeightInfo::change_named_priority(T::MaxScheduledPerBlock::get()))] - pub fn change_named_priority( - origin: OriginFor, - id: ScheduledId, - priority: schedule::Priority, - ) -> DispatchResult { - T::PrioritySetOrigin::ensure_origin(origin.clone())?; - let origin = ::RuntimeOrigin::from(origin); - Self::do_change_named_priority(origin.caller().clone(), id, priority) - } - } -} - -impl Pallet { - #[cfg(feature = "try-runtime")] - pub fn pre_migrate_to_v3() -> Result<(), &'static str> { - Ok(()) - } - - #[cfg(feature = "try-runtime")] - pub fn post_migrate_to_v3() -> Result<(), &'static str> { - use frame_support::dispatch::GetStorageVersion; - - assert!(Self::current_storage_version() == 3); - for k in Agenda::::iter_keys() { - let _ = Agenda::::try_get(k).map_err(|()| "Invalid item in Agenda")?; - } - Ok(()) - } - - /// Helper to migrate scheduler when the pallet origin type has changed. - pub fn migrate_origin + codec::Decode>() { - Agenda::::translate::< - Vec, T::BlockNumber, OldOrigin, T::AccountId>>>, - _, - >(|_, agenda| { - Some( - agenda - .into_iter() - .map(|schedule| { - schedule.map(|schedule| Scheduled { - maybe_id: schedule.maybe_id, - priority: schedule.priority, - call: schedule.call, - maybe_periodic: schedule.maybe_periodic, - origin: schedule.origin.into(), - _phantom: Default::default(), - }) - }) - .collect::>(), - ) - }); - } - - fn resolve_time(when: DispatchTime) -> Result { - let now = frame_system::Pallet::::block_number(); - - let when = match when { - DispatchTime::At(x) => x, - // The current block has already completed it's scheduled tasks, so - // Schedule the task at lest one block after this current block. - DispatchTime::After(x) => now.saturating_add(x).saturating_add(One::one()), - }; - - if when <= now { - return Err(Error::::TargetBlockNumberInPast.into()); - } - - Ok(when) - } - - fn do_schedule_named( - id: ScheduledId, - when: DispatchTime, - maybe_periodic: Option>, - priority: schedule::Priority, - origin: T::PalletsOrigin, - call: CallOrHashOf, - ) -> Result, DispatchError> { - // ensure id it is unique - if Lookup::::contains_key(&id) { - return Err(Error::::FailedToSchedule)?; - } - - let when = Self::resolve_time(when)?; - - call.ensure_requested::(); - - // sanitize maybe_periodic - let maybe_periodic = maybe_periodic - .filter(|p| p.1 > 1 && !p.0.is_zero()) - // Remove one from the number of repetitions since we will schedule one now. - .map(|(p, c)| (p, c - 1)); - - let s = Scheduled { - maybe_id: Some(id.clone()), - priority, - call: call.clone(), - maybe_periodic, - origin: origin.clone(), - _phantom: Default::default(), - }; - - // reserve balance for periodic execution - // let sender = - // ensure_signed(<::Origin as From>::from(origin).into())?; - // let repeats = match maybe_periodic { - // Some(p) => p.1, - // None => 1, - // }; - // let _ = T::CallExecutor::reserve_balance( - // id.clone(), - // sender, - // call.as_value().unwrap().clone(), - // repeats, - // ); - - Agenda::::append(when, Some(s)); - let index = Agenda::::decode_len(when).unwrap_or(1) as u32 - 1; - let address = (when, index); - Lookup::::insert(&id, &address); - Self::deposit_event(Event::Scheduled { when, index }); - - Ok(address) - } - - fn do_cancel_named(origin: Option, id: ScheduledId) -> DispatchResult { - Lookup::::try_mutate_exists(id, |lookup| -> DispatchResult { - if let Some((when, index)) = lookup.take() { - let i = index as usize; - Agenda::::try_mutate(when, |agenda| -> DispatchResult { - if let Some(s) = agenda.get_mut(i) { - if let (Some(ref o), Some(ref s)) = (origin.clone(), s.borrow()) { - if matches!( - T::OriginPrivilegeCmp::cmp_privilege(o, &s.origin), - Some(Ordering::Less) | None - ) { - return Err(BadOrigin.into()); - } - // release balance reserve - // let sender = ensure_signed( - // <::Origin as From>::from( - // origin.unwrap(), - // ) - // .into(), - // )?; - // let _ = T::CallExecutor::cancel_reserve(id, sender); - - s.call.ensure_unrequested::(); - } - *s = None; - } - Ok(()) - })?; - - Self::deposit_event(Event::Canceled { when, index }); - Ok(()) - } else { - Err(Error::::NotFound)? - } - }) - } - - fn do_change_named_priority( - origin: T::PalletsOrigin, - id: ScheduledId, - priority: schedule::Priority, - ) -> DispatchResult { - match Lookup::::get(id) { - Some((when, index)) => { - let i = index as usize; - Agenda::::try_mutate(when, |agenda| { - if let Some(Some(s)) = agenda.get_mut(i) { - if matches!( - T::OriginPrivilegeCmp::cmp_privilege(&origin, &s.origin), - Some(Ordering::Less) | None - ) { - return Err(BadOrigin.into()); - } - - s.priority = priority; - Self::deposit_event(Event::PriorityChanged { - when, - index, - priority, - }); - } - Ok(()) - }) - } - None => Err(Error::::NotFound.into()), - } - } -} --- a/pallets/scheduler/src/weights.rs +++ /dev/null @@ -1,369 +0,0 @@ -// Template adopted from https://github.com/paritytech/substrate/blob/master/.maintain/frame-weight-template.hbs - -//! Autogenerated weights for pallet_unique_scheduler -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-09-14, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 - -// Executed Command: -// target/release/unique-collator -// benchmark -// pallet -// --pallet -// pallet-unique-scheduler -// --wasm-execution -// compiled -// --extrinsic -// * -// --template -// .maintain/frame-weight-template.hbs -// --steps=50 -// --repeat=80 -// --heap-pages=4096 -// --output=./pallets/scheduler/src/weights.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] -#![allow(clippy::unnecessary_cast)] - -use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; -use sp_std::marker::PhantomData; - -/// Weight functions needed for pallet_unique_scheduler. -pub trait WeightInfo { - fn on_initialize_periodic_named_resolved(s: u32, ) -> Weight; - fn on_initialize_named_resolved(s: u32, ) -> Weight; - fn on_initialize_periodic(s: u32, ) -> Weight; - fn on_initialize_periodic_resolved(s: u32, ) -> Weight; - fn on_initialize_aborted(s: u32, ) -> Weight; - fn on_initialize_named_aborted(s: u32, ) -> Weight; - fn on_initialize_named(s: u32, ) -> Weight; - fn on_initialize(s: u32, ) -> Weight; - fn on_initialize_resolved(s: u32, ) -> Weight; - fn schedule_named(s: u32, ) -> Weight; - fn cancel_named(s: u32, ) -> Weight; - fn change_named_priority(s: u32, ) -> Weight; -} - -/// Weights for pallet_unique_scheduler using the Substrate node and recommended hardware. -pub struct SubstrateWeight(PhantomData); -impl WeightInfo for SubstrateWeight { - // Storage: Scheduler Agenda (r:2 w:2) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:1 w:1) - fn on_initialize_periodic_named_resolved(s: u32, ) -> Weight { - Weight::from_ref_time(26_641_000) - // Standard Error: 9_000 - .saturating_add(Weight::from_ref_time(8_547_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(s as u64))) - .saturating_add(T::DbWeight::get().writes(4 as u64)) - .saturating_add(T::DbWeight::get().writes((2 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_named_resolved(s: u32, ) -> Weight { - Weight::from_ref_time(23_941_000) - // Standard Error: 17_000 - .saturating_add(Weight::from_ref_time(5_282_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(4 as u64)) - .saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:2 w:2) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:1 w:1) - fn on_initialize_periodic(s: u32, ) -> Weight { - Weight::from_ref_time(24_858_000) - // Standard Error: 7_000 - .saturating_add(Weight::from_ref_time(8_657_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(s as u64))) - .saturating_add(T::DbWeight::get().writes(4 as u64)) - .saturating_add(T::DbWeight::get().writes((2 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:2 w:2) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:1 w:1) - fn on_initialize_periodic_resolved(s: u32, ) -> Weight { - Weight::from_ref_time(25_515_000) - // Standard Error: 14_000 - .saturating_add(Weight::from_ref_time(8_656_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(s as u64))) - .saturating_add(T::DbWeight::get().writes(4 as u64)) - .saturating_add(T::DbWeight::get().writes((2 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_aborted(s: u32, ) -> Weight { - Weight::from_ref_time(7_584_000) - // Standard Error: 1_000 - .saturating_add(Weight::from_ref_time(2_065_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(2 as u64)) - .saturating_add(T::DbWeight::get().writes(2 as u64)) - .saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_named_aborted(s: u32, ) -> Weight { - Weight::from_ref_time(25_552_000) - // Standard Error: 4_000 - .saturating_add(Weight::from_ref_time(5_187_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(4 as u64)) - .saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_named(s: u32, ) -> Weight { - Weight::from_ref_time(8_980_000) - // Standard Error: 12_000 - .saturating_add(Weight::from_ref_time(2_050_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(2 as u64)) - .saturating_add(T::DbWeight::get().writes(2 as u64)) - .saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize(s: u32, ) -> Weight { - Weight::from_ref_time(24_482_000) - // Standard Error: 4_000 - .saturating_add(Weight::from_ref_time(5_249_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(4 as u64)) - .saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_resolved(s: u32, ) -> Weight { - Weight::from_ref_time(25_187_000) - // Standard Error: 4_000 - .saturating_add(Weight::from_ref_time(5_216_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(4 as u64)) - .saturating_add(T::DbWeight::get().writes(4 as u64)) - .saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Lookup (r:1 w:1) - // Storage: Scheduler Agenda (r:1 w:1) - fn schedule_named(s: u32, ) -> Weight { - Weight::from_ref_time(17_316_000) - // Standard Error: 3_000 - .saturating_add(Weight::from_ref_time(82_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(2 as u64)) - .saturating_add(T::DbWeight::get().writes(2 as u64)) - } - // Storage: Scheduler Lookup (r:1 w:1) - // Storage: Scheduler Agenda (r:1 w:1) - fn cancel_named(s: u32, ) -> Weight { - Weight::from_ref_time(15_652_000) - // Standard Error: 1_000 - .saturating_add(Weight::from_ref_time(436_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(2 as u64)) - .saturating_add(T::DbWeight::get().writes(2 as u64)) - } - // Storage: Scheduler Lookup (r:1 w:1) - // Storage: Scheduler Agenda (r:1 w:1) - fn change_named_priority(s: u32, ) -> Weight { - Weight::from_ref_time(8_642_000) - // Standard Error: 0 - .saturating_add(Weight::from_ref_time(431_000).saturating_mul(s as u64)) - .saturating_add(T::DbWeight::get().reads(2 as u64)) - .saturating_add(T::DbWeight::get().writes(2 as u64)) - } -} - -// For backwards compatibility and tests -impl WeightInfo for () { - // Storage: Scheduler Agenda (r:2 w:2) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:1 w:1) - fn on_initialize_periodic_named_resolved(s: u32, ) -> Weight { - Weight::from_ref_time(26_641_000) - // Standard Error: 9_000 - .saturating_add(Weight::from_ref_time(8_547_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(s as u64))) - .saturating_add(RocksDbWeight::get().writes(4 as u64)) - .saturating_add(RocksDbWeight::get().writes((2 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_named_resolved(s: u32, ) -> Weight { - Weight::from_ref_time(23_941_000) - // Standard Error: 17_000 - .saturating_add(Weight::from_ref_time(5_282_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(4 as u64)) - .saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:2 w:2) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:1 w:1) - fn on_initialize_periodic(s: u32, ) -> Weight { - Weight::from_ref_time(24_858_000) - // Standard Error: 7_000 - .saturating_add(Weight::from_ref_time(8_657_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(s as u64))) - .saturating_add(RocksDbWeight::get().writes(4 as u64)) - .saturating_add(RocksDbWeight::get().writes((2 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:2 w:2) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:1 w:1) - fn on_initialize_periodic_resolved(s: u32, ) -> Weight { - Weight::from_ref_time(25_515_000) - // Standard Error: 14_000 - .saturating_add(Weight::from_ref_time(8_656_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(s as u64))) - .saturating_add(RocksDbWeight::get().writes(4 as u64)) - .saturating_add(RocksDbWeight::get().writes((2 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_aborted(s: u32, ) -> Weight { - Weight::from_ref_time(7_584_000) - // Standard Error: 1_000 - .saturating_add(Weight::from_ref_time(2_065_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(2 as u64)) - .saturating_add(RocksDbWeight::get().writes(2 as u64)) - .saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_named_aborted(s: u32, ) -> Weight { - Weight::from_ref_time(25_552_000) - // Standard Error: 4_000 - .saturating_add(Weight::from_ref_time(5_187_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(4 as u64)) - .saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_named(s: u32, ) -> Weight { - Weight::from_ref_time(8_980_000) - // Standard Error: 12_000 - .saturating_add(Weight::from_ref_time(2_050_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(2 as u64)) - .saturating_add(RocksDbWeight::get().writes(2 as u64)) - .saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize(s: u32, ) -> Weight { - Weight::from_ref_time(24_482_000) - // Standard Error: 4_000 - .saturating_add(Weight::from_ref_time(5_249_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(4 as u64)) - .saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Agenda (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: System AllExtrinsicsLen (r:1 w:1) - // Storage: System BlockWeight (r:1 w:1) - // Storage: Configuration WeightToFeeCoefficientOverride (r:1 w:0) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_resolved(s: u32, ) -> Weight { - Weight::from_ref_time(25_187_000) - // Standard Error: 4_000 - .saturating_add(Weight::from_ref_time(5_216_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(4 as u64)) - .saturating_add(RocksDbWeight::get().writes(4 as u64)) - .saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(s as u64))) - } - // Storage: Scheduler Lookup (r:1 w:1) - // Storage: Scheduler Agenda (r:1 w:1) - fn schedule_named(s: u32, ) -> Weight { - Weight::from_ref_time(17_316_000) - // Standard Error: 3_000 - .saturating_add(Weight::from_ref_time(82_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(2 as u64)) - .saturating_add(RocksDbWeight::get().writes(2 as u64)) - } - // Storage: Scheduler Lookup (r:1 w:1) - // Storage: Scheduler Agenda (r:1 w:1) - fn cancel_named(s: u32, ) -> Weight { - Weight::from_ref_time(15_652_000) - // Standard Error: 1_000 - .saturating_add(Weight::from_ref_time(436_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(2 as u64)) - .saturating_add(RocksDbWeight::get().writes(2 as u64)) - } - - // Storage: Scheduler Lookup (r:1 w:1) - // Storage: Scheduler Agenda (r:1 w:1) - fn change_named_priority(s: u32, ) -> Weight { - Weight::from_ref_time(8_642_000) - // Standard Error: 0 - .saturating_add(Weight::from_ref_time(431_000).saturating_mul(s as u64)) - .saturating_add(RocksDbWeight::get().reads(2 as u64)) - .saturating_add(RocksDbWeight::get().writes(2 as u64)) - } -} --- a/runtime/common/config/pallets/scheduler.rs +++ b/runtime/common/config/pallets/scheduler.rs @@ -25,7 +25,7 @@ use codec::Decode; use crate::{ runtime_common::{scheduler::SchedulerPaymentExecutor, config::substrate::RuntimeBlockWeights}, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, OriginCaller, Balances, + Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, OriginCaller, }; use pallet_unique_scheduler_v2::ScheduledEnsureOriginSuccess; use up_common::types::AccountId; @@ -69,23 +69,6 @@ } } } - -// impl pallet_unique_scheduler::Config for Runtime { -// type RuntimeEvent = RuntimeEvent; -// type RuntimeOrigin = RuntimeOrigin; -// type Currency = Balances; -// type PalletsOrigin = OriginCaller; -// type RuntimeCall = RuntimeCall; -// type MaximumWeight = MaximumSchedulerWeight; -// type ScheduleOrigin = EnsureSignedOrRoot; -// type PrioritySetOrigin = EnsureRoot; -// type MaxScheduledPerBlock = MaxScheduledPerBlock; -// type WeightInfo = (); -// type CallExecutor = SchedulerPaymentExecutor; -// type OriginPrivilegeCmp = EqualOrRootOnly; -// type PreimageProvider = (); -// type NoPreimagePostponement = NoPreimagePostponement; -// } impl pallet_unique_scheduler_v2::Config for Runtime { type RuntimeEvent = RuntimeEvent; --- a/runtime/common/scheduler.rs +++ b/runtime/common/scheduler.rs @@ -15,25 +15,21 @@ // along with Unique Network. If not, see . use frame_support::{ - traits::NamedReservableCurrency, dispatch::{GetDispatchInfo, PostDispatchInfo, DispatchInfo}, }; use sp_runtime::{ traits::{Dispatchable, Applyable, Member}, generic::Era, transaction_validity::TransactionValidityError, - DispatchErrorWithPostInfo, DispatchError, + DispatchErrorWithPostInfo, }; use codec::Encode; -use crate::{Runtime, RuntimeCall, RuntimeOrigin, Balances, maintenance}; -use up_common::types::{AccountId, Balance}; +use crate::{Runtime, RuntimeCall, RuntimeOrigin, maintenance}; +use up_common::types::AccountId; use fp_self_contained::SelfContainedCall; use pallet_unique_scheduler_v2::DispatchCall; use pallet_transaction_payment::ChargeTransactionPayment; -// type SponsorshipChargeTransactionPayment = -// pallet_charge_transaction::ChargeTransactionPayment; - /// The SignedExtension to the basic transaction logic. pub type SignedExtraScheduler = ( frame_system::CheckSpecVersion, @@ -106,97 +102,3 @@ extrinsic.apply::(&dispatch_info, len) } } - -// impl -// DispatchCall for SchedulerPaymentExecutor -// where -// ::Call: Member -// + Dispatchable -// + SelfContainedCall -// + GetDispatchInfo -// + From>, -// SelfContainedSignedInfo: Send + Sync + 'static, -// Call: From<::Call> -// + From<::Call> -// + SelfContainedCall, -// sp_runtime::AccountId32: From<::AccountId>, -// { -// fn dispatch_call( -// signer: Option<::AccountId>, -// call: ::Call, -// ) -> Result< -// Result>, -// TransactionValidityError, -// > { -// let dispatch_info = call.get_dispatch_info(); -// let len = call.encoded_size(); - -// let signed = match signer { -// Some(signer) => fp_self_contained::CheckedSignature::Signed( -// signer.clone().into(), -// get_signed_extras(signer.into()), -// ), -// None => fp_self_contained::CheckedSignature::Unsigned, -// }; - -// let extrinsic = fp_self_contained::CheckedExtrinsic::< -// AccountId, -// Call, -// SignedExtraScheduler, -// SelfContainedSignedInfo, -// > { -// signed, -// function: call.into(), -// }; - -// extrinsic.apply::(&dispatch_info, len) -// } - -// fn reserve_balance( -// id: [u8; 16], -// sponsor: ::AccountId, -// call: ::Call, -// count: u32, -// ) -> Result<(), DispatchError> { -// let dispatch_info = call.get_dispatch_info(); -// let weight: Balance = -// SponsorshipChargeTransactionPayment::traditional_fee(0, &dispatch_info, 0) -// .saturating_mul(count.into()); - -// >::reserve_named( -// &id, -// &(sponsor.into()), -// weight, -// ) -// } - -// fn pay_for_call( -// id: [u8; 16], -// sponsor: ::AccountId, -// call: ::Call, -// ) -> Result { -// let dispatch_info = call.get_dispatch_info(); -// let weight: Balance = -// SponsorshipChargeTransactionPayment::traditional_fee(0, &dispatch_info, 0); -// Ok( -// >::unreserve_named( -// &id, -// &(sponsor.into()), -// weight, -// ), -// ) -// } - -// fn cancel_reserve( -// id: [u8; 16], -// sponsor: ::AccountId, -// ) -> Result { -// Ok( -// >::unreserve_named( -// &id, -// &(sponsor.into()), -// u128::MAX, -// ), -// ) -// } -// } --- a/runtime/opal/Cargo.toml +++ b/runtime/opal/Cargo.toml @@ -41,7 +41,6 @@ 'pallet-unique/runtime-benchmarks', 'pallet-inflation/runtime-benchmarks', 'pallet-app-promotion/runtime-benchmarks', - 'pallet-unique-scheduler/runtime-benchmarks', 'pallet-unique-scheduler-v2/runtime-benchmarks', 'pallet-xcm/runtime-benchmarks', 'sp-runtime/runtime-benchmarks', @@ -72,7 +71,6 @@ 'cumulus-pallet-dmp-queue/try-runtime', 'pallet-inflation/try-runtime', 'pallet-unique/try-runtime', - 'pallet-unique-scheduler/try-runtime', 'pallet-configuration/try-runtime', 'pallet-charge-transaction/try-runtime', 'pallet-common/try-runtime', @@ -143,7 +141,6 @@ 'pallet-proxy-rmrk-core/std', 'pallet-proxy-rmrk-equip/std', 'pallet-unique/std', - 'pallet-unique-scheduler/std', 'pallet-unique-scheduler-v2/std', 'pallet-charge-transaction/std', 'up-data-structs/std', @@ -476,7 +473,6 @@ pallet-nonfungible = { default-features = false, path = "../../pallets/nonfungible" } pallet-proxy-rmrk-core = { default-features = false, path = "../../pallets/proxy-rmrk-core", package = "pallet-rmrk-core" } pallet-proxy-rmrk-equip = { default-features = false, path = "../../pallets/proxy-rmrk-equip", package = "pallet-rmrk-equip" } -pallet-unique-scheduler = { path = '../../pallets/scheduler', default-features = false } pallet-charge-transaction = { git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.30", package = "pallet-template-transaction-payment", default-features = false, version = "3.0.0" } pallet-unique-scheduler-v2 = { path = '../../pallets/scheduler-v2', default-features = false } pallet-evm-migration = { path = '../../pallets/evm-migration', default-features = false } --- a/runtime/quartz/Cargo.toml +++ b/runtime/quartz/Cargo.toml @@ -40,7 +40,6 @@ 'pallet-unique/runtime-benchmarks', 'pallet-foreign-assets/runtime-benchmarks', 'pallet-inflation/runtime-benchmarks', - 'pallet-unique-scheduler/runtime-benchmarks', 'pallet-xcm/runtime-benchmarks', 'sp-runtime/runtime-benchmarks', 'xcm-builder/runtime-benchmarks', @@ -70,7 +69,6 @@ 'cumulus-pallet-dmp-queue/try-runtime', 'pallet-inflation/try-runtime', 'pallet-unique/try-runtime', - 'pallet-unique-scheduler/try-runtime', 'pallet-configuration/try-runtime', 'pallet-charge-transaction/try-runtime', 'pallet-common/try-runtime', @@ -139,7 +137,6 @@ 'pallet-proxy-rmrk-core/std', 'pallet-proxy-rmrk-equip/std', 'pallet-unique/std', - 'pallet-unique-scheduler/std', 'pallet-charge-transaction/std', 'up-data-structs/std', 'sp-api/std', @@ -475,7 +472,6 @@ pallet-nonfungible = { default-features = false, path = "../../pallets/nonfungible" } pallet-proxy-rmrk-core = { default-features = false, path = "../../pallets/proxy-rmrk-core", package = "pallet-rmrk-core" } pallet-proxy-rmrk-equip = { default-features = false, path = "../../pallets/proxy-rmrk-equip", package = "pallet-rmrk-equip" } -pallet-unique-scheduler = { path = '../../pallets/scheduler', default-features = false } # pallet-contract-helpers = { path = '../pallets/contract-helpers', default-features = false, version = '0.1.0' } pallet-charge-transaction = { git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.30", package = "pallet-template-transaction-payment", default-features = false, version = "3.0.0" } pallet-evm-migration = { path = '../../pallets/evm-migration', default-features = false } --- a/runtime/unique/Cargo.toml +++ b/runtime/unique/Cargo.toml @@ -40,7 +40,6 @@ 'pallet-unique/runtime-benchmarks', 'pallet-foreign-assets/runtime-benchmarks', 'pallet-inflation/runtime-benchmarks', - 'pallet-unique-scheduler/runtime-benchmarks', 'pallet-xcm/runtime-benchmarks', 'sp-runtime/runtime-benchmarks', 'xcm-builder/runtime-benchmarks', @@ -71,7 +70,6 @@ 'cumulus-pallet-dmp-queue/try-runtime', 'pallet-inflation/try-runtime', 'pallet-unique/try-runtime', - 'pallet-unique-scheduler/try-runtime', 'pallet-configuration/try-runtime', 'pallet-charge-transaction/try-runtime', 'pallet-common/try-runtime', @@ -140,7 +138,6 @@ 'pallet-proxy-rmrk-core/std', 'pallet-proxy-rmrk-equip/std', 'pallet-unique/std', - 'pallet-unique-scheduler/std', 'pallet-charge-transaction/std', 'up-data-structs/std', 'sp-api/std', @@ -469,7 +466,6 @@ pallet-nonfungible = { default-features = false, path = "../../pallets/nonfungible" } pallet-proxy-rmrk-core = { default-features = false, path = "../../pallets/proxy-rmrk-core", package = "pallet-rmrk-core" } pallet-proxy-rmrk-equip = { default-features = false, path = "../../pallets/proxy-rmrk-equip", package = "pallet-rmrk-equip" } -pallet-unique-scheduler = { path = '../../pallets/scheduler', default-features = false } # pallet-contract-helpers = { path = '../pallets/contract-helpers', default-features = false, version = '0.1.0' } pallet-charge-transaction = { git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.30", package = "pallet-template-transaction-payment", default-features = false, version = "3.0.0" } pallet-evm-migration = { path = '../../pallets/evm-migration', default-features = false } -- gitstuff