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}