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}