1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use revm_primitives::{Eval, Halt};
#[repr(u8)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum InstructionResult {
Continue = 0x00,
Stop = 0x01,
Return = 0x02,
SelfDestruct = 0x03,
Revert = 0x20, CallTooDeep = 0x21,
OutOfFund = 0x22,
OutOfGas = 0x50,
OpcodeNotFound,
CallNotAllowedInsideStatic,
StateChangeDuringStaticCall,
InvalidFEOpcode,
InvalidJump,
NotActivated,
StackUnderflow,
StackOverflow,
OutOfOffset,
CreateCollision,
OverflowPayment,
PrecompileError,
NonceOverflow,
CreateContractSizeLimit,
CreateContractStartingWithEF,
FatalExternalError,
}
pub enum SuccessOrHalt {
Success(Eval),
Revert,
Halt(Halt),
FatalExternalError,
Internal,
}
impl From<InstructionResult> for SuccessOrHalt {
fn from(result: InstructionResult) -> Self {
match result {
InstructionResult::Continue => Self::Internal, InstructionResult::Stop => Self::Success(Eval::Stop),
InstructionResult::Return => Self::Success(Eval::Return),
InstructionResult::SelfDestruct => Self::Success(Eval::SelfDestruct),
InstructionResult::Revert => Self::Revert,
InstructionResult::CallTooDeep => Self::Internal, InstructionResult::OutOfFund => Self::Internal, InstructionResult::OutOfGas => Self::Halt(Halt::OutOfGas),
InstructionResult::OpcodeNotFound => Self::Halt(Halt::OpcodeNotFound),
InstructionResult::CallNotAllowedInsideStatic => Self::Internal, InstructionResult::StateChangeDuringStaticCall => Self::Internal,
InstructionResult::InvalidFEOpcode => Self::Halt(Halt::InvalidFEOpcode),
InstructionResult::InvalidJump => Self::Halt(Halt::InvalidJump),
InstructionResult::NotActivated => Self::Halt(Halt::NotActivated),
InstructionResult::StackUnderflow => Self::Halt(Halt::StackUnderflow),
InstructionResult::StackOverflow => Self::Halt(Halt::StackOverflow),
InstructionResult::OutOfOffset => Self::Halt(Halt::OutOfOffset),
InstructionResult::CreateCollision => Self::Halt(Halt::CreateCollision),
InstructionResult::OverflowPayment => Self::Internal, InstructionResult::PrecompileError => Self::Halt(Halt::PrecompileError),
InstructionResult::NonceOverflow => Self::Halt(Halt::NonceOverflow),
InstructionResult::CreateContractSizeLimit => Self::Halt(Halt::CreateContractSizeLimit),
InstructionResult::CreateContractStartingWithEF => {
Self::Halt(Halt::CreateContractSizeLimit)
}
InstructionResult::FatalExternalError => Self::FatalExternalError,
}
}
}
#[macro_export]
macro_rules! return_ok {
() => {
InstructionResult::Continue
| InstructionResult::Stop
| InstructionResult::Return
| InstructionResult::SelfDestruct
};
}
#[macro_export]
macro_rules! return_revert {
() => {
InstructionResult::Revert | InstructionResult::CallTooDeep | InstructionResult::OutOfFund
};
}