1use super::common;
2use super::err;
3use super::ext;
4use super::memory;
5use super::opcodes;
6use super::stack;
7use ethereum_types::{Address, H256, U256, U512};
8use log::debug;
9use std::cmp;
10
11#[derive(Clone, Debug, Default)]
12pub struct Context {
13    pub gas_limit: u64,
14    pub coinbase: Address,
15    pub number: U256,
16    pub timestamp: u64,
17    pub difficulty: U256,
18}
19
20#[derive(Clone, Debug)]
23pub struct Log(pub Address, pub Vec<H256>, pub Vec<u8>);
24
25#[derive(Clone, Debug)]
26pub enum InterpreterResult {
27    Normal(Vec<u8>, u64, Vec<Log>),
29    Revert(Vec<u8>, u64),
31    Create(Vec<u8>, u64, Vec<Log>, Address),
33}
34
35#[derive(Clone)]
36pub struct InterpreterConf {
37    pub eip1283: bool,
38    pub stack_limit: u64,
39    pub max_create_code_size: u64, pub max_call_depth: u64,
41
42    pub gas_tier_step: [u64; 8],
43    pub gas_exp: u64,                       pub gas_exp_byte: u64, pub gas_sha3: u64,     pub gas_sha3_word: u64, pub gas_balance: u64,  pub gas_memory: u64,   pub gas_sload: u64,    pub gas_sstore_noop: u64, pub gas_sstore_init: u64, pub gas_sstore_clear_refund: u64, pub gas_sstore_clean: u64, pub gas_sstore_dirty: u64, pub gas_sstore_reset_clear_refund: u64, pub gas_sstore_reset_refund: u64, pub gas_sstore_set: u64,   pub gas_sstore_clear: u64, pub gas_sstore_reset: u64, pub gas_sstore_refund: u64, pub gas_log: u64,          pub gas_log_data: u64,     pub gas_log_topic: u64,    pub gas_create: u64,       pub gas_jumpdest: u64,     pub gas_copy: u64,         pub gas_call: u64,         pub gas_call_value_transfer: u64, pub gas_call_stipend: u64, pub gas_self_destruct: u64, pub gas_self_destruct_refund: u64, pub gas_extcode: u64,      pub gas_call_new_account: u64, pub gas_self_destruct_new_account: u64, pub gas_ext_code_hash: u64, }
77
78impl Default for InterpreterConf {
79    fn default() -> Self {
84        InterpreterConf {
85            eip1283: false,
86            stack_limit: 1024,
87            max_create_code_size: 24567,
88            max_call_depth: 1024,
89
90            gas_tier_step: [0, 2, 3, 5, 8, 10, 20, 0],
91            gas_exp: 10,
92            gas_exp_byte: 50,
93            gas_sha3: 30,
94            gas_sha3_word: 6,
95            gas_balance: 400,
96            gas_memory: 3,
97            gas_sload: 200,
98            gas_sstore_noop: 200,
99            gas_sstore_init: 20000,
100            gas_sstore_clear_refund: 15000,
101            gas_sstore_clean: 5000,
102            gas_sstore_dirty: 200,
103            gas_sstore_reset_clear_refund: 19800,
104            gas_sstore_reset_refund: 4800,
105            gas_sstore_set: 20000,
106            gas_sstore_clear: 5000,
107            gas_sstore_reset: 5000,
108            gas_sstore_refund: 15000,
109            gas_log: 375,
110            gas_log_data: 8,
111            gas_log_topic: 375,
112            gas_create: 32000,
113            gas_jumpdest: 1,
114            gas_copy: 3,
115            gas_call: 700,
116            gas_call_value_transfer: 9000,
117            gas_call_stipend: 2300,
118            gas_self_destruct: 5000,
119            gas_self_destruct_refund: 24000,
120            gas_extcode: 700,
121            gas_call_new_account: 25000,
122            gas_self_destruct_new_account: 25000,
123            gas_ext_code_hash: 400,
124        }
125    }
126}
127
128#[derive(Clone, Debug, Default)]
129pub struct Contract {
130    pub code_address: Address,
131    pub code_data: Vec<u8>,
132}
133
134#[derive(Clone, Debug, Default)]
135pub struct InterpreterParams {
136    pub origin: Address,   pub sender: Address,   pub receiver: Address, pub address: Address,  pub value: U256,
142    pub input: Vec<u8>,
143    pub nonce: U256,
144    pub gas_limit: u64,
145    pub gas_price: U256,
146
147    pub read_only: bool,
148    pub contract: Contract,
149    pub extra: H256,
150    pub is_create: bool,
151    pub disable_transfer_value: bool,
152    pub depth: u64,
153}
154
155pub struct Interpreter {
156    pub context: Context,
157    pub cfg: InterpreterConf,
158    pub data_provider: Box<ext::DataProvider>,
159    pub params: InterpreterParams,
160
161    gas: u64,
162    stack: stack::Stack<U256>,
163    mem: memory::Memory,
164    logs: Vec<Log>,
165    return_data: Vec<u8>,
166    mem_gas: u64,
167    gas_tmp: u64,
168}
169
170impl Interpreter {
171    pub fn new(
172        context: Context,
173        cfg: InterpreterConf,
174        data_provider: Box<ext::DataProvider>,
175        params: InterpreterParams,
176    ) -> Self {
177        let gas = params.gas_limit;
178        Interpreter {
179            context,
180            cfg,
181            data_provider,
182            params,
183            gas,
184            stack: stack::Stack::with_capacity(1024),
185            mem: memory::Memory::default(),
186            logs: Vec::new(),
187            return_data: Vec::new(),
188            mem_gas: 0,
189            gas_tmp: 0,
190        }
191    }
192
193    #[allow(clippy::cognitive_complexity)]
194    pub fn run(&mut self) -> Result<InterpreterResult, err::Error> {
195        let mut pc = 0;
196        while let Some(op) = self.get_op(pc)? {
197            pc += 1;
198            self.trace(&op, pc);
200            let stack_require = op.stack_require();
202            if !self.stack.require(stack_require as usize) {
203                return Err(err::Error::OutOfStack);
204            }
205            if self.stack.len() as u64 - op.stack_require() + op.stack_returns() > self.cfg.stack_limit {
206                return Err(err::Error::OutOfStack);
207            }
208            if self.params.read_only && op.state_changes() {
210                return Err(err::Error::MutableCallInStaticContext);
211            }
212            let op_gas = self.cfg.gas_tier_step[op.gas_price_tier().idx()];
214            self.use_gas(op_gas)?;
215            match op {
216                opcodes::OpCode::EXP => {
217                    let expon = self.stack.back(1);
218                    let bytes = ((expon.bits() + 7) / 8) as u64;
219                    let gas = self.cfg.gas_exp + self.cfg.gas_exp_byte * bytes;
220                    self.use_gas(gas)?;
221                }
222                opcodes::OpCode::SHA3 => {
223                    let mem_offset = self.stack.back(0);
224                    let mem_len = self.stack.back(1);
225                    self.mem_gas_work(mem_offset, mem_len)?;
226                    self.use_gas(self.cfg.gas_sha3)?;
227                    self.use_gas(common::to_word_size(mem_len.low_u64()) * self.cfg.gas_sha3_word)?;
228                }
229                opcodes::OpCode::BALANCE => {
230                    self.use_gas(self.cfg.gas_balance)?;
231                }
232                opcodes::OpCode::CALLDATACOPY => {
233                    let mem_offset = self.stack.back(0);
234                    let mem_len = self.stack.back(2);
235                    self.mem_gas_work(mem_offset, mem_len)?;
236                    let gas = common::to_word_size(mem_len.low_u64()) * self.cfg.gas_copy;
237                    self.use_gas(gas)?;
238                }
239                opcodes::OpCode::CODECOPY => {
240                    let mem_offset = self.stack.back(0);
241                    let mem_len = self.stack.back(2);
242                    self.mem_gas_work(mem_offset, mem_len)?;
243                    let gas = common::to_word_size(mem_len.low_u64()) * self.cfg.gas_copy;
244                    self.use_gas(gas)?;
245                }
246                opcodes::OpCode::EXTCODESIZE => {
247                    self.use_gas(self.cfg.gas_extcode)?;
248                }
249                opcodes::OpCode::EXTCODECOPY => {
250                    let mem_offset = self.stack.back(1);
251                    let mem_len = self.stack.back(3);
252                    self.use_gas(self.cfg.gas_extcode)?;
253                    self.mem_gas_work(mem_offset, mem_len)?;
254                    let gas = common::to_word_size(mem_len.low_u64()) * self.cfg.gas_copy;
255                    self.use_gas(gas)?;
256                }
257                opcodes::OpCode::EXTCODEHASH => {
258                    self.use_gas(self.cfg.gas_ext_code_hash)?;
259                }
260                opcodes::OpCode::RETURNDATACOPY => {
261                    let mem_offset = self.stack.back(0);
262                    let size = self.stack.back(2);
263                    self.mem_gas_work(mem_offset, size)?;
264                    let size_min = cmp::min(self.return_data.len() as u64, size.low_u64());
265                    let gas = common::to_word_size(size_min) * self.cfg.gas_copy;
266                    self.use_gas(gas)?;
267                }
268                opcodes::OpCode::MLOAD => {
269                    let mem_offset = self.stack.back(0);
270                    let mem_len = U256::from(32);
271                    self.mem_gas_work(mem_offset, mem_len)?;
272                }
273                opcodes::OpCode::MSTORE => {
274                    let mem_offset = self.stack.back(0);
275                    let mem_len = U256::from(32);
276                    self.mem_gas_work(mem_offset, mem_len)?;
277                }
278                opcodes::OpCode::MSTORE8 => {
279                    let mem_offset = self.stack.back(0);
280                    self.mem_gas_work(mem_offset, U256::one())?;
281                }
282                opcodes::OpCode::SLOAD => {
283                    self.use_gas(self.cfg.gas_sload)?;
284                }
285                opcodes::OpCode::SSTORE => {
286                    let address = H256::from(&self.stack.back(0));
287                    let current_value = U256::from(&*self.data_provider.get_storage(&self.params.address, &address));
288                    let new_value = self.stack.back(1);
289                    let original_value =
290                        U256::from(&*self.data_provider.get_storage_origin(&self.params.address, &address));
291                    let gas: u64 = {
292                        if self.cfg.eip1283 {
293                            if current_value == new_value {
295                                self.cfg.gas_sstore_noop
296                            } else if original_value == current_value {
297                                if original_value.is_zero() {
298                                    self.cfg.gas_sstore_init
299                                } else {
300                                    if new_value.is_zero() {
301                                        self.data_provider
302                                            .add_refund(&self.params.origin, self.cfg.gas_sstore_clear_refund);
303                                    }
304                                    self.cfg.gas_sstore_clean
305                                }
306                            } else {
307                                if !original_value.is_zero() {
308                                    if current_value.is_zero() {
309                                        self.data_provider
310                                            .sub_refund(&self.params.origin, self.cfg.gas_sstore_clear_refund);
311                                    } else if new_value.is_zero() {
312                                        self.data_provider
313                                            .add_refund(&self.params.origin, self.cfg.gas_sstore_clear_refund);
314                                    }
315                                }
316                                if original_value == new_value {
317                                    if original_value.is_zero() {
318                                        self.data_provider
319                                            .add_refund(&self.params.origin, self.cfg.gas_sstore_reset_clear_refund);
320                                    } else {
321                                        self.data_provider
322                                            .add_refund(&self.params.origin, self.cfg.gas_sstore_reset_refund);
323                                    }
324                                }
325                                self.cfg.gas_sstore_dirty
326                            }
327                        } else if current_value.is_zero() && !new_value.is_zero() {
328                            self.cfg.gas_sstore_set
329                        } else if !current_value.is_zero() && new_value.is_zero() {
330                            self.data_provider
331                                .add_refund(&self.params.origin, self.cfg.gas_sstore_refund);
332                            self.cfg.gas_sstore_clear
333                        } else {
334                            self.cfg.gas_sstore_reset
335                        }
336                    };
337                    self.use_gas(gas)?;
338                }
339                opcodes::OpCode::JUMPDEST => {
340                    self.use_gas(self.cfg.gas_jumpdest)?;
341                }
342                opcodes::OpCode::LOG0
343                | opcodes::OpCode::LOG1
344                | opcodes::OpCode::LOG2
345                | opcodes::OpCode::LOG3
346                | opcodes::OpCode::LOG4 => {
347                    let n = op.clone() as u8 - opcodes::OpCode::LOG0 as u8;
348                    let mem_offset = self.stack.back(0);
349                    let mem_len = self.stack.back(1);
350                    self.mem_gas_work(mem_offset, mem_len)?;
351                    let gas = self.cfg.gas_log
352                        + self.cfg.gas_log_topic * u64::from(n)
353                        + self.cfg.gas_log_data * mem_len.low_u64();
354                    self.use_gas(gas)?;
355                }
356                opcodes::OpCode::CREATE => {
357                    let mem_offset = self.stack.back(1);
358                    let mem_len = self.stack.back(2);
359                    if mem_len > U256::from(self.cfg.max_create_code_size) {
360                        return Err(err::Error::ExccedMaxCodeSize);
361                    }
362                    self.mem_gas_work(mem_offset, mem_len)?;
363                    self.use_gas(self.cfg.gas_create)?;
364                    self.gas_tmp = self.gas - self.gas / 64;
365                    self.use_gas(self.gas_tmp)?;
366                }
367                opcodes::OpCode::CALL | opcodes::OpCode::CALLCODE => {
368                    let gas_req = self.stack.back(0);
369                    let address = common::u256_to_address(&self.stack.back(1));
370                    let value = self.stack.back(2);
371                    let mem_offset = self.stack.back(3);
372                    let mem_len = self.stack.back(4);
373                    let out_offset = self.stack.back(5);
374                    let out_len = self.stack.back(6);
375
376                    self.use_gas(self.cfg.gas_call)?;
377
378                    let is_value_transfer = !value.is_zero();
379                    if op == opcodes::OpCode::CALL && is_value_transfer && self.data_provider.is_empty(&address) {
380                        self.use_gas(self.cfg.gas_call_new_account)?;
381                    }
382                    if is_value_transfer {
383                        self.use_gas(self.cfg.gas_call_value_transfer)?;
384                    }
385                    self.mem_gas_work(mem_offset, mem_len)?;
386                    self.mem_gas_work(out_offset, out_len)?;
387                    self.gas_tmp = cmp::min(self.gas - self.gas / 64, gas_req.low_u64());
388                    self.use_gas(self.gas_tmp)?;
389                }
390                opcodes::OpCode::RETURN => {
391                    let mem_offset = self.stack.back(0);
392                    let mem_len = self.stack.back(1);
393                    self.mem_gas_work(mem_offset, mem_len)?;
394                }
395                opcodes::OpCode::DELEGATECALL | opcodes::OpCode::STATICCALL => {
396                    let gas_req = self.stack.back(0);
397                    let mem_offset = self.stack.back(2);
398                    let mem_len = self.stack.back(3);
399                    let out_offset = self.stack.back(4);
400                    let out_len = self.stack.back(5);
401                    self.use_gas(self.cfg.gas_call)?;
402                    self.mem_gas_work(mem_offset, mem_len)?;
403                    self.mem_gas_work(out_offset, out_len)?;
404                    self.gas_tmp = cmp::min(self.gas - self.gas / 64, gas_req.low_u64());
405                    self.use_gas(self.gas_tmp)?;
406                }
407                opcodes::OpCode::CREATE2 => {
408                    let mem_offset = self.stack.back(1);
409                    let mem_len = self.stack.back(2);
410                    if mem_len > U256::from(self.cfg.max_create_code_size) {
411                        return Err(err::Error::ExccedMaxCodeSize);
412                    }
413                    self.mem_gas_work(mem_offset, mem_len)?;
414                    self.use_gas(self.cfg.gas_create)?;
415                    self.use_gas(common::to_word_size(mem_len.low_u64()) * self.cfg.gas_sha3_word)?;
416                    self.gas_tmp = self.gas - self.gas / 64;
417                    self.use_gas(self.gas_tmp)?;
418                }
419                opcodes::OpCode::REVERT => {
420                    let mem_offset = self.stack.back(0);
421                    let mem_len = self.stack.back(1);
422                    self.mem_gas_work(mem_offset, mem_len)?;
423                }
424                opcodes::OpCode::SELFDESTRUCT => {
425                    let address = self.stack.peek();
426                    self.use_gas(self.cfg.gas_self_destruct)?;
427                    if !self.data_provider.get_balance(&self.params.address).is_zero()
428                        && self.data_provider.is_empty(&common::u256_to_address(&address))
429                    {
430                        self.use_gas(self.cfg.gas_self_destruct_new_account)?;
431                    }
432                    self.data_provider
433                        .add_refund(&self.params.origin, self.cfg.gas_self_destruct_refund);
434                }
435                _ => {}
436            }
437            match op {
439                opcodes::OpCode::STOP => break,
440                opcodes::OpCode::ADD => {
441                    let a = self.stack.pop();
442                    let b = self.stack.pop();
443                    self.stack.push(a.overflowing_add(b).0);
444                }
445                opcodes::OpCode::MUL => {
446                    let a = self.stack.pop();
447                    let b = self.stack.pop();
448                    self.stack.push(a.overflowing_mul(b).0);
449                }
450                opcodes::OpCode::SUB => {
451                    let a = self.stack.pop();
452                    let b = self.stack.pop();
453                    self.stack.push(a.overflowing_sub(b).0);
454                }
455                opcodes::OpCode::DIV => {
456                    let a = self.stack.pop();
457                    let b = self.stack.pop();
458                    self.stack.push(if b.is_zero() { U256::zero() } else { a / b })
459                }
460                opcodes::OpCode::SDIV => {
461                    let (a, neg_a) = common::get_sign(self.stack.pop());
462                    let (b, neg_b) = common::get_sign(self.stack.pop());
463                    let min = (U256::one() << 255) - U256::one();
464                    self.stack.push(if b.is_zero() {
465                        U256::zero()
466                    } else if a == min && b == !U256::one() {
467                        min
468                    } else {
469                        common::set_sign(a / b, neg_a ^ neg_b)
470                    })
471                }
472                opcodes::OpCode::MOD => {
473                    let a = self.stack.pop();
474                    let b = self.stack.pop();
475                    self.stack.push(if !b.is_zero() { a % b } else { U256::zero() });
476                }
477                opcodes::OpCode::SMOD => {
478                    let ua = self.stack.pop();
479                    let ub = self.stack.pop();
480                    let (a, sign_a) = common::get_sign(ua);
481                    let b = common::get_sign(ub).0;
482                    self.stack.push(if !b.is_zero() {
483                        let c = a % b;
484                        common::set_sign(c, sign_a)
485                    } else {
486                        U256::zero()
487                    });
488                }
489                opcodes::OpCode::ADDMOD => {
490                    let a = self.stack.pop();
491                    let b = self.stack.pop();
492                    let c = self.stack.pop();
493                    self.stack.push(if !c.is_zero() {
494                        let res = U512::from(a);
495                        let res = res.overflowing_add(U512::from(b)).0;
496                        let res = res % U512::from(c);
497                        U256::from(res)
498                    } else {
499                        U256::zero()
500                    });
501                }
502                opcodes::OpCode::MULMOD => {
503                    let a = self.stack.pop();
504                    let b = self.stack.pop();
505                    let c = self.stack.pop();
506                    self.stack.push(if !c.is_zero() {
507                        let res = U512::from(a);
508                        let res = res.overflowing_mul(U512::from(b)).0;
509                        let res = res % U512::from(c);
510                        U256::from(res)
511                    } else {
512                        U256::zero()
513                    });
514                }
515                opcodes::OpCode::EXP => {
516                    let base = self.stack.pop();
517                    let expon = self.stack.pop();
518                    let res = base.overflowing_pow(expon).0;
519                    self.stack.push(res);
520                }
521                opcodes::OpCode::SIGNEXTEND => {
522                    let bit = self.stack.pop();
523                    if bit < U256::from(32) {
524                        let number = self.stack.pop();
525                        let bit_position = (bit.low_u64() * 8 + 7) as usize;
526                        let bit = number.bit(bit_position);
527                        let mask = (U256::one() << bit_position) - U256::one();
528                        self.stack.push(if bit { number | !mask } else { number & mask });
529                    }
530                }
531                opcodes::OpCode::LT => {
532                    let a = self.stack.pop();
533                    let b = self.stack.pop();
534                    self.stack.push(common::bool_to_u256(a < b));
535                }
536                opcodes::OpCode::GT => {
537                    let a = self.stack.pop();
538                    let b = self.stack.pop();
539                    self.stack.push(common::bool_to_u256(a > b));
540                }
541                opcodes::OpCode::SLT => {
542                    let (a, neg_a) = common::get_sign(self.stack.pop());
543                    let (b, neg_b) = common::get_sign(self.stack.pop());
544                    let is_positive_lt = a < b && !(neg_a | neg_b);
545                    let is_negative_lt = a > b && (neg_a & neg_b);
546                    let has_different_signs = neg_a && !neg_b;
547                    self.stack.push(common::bool_to_u256(
548                        is_positive_lt | is_negative_lt | has_different_signs,
549                    ));
550                }
551                opcodes::OpCode::SGT => {
552                    let (a, neg_a) = common::get_sign(self.stack.pop());
553                    let (b, neg_b) = common::get_sign(self.stack.pop());
554                    let is_positive_gt = a > b && !(neg_a | neg_b);
555                    let is_negative_gt = a < b && (neg_a & neg_b);
556                    let has_different_signs = !neg_a && neg_b;
557                    self.stack.push(common::bool_to_u256(
558                        is_positive_gt | is_negative_gt | has_different_signs,
559                    ));
560                }
561                opcodes::OpCode::EQ => {
562                    let a = self.stack.pop();
563                    let b = self.stack.pop();
564                    self.stack.push(common::bool_to_u256(a == b));
565                }
566                opcodes::OpCode::ISZERO => {
567                    let a = self.stack.pop();
568                    self.stack.push(common::bool_to_u256(a.is_zero()));
569                }
570                opcodes::OpCode::AND => {
571                    let a = self.stack.pop();
572                    let b = self.stack.pop();
573                    self.stack.push(a & b);
574                }
575                opcodes::OpCode::OR => {
576                    let a = self.stack.pop();
577                    let b = self.stack.pop();
578                    self.stack.push(a | b);
579                }
580                opcodes::OpCode::XOR => {
581                    let a = self.stack.pop();
582                    let b = self.stack.pop();
583                    self.stack.push(a ^ b);
584                }
585                opcodes::OpCode::NOT => {
586                    let a = self.stack.pop();
587                    self.stack.push(!a);
588                }
589                opcodes::OpCode::BYTE => {
590                    let word = self.stack.pop();
591                    let val = self.stack.pop();
592                    let byte = if word < U256::from(32) {
593                        (val >> (8 * (31 - word.low_u64() as usize))) & U256::from(0xff)
594                    } else {
595                        U256::zero()
596                    };
597                    self.stack.push(byte);
598                }
599                opcodes::OpCode::SHL => {
600                    const CONST_256: U256 = U256([256, 0, 0, 0]);
601                    let shift = self.stack.pop();
602                    let value = self.stack.pop();
603                    let result = if shift >= CONST_256 {
604                        U256::zero()
605                    } else {
606                        value << (shift.as_u32() as usize)
607                    };
608                    self.stack.push(result);
609                }
610                opcodes::OpCode::SHR => {
611                    const CONST_256: U256 = U256([256, 0, 0, 0]);
612                    let shift = self.stack.pop();
613                    let value = self.stack.pop();
614                    let result = if shift >= CONST_256 {
615                        U256::zero()
616                    } else {
617                        value >> (shift.as_u32() as usize)
618                    };
619                    self.stack.push(result);
620                }
621                opcodes::OpCode::SAR => {
622                    const CONST_256: U256 = U256([256, 0, 0, 0]);
623                    const CONST_HIBIT: U256 = U256([0, 0, 0, 0x8000_0000_0000_0000]);
624                    let shift = self.stack.pop();
625                    let value = self.stack.pop();
626                    let sign = value & CONST_HIBIT != U256::zero();
627                    let result = if shift >= CONST_256 {
628                        if sign {
629                            U256::max_value()
630                        } else {
631                            U256::zero()
632                        }
633                    } else {
634                        let shift = shift.as_u32() as usize;
635                        let mut shifted = value >> shift;
636                        if sign {
637                            shifted = shifted | (U256::max_value() << (256 - shift));
638                        }
639                        shifted
640                    };
641                    self.stack.push(result);
642                }
643                opcodes::OpCode::SHA3 => {
644                    let mem_offset = self.stack.pop();
645                    let mem_len = self.stack.pop();
646                    let k = self
647                        .data_provider
648                        .sha3(self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize));
649                    self.stack.push(U256::from(k));
650                }
651                opcodes::OpCode::ADDRESS => {
652                    self.stack.push(common::address_to_u256(self.params.address));
653                }
654                opcodes::OpCode::BALANCE => {
655                    let address = common::u256_to_address(&self.stack.pop());
656                    let balance = self.data_provider.get_balance(&address);
657                    self.stack.push(balance);
658                }
659                opcodes::OpCode::ORIGIN => {
660                    self.stack.push(common::address_to_u256(self.params.origin));
661                }
662                opcodes::OpCode::CALLER => {
663                    self.stack.push(common::address_to_u256(self.params.sender));
664                }
665                opcodes::OpCode::CALLVALUE => {
666                    self.stack.push(self.params.value);
667                }
668                opcodes::OpCode::CALLDATALOAD => {
669                    let big_id = self.stack.pop();
670                    let id = big_id.low_u64() as usize;
671                    let max = id.wrapping_add(32);
672                    if !self.params.input.is_empty() {
673                        let bound = cmp::min(self.params.input.len(), max);
674                        if id < bound && big_id < U256::from(self.params.input.len()) {
675                            let mut v = [0u8; 32];
676                            v[0..bound - id].clone_from_slice(&self.params.input[id..bound]);
677                            self.stack.push(U256::from(&v[..]))
678                        } else {
679                            self.stack.push(U256::zero())
680                        }
681                    } else {
682                        self.stack.push(U256::zero())
683                    }
684                }
685                opcodes::OpCode::CALLDATASIZE => {
686                    self.stack.push(U256::from(self.params.input.len()));
687                }
688                opcodes::OpCode::CALLDATACOPY => {
689                    let mem_offset = self.stack.pop();
690                    let raw_offset = self.stack.pop();
691                    let size = self.stack.pop();
692
693                    let data = common::copy_data(self.params.input.as_slice(), raw_offset, size);
694                    self.mem.set(mem_offset.as_usize(), data.as_slice());
695                }
696                opcodes::OpCode::CODESIZE => {
697                    self.stack.push(U256::from(self.params.contract.code_data.len()));
698                }
699                opcodes::OpCode::CODECOPY => {
700                    let mem_offset = self.stack.pop();
701                    let raw_offset = self.stack.pop();
702                    let size = self.stack.pop();
703                    let data = common::copy_data(self.params.contract.code_data.as_slice(), raw_offset, size);
704                    self.mem.set(mem_offset.as_usize(), data.as_slice());
705                }
706                opcodes::OpCode::GASPRICE => {
707                    self.stack.push(self.params.gas_price);
708                }
709                opcodes::OpCode::EXTCODESIZE => {
710                    let address = common::u256_to_address(&self.stack.pop());
711                    let len = self.data_provider.get_code_size(&address);
712                    self.stack.push(U256::from(len));
713                }
714                opcodes::OpCode::EXTCODECOPY => {
715                    let address = common::u256_to_address(&self.stack.pop());
716                    let mem_offset = self.stack.pop();
717                    let code_offset = self.stack.pop();
718                    let size = self.stack.pop();
719                    let code = self.data_provider.get_code(&address);
720                    let data = common::copy_data(code.as_slice(), code_offset, size);
721                    self.mem.set(mem_offset.as_usize(), data.as_slice())
722                }
723                opcodes::OpCode::RETURNDATASIZE => self.stack.push(U256::from(self.return_data.len())),
724                opcodes::OpCode::RETURNDATACOPY => {
725                    let mem_offset = self.stack.pop();
726                    let raw_offset = self.stack.pop();
727                    let size = self.stack.pop();
728                    let return_data_len = U256::from(self.return_data.len());
729                    if raw_offset.saturating_add(size) > return_data_len {
730                        return Err(err::Error::OutOfBounds);
731                    }
732                    let data = common::copy_data(&self.return_data, raw_offset, size);
733                    self.mem.set(mem_offset.as_usize(), data.as_slice())
734                }
735                opcodes::OpCode::EXTCODEHASH => {
736                    let address = common::u256_to_address(&self.stack.pop());
737                    let hash = self.data_provider.get_code_hash(&address);
738                    self.stack.push(U256::from(hash));
739                }
740                opcodes::OpCode::BLOCKHASH => {
741                    let block_number = self.stack.pop();
742                    let block_hash = self.data_provider.get_block_hash(&block_number);
743                    self.stack.push(U256::from(&*block_hash));
744                }
745                opcodes::OpCode::COINBASE => {
746                    self.stack.push(common::address_to_u256(self.context.coinbase));
747                }
748                opcodes::OpCode::TIMESTAMP => {
749                    self.stack.push(U256::from(self.context.timestamp));
750                }
751                opcodes::OpCode::NUMBER => {
752                    self.stack.push(self.context.number);
753                }
754                opcodes::OpCode::DIFFICULTY => {
755                    self.stack.push(self.context.difficulty);
756                }
757                opcodes::OpCode::GASLIMIT => {
758                    self.stack.push(U256::from(self.context.gas_limit));
760                }
761                opcodes::OpCode::POP => {
762                    self.stack.pop();
763                }
764                opcodes::OpCode::MLOAD => {
765                    let offset = self.stack.pop().as_u64();
766                    let word = self.mem.get(offset as usize, 32);
767                    self.stack.push(U256::from(word));
768                }
769                opcodes::OpCode::MSTORE => {
770                    let offset = self.stack.pop();
771                    let word = self.stack.pop();
772                    let word = &<[u8; 32]>::from(word)[..];
773                    self.mem.set(offset.low_u64() as usize, word);
774                }
775                opcodes::OpCode::MSTORE8 => {
776                    let offset = self.stack.pop();
777                    let word = self.stack.pop();
778                    self.mem.set(offset.low_u64() as usize, &[word.low_u64() as u8]);
779                }
780                opcodes::OpCode::SLOAD => {
781                    let key = H256::from(self.stack.pop());
782                    let word = U256::from(&*self.data_provider.get_storage(&self.params.address, &key));
783                    self.stack.push(word);
784                }
785                opcodes::OpCode::SSTORE => {
786                    let address = H256::from(&self.stack.pop());
787                    let value = self.stack.pop();
788                    self.data_provider
789                        .set_storage(&self.params.address, address, H256::from(&value));
790                }
791                opcodes::OpCode::JUMP => {
792                    let jump = self.stack.pop();
793                    self.pre_jump(jump)?;
794                    pc = jump.low_u64();
795                }
796                opcodes::OpCode::JUMPI => {
797                    let jump = self.stack.pop();
798                    let condition = self.stack.pop();
799                    if !condition.is_zero() {
800                        self.pre_jump(jump)?;
801                        pc = jump.low_u64();
802                    }
803                }
804                opcodes::OpCode::PC => {
805                    self.stack.push(U256::from(pc - 1));
806                }
807                opcodes::OpCode::MSIZE => {
808                    self.stack.push(U256::from(self.mem.len()));
809                }
810                opcodes::OpCode::GAS => {
811                    self.stack.push(U256::from(self.gas));
812                }
813                opcodes::OpCode::JUMPDEST => {}
814                opcodes::OpCode::PUSH1
815                | opcodes::OpCode::PUSH2
816                | opcodes::OpCode::PUSH3
817                | opcodes::OpCode::PUSH4
818                | opcodes::OpCode::PUSH5
819                | opcodes::OpCode::PUSH6
820                | opcodes::OpCode::PUSH7
821                | opcodes::OpCode::PUSH8
822                | opcodes::OpCode::PUSH9
823                | opcodes::OpCode::PUSH10
824                | opcodes::OpCode::PUSH11
825                | opcodes::OpCode::PUSH12
826                | opcodes::OpCode::PUSH13
827                | opcodes::OpCode::PUSH14
828                | opcodes::OpCode::PUSH15
829                | opcodes::OpCode::PUSH16
830                | opcodes::OpCode::PUSH17
831                | opcodes::OpCode::PUSH18
832                | opcodes::OpCode::PUSH19
833                | opcodes::OpCode::PUSH20
834                | opcodes::OpCode::PUSH21
835                | opcodes::OpCode::PUSH22
836                | opcodes::OpCode::PUSH23
837                | opcodes::OpCode::PUSH24
838                | opcodes::OpCode::PUSH25
839                | opcodes::OpCode::PUSH26
840                | opcodes::OpCode::PUSH27
841                | opcodes::OpCode::PUSH28
842                | opcodes::OpCode::PUSH29
843                | opcodes::OpCode::PUSH30
844                | opcodes::OpCode::PUSH31
845                | opcodes::OpCode::PUSH32 => {
846                    let n = op as u8 - opcodes::OpCode::PUSH1 as u8 + 1;
847                    let e = pc + u64::from(n);
848                    let e = cmp::min(e, self.params.contract.code_data.len() as u64);
849                    let r = U256::from(&self.params.contract.code_data[pc as usize..e as usize]);
850                    pc = e;
851                    self.stack.push(r);
852                }
853                opcodes::OpCode::DUP1
854                | opcodes::OpCode::DUP2
855                | opcodes::OpCode::DUP3
856                | opcodes::OpCode::DUP4
857                | opcodes::OpCode::DUP5
858                | opcodes::OpCode::DUP6
859                | opcodes::OpCode::DUP7
860                | opcodes::OpCode::DUP8
861                | opcodes::OpCode::DUP9
862                | opcodes::OpCode::DUP10
863                | opcodes::OpCode::DUP11
864                | opcodes::OpCode::DUP12
865                | opcodes::OpCode::DUP13
866                | opcodes::OpCode::DUP14
867                | opcodes::OpCode::DUP15
868                | opcodes::OpCode::DUP16 => {
869                    let p = op as u8 - opcodes::OpCode::DUP1 as u8;
870                    self.stack.dup(p as usize);
871                }
872                opcodes::OpCode::SWAP1
873                | opcodes::OpCode::SWAP2
874                | opcodes::OpCode::SWAP3
875                | opcodes::OpCode::SWAP4
876                | opcodes::OpCode::SWAP5
877                | opcodes::OpCode::SWAP6
878                | opcodes::OpCode::SWAP7
879                | opcodes::OpCode::SWAP8
880                | opcodes::OpCode::SWAP9
881                | opcodes::OpCode::SWAP10
882                | opcodes::OpCode::SWAP11
883                | opcodes::OpCode::SWAP12
884                | opcodes::OpCode::SWAP13
885                | opcodes::OpCode::SWAP14
886                | opcodes::OpCode::SWAP15
887                | opcodes::OpCode::SWAP16 => {
888                    let p = op as u8 - opcodes::OpCode::SWAP1 as u8 + 1;
889                    self.stack.swap(p as usize);
890                }
891                opcodes::OpCode::LOG0
892                | opcodes::OpCode::LOG1
893                | opcodes::OpCode::LOG2
894                | opcodes::OpCode::LOG3
895                | opcodes::OpCode::LOG4 => {
896                    let n = op as u8 - opcodes::OpCode::LOG0 as u8;
897                    let mem_offset = self.stack.pop();
898                    let mem_len = self.stack.pop();
899                    let mut topics: Vec<H256> = Vec::new();
900                    for _ in 0..n {
901                        let r = H256::from(self.stack.pop());
902                        topics.push(r);
903                    }
904                    let data = self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize);
905                    self.logs.push(Log(self.params.address, topics, Vec::from(data)));
906                }
907                opcodes::OpCode::CREATE | opcodes::OpCode::CREATE2 => {
908                    self.return_data = vec![];
910
911                    let value = self.stack.pop();
912                    let mem_offset = self.stack.pop();
913                    let mem_len = self.stack.pop();
914                    let salt = H256::from({
915                        match op {
916                            opcodes::OpCode::CREATE => U256::zero(),
917                            opcodes::OpCode::CREATE2 => self.stack.pop(),
918                            _ => panic!("instruction can only be CREATE/CREATE2 checked above"),
919                        }
920                    });
921                    let data = self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize);
922                    if value > self.data_provider.get_balance(&self.params.address) {
924                        self.gas += self.gas_tmp;
925                        self.stack.push(U256::zero());
926                        continue;
927                    }
928                    if self.params.depth >= self.cfg.max_call_depth {
930                        self.gas += self.gas_tmp;
931                        self.stack.push(U256::zero());
932                        continue;
933                    }
934                    let mut params = InterpreterParams::default();
935                    params.origin = self.params.origin;
936                    params.sender = self.params.address;
937                    params.gas_limit = self.gas_tmp;
938                    params.gas_price = self.params.gas_price;
939                    params.input = Vec::from(data);
940                    params.value = value;
941                    params.extra = salt;
942                    params.depth = self.params.depth + 1;
943                    let r = self.data_provider.call(op, params);
944                    match r {
945                        Ok(data) => match data {
946                            InterpreterResult::Create(_, gas, logs, add) => {
947                                self.stack.push(common::address_to_u256(add));
948                                self.gas += gas;
949                                self.logs.extend(logs);
950                            }
951                            InterpreterResult::Revert(ret, gas) => {
952                                self.stack.push(U256::zero());
953                                self.gas += gas;
954                                self.return_data = ret;
955                            }
956                            _ => {}
957                        },
958                        Err(_) => {
959                            self.stack.push(U256::zero());
960                        }
961                    }
962                }
963                opcodes::OpCode::CALL
964                | opcodes::OpCode::CALLCODE
965                | opcodes::OpCode::DELEGATECALL
966                | opcodes::OpCode::STATICCALL => {
967                    let _ = self.stack.pop();
968                    let address = common::u256_to_address(&self.stack.pop());
969                    let value = {
970                        if op == opcodes::OpCode::CALL || op == opcodes::OpCode::CALLCODE {
971                            self.stack.pop()
972                        } else {
973                            U256::zero()
974                        }
975                    };
976                    let mem_offset = self.stack.pop();
977                    let mem_len = self.stack.pop();
978                    let out_offset = self.stack.pop();
979                    let out_len = self.stack.pop();
980
981                    if op == opcodes::OpCode::CALL && self.params.read_only && !value.is_zero() {
982                        return Err(err::Error::MutableCallInStaticContext);
983                    }
984
985                    self.return_data = vec![];
987
988                    let mut gas = self.gas_tmp;
989                    if !value.is_zero() {
991                        gas += self.cfg.gas_call_stipend;
992                    }
993                    if value > self.data_provider.get_balance(&self.params.address) {
995                        self.gas += gas;
996                        self.stack.push(U256::zero());
997                        continue;
998                    }
999                    if self.params.depth >= self.cfg.max_call_depth {
1001                        self.gas += gas;
1002                        self.stack.push(U256::zero());
1003                        continue;
1004                    }
1005                    let data = self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize);
1006                    let mut params = InterpreterParams::default();
1007                    params.origin = self.params.origin;
1008                    params.gas_limit = gas;
1009                    params.gas_price = self.params.gas_price;
1010                    params.contract.code_address = address;
1011                    params.contract.code_data = self.data_provider.get_code(¶ms.contract.code_address).to_vec();
1012                    params.input = Vec::from(data);
1013                    params.depth = self.params.depth + 1;
1014                    params.read_only = self.params.read_only;
1023
1024                    match op {
1025                        opcodes::OpCode::CALL => {
1026                            params.sender = self.params.address;
1027                            params.receiver = address;
1028                            params.address = address;
1029                            params.value = value;
1030                        }
1031                        opcodes::OpCode::CALLCODE => {
1032                            params.sender = self.params.address;
1033                            params.receiver = self.params.address;
1034                            params.address = self.params.address;
1035                            params.value = value;
1036                        }
1037                        opcodes::OpCode::DELEGATECALL => {
1038                            params.sender = self.params.sender;
1039                            params.receiver = self.params.address;
1040                            params.address = self.params.address;
1041                            params.value = self.params.value;
1051                            params.disable_transfer_value = true;
1052                        }
1053                        opcodes::OpCode::STATICCALL => {
1054                            params.sender = self.params.address;
1055                            params.receiver = address;
1056                            params.address = address;
1057                            params.read_only = true;
1058                        }
1059                        _ => {}
1060                    }
1061                    let r = self.data_provider.call(op, params);
1062                    match r {
1063                        Ok(data) => match data {
1064                            InterpreterResult::Normal(mut ret, gas, logs) => {
1065                                self.stack.push(U256::one());
1066                                self.return_data = ret.clone();
1067                                if ret.len() > out_len.low_u64() as usize {
1068                                    ret.resize(out_len.low_u64() as usize, 0u8);
1069                                }
1070                                self.mem.set(out_offset.low_u64() as usize, ret.as_slice());
1071                                self.gas += gas;
1072                                self.logs.extend(logs);
1073                            }
1074                            InterpreterResult::Revert(mut ret, gas) => {
1075                                self.stack.push(U256::zero());
1076                                self.return_data = ret.clone();
1077                                if ret.len() > out_len.low_u64() as usize {
1078                                    ret.resize(out_len.low_u64() as usize, 0u8);
1079                                }
1080                                self.mem.set(out_offset.low_u64() as usize, ret.as_slice());
1081                                self.gas += gas;
1082                            }
1083                            _ => {}
1084                        },
1085                        Err(_) => {
1086                            self.stack.push(U256::zero());
1087                        }
1088                    }
1089                }
1090                opcodes::OpCode::RETURN => {
1091                    let mem_offset = self.stack.pop();
1092                    let mem_len = self.stack.pop();
1093                    let r = self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize);
1094                    let return_data = Vec::from(r);
1095                    return Ok(InterpreterResult::Normal(
1096                        return_data.clone(),
1097                        self.gas,
1098                        self.logs.clone(),
1099                    ));
1100                }
1101                opcodes::OpCode::REVERT => {
1102                    let mem_offset = self.stack.pop();
1103                    let mem_len = self.stack.pop();
1104                    let r = self.mem.get(mem_offset.low_u64() as usize, mem_len.low_u64() as usize);
1105                    let return_data = Vec::from(r);
1106                    return Ok(InterpreterResult::Revert(return_data.clone(), self.gas));
1107                }
1108                opcodes::OpCode::SELFDESTRUCT => {
1109                    let address = self.stack.pop();
1110                    let b = self
1111                        .data_provider
1112                        .selfdestruct(&self.params.address, &common::u256_to_address(&address));
1113                    if !b {
1114                        self.data_provider
1121                            .sub_refund(&self.params.origin, self.cfg.gas_self_destruct_refund);
1122                    }
1123                    break;
1124                }
1125            }
1126            debug!("");
1127        }
1128        Ok(InterpreterResult::Normal(vec![], self.gas, self.logs.clone()))
1129    }
1130
1131    fn use_gas(&mut self, gas: u64) -> Result<(), err::Error> {
1132        debug!("[Gas] - {}", gas);
1133        if self.gas < gas {
1134            return Err(err::Error::OutOfGas);
1135        }
1136        self.gas -= gas;
1137        Ok(())
1138    }
1139
1140    fn mem_gas_cost(&mut self, size: u64) -> u64 {
1141        let goc = common::mem_gas_cost(size, self.cfg.gas_memory);
1142        if goc > self.mem_gas {
1143            let fee = goc - self.mem_gas;
1144            self.mem_gas = goc;
1145            fee
1146        } else {
1147            0
1148        }
1149    }
1150
1151    fn mem_gas_work(&mut self, mem_offset: U256, mem_len: U256) -> Result<(), err::Error> {
1152        if mem_len.is_zero() {
1153            return Ok(());
1154        }
1155        let (mem_sum, b) = mem_offset.overflowing_add(mem_len);
1156        if b || mem_sum.bits() > 64 || mem_sum.low_u64() > 1024 * 1024 * 1024 {
1162            return Err(err::Error::OutOfGas);
1163        }
1164        if mem_len != U256::zero() {
1165            let gas = self.mem_gas_cost(mem_sum.low_u64());
1166            self.use_gas(gas)?;
1167        }
1168        self.mem.expand(mem_sum.low_u64() as usize);
1169        Ok(())
1170    }
1171
1172    fn get_byte(&self, n: u64) -> Option<u8> {
1173        if n < self.params.contract.code_data.len() as u64 {
1174            return Some(self.params.contract.code_data[n as usize]);
1175        }
1176        None
1177    }
1178
1179    fn get_op(&self, n: u64) -> Result<Option<opcodes::OpCode>, err::Error> {
1180        match self.get_byte(n) {
1181            Some(a) => match opcodes::OpCode::from_u8(a) {
1182                Some(b) => Ok(Some(b)),
1183                None => Err(err::Error::InvalidOpcode),
1184            },
1185            None => Ok(None),
1186        }
1187    }
1188
1189    fn pre_jump(&self, n: U256) -> Result<(), err::Error> {
1190        if n.bits() > 63 {
1191            return Err(err::Error::InvalidJumpDestination);
1192        }
1193        let n = n.low_u64() as usize;
1194        if n >= self.params.contract.code_data.len() {
1195            return Err(err::Error::InvalidJumpDestination);
1196        }
1197        if self.params.contract.code_data[n] != opcodes::OpCode::JUMPDEST as u8 {
1199            return Err(err::Error::InvalidJumpDestination);
1200        }
1201        Ok(())
1202    }
1203
1204    fn trace(&self, op: &opcodes::OpCode, pc: u64) {
1206        if *op >= opcodes::OpCode::PUSH1 && *op <= opcodes::OpCode::PUSH32 {
1207            let n = op.clone() as u8 - opcodes::OpCode::PUSH1 as u8 + 1;
1208            let r = {
1209                if pc + u64::from(n) > self.params.contract.code_data.len() as u64 {
1210                    U256::zero()
1211                } else {
1212                    U256::from(&self.params.contract.code_data[pc as usize..(pc + u64::from(n)) as usize])
1213                }
1214            };
1215            debug!("[OP] {} {:#x} gas={}", op, r, self.gas);
1216        } else {
1217            debug!("[OP] {} gas={}", op, self.gas);
1218        }
1219        debug!("[STACK]");
1220        let l = self.stack.data().len();
1221        for i in 0..l {
1222            debug!("[{}] {:#x}", i, self.stack.back(i));
1223        }
1224        debug!("[MEM] len={}", self.mem.len());
1225    }
1226}
1227
1228#[cfg(test)]
1229mod tests {
1230    use super::super::extmock;
1232    use super::*;
1233
1234    fn default_interpreter() -> Interpreter {
1235        let mut it = Interpreter::new(
1236            Context::default(),
1237            InterpreterConf::default(),
1238            Box::new(extmock::DataProviderMock::default()),
1239            InterpreterParams::default(),
1240        );
1241        it.context.gas_limit = 1_000_000;
1242        it.params.gas_limit = 1_000_000;
1243        it.gas = 1_000_000;
1244        it
1245    }
1246
1247    #[test]
1248    fn test_op_byte() {
1249        let data = vec![
1250            (
1251                "ABCDEF0908070605040302010000000000000000000000000000000000000000",
1252                "0",
1253                "AB",
1254            ),
1255            (
1256                "ABCDEF0908070605040302010000000000000000000000000000000000000000",
1257                "1",
1258                "CD",
1259            ),
1260            (
1261                "00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff",
1262                "0",
1263                "00",
1264            ),
1265            (
1266                "ABCDEF0908070605040302010000000000000000000000000000000000000000",
1267                "1",
1268                "CD",
1269            ),
1270            (
1271                "00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff",
1272                "0",
1273                "00",
1274            ),
1275            (
1276                "00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff",
1277                "1",
1278                "CD",
1279            ),
1280            (
1281                "0000000000000000000000000000000000000000000000000000000000102030",
1282                "31",
1283                "30",
1284            ),
1285            (
1286                "0000000000000000000000000000000000000000000000000000000000102030",
1287                "30",
1288                "20",
1289            ),
1290            (
1291                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1292                "32",
1293                "00",
1294            ),
1295            (
1296                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1297                "4294967295",
1298                "00",
1299            ),
1300        ];
1301        for (val, th, expected) in data {
1302            let mut it = default_interpreter();;
1303            it.stack
1304                .push_n(&[U256::from(val), U256::from(th.parse::<u64>().unwrap())]);
1305            it.params.contract.code_data = vec![opcodes::OpCode::BYTE as u8];
1306            it.run().unwrap();
1307            assert_eq!(it.stack.pop(), U256::from(expected));
1308        }
1309    }
1310
1311    #[test]
1312    fn test_op_shl() {
1313        let data = vec![
1314            (
1315                "0000000000000000000000000000000000000000000000000000000000000001",
1316                "00",
1317                "0000000000000000000000000000000000000000000000000000000000000001",
1318            ),
1319            (
1320                "0000000000000000000000000000000000000000000000000000000000000001",
1321                "01",
1322                "0000000000000000000000000000000000000000000000000000000000000002",
1323            ),
1324            (
1325                "0000000000000000000000000000000000000000000000000000000000000001",
1326                "ff",
1327                "8000000000000000000000000000000000000000000000000000000000000000",
1328            ),
1329            (
1330                "0000000000000000000000000000000000000000000000000000000000000001",
1331                "0100",
1332                "0000000000000000000000000000000000000000000000000000000000000000",
1333            ),
1334            (
1335                "0000000000000000000000000000000000000000000000000000000000000001",
1336                "0101",
1337                "0000000000000000000000000000000000000000000000000000000000000000",
1338            ),
1339            (
1340                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1341                "00",
1342                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1343            ),
1344            (
1345                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1346                "01",
1347                "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
1348            ),
1349            (
1350                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1351                "ff",
1352                "8000000000000000000000000000000000000000000000000000000000000000",
1353            ),
1354            (
1355                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1356                "0100",
1357                "0000000000000000000000000000000000000000000000000000000000000000",
1358            ),
1359            (
1360                "0000000000000000000000000000000000000000000000000000000000000000",
1361                "01",
1362                "0000000000000000000000000000000000000000000000000000000000000000",
1363            ),
1364            (
1365                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1366                "01",
1367                "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
1368            ),
1369        ];
1370        for (x, y, expected) in data {
1371            let mut it = default_interpreter();;
1372            it.stack.push_n(&[U256::from(x), U256::from(y)]);
1373            it.params.contract.code_data = vec![opcodes::OpCode::SHL as u8];
1374            it.run().unwrap();
1375            assert_eq!(it.stack.pop(), U256::from(expected));
1376        }
1377    }
1378
1379    #[test]
1380    fn test_op_shr() {
1381        let data = vec![
1382            (
1383                "0000000000000000000000000000000000000000000000000000000000000001",
1384                "00",
1385                "0000000000000000000000000000000000000000000000000000000000000001",
1386            ),
1387            (
1388                "0000000000000000000000000000000000000000000000000000000000000001",
1389                "01",
1390                "0000000000000000000000000000000000000000000000000000000000000000",
1391            ),
1392            (
1393                "8000000000000000000000000000000000000000000000000000000000000000",
1394                "01",
1395                "4000000000000000000000000000000000000000000000000000000000000000",
1396            ),
1397            (
1398                "8000000000000000000000000000000000000000000000000000000000000000",
1399                "ff",
1400                "0000000000000000000000000000000000000000000000000000000000000001",
1401            ),
1402            (
1403                "8000000000000000000000000000000000000000000000000000000000000000",
1404                "0100",
1405                "0000000000000000000000000000000000000000000000000000000000000000",
1406            ),
1407            (
1408                "8000000000000000000000000000000000000000000000000000000000000000",
1409                "0101",
1410                "0000000000000000000000000000000000000000000000000000000000000000",
1411            ),
1412            (
1413                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1414                "00",
1415                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1416            ),
1417            (
1418                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1419                "01",
1420                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1421            ),
1422            (
1423                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1424                "ff",
1425                "0000000000000000000000000000000000000000000000000000000000000001",
1426            ),
1427            (
1428                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1429                "0100",
1430                "0000000000000000000000000000000000000000000000000000000000000000",
1431            ),
1432            (
1433                "0000000000000000000000000000000000000000000000000000000000000000",
1434                "01",
1435                "0000000000000000000000000000000000000000000000000000000000000000",
1436            ),
1437        ];
1438        for (x, y, expected) in data {
1439            let mut it = default_interpreter();;
1440            it.stack.push_n(&[U256::from(x), U256::from(y)]);
1441            it.params.contract.code_data = vec![opcodes::OpCode::SHR as u8];
1442            it.run().unwrap();
1443            assert_eq!(it.stack.pop(), U256::from(expected));
1444        }
1445    }
1446
1447    #[test]
1448    fn test_op_sar() {
1449        let data = vec![
1450            (
1451                "0000000000000000000000000000000000000000000000000000000000000001",
1452                "00",
1453                "0000000000000000000000000000000000000000000000000000000000000001",
1454            ),
1455            (
1456                "0000000000000000000000000000000000000000000000000000000000000001",
1457                "01",
1458                "0000000000000000000000000000000000000000000000000000000000000000",
1459            ),
1460            (
1461                "8000000000000000000000000000000000000000000000000000000000000000",
1462                "01",
1463                "c000000000000000000000000000000000000000000000000000000000000000",
1464            ),
1465            (
1466                "8000000000000000000000000000000000000000000000000000000000000000",
1467                "ff",
1468                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1469            ),
1470            (
1471                "8000000000000000000000000000000000000000000000000000000000000000",
1472                "0100",
1473                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1474            ),
1475            (
1476                "8000000000000000000000000000000000000000000000000000000000000000",
1477                "0101",
1478                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1479            ),
1480            (
1481                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1482                "00",
1483                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1484            ),
1485            (
1486                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1487                "01",
1488                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1489            ),
1490            (
1491                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1492                "ff",
1493                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1494            ),
1495            (
1496                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1497                "0100",
1498                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1499            ),
1500            (
1501                "0000000000000000000000000000000000000000000000000000000000000000",
1502                "01",
1503                "0000000000000000000000000000000000000000000000000000000000000000",
1504            ),
1505            (
1506                "4000000000000000000000000000000000000000000000000000000000000000",
1507                "fe",
1508                "0000000000000000000000000000000000000000000000000000000000000001",
1509            ),
1510            (
1511                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1512                "f8",
1513                "000000000000000000000000000000000000000000000000000000000000007f",
1514            ),
1515            (
1516                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1517                "fe",
1518                "0000000000000000000000000000000000000000000000000000000000000001",
1519            ),
1520            (
1521                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1522                "ff",
1523                "0000000000000000000000000000000000000000000000000000000000000000",
1524            ),
1525            (
1526                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1527                "0100",
1528                "0000000000000000000000000000000000000000000000000000000000000000",
1529            ),
1530        ];
1531        for (x, y, expected) in data {
1532            let mut it = default_interpreter();;
1533            it.stack.push_n(&[U256::from(x), U256::from(y)]);
1534            it.params.contract.code_data = vec![opcodes::OpCode::SAR as u8];
1535            it.run().unwrap();
1536            assert_eq!(it.stack.pop(), U256::from(expected));
1537        }
1538    }
1539
1540    #[test]
1541    fn test_op_sgt() {
1542        let data = vec![
1543            (
1544                "0000000000000000000000000000000000000000000000000000000000000001",
1545                "0000000000000000000000000000000000000000000000000000000000000001",
1546                "0000000000000000000000000000000000000000000000000000000000000000",
1547            ),
1548            (
1549                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1550                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1551                "0000000000000000000000000000000000000000000000000000000000000000",
1552            ),
1553            (
1554                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1555                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1556                "0000000000000000000000000000000000000000000000000000000000000000",
1557            ),
1558            (
1559                "0000000000000000000000000000000000000000000000000000000000000001",
1560                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1561                "0000000000000000000000000000000000000000000000000000000000000001",
1562            ),
1563            (
1564                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1565                "0000000000000000000000000000000000000000000000000000000000000001",
1566                "0000000000000000000000000000000000000000000000000000000000000000",
1567            ),
1568            (
1569                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1570                "0000000000000000000000000000000000000000000000000000000000000001",
1571                "0000000000000000000000000000000000000000000000000000000000000001",
1572            ),
1573            (
1574                "0000000000000000000000000000000000000000000000000000000000000001",
1575                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1576                "0000000000000000000000000000000000000000000000000000000000000000",
1577            ),
1578            (
1579                "8000000000000000000000000000000000000000000000000000000000000001",
1580                "8000000000000000000000000000000000000000000000000000000000000001",
1581                "0000000000000000000000000000000000000000000000000000000000000000",
1582            ),
1583            (
1584                "8000000000000000000000000000000000000000000000000000000000000001",
1585                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1586                "0000000000000000000000000000000000000000000000000000000000000001",
1587            ),
1588            (
1589                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1590                "8000000000000000000000000000000000000000000000000000000000000001",
1591                "0000000000000000000000000000000000000000000000000000000000000000",
1592            ),
1593            (
1594                "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb",
1595                "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
1596                "0000000000000000000000000000000000000000000000000000000000000001",
1597            ),
1598            (
1599                "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
1600                "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb",
1601                "0000000000000000000000000000000000000000000000000000000000000000",
1602            ),
1603        ];
1604        for (x, y, expected) in data {
1605            let mut it = default_interpreter();;
1606            it.stack.push_n(&[U256::from(x), U256::from(y)]);
1607            it.params.contract.code_data = vec![opcodes::OpCode::SGT as u8];
1608            it.run().unwrap();
1609            assert_eq!(it.stack.pop(), U256::from(expected));
1610        }
1611    }
1612
1613    #[test]
1614    fn test_op_slt() {
1615        let data = vec![
1616            (
1617                "0000000000000000000000000000000000000000000000000000000000000001",
1618                "0000000000000000000000000000000000000000000000000000000000000001",
1619                "0000000000000000000000000000000000000000000000000000000000000000",
1620            ),
1621            (
1622                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1623                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1624                "0000000000000000000000000000000000000000000000000000000000000000",
1625            ),
1626            (
1627                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1628                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1629                "0000000000000000000000000000000000000000000000000000000000000000",
1630            ),
1631            (
1632                "0000000000000000000000000000000000000000000000000000000000000001",
1633                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1634                "0000000000000000000000000000000000000000000000000000000000000000",
1635            ),
1636            (
1637                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1638                "0000000000000000000000000000000000000000000000000000000000000001",
1639                "0000000000000000000000000000000000000000000000000000000000000001",
1640            ),
1641            (
1642                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1643                "0000000000000000000000000000000000000000000000000000000000000001",
1644                "0000000000000000000000000000000000000000000000000000000000000000",
1645            ),
1646            (
1647                "0000000000000000000000000000000000000000000000000000000000000001",
1648                "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1649                "0000000000000000000000000000000000000000000000000000000000000001",
1650            ),
1651            (
1652                "8000000000000000000000000000000000000000000000000000000000000001",
1653                "8000000000000000000000000000000000000000000000000000000000000001",
1654                "0000000000000000000000000000000000000000000000000000000000000000",
1655            ),
1656            (
1657                "8000000000000000000000000000000000000000000000000000000000000001",
1658                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1659                "0000000000000000000000000000000000000000000000000000000000000000",
1660            ),
1661            (
1662                "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
1663                "8000000000000000000000000000000000000000000000000000000000000001",
1664                "0000000000000000000000000000000000000000000000000000000000000001",
1665            ),
1666            (
1667                "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb",
1668                "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
1669                "0000000000000000000000000000000000000000000000000000000000000000",
1670            ),
1671            (
1672                "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
1673                "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb",
1674                "0000000000000000000000000000000000000000000000000000000000000001",
1675            ),
1676        ];
1677        for (x, y, expected) in data {
1678            let mut it = default_interpreter();;
1679            it.stack.push_n(&[U256::from(x), U256::from(y)]);
1680            it.params.contract.code_data = vec![opcodes::OpCode::SLT as u8];
1681            it.run().unwrap();
1682            assert_eq!(it.stack.pop(), U256::from(expected));
1683        }
1684    }
1685
1686    #[test]
1687    fn test_op_mstore() {
1688        let mut it = default_interpreter();;
1689        let v = "abcdef00000000000000abba000000000deaf000000c0de00100000000133700";
1690        it.stack.push_n(&[U256::from(v), U256::zero()]);
1691        it.params.contract.code_data = vec![opcodes::OpCode::MSTORE as u8];
1692        it.run().unwrap();
1693        assert_eq!(it.mem.get(0, 32), common::hex_decode(v).unwrap().as_slice());
1694        it.stack.push_n(&[U256::one(), U256::zero()]);
1695        it.params.contract.code_data = vec![opcodes::OpCode::MSTORE as u8];
1696        it.run().unwrap();
1697        assert_eq!(
1698            it.mem.get(0, 32),
1699            common::hex_decode("0000000000000000000000000000000000000000000000000000000000000001")
1700                .unwrap()
1701                .as_slice()
1702        );
1703    }
1704
1705    #[test]
1706    fn test_op_sstore_eip_1283() {
1707        let data = vec![
1709            ("0x60006000556000600055", 412, 0, 0),
1710            ("0x60006000556001600055", 20212, 0, 0),
1711            ("0x60016000556000600055", 20212, 19800, 0),
1712            ("0x60016000556002600055", 20212, 0, 0),
1713            ("0x60016000556001600055", 20212, 0, 0),
1714            ("0x60006000556000600055", 5212, 15000, 1),
1715            ("0x60006000556001600055", 5212, 4800, 1),
1716            ("0x60006000556002600055", 5212, 0, 1),
1717            ("0x60026000556000600055", 5212, 15000, 1),
1718            ("0x60026000556003600055", 5212, 0, 1),
1719            ("0x60026000556001600055", 5212, 4800, 1),
1720            ("0x60026000556002600055", 5212, 0, 1),
1721            ("0x60016000556000600055", 5212, 15000, 1),
1722            ("0x60016000556002600055", 5212, 0, 1),
1723            ("0x60016000556001600055", 412, 0, 1),
1724            ("0x600160005560006000556001600055", 40218, 19800, 0),
1725            ("0x600060005560016000556000600055", 10218, 19800, 1),
1726        ];
1727        for (code, use_gas, refund, origin) in data {
1728            let mut it = default_interpreter();;
1729            it.cfg.eip1283 = true;
1730            assert_eq!(it.gas, it.context.gas_limit);
1731            it.data_provider
1732                .set_storage_origin(&it.params.contract.code_address, H256::zero(), H256::from(origin));
1733            it.data_provider
1734                .set_storage(&it.params.contract.code_address, H256::zero(), H256::from(origin));
1735            it.params.contract.code_data = common::hex_decode(code).unwrap();
1736            it.run().unwrap();
1737            assert_eq!(it.gas, it.context.gas_limit - use_gas);
1738            assert_eq!(it.data_provider.get_refund(&Address::zero()), refund);
1739        }
1740    }
1741
1742    #[test]
1743    fn test_op_invalid() {
1744        let mut it = default_interpreter();;
1745        it.params.contract.code_data = common::hex_decode("0xfb").unwrap();
1746        let r = it.run();
1747        assert!(r.is_err());
1748        assert_eq!(r.err(), Some(err::Error::InvalidOpcode))
1749    }
1750}