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(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 pub fn is_succeed(&self) -> bool {
39 matches!(self, Self::Succeed(_))
40 }
41
42 pub fn is_error(&self) -> bool {
44 matches!(self, Self::Error(_))
45 }
46
47 pub fn is_revert(&self) -> bool {
49 matches!(self, Self::Revert(_))
50 }
51
52 pub fn is_fatal(&self) -> bool {
54 matches!(self, Self::Fatal(_))
55 }
56}
57
58#[derive(Clone, Copy, Debug, Eq, PartialEq)]
60#[cfg_attr(
61 feature = "with-codec",
62 derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
63)]
64#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
65pub enum ExitSucceed {
66 Stopped,
68 Returned,
70 Suicided,
72}
73
74impl From<ExitSucceed> for ExitReason {
75 fn from(s: ExitSucceed) -> Self {
76 Self::Succeed(s)
77 }
78}
79
80#[derive(Clone, Copy, Debug, Eq, PartialEq)]
82#[cfg_attr(
83 feature = "with-codec",
84 derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
85)]
86#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
87pub enum ExitRevert {
88 Reverted,
90}
91
92impl From<ExitRevert> for ExitReason {
93 fn from(s: ExitRevert) -> Self {
94 Self::Revert(s)
95 }
96}
97
98#[derive(Clone, Debug, Eq, PartialEq)]
100#[cfg_attr(
101 feature = "with-codec",
102 derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
103)]
104#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
105pub enum ExitError {
106 #[cfg_attr(feature = "with-codec", codec(index = 0))]
108 StackUnderflow,
109 #[cfg_attr(feature = "with-codec", codec(index = 1))]
111 StackOverflow,
112 #[cfg_attr(feature = "with-codec", codec(index = 2))]
114 InvalidJump,
115 #[cfg_attr(feature = "with-codec", codec(index = 3))]
117 InvalidRange,
118 #[cfg_attr(feature = "with-codec", codec(index = 4))]
120 DesignatedInvalid,
121 #[cfg_attr(feature = "with-codec", codec(index = 5))]
123 CallTooDeep,
124 #[cfg_attr(feature = "with-codec", codec(index = 6))]
126 CreateCollision,
127 #[cfg_attr(feature = "with-codec", codec(index = 7))]
129 CreateContractLimit,
130
131 #[cfg_attr(feature = "with-codec", codec(index = 15))]
133 InvalidCode(Opcode),
134
135 #[cfg_attr(feature = "with-codec", codec(index = 8))]
138 OutOfOffset,
139 #[cfg_attr(feature = "with-codec", codec(index = 9))]
141 OutOfGas,
142 #[cfg_attr(feature = "with-codec", codec(index = 10))]
144 OutOfFund,
145
146 #[allow(clippy::upper_case_acronyms)]
148 #[cfg_attr(feature = "with-codec", codec(index = 11))]
149 PCUnderflow,
150
151 #[cfg_attr(feature = "with-codec", codec(index = 12))]
153 CreateEmpty,
154
155 #[cfg_attr(feature = "with-codec", codec(index = 13))]
157 Other(Cow<'static, str>),
158
159 #[cfg_attr(feature = "with-codec", codec(index = 14))]
162 MaxNonce,
163}
164
165impl From<ExitError> for ExitReason {
166 fn from(s: ExitError) -> Self {
167 Self::Error(s)
168 }
169}
170
171#[derive(Clone, Debug, Eq, PartialEq)]
173#[cfg_attr(
174 feature = "with-codec",
175 derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
176)]
177#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
178pub enum ExitFatal {
179 NotSupported,
181 UnhandledInterrupt,
183 CallErrorAsFatal(ExitError),
185
186 Other(Cow<'static, str>),
188}
189
190impl From<ExitFatal> for ExitReason {
191 fn from(s: ExitFatal) -> Self {
192 Self::Fatal(s)
193 }
194}