mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-17 23:01:01 +00:00
pallet-scheduler: Ensure we request a preimage (#13340)
* pallet-scheduler: Ensure we request a preimage The scheduler was not requesting a preimage. When a preimage is requested, a user can deposit it without paying any fees. * Review changes
This commit is contained in:
@@ -777,6 +777,8 @@ impl<T: Config> Pallet<T> {
|
||||
) -> Result<TaskAddress<T::BlockNumber>, DispatchError> {
|
||||
let when = Self::resolve_time(when)?;
|
||||
|
||||
let lookup_hash = call.lookup_hash();
|
||||
|
||||
// sanitize maybe_periodic
|
||||
let maybe_periodic = maybe_periodic
|
||||
.filter(|p| p.1 > 1 && !p.0.is_zero())
|
||||
@@ -790,7 +792,14 @@ impl<T: Config> Pallet<T> {
|
||||
origin,
|
||||
_phantom: PhantomData,
|
||||
};
|
||||
Self::place_task(when, task).map_err(|x| x.0)
|
||||
let res = Self::place_task(when, task).map_err(|x| x.0)?;
|
||||
|
||||
if let Some(hash) = lookup_hash {
|
||||
// Request the call to be made available.
|
||||
T::Preimages::request(&hash);
|
||||
}
|
||||
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
fn do_cancel(
|
||||
@@ -862,6 +871,8 @@ impl<T: Config> Pallet<T> {
|
||||
|
||||
let when = Self::resolve_time(when)?;
|
||||
|
||||
let lookup_hash = call.lookup_hash();
|
||||
|
||||
// sanitize maybe_periodic
|
||||
let maybe_periodic = maybe_periodic
|
||||
.filter(|p| p.1 > 1 && !p.0.is_zero())
|
||||
@@ -876,7 +887,14 @@ impl<T: Config> Pallet<T> {
|
||||
origin,
|
||||
_phantom: Default::default(),
|
||||
};
|
||||
Self::place_task(when, task).map_err(|x| x.0)
|
||||
let res = Self::place_task(when, task).map_err(|x| x.0)?;
|
||||
|
||||
if let Some(hash) = lookup_hash {
|
||||
// Request the call to be made available.
|
||||
T::Preimages::request(&hash);
|
||||
}
|
||||
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
fn do_cancel_named(origin: Option<T::PalletsOrigin>, id: TaskName) -> DispatchResult {
|
||||
@@ -1027,6 +1045,7 @@ impl<T: Config> Pallet<T> {
|
||||
} else {
|
||||
Agenda::<T>::remove(when);
|
||||
}
|
||||
|
||||
postponed == 0
|
||||
}
|
||||
|
||||
|
||||
@@ -58,9 +58,10 @@ fn scheduling_with_preimages_works() {
|
||||
RuntimeCall::Logger(LoggerCall::log { i: 42, weight: Weight::from_ref_time(10) });
|
||||
let hash = <Test as frame_system::Config>::Hashing::hash_of(&call);
|
||||
let len = call.using_encoded(|x| x.len()) as u32;
|
||||
let hashed = Preimage::pick(hash, len);
|
||||
assert_ok!(Preimage::note_preimage(RuntimeOrigin::signed(0), call.encode()));
|
||||
// Important to use here `Bounded::Lookup` to ensure that we request the hash.
|
||||
let hashed = Bounded::Lookup { hash, len };
|
||||
assert_ok!(Scheduler::do_schedule(DispatchTime::At(4), None, 127, root(), hashed));
|
||||
assert_ok!(Preimage::note_preimage(RuntimeOrigin::signed(0), call.encode()));
|
||||
assert!(Preimage::is_requested(&hash));
|
||||
run_to_block(3);
|
||||
assert!(logger::log().is_empty());
|
||||
@@ -479,8 +480,10 @@ fn scheduler_handles_periodic_unavailable_preimage() {
|
||||
let call = RuntimeCall::Logger(LoggerCall::log { i: 42, weight: (max_weight / 3) * 2 });
|
||||
let hash = <Test as frame_system::Config>::Hashing::hash_of(&call);
|
||||
let len = call.using_encoded(|x| x.len()) as u32;
|
||||
let bound = Preimage::pick(hash, len);
|
||||
assert_ok!(Preimage::note(call.encode().into()));
|
||||
// Important to use here `Bounded::Lookup` to ensure that we request the hash.
|
||||
let bound = Bounded::Lookup { hash, len };
|
||||
// The preimage isn't requested yet.
|
||||
assert!(!Preimage::is_requested(&hash));
|
||||
|
||||
assert_ok!(Scheduler::do_schedule(
|
||||
DispatchTime::At(4),
|
||||
@@ -489,11 +492,18 @@ fn scheduler_handles_periodic_unavailable_preimage() {
|
||||
root(),
|
||||
bound.clone(),
|
||||
));
|
||||
|
||||
// The preimage is requested.
|
||||
assert!(Preimage::is_requested(&hash));
|
||||
|
||||
// Note the preimage.
|
||||
assert_ok!(Preimage::note_preimage(RuntimeOrigin::signed(1), call.encode()));
|
||||
|
||||
// Executes 1 times till block 4.
|
||||
run_to_block(4);
|
||||
assert_eq!(logger::log().len(), 1);
|
||||
|
||||
// Unnote the preimage.
|
||||
// Unnote the preimage
|
||||
Preimage::unnote(&hash);
|
||||
|
||||
// Does not ever execute again.
|
||||
@@ -1129,7 +1139,8 @@ fn postponed_named_task_cannot_be_rescheduled() {
|
||||
RuntimeCall::Logger(LoggerCall::log { i: 42, weight: Weight::from_ref_time(1000) });
|
||||
let hash = <Test as frame_system::Config>::Hashing::hash_of(&call);
|
||||
let len = call.using_encoded(|x| x.len()) as u32;
|
||||
let hashed = Preimage::pick(hash, len);
|
||||
// Important to use here `Bounded::Lookup` to ensure that we request the hash.
|
||||
let hashed = Bounded::Lookup { hash, len };
|
||||
let name: [u8; 32] = hash.as_ref().try_into().unwrap();
|
||||
|
||||
let address = Scheduler::do_schedule_named(
|
||||
|
||||
Reference in New Issue
Block a user