evmdasm/dasm/instruction/
opcode.rs

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}