Runtime: Polkadot Fellowship promotion/demotion periods, members activity and salaries (#2607)

* core fellowship

* core fellowship weights

* salary

* weights

* fellowship pot

* registration period 15 days

* use treasury account for salary pay, promotion origin

* decision period for tracks 30 days

* docs

* comment

* Couple of fixes and some refactoring

* Alter curves to be a bit more conservative

* Use `PayOverXcm` for fellowship salary payments

* Docs and remove unneeded code

* Fixes

* Move Fellowship stuff in line with whitepaper

* fix: induction by a single Fellow (not proficient)

* doc fix

* renames, pallet index, allow unpaid for salary pallet

* Fix budget units

* Fixes

* Test sovereign account for Fellowship salaries

* Nice address test

* Fixes

* test for PayOverXcm setup

* Update parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs

Co-authored-by: Bastian Köcher <git@kchr.de>

---------

Co-authored-by: Gav <gavin@parity.io>
Co-authored-by: Bastian Köcher <git@kchr.de>
This commit is contained in:
Muharem Ismailov
2023-06-06 12:48:15 +02:00
committed by GitHub
parent 1d395b6c99
commit ce0dcd5741
19 changed files with 1177 additions and 177 deletions
+31
View File
@@ -1887,6 +1887,35 @@ dependencies = [
"unicode-width",
]
[[package]]
name = "collectives-polkadot-it"
version = "0.1.0"
dependencies = [
"asset-hub-polkadot-runtime",
"collectives-polkadot-runtime",
"cumulus-pallet-xcmp-queue",
"frame-support",
"frame-system",
"integration-tests-common",
"pallet-assets",
"pallet-balances",
"pallet-core-fellowship",
"pallet-salary",
"pallet-xcm",
"parachains-common",
"parity-scale-codec",
"polkadot-core-primitives",
"polkadot-parachain",
"polkadot-runtime",
"polkadot-runtime-parachains",
"sp-core",
"sp-runtime",
"sp-weights",
"xcm",
"xcm-emulator",
"xcm-executor",
]
[[package]]
name = "collectives-polkadot-runtime"
version = "1.0.0"
@@ -1915,11 +1944,13 @@ dependencies = [
"pallet-balances",
"pallet-collator-selection",
"pallet-collective",
"pallet-core-fellowship",
"pallet-multisig",
"pallet-preimage",
"pallet-proxy",
"pallet-ranked-collective",
"pallet-referenda",
"pallet-salary",
"pallet-scheduler",
"pallet-session",
"pallet-timestamp",
+1
View File
@@ -56,6 +56,7 @@ members = [
"parachains/integration-tests/emulated/assets/asset-hub-kusama",
"parachains/integration-tests/emulated/assets/asset-hub-polkadot",
"parachains/integration-tests/emulated/assets/asset-hub-westend",
"parachains/integration-tests/emulated/collectives/collectives-polkadot",
"test/client",
"test/relay-sproof-builder",
"test/relay-validation-worker-provider",
@@ -0,0 +1,39 @@
[package]
name = "collectives-polkadot-it"
version = "0.1.0"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2021"
description = "Polkadot Collectives parachain runtime integration tests based on xcm-emulator"
[dev-dependencies]
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
# Substrate
sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" }
frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" }
frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" }
sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" }
sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" }
pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" }
pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" }
pallet-core-fellowship = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" }
pallet-salary = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" }
# Polkadot
polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" }
polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" }
polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" }
polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" }
xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" }
xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" }
pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" }
# Cumulus
parachains-common = { path = "../../../../common" }
cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../../pallets/xcmp-queue" }
collectives-polkadot-runtime = { path = "../../../../runtimes/collectives/collectives-polkadot" }
asset-hub-polkadot-runtime = { path = "../../../../runtimes/assets/asset-hub-polkadot" }
# Local
xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" }
integration-tests-common = { default-features = false, path = "../../common" }
@@ -0,0 +1,30 @@
// Copyright Parity Technologies (UK) Ltd.
// This file is part of Cumulus.
// Cumulus 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.
// Cumulus 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 Cumulus. If not, see <http://www.gnu.org/licenses/>.
//! Collectives Parachain integration tests based on xcm-emulator.
#![cfg(test)]
pub use frame_support::assert_ok;
pub use integration_tests_common::{
constants::accounts::ALICE, AccountId, AssetHubPolkadot as AssetHub,
AssetHubPolkadotPallet as AssetHubPallet, Collectives, CollectivesPallet, Polkadot,
PolkadotMockNet,
};
pub use xcm::prelude::*;
pub use xcm_emulator::{assert_expected_events, Parachain};
mod tests;
@@ -0,0 +1,80 @@
// Copyright Parity Technologies (UK) Ltd.
// This file is part of Cumulus.
// Cumulus 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.
// Cumulus 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 Cumulus. If not, see <http://www.gnu.org/licenses/>.
//! Integration tests concerning the Fellowship.
use crate::*;
use collectives_polkadot_runtime::fellowship::FellowshipSalaryPaymaster;
use frame_support::traits::{
fungibles::{Create, Mutate},
tokens::Pay,
};
use sp_core::crypto::Ss58Codec;
use xcm_emulator::{Network, TestExt};
#[test]
fn pay_salary() {
let asset_id: u32 = 1984;
let pay_from: AccountId =
<AccountId as Ss58Codec>::from_string("13w7NdvSR1Af8xsQTArDtZmVvjE8XhWNdL4yed3iFHrUNCnS")
.unwrap();
let pay_to = Polkadot::account_id_of(ALICE);
let pay_amount = 9000;
PolkadotMockNet::_init();
PolkadotMockNet::reset();
AssetHub::execute_with(|| {
type AssetHubAssets = <AssetHub as AssetHubPallet>::Assets;
assert_ok!(<AssetHubAssets as Create<_>>::create(
asset_id,
pay_to.clone(),
true,
pay_amount / 2
));
assert_ok!(<AssetHubAssets as Mutate<_>>::mint_into(asset_id, &pay_from, pay_amount * 2));
});
Collectives::execute_with(|| {
type RuntimeEvent = <Collectives as Parachain>::RuntimeEvent;
assert_ok!(FellowshipSalaryPaymaster::pay(&pay_to, (), pay_amount));
assert_expected_events!(
Collectives,
vec![
RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {},
]
);
});
AssetHub::execute_with(|| {
type RuntimeEvent = <AssetHub as Parachain>::RuntimeEvent;
assert_expected_events!(
AssetHub,
vec![
RuntimeEvent::Assets(pallet_assets::Event::Transferred { asset_id: id, from, to, amount }) => {
asset_id: id == &asset_id,
from: from == &pay_from,
to: to == &pay_to,
amount: amount == &pay_amount,
},
RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::Success { .. }) => {},
]
);
});
}
@@ -0,0 +1,17 @@
// Copyright Parity Technologies (UK) Ltd.
// This file is part of Cumulus.
// Cumulus 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.
// Cumulus 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 Cumulus. If not, see <http://www.gnu.org/licenses/>.
mod fellowship;
@@ -34,11 +34,12 @@ use xcm::latest::prelude::*;
use xcm_builder::{
AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses,
AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter,
DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FungiblesAdapter, IsConcrete,
LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative,
SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative,
SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId,
UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic,
DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal, DescribeFamily,
EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NativeAsset,
NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative,
SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32,
SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents,
WeightInfoBounds, WithComputedOrigin, WithUniqueTopic,
};
use xcm_executor::{traits::WithOriginFilter, XcmExecutor};
@@ -66,6 +67,8 @@ pub type LocationToAccountId = (
SiblingParachainConvertsVia<Sibling, AccountId>,
// Straight up local `AccountId32` origins just alias directly to `AccountId`.
AccountId32Aliases<RelayNetwork, AccountId>,
// Foreign locations alias into accounts according to a hash of their standard description.
HashedDescription<AccountId, DescribeFamily<DescribeAllTerminal>>,
);
/// Means for transacting the native currency on this chain.
@@ -34,11 +34,12 @@ use xcm::latest::prelude::*;
use xcm_builder::{
AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses,
AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter,
DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FungiblesAdapter, IsConcrete,
LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative,
SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative,
SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents,
WeightInfoBounds, WithComputedOrigin,
DenyReserveTransferToRelayChain, DenyThenTry, DescribeFamily, DescribePalletTerminal,
EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NativeAsset,
NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative,
SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32,
SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds,
WithComputedOrigin,
};
use xcm_executor::{traits::WithOriginFilter, XcmExecutor};
@@ -66,6 +67,9 @@ pub type LocationToAccountId = (
SiblingParachainConvertsVia<Sibling, AccountId>,
// Straight up local `AccountId32` origins just alias directly to `AccountId`.
AccountId32Aliases<RelayNetwork, AccountId>,
// Foreign chain account alias into local accounts according to a hash of their standard
// description.
HashedDescription<AccountId, DescribeFamily<DescribePalletTerminal>>,
);
/// Means for transacting the native currency on this chain.
@@ -177,6 +181,9 @@ match_types! {
pub type FellowsPlurality: impl Contains<MultiLocation> = {
MultiLocation { parents: 1, interior: X2(Parachain(1001), Plurality { id: BodyId::Technical, ..}) }
};
pub type FellowshipSalaryPallet: impl Contains<MultiLocation> = {
MultiLocation { parents: 1, interior: X2(Parachain(1001), PalletInstance(64)) }
};
}
/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly
@@ -355,7 +362,11 @@ pub type Barrier = DenyThenTry<
// If the message is one that immediately attemps to pay for execution, then allow it.
AllowTopLevelPaidExecutionFrom<Everything>,
// Parent, its pluralities (i.e. governance bodies), and the Fellows plurality get free execution.
AllowExplicitUnpaidExecutionFrom<(ParentOrParentsPlurality, FellowsPlurality)>,
AllowExplicitUnpaidExecutionFrom<(
ParentOrParentsPlurality,
FellowsPlurality,
FellowshipSalaryPallet,
)>,
// Subscriptions for version tracking are OK.
AllowSubscriptionsFrom<ParentOrSiblings>,
),
@@ -498,3 +509,18 @@ impl pallet_assets::BenchmarkHelper<MultiLocation> for XcmBenchmarkHelper {
MultiLocation { parents: 1, interior: X1(Parachain(id)) }
}
}
#[test]
fn foreign_pallet_has_correct_local_account() {
use sp_core::crypto::{Ss58AddressFormat, Ss58Codec};
use xcm_executor::traits::ConvertLocation;
const COLLECTIVES_PARAID: u32 = 1001;
const FELLOWSHIP_SALARY_PALLET_ID: u8 = 64;
let fellowship_salary =
(Parent, Parachain(COLLECTIVES_PARAID), PalletInstance(FELLOWSHIP_SALARY_PALLET_ID));
let account = LocationToAccountId::convert_location(&fellowship_salary.into()).unwrap();
let polkadot = Ss58AddressFormat::try_from("polkadot").unwrap();
let address = Ss58Codec::to_ss58check_with_version(&account, polkadot);
assert_eq!(address, "13w7NdvSR1Af8xsQTArDtZmVvjE8XhWNdL4yed3iFHrUNCnS");
}
@@ -36,6 +36,8 @@ pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/parityt
pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" }
pallet-referenda = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" }
pallet-ranked-collective = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" }
pallet-core-fellowship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" }
pallet-salary = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" }
sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" }
sp-arithmetic = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" }
sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" }
@@ -103,6 +105,8 @@ runtime-benchmarks = [
"pallet-preimage/runtime-benchmarks",
"pallet-referenda/runtime-benchmarks",
"pallet-ranked-collective/runtime-benchmarks",
"pallet-core-fellowship/runtime-benchmarks",
"pallet-salary/runtime-benchmarks",
]
try-runtime = [
"cumulus-pallet-aura-ext/try-runtime",
@@ -131,6 +135,8 @@ try-runtime = [
"pallet-preimage/try-runtime",
"pallet-referenda/try-runtime",
"pallet-ranked-collective/try-runtime",
"pallet-core-fellowship/try-runtime",
"pallet-salary/try-runtime",
]
std = [
"codec/std",
@@ -187,4 +193,6 @@ std = [
"pallet-referenda/std",
"pallet-ranked-collective/std",
"substrate-wasm-builder",
"pallet-core-fellowship/std",
"pallet-salary/std",
]
@@ -16,8 +16,8 @@
pub mod account {
use frame_support::PalletId;
/// Relay Chain treasury pallet id, used to convert into AccountId
pub const RELAY_TREASURY_PALLET_ID: PalletId = PalletId(*b"py/trsry");
/// Polkadot treasury pallet id, used to convert into AccountId
pub const POLKADOT_TREASURY_PALLET_ID: PalletId = PalletId(*b"py/trsry");
/// Alliance pallet ID.
/// It is used as a temporarily place to deposit a slashed imbalance
/// before the teleport to the Treasury.
@@ -19,42 +19,38 @@
pub(crate) mod migration;
mod origins;
mod tracks;
use cumulus_primitives_core::Junction::GeneralIndex;
use frame_system::EnsureNever;
pub use origins::{
pallet_origins as pallet_fellowship_origins, Fellows, FellowshipCandidates, FellowshipExperts,
FellowshipMasters,
pallet_origins as pallet_fellowship_origins, Architects, EnsureCanPromoteTo, EnsureCanRetainAt,
EnsureFellowship, Fellows, Masters, Members,
};
use xcm_builder::{AliasesIntoAccountId32, LocatableAssetId, PayOverXcm};
use crate::{
constants, impls::ToParentTreasury, weights, AccountId, Balance, Balances, BlockNumber,
FellowshipReferenda, GovernanceLocation, Preimage, RelayTreasuryAccount, Runtime, RuntimeCall,
RuntimeEvent, Scheduler, DAYS,
constants, impls::ToParentTreasury, weights, AccountId, Balance, Balances, FellowshipReferenda,
GovernanceLocation, PolkadotTreasuryAccount, Preimage, Runtime, RuntimeCall, RuntimeEvent,
Scheduler, DAYS,
};
use frame_support::{
parameter_types,
traits::{EitherOf, MapSuccess, TryMapSuccess},
traits::{EitherOf, EitherOfDiverse, MapSuccess},
};
use pallet_xcm::{EnsureXcm, IsVoiceOfBody};
use polkadot_runtime_constants::xcm::body::FELLOWSHIP_ADMIN_INDEX;
use sp_arithmetic::traits::CheckedSub;
use sp_core::ConstU32;
use sp_runtime::{
morph_types,
traits::{AccountIdConversion, ConstU16, Replace, TypedGet},
};
use polkadot_runtime_constants::{time::HOURS, xcm::body::FELLOWSHIP_ADMIN_INDEX};
use sp_core::{ConstU128, ConstU32};
use sp_runtime::traits::{AccountIdConversion, ConstU16, ConvertToValue, Replace};
use xcm::latest::BodyId;
use self::origins::EnsureFellowship;
/// The Fellowship members' ranks.
pub mod ranks {
use pallet_ranked_collective::Rank;
pub const CANDIDATES: Rank = 0;
pub const DAN_1: Rank = 1;
pub const DAN_1: Rank = 1; // aka Members.
pub const DAN_2: Rank = 2;
pub const DAN_3: Rank = 3; // aka Fellows.
pub const DAN_4: Rank = 4;
pub const DAN_5: Rank = 5; // aka Experts.
pub const DAN_4: Rank = 4; // aka Architects.
pub const DAN_5: Rank = 5;
pub const DAN_6: Rank = 6;
pub const DAN_7: Rank = 7; // aka Masters.
pub const DAN_8: Rank = 8;
@@ -62,9 +58,6 @@ pub mod ranks {
}
parameter_types! {
pub const AlarmInterval: BlockNumber = 1;
pub const SubmissionDeposit: Balance = 0;
pub const UndecidingTimeout: BlockNumber = 7 * DAYS;
// Referenda pallet account, used to temporarily deposit slashed imbalance before teleporting.
pub ReferendaPalletAccount: AccountId = constants::account::REFERENDA_PALLET_ID.into_account_truncating();
pub const FellowshipAdminBodyId: BodyId = BodyId::Index(FELLOWSHIP_ADMIN_INDEX);
@@ -80,63 +73,146 @@ impl pallet_referenda::Config<FellowshipReferendaInstance> for Runtime {
type RuntimeEvent = RuntimeEvent;
type Scheduler = Scheduler;
type Currency = Balances;
// Fellows can submit proposals.
type SubmitOrigin =
pallet_ranked_collective::EnsureMember<Runtime, FellowshipCollectiveInstance, 1>;
type CancelOrigin = FellowshipExperts;
type KillOrigin = FellowshipMasters;
type Slash = ToParentTreasury<RelayTreasuryAccount, ReferendaPalletAccount, Runtime>;
pallet_ranked_collective::EnsureMember<Runtime, FellowshipCollectiveInstance, 3>;
type CancelOrigin = Architects;
type KillOrigin = Masters;
type Slash = ToParentTreasury<PolkadotTreasuryAccount, ReferendaPalletAccount, Runtime>;
type Votes = pallet_ranked_collective::Votes;
type Tally = pallet_ranked_collective::TallyOf<Runtime, FellowshipCollectiveInstance>;
type SubmissionDeposit = SubmissionDeposit;
type SubmissionDeposit = ConstU128<0>;
type MaxQueued = ConstU32<100>;
type UndecidingTimeout = UndecidingTimeout;
type AlarmInterval = AlarmInterval;
type UndecidingTimeout = ConstU32<{ 7 * DAYS }>;
type AlarmInterval = ConstU32<1>;
type Tracks = tracks::TracksInfo;
type Preimages = Preimage;
}
pub type FellowshipCollectiveInstance = pallet_ranked_collective::Instance1;
morph_types! {
/// A `TryMorph` implementation to reduce a scalar by a particular amount, checking for
/// underflow.
pub type CheckedReduceBy<N: TypedGet>: TryMorph = |r: N::Type| -> Result<N::Type, ()> {
r.checked_sub(&N::get()).ok_or(())
} where N::Type: CheckedSub;
}
impl pallet_ranked_collective::Config<FellowshipCollectiveInstance> for Runtime {
type WeightInfo = weights::pallet_ranked_collective::WeightInfo<Runtime>;
type RuntimeEvent = RuntimeEvent;
// Promotion is by any of:
// - Root can promote arbitrarily.
// - the FellowshipAdmin origin (i.e. token holder referendum);
// - a vote by the rank *above* the new rank.
type PromoteOrigin = EitherOf<
frame_system::EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>,
EitherOf<
MapSuccess<
EnsureXcm<IsVoiceOfBody<GovernanceLocation, FellowshipAdminBodyId>>,
Replace<ConstU16<9>>,
>,
TryMapSuccess<EnsureFellowship, CheckedReduceBy<ConstU16<1>>>,
>,
>;
// Promotions and the induction of new members are serviced by `FellowshipCore` pallet instance.
type PromoteOrigin = EnsureNever<pallet_ranked_collective::Rank>;
// Demotion is by any of:
// - Root can demote arbitrarily.
// - the FellowshipAdmin origin (i.e. token holder referendum);
// - a vote by the rank two above the current rank.
type DemoteOrigin = EitherOf<
frame_system::EnsureRootWithSuccess<Self::AccountId, ConstU16<65535>>,
EitherOf<
MapSuccess<
EnsureXcm<IsVoiceOfBody<GovernanceLocation, FellowshipAdminBodyId>>,
Replace<ConstU16<9>>,
>,
TryMapSuccess<EnsureFellowship, CheckedReduceBy<ConstU16<2>>>,
frame_system::EnsureRootWithSuccess<Self::AccountId, ConstU16<{ ranks::DAN_9 }>>,
MapSuccess<
EnsureXcm<IsVoiceOfBody<GovernanceLocation, FellowshipAdminBodyId>>,
Replace<ConstU16<{ ranks::DAN_9 }>>,
>,
>;
type Polls = FellowshipReferenda;
type MinRankOfClass = sp_runtime::traits::Identity;
type MinRankOfClass = tracks::MinRankOfClass;
type VoteWeight = pallet_ranked_collective::Geometric;
}
pub type FellowshipCoreInstance = pallet_core_fellowship::Instance1;
impl pallet_core_fellowship::Config<FellowshipCoreInstance> for Runtime {
type WeightInfo = weights::pallet_core_fellowship::WeightInfo<Runtime>;
type RuntimeEvent = RuntimeEvent;
type Members = pallet_ranked_collective::Pallet<Runtime, FellowshipCollectiveInstance>;
type Balance = Balance;
// Parameters are set by any of:
// - Root;
// - the FellowshipAdmin origin (i.e. token holder referendum);
// - a vote among all Fellows.
type ParamsOrigin = EitherOfDiverse<
EnsureXcm<IsVoiceOfBody<GovernanceLocation, FellowshipAdminBodyId>>,
Fellows,
>;
// Induction (creating a candidate) is by any of:
// - Root;
// - the FellowshipAdmin origin (i.e. token holder referendum);
// - a single Fellow;
// - a vote among all Members.
type InductOrigin = EitherOfDiverse<
EnsureXcm<IsVoiceOfBody<GovernanceLocation, FellowshipAdminBodyId>>,
EitherOfDiverse<
pallet_ranked_collective::EnsureMember<
Runtime,
FellowshipCollectiveInstance,
{ ranks::DAN_3 },
>,
Members,
>,
>;
// Approval (rank-retention) of a Member's current rank is by any of:
// - Root;
// - the FellowshipAdmin origin (i.e. token holder referendum);
// - a vote by the rank two above the current rank for all retention up to the Master rank.
type ApproveOrigin = EitherOf<
MapSuccess<
EnsureXcm<IsVoiceOfBody<GovernanceLocation, FellowshipAdminBodyId>>,
Replace<ConstU16<{ ranks::DAN_9 }>>,
>,
EnsureCanRetainAt,
>;
// Promotion is by any of:
// - Root can promote arbitrarily.
// - the FellowshipAdmin origin (i.e. token holder referendum);
// - a vote by the rank two above the new rank for all promotions up to the Master rank.
type PromoteOrigin = EitherOf<
MapSuccess<
EnsureXcm<IsVoiceOfBody<GovernanceLocation, FellowshipAdminBodyId>>,
Replace<ConstU16<{ ranks::DAN_9 }>>,
>,
EnsureCanPromoteTo,
>;
type EvidenceSize = ConstU32<65536>;
}
pub type FellowshipSalaryInstance = pallet_salary::Instance1;
use xcm::prelude::*;
parameter_types! {
pub AssetHub: MultiLocation = (Parent, Parachain(1000)).into();
pub AssetHubUsdtId: AssetId = (PalletInstance(50), GeneralIndex(1984)).into();
pub UsdtAsset: LocatableAssetId = LocatableAssetId {
location: AssetHub::get(),
asset_id: AssetHubUsdtId::get(),
};
// The interior location on AssetHub for the paying account. This is the Fellowship Salary
// pallet instance (which sits at index 64). This sovereign account will need funding.
pub Interior: InteriorMultiLocation = PalletInstance(64).into();
}
const USDT_UNITS: u128 = 1_000_000;
/// [`PayOverXcm`] setup to pay the Fellowship salary on the AssetHub in USDT.
pub type FellowshipSalaryPaymaster = PayOverXcm<
Interior,
crate::xcm_config::XcmRouter,
crate::PolkadotXcm,
ConstU32<{ 6 * HOURS }>,
AccountId,
(),
ConvertToValue<UsdtAsset>,
AliasesIntoAccountId32<(), AccountId>,
>;
impl pallet_salary::Config<FellowshipSalaryInstance> for Runtime {
type WeightInfo = weights::pallet_salary::WeightInfo<Runtime>;
type RuntimeEvent = RuntimeEvent;
type Paymaster = FellowshipSalaryPaymaster;
type Members = pallet_ranked_collective::Pallet<Runtime, FellowshipCollectiveInstance>;
#[cfg(not(feature = "runtime-benchmarks"))]
type Salary = pallet_core_fellowship::Pallet<Runtime, FellowshipCoreInstance>;
#[cfg(feature = "runtime-benchmarks")]
type Salary = frame_support::traits::tokens::ConvertRank<
crate::impls::benchmarks::RankToSalary<Balances>,
>;
// 15 days to register for a salary payment.
type RegistrationPeriod = ConstU32<{ 15 * DAYS }>;
// 15 days to claim the salary payment.
type PayoutPeriod = ConstU32<{ 15 * DAYS }>;
// Total monthly salary budget.
type Budget = ConstU128<{ 100_000 * USDT_UNITS }>;
}
@@ -34,32 +34,62 @@ pub mod pallet_origins {
#[derive(PartialEq, Eq, Clone, MaxEncodedLen, Encode, Decode, TypeInfo, RuntimeDebug)]
#[pallet::origin]
pub enum Origin {
/// Origin commanded by any members of the Polkadot Fellowship (no Dan grade needed).
FellowshipCandidates,
/// Origin commanded by Polkadot Fellows (3rd Dan fellows or greater).
Fellows,
/// Origin commanded by Polkadot Experts (5th Dan fellows or greater).
FellowshipExperts,
/// Origin commanded by Polkadot Masters (7th Dan fellows of greater).
FellowshipMasters,
/// Origin commanded by rank 1 of the Polkadot Fellowship and with a success of 1.
Fellowship1Dan,
/// Origin commanded by rank 2 of the Polkadot Fellowship and with a success of 2.
/// Origin aggregated through weighted votes of those with rank 1 or above; `Success` is 1.
Members,
/// Origin aggregated through weighted votes of those with rank 2 or above; `Success` is 2.
Fellowship2Dan,
/// Origin commanded by rank 3 of the Polkadot Fellowship and with a success of 3.
Fellowship3Dan,
/// Origin commanded by rank 4 of the Polkadot Fellowship and with a success of 4.
Fellowship4Dan,
/// Origin commanded by rank 5 of the Polkadot Fellowship and with a success of 5.
/// Origin aggregated through weighted votes of those with rank 3 or above; `Success` is 3.
Fellows,
/// Origin aggregated through weighted votes of those with rank 4 or above; `Success` is 4.
Architects,
/// Origin aggregated through weighted votes of those with rank 5 or above; `Success` is 5.
Fellowship5Dan,
/// Origin commanded by rank 6 of the Polkadot Fellowship and with a success of 6.
/// Origin aggregated through weighted votes of those with rank 6 or above; `Success` is 6.
Fellowship6Dan,
/// Origin commanded by rank 7 of the Polkadot Fellowship and with a success of 7.
Fellowship7Dan,
/// Origin commanded by rank 8 of the Polkadot Fellowship and with a success of 8.
/// Origin aggregated through weighted votes of those with rank 7 or above; `Success` is 7.
Masters,
/// Origin aggregated through weighted votes of those with rank 8 or above; `Success` is 8.
Fellowship8Dan,
/// Origin commanded by rank 9 of the Polkadot Fellowship and with a success of 9.
/// Origin aggregated through weighted votes of those with rank 9 or above; `Success` is 9.
Fellowship9Dan,
/// Origin aggregated through weighted votes of those with rank 3 or above when voting on
/// a fortnight-long track; `Success` is 1.
RetainAt1Dan,
/// Origin aggregated through weighted votes of those with rank 4 or above when voting on
/// a fortnight-long track; `Success` is 2.
RetainAt2Dan,
/// Origin aggregated through weighted votes of those with rank 5 or above when voting on
/// a fortnight-long track; `Success` is 3.
RetainAt3Dan,
/// Origin aggregated through weighted votes of those with rank 6 or above when voting on
/// a fortnight-long track; `Success` is 4.
RetainAt4Dan,
/// Origin aggregated through weighted votes of those with rank 7 or above when voting on
/// a fortnight-long track; `Success` is 5.
RetainAt5Dan,
/// Origin aggregated through weighted votes of those with rank 8 or above when voting on
/// a fortnight-long track; `Success` is 6.
RetainAt6Dan,
/// Origin aggregated through weighted votes of those with rank 3 or above when voting on
/// a month-long track; `Success` is 1.
PromoteTo1Dan,
/// Origin aggregated through weighted votes of those with rank 4 or above when voting on
/// a month-long track; `Success` is 2.
PromoteTo2Dan,
/// Origin aggregated through weighted votes of those with rank 5 or above when voting on
/// a month-long track; `Success` is 3.
PromoteTo3Dan,
/// Origin aggregated through weighted votes of those with rank 6 or above when voting on
/// a month-long track; `Success` is 4.
PromoteTo4Dan,
/// Origin aggregated through weighted votes of those with rank 7 or above when voting on
/// a month-long track; `Success` is 5.
PromoteTo5Dan,
/// Origin aggregated through weighted votes of those with rank 8 or above when voting on
/// a month-long track; `Success` is 6.
PromoteTo6Dan,
}
macro_rules! decl_unit_ensures {
@@ -93,10 +123,10 @@ pub mod pallet_origins {
() => {}
}
decl_unit_ensures!(
FellowshipCandidates: Rank = ranks::CANDIDATES,
Members: Rank = ranks::DAN_1,
Fellows: Rank = ranks::DAN_3,
FellowshipExperts: Rank = ranks::DAN_5,
FellowshipMasters: Rank = ranks::DAN_7,
Architects: Rank = ranks::DAN_4,
Masters: Rank = ranks::DAN_7,
);
macro_rules! decl_ensure {
@@ -132,17 +162,45 @@ pub mod pallet_origins {
}
}
// Fellowship origin indicating weighted voting from at least the rank of `Success` on a
// week-long track.
decl_ensure! {
pub type EnsureFellowship: EnsureOrigin<Success = Rank> {
Fellowship1Dan = ranks::DAN_1,
Members = ranks::DAN_1,
Fellowship2Dan = ranks::DAN_2,
Fellowship3Dan = ranks::DAN_3,
Fellowship4Dan = ranks::DAN_4,
Fellows = ranks::DAN_3,
Architects = ranks::DAN_4,
Fellowship5Dan = ranks::DAN_5,
Fellowship6Dan = ranks::DAN_6,
Fellowship7Dan = ranks::DAN_7,
Masters = ranks::DAN_7,
Fellowship8Dan = ranks::DAN_8,
Fellowship9Dan = ranks::DAN_9,
}
}
// Fellowship origin indicating weighted voting from at least the rank of `Success + 2` on
// a fortnight-long track; needed for Fellowship retention voting.
decl_ensure! {
pub type EnsureCanRetainAt: EnsureOrigin<Success = Rank> {
RetainAt1Dan = ranks::DAN_1,
RetainAt2Dan = ranks::DAN_2,
RetainAt3Dan = ranks::DAN_3,
RetainAt4Dan = ranks::DAN_4,
RetainAt5Dan = ranks::DAN_5,
RetainAt6Dan = ranks::DAN_6,
}
}
// Fellowship origin indicating weighted voting from at least the rank of `Success + 2` on
// a month-long track; needed for Fellowship promotion voting.
decl_ensure! {
pub type EnsureCanPromoteTo: EnsureOrigin<Success = Rank> {
PromoteTo1Dan = ranks::DAN_1,
PromoteTo2Dan = ranks::DAN_2,
PromoteTo3Dan = ranks::DAN_3,
PromoteTo4Dan = ranks::DAN_4,
PromoteTo5Dan = ranks::DAN_5,
PromoteTo6Dan = ranks::DAN_6,
}
}
}
@@ -16,8 +16,9 @@
//! Track configurations for Fellowship.
use crate::{Balance, BlockNumber, RuntimeOrigin, DAYS, DOLLARS, MINUTES};
use sp_runtime::Perbill;
use crate::{Balance, BlockNumber, RuntimeOrigin, DAYS, DOLLARS, HOURS, MINUTES};
use pallet_ranked_collective::Rank;
use sp_runtime::{traits::Convert, Perbill};
/// Referendum `TrackId` type.
pub type TrackId = u16;
@@ -26,57 +27,105 @@ pub type TrackId = u16;
pub mod constants {
use super::TrackId;
pub const CANDIDATES: TrackId = 0;
// Regular tracks (7 days) used for general operations. The required rank for voting is the
// same as that which is named (and also the track ID).
pub const MEMBERS: TrackId = 1;
pub const PROFICIENTS: TrackId = 2;
pub const FELLOWS: TrackId = 3;
pub const SENIOR_FELLOWS: TrackId = 4;
pub const EXPERTS: TrackId = 5;
pub const SENIOR_EXPERTS: TrackId = 6;
pub const ARCHITECTS: TrackId = 4;
pub const ARCHITECTS_ADEPT: TrackId = 5;
pub const GRAND_ARCHITECTS: TrackId = 6;
pub const MASTERS: TrackId = 7;
pub const SENIOR_MASTERS: TrackId = 8;
pub const MASTERS_CONSTANT: TrackId = 8;
pub const GRAND_MASTERS: TrackId = 9;
// Longer tracks (14 days) used for rank retention. These require a rank of two more than the
// grade at which they retain (as per the whitepaper). This works out as the track ID minus 8.
pub const RETAIN_AT_1DAN: TrackId = 11;
pub const RETAIN_AT_2DAN: TrackId = 12;
pub const RETAIN_AT_3DAN: TrackId = 13;
pub const RETAIN_AT_4DAN: TrackId = 14;
pub const RETAIN_AT_5DAN: TrackId = 15;
pub const RETAIN_AT_6DAN: TrackId = 16;
// Longest tracks (30 days) used for promotions. These require a rank of two more than the
// grade to which they promote (as per the whitepaper). This works out as the track ID minus 18.
pub const PROMOTE_TO_1DAN: TrackId = 21;
pub const PROMOTE_TO_2DAN: TrackId = 22;
pub const PROMOTE_TO_3DAN: TrackId = 23;
pub const PROMOTE_TO_4DAN: TrackId = 24;
pub const PROMOTE_TO_5DAN: TrackId = 25;
pub const PROMOTE_TO_6DAN: TrackId = 26;
}
/// Convert the track ID (defined above) into the minimum rank (i.e. fellowship Dan grade) required
/// to vote on the track.
pub struct MinRankOfClass;
impl Convert<TrackId, Rank> for MinRankOfClass {
fn convert(a: TrackId) -> Rank {
match a {
// Just a regular vote: the track ID is conveniently the same as the minimum rank.
regular @ 1..=9 => regular,
// A retention vote; the track ID turns out to be 8 more than the minimum required rank.
retention @ 11..=16 => retention - 8,
// A promotion vote; the track ID turns out to be 18 more than the minimum required rank.
promotion @ 21..=26 => promotion - 18,
_ => Rank::max_value(),
}
}
}
const RETAIN_MAX_DECIDING: u32 = 25;
const RETAIN_DECISION_DEPOSIT: Balance = 5 * DOLLARS;
const RETAIN_PREPARE_PERIOD: BlockNumber = 0;
const RETAIN_DECISION_PERIOD: BlockNumber = 14 * DAYS;
const RETAIN_CONFIRM_PERIOD: BlockNumber = 1 * HOURS;
const RETAIN_MIN_ENACTMENT_PERIOD: BlockNumber = 0;
const RETAIN_MIN_APPROVAL: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(60),
ceil: Perbill::from_percent(100),
};
const RETAIN_MIN_SUPPORT: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(10),
ceil: Perbill::from_percent(100),
};
const PROMOTE_MAX_DECIDING: u32 = 10;
const PROMOTE_DECISION_DEPOSIT: Balance = 5 * DOLLARS;
const PROMOTE_PREPARE_PERIOD: BlockNumber = 0;
const PROMOTE_DECISION_PERIOD: BlockNumber = 30 * DAYS;
const PROMOTE_CONFIRM_PERIOD: BlockNumber = 1 * HOURS;
const PROMOTE_MIN_ENACTMENT_PERIOD: BlockNumber = 0;
const PROMOTE_MIN_APPROVAL: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(60),
ceil: Perbill::from_percent(100),
};
const PROMOTE_MIN_SUPPORT: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(10),
ceil: Perbill::from_percent(100),
};
pub struct TracksInfo;
impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
type Id = TrackId;
type RuntimeOrigin = <RuntimeOrigin as frame_support::traits::OriginTrait>::PalletsOrigin;
fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo<Balance, BlockNumber>)] {
use constants as tracks;
static DATA: [(TrackId, pallet_referenda::TrackInfo<Balance, BlockNumber>); 10] = [
(
tracks::CANDIDATES,
pallet_referenda::TrackInfo {
name: "candidates",
max_deciding: 10,
decision_deposit: 100 * DOLLARS,
prepare_period: 30 * MINUTES,
decision_period: 7 * DAYS,
confirm_period: 30 * MINUTES,
min_enactment_period: MINUTES,
min_approval: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(50),
ceil: Perbill::from_percent(100),
},
min_support: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(0),
ceil: Perbill::from_percent(50),
},
},
),
static DATA: [(TrackId, pallet_referenda::TrackInfo<Balance, BlockNumber>); 21] = [
(
tracks::MEMBERS,
pallet_referenda::TrackInfo {
name: "members",
max_deciding: 10,
decision_deposit: 10 * DOLLARS,
decision_deposit: 5 * DOLLARS,
prepare_period: 30 * MINUTES,
decision_period: 7 * DAYS,
confirm_period: 30 * MINUTES,
min_enactment_period: MINUTES,
min_enactment_period: 5 * MINUTES,
min_approval: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(50),
@@ -85,20 +134,20 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
min_support: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(0),
ceil: Perbill::from_percent(50),
ceil: Perbill::from_percent(100),
},
},
),
(
tracks::PROFICIENTS,
pallet_referenda::TrackInfo {
name: "proficients",
name: "proficient members",
max_deciding: 10,
decision_deposit: 10 * DOLLARS,
decision_deposit: 5 * DOLLARS,
prepare_period: 30 * MINUTES,
decision_period: 7 * DAYS,
confirm_period: 30 * MINUTES,
min_enactment_period: MINUTES,
min_enactment_period: 5 * MINUTES,
min_approval: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(50),
@@ -107,7 +156,7 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
min_support: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(0),
ceil: Perbill::from_percent(50),
ceil: Perbill::from_percent(100),
},
},
),
@@ -116,11 +165,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
pallet_referenda::TrackInfo {
name: "fellows",
max_deciding: 10,
decision_deposit: 10 * DOLLARS,
decision_deposit: 5 * DOLLARS,
prepare_period: 30 * MINUTES,
decision_period: 7 * DAYS,
confirm_period: 30 * MINUTES,
min_enactment_period: MINUTES,
min_enactment_period: 5 * MINUTES,
min_approval: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(50),
@@ -129,20 +178,20 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
min_support: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(0),
ceil: Perbill::from_percent(50),
ceil: Perbill::from_percent(100),
},
},
),
(
tracks::SENIOR_FELLOWS,
tracks::ARCHITECTS,
pallet_referenda::TrackInfo {
name: "senior fellows",
name: "architects",
max_deciding: 10,
decision_deposit: 10 * DOLLARS,
decision_deposit: 5 * DOLLARS,
prepare_period: 30 * MINUTES,
decision_period: 7 * DAYS,
confirm_period: 30 * MINUTES,
min_enactment_period: MINUTES,
min_enactment_period: 5 * MINUTES,
min_approval: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(50),
@@ -151,20 +200,20 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
min_support: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(0),
ceil: Perbill::from_percent(50),
ceil: Perbill::from_percent(100),
},
},
),
(
tracks::EXPERTS,
tracks::ARCHITECTS_ADEPT,
pallet_referenda::TrackInfo {
name: "experts",
name: "architects adept",
max_deciding: 10,
decision_deposit: DOLLARS,
decision_deposit: 5 * DOLLARS,
prepare_period: 30 * MINUTES,
decision_period: 7 * DAYS,
confirm_period: 30 * MINUTES,
min_enactment_period: MINUTES,
min_enactment_period: 5 * MINUTES,
min_approval: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(50),
@@ -173,20 +222,20 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
min_support: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(0),
ceil: Perbill::from_percent(50),
ceil: Perbill::from_percent(100),
},
},
),
(
tracks::SENIOR_EXPERTS,
tracks::GRAND_ARCHITECTS,
pallet_referenda::TrackInfo {
name: "senior experts",
name: "grand architects",
max_deciding: 10,
decision_deposit: DOLLARS,
decision_deposit: 5 * DOLLARS,
prepare_period: 30 * MINUTES,
decision_period: 7 * DAYS,
confirm_period: 30 * MINUTES,
min_enactment_period: MINUTES,
min_enactment_period: 5 * MINUTES,
min_approval: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(50),
@@ -195,7 +244,7 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
min_support: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(0),
ceil: Perbill::from_percent(50),
ceil: Perbill::from_percent(100),
},
},
),
@@ -204,11 +253,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
pallet_referenda::TrackInfo {
name: "masters",
max_deciding: 10,
decision_deposit: DOLLARS,
decision_deposit: 5 * DOLLARS,
prepare_period: 30 * MINUTES,
decision_period: 7 * DAYS,
confirm_period: 30 * MINUTES,
min_enactment_period: MINUTES,
min_enactment_period: 5 * MINUTES,
min_approval: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(50),
@@ -217,20 +266,20 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
min_support: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(0),
ceil: Perbill::from_percent(50),
ceil: Perbill::from_percent(100),
},
},
),
(
tracks::SENIOR_MASTERS,
tracks::MASTERS_CONSTANT,
pallet_referenda::TrackInfo {
name: "senior masters",
name: "masters constant",
max_deciding: 10,
decision_deposit: DOLLARS,
decision_deposit: 5 * DOLLARS,
prepare_period: 30 * MINUTES,
decision_period: 7 * DAYS,
confirm_period: 30 * MINUTES,
min_enactment_period: MINUTES,
min_enactment_period: 5 * MINUTES,
min_approval: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(50),
@@ -239,7 +288,7 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
min_support: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(0),
ceil: Perbill::from_percent(50),
ceil: Perbill::from_percent(100),
},
},
),
@@ -248,11 +297,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
pallet_referenda::TrackInfo {
name: "grand masters",
max_deciding: 10,
decision_deposit: DOLLARS,
decision_deposit: 5 * DOLLARS,
prepare_period: 30 * MINUTES,
decision_period: 7 * DAYS,
confirm_period: 30 * MINUTES,
min_enactment_period: MINUTES,
min_enactment_period: 5 * MINUTES,
min_approval: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(50),
@@ -261,10 +310,178 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
min_support: pallet_referenda::Curve::LinearDecreasing {
length: Perbill::from_percent(100),
floor: Perbill::from_percent(0),
ceil: Perbill::from_percent(50),
ceil: Perbill::from_percent(100),
},
},
),
(
tracks::RETAIN_AT_1DAN,
pallet_referenda::TrackInfo {
name: "retain at I Dan",
max_deciding: RETAIN_MAX_DECIDING,
decision_deposit: RETAIN_DECISION_DEPOSIT,
prepare_period: RETAIN_PREPARE_PERIOD,
decision_period: RETAIN_DECISION_PERIOD,
confirm_period: RETAIN_CONFIRM_PERIOD,
min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD,
min_approval: RETAIN_MIN_APPROVAL,
min_support: RETAIN_MIN_SUPPORT,
},
),
(
tracks::RETAIN_AT_2DAN,
pallet_referenda::TrackInfo {
name: "retain at II Dan",
max_deciding: RETAIN_MAX_DECIDING,
decision_deposit: RETAIN_DECISION_DEPOSIT,
prepare_period: RETAIN_PREPARE_PERIOD,
decision_period: RETAIN_DECISION_PERIOD,
confirm_period: RETAIN_CONFIRM_PERIOD,
min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD,
min_approval: RETAIN_MIN_APPROVAL,
min_support: RETAIN_MIN_SUPPORT,
},
),
(
tracks::RETAIN_AT_3DAN,
pallet_referenda::TrackInfo {
name: "retain at III Dan",
max_deciding: RETAIN_MAX_DECIDING,
decision_deposit: RETAIN_DECISION_DEPOSIT,
prepare_period: RETAIN_PREPARE_PERIOD,
decision_period: RETAIN_DECISION_PERIOD,
confirm_period: RETAIN_CONFIRM_PERIOD,
min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD,
min_approval: RETAIN_MIN_APPROVAL,
min_support: RETAIN_MIN_SUPPORT,
},
),
(
tracks::RETAIN_AT_4DAN,
pallet_referenda::TrackInfo {
name: "retain at IV Dan",
max_deciding: RETAIN_MAX_DECIDING,
decision_deposit: RETAIN_DECISION_DEPOSIT,
prepare_period: RETAIN_PREPARE_PERIOD,
decision_period: RETAIN_DECISION_PERIOD,
confirm_period: RETAIN_CONFIRM_PERIOD,
min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD,
min_approval: RETAIN_MIN_APPROVAL,
min_support: RETAIN_MIN_SUPPORT,
},
),
(
tracks::RETAIN_AT_5DAN,
pallet_referenda::TrackInfo {
name: "retain at V Dan",
max_deciding: RETAIN_MAX_DECIDING,
decision_deposit: RETAIN_DECISION_DEPOSIT,
prepare_period: RETAIN_PREPARE_PERIOD,
decision_period: RETAIN_DECISION_PERIOD,
confirm_period: RETAIN_CONFIRM_PERIOD,
min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD,
min_approval: RETAIN_MIN_APPROVAL,
min_support: RETAIN_MIN_SUPPORT,
},
),
(
tracks::RETAIN_AT_6DAN,
pallet_referenda::TrackInfo {
name: "retain at VI Dan",
max_deciding: RETAIN_MAX_DECIDING,
decision_deposit: RETAIN_DECISION_DEPOSIT,
prepare_period: RETAIN_PREPARE_PERIOD,
decision_period: RETAIN_DECISION_PERIOD,
confirm_period: RETAIN_CONFIRM_PERIOD,
min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD,
min_approval: RETAIN_MIN_APPROVAL,
min_support: RETAIN_MIN_SUPPORT,
},
),
(
tracks::PROMOTE_TO_1DAN,
pallet_referenda::TrackInfo {
name: "promote to I Dan",
max_deciding: PROMOTE_MAX_DECIDING,
decision_deposit: PROMOTE_DECISION_DEPOSIT,
prepare_period: PROMOTE_PREPARE_PERIOD,
decision_period: PROMOTE_DECISION_PERIOD,
confirm_period: PROMOTE_CONFIRM_PERIOD,
min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD,
min_approval: PROMOTE_MIN_APPROVAL,
min_support: PROMOTE_MIN_SUPPORT,
},
),
(
tracks::PROMOTE_TO_2DAN,
pallet_referenda::TrackInfo {
name: "promote to II Dan",
max_deciding: PROMOTE_MAX_DECIDING,
decision_deposit: PROMOTE_DECISION_DEPOSIT,
prepare_period: PROMOTE_PREPARE_PERIOD,
decision_period: PROMOTE_DECISION_PERIOD,
confirm_period: PROMOTE_CONFIRM_PERIOD,
min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD,
min_approval: PROMOTE_MIN_APPROVAL,
min_support: PROMOTE_MIN_SUPPORT,
},
),
(
tracks::PROMOTE_TO_3DAN,
pallet_referenda::TrackInfo {
name: "promote to III Dan",
max_deciding: PROMOTE_MAX_DECIDING,
decision_deposit: PROMOTE_DECISION_DEPOSIT,
prepare_period: PROMOTE_PREPARE_PERIOD,
decision_period: PROMOTE_DECISION_PERIOD,
confirm_period: PROMOTE_CONFIRM_PERIOD,
min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD,
min_approval: PROMOTE_MIN_APPROVAL,
min_support: PROMOTE_MIN_SUPPORT,
},
),
(
tracks::PROMOTE_TO_4DAN,
pallet_referenda::TrackInfo {
name: "promote to IV Dan",
max_deciding: PROMOTE_MAX_DECIDING,
decision_deposit: PROMOTE_DECISION_DEPOSIT,
prepare_period: PROMOTE_PREPARE_PERIOD,
decision_period: PROMOTE_DECISION_PERIOD,
confirm_period: PROMOTE_CONFIRM_PERIOD,
min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD,
min_approval: PROMOTE_MIN_APPROVAL,
min_support: PROMOTE_MIN_SUPPORT,
},
),
(
tracks::PROMOTE_TO_5DAN,
pallet_referenda::TrackInfo {
name: "promote to V Dan",
max_deciding: PROMOTE_MAX_DECIDING,
decision_deposit: PROMOTE_DECISION_DEPOSIT,
prepare_period: PROMOTE_PREPARE_PERIOD,
decision_period: PROMOTE_DECISION_PERIOD,
confirm_period: PROMOTE_CONFIRM_PERIOD,
min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD,
min_approval: PROMOTE_MIN_APPROVAL,
min_support: PROMOTE_MIN_SUPPORT,
},
),
(
tracks::PROMOTE_TO_6DAN,
pallet_referenda::TrackInfo {
name: "promote to VI Dan",
max_deciding: PROMOTE_MAX_DECIDING,
decision_deposit: PROMOTE_DECISION_DEPOSIT,
prepare_period: PROMOTE_PREPARE_PERIOD,
decision_period: PROMOTE_DECISION_PERIOD,
confirm_period: PROMOTE_CONFIRM_PERIOD,
min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD,
min_approval: PROMOTE_MIN_APPROVAL,
min_support: PROMOTE_MIN_SUPPORT,
},
),
];
&DATA[..]
}
@@ -283,16 +500,30 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
}
match Origin::try_from(id.clone()) {
Ok(Origin::FellowshipCandidates) => Ok(tracks::CANDIDATES),
Ok(Origin::Fellowship1Dan) => Ok(tracks::MEMBERS),
Ok(Origin::Members) => Ok(tracks::MEMBERS),
Ok(Origin::Fellowship2Dan) => Ok(tracks::PROFICIENTS),
Ok(Origin::Fellowship3Dan) | Ok(Origin::Fellows) => Ok(tracks::FELLOWS),
Ok(Origin::Fellowship4Dan) => Ok(tracks::SENIOR_FELLOWS),
Ok(Origin::Fellowship5Dan) | Ok(Origin::FellowshipExperts) => Ok(tracks::EXPERTS),
Ok(Origin::Fellowship6Dan) => Ok(tracks::SENIOR_EXPERTS),
Ok(Origin::Fellowship7Dan | Origin::FellowshipMasters) => Ok(tracks::MASTERS),
Ok(Origin::Fellowship8Dan) => Ok(tracks::SENIOR_MASTERS),
Ok(Origin::Fellows) => Ok(tracks::FELLOWS),
Ok(Origin::Architects) => Ok(tracks::ARCHITECTS),
Ok(Origin::Fellowship5Dan) => Ok(tracks::ARCHITECTS_ADEPT),
Ok(Origin::Fellowship6Dan) => Ok(tracks::GRAND_ARCHITECTS),
Ok(Origin::Masters) => Ok(tracks::MASTERS),
Ok(Origin::Fellowship8Dan) => Ok(tracks::MASTERS_CONSTANT),
Ok(Origin::Fellowship9Dan) => Ok(tracks::GRAND_MASTERS),
Ok(Origin::RetainAt1Dan) => Ok(tracks::RETAIN_AT_1DAN),
Ok(Origin::RetainAt2Dan) => Ok(tracks::RETAIN_AT_2DAN),
Ok(Origin::RetainAt3Dan) => Ok(tracks::RETAIN_AT_3DAN),
Ok(Origin::RetainAt4Dan) => Ok(tracks::RETAIN_AT_4DAN),
Ok(Origin::RetainAt5Dan) => Ok(tracks::RETAIN_AT_5DAN),
Ok(Origin::RetainAt6Dan) => Ok(tracks::RETAIN_AT_6DAN),
Ok(Origin::PromoteTo1Dan) => Ok(tracks::PROMOTE_TO_1DAN),
Ok(Origin::PromoteTo2Dan) => Ok(tracks::PROMOTE_TO_2DAN),
Ok(Origin::PromoteTo3Dan) => Ok(tracks::PROMOTE_TO_3DAN),
Ok(Origin::PromoteTo4Dan) => Ok(tracks::PROMOTE_TO_4DAN),
Ok(Origin::PromoteTo5Dan) => Ok(tracks::PROMOTE_TO_5DAN),
Ok(Origin::PromoteTo6Dan) => Ok(tracks::PROMOTE_TO_6DAN),
_ => Err(()),
}
}
@@ -146,3 +146,23 @@ impl PrivilegeCmp<OriginCaller> for EqualOrGreatestRootCmp {
}
}
}
#[cfg(feature = "runtime-benchmarks")]
pub mod benchmarks {
use super::*;
use frame_support::traits::fungible;
use pallet_ranked_collective::Rank;
use parachains_common::{AccountId, Balance};
use sp_runtime::traits::Convert;
/// Rank to salary conversion helper type.`
pub struct RankToSalary<Fungible>(PhantomData<Fungible>);
impl<Fungible> Convert<Rank, Balance> for RankToSalary<Fungible>
where
Fungible: fungible::Inspect<AccountId, Balance = Balance>,
{
fn convert(r: Rank) -> Balance {
Balance::from(r).saturating_mul(Fungible::minimum_balance())
}
}
}
@@ -477,7 +477,7 @@ parameter_types! {
// The Alliance pallet account, used as a temporary place to deposit a slashed imbalance
// before the teleport to the Treasury.
pub AlliancePalletAccount: AccountId = constants::account::ALLIANCE_PALLET_ID.into_account_truncating();
pub RelayTreasuryAccount: AccountId = constants::account::RELAY_TREASURY_PALLET_ID.into_account_truncating();
pub PolkadotTreasuryAccount: AccountId = constants::account::POLKADOT_TREASURY_PALLET_ID.into_account_truncating();
// The number of blocks a member must wait between giving a retirement notice and retiring.
// Supposed to be greater than time required to `kick_member` with alliance motion.
pub const AllianceRetirementPeriod: BlockNumber = (90 * DAYS) + ALLIANCE_MOTION_DURATION;
@@ -490,7 +490,7 @@ impl pallet_alliance::Config for Runtime {
type MembershipManager = RootOrAllianceTwoThirdsMajority;
type AnnouncementOrigin = RootOrAllianceTwoThirdsMajority;
type Currency = Balances;
type Slashed = ToParentTreasury<RelayTreasuryAccount, AlliancePalletAccount, Runtime>;
type Slashed = ToParentTreasury<PolkadotTreasuryAccount, AlliancePalletAccount, Runtime>;
type InitializeMembers = AllianceMotion;
type MembershipChanged = AllianceMotion;
type RetirementPeriod = AllianceRetirementPeriod;
@@ -599,6 +599,10 @@ construct_runtime!(
// pub type FellowshipReferendaInstance = pallet_referenda::Instance1;
FellowshipReferenda: pallet_referenda::<Instance1>::{Pallet, Call, Storage, Event<T>} = 61,
FellowshipOrigins: pallet_fellowship_origins::{Origin} = 62,
// pub type FellowshipCoreInstance = pallet_core_fellowship::Instance1;
FellowshipCore: pallet_core_fellowship::<Instance1>::{Pallet, Call, Storage, Event<T>} = 63,
// pub type FellowshipSalaryInstance = pallet_salary::Instance1;
FellowshipSalary: pallet_salary::<Instance1>::{Pallet, Call, Storage, Event<T>} = 64,
}
);
@@ -667,6 +671,8 @@ mod benches {
[pallet_scheduler, Scheduler]
[pallet_referenda, FellowshipReferenda]
[pallet_ranked_collective, FellowshipCollective]
[pallet_core_fellowship, FellowshipCore]
[pallet_salary, FellowshipSalary]
);
}
@@ -6,11 +6,13 @@ pub mod pallet_alliance;
pub mod pallet_balances;
pub mod pallet_collator_selection;
pub mod pallet_collective;
pub mod pallet_core_fellowship;
pub mod pallet_multisig;
pub mod pallet_preimage;
pub mod pallet_proxy;
pub mod pallet_ranked_collective;
pub mod pallet_referenda;
pub mod pallet_salary;
pub mod pallet_scheduler;
pub mod pallet_session;
pub mod pallet_timestamp;
@@ -0,0 +1,222 @@
// Copyright Parity Technologies (UK) Ltd.
// This file is part of Cumulus.
// Cumulus 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.
// Cumulus 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 Cumulus. If not, see <http://www.gnu.org/licenses/>.
//! Autogenerated weights for `pallet_core_fellowship`
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
//! DATE: 2023-05-19, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! WORST CASE MAP SIZE: `1000000`
//! HOSTNAME: `cob`, CPU: `<UNKNOWN>`
//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024
// Executed Command:
// ./target/debug/polkadot-parachain
// benchmark
// pallet
// --chain=collectives-polkadot-dev
// --steps=2
// --repeat=1
// --pallet=pallet_core_fellowship
// --extrinsic=*
// --wasm-execution=compiled
// --heap-pages=4096
// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/
#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(unused_parens)]
#![allow(unused_imports)]
#![allow(missing_docs)]
use frame_support::{traits::Get, weights::Weight};
use core::marker::PhantomData;
/// Weight functions for `pallet_core_fellowship`.
pub struct WeightInfo<T>(PhantomData<T>);
impl<T: frame_system::Config> pallet_core_fellowship::WeightInfo for WeightInfo<T> {
/// Storage: FellowshipCore Params (r:0 w:1)
/// Proof: FellowshipCore Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen)
fn set_params() -> Weight {
// Proof Size summary in bytes:
// Measured: `0`
// Estimated: `0`
// Minimum execution time: 65_000_000 picoseconds.
Weight::from_parts(65_000_000, 0)
.saturating_add(Weight::from_parts(0, 0))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: FellowshipCore Member (r:1 w:1)
/// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen)
/// Storage: FellowshipCollective Members (r:1 w:1)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: FellowshipCore Params (r:1 w:0)
/// Proof: FellowshipCore Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen)
/// Storage: FellowshipCollective MemberCount (r:1 w:1)
/// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen)
/// Storage: FellowshipCollective IdToIndex (r:1 w:0)
/// Proof: FellowshipCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen)
/// Storage: FellowshipCore MemberEvidence (r:1 w:1)
/// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen)
fn bump_offboard() -> Weight {
// Proof Size summary in bytes:
// Measured: `1562`
// Estimated: `4532`
// Minimum execution time: 300_000_000 picoseconds.
Weight::from_parts(300_000_000, 0)
.saturating_add(Weight::from_parts(0, 4532))
.saturating_add(T::DbWeight::get().reads(6))
.saturating_add(T::DbWeight::get().writes(4))
}
/// Storage: FellowshipCore Member (r:1 w:1)
/// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen)
/// Storage: FellowshipCollective Members (r:1 w:1)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: FellowshipCore Params (r:1 w:0)
/// Proof: FellowshipCore Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen)
/// Storage: FellowshipCollective MemberCount (r:1 w:1)
/// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen)
/// Storage: FellowshipCollective IdToIndex (r:1 w:0)
/// Proof: FellowshipCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen)
/// Storage: FellowshipCore MemberEvidence (r:1 w:1)
/// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen)
fn bump_demote() -> Weight {
// Proof Size summary in bytes:
// Measured: `1672`
// Estimated: `4532`
// Minimum execution time: 339_000_000 picoseconds.
Weight::from_parts(339_000_000, 0)
.saturating_add(Weight::from_parts(0, 4532))
.saturating_add(T::DbWeight::get().reads(6))
.saturating_add(T::DbWeight::get().writes(4))
}
/// Storage: FellowshipCollective Members (r:1 w:0)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: FellowshipCore Member (r:1 w:1)
/// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen)
fn set_active() -> Weight {
// Proof Size summary in bytes:
// Measured: `427`
// Estimated: `3514`
// Minimum execution time: 150_000_000 picoseconds.
Weight::from_parts(150_000_000, 0)
.saturating_add(Weight::from_parts(0, 3514))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: FellowshipCore Member (r:1 w:1)
/// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen)
/// Storage: FellowshipCollective Members (r:1 w:1)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: FellowshipCollective MemberCount (r:1 w:1)
/// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen)
/// Storage: FellowshipCollective IndexToId (r:0 w:1)
/// Proof: FellowshipCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen)
/// Storage: FellowshipCollective IdToIndex (r:0 w:1)
/// Proof: FellowshipCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen)
fn induct() -> Weight {
// Proof Size summary in bytes:
// Measured: `185`
// Estimated: `3514`
// Minimum execution time: 166_000_000 picoseconds.
Weight::from_parts(166_000_000, 0)
.saturating_add(Weight::from_parts(0, 3514))
.saturating_add(T::DbWeight::get().reads(3))
.saturating_add(T::DbWeight::get().writes(5))
}
/// Storage: FellowshipCollective Members (r:1 w:1)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: FellowshipCore Member (r:1 w:1)
/// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen)
/// Storage: FellowshipCore Params (r:1 w:0)
/// Proof: FellowshipCore Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen)
/// Storage: FellowshipCollective MemberCount (r:1 w:1)
/// Proof: FellowshipCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen)
/// Storage: FellowshipCore MemberEvidence (r:1 w:1)
/// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen)
/// Storage: FellowshipCollective IndexToId (r:0 w:1)
/// Proof: FellowshipCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen)
/// Storage: FellowshipCollective IdToIndex (r:0 w:1)
/// Proof: FellowshipCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen)
fn promote() -> Weight {
// Proof Size summary in bytes:
// Measured: `1540`
// Estimated: `4532`
// Minimum execution time: 308_000_000 picoseconds.
Weight::from_parts(308_000_000, 0)
.saturating_add(Weight::from_parts(0, 4532))
.saturating_add(T::DbWeight::get().reads(5))
.saturating_add(T::DbWeight::get().writes(6))
}
/// Storage: FellowshipCollective Members (r:1 w:0)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: FellowshipCore Member (r:1 w:1)
/// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen)
/// Storage: FellowshipCore MemberEvidence (r:0 w:1)
/// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen)
fn offboard() -> Weight {
// Proof Size summary in bytes:
// Measured: `398`
// Estimated: `3514`
// Minimum execution time: 141_000_000 picoseconds.
Weight::from_parts(141_000_000, 0)
.saturating_add(Weight::from_parts(0, 3514))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(2))
}
/// Storage: FellowshipCore Member (r:1 w:1)
/// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen)
/// Storage: FellowshipCollective Members (r:1 w:0)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
fn import() -> Weight {
// Proof Size summary in bytes:
// Measured: `352`
// Estimated: `3514`
// Minimum execution time: 131_000_000 picoseconds.
Weight::from_parts(131_000_000, 0)
.saturating_add(Weight::from_parts(0, 3514))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: FellowshipCollective Members (r:1 w:0)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: FellowshipCore Member (r:1 w:1)
/// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen)
/// Storage: FellowshipCore MemberEvidence (r:1 w:1)
/// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen)
fn approve() -> Weight {
// Proof Size summary in bytes:
// Measured: `1518`
// Estimated: `4532`
// Minimum execution time: 198_000_000 picoseconds.
Weight::from_parts(198_000_000, 0)
.saturating_add(Weight::from_parts(0, 4532))
.saturating_add(T::DbWeight::get().reads(3))
.saturating_add(T::DbWeight::get().writes(2))
}
/// Storage: FellowshipCore Member (r:1 w:0)
/// Proof: FellowshipCore Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen)
/// Storage: FellowshipCore MemberEvidence (r:1 w:1)
/// Proof: FellowshipCore MemberEvidence (max_values: None, max_size: Some(1067), added: 3542, mode: MaxEncodedLen)
fn submit_evidence() -> Weight {
// Proof Size summary in bytes:
// Measured: `151`
// Estimated: `4532`
// Minimum execution time: 99_000_000 picoseconds.
Weight::from_parts(99_000_000, 0)
.saturating_add(Weight::from_parts(0, 4532))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(1))
}
}
@@ -0,0 +1,140 @@
//! Autogenerated weights for `pallet_salary`
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
//! DATE: 2023-05-20, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! WORST CASE MAP SIZE: `1000000`
//! HOSTNAME: `cob`, CPU: `<UNKNOWN>`
//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: Some("collectives-polkadot-dev"), DB CACHE: 1024
// Executed Command:
// ./target/debug/polkadot-parachain
// benchmark
// pallet
// --chain=collectives-polkadot-dev
// --steps=2
// --repeat=1
// --pallet=pallet_salary
// --extrinsic=*
// --wasm-execution=compiled
// --heap-pages=4096
// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/
#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(unused_parens)]
#![allow(unused_imports)]
#![allow(missing_docs)]
use frame_support::{traits::Get, weights::Weight};
use core::marker::PhantomData;
/// Weight functions for `pallet_salary`.
pub struct WeightInfo<T>(PhantomData<T>);
impl<T: frame_system::Config> pallet_salary::WeightInfo for WeightInfo<T> {
/// Storage: FellowshipSalary Status (r:1 w:1)
/// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen)
fn init() -> Weight {
// Proof Size summary in bytes:
// Measured: `142`
// Estimated: `1541`
// Minimum execution time: 127_000_000 picoseconds.
Weight::from_parts(127_000_000, 0)
.saturating_add(Weight::from_parts(0, 1541))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: FellowshipSalary Status (r:1 w:1)
/// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen)
fn bump() -> Weight {
// Proof Size summary in bytes:
// Measured: `224`
// Estimated: `1541`
// Minimum execution time: 133_000_000 picoseconds.
Weight::from_parts(133_000_000, 0)
.saturating_add(Weight::from_parts(0, 1541))
.saturating_add(T::DbWeight::get().reads(1))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: FellowshipSalary Status (r:1 w:0)
/// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen)
/// Storage: FellowshipCollective Members (r:1 w:0)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: FellowshipSalary Claimant (r:1 w:1)
/// Proof: FellowshipSalary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen)
fn induct() -> Weight {
// Proof Size summary in bytes:
// Measured: `395`
// Estimated: `3543`
// Minimum execution time: 186_000_000 picoseconds.
Weight::from_parts(186_000_000, 0)
.saturating_add(Weight::from_parts(0, 3543))
.saturating_add(T::DbWeight::get().reads(3))
.saturating_add(T::DbWeight::get().writes(1))
}
/// Storage: FellowshipCollective Members (r:1 w:0)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: FellowshipSalary Status (r:1 w:1)
/// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen)
/// Storage: FellowshipSalary Claimant (r:1 w:1)
/// Proof: FellowshipSalary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen)
fn register() -> Weight {
// Proof Size summary in bytes:
// Measured: `462`
// Estimated: `3543`
// Minimum execution time: 183_000_000 picoseconds.
Weight::from_parts(183_000_000, 0)
.saturating_add(Weight::from_parts(0, 3543))
.saturating_add(T::DbWeight::get().reads(3))
.saturating_add(T::DbWeight::get().writes(2))
}
/// Storage: FellowshipSalary Status (r:1 w:1)
/// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen)
/// Storage: FellowshipSalary Claimant (r:1 w:1)
/// Proof: FellowshipSalary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen)
/// Storage: FellowshipCollective Members (r:1 w:0)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: System Account (r:1 w:1)
/// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen)
fn payout() -> Weight {
// Proof Size summary in bytes:
// Measured: `565`
// Estimated: `3593`
// Minimum execution time: 628_000_000 picoseconds.
Weight::from_parts(628_000_000, 0)
.saturating_add(Weight::from_parts(0, 3593))
.saturating_add(T::DbWeight::get().reads(4))
.saturating_add(T::DbWeight::get().writes(3))
}
/// Storage: FellowshipSalary Status (r:1 w:1)
/// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen)
/// Storage: FellowshipSalary Claimant (r:1 w:1)
/// Proof: FellowshipSalary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen)
/// Storage: FellowshipCollective Members (r:1 w:0)
/// Proof: FellowshipCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen)
/// Storage: System Account (r:2 w:2)
/// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen)
fn payout_other() -> Weight {
// Proof Size summary in bytes:
// Measured: `565`
// Estimated: `6196`
// Minimum execution time: 607_000_000 picoseconds.
Weight::from_parts(607_000_000, 0)
.saturating_add(Weight::from_parts(0, 6196))
.saturating_add(T::DbWeight::get().reads(5))
.saturating_add(T::DbWeight::get().writes(4))
}
/// Storage: FellowshipSalary Status (r:1 w:1)
/// Proof: FellowshipSalary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen)
/// Storage: FellowshipSalary Claimant (r:1 w:1)
/// Proof: FellowshipSalary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen)
fn check_payment() -> Weight {
// Proof Size summary in bytes:
// Measured: `308`
// Estimated: `3543`
// Minimum execution time: 100_000_000 picoseconds.
Weight::from_parts(100_000_000, 0)
.saturating_add(Weight::from_parts(0, 3543))
.saturating_add(T::DbWeight::get().reads(2))
.saturating_add(T::DbWeight::get().writes(2))
}
}
@@ -187,6 +187,16 @@ impl Contains<RuntimeCall> for SafeCallFilter {
pallet_ranked_collective::Call::promote_member { .. } |
pallet_ranked_collective::Call::demote_member { .. } |
pallet_ranked_collective::Call::remove_member { .. },
) | RuntimeCall::FellowshipCore(
pallet_core_fellowship::Call::bump { .. } |
pallet_core_fellowship::Call::set_params { .. } |
pallet_core_fellowship::Call::set_active { .. } |
pallet_core_fellowship::Call::approve { .. } |
pallet_core_fellowship::Call::induct { .. } |
pallet_core_fellowship::Call::promote { .. } |
pallet_core_fellowship::Call::offboard { .. } |
pallet_core_fellowship::Call::submit_evidence { .. } |
pallet_core_fellowship::Call::import { .. },
)
)
}