1
1
#![ cfg_attr( not( feature = "std" ) , no_std) ]
2
2
3
3
use frame_support:: { pallet_prelude:: * , traits:: schedule:: DispatchTime , transactional, weights:: Weight } ;
4
- use frame_system:: { ensure_signed, pallet_prelude:: * } ;
5
- use orml_traits:: {
6
- delay_tasks:: { DelayTasks , DelayedTask } ,
7
- NamedMultiReservableCurrency ,
8
- } ;
9
- use parity_scale_codec:: { Decode , Encode , FullCodec } ;
4
+ use frame_system:: pallet_prelude:: * ;
5
+ use orml_traits:: delay_tasks:: { DelayTasksManager , DelayedTask } ;
6
+ use parity_scale_codec:: FullCodec ;
10
7
use scale_info:: TypeInfo ;
11
8
use sp_runtime:: {
12
- traits:: { CheckedAdd , Convert , Zero } ,
9
+ traits:: { CheckedAdd , Zero } ,
13
10
ArithmeticError ,
14
11
} ;
15
12
use sp_std:: fmt:: Debug ;
16
- use xcm:: v4:: prelude:: * ;
17
13
18
14
pub use module:: * ;
19
15
@@ -27,7 +23,7 @@ pub mod module {
27
23
type Nonce = u64 ;
28
24
29
25
#[ pallet:: config]
30
- pub trait Config : frame_system:: Config + orml_xtokens :: Config {
26
+ pub trait Config : frame_system:: Config {
31
27
type RuntimeEvent : From < Event < Self > > + IsType < <Self as frame_system:: Config >:: RuntimeEvent > ;
32
28
33
29
type GovernanceOrigin : EnsureOrigin < <Self as frame_system:: Config >:: RuntimeOrigin > ;
@@ -37,24 +33,31 @@ pub mod module {
37
33
38
34
#[ pallet:: error]
39
35
pub enum Error < T > {
40
- BelowMinBondThreshold ,
41
36
InvalidDelayBlock ,
42
37
InvalidId ,
43
38
}
44
39
45
40
#[ pallet:: event]
46
41
#[ pallet:: generate_deposit( pub ( crate ) fn deposit_event) ]
47
42
pub enum Event < T : Config > {
48
- /// A task has been dispatched on_idle.
49
43
DelayedTaskAdded {
50
44
id : Nonce ,
51
45
task : T :: Task ,
46
+ execute_block : BlockNumberFor < T > ,
52
47
} ,
53
48
DelayedTaskExecuted {
54
49
id : Nonce ,
55
50
result : DispatchResult ,
56
51
} ,
57
- DelayedTaskPreExecuteFailed {
52
+ DelayedTaskReDelayed {
53
+ id : Nonce ,
54
+ execute_block : BlockNumberFor < T > ,
55
+ } ,
56
+ DelayedTaskTryExecuteFailed {
57
+ id : Nonce ,
58
+ error : DispatchError ,
59
+ } ,
60
+ DelayedTaskCanceled {
58
61
id : Nonce ,
59
62
} ,
60
63
}
@@ -113,6 +116,10 @@ pub mod module {
113
116
DelayedTaskQueue :: < T > :: insert ( new_execute_block, id, ( ) ) ;
114
117
* execute_block = new_execute_block;
115
118
119
+ Self :: deposit_event ( Event :: < T > :: DelayedTaskReDelayed {
120
+ id,
121
+ execute_block : new_execute_block,
122
+ } ) ;
116
123
Ok ( ( ) )
117
124
} ) ?;
118
125
@@ -128,6 +135,7 @@ pub mod module {
128
135
delay_task. on_cancel ( ) ?;
129
136
DelayedTaskQueue :: < T > :: remove ( execute_block, id) ;
130
137
138
+ Self :: deposit_event ( Event :: < T > :: DelayedTaskCanceled { id } ) ;
131
139
Ok ( ( ) )
132
140
}
133
141
}
@@ -140,25 +148,23 @@ pub mod module {
140
148
Self :: deposit_event ( Event :: < T > :: DelayedTaskExecuted { id, result } ) ;
141
149
}
142
150
Err ( e) => {
143
- Self :: deposit_event ( Event :: < T > :: DelayedTaskPreExecuteFailed { id } ) ;
151
+ log:: debug!(
152
+ target: "delay-tasks" ,
153
+ "try executing delayed task {:?} failed for: {:?}. The delayed task still exists, but needs to be canceled or reset delay block." ,
154
+ id,
155
+ e
156
+ ) ;
157
+ Self :: deposit_event ( Event :: < T > :: DelayedTaskTryExecuteFailed { id, error : e } ) ;
144
158
}
145
159
}
146
160
}
147
161
}
148
162
149
163
#[ transactional]
150
- fn do_execute_delayed_task ( id : Nonce ) -> sp_std:: result:: Result < DispatchResult , DispatchError > {
164
+ pub ( crate ) fn do_execute_delayed_task ( id : Nonce ) -> sp_std:: result:: Result < DispatchResult , DispatchError > {
151
165
let ( delayed_task, _) = DelayedTasks :: < T > :: take ( id) . ok_or ( Error :: < T > :: InvalidId ) ?;
152
- delayed_task. pre_delayed_execute ( ) . map_err ( |e| {
153
- log:: debug!(
154
- target: "delay-tasks" ,
155
- "delayed task#{:?}:\n {:?}\n do pre_execute_delayed failed for: {:?}" ,
156
- id,
157
- delayed_task,
158
- e
159
- ) ;
160
- e
161
- } ) ?;
166
+
167
+ delayed_task. pre_delayed_execute ( ) ?;
162
168
163
169
Ok ( delayed_task. delayed_execute ( ) )
164
170
}
@@ -175,21 +181,25 @@ pub mod module {
175
181
}
176
182
}
177
183
178
- impl < T : Config > DelayTasks < T :: Task , BlockNumberFor < T > > for Pallet < T > {
179
- fn schedule_delay_task ( task : T :: Task , delay_blocks : BlockNumberFor < T > ) -> DispatchResult {
184
+ impl < T : Config > DelayTasksManager < T :: Task , BlockNumberFor < T > > for Pallet < T > {
185
+ fn add_delay_task ( task : T :: Task , delay_blocks : BlockNumberFor < T > ) -> DispatchResult {
180
186
ensure ! ( !delay_blocks. is_zero( ) , Error :: <T >:: InvalidDelayBlock ) ;
181
187
182
188
task. pre_delay ( ) ?;
183
189
184
190
let id = Self :: get_next_delayed_task_id ( ) ?;
185
- let execute_block_number = frame_system:: Pallet :: < T > :: block_number ( )
191
+ let execute_block = frame_system:: Pallet :: < T > :: block_number ( )
186
192
. checked_add ( & delay_blocks)
187
193
. ok_or ( ArithmeticError :: Overflow ) ?;
188
194
189
- DelayedTasks :: < T > :: insert ( id, ( & task, execute_block_number ) ) ;
190
- DelayedTaskQueue :: < T > :: insert ( execute_block_number , id, ( ) ) ;
195
+ DelayedTasks :: < T > :: insert ( id, ( & task, execute_block ) ) ;
196
+ DelayedTaskQueue :: < T > :: insert ( execute_block , id, ( ) ) ;
191
197
192
- Self :: deposit_event ( Event :: < T > :: DelayedTaskAdded { id, task } ) ;
198
+ Self :: deposit_event ( Event :: < T > :: DelayedTaskAdded {
199
+ id,
200
+ task,
201
+ execute_block,
202
+ } ) ;
193
203
Ok ( ( ) )
194
204
}
195
205
}
0 commit comments