Skip to main content

topsoil_core/traits/
safe_mode.rs

1// This file is part of Soil.
2
3// Copyright (C) Soil contributors.
4// Copyright (C) Parity Technologies (UK) Ltd.
5// SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later WITH Classpath-exception-2.0
6
7//! Types to put the runtime into safe mode.
8
9/// Can put the runtime into a safe mode.
10///
11/// When the runtime entered safe mode, transaction processing for most general transactions is
12/// paused.
13pub trait SafeMode {
14	/// Block number type.
15	type BlockNumber;
16
17	/// Whether safe mode is entered.
18	fn is_entered() -> bool {
19		Self::remaining().is_some()
20	}
21
22	/// How many more blocks safe mode will stay entered.
23	///
24	/// If this returns `0`, then safe mode will exit in the next block.
25	fn remaining() -> Option<Self::BlockNumber>;
26
27	/// Enter safe mode for `duration` blocks.
28	///
29	/// Should error when already entered with `AlreadyEntered`.
30	fn enter(duration: Self::BlockNumber) -> Result<(), SafeModeError>;
31
32	/// Extend safe mode for `duration` blocks.
33	///
34	/// Should error when not entered with `AlreadyExited`.
35	fn extend(duration: Self::BlockNumber) -> Result<(), SafeModeError>;
36
37	/// Exit safe mode immediately.
38	///
39	/// This takes effect already in the same block.
40	fn exit() -> Result<(), SafeModeError>;
41}
42
43/// The error type for [`SafeMode`].
44pub enum SafeModeError {
45	/// Safe mode is already entered.
46	AlreadyEntered,
47	/// Safe mode is already exited.
48	AlreadyExited,
49	/// Unknown error.
50	Unknown,
51}
52
53/// A trait to notify when the runtime enters or exits safe mode.
54pub trait SafeModeNotify {
55	/// Called when the runtime enters safe mode.
56	fn entered();
57
58	/// Called when the runtime exits safe mode.
59	fn exited();
60}
61
62impl SafeModeNotify for () {
63	fn entered() {}
64	fn exited() {}
65}