Skip to content

Commit ff2ec6d

Browse files
Solve merge conflicts - import path
1 parent cba7ce6 commit ff2ec6d

File tree

12 files changed

+768
-564
lines changed

12 files changed

+768
-564
lines changed

pallets/pips/src/benchmarking.rs

Lines changed: 102 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,13 @@
1616
use crate::*;
1717

1818
use frame_benchmarking::benchmarks;
19-
use frame_support::{
20-
dispatch::{DispatchError, DispatchResult},
21-
traits::UnfilteredDispatchable,
22-
};
19+
use frame_support::{dispatch::DispatchResult, traits::UnfilteredDispatchable};
2320
use frame_system::RawOrigin;
24-
use pallet_identity::benchmarking::{user, User};
21+
use pallet_identity::benchmarking::{user, User, UserBuilder};
2522
use polymesh_primitives::{MaybeBlock, SystematicIssuers, GC_DID};
2623
use rand::{seq::SliceRandom, SeedableRng};
2724
use rand_chacha::ChaCha20Rng;
25+
use scale_info::prelude::format;
2826
use sp_std::{
2927
convert::{TryFrom, TryInto},
3028
iter,
@@ -38,7 +36,7 @@ mod limits {
3836
pub const PROPOSAL_PADDING_LEN: usize = 100;
3937
pub const VOTERS_A_NUM: usize = 10;
4038
pub const VOTERS_B_NUM: usize = 10;
41-
pub const PROPOSALS_NUM: usize = 5;
39+
pub const PROPOSALS_NUM: u32 = 5;
4240
}
4341

4442
#[cfg(not(feature = "running-ci"))]
@@ -48,7 +46,7 @@ mod limits {
4846
pub const PROPOSAL_PADDING_LEN: usize = 10_000;
4947
pub const VOTERS_A_NUM: usize = 200;
5048
pub const VOTERS_B_NUM: usize = 200;
51-
pub const PROPOSALS_NUM: usize = 100;
49+
pub const PROPOSALS_NUM: u32 = 100;
5250
}
5351

5452
use limits::*;
@@ -98,43 +96,30 @@ fn cast_votes<T: Config>(
9896
Ok(())
9997
}
10098

101-
/// Sets up PIPs and votes.
102-
fn pips_and_votes_setup<T: Config>(
103-
approve_only: bool,
104-
) -> Result<(RawOrigin<T::AccountId>, IdentityId), DispatchError> {
99+
/// Creates `number_of_proposals` proposals and casts `number_of_voter` votes for each.
100+
fn vote_setup<T: Config>(number_of_proposals: u32, number_of_voter: u32) {
105101
Pallet::<T>::set_active_pip_limit(RawOrigin::Root.into(), PROPOSALS_NUM as u32).unwrap();
106-
zeroize_deposit::<T>();
107-
let (voters_a_num, voters_b_num) = if approve_only {
108-
(VOTERS_A_NUM + VOTERS_B_NUM, 0)
109-
} else {
110-
(VOTERS_A_NUM, VOTERS_B_NUM)
111-
};
112-
let hi_voters = make_voters::<T>(voters_a_num, "hi");
113-
let bye_voters = make_voters::<T>(voters_b_num, "bye");
114-
let User { origin, did, .. } = user::<T>("initial", 0);
115-
let did = did.ok_or("no did in pips_and_votes_setup").unwrap();
116-
for i in 0..PROPOSALS_NUM {
102+
Pallet::<T>::set_min_proposal_deposit(RawOrigin::Root.into(), 1_000).unwrap();
103+
for i in 0..number_of_proposals {
117104
let (proposal, url, description) = make_proposal::<T>();
118-
// Pick a proposer, diversifying like a poor man.
119-
let (proposer_origin, _) = if hi_voters.len() >= i + 1 {
120-
(hi_voters[i].1.clone(), hi_voters[i].2.clone())
121-
} else {
122-
(origin.clone(), did)
123-
};
105+
let proposer = UserBuilder::<T>::default()
106+
.generate_did()
107+
.build(&format!("Proposer{}", i));
124108
Pallet::<T>::propose(
125-
proposer_origin.into(),
109+
proposer.origin().into(),
126110
proposal,
127-
42u32.into(),
128-
Some(url.clone()),
129-
Some(description.clone()),
111+
1_000,
112+
Some(url),
113+
Some(description),
130114
)
131115
.unwrap();
132-
let id = PipId(i as u32);
133-
// Alternate aye and nay voters with every iteration unless only approve votes are cast.
134-
cast_votes::<T>(id, hi_voters.as_slice(), approve_only || i % 2 == 0).unwrap();
135-
cast_votes::<T>(id, bye_voters.as_slice(), i % 2 != 0).unwrap();
116+
for j in 0..number_of_voter {
117+
let voter = UserBuilder::<T>::default()
118+
.generate_did()
119+
.build(&format!("User{}", j));
120+
Pallet::<T>::vote(voter.origin().into(), PipId(i as u32), true, 1_000).unwrap();
121+
}
136122
}
137-
Ok((origin, did))
138123
}
139124

140125
fn enact_call<T: Config>(num_approves: usize, num_rejects: usize, num_skips: usize) -> Call<T> {
@@ -146,7 +131,7 @@ fn enact_call<T: Config>(num_approves: usize, num_rejects: usize, num_skips: usi
146131
.chain(iter::repeat(SnapshotResult::Skip).take(num_skips))
147132
.collect();
148133
snapshot_results.shuffle(&mut rng);
149-
let results = Pallet::<T>::snapshot_queue()
134+
let results = SnapshotQueue::<T>::get()
150135
.iter()
151136
.rev()
152137
.map(|s| s.id)
@@ -156,7 +141,7 @@ fn enact_call<T: Config>(num_approves: usize, num_rejects: usize, num_skips: usi
156141
}
157142

158143
fn propose_verify<T: Config>(url: Url, description: PipDescription) -> DispatchResult {
159-
let meta = Pallet::<T>::proposal_metadata(PipId(0)).unwrap();
144+
let meta = ProposalMetadata::<T>::get(PipId(0)).unwrap();
160145
assert_eq!(PipId(0), meta.id, "incorrect meta.id");
161146
assert_eq!(Some(url), meta.url, "incorrect meta.url");
162147
assert_eq!(
@@ -167,18 +152,6 @@ fn propose_verify<T: Config>(url: Url, description: PipDescription) -> DispatchR
167152
Ok(())
168153
}
169154

170-
fn execute_verify<T: Config>(state: ProposalState, err: &'static str) -> DispatchResult {
171-
if Proposals::<T>::contains_key(PipId(0)) {
172-
assert_eq!(
173-
state,
174-
Pallet::<T>::proposal_state(PipId(0)).unwrap(),
175-
"{}",
176-
err
177-
);
178-
}
179-
Ok(())
180-
}
181-
182155
benchmarks! {
183156
set_prune_historical_pips {
184157
let origin = RawOrigin::Root;
@@ -306,52 +279,36 @@ benchmarks! {
306279
}
307280

308281
reject_proposal {
282+
let v in 0..T::MaxRefundsAndVotesPruned::get() as u32;
283+
284+
vote_setup::<T>(1, v);
285+
309286
Pallet::<T>::set_prune_historical_pips(RawOrigin::Root.into(), true).unwrap();
310-
let user = user::<T>("proposer", 0);
311-
zeroize_deposit::<T>();
312-
let (proposal, url, description) = make_proposal::<T>();
313-
let deposit = 42u32.into();
314-
Pallet::<T>::propose(
315-
user.origin().into(),
316-
proposal,
317-
deposit,
318-
Some(url),
319-
Some(description)
320-
).unwrap();
321-
let id = PipId(0);
322-
assert_eq!(deposit, Deposits::<T>::get(id, &user.account()).expect("Deposit").amount, "incorrect deposit in reject_proposal");
323-
let vmo_origin = T::VotingMajorityOrigin::try_successful_origin().unwrap();
324-
let call = Call::<T>::reject_proposal { id };
287+
288+
let origin = T::VotingMajorityOrigin::try_successful_origin().unwrap();
289+
let call = Call::<T>::reject_proposal { id: PipId(0) };
325290
}: {
326-
call.dispatch_bypass_filter(vmo_origin).unwrap();
291+
call.dispatch_bypass_filter(origin).unwrap();
327292
}
328293
verify {
329-
assert!(!Deposits::<T>::contains_key(id, &user.account()), "deposit of the rejected proposal is present");
294+
assert!(!Proposals::<T>::contains_key(PipId(0)));
330295
}
331296

332297
prune_proposal {
333-
Pallet::<T>::set_prune_historical_pips(RawOrigin::Root.into(), false).unwrap();
334-
let user = user::<T>("proposer", 0);
335-
zeroize_deposit::<T>();
336-
let (proposal, url, description) = make_proposal::<T>();
337-
Pallet::<T>::propose(
338-
user.origin().into(),
339-
proposal,
340-
42u32.into(),
341-
Some(url),
342-
Some(description)
343-
).unwrap();
344-
let id = PipId(0);
345-
let vmo_origin = T::VotingMajorityOrigin::try_successful_origin().unwrap();
346-
let reject_call = Call::<T>::reject_proposal { id };
347-
reject_call.dispatch_bypass_filter(vmo_origin.clone()).unwrap();
348-
let call = Call::<T>::prune_proposal { id };
298+
let v in 0..T::MaxRefundsAndVotesPruned::get() as u32;
299+
300+
vote_setup::<T>(1, v);
301+
302+
let origin = T::VotingMajorityOrigin::try_successful_origin().unwrap();
303+
let reject_call = Call::<T>::reject_proposal { id: PipId(0) };
304+
reject_call.dispatch_bypass_filter(origin.clone()).unwrap();
305+
let call = Call::<T>::prune_proposal { id: PipId(0) };
349306
}: {
350-
call.dispatch_bypass_filter(vmo_origin).unwrap();
307+
call.dispatch_bypass_filter(origin).unwrap();
351308
}
352309
verify {
353-
assert!(!Proposals::<T>::contains_key(id), "pruned proposal is present");
354-
assert!(!ProposalMetadata::<T>::contains_key(id), "pruned proposal metadata is present");
310+
assert!(!Proposals::<T>::contains_key(PipId(0)));
311+
assert!(!ProposalMetadata::<T>::contains_key(PipId(0)));
355312
}
356313

357314
reschedule_execution {
@@ -399,85 +356,90 @@ benchmarks! {
399356
}
400357

401358
snapshot {
402-
let (origin0, did0) = pips_and_votes_setup::<T>(true).unwrap();
403-
T::GovernanceCommittee::bench_set_release_coordinator(did0);
404-
}: _(origin0)
359+
let v in 0..T::MaxRefundsAndVotesPruned::get() as u32;
360+
361+
vote_setup::<T>(1, v);
362+
let user = user::<T>("release_coordinator", 0);
363+
T::GovernanceCommittee::bench_set_release_coordinator(user.did());
364+
}: _(user.origin())
405365
verify {
406-
assert!(SnapshotMeta::<T>::get().is_some(), "snapshot finished incorrectly");
366+
assert!(SnapshotMeta::<T>::get().is_some());
407367
}
408368

409369
enact_snapshot_results {
410370
// The number of Approve results.
411-
let a in 0..PROPOSALS_NUM as u32 / 3;
371+
let a in 0..PROPOSALS_NUM / 3;
412372
// The number of Reject results.
413-
let r in 0..PROPOSALS_NUM as u32 / 3;
373+
let r in 0..PROPOSALS_NUM / 3;
414374
// The number of Skip results.
415-
let s in 0..PROPOSALS_NUM as u32 / 3;
375+
let s in 0..PROPOSALS_NUM / 3;
416376

417377
Pallet::<T>::set_max_pip_skip_count(RawOrigin::Root.into(), MAX_SKIPPED_COUNT).unwrap();
418-
let (origin0, did0) = pips_and_votes_setup::<T>(true).unwrap();
378+
vote_setup::<T>(PROPOSALS_NUM, T::MaxRefundsAndVotesPruned::get());
419379

420-
// snapshot
421-
T::GovernanceCommittee::bench_set_release_coordinator(did0);
422-
Pallet::<T>::snapshot(origin0.into()).unwrap();
380+
// Adds a user to the governance committee and captures a snapshot
381+
let user = user::<T>("release_coordinator", 0);
382+
T::GovernanceCommittee::bench_set_release_coordinator(user.did());
383+
Pallet::<T>::snapshot(user.origin().into()).unwrap();
423384

424-
// enact
425-
let enact_origin = T::VotingMajorityOrigin::try_successful_origin().unwrap();
426-
let enact_call = enact_call::<T>(a as usize, r as usize, s as usize);
385+
// Set up the results parameter based on the number of Approve, Reject, and Skip results.
386+
let origin = T::VotingMajorityOrigin::try_successful_origin().unwrap();
387+
let call = enact_call::<T>(a as usize, r as usize, s as usize);
427388
}: {
428-
enact_call.dispatch_bypass_filter(enact_origin).unwrap();
389+
call.dispatch_bypass_filter(origin).unwrap();
429390
}
430391
verify {
431-
assert_eq!(
432-
Pallet::<T>::snapshot_queue().len(), PROPOSALS_NUM - (a + r + s) as usize,
433-
"incorrect snapshot queue after enact_snapshot_results"
434-
);
392+
assert_eq!(SnapshotQueue::<T>::get().len(), (PROPOSALS_NUM - (a + r + s)) as usize);
435393
}
436394

437395
execute_scheduled_pip {
438-
// set up
396+
let v in 0..T::MaxRefundsAndVotesPruned::get() as u32;
397+
439398
Pallet::<T>::set_prune_historical_pips(RawOrigin::Root.into(), true).unwrap();
440-
let (origin0, did0) = pips_and_votes_setup::<T>(true).unwrap();
441-
442-
// snapshot
443-
T::GovernanceCommittee::bench_set_release_coordinator(did0);
444-
Pallet::<T>::snapshot(origin0.into()).unwrap();
445-
assert!(
446-
Pallet::<T>::snapshot_queue().len() == PROPOSALS_NUM as usize,
447-
"wrong snapshot queue length"
448-
);
449-
450-
// enact
451-
let enact_origin = T::VotingMajorityOrigin::try_successful_origin().unwrap();
452-
let enact_call = enact_call::<T>(PROPOSALS_NUM, 0, 0);
453-
enact_call.dispatch_bypass_filter(enact_origin).unwrap();
454-
455-
// execute
456-
let origin = RawOrigin::Root;
457-
}: _(origin, PipId(0))
399+
vote_setup::<T>(PROPOSALS_NUM, v);
400+
401+
// Adds a user to the governance committee and captures a snapshot
402+
let user = user::<T>("release_coordinator", 0);
403+
T::GovernanceCommittee::bench_set_release_coordinator(user.did());
404+
Pallet::<T>::snapshot(user.origin().into()).unwrap();
405+
assert!(SnapshotQueue::<T>::get().len() == PROPOSALS_NUM as usize);
406+
407+
// Set up the results parameter where all proposals are approved
408+
let origin = T::VotingMajorityOrigin::try_successful_origin().unwrap();
409+
let call = enact_call::<T>(PROPOSALS_NUM as usize, 0, 0);
410+
call.dispatch_bypass_filter(origin).unwrap();
411+
}: _(RawOrigin::Root, PipId(0))
458412
verify {
459-
execute_verify::<T>(ProposalState::Failed, "incorrect proposal state after execution").unwrap();
413+
assert!(!Proposals::<T>::contains_key(PipId(0)));
460414
}
461415

462416
expire_scheduled_pip {
463-
// set up
417+
let v in 0..T::MaxRefundsAndVotesPruned::get() as u32;
418+
464419
Pallet::<T>::set_prune_historical_pips(RawOrigin::Root.into(), true).unwrap();
465-
let (origin0, did0) = pips_and_votes_setup::<T>(true).unwrap();
420+
vote_setup::<T>(PROPOSALS_NUM, v);
466421

467-
// snapshot
468-
T::GovernanceCommittee::bench_set_release_coordinator(did0);
469-
Pallet::<T>::snapshot(origin0.into()).unwrap();
422+
// Adds a user to the governance committee and captures a snapshot
423+
let user = user::<T>("release_coordinator", 0);
424+
T::GovernanceCommittee::bench_set_release_coordinator(user.did());
425+
Pallet::<T>::snapshot(user.origin().into()).unwrap();
470426

471-
let id = PipId(0);
427+
assert_eq!(ProposalState::Pending, ProposalStates::<T>::get(PipId(0)).unwrap());
428+
}: _(RawOrigin::Root, GC_DID, PipId(0))
429+
verify {
430+
assert!(!Proposals::<T>::contains_key(PipId(0)));
431+
}
472432

473-
assert_eq!(
474-
ProposalState::Pending, Pallet::<T>::proposal_state(id).unwrap(),
475-
"incorrect proposal state before expiration"
476-
);
433+
remove_pending_storage {
434+
let v in 0..T::MaxRefundsAndVotesPruned::get() as u32;
477435

478-
let origin = RawOrigin::Root;
479-
}: _(origin, GC_DID, id)
480-
verify {
481-
execute_verify::<T>(ProposalState::Expired, "incorrect proposal state after expiration").unwrap();
436+
vote_setup::<T>(1, v);
437+
438+
// Manually add a proposal to the pending storage queue.
439+
PendingRefunds::<T>::set(BoundedVec::try_from(vec![PipId(0)]).unwrap());
440+
VotesToBePruned::<T>::set(BoundedVec::try_from(vec![PipId(0)]).unwrap());
441+
442+
}: {
443+
Pallet::<T>::remove_pending_storage();
482444
}
483445
}

0 commit comments

Comments
 (0)