1use crate::Opcode;
2use alloc::borrow::Cow;
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(
22 scale_codec::Encode,
23 scale_codec::Decode,
24 scale_codec::DecodeWithMemTracking,
25 scale_info::TypeInfo
26 )
27)]
28#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
29pub enum ExitReason {
30 Succeed(ExitSucceed),
32 Error(ExitError),
34 Revert(ExitRevert),
36 Fatal(ExitFatal),
39}
40
41impl ExitReason {
42 pub fn is_succeed(&self) -> bool {
44 matches!(self, Self::Succeed(_))
45 }
46
47 pub fn is_error(&self) -> bool {
49 matches!(self, Self::Error(_))
50 }
51
52 pub fn is_revert(&self) -> bool {
54 matches!(self, Self::Revert(_))
55 }
56
57 pub fn is_fatal(&self) -> bool {
59 matches!(self, Self::Fatal(_))
60 }
61}
62
63#[derive(Clone, Copy, Debug, Eq, PartialEq)]
65#[cfg_attr(
66 feature = "with-codec",
67 derive(
68 scale_codec::Encode,
69 scale_codec::Decode,
70 scale_codec::DecodeWithMemTracking,
71 scale_info::TypeInfo
72 )
73)]
74#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
75pub enum ExitSucceed {
76 Stopped,
78 Returned,
80 Suicided,
82}
83
84impl From<ExitSucceed> for ExitReason {
85 fn from(s: ExitSucceed) -> Self {
86 Self::Succeed(s)
87 }
88}
89
90#[derive(Clone, Copy, Debug, Eq, PartialEq)]
92#[cfg_attr(
93 feature = "with-codec",
94 derive(
95 scale_codec::Encode,
96 scale_codec::Decode,
97 scale_codec::DecodeWithMemTracking,
98 scale_info::TypeInfo
99 )
100)]
101#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
102pub enum ExitRevert {
103 Reverted,
105}
106
107impl From<ExitRevert> for ExitReason {
108 fn from(s: ExitRevert) -> Self {
109 Self::Revert(s)
110 }
111}
112
113#[derive(Clone, Debug, Eq, PartialEq)]
115#[cfg_attr(
116 feature = "with-codec",
117 derive(
118 scale_codec::Encode,
119 scale_codec::Decode,
120 scale_codec::DecodeWithMemTracking,
121 scale_info::TypeInfo
122 )
123)]
124#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
125pub enum ExitError {
126 #[cfg_attr(feature = "with-codec", codec(index = 0))]
128 StackUnderflow,
129 #[cfg_attr(feature = "with-codec", codec(index = 1))]
131 StackOverflow,
132 #[cfg_attr(feature = "with-codec", codec(index = 2))]
134 InvalidJump,
135 #[cfg_attr(feature = "with-codec", codec(index = 3))]
137 InvalidRange,
138 #[cfg_attr(feature = "with-codec", codec(index = 4))]
140 DesignatedInvalid,
141 #[cfg_attr(feature = "with-codec", codec(index = 5))]
143 CallTooDeep,
144 #[cfg_attr(feature = "with-codec", codec(index = 6))]
146 CreateCollision,
147 #[cfg_attr(feature = "with-codec", codec(index = 7))]
149 CreateContractLimit,
150
151 #[cfg_attr(feature = "with-codec", codec(index = 15))]
153 InvalidCode(Opcode),
154
155 #[cfg_attr(feature = "with-codec", codec(index = 8))]
158 OutOfOffset,
159 #[cfg_attr(feature = "with-codec", codec(index = 9))]
161 OutOfGas,
162 #[cfg_attr(feature = "with-codec", codec(index = 10))]
164 OutOfFund,
165
166 #[allow(clippy::upper_case_acronyms)]
168 #[cfg_attr(feature = "with-codec", codec(index = 11))]
169 PCUnderflow,
170
171 #[cfg_attr(feature = "with-codec", codec(index = 12))]
173 CreateEmpty,
174
175 #[cfg_attr(feature = "with-codec", codec(index = 13))]
177 Other(Cow<'static, str>),
178
179 #[cfg_attr(feature = "with-codec", codec(index = 14))]
182 MaxNonce,
183}
184
185impl From<ExitError> for ExitReason {
186 fn from(s: ExitError) -> Self {
187 Self::Error(s)
188 }
189}
190
191#[derive(Clone, Debug, Eq, PartialEq)]
193#[cfg_attr(
194 feature = "with-codec",
195 derive(
196 scale_codec::Encode,
197 scale_codec::Decode,
198 scale_codec::DecodeWithMemTracking,
199 scale_info::TypeInfo
200 )
201)]
202#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
203pub enum ExitFatal {
204 NotSupported,
206 UnhandledInterrupt,
208 CallErrorAsFatal(ExitError),
210
211 Other(Cow<'static, str>),
213}
214
215impl From<ExitFatal> for ExitReason {
216 fn from(s: ExitFatal) -> Self {
217 Self::Fatal(s)
218 }
219}