diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/tracks.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/tracks.rs index aa1f67d18afe4..d4a2d3bbf1c7b 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/tracks.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/tracks.rs @@ -17,8 +17,7 @@ use super::Origin; use crate::{Balance, BlockNumber, RuntimeOrigin, DAYS, DOLLARS, HOURS}; -use sp_runtime::{str_array as s, Perbill}; -use sp_std::borrow::Cow; +use sp_runtime::Perbill; /// Referendum `TrackId` type. pub type TrackId = u16; @@ -47,15 +46,13 @@ impl pallet_referenda::TracksInfo for TracksInfo { type RuntimeOrigin = ::PalletsOrigin; - /// Return the list of available tracks and their information. - fn tracks( - ) -> impl Iterator>> - { - static DATA: [pallet_referenda::Track; 9] = [ - pallet_referenda::Track { - id: constants::AMBASSADOR_TIER_1, - info: pallet_referenda::TrackInfo { - name: s("ambassador tier 1"), + /// Return the array of available tracks and their information. + fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { + static DATA: [(TrackId, pallet_referenda::TrackInfo); 9] = [ + ( + constants::AMBASSADOR_TIER_1, + pallet_referenda::TrackInfo { + name: "ambassador tier 1", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 24 * HOURS, @@ -73,11 +70,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - pallet_referenda::Track { - id: constants::AMBASSADOR_TIER_2, - info: pallet_referenda::TrackInfo { - name: s("ambassador tier 2"), + ), + ( + constants::AMBASSADOR_TIER_2, + pallet_referenda::TrackInfo { + name: "ambassador tier 2", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 24 * HOURS, @@ -95,11 +92,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - pallet_referenda::Track { - id: constants::SENIOR_AMBASSADOR_TIER_3, - info: pallet_referenda::TrackInfo { - name: s("senior ambassador tier 3"), + ), + ( + constants::SENIOR_AMBASSADOR_TIER_3, + pallet_referenda::TrackInfo { + name: "senior ambassador tier 3", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 24 * HOURS, @@ -117,11 +114,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - pallet_referenda::Track { - id: constants::SENIOR_AMBASSADOR_TIER_4, - info: pallet_referenda::TrackInfo { - name: s("senior ambassador tier 4"), + ), + ( + constants::SENIOR_AMBASSADOR_TIER_4, + pallet_referenda::TrackInfo { + name: "senior ambassador tier 4", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 24 * HOURS, @@ -139,11 +136,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - pallet_referenda::Track { - id: constants::HEAD_AMBASSADOR_TIER_5, - info: pallet_referenda::TrackInfo { - name: s("head ambassador tier 5"), + ), + ( + constants::HEAD_AMBASSADOR_TIER_5, + pallet_referenda::TrackInfo { + name: "head ambassador tier 5", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 24 * HOURS, @@ -161,11 +158,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - pallet_referenda::Track { - id: constants::HEAD_AMBASSADOR_TIER_6, - info: pallet_referenda::TrackInfo { - name: s("head ambassador tier 6"), + ), + ( + constants::HEAD_AMBASSADOR_TIER_6, + pallet_referenda::TrackInfo { + name: "head ambassador tier 6", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 24 * HOURS, @@ -183,11 +180,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - pallet_referenda::Track { - id: constants::HEAD_AMBASSADOR_TIER_7, - info: pallet_referenda::TrackInfo { - name: s("head ambassador tier 7"), + ), + ( + constants::HEAD_AMBASSADOR_TIER_7, + pallet_referenda::TrackInfo { + name: "head ambassador tier 7", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 24 * HOURS, @@ -205,11 +202,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - pallet_referenda::Track { - id: constants::MASTER_AMBASSADOR_TIER_8, - info: pallet_referenda::TrackInfo { - name: s("master ambassador tier 8"), + ), + ( + constants::MASTER_AMBASSADOR_TIER_8, + pallet_referenda::TrackInfo { + name: "master ambassador tier 8", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 24 * HOURS, @@ -227,11 +224,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - pallet_referenda::Track { - id: constants::MASTER_AMBASSADOR_TIER_9, - info: pallet_referenda::TrackInfo { - name: s("master ambassador tier 9"), + ), + ( + constants::MASTER_AMBASSADOR_TIER_9, + pallet_referenda::TrackInfo { + name: "master ambassador tier 9", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 24 * HOURS, @@ -249,9 +246,9 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, + ), ]; - DATA.iter().map(Cow::Borrowed) + &DATA[..] } /// Determine the voting track for the given `origin`. @@ -280,3 +277,6 @@ impl pallet_referenda::TracksInfo for TracksInfo { } } } + +// implements [`frame_support::traits::Get`] for [`TracksInfo`] +pallet_referenda::impl_tracksinfo_get!(TracksInfo, Balance, BlockNumber); diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/tracks.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/tracks.rs index 6c3c88935dd22..d7959f7724488 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/tracks.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/tracks.rs @@ -18,8 +18,7 @@ use crate::{Balance, BlockNumber, RuntimeOrigin, DAYS, DOLLARS, HOURS, MINUTES}; use pallet_ranked_collective::Rank; -use sp_runtime::{str_array as s, traits::Convert, Perbill}; -use sp_std::borrow::Cow; +use sp_runtime::{traits::Convert, Perbill}; /// Referendum `TrackId` type. pub type TrackId = u16; @@ -115,16 +114,13 @@ pub struct TracksInfo; impl pallet_referenda::TracksInfo for TracksInfo { type Id = TrackId; type RuntimeOrigin = ::PalletsOrigin; - - fn tracks( - ) -> impl Iterator>> - { + fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { use constants as tracks; - static DATA: [pallet_referenda::Track; 21] = [ - pallet_referenda::Track { - id: tracks::MEMBERS, - info: pallet_referenda::TrackInfo { - name: s("members"), + static DATA: [(TrackId, pallet_referenda::TrackInfo); 21] = [ + ( + tracks::MEMBERS, + pallet_referenda::TrackInfo { + name: "members", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, @@ -142,11 +138,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - pallet_referenda::Track { - id: tracks::PROFICIENTS, - info: pallet_referenda::TrackInfo { - name: s("proficient members"), + ), + ( + tracks::PROFICIENTS, + pallet_referenda::TrackInfo { + name: "proficient members", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, @@ -164,11 +160,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - pallet_referenda::Track { - id: tracks::FELLOWS, - info: pallet_referenda::TrackInfo { - name: s("fellows"), + ), + ( + tracks::FELLOWS, + pallet_referenda::TrackInfo { + name: "fellows", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, @@ -186,11 +182,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - pallet_referenda::Track { - id: tracks::ARCHITECTS, - info: pallet_referenda::TrackInfo { - name: s("architects"), + ), + ( + tracks::ARCHITECTS, + pallet_referenda::TrackInfo { + name: "architects", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, @@ -208,11 +204,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - pallet_referenda::Track { - id: tracks::ARCHITECTS_ADEPT, - info: pallet_referenda::TrackInfo { - name: s("architects adept"), + ), + ( + tracks::ARCHITECTS_ADEPT, + pallet_referenda::TrackInfo { + name: "architects adept", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, @@ -230,11 +226,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - pallet_referenda::Track { - id: tracks::GRAND_ARCHITECTS, - info: pallet_referenda::TrackInfo { - name: s("grand architects"), + ), + ( + tracks::GRAND_ARCHITECTS, + pallet_referenda::TrackInfo { + name: "grand architects", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, @@ -252,11 +248,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - pallet_referenda::Track { - id: tracks::MASTERS, - info: pallet_referenda::TrackInfo { - name: s("masters"), + ), + ( + tracks::MASTERS, + pallet_referenda::TrackInfo { + name: "masters", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, @@ -274,11 +270,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - pallet_referenda::Track { - id: tracks::MASTERS_CONSTANT, - info: pallet_referenda::TrackInfo { - name: s("masters constant"), + ), + ( + tracks::MASTERS_CONSTANT, + pallet_referenda::TrackInfo { + name: "masters constant", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, @@ -296,11 +292,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - pallet_referenda::Track { - id: tracks::GRAND_MASTERS, - info: pallet_referenda::TrackInfo { - name: s("grand masters"), + ), + ( + tracks::GRAND_MASTERS, + pallet_referenda::TrackInfo { + name: "grand masters", max_deciding: 10, decision_deposit: 5 * DOLLARS, prepare_period: 30 * MINUTES, @@ -318,11 +314,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - pallet_referenda::Track { - id: tracks::RETAIN_AT_1DAN, - info: pallet_referenda::TrackInfo { - name: s("retain at I Dan"), + ), + ( + 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, @@ -332,11 +328,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: RETAIN_MIN_APPROVAL, min_support: RETAIN_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::RETAIN_AT_2DAN, - info: pallet_referenda::TrackInfo { - name: s("retain at II Dan"), + ), + ( + 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, @@ -346,11 +342,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: RETAIN_MIN_APPROVAL, min_support: RETAIN_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::RETAIN_AT_3DAN, - info: pallet_referenda::TrackInfo { - name: s("retain at III Dan"), + ), + ( + 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, @@ -360,11 +356,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: RETAIN_MIN_APPROVAL, min_support: RETAIN_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::RETAIN_AT_4DAN, - info: pallet_referenda::TrackInfo { - name: s("retain at IV Dan"), + ), + ( + 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, @@ -374,11 +370,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: RETAIN_MIN_APPROVAL, min_support: RETAIN_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::RETAIN_AT_5DAN, - info: pallet_referenda::TrackInfo { - name: s("retain at V Dan"), + ), + ( + 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, @@ -388,11 +384,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: RETAIN_MIN_APPROVAL, min_support: RETAIN_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::RETAIN_AT_6DAN, - info: pallet_referenda::TrackInfo { - name: s("retain at VI Dan"), + ), + ( + 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, @@ -402,11 +398,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: RETAIN_MIN_APPROVAL, min_support: RETAIN_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::PROMOTE_TO_1DAN, - info: pallet_referenda::TrackInfo { - name: s("promote to I Dan"), + ), + ( + 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, @@ -416,11 +412,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: PROMOTE_MIN_APPROVAL, min_support: PROMOTE_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::PROMOTE_TO_2DAN, - info: pallet_referenda::TrackInfo { - name: s("promote to II Dan"), + ), + ( + 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, @@ -430,11 +426,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: PROMOTE_MIN_APPROVAL, min_support: PROMOTE_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::PROMOTE_TO_3DAN, - info: pallet_referenda::TrackInfo { - name: s("promote to III Dan"), + ), + ( + 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, @@ -444,11 +440,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: PROMOTE_MIN_APPROVAL, min_support: PROMOTE_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::PROMOTE_TO_4DAN, - info: pallet_referenda::TrackInfo { - name: s("promote to IV Dan"), + ), + ( + 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, @@ -458,11 +454,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: PROMOTE_MIN_APPROVAL, min_support: PROMOTE_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::PROMOTE_TO_5DAN, - info: pallet_referenda::TrackInfo { - name: s("promote to V Dan"), + ), + ( + 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, @@ -472,11 +468,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: PROMOTE_MIN_APPROVAL, min_support: PROMOTE_MIN_SUPPORT, }, - }, - pallet_referenda::Track { - id: tracks::PROMOTE_TO_6DAN, - info: pallet_referenda::TrackInfo { - name: s("promote to VI Dan"), + ), + ( + 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, @@ -486,9 +482,9 @@ impl pallet_referenda::TracksInfo for TracksInfo { min_approval: PROMOTE_MIN_APPROVAL, min_support: PROMOTE_MIN_SUPPORT, }, - }, + ), ]; - DATA.iter().map(Cow::Borrowed) + &DATA[..] } fn track_for(id: &Self::RuntimeOrigin) -> Result { use super::origins::Origin; @@ -533,3 +529,4 @@ impl pallet_referenda::TracksInfo for TracksInfo { } } } +pallet_referenda::impl_tracksinfo_get!(TracksInfo, Balance, BlockNumber); diff --git a/polkadot/runtime/rococo/src/governance/fellowship.rs b/polkadot/runtime/rococo/src/governance/fellowship.rs index cb194e05e9ce9..231defab6aa52 100644 --- a/polkadot/runtime/rococo/src/governance/fellowship.rs +++ b/polkadot/runtime/rococo/src/governance/fellowship.rs @@ -16,13 +16,8 @@ //! Elements of governance concerning the Rococo Fellowship. -use alloc::borrow::Cow; use frame_support::traits::{MapSuccess, TryMapSuccess}; -use pallet_referenda::{Track, TrackInfo}; -use sp_runtime::{ - str_array as s, - traits::{CheckedReduceBy, ConstU16, Replace, ReplaceWithDefault}, -}; +use sp_runtime::traits::{CheckedReduceBy, ConstU16, Replace, ReplaceWithDefault}; use super::*; use crate::{CENTS, DAYS}; @@ -37,13 +32,12 @@ pub struct TracksInfo; impl pallet_referenda::TracksInfo for TracksInfo { type Id = u16; type RuntimeOrigin = ::PalletsOrigin; - - fn tracks() -> impl Iterator>> { - static DATA: [Track; 10] = [ - Track { - id: 0u16, - info: TrackInfo { - name: s("candidates"), + fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { + static DATA: [(u16, pallet_referenda::TrackInfo); 10] = [ + ( + 0u16, + pallet_referenda::TrackInfo { + name: "candidates", max_deciding: 10, decision_deposit: 100 * 3 * CENTS, prepare_period: 30 * MINUTES, @@ -61,11 +55,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - Track { - id: 1u16, - info: TrackInfo { - name: s("members"), + ), + ( + 1u16, + pallet_referenda::TrackInfo { + name: "members", max_deciding: 10, decision_deposit: 10 * 3 * CENTS, prepare_period: 30 * MINUTES, @@ -83,11 +77,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - Track { - id: 2u16, - info: TrackInfo { - name: s("proficients"), + ), + ( + 2u16, + pallet_referenda::TrackInfo { + name: "proficients", max_deciding: 10, decision_deposit: 10 * 3 * CENTS, prepare_period: 30 * MINUTES, @@ -105,11 +99,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - Track { - id: 3u16, - info: TrackInfo { - name: s("fellows"), + ), + ( + 3u16, + pallet_referenda::TrackInfo { + name: "fellows", max_deciding: 10, decision_deposit: 10 * 3 * CENTS, prepare_period: 30 * MINUTES, @@ -127,11 +121,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - Track { - id: 4u16, - info: TrackInfo { - name: s("senior fellows"), + ), + ( + 4u16, + pallet_referenda::TrackInfo { + name: "senior fellows", max_deciding: 10, decision_deposit: 10 * 3 * CENTS, prepare_period: 30 * MINUTES, @@ -149,11 +143,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - Track { - id: 5u16, - info: TrackInfo { - name: s("experts"), + ), + ( + 5u16, + pallet_referenda::TrackInfo { + name: "experts", max_deciding: 10, decision_deposit: 1 * 3 * CENTS, prepare_period: 30 * MINUTES, @@ -171,11 +165,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - Track { - id: 6u16, - info: TrackInfo { - name: s("senior experts"), + ), + ( + 6u16, + pallet_referenda::TrackInfo { + name: "senior experts", max_deciding: 10, decision_deposit: 1 * 3 * CENTS, prepare_period: 30 * MINUTES, @@ -193,11 +187,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - Track { - id: 7u16, - info: TrackInfo { - name: s("masters"), + ), + ( + 7u16, + pallet_referenda::TrackInfo { + name: "masters", max_deciding: 10, decision_deposit: 1 * 3 * CENTS, prepare_period: 30 * MINUTES, @@ -215,11 +209,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - Track { - id: 8u16, - info: TrackInfo { - name: s("senior masters"), + ), + ( + 8u16, + pallet_referenda::TrackInfo { + name: "senior masters", max_deciding: 10, decision_deposit: 1 * 3 * CENTS, prepare_period: 30 * MINUTES, @@ -237,11 +231,11 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, - Track { - id: 9u16, - info: TrackInfo { - name: s("grand masters"), + ), + ( + 9u16, + pallet_referenda::TrackInfo { + name: "grand masters", max_deciding: 10, decision_deposit: 1 * 3 * CENTS, prepare_period: 30 * MINUTES, @@ -259,9 +253,9 @@ impl pallet_referenda::TracksInfo for TracksInfo { ceil: Perbill::from_percent(50), }, }, - }, + ), ]; - DATA.iter().map(Cow::Borrowed) + &DATA[..] } fn track_for(id: &Self::RuntimeOrigin) -> Result { use super::origins::Origin; @@ -291,6 +285,7 @@ impl pallet_referenda::TracksInfo for TracksInfo { } } } +pallet_referenda::impl_tracksinfo_get!(TracksInfo, Balance, BlockNumber); pub type FellowshipReferendaInstance = pallet_referenda::Instance2; diff --git a/polkadot/runtime/rococo/src/governance/tracks.rs b/polkadot/runtime/rococo/src/governance/tracks.rs index 62229ff5ef5c9..3765569f183e0 100644 --- a/polkadot/runtime/rococo/src/governance/tracks.rs +++ b/polkadot/runtime/rococo/src/governance/tracks.rs @@ -18,9 +18,6 @@ use super::*; -use alloc::borrow::Cow; -use sp_runtime::str_array as s; - const fn percent(x: i32) -> sp_arithmetic::FixedI64 { sp_arithmetic::FixedI64::from_rational(x as u128, 100) } @@ -68,11 +65,11 @@ const APP_WHITELISTED_CALLER: Curve = const SUP_WHITELISTED_CALLER: Curve = Curve::make_reciprocal(1, 28, percent(20), percent(5), percent(50)); -const TRACKS_DATA: [pallet_referenda::Track; 15] = [ - pallet_referenda::Track { - id: 0, - info: pallet_referenda::TrackInfo { - name: s("root"), +const TRACKS_DATA: [(u16, pallet_referenda::TrackInfo); 15] = [ + ( + 0, + pallet_referenda::TrackInfo { + name: "root", max_deciding: 1, decision_deposit: 100 * GRAND, prepare_period: 8 * MINUTES, @@ -82,11 +79,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_ROOT, min_support: SUP_ROOT, }, - }, - pallet_referenda::Track { - id: 1, - info: pallet_referenda::TrackInfo { - name: s("whitelisted_caller"), + ), + ( + 1, + pallet_referenda::TrackInfo { + name: "whitelisted_caller", max_deciding: 100, decision_deposit: 10 * GRAND, prepare_period: 6 * MINUTES, @@ -96,11 +93,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_WHITELISTED_CALLER, min_support: SUP_WHITELISTED_CALLER, }, - }, - pallet_referenda::Track { - id: 10, - info: pallet_referenda::TrackInfo { - name: s("staking_admin"), + ), + ( + 10, + pallet_referenda::TrackInfo { + name: "staking_admin", max_deciding: 10, decision_deposit: 5 * GRAND, prepare_period: 8 * MINUTES, @@ -110,11 +107,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_STAKING_ADMIN, min_support: SUP_STAKING_ADMIN, }, - }, - pallet_referenda::Track { - id: 11, - info: pallet_referenda::TrackInfo { - name: s("treasurer"), + ), + ( + 11, + pallet_referenda::TrackInfo { + name: "treasurer", max_deciding: 10, decision_deposit: 1 * GRAND, prepare_period: 8 * MINUTES, @@ -124,11 +121,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_TREASURER, min_support: SUP_TREASURER, }, - }, - pallet_referenda::Track { - id: 12, - info: pallet_referenda::TrackInfo { - name: s("lease_admin"), + ), + ( + 12, + pallet_referenda::TrackInfo { + name: "lease_admin", max_deciding: 10, decision_deposit: 5 * GRAND, prepare_period: 8 * MINUTES, @@ -138,11 +135,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_LEASE_ADMIN, min_support: SUP_LEASE_ADMIN, }, - }, - pallet_referenda::Track { - id: 13, - info: pallet_referenda::TrackInfo { - name: s("fellowship_admin"), + ), + ( + 13, + pallet_referenda::TrackInfo { + name: "fellowship_admin", max_deciding: 10, decision_deposit: 5 * GRAND, prepare_period: 8 * MINUTES, @@ -152,11 +149,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_FELLOWSHIP_ADMIN, min_support: SUP_FELLOWSHIP_ADMIN, }, - }, - pallet_referenda::Track { - id: 14, - info: pallet_referenda::TrackInfo { - name: s("general_admin"), + ), + ( + 14, + pallet_referenda::TrackInfo { + name: "general_admin", max_deciding: 10, decision_deposit: 5 * GRAND, prepare_period: 8 * MINUTES, @@ -166,11 +163,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_GENERAL_ADMIN, min_support: SUP_GENERAL_ADMIN, }, - }, - pallet_referenda::Track { - id: 15, - info: pallet_referenda::TrackInfo { - name: s("auction_admin"), + ), + ( + 15, + pallet_referenda::TrackInfo { + name: "auction_admin", max_deciding: 10, decision_deposit: 5 * GRAND, prepare_period: 8 * MINUTES, @@ -180,11 +177,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_AUCTION_ADMIN, min_support: SUP_AUCTION_ADMIN, }, - }, - pallet_referenda::Track { - id: 20, - info: pallet_referenda::TrackInfo { - name: s("referendum_canceller"), + ), + ( + 20, + pallet_referenda::TrackInfo { + name: "referendum_canceller", max_deciding: 1_000, decision_deposit: 10 * GRAND, prepare_period: 8 * MINUTES, @@ -194,11 +191,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_REFERENDUM_CANCELLER, min_support: SUP_REFERENDUM_CANCELLER, }, - }, - pallet_referenda::Track { - id: 21, - info: pallet_referenda::TrackInfo { - name: s("referendum_killer"), + ), + ( + 21, + pallet_referenda::TrackInfo { + name: "referendum_killer", max_deciding: 1_000, decision_deposit: 50 * GRAND, prepare_period: 8 * MINUTES, @@ -208,11 +205,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_REFERENDUM_KILLER, min_support: SUP_REFERENDUM_KILLER, }, - }, - pallet_referenda::Track { - id: 30, - info: pallet_referenda::TrackInfo { - name: s("small_tipper"), + ), + ( + 30, + pallet_referenda::TrackInfo { + name: "small_tipper", max_deciding: 200, decision_deposit: 1 * 3 * CENTS, prepare_period: 1 * MINUTES, @@ -222,11 +219,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_SMALL_TIPPER, min_support: SUP_SMALL_TIPPER, }, - }, - pallet_referenda::Track { - id: 31, - info: pallet_referenda::TrackInfo { - name: s("big_tipper"), + ), + ( + 31, + pallet_referenda::TrackInfo { + name: "big_tipper", max_deciding: 100, decision_deposit: 10 * 3 * CENTS, prepare_period: 4 * MINUTES, @@ -236,11 +233,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_BIG_TIPPER, min_support: SUP_BIG_TIPPER, }, - }, - pallet_referenda::Track { - id: 32, - info: pallet_referenda::TrackInfo { - name: s("small_spender"), + ), + ( + 32, + pallet_referenda::TrackInfo { + name: "small_spender", max_deciding: 50, decision_deposit: 100 * 3 * CENTS, prepare_period: 10 * MINUTES, @@ -250,11 +247,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_SMALL_SPENDER, min_support: SUP_SMALL_SPENDER, }, - }, - pallet_referenda::Track { - id: 33, - info: pallet_referenda::TrackInfo { - name: s("medium_spender"), + ), + ( + 33, + pallet_referenda::TrackInfo { + name: "medium_spender", max_deciding: 50, decision_deposit: 200 * 3 * CENTS, prepare_period: 10 * MINUTES, @@ -264,11 +261,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_MEDIUM_SPENDER, min_support: SUP_MEDIUM_SPENDER, }, - }, - pallet_referenda::Track { - id: 34, - info: pallet_referenda::TrackInfo { - name: s("big_spender"), + ), + ( + 34, + pallet_referenda::TrackInfo { + name: "big_spender", max_deciding: 50, decision_deposit: 400 * 3 * CENTS, prepare_period: 10 * MINUTES, @@ -278,18 +275,15 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_BIG_SPENDER, min_support: SUP_BIG_SPENDER, }, - }, + ), ]; pub struct TracksInfo; impl pallet_referenda::TracksInfo for TracksInfo { type Id = u16; type RuntimeOrigin = ::PalletsOrigin; - - fn tracks( - ) -> impl Iterator>> - { - TRACKS_DATA.iter().map(Cow::Borrowed) + fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { + &TRACKS_DATA[..] } fn track_for(id: &Self::RuntimeOrigin) -> Result { if let Ok(system_origin) = frame_system::RawOrigin::try_from(id.clone()) { @@ -323,3 +317,4 @@ impl pallet_referenda::TracksInfo for TracksInfo { } } } +pallet_referenda::impl_tracksinfo_get!(TracksInfo, Balance, BlockNumber); diff --git a/polkadot/runtime/westend/src/governance/tracks.rs b/polkadot/runtime/westend/src/governance/tracks.rs index 62229ff5ef5c9..3765569f183e0 100644 --- a/polkadot/runtime/westend/src/governance/tracks.rs +++ b/polkadot/runtime/westend/src/governance/tracks.rs @@ -18,9 +18,6 @@ use super::*; -use alloc::borrow::Cow; -use sp_runtime::str_array as s; - const fn percent(x: i32) -> sp_arithmetic::FixedI64 { sp_arithmetic::FixedI64::from_rational(x as u128, 100) } @@ -68,11 +65,11 @@ const APP_WHITELISTED_CALLER: Curve = const SUP_WHITELISTED_CALLER: Curve = Curve::make_reciprocal(1, 28, percent(20), percent(5), percent(50)); -const TRACKS_DATA: [pallet_referenda::Track; 15] = [ - pallet_referenda::Track { - id: 0, - info: pallet_referenda::TrackInfo { - name: s("root"), +const TRACKS_DATA: [(u16, pallet_referenda::TrackInfo); 15] = [ + ( + 0, + pallet_referenda::TrackInfo { + name: "root", max_deciding: 1, decision_deposit: 100 * GRAND, prepare_period: 8 * MINUTES, @@ -82,11 +79,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_ROOT, min_support: SUP_ROOT, }, - }, - pallet_referenda::Track { - id: 1, - info: pallet_referenda::TrackInfo { - name: s("whitelisted_caller"), + ), + ( + 1, + pallet_referenda::TrackInfo { + name: "whitelisted_caller", max_deciding: 100, decision_deposit: 10 * GRAND, prepare_period: 6 * MINUTES, @@ -96,11 +93,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_WHITELISTED_CALLER, min_support: SUP_WHITELISTED_CALLER, }, - }, - pallet_referenda::Track { - id: 10, - info: pallet_referenda::TrackInfo { - name: s("staking_admin"), + ), + ( + 10, + pallet_referenda::TrackInfo { + name: "staking_admin", max_deciding: 10, decision_deposit: 5 * GRAND, prepare_period: 8 * MINUTES, @@ -110,11 +107,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_STAKING_ADMIN, min_support: SUP_STAKING_ADMIN, }, - }, - pallet_referenda::Track { - id: 11, - info: pallet_referenda::TrackInfo { - name: s("treasurer"), + ), + ( + 11, + pallet_referenda::TrackInfo { + name: "treasurer", max_deciding: 10, decision_deposit: 1 * GRAND, prepare_period: 8 * MINUTES, @@ -124,11 +121,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_TREASURER, min_support: SUP_TREASURER, }, - }, - pallet_referenda::Track { - id: 12, - info: pallet_referenda::TrackInfo { - name: s("lease_admin"), + ), + ( + 12, + pallet_referenda::TrackInfo { + name: "lease_admin", max_deciding: 10, decision_deposit: 5 * GRAND, prepare_period: 8 * MINUTES, @@ -138,11 +135,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_LEASE_ADMIN, min_support: SUP_LEASE_ADMIN, }, - }, - pallet_referenda::Track { - id: 13, - info: pallet_referenda::TrackInfo { - name: s("fellowship_admin"), + ), + ( + 13, + pallet_referenda::TrackInfo { + name: "fellowship_admin", max_deciding: 10, decision_deposit: 5 * GRAND, prepare_period: 8 * MINUTES, @@ -152,11 +149,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_FELLOWSHIP_ADMIN, min_support: SUP_FELLOWSHIP_ADMIN, }, - }, - pallet_referenda::Track { - id: 14, - info: pallet_referenda::TrackInfo { - name: s("general_admin"), + ), + ( + 14, + pallet_referenda::TrackInfo { + name: "general_admin", max_deciding: 10, decision_deposit: 5 * GRAND, prepare_period: 8 * MINUTES, @@ -166,11 +163,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_GENERAL_ADMIN, min_support: SUP_GENERAL_ADMIN, }, - }, - pallet_referenda::Track { - id: 15, - info: pallet_referenda::TrackInfo { - name: s("auction_admin"), + ), + ( + 15, + pallet_referenda::TrackInfo { + name: "auction_admin", max_deciding: 10, decision_deposit: 5 * GRAND, prepare_period: 8 * MINUTES, @@ -180,11 +177,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_AUCTION_ADMIN, min_support: SUP_AUCTION_ADMIN, }, - }, - pallet_referenda::Track { - id: 20, - info: pallet_referenda::TrackInfo { - name: s("referendum_canceller"), + ), + ( + 20, + pallet_referenda::TrackInfo { + name: "referendum_canceller", max_deciding: 1_000, decision_deposit: 10 * GRAND, prepare_period: 8 * MINUTES, @@ -194,11 +191,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_REFERENDUM_CANCELLER, min_support: SUP_REFERENDUM_CANCELLER, }, - }, - pallet_referenda::Track { - id: 21, - info: pallet_referenda::TrackInfo { - name: s("referendum_killer"), + ), + ( + 21, + pallet_referenda::TrackInfo { + name: "referendum_killer", max_deciding: 1_000, decision_deposit: 50 * GRAND, prepare_period: 8 * MINUTES, @@ -208,11 +205,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_REFERENDUM_KILLER, min_support: SUP_REFERENDUM_KILLER, }, - }, - pallet_referenda::Track { - id: 30, - info: pallet_referenda::TrackInfo { - name: s("small_tipper"), + ), + ( + 30, + pallet_referenda::TrackInfo { + name: "small_tipper", max_deciding: 200, decision_deposit: 1 * 3 * CENTS, prepare_period: 1 * MINUTES, @@ -222,11 +219,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_SMALL_TIPPER, min_support: SUP_SMALL_TIPPER, }, - }, - pallet_referenda::Track { - id: 31, - info: pallet_referenda::TrackInfo { - name: s("big_tipper"), + ), + ( + 31, + pallet_referenda::TrackInfo { + name: "big_tipper", max_deciding: 100, decision_deposit: 10 * 3 * CENTS, prepare_period: 4 * MINUTES, @@ -236,11 +233,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_BIG_TIPPER, min_support: SUP_BIG_TIPPER, }, - }, - pallet_referenda::Track { - id: 32, - info: pallet_referenda::TrackInfo { - name: s("small_spender"), + ), + ( + 32, + pallet_referenda::TrackInfo { + name: "small_spender", max_deciding: 50, decision_deposit: 100 * 3 * CENTS, prepare_period: 10 * MINUTES, @@ -250,11 +247,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_SMALL_SPENDER, min_support: SUP_SMALL_SPENDER, }, - }, - pallet_referenda::Track { - id: 33, - info: pallet_referenda::TrackInfo { - name: s("medium_spender"), + ), + ( + 33, + pallet_referenda::TrackInfo { + name: "medium_spender", max_deciding: 50, decision_deposit: 200 * 3 * CENTS, prepare_period: 10 * MINUTES, @@ -264,11 +261,11 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_MEDIUM_SPENDER, min_support: SUP_MEDIUM_SPENDER, }, - }, - pallet_referenda::Track { - id: 34, - info: pallet_referenda::TrackInfo { - name: s("big_spender"), + ), + ( + 34, + pallet_referenda::TrackInfo { + name: "big_spender", max_deciding: 50, decision_deposit: 400 * 3 * CENTS, prepare_period: 10 * MINUTES, @@ -278,18 +275,15 @@ const TRACKS_DATA: [pallet_referenda::Track; 15] = [ min_approval: APP_BIG_SPENDER, min_support: SUP_BIG_SPENDER, }, - }, + ), ]; pub struct TracksInfo; impl pallet_referenda::TracksInfo for TracksInfo { type Id = u16; type RuntimeOrigin = ::PalletsOrigin; - - fn tracks( - ) -> impl Iterator>> - { - TRACKS_DATA.iter().map(Cow::Borrowed) + fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { + &TRACKS_DATA[..] } fn track_for(id: &Self::RuntimeOrigin) -> Result { if let Ok(system_origin) = frame_system::RawOrigin::try_from(id.clone()) { @@ -323,3 +317,4 @@ impl pallet_referenda::TracksInfo for TracksInfo { } } } +pallet_referenda::impl_tracksinfo_get!(TracksInfo, Balance, BlockNumber); diff --git a/prdoc/pr_2072.prdoc b/prdoc/pr_2072.prdoc deleted file mode 100644 index fdc1a373938d2..0000000000000 --- a/prdoc/pr_2072.prdoc +++ /dev/null @@ -1,23 +0,0 @@ -title: "Return iterator in pallet_referenda::TracksInfo::tracks" - -doc: - - audience: Runtime Dev - description: | - Change the return type of the trait method `pallet_referenda::TracksInfo::tracks` to return an - iterator of `Cow<'static, Tracks<_, _, _>>` instead of a static slice in order to support more - flexible implementations that can define referenda tracks dynamically. - - audience: Runtime User - description: | - There is a change in `pallet-referenda`. Now, the tracks are retrieved as a list of `Track`s. Also, the names of - the tracks might have some trailing null values (`\0`). This means display representation of the tracks' names - must be sanitized. - -crates: - - name: pallet-referenda - bump: major - - name: westend-runtime - bump: major - - name: rococo-runtime - bump: major - - name: collectives-westend-runtime - bump: major \ No newline at end of file diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 7e33f1feeca19..6b4c21a265a0f 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -107,7 +107,7 @@ use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H160}; use sp_inherents::{CheckInherentsResult, InherentData}; use sp_runtime::{ curve::PiecewiseLinear, - generic, impl_opaque_keys, str_array as s, + generic, impl_opaque_keys, traits::{ self, AccountIdConversion, BlakeTwo256, Block as BlockT, Bounded, ConvertInto, MaybeConvert, NumberFor, OpaqueKeys, SaturatedConversion, StaticLookup, @@ -116,7 +116,6 @@ use sp_runtime::{ ApplyExtrinsicResult, FixedPointNumber, FixedU128, MultiSignature, MultiSigner, Perbill, Percent, Permill, Perquintill, RuntimeDebug, }; -use sp_std::{borrow::Cow, prelude::*}; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; use sp_version::RuntimeVersion; @@ -1263,20 +1262,43 @@ pub struct TracksInfo; impl pallet_referenda::TracksInfo for TracksInfo { type Id = u16; type RuntimeOrigin = ::PalletsOrigin; - - fn tracks( - ) -> impl Iterator>> - { - dynamic_params::referenda::Tracks::get().into_iter().map(Cow::Owned) + fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { + static DATA: [(u16, pallet_referenda::TrackInfo); 1] = [( + 0u16, + pallet_referenda::TrackInfo { + name: "root", + max_deciding: 1, + decision_deposit: 10, + prepare_period: 4, + decision_period: 4, + confirm_period: 2, + min_enactment_period: 4, + 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(100), + }, + }, + )]; + &DATA[..] } fn track_for(id: &Self::RuntimeOrigin) -> Result { - dynamic_params::referenda::Origins::get() - .iter() - .find(|(o, _)| id == o) - .map(|(_, track_id)| *track_id) - .ok_or(()) + if let Ok(system_origin) = frame_system::RawOrigin::try_from(id.clone()) { + match system_origin { + frame_system::RawOrigin::Root => Ok(0), + _ => Err(()), + } + } else { + Err(()) + } } } +pallet_referenda::impl_tracksinfo_get!(TracksInfo, Balance, BlockNumber); impl pallet_referenda::Config for Runtime { type WeightInfo = pallet_referenda::weights::SubstrateWeight; @@ -2636,46 +2658,6 @@ pub mod dynamic_params { #[codec(index = 1)] pub static ByteDeposit: Balance = 1 * CENTS; } - - #[dynamic_pallet_params] - #[codec(index = 1)] - pub mod referenda { - /// The configuration for the tracks - #[codec(index = 0)] - pub static Tracks: BoundedVec< - pallet_referenda::Track, - ConstU32<100>, - > = BoundedVec::truncate_from(vec![pallet_referenda::Track { - id: 0u16, - info: pallet_referenda::TrackInfo { - name: s("root"), - max_deciding: 1, - decision_deposit: 10, - prepare_period: 4, - decision_period: 4, - confirm_period: 2, - min_enactment_period: 4, - 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(100), - }, - }, - }]); - - /// A list mapping every origin with a track Id - #[codec(index = 1)] - pub static Origins: BoundedVec<(OriginCaller, u16), ConstU32<100>> = - BoundedVec::truncate_from(vec![( - OriginCaller::system(frame_system::RawOrigin::Root), - 0, - )]); - } } #[cfg(feature = "runtime-benchmarks")] @@ -2701,10 +2683,6 @@ impl EnsureOriginWithArg for DynamicParamet frame_system::ensure_root(origin.clone()).map_err(|_| origin)?; return Ok(()) }, - RuntimeParametersKey::Referenda(_) => { - frame_system::ensure_root(origin.clone()).map_err(|_| origin)?; - return Ok(()) - }, } } diff --git a/substrate/frame/referenda/src/benchmarking.rs b/substrate/frame/referenda/src/benchmarking.rs index 59499d9c8bf08..895f95dbec556 100644 --- a/substrate/frame/referenda/src/benchmarking.rs +++ b/substrate/frame/referenda/src/benchmarking.rs @@ -19,7 +19,7 @@ use super::*; use crate::Pallet as Referenda; -use alloc::{borrow::Cow, vec, vec::Vec}; +use alloc::{vec, vec::Vec}; use assert_matches::assert_matches; use frame_benchmarking::v1::{ account, benchmarks_instance_pallet, whitelist_account, BenchmarkError, @@ -110,7 +110,7 @@ fn fill_queue, I: 'static>( others } -fn info, I: 'static>(index: ReferendumIndex) -> Cow<'static, TrackInfoOf> { +fn info, I: 'static>(index: ReferendumIndex) -> &'static TrackInfoOf { let status = Referenda::::ensure_ongoing(index).unwrap(); T::Tracks::info(status.track).expect("Id value returned from T::Tracks") } diff --git a/substrate/frame/referenda/src/lib.rs b/substrate/frame/referenda/src/lib.rs index b58baa341cf59..e6a895f9c5933 100644 --- a/substrate/frame/referenda/src/lib.rs +++ b/substrate/frame/referenda/src/lib.rs @@ -100,7 +100,7 @@ pub use self::{ BalanceOf, BlockNumberFor, BoundedCallOf, CallOf, Curve, DecidingStatus, DecidingStatusOf, Deposit, InsertSorted, NegativeImbalanceOf, PalletsOriginOf, ReferendumIndex, ReferendumInfo, ReferendumInfoOf, ReferendumStatus, ReferendumStatusOf, ScheduleAddressOf, - TallyOf, Track, TrackIdOf, TrackInfo, TrackInfoOf, TracksInfo, VotesOf, + TallyOf, TrackIdOf, TrackInfo, TrackInfoOf, TracksInfo, VotesOf, }, weights::WeightInfo, }; @@ -117,6 +117,27 @@ pub mod benchmarking; pub use frame_support::traits::Get; +#[macro_export] +macro_rules! impl_tracksinfo_get { + ($tracksinfo:ty, $balance:ty, $blocknumber:ty) => { + impl + $crate::Get< + $crate::Vec<( + <$tracksinfo as $crate::TracksInfo<$balance, $blocknumber>>::Id, + $crate::TrackInfo<$balance, $blocknumber>, + )>, + > for $tracksinfo + { + fn get() -> $crate::Vec<( + <$tracksinfo as $crate::TracksInfo<$balance, $blocknumber>>::Id, + $crate::TrackInfo<$balance, $blocknumber>, + )> { + <$tracksinfo as $crate::TracksInfo<$balance, $blocknumber>>::tracks().to_vec() + } + } + }; +} + const ASSEMBLY_ID: LockIdentifier = *b"assembly"; #[frame_support::pallet] @@ -207,11 +228,17 @@ pub mod pallet { // The other stuff. /// Information concerning the different referendum tracks. - type Tracks: TracksInfo< - BalanceOf, - BlockNumberFor, - RuntimeOrigin = ::PalletsOrigin, - >; + #[pallet::constant] + type Tracks: Get< + Vec<( + , BlockNumberFor>>::Id, + TrackInfo, BlockNumberFor>, + )>, + > + TracksInfo< + BalanceOf, + BlockNumberFor, + RuntimeOrigin = ::PalletsOrigin, + >; /// The preimage provider. type Preimages: QueryPreimage + StorePreimage; @@ -222,14 +249,6 @@ pub mod pallet { type BlockNumberProvider: BlockNumberProvider; } - #[pallet::extra_constants] - impl, I: 'static> Pallet { - #[pallet::constant_name(Tracks)] - fn tracks() -> Vec, BalanceOf, BlockNumberFor>> { - T::Tracks::tracks().map(|t| t.into_owned()).collect() - } - } - /// The next free referendum index, aka the number of referenda started so far. #[pallet::storage] pub type ReferendumCount = StorageValue<_, ReferendumIndex, ValueQuery>; @@ -513,7 +532,7 @@ pub mod pallet { let who = ensure_signed(origin)?; let mut status = Self::ensure_ongoing(index)?; ensure!(status.decision_deposit.is_none(), Error::::HasDeposit); - let track = T::Tracks::info(status.track).ok_or(Error::::NoTrack)?; + let track = Self::track(status.track).ok_or(Error::::NoTrack)?; status.decision_deposit = Some(Self::take_deposit(who.clone(), track.decision_deposit)?); let now = T::BlockNumberProvider::current_block_number(); @@ -649,7 +668,7 @@ pub mod pallet { if let Some((index, mut status)) = Self::next_for_deciding(&mut track_queue) { let now = T::BlockNumberProvider::current_block_number(); let (maybe_alarm, branch) = - Self::begin_deciding(&mut status, index, now, &track_info); + Self::begin_deciding(&mut status, index, now, track_info); if let Some(set_alarm) = maybe_alarm { Self::ensure_alarm_at(&mut status, index, set_alarm); } @@ -737,7 +756,7 @@ impl, I: 'static> Polling for Pallet { type Class = TrackIdOf; fn classes() -> Vec { - T::Tracks::track_ids().collect() + T::Tracks::tracks().iter().map(|x| x.0).collect() } fn access_poll( @@ -830,9 +849,10 @@ impl, I: 'static> Polling for Pallet { #[cfg(feature = "runtime-benchmarks")] fn max_ongoing() -> (Self::Class, u32) { let r = T::Tracks::tracks() - .max_by_key(|t| t.info.max_deciding) + .iter() + .max_by_key(|(_, info)| info.max_deciding) .expect("Always one class"); - (r.id, r.info.max_deciding) + (r.0, r.1.max_deciding) } } @@ -854,7 +874,7 @@ impl, I: 'static> Pallet { let info = ReferendumInfoFor::::get(ref_index).ok_or(Error::::BadReferendum)?; match info { ReferendumInfo::Ongoing(status) => { - let track = T::Tracks::info(status.track).ok_or(Error::::NoTrack)?; + let track = Self::track(status.track).ok_or(Error::::NoTrack)?; let elapsed = if let Some(deciding) = status.deciding { T::BlockNumberProvider::current_block_number().saturating_sub(deciding.since) } else { @@ -1084,7 +1104,7 @@ impl, I: 'static> Pallet { ) -> (ReferendumInfoOf, bool, ServiceBranch) { let mut dirty = false; // Should it begin being decided? - let track = match T::Tracks::info(status.track) { + let track = match Self::track(status.track) { Some(x) => x, None => return (ReferendumInfo::Ongoing(status), false, ServiceBranch::Fail), }; @@ -1120,7 +1140,7 @@ impl, I: 'static> Pallet { let prepare_end = status.submitted.saturating_add(track.prepare_period); if now >= prepare_end { let (maybe_alarm, branch) = - Self::ready_for_deciding(now, &track, index, &mut status); + Self::ready_for_deciding(now, track, index, &mut status); if let Some(set_alarm) = maybe_alarm { alarm = alarm.min(set_alarm); } @@ -1167,7 +1187,7 @@ impl, I: 'static> Pallet { Self::ensure_no_alarm(&mut status); Self::note_one_fewer_deciding(status.track); let (desired, call) = (status.enactment, status.proposal); - Self::schedule_enactment(index, &track, desired, status.origin, call); + Self::schedule_enactment(index, track, desired, status.origin, call); Self::deposit_event(Event::::Confirmed { index, tally: status.tally, @@ -1217,7 +1237,7 @@ impl, I: 'static> Pallet { ServiceBranch::ContinueNotConfirming } }; - alarm = Self::decision_time(deciding, &status.tally, status.track, &track); + alarm = Self::decision_time(deciding, &status.tally, status.track, track); }, } @@ -1283,6 +1303,13 @@ impl, I: 'static> Pallet { } } + /// Get the track info value for the track `id`. + fn track(id: TrackIdOf) -> Option<&'static TrackInfoOf> { + let tracks = T::Tracks::tracks(); + let index = tracks.binary_search_by_key(&id, |x| x.0).unwrap_or_else(|x| x); + Some(&tracks[index].1) + } + /// Determine whether the given `tally` would result in a referendum passing at `elapsed` blocks /// into a total decision `period`, given the two curves for `support_needed` and /// `approval_needed`. @@ -1351,7 +1378,7 @@ impl, I: 'static> Pallet { match referendum { ReferendumInfo::Ongoing(status) => { ensure!( - T::Tracks::info(status.track).is_some(), + Self::track(status.track).is_some(), "No track info for the track of the referendum." ); @@ -1377,8 +1404,8 @@ impl, I: 'static> Pallet { /// [`ReferendumInfoFor`] storage map. #[cfg(any(feature = "try-runtime", test))] fn try_state_tracks() -> Result<(), sp_runtime::TryRuntimeError> { - T::Tracks::tracks().try_for_each(|track| { - TrackQueue::::get(track.id).iter().try_for_each( + T::Tracks::tracks().iter().try_for_each(|track| { + TrackQueue::::get(track.0).iter().try_for_each( |(referendum_index, _)| -> Result<(), sp_runtime::TryRuntimeError> { ensure!( ReferendumInfoFor::::contains_key(referendum_index), diff --git a/substrate/frame/referenda/src/mock.rs b/substrate/frame/referenda/src/mock.rs index 52a89d3f7cb7d..6c3d8d1935e2e 100644 --- a/substrate/frame/referenda/src/mock.rs +++ b/substrate/frame/referenda/src/mock.rs @@ -30,7 +30,6 @@ use frame_support::{ }; use frame_system::{EnsureRoot, EnsureSignedBy}; use sp_runtime::{ - str_array as s, traits::{BlakeTwo256, Hash}, BuildStorage, DispatchResult, Perbill, }; @@ -105,13 +104,12 @@ pub struct TestTracksInfo; impl TracksInfo for TestTracksInfo { type Id = u8; type RuntimeOrigin = ::PalletsOrigin; - - fn tracks() -> impl Iterator>> { - static DATA: [Track; 3] = [ - Track { - id: 0u8, - info: TrackInfo { - name: s("root"), + fn tracks() -> &'static [(Self::Id, TrackInfo)] { + static DATA: [(u8, TrackInfo); 3] = [ + ( + 0u8, + TrackInfo { + name: "root", max_deciding: 1, decision_deposit: 10, prepare_period: 4, @@ -129,11 +127,11 @@ impl TracksInfo for TestTracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - Track { - id: 1u8, - info: TrackInfo { - name: s("none"), + ), + ( + 1u8, + TrackInfo { + name: "none", max_deciding: 3, decision_deposit: 1, prepare_period: 2, @@ -151,11 +149,11 @@ impl TracksInfo for TestTracksInfo { ceil: Perbill::from_percent(100), }, }, - }, - Track { - id: 2u8, - info: TrackInfo { - name: s("none"), + ), + ( + 2u8, + TrackInfo { + name: "none", max_deciding: 3, decision_deposit: 1, prepare_period: 2, @@ -173,9 +171,9 @@ impl TracksInfo for TestTracksInfo { ceil: Perbill::from_percent(100), }, }, - }, + ), ]; - DATA.iter().map(Cow::Borrowed) + &DATA[..] } fn track_for(id: &Self::RuntimeOrigin) -> Result { if let Ok(system_origin) = frame_system::RawOrigin::try_from(id.clone()) { @@ -190,6 +188,7 @@ impl TracksInfo for TestTracksInfo { } } } +impl_tracksinfo_get!(TestTracksInfo, u64, u64); impl Config for Test { type WeightInfo = (); diff --git a/substrate/frame/referenda/src/tests.rs b/substrate/frame/referenda/src/tests.rs index d556d10c44a6b..9f851992496cb 100644 --- a/substrate/frame/referenda/src/tests.rs +++ b/substrate/frame/referenda/src/tests.rs @@ -289,12 +289,11 @@ fn alarm_interval_works() { fn decision_time_is_correct() { ExtBuilder::default().build_and_execute(|| { let decision_time = |since: u64| { - let track = TestTracksInfo::tracks().next().unwrap(); Pallet::::decision_time( &DecidingStatus { since: since.into(), confirming: None }, &Tally { ayes: 100, nays: 5 }, - track.id, - &track.info, + TestTracksInfo::tracks()[0].0, + &TestTracksInfo::tracks()[0].1, ) }; diff --git a/substrate/frame/referenda/src/types.rs b/substrate/frame/referenda/src/types.rs index 7bf290786cab8..fecf39d1d27b7 100644 --- a/substrate/frame/referenda/src/types.rs +++ b/substrate/frame/referenda/src/types.rs @@ -116,6 +116,7 @@ pub struct Deposit { pub amount: Balance, } +<<<<<<< HEAD pub const DEFAULT_MAX_TRACK_NAME_LEN: usize = 25; /// Detailed information about the configuration of a referenda track @@ -123,8 +124,12 @@ pub const DEFAULT_MAX_TRACK_NAME_LEN: usize = 25; Clone, Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, TypeInfo, Eq, PartialEq, Debug, )] pub struct TrackInfo { +======= +#[derive(Clone, Encode, TypeInfo)] +pub struct TrackInfo { +>>>>>>> parent of c078d2f41cf8 (Change pallet referenda TracksInfo::tracks to return an iterator (#2072)) /// Name of this track. - pub name: [u8; N], + pub name: &'static str, /// A limit for the number of referenda on this track that can be being decided at once. /// For Root origin this should generally be just one. pub max_deciding: u32, @@ -146,6 +151,7 @@ pub struct TrackInfo, } +======= +>>>>>>> parent of c078d2f41cf8 (Change pallet referenda TracksInfo::tracks to return an iterator (#2072)) /// Information on the voting tracks. -pub trait TracksInfo -where - Balance: Clone + Debug + Eq + 'static, - Moment: Clone + Debug + Eq + 'static, -{ +pub trait TracksInfo { /// The identifier for a track. type Id: Copy + Parameter + Ord + PartialOrd + Send + Sync + 'static + MaxEncodedLen; /// The origin type from which a track is implied. type RuntimeOrigin; - /// Return the sorted iterable list of known tracks and their information. + /// Sorted array of known tracks and their information. /// - /// The iterator MUST be sorted by `Id`. Consumers of this trait are advised to assert + /// The array MUST be sorted by `Id`. Consumers of this trait are advised to assert /// [`Self::check_integrity`] prior to any use. - fn tracks() -> impl Iterator>>; + fn tracks() -> &'static [(Self::Id, TrackInfo)]; /// Determine the voting track for the given `origin`. fn track_for(origin: &Self::RuntimeOrigin) -> Result; - /// Return the list of identifiers of the known tracks. - fn track_ids() -> impl Iterator { - Self::tracks().map(|x| x.id) - } - /// Return the track info for track `id`, by default this just looks it up in `Self::tracks()`. - fn info(id: Self::Id) -> Option>> { - Self::tracks().find(|x| x.id == id).map(|t| match t { - Cow::Borrowed(x) => Cow::Borrowed(&x.info), - Cow::Owned(x) => Cow::Owned(x.info), - }) + fn info(id: Self::Id) -> Option<&'static TrackInfo> { + let tracks = Self::tracks(); + let maybe_index = tracks.binary_search_by_key(&id, |t| t.0).ok()?; + + tracks.get(maybe_index).map(|(_, info)| info) } /// Check assumptions about the static data that this trait provides. - fn check_integrity() -> Result<(), &'static str> { - use core::cmp::Ordering; - // Adapted from Iterator::is_sorted implementation available in nightly - // https://github.com/rust-lang/rust/issues/53485 - let mut iter = Self::tracks(); - let mut last = match iter.next() { - Some(ref e) => e.id, - None => return Ok(()), - }; - iter.all(|curr| { - let curr = curr.as_ref().id; - if let Ordering::Greater = last.cmp(&curr) { - return false; - } - last = curr; - true - }) - .then_some(()) - .ok_or("The tracks that were returned by `tracks` were not sorted by `Id`") + fn check_integrity() -> Result<(), &'static str> + where + Balance: 'static, + Moment: 'static, + { + if Self::tracks().windows(2).all(|w| w[0].0 < w[1].0) { + Ok(()) + } else { + Err("The tracks that were returned by `tracks` were not sorted by `Id`") + } } } @@ -584,7 +574,7 @@ impl Debug for Curve { mod tests { use super::*; use frame_support::traits::ConstU32; - use sp_runtime::{str_array as s, PerThing}; + use sp_runtime::PerThing; const fn percent(x: u128) -> FixedI64 { FixedI64::from_rational(x, 100) @@ -736,12 +726,12 @@ mod tests { impl TracksInfo for BadTracksInfo { type Id = u8; type RuntimeOrigin = ::PalletsOrigin; - fn tracks() -> impl Iterator>> { - static DATA: [Track; 2] = [ - Track { - id: 1u8, - info: TrackInfo { - name: s("root"), + fn tracks() -> &'static [(Self::Id, TrackInfo)] { + static DATA: [(u8, TrackInfo); 2] = [ + ( + 1u8, + TrackInfo { + name: "root", max_deciding: 1, decision_deposit: 10, prepare_period: 4, @@ -759,11 +749,11 @@ mod tests { ceil: Perbill::from_percent(100), }, }, - }, - Track { - id: 0u8, - info: TrackInfo { - name: s("none"), + ), + ( + 0u8, + TrackInfo { + name: "none", max_deciding: 3, decision_deposit: 1, prepare_period: 2, @@ -781,9 +771,9 @@ mod tests { ceil: Perbill::from_percent(100), }, }, - }, + ), ]; - DATA.iter().map(Cow::Borrowed) + &DATA[..] } fn track_for(_: &Self::RuntimeOrigin) -> Result { unimplemented!()