Skip to content

Commit 5d8c7ff

Browse files
committed
xtokens impl DelayedTask
1 parent cb41ec5 commit 5d8c7ff

File tree

10 files changed

+630
-45
lines changed

10 files changed

+630
-45
lines changed

asset-registry/src/mock/para.rs

+22-1
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,21 @@ use frame_support::{
1111
};
1212
use frame_system::{EnsureRoot, EnsureSignedBy};
1313
use orml_traits::{
14+
define_combined_delayed_task,
15+
delay_tasks::DelayedTask,
1416
location::{AbsoluteReserveProvider, RelativeReserveProvider},
1517
parameter_type_with_key, FixedConversionRateProvider, MultiCurrency,
1618
};
1719
use orml_xcm_support::{IsNativeConcrete, MultiCurrencyAdapter, MultiNativeAsset};
20+
use orml_xtokens::XtokensDelayedTask;
1821
use pallet_xcm::XcmPassthrough;
1922
use parity_scale_codec::{Decode, Encode, MaxEncodedLen};
2023
use polkadot_parachain_primitives::primitives::Sibling;
24+
use scale_info::TypeInfo;
2125
use sp_core::Get;
2226
use sp_runtime::{
2327
traits::{AccountIdConversion, Convert, IdentityLookup},
24-
AccountId32,
28+
AccountId32, DispatchResult, RuntimeDebug,
2529
};
2630
use xcm::v4::{prelude::*, Weight};
2731
use xcm_builder::{
@@ -310,6 +314,18 @@ parameter_type_with_key! {
310314
};
311315
}
312316

317+
define_combined_delayed_task! {
318+
#[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)]
319+
pub enum DelayedTasks {
320+
XtokensDelayedTask(XtokensDelayedTask<Runtime>),
321+
}
322+
}
323+
324+
parameter_types! {
325+
pub const GetDelayBlocks: u64 = 1000;
326+
pub const GetReserveId: [u8; 8] = *b"xtokensr";
327+
}
328+
313329
impl orml_xtokens::Config for Runtime {
314330
type RuntimeEvent = RuntimeEvent;
315331
type Balance = Balance;
@@ -327,6 +343,11 @@ impl orml_xtokens::Config for Runtime {
327343
type ReserveProvider = RelativeReserveProvider;
328344
type RateLimiter = ();
329345
type RateLimiterId = ();
346+
type DelayedTask = DelayedTasks;
347+
type DelayTasks = orml_xtokens::DisabledTransferAssets<Runtime>;
348+
type DelayBlocks = GetDelayBlocks;
349+
type Currency = Tokens;
350+
type ReserveId = GetReserveId;
330351
}
331352

332353
impl orml_xcm::Config for Runtime {

delay-tasks/Cargo.toml

-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ sp-std = { workspace = true }
2121
xcm = { workspace = true }
2222

2323
orml-traits = { path = "../traits", version = "0.7.0", default-features = false }
24-
orml-xtokens = { path = "../xtokens", version = "0.7.0", default-features = false }
2524

2625
[dev-dependencies]
2726
sp-core = { workspace = true, features = ["std"] }
@@ -33,7 +32,6 @@ std = [
3332
"frame-support/std",
3433
"frame-system/std",
3534
"orml-traits/std",
36-
"orml-xtokens/std",
3735
"parity-scale-codec/std",
3836
"scale-info/std",
3937
"serde",

delay-tasks/src/lib.rs

+40-30
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
#![cfg_attr(not(feature = "std"), no_std)]
22

33
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;
107
use scale_info::TypeInfo;
118
use sp_runtime::{
12-
traits::{CheckedAdd, Convert, Zero},
9+
traits::{CheckedAdd, Zero},
1310
ArithmeticError,
1411
};
1512
use sp_std::fmt::Debug;
16-
use xcm::v4::prelude::*;
1713

1814
pub use module::*;
1915

@@ -27,7 +23,7 @@ pub mod module {
2723
type Nonce = u64;
2824

2925
#[pallet::config]
30-
pub trait Config: frame_system::Config + orml_xtokens::Config {
26+
pub trait Config: frame_system::Config {
3127
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
3228

3329
type GovernanceOrigin: EnsureOrigin<<Self as frame_system::Config>::RuntimeOrigin>;
@@ -37,24 +33,31 @@ pub mod module {
3733

3834
#[pallet::error]
3935
pub enum Error<T> {
40-
BelowMinBondThreshold,
4136
InvalidDelayBlock,
4237
InvalidId,
4338
}
4439

4540
#[pallet::event]
4641
#[pallet::generate_deposit(pub(crate) fn deposit_event)]
4742
pub enum Event<T: Config> {
48-
/// A task has been dispatched on_idle.
4943
DelayedTaskAdded {
5044
id: Nonce,
5145
task: T::Task,
46+
execute_block: BlockNumberFor<T>,
5247
},
5348
DelayedTaskExecuted {
5449
id: Nonce,
5550
result: DispatchResult,
5651
},
57-
DelayedTaskPreExecuteFailed {
52+
DelayedTaskReDelayed {
53+
id: Nonce,
54+
execute_block: BlockNumberFor<T>,
55+
},
56+
DelayedTaskTryExecuteFailed {
57+
id: Nonce,
58+
error: DispatchError,
59+
},
60+
DelayedTaskCanceled {
5861
id: Nonce,
5962
},
6063
}
@@ -113,6 +116,10 @@ pub mod module {
113116
DelayedTaskQueue::<T>::insert(new_execute_block, id, ());
114117
*execute_block = new_execute_block;
115118

119+
Self::deposit_event(Event::<T>::DelayedTaskReDelayed {
120+
id,
121+
execute_block: new_execute_block,
122+
});
116123
Ok(())
117124
})?;
118125

@@ -128,6 +135,7 @@ pub mod module {
128135
delay_task.on_cancel()?;
129136
DelayedTaskQueue::<T>::remove(execute_block, id);
130137

138+
Self::deposit_event(Event::<T>::DelayedTaskCanceled { id });
131139
Ok(())
132140
}
133141
}
@@ -140,25 +148,23 @@ pub mod module {
140148
Self::deposit_event(Event::<T>::DelayedTaskExecuted { id, result });
141149
}
142150
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 });
144158
}
145159
}
146160
}
147161
}
148162

149163
#[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> {
151165
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()?;
162168

163169
Ok(delayed_task.delayed_execute())
164170
}
@@ -175,21 +181,25 @@ pub mod module {
175181
}
176182
}
177183

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 {
180186
ensure!(!delay_blocks.is_zero(), Error::<T>::InvalidDelayBlock);
181187

182188
task.pre_delay()?;
183189

184190
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()
186192
.checked_add(&delay_blocks)
187193
.ok_or(ArithmeticError::Overflow)?;
188194

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, ());
191197

192-
Self::deposit_event(Event::<T>::DelayedTaskAdded { id, task });
198+
Self::deposit_event(Event::<T>::DelayedTaskAdded {
199+
id,
200+
task,
201+
execute_block,
202+
});
193203
Ok(())
194204
}
195205
}

0 commit comments

Comments
 (0)