1use super::prelude::*;
2use super::Opcode;
3
4pub type Trap = Opcode;
6
7#[derive(Clone, Copy, Debug, Eq, PartialEq)]
9pub enum Capture<E, T> {
10 Exit(E),
12 Trap(T),
15}
16
17#[derive(Clone, Debug, Eq, PartialEq)]
19#[cfg_attr(
20 feature = "with-codec",
21 derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
22)]
23#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
24pub enum ExitReason {
25 Succeed(ExitSucceed),
27 Error(ExitError),
29 Revert(ExitRevert),
31 Fatal(ExitFatal),
34}
35
36impl ExitReason {
37 #[must_use]
39 pub const fn is_succeed(&self) -> bool {
40 matches!(self, Self::Succeed(_))
41 }
42
43 #[must_use]
45 pub const fn is_error(&self) -> bool {
46 matches!(self, Self::Error(_))
47 }
48
49 #[must_use]
51 pub const fn is_revert(&self) -> bool {
52 matches!(self, Self::Revert(_))
53 }
54
55 #[must_use]
57 pub const fn is_fatal(&self) -> bool {
58 matches!(self, Self::Fatal(_))
59 }
60}
61
62#[derive(Clone, Copy, Debug, Eq, PartialEq)]
64#[cfg_attr(
65 feature = "with-codec",
66 derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
67)]
68#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
69pub enum ExitSucceed {
70 Stopped,
72 Returned,
74 Suicided,
76}
77
78impl From<ExitSucceed> for ExitReason {
79 fn from(s: ExitSucceed) -> Self {
80 Self::Succeed(s)
81 }
82}
83
84#[derive(Clone, Copy, Debug, Eq, PartialEq)]
86#[cfg_attr(
87 feature = "with-codec",
88 derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
89)]
90#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
91pub enum ExitRevert {
92 Reverted,
94}
95
96impl From<ExitRevert> for ExitReason {
97 fn from(s: ExitRevert) -> Self {
98 Self::Revert(s)
99 }
100}
101
102#[derive(Clone, Debug, Eq, PartialEq)]
104#[cfg_attr(
105 feature = "with-codec",
106 derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
107)]
108#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
109pub enum ExitError {
110 #[cfg_attr(feature = "with-codec", codec(index = 0))]
112 StackUnderflow,
113 #[cfg_attr(feature = "with-codec", codec(index = 1))]
115 StackOverflow,
116 #[cfg_attr(feature = "with-codec", codec(index = 2))]
118 InvalidJump,
119 #[cfg_attr(feature = "with-codec", codec(index = 3))]
121 InvalidRange,
122 #[cfg_attr(feature = "with-codec", codec(index = 4))]
124 DesignatedInvalid,
125 #[cfg_attr(feature = "with-codec", codec(index = 5))]
127 CallTooDeep,
128 #[cfg_attr(feature = "with-codec", codec(index = 6))]
130 CreateCollision,
131 #[cfg_attr(feature = "with-codec", codec(index = 7))]
133 CreateContractLimit,
134
135 #[cfg_attr(feature = "with-codec", codec(index = 15))]
137 InvalidCode(Opcode),
138
139 #[cfg_attr(feature = "with-codec", codec(index = 8))]
142 OutOfOffset,
143 #[cfg_attr(feature = "with-codec", codec(index = 9))]
145 OutOfGas,
146 #[cfg_attr(feature = "with-codec", codec(index = 10))]
148 OutOfFund,
149
150 #[allow(clippy::upper_case_acronyms)]
152 #[cfg_attr(feature = "with-codec", codec(index = 11))]
153 PCUnderflow,
154
155 #[cfg_attr(feature = "with-codec", codec(index = 12))]
157 CreateEmpty,
158
159 #[cfg_attr(feature = "with-codec", codec(index = 13))]
161 Other(Cow<'static, str>),
162
163 #[cfg_attr(feature = "with-codec", codec(index = 14))]
166 MaxNonce,
167
168 #[cfg_attr(feature = "with-codec", codec(index = 15))]
170 UsizeOverflow,
171 #[cfg_attr(feature = "with-codec", codec(index = 16))]
172 CreateContractStartingWithEF,
173}
174
175impl From<ExitError> for ExitReason {
176 fn from(s: ExitError) -> Self {
177 Self::Error(s)
178 }
179}
180
181#[derive(Clone, Debug, Eq, PartialEq)]
183#[cfg_attr(
184 feature = "with-codec",
185 derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
186)]
187#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
188pub enum ExitFatal {
189 NotSupported,
191 UnhandledInterrupt,
193 CallErrorAsFatal(ExitError),
195
196 Other(Cow<'static, str>),
198}
199
200impl From<ExitFatal> for ExitReason {
201 fn from(s: ExitFatal) -> Self {
202 Self::Fatal(s)
203 }
204}