1616use crate :: * ;
1717
1818use frame_benchmarking:: benchmarks;
19- use frame_support:: {
20- dispatch:: { DispatchError , DispatchResult } ,
21- traits:: UnfilteredDispatchable ,
22- } ;
19+ use frame_support:: { dispatch:: DispatchResult , traits:: UnfilteredDispatchable } ;
2320use frame_system:: RawOrigin ;
24- use pallet_identity:: benchmarking:: { user, User } ;
21+ use pallet_identity:: benchmarking:: { user, User , UserBuilder } ;
2522use polymesh_primitives:: { MaybeBlock , SystematicIssuers , GC_DID } ;
2623use rand:: { seq:: SliceRandom , SeedableRng } ;
2724use rand_chacha:: ChaCha20Rng ;
25+ use scale_info:: prelude:: format;
2826use 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
5452use 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
140125fn 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
158143fn 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-
182155benchmarks ! {
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