21
21
22
22
use super :: * ;
23
23
24
- use frame_benchmarking:: v1:: { account, benchmarks, whitelisted_caller, BenchmarkError } ;
24
+ use crate :: Pallet as Lottery ;
25
+ use frame_benchmarking:: {
26
+ impl_benchmark_test_suite,
27
+ v1:: { account, whitelisted_caller, BenchmarkError } ,
28
+ v2:: * ,
29
+ } ;
25
30
use frame_support:: {
26
31
storage:: bounded_vec:: BoundedVec ,
27
32
traits:: { EnsureOrigin , OnInitialize } ,
28
33
} ;
29
34
use frame_system:: RawOrigin ;
30
35
use sp_runtime:: traits:: { Bounded , Zero } ;
31
36
32
- use crate :: Pallet as Lottery ;
33
-
34
37
// Set up and start a lottery
35
38
fn setup_lottery < T : Config > ( repeat : bool ) -> Result < ( ) , & ' static str > {
36
39
let price = T :: Currency :: minimum_balance ( ) ;
@@ -50,72 +53,100 @@ fn setup_lottery<T: Config>(repeat: bool) -> Result<(), &'static str> {
50
53
Ok ( ( ) )
51
54
}
52
55
53
- benchmarks ! {
54
- buy_ticket {
56
+ #[ benchmarks]
57
+ mod benchmarks {
58
+ use super :: * ;
59
+
60
+ #[ benchmark]
61
+ fn buy_ticket ( ) -> Result < ( ) , BenchmarkError > {
55
62
let caller = whitelisted_caller ( ) ;
56
63
T :: Currency :: make_free_balance_be ( & caller, BalanceOf :: < T > :: max_value ( ) ) ;
57
64
setup_lottery :: < T > ( false ) ?;
58
65
// force user to have a long vec of calls participating
59
66
let set_code_index: CallIndex = Lottery :: < T > :: call_to_index (
60
- & frame_system:: Call :: <T >:: set_code{ code: vec![ ] } . into( )
67
+ & frame_system:: Call :: < T > :: set_code { code : vec ! [ ] } . into ( ) ,
61
68
) ?;
62
69
let already_called: ( u32 , BoundedVec < CallIndex , T :: MaxCalls > ) = (
63
70
LotteryIndex :: < T > :: get ( ) ,
64
71
BoundedVec :: < CallIndex , T :: MaxCalls > :: try_from ( vec ! [
65
72
set_code_index;
66
- T :: MaxCalls :: get( ) . saturating_sub( 1 ) as usize
67
- ] ) . unwrap( ) ,
73
+ T :: MaxCalls :: get( ) . saturating_sub( 1 )
74
+ as usize
75
+ ] )
76
+ . unwrap ( ) ,
68
77
) ;
69
78
Participants :: < T > :: insert ( & caller, already_called) ;
70
79
71
80
let call = frame_system:: Call :: < T > :: remark { remark : vec ! [ ] } ;
72
- } : _( RawOrigin :: Signed ( caller) , Box :: new( call. into( ) ) )
73
- verify {
81
+
82
+ #[ extrinsic_call]
83
+ _ ( RawOrigin :: Signed ( caller) , Box :: new ( call. into ( ) ) ) ;
84
+
74
85
assert_eq ! ( TicketsCount :: <T >:: get( ) , 1 ) ;
86
+
87
+ Ok ( ( ) )
75
88
}
76
89
77
- set_calls {
78
- let n in 0 .. T :: MaxCalls :: get( ) as u32 ;
90
+ # [ benchmark ]
91
+ fn set_calls ( n : Linear < 0 , { T :: MaxCalls :: get ( ) } > ) -> Result < ( ) , BenchmarkError > {
79
92
let calls = vec ! [ frame_system:: Call :: <T >:: remark { remark: vec![ ] } . into( ) ; n as usize ] ;
80
93
let origin =
81
94
T :: ManagerOrigin :: try_successful_origin ( ) . map_err ( |_| BenchmarkError :: Weightless ) ?;
82
95
assert ! ( CallIndices :: <T >:: get( ) . is_empty( ) ) ;
83
- } : _<T :: RuntimeOrigin >( origin, calls)
84
- verify {
96
+
97
+ #[ extrinsic_call]
98
+ _ ( origin as T :: RuntimeOrigin , calls) ;
99
+
85
100
if !n. is_zero ( ) {
86
101
assert ! ( !CallIndices :: <T >:: get( ) . is_empty( ) ) ;
87
102
}
103
+
104
+ Ok ( ( ) )
88
105
}
89
106
90
- start_lottery {
107
+ #[ benchmark]
108
+ fn start_lottery ( ) -> Result < ( ) , BenchmarkError > {
91
109
let price = BalanceOf :: < T > :: max_value ( ) ;
92
110
let end = 10u32 . into ( ) ;
93
111
let payout = 5u32 . into ( ) ;
94
112
let origin =
95
113
T :: ManagerOrigin :: try_successful_origin ( ) . map_err ( |_| BenchmarkError :: Weightless ) ?;
96
- } : _<T :: RuntimeOrigin >( origin, price, end, payout, true )
97
- verify {
114
+
115
+ #[ extrinsic_call]
116
+ _ ( origin as T :: RuntimeOrigin , price, end, payout, true ) ;
117
+
98
118
assert ! ( crate :: Lottery :: <T >:: get( ) . is_some( ) ) ;
119
+
120
+ Ok ( ( ) )
99
121
}
100
122
101
- stop_repeat {
123
+ #[ benchmark]
124
+ fn stop_repeat ( ) -> Result < ( ) , BenchmarkError > {
102
125
setup_lottery :: < T > ( true ) ?;
103
126
assert_eq ! ( crate :: Lottery :: <T >:: get( ) . unwrap( ) . repeat, true ) ;
104
127
let origin =
105
128
T :: ManagerOrigin :: try_successful_origin ( ) . map_err ( |_| BenchmarkError :: Weightless ) ?;
106
- } : _<T :: RuntimeOrigin >( origin)
107
- verify {
129
+
130
+ #[ extrinsic_call]
131
+ _ ( origin as T :: RuntimeOrigin ) ;
132
+
108
133
assert_eq ! ( crate :: Lottery :: <T >:: get( ) . unwrap( ) . repeat, false ) ;
134
+
135
+ Ok ( ( ) )
109
136
}
110
137
111
- on_initialize_end {
138
+ #[ benchmark]
139
+ fn on_initialize_end ( ) -> Result < ( ) , BenchmarkError > {
112
140
setup_lottery :: < T > ( false ) ?;
113
141
let winner = account ( "winner" , 0 , 0 ) ;
114
142
// User needs more than min balance to get ticket
115
143
T :: Currency :: make_free_balance_be ( & winner, T :: Currency :: minimum_balance ( ) * 10u32 . into ( ) ) ;
116
144
// Make sure lottery account has at least min balance too
117
145
let lottery_account = Lottery :: < T > :: account_id ( ) ;
118
- T :: Currency :: make_free_balance_be( & lottery_account, T :: Currency :: minimum_balance( ) * 10u32 . into( ) ) ;
146
+ T :: Currency :: make_free_balance_be (
147
+ & lottery_account,
148
+ T :: Currency :: minimum_balance ( ) * 10u32 . into ( ) ,
149
+ ) ;
119
150
// Buy a ticket
120
151
let call = frame_system:: Call :: < T > :: remark { remark : vec ! [ ] } ;
121
152
Lottery :: < T > :: buy_ticket ( RawOrigin :: Signed ( winner. clone ( ) ) . into ( ) , Box :: new ( call. into ( ) ) ) ?;
@@ -124,29 +155,37 @@ benchmarks! {
124
155
// Assert that lotto is set up for winner
125
156
assert_eq ! ( TicketsCount :: <T >:: get( ) , 1 ) ;
126
157
assert ! ( !Lottery :: <T >:: pot( ) . 1 . is_zero( ) ) ;
127
- } : {
128
- // Generate `MaxGenerateRandom` numbers for worst case scenario
129
- for i in 0 .. T :: MaxGenerateRandom :: get( ) {
130
- Lottery :: <T >:: generate_random_number( i) ;
158
+
159
+ #[ block]
160
+ {
161
+ // Generate `MaxGenerateRandom` numbers for worst case scenario
162
+ for i in 0 ..T :: MaxGenerateRandom :: get ( ) {
163
+ Lottery :: < T > :: generate_random_number ( i) ;
164
+ }
165
+ // Start lottery has block 15 configured for payout
166
+ Lottery :: < T > :: on_initialize ( 15u32 . into ( ) ) ;
131
167
}
132
- // Start lottery has block 15 configured for payout
133
- Lottery :: <T >:: on_initialize( 15u32 . into( ) ) ;
134
- }
135
- verify {
168
+
136
169
assert ! ( crate :: Lottery :: <T >:: get( ) . is_none( ) ) ;
137
170
assert_eq ! ( TicketsCount :: <T >:: get( ) , 0 ) ;
138
171
assert_eq ! ( Lottery :: <T >:: pot( ) . 1 , 0u32 . into( ) ) ;
139
- assert!( !T :: Currency :: free_balance( & winner) . is_zero( ) )
172
+ assert ! ( !T :: Currency :: free_balance( & winner) . is_zero( ) ) ;
173
+
174
+ Ok ( ( ) )
140
175
}
141
176
142
- on_initialize_repeat {
177
+ #[ benchmark]
178
+ fn on_initialize_repeat ( ) -> Result < ( ) , BenchmarkError > {
143
179
setup_lottery :: < T > ( true ) ?;
144
180
let winner = account ( "winner" , 0 , 0 ) ;
145
181
// User needs more than min balance to get ticket
146
182
T :: Currency :: make_free_balance_be ( & winner, T :: Currency :: minimum_balance ( ) * 10u32 . into ( ) ) ;
147
183
// Make sure lottery account has at least min balance too
148
184
let lottery_account = Lottery :: < T > :: account_id ( ) ;
149
- T :: Currency :: make_free_balance_be( & lottery_account, T :: Currency :: minimum_balance( ) * 10u32 . into( ) ) ;
185
+ T :: Currency :: make_free_balance_be (
186
+ & lottery_account,
187
+ T :: Currency :: minimum_balance ( ) * 10u32 . into ( ) ,
188
+ ) ;
150
189
// Buy a ticket
151
190
let call = frame_system:: Call :: < T > :: remark { remark : vec ! [ ] } ;
152
191
Lottery :: < T > :: buy_ticket ( RawOrigin :: Signed ( winner. clone ( ) ) . into ( ) , Box :: new ( call. into ( ) ) ) ?;
@@ -155,20 +194,24 @@ benchmarks! {
155
194
// Assert that lotto is set up for winner
156
195
assert_eq ! ( TicketsCount :: <T >:: get( ) , 1 ) ;
157
196
assert ! ( !Lottery :: <T >:: pot( ) . 1 . is_zero( ) ) ;
158
- } : {
159
- // Generate `MaxGenerateRandom` numbers for worst case scenario
160
- for i in 0 .. T :: MaxGenerateRandom :: get( ) {
161
- Lottery :: <T >:: generate_random_number( i) ;
197
+
198
+ #[ block]
199
+ {
200
+ // Generate `MaxGenerateRandom` numbers for worst case scenario
201
+ for i in 0 ..T :: MaxGenerateRandom :: get ( ) {
202
+ Lottery :: < T > :: generate_random_number ( i) ;
203
+ }
204
+ // Start lottery has block 15 configured for payout
205
+ Lottery :: < T > :: on_initialize ( 15u32 . into ( ) ) ;
162
206
}
163
- // Start lottery has block 15 configured for payout
164
- Lottery :: <T >:: on_initialize( 15u32 . into( ) ) ;
165
- }
166
- verify {
207
+
167
208
assert ! ( crate :: Lottery :: <T >:: get( ) . is_some( ) ) ;
168
209
assert_eq ! ( LotteryIndex :: <T >:: get( ) , 2 ) ;
169
210
assert_eq ! ( TicketsCount :: <T >:: get( ) , 0 ) ;
170
211
assert_eq ! ( Lottery :: <T >:: pot( ) . 1 , 0u32 . into( ) ) ;
171
- assert!( !T :: Currency :: free_balance( & winner) . is_zero( ) )
212
+ assert ! ( !T :: Currency :: free_balance( & winner) . is_zero( ) ) ;
213
+
214
+ Ok ( ( ) )
172
215
}
173
216
174
217
impl_benchmark_test_suite ! ( Lottery , crate :: mock:: new_test_ext( ) , crate :: mock:: Test ) ;
0 commit comments