1use crate::dasm::instruction::Peek;
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq)]
4pub enum OPCode {
5 STOP,
6 ADD,
7 MUL,
8 SUB,
9 DIV,
10 SDIV,
11 MOD,
12 SMOD,
13 ADDMOD,
14 MULMOD,
15 EXP,
16 SIGNEXTEND,
17 LT,
18 GT,
19 SLT,
20 SGT,
21 EQ,
22 ISZERO,
23 AND,
24 OR,
25 XOR,
26 NOT,
27 BYTE,
28 SHL,
29 SHR,
30 SAR,
31 SHA3,
32 ADDRESS,
33 BALANCE,
34 ORIGIN,
35 CALLER,
36 CALLVALUE,
37 CALLDATALOAD,
38 CALLDATASIZE,
39 CALLDATACOPY,
40 CODESIZE,
41 CODECOPY,
42 GASPRICE,
43 EXTCODESIZE,
44 EXTCODECOPY,
45 RETURNDATASIZE,
46 RETURNDATACOPY,
47 EXTCODEHASH,
48 BLOCKHASH,
49 COINBASE,
50 TIMESTAMP,
51 NUMBER,
52 DIFFICULTY,
53 GASLIMIT,
54 CHAINID,
55 SELFBALANCE,
56 BASEFEE,
57 POP,
58 MLOAD,
59 MSTORE,
60 MSTORE8,
61 SLOAD,
62 SSTORE,
63 JUMP,
64 JUMPI,
65 PC,
66 MSIZE,
67 GAS,
68 JUMPDEST,
69 PUSH1,
70 PUSH2,
71 PUSH3,
72 PUSH4,
73 PUSH5,
74 PUSH6,
75 PUSH7,
76 PUSH8,
77 PUSH9,
78 PUSH10,
79 PUSH11,
80 PUSH12,
81 PUSH13,
82 PUSH14,
83 PUSH15,
84 PUSH16,
85 PUSH17,
86 PUSH18,
87 PUSH19,
88 PUSH20,
89 PUSH21,
90 PUSH22,
91 PUSH23,
92 PUSH24,
93 PUSH25,
94 PUSH26,
95 PUSH27,
96 PUSH28,
97 PUSH29,
98 PUSH30,
99 PUSH31,
100 PUSH32,
101 DUP1,
102 DUP2,
103 DUP3,
104 DUP4,
105 DUP5,
106 DUP6,
107 DUP7,
108 DUP8,
109 DUP9,
110 DUP10,
111 DUP11,
112 DUP12,
113 DUP13,
114 DUP14,
115 DUP15,
116 DUP16,
117 SWAP1,
118 SWAP2,
119 SWAP3,
120 SWAP4,
121 SWAP5,
122 SWAP6,
123 SWAP7,
124 SWAP8,
125 SWAP9,
126 SWAP10,
127 SWAP11,
128 SWAP12,
129 SWAP13,
130 SWAP14,
131 SWAP15,
132 SWAP16,
133 LOG0,
134 LOG1,
135 LOG2,
136 LOG3,
137 LOG4,
138 PUSH,
139 DUP,
140 SWAP,
141 CREATE,
142 CALL,
143 CALLCODE,
144 RETURN,
145 DELEGATECALL,
146 CREATE2,
147 STATICCALL,
148 REVERT,
149 SELFDESTRUCT,
150 INVALID(u8),
151}
152
153
154pub(crate) fn peek_opcode<'a>(bytecode: &'a [u8]) -> Option<Peek<OPCode>> {
155 let opcode = match bytecode.first()? {
156 0x00 => Peek::new(OPCode::STOP, 1),
157 0x01 => Peek::new(OPCode::ADD, 1),
158 0x02 => Peek::new(OPCode::MUL, 1),
159 0x03 => Peek::new(OPCode::SUB, 1),
160 0x04 => Peek::new(OPCode::DIV, 1),
161 0x05 => Peek::new(OPCode::SDIV, 1),
162 0x06 => Peek::new(OPCode::MOD, 1),
163 0x07 => Peek::new(OPCode::SMOD, 1),
164 0x08 => Peek::new(OPCode::ADDMOD, 1),
165 0x09 => Peek::new(OPCode::MULMOD, 1),
166 0x0A => Peek::new(OPCode::EXP, 1),
167 0x0B => Peek::new(OPCode::SIGNEXTEND, 1),
168
169 0x10 => Peek::new(OPCode::LT, 1),
170 0x11 => Peek::new(OPCode::GT, 1),
171 0x12 => Peek::new(OPCode::SLT, 1),
172 0x13 => Peek::new(OPCode::SGT, 1),
173 0x14 => Peek::new(OPCode::EQ, 1),
174 0x15 => Peek::new(OPCode::ISZERO, 1),
175 0x16 => Peek::new(OPCode::AND, 1),
176 0x17 => Peek::new(OPCode::OR, 1),
177 0x18 => Peek::new(OPCode::XOR, 1),
178 0x19 => Peek::new(OPCode::NOT, 1),
179 0x1A => Peek::new(OPCode::BYTE, 1),
180 0x1B => Peek::new(OPCode::SHL, 1),
181 0x1C => Peek::new(OPCode::SHR, 1),
182 0x1D => Peek::new(OPCode::SAR, 1),
183
184 0x20 => Peek::new(OPCode::SHA3, 1),
185
186 0x30 => Peek::new(OPCode::ADDRESS, 1),
187 0x31 => Peek::new(OPCode::BALANCE, 1),
188 0x32 => Peek::new(OPCode::ORIGIN, 1),
189 0x33 => Peek::new(OPCode::CALLDATALOAD, 1),
190 0x34 => Peek::new(OPCode::CALLVALUE, 1),
191 0x35 => Peek::new(OPCode::CALLDATALOAD, 1),
192 0x36 => Peek::new(OPCode::CALLDATASIZE, 1),
193 0x37 => Peek::new(OPCode::CALLDATACOPY, 1),
194 0x38 => Peek::new(OPCode::CODESIZE, 1),
195 0x39 => Peek::new(OPCode::CODECOPY, 1),
196 0x3A => Peek::new(OPCode::GASPRICE, 1),
197 0x3B => Peek::new(OPCode::EXTCODESIZE, 1),
198 0x3C => Peek::new(OPCode::EXTCODECOPY, 1),
199 0x3D => Peek::new(OPCode::RETURNDATASIZE, 1),
200 0x3E => Peek::new(OPCode::RETURNDATACOPY, 1),
201 0x3F => Peek::new(OPCode::EXTCODEHASH, 1),
202
203 0x40 => Peek::new(OPCode::BLOCKHASH, 1),
204 0x41 => Peek::new(OPCode::COINBASE, 1),
205 0x42 => Peek::new(OPCode::TIMESTAMP, 1),
206 0x43 => Peek::new(OPCode::NUMBER, 1),
207 0x44 => Peek::new(OPCode::DIFFICULTY, 1),
208 0x45 => Peek::new(OPCode::GASLIMIT, 1),
209 0x46 => Peek::new(OPCode::CHAINID, 1),
210 0x47 => Peek::new(OPCode::SELFBALANCE, 1),
211 0x48 => Peek::new(OPCode::BASEFEE, 1),
212
213 0x50 => Peek::new(OPCode::POP, 1),
214 0x51 => Peek::new(OPCode::MLOAD, 1),
215 0x52 => Peek::new(OPCode::MSTORE, 1),
216 0x53 => Peek::new(OPCode::MSTORE8, 1),
217 0x54 => Peek::new(OPCode::SLOAD, 1),
218 0x55 => Peek::new(OPCode::SSTORE, 1),
219 0x56 => Peek::new(OPCode::JUMP, 1),
220 0x57 => Peek::new(OPCode::JUMPI, 1),
221 0x58 => Peek::new(OPCode::PC, 1),
222 0x59 => Peek::new(OPCode::MSIZE, 1),
223 0x5A => Peek::new(OPCode::GAS, 1),
224 0x5B => Peek::new(OPCode::JUMPDEST, 1),
225
226 0x60 => Peek::new(OPCode::PUSH1, 1),
227 0x61 => Peek::new(OPCode::PUSH2, 1),
228 0x62 => Peek::new(OPCode::PUSH3, 1),
229 0x63 => Peek::new(OPCode::PUSH4, 1),
230 0x64 => Peek::new(OPCode::PUSH5, 1),
231 0x65 => Peek::new(OPCode::PUSH6, 1),
232 0x66 => Peek::new(OPCode::PUSH7, 1),
233 0x67 => Peek::new(OPCode::PUSH8, 1),
234 0x68 => Peek::new(OPCode::PUSH9, 1),
235 0x69 => Peek::new(OPCode::PUSH10, 1),
236 0x6A => Peek::new(OPCode::PUSH11, 1),
237 0x6B => Peek::new(OPCode::PUSH12, 1),
238 0x6C => Peek::new(OPCode::PUSH13, 1),
239 0x6D => Peek::new(OPCode::PUSH14, 1),
240 0x6E => Peek::new(OPCode::PUSH15, 1),
241 0x6F => Peek::new(OPCode::PUSH16, 1),
242 0x70 => Peek::new(OPCode::PUSH17, 1),
243 0x71 => Peek::new(OPCode::PUSH18, 1),
244 0x72 => Peek::new(OPCode::PUSH19, 1),
245 0x73 => Peek::new(OPCode::PUSH20, 1),
246 0x74 => Peek::new(OPCode::PUSH21, 1),
247 0x75 => Peek::new(OPCode::PUSH22, 1),
248 0x76 => Peek::new(OPCode::PUSH23, 1),
249 0x77 => Peek::new(OPCode::PUSH24, 1),
250 0x78 => Peek::new(OPCode::PUSH25, 1),
251 0x79 => Peek::new(OPCode::PUSH26, 1),
252 0x7A => Peek::new(OPCode::PUSH27, 1),
253 0x7B => Peek::new(OPCode::PUSH28, 1),
254 0x7C => Peek::new(OPCode::PUSH29, 1),
255 0x7D => Peek::new(OPCode::PUSH30, 1),
256 0x7E => Peek::new(OPCode::PUSH31, 1),
257 0x7F => Peek::new(OPCode::PUSH32, 1),
258
259 0x80 => Peek::new(OPCode::DUP1, 1),
260 0x81 => Peek::new(OPCode::DUP2, 1),
261 0x82 => Peek::new(OPCode::DUP3, 1),
262 0x83 => Peek::new(OPCode::DUP4, 1),
263 0x84 => Peek::new(OPCode::DUP5, 1),
264 0x85 => Peek::new(OPCode::DUP6, 1),
265 0x86 => Peek::new(OPCode::DUP7, 1),
266 0x87 => Peek::new(OPCode::DUP8, 1),
267 0x88 => Peek::new(OPCode::DUP9, 1),
268 0x89 => Peek::new(OPCode::DUP10, 1),
269 0x8A => Peek::new(OPCode::DUP11, 1),
270 0x8B => Peek::new(OPCode::DUP12, 1),
271 0x8C => Peek::new(OPCode::DUP13, 1),
272 0x8D => Peek::new(OPCode::DUP14, 1),
273 0x8E => Peek::new(OPCode::DUP15, 1),
274 0x8F => Peek::new(OPCode::DUP16, 1),
275
276 0x90 => Peek::new(OPCode::SWAP1, 1),
277 0x91 => Peek::new(OPCode::SWAP2, 1),
278 0x92 => Peek::new(OPCode::SWAP3, 1),
279 0x93 => Peek::new(OPCode::SWAP4, 1),
280 0x94 => Peek::new(OPCode::SWAP5, 1),
281 0x95 => Peek::new(OPCode::SWAP6, 1),
282 0x96 => Peek::new(OPCode::SWAP7, 1),
283 0x97 => Peek::new(OPCode::SWAP8, 1),
284 0x98 => Peek::new(OPCode::SWAP9, 1),
285 0x99 => Peek::new(OPCode::SWAP10, 1),
286 0x9A => Peek::new(OPCode::SWAP11, 1),
287 0x9B => Peek::new(OPCode::SWAP12, 1),
288 0x9C => Peek::new(OPCode::SWAP13, 1),
289 0x9D => Peek::new(OPCode::SWAP14, 1),
290 0x9E => Peek::new(OPCode::SWAP15, 1),
291 0x9F => Peek::new(OPCode::SWAP16, 1),
292
293 0xA0 => Peek::new(OPCode::LOG0, 1),
294 0xA1 => Peek::new(OPCode::LOG1, 1),
295 0xA2 => Peek::new(OPCode::LOG2, 1),
296 0xA3 => Peek::new(OPCode::LOG3, 1),
297 0xA4 => Peek::new(OPCode::LOG4, 1),
298
299 0xB0 => Peek::new(OPCode::PUSH, 1),
300 0xB1 => Peek::new(OPCode::DUP, 1),
301 0xB2 => Peek::new(OPCode::SWAP, 1),
302
303 0xF0 => Peek::new(OPCode::CREATE, 1),
304 0xF1 => Peek::new(OPCode::CALL, 1),
305 0xF2 => Peek::new(OPCode::CALLCODE, 1),
306 0xF3 => Peek::new(OPCode::RETURN, 1),
307 0xF4 => Peek::new(OPCode::DELEGATECALL, 1),
308 0xF5 => Peek::new(OPCode::CREATE2, 1),
309 0xFA => Peek::new(OPCode::STATICCALL, 1),
310 0xFD => Peek::new(OPCode::REVERT, 1),
311 0xFF => Peek::new(OPCode::SELFDESTRUCT, 1),
312
313 invalid => Peek::new(OPCode::INVALID(*invalid), 1),
314 };
315
316 Some(opcode)
317}