Skip to content

Commit 11126c5

Browse files
olanodpandres95
authored andcommitted
Change TracksInfo::tracks to return an iterator
Using an iterator instead of a static slice allows for more flexible implementations of `TracksInfo` that can use the chain storage without compromising a lot on the performance/memory penalty if we were to return an owned `Vec` instead. NOTE: This feature will benefit from the soon to be released return_position_impl_trait_in_trait(rust-lang/rust#115822) to not require the `TracksIter` associated type and from a bugfix in the compiler(rust-lang/rust#116662) to declare the DEFAULT_MAX_TRACK_NAME_LEN generic constant in the `TracksInfo` trait.
1 parent b35300c commit 11126c5

File tree

13 files changed

+734
-657
lines changed

13 files changed

+734
-657
lines changed

cumulus/parachains/runtimes/collectives/collectives-polkadot/src/ambassador/tracks.rs

Lines changed: 54 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
1818
use super::Origin;
1919
use crate::{Balance, BlockNumber, RuntimeOrigin, DAYS, DOLLARS, HOURS};
20-
use sp_runtime::Perbill;
20+
use pallet_referenda::{StaticTracksIter, Track};
21+
use sp_runtime::{str_array as s, Perbill};
22+
use sp_std::borrow::Cow::Borrowed;
2123

2224
/// Referendum `TrackId` type.
2325
pub type TrackId = u16;
@@ -46,13 +48,15 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
4648

4749
type RuntimeOrigin = <RuntimeOrigin as frame_support::traits::OriginTrait>::PalletsOrigin;
4850

51+
type TracksIter = StaticTracksIter<Self::Id, Balance, BlockNumber>;
52+
4953
/// Return the array of available tracks and their information.
50-
fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo<Balance, BlockNumber>)] {
51-
static DATA: [(TrackId, pallet_referenda::TrackInfo<Balance, BlockNumber>); 9] = [
52-
(
53-
constants::AMBASSADOR_TIER_1,
54-
pallet_referenda::TrackInfo {
55-
name: "ambassador tier 1",
54+
fn tracks() -> Self::TracksIter {
55+
static DATA: [Track<TrackId, Balance, BlockNumber>; 9] = [
56+
Track {
57+
id: constants::AMBASSADOR_TIER_1,
58+
info: pallet_referenda::TrackInfo {
59+
name: s("ambassador tier 1"),
5660
max_deciding: 10,
5761
decision_deposit: 5 * DOLLARS,
5862
prepare_period: 24 * HOURS,
@@ -70,11 +74,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
7074
ceil: Perbill::from_percent(50),
7175
},
7276
},
73-
),
74-
(
75-
constants::AMBASSADOR_TIER_2,
76-
pallet_referenda::TrackInfo {
77-
name: "ambassador tier 2",
77+
},
78+
Track {
79+
id: constants::AMBASSADOR_TIER_2,
80+
info: pallet_referenda::TrackInfo {
81+
name: s("ambassador tier 2"),
7882
max_deciding: 10,
7983
decision_deposit: 5 * DOLLARS,
8084
prepare_period: 24 * HOURS,
@@ -92,11 +96,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
9296
ceil: Perbill::from_percent(50),
9397
},
9498
},
95-
),
96-
(
97-
constants::SENIOR_AMBASSADOR_TIER_3,
98-
pallet_referenda::TrackInfo {
99-
name: "senior ambassador tier 3",
99+
},
100+
Track {
101+
id: constants::SENIOR_AMBASSADOR_TIER_3,
102+
info: pallet_referenda::TrackInfo {
103+
name: s("senior ambassador tier 3"),
100104
max_deciding: 10,
101105
decision_deposit: 5 * DOLLARS,
102106
prepare_period: 24 * HOURS,
@@ -114,11 +118,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
114118
ceil: Perbill::from_percent(50),
115119
},
116120
},
117-
),
118-
(
119-
constants::SENIOR_AMBASSADOR_TIER_4,
120-
pallet_referenda::TrackInfo {
121-
name: "senior ambassador tier 4",
121+
},
122+
Track {
123+
id: constants::SENIOR_AMBASSADOR_TIER_4,
124+
info: pallet_referenda::TrackInfo {
125+
name: s("senior ambassador tier 4"),
122126
max_deciding: 10,
123127
decision_deposit: 5 * DOLLARS,
124128
prepare_period: 24 * HOURS,
@@ -136,11 +140,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
136140
ceil: Perbill::from_percent(50),
137141
},
138142
},
139-
),
140-
(
141-
constants::HEAD_AMBASSADOR_TIER_5,
142-
pallet_referenda::TrackInfo {
143-
name: "head ambassador tier 5",
143+
},
144+
Track {
145+
id: constants::HEAD_AMBASSADOR_TIER_5,
146+
info: pallet_referenda::TrackInfo {
147+
name: s("head ambassador tier 5"),
144148
max_deciding: 10,
145149
decision_deposit: 5 * DOLLARS,
146150
prepare_period: 24 * HOURS,
@@ -158,11 +162,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
158162
ceil: Perbill::from_percent(50),
159163
},
160164
},
161-
),
162-
(
163-
constants::HEAD_AMBASSADOR_TIER_6,
164-
pallet_referenda::TrackInfo {
165-
name: "head ambassador tier 6",
165+
},
166+
Track {
167+
id: constants::HEAD_AMBASSADOR_TIER_6,
168+
info: pallet_referenda::TrackInfo {
169+
name: s("head ambassador tier 6"),
166170
max_deciding: 10,
167171
decision_deposit: 5 * DOLLARS,
168172
prepare_period: 24 * HOURS,
@@ -180,11 +184,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
180184
ceil: Perbill::from_percent(50),
181185
},
182186
},
183-
),
184-
(
185-
constants::HEAD_AMBASSADOR_TIER_7,
186-
pallet_referenda::TrackInfo {
187-
name: "head ambassador tier 7",
187+
},
188+
Track {
189+
id: constants::HEAD_AMBASSADOR_TIER_7,
190+
info: pallet_referenda::TrackInfo {
191+
name: s("head ambassador tier 7"),
188192
max_deciding: 10,
189193
decision_deposit: 5 * DOLLARS,
190194
prepare_period: 24 * HOURS,
@@ -202,11 +206,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
202206
ceil: Perbill::from_percent(50),
203207
},
204208
},
205-
),
206-
(
207-
constants::MASTER_AMBASSADOR_TIER_8,
208-
pallet_referenda::TrackInfo {
209-
name: "master ambassador tier 8",
209+
},
210+
Track {
211+
id: constants::MASTER_AMBASSADOR_TIER_8,
212+
info: pallet_referenda::TrackInfo {
213+
name: s("master ambassador tier 8"),
210214
max_deciding: 10,
211215
decision_deposit: 5 * DOLLARS,
212216
prepare_period: 24 * HOURS,
@@ -224,11 +228,11 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
224228
ceil: Perbill::from_percent(50),
225229
},
226230
},
227-
),
228-
(
229-
constants::MASTER_AMBASSADOR_TIER_9,
230-
pallet_referenda::TrackInfo {
231-
name: "master ambassador tier 9",
231+
},
232+
Track {
233+
id: constants::MASTER_AMBASSADOR_TIER_9,
234+
info: pallet_referenda::TrackInfo {
235+
name: s("master ambassador tier 9"),
232236
max_deciding: 10,
233237
decision_deposit: 5 * DOLLARS,
234238
prepare_period: 24 * HOURS,
@@ -246,9 +250,9 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
246250
ceil: Perbill::from_percent(50),
247251
},
248252
},
249-
),
253+
},
250254
];
251-
&DATA[..]
255+
DATA.iter().map(Borrowed)
252256
}
253257

254258
/// Determine the voting track for the given `origin`.
@@ -259,7 +263,7 @@ impl pallet_referenda::TracksInfo<Balance, BlockNumber> for TracksInfo {
259263
// It is important that this is not available in production!
260264
let root: Self::RuntimeOrigin = frame_system::RawOrigin::Root.into();
261265
if &root == id {
262-
return Ok(constants::MASTER_AMBASSADOR_TIER_9)
266+
return Ok(constants::MASTER_AMBASSADOR_TIER_9);
263267
}
264268
}
265269

0 commit comments

Comments
 (0)