1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// This file is part of Soil.
// Copyright (C) Soil contributors.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later WITH Classpath-exception-2.0
//! Types to pause calls in the runtime.
/// Can pause specific transactions from being processed.
///
/// Note that paused transactions will not be queued for later execution. Instead they will be
/// dropped.
pub trait TransactionPause {
/// How to unambiguously identify a call.
///
/// For example `(pallet_index, call_index)`.
type CallIdentifier;
/// Whether this call is paused.
fn is_paused(call: Self::CallIdentifier) -> bool;
/// Whether this call can be paused.
///
/// This holds for the current block, but may change in the future.
fn can_pause(call: Self::CallIdentifier) -> bool;
/// Pause this call immediately.
///
/// This takes effect in the same block and must succeed if `can_pause` returns `true`.
fn pause(call: Self::CallIdentifier) -> Result<(), TransactionPauseError>;
/// Unpause this call immediately.
///
/// This takes effect in the same block and must succeed if `is_paused` returns `true`. This
/// invariant is important to not have un-resumable calls.
fn unpause(call: Self::CallIdentifier) -> Result<(), TransactionPauseError>;
}
/// The error type for [`TransactionPause`].
pub enum TransactionPauseError {
/// The call could not be found in the runtime.
///
/// This is a permanent error but could change after a runtime upgrade.
NotFound,
/// Call cannot be paused.
///
/// This may or may not resolve in a future block.
Unpausable,
/// Call is already paused.
AlreadyPaused,
/// Call is already unpaused.
AlreadyUnpaused,
/// Unknown error.
Unknown,
}