evm_interpreter/
opcode.rs1#[derive(Clone, Copy, Debug, Eq, PartialEq)]
3#[cfg_attr(
4 feature = "scale",
5 derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
6)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct Opcode(pub u8);
9
10impl Opcode {
12 pub const STOP: Opcode = Opcode(0x00);
14 pub const ADD: Opcode = Opcode(0x01);
16 pub const MUL: Opcode = Opcode(0x02);
18 pub const SUB: Opcode = Opcode(0x03);
20 pub const DIV: Opcode = Opcode(0x04);
22 pub const SDIV: Opcode = Opcode(0x05);
24 pub const MOD: Opcode = Opcode(0x06);
26 pub const SMOD: Opcode = Opcode(0x07);
28 pub const ADDMOD: Opcode = Opcode(0x08);
30 pub const MULMOD: Opcode = Opcode(0x09);
32 pub const EXP: Opcode = Opcode(0x0a);
34 pub const SIGNEXTEND: Opcode = Opcode(0x0b);
36
37 pub const LT: Opcode = Opcode(0x10);
39 pub const GT: Opcode = Opcode(0x11);
41 pub const SLT: Opcode = Opcode(0x12);
43 pub const SGT: Opcode = Opcode(0x13);
45 pub const EQ: Opcode = Opcode(0x14);
47 pub const ISZERO: Opcode = Opcode(0x15);
49 pub const AND: Opcode = Opcode(0x16);
51 pub const OR: Opcode = Opcode(0x17);
53 pub const XOR: Opcode = Opcode(0x18);
55 pub const NOT: Opcode = Opcode(0x19);
57 pub const BYTE: Opcode = Opcode(0x1a);
59
60 pub const SHL: Opcode = Opcode(0x1b);
62 pub const SHR: Opcode = Opcode(0x1c);
64 pub const SAR: Opcode = Opcode(0x1d);
66
67 pub const CALLDATALOAD: Opcode = Opcode(0x35);
69 pub const CALLDATASIZE: Opcode = Opcode(0x36);
71 pub const CALLDATACOPY: Opcode = Opcode(0x37);
73 pub const CODESIZE: Opcode = Opcode(0x38);
75 pub const CODECOPY: Opcode = Opcode(0x39);
77
78 pub const POP: Opcode = Opcode(0x50);
80 pub const MLOAD: Opcode = Opcode(0x51);
82 pub const MSTORE: Opcode = Opcode(0x52);
84 pub const MSTORE8: Opcode = Opcode(0x53);
86
87 pub const JUMP: Opcode = Opcode(0x56);
89 pub const JUMPI: Opcode = Opcode(0x57);
91 pub const PC: Opcode = Opcode(0x58);
93 pub const MSIZE: Opcode = Opcode(0x59);
95
96 pub const JUMPDEST: Opcode = Opcode(0x5b);
98 pub const MCOPY: Opcode = Opcode(0x5e);
100
101 pub const PUSH0: Opcode = Opcode(0x5f);
103 pub const PUSH1: Opcode = Opcode(0x60);
105 pub const PUSH2: Opcode = Opcode(0x61);
107 pub const PUSH3: Opcode = Opcode(0x62);
109 pub const PUSH4: Opcode = Opcode(0x63);
111 pub const PUSH5: Opcode = Opcode(0x64);
113 pub const PUSH6: Opcode = Opcode(0x65);
115 pub const PUSH7: Opcode = Opcode(0x66);
117 pub const PUSH8: Opcode = Opcode(0x67);
119 pub const PUSH9: Opcode = Opcode(0x68);
121 pub const PUSH10: Opcode = Opcode(0x69);
123 pub const PUSH11: Opcode = Opcode(0x6a);
125 pub const PUSH12: Opcode = Opcode(0x6b);
127 pub const PUSH13: Opcode = Opcode(0x6c);
129 pub const PUSH14: Opcode = Opcode(0x6d);
131 pub const PUSH15: Opcode = Opcode(0x6e);
133 pub const PUSH16: Opcode = Opcode(0x6f);
135 pub const PUSH17: Opcode = Opcode(0x70);
137 pub const PUSH18: Opcode = Opcode(0x71);
139 pub const PUSH19: Opcode = Opcode(0x72);
141 pub const PUSH20: Opcode = Opcode(0x73);
143 pub const PUSH21: Opcode = Opcode(0x74);
145 pub const PUSH22: Opcode = Opcode(0x75);
147 pub const PUSH23: Opcode = Opcode(0x76);
149 pub const PUSH24: Opcode = Opcode(0x77);
151 pub const PUSH25: Opcode = Opcode(0x78);
153 pub const PUSH26: Opcode = Opcode(0x79);
155 pub const PUSH27: Opcode = Opcode(0x7a);
157 pub const PUSH28: Opcode = Opcode(0x7b);
159 pub const PUSH29: Opcode = Opcode(0x7c);
161 pub const PUSH30: Opcode = Opcode(0x7d);
163 pub const PUSH31: Opcode = Opcode(0x7e);
165 pub const PUSH32: Opcode = Opcode(0x7f);
167
168 pub const DUP1: Opcode = Opcode(0x80);
170 pub const DUP2: Opcode = Opcode(0x81);
172 pub const DUP3: Opcode = Opcode(0x82);
174 pub const DUP4: Opcode = Opcode(0x83);
176 pub const DUP5: Opcode = Opcode(0x84);
178 pub const DUP6: Opcode = Opcode(0x85);
180 pub const DUP7: Opcode = Opcode(0x86);
182 pub const DUP8: Opcode = Opcode(0x87);
184 pub const DUP9: Opcode = Opcode(0x88);
186 pub const DUP10: Opcode = Opcode(0x89);
188 pub const DUP11: Opcode = Opcode(0x8a);
190 pub const DUP12: Opcode = Opcode(0x8b);
192 pub const DUP13: Opcode = Opcode(0x8c);
194 pub const DUP14: Opcode = Opcode(0x8d);
196 pub const DUP15: Opcode = Opcode(0x8e);
198 pub const DUP16: Opcode = Opcode(0x8f);
200
201 pub const SWAP1: Opcode = Opcode(0x90);
203 pub const SWAP2: Opcode = Opcode(0x91);
205 pub const SWAP3: Opcode = Opcode(0x92);
207 pub const SWAP4: Opcode = Opcode(0x93);
209 pub const SWAP5: Opcode = Opcode(0x94);
211 pub const SWAP6: Opcode = Opcode(0x95);
213 pub const SWAP7: Opcode = Opcode(0x96);
215 pub const SWAP8: Opcode = Opcode(0x97);
217 pub const SWAP9: Opcode = Opcode(0x98);
219 pub const SWAP10: Opcode = Opcode(0x99);
221 pub const SWAP11: Opcode = Opcode(0x9a);
223 pub const SWAP12: Opcode = Opcode(0x9b);
225 pub const SWAP13: Opcode = Opcode(0x9c);
227 pub const SWAP14: Opcode = Opcode(0x9d);
229 pub const SWAP15: Opcode = Opcode(0x9e);
231 pub const SWAP16: Opcode = Opcode(0x9f);
233
234 pub const EOFMAGIC: Opcode = Opcode(0xef);
236
237 pub const RETURN: Opcode = Opcode(0xf3);
239
240 pub const REVERT: Opcode = Opcode(0xfd);
242
243 pub const INVALID: Opcode = Opcode(0xfe);
245}
246
247impl Opcode {
249 pub const SHA3: Opcode = Opcode(0x20);
251
252 pub const ADDRESS: Opcode = Opcode(0x30);
254 pub const BALANCE: Opcode = Opcode(0x31);
256 pub const ORIGIN: Opcode = Opcode(0x32);
258 pub const CALLER: Opcode = Opcode(0x33);
260 pub const CALLVALUE: Opcode = Opcode(0x34);
262
263 pub const GASPRICE: Opcode = Opcode(0x3a);
265 pub const EXTCODESIZE: Opcode = Opcode(0x3b);
267 pub const EXTCODECOPY: Opcode = Opcode(0x3c);
269 pub const RETURNDATASIZE: Opcode = Opcode(0x3d);
271 pub const RETURNDATACOPY: Opcode = Opcode(0x3e);
273 pub const EXTCODEHASH: Opcode = Opcode(0x3f);
275
276 pub const BLOCKHASH: Opcode = Opcode(0x40);
278 pub const COINBASE: Opcode = Opcode(0x41);
280 pub const TIMESTAMP: Opcode = Opcode(0x42);
282 pub const NUMBER: Opcode = Opcode(0x43);
284 pub const DIFFICULTY: Opcode = Opcode(0x44);
286 pub const GASLIMIT: Opcode = Opcode(0x45);
288 pub const CHAINID: Opcode = Opcode(0x46);
290 pub const SELFBALANCE: Opcode = Opcode(0x47);
292 pub const BASEFEE: Opcode = Opcode(0x48);
294 pub const BLOBHASH: Opcode = Opcode(0x49);
296 pub const BLOBBASEFEE: Opcode = Opcode(0x4a);
298
299 pub const SLOAD: Opcode = Opcode(0x54);
301 pub const SSTORE: Opcode = Opcode(0x55);
303
304 pub const GAS: Opcode = Opcode(0x5a);
306
307 pub const TLOAD: Opcode = Opcode(0x5c);
309 pub const TSTORE: Opcode = Opcode(0x5d);
311
312 pub const LOG0: Opcode = Opcode(0xa0);
314 pub const LOG1: Opcode = Opcode(0xa1);
316 pub const LOG2: Opcode = Opcode(0xa2);
318 pub const LOG3: Opcode = Opcode(0xa3);
320 pub const LOG4: Opcode = Opcode(0xa4);
322
323 pub const CREATE: Opcode = Opcode(0xf0);
325 pub const CALL: Opcode = Opcode(0xf1);
327 pub const CALLCODE: Opcode = Opcode(0xf2);
329
330 pub const DELEGATECALL: Opcode = Opcode(0xf4);
332 pub const CREATE2: Opcode = Opcode(0xf5);
334
335 pub const STATICCALL: Opcode = Opcode(0xfa);
337
338 pub const SUICIDE: Opcode = Opcode(0xff);
340}
341
342impl Opcode {
343 #[must_use]
345 pub fn is_push(&self) -> Option<u8> {
346 let value = self.0;
347 if (0x60..=0x7f).contains(&value) {
348 Some(value - 0x60 + 1)
349 } else {
350 None
351 }
352 }
353
354 #[inline]
356 #[must_use]
357 pub const fn as_u8(&self) -> u8 {
358 self.0
359 }
360
361 #[inline]
363 #[must_use]
364 pub const fn as_usize(&self) -> usize {
365 self.0 as usize
366 }
367}