UNPKG

evm

Version:

An ethereum virtual machine (EVM) bytecode decompiler

65 lines (60 loc) 2.02 kB
import EVM from '../classes/evm.class'; import Opcode from '../interfaces/opcode.interface'; import { MLOAD } from './mload'; import * as BigNumber from '../../node_modules/big-integer'; import stringify from '../utils/stringify'; export class REVERT { readonly name: string; readonly type?: string; readonly wrapped: boolean; readonly memoryStart?: any; readonly memoryLength?: any; readonly items: any; constructor(items: any, memoryStart?: any, memoryLength?: any) { this.name = 'REVERT'; this.wrapped = true; if (memoryStart && memoryLength) { this.memoryStart = memoryStart; this.memoryLength = memoryLength; } else { this.items = items; } } toString() { if (this.items) { return 'revert(' + this.items.map((item: any) => stringify(item)).join(', ') + ');'; } else { return ( 'revert(memory[' + stringify(this.memoryStart) + ':(' + stringify(this.memoryStart) + '+' + stringify(this.memoryLength) + ')]);' ); } } } export default (opcode: Opcode, state: EVM): void => { const memoryStart = state.stack.pop(); const memoryLength = state.stack.pop(); state.halted = true; if (BigNumber.isInstance(memoryStart) && BigNumber.isInstance(memoryLength)) { const items = []; for ( let i = memoryStart.toJSNumber(); i < memoryStart.add(memoryLength).toJSNumber(); i += 32 ) { if (i in state.memory) { items.push(state.memory[i]); } else { items.push(new MLOAD(i)); } } state.instructions.push(new REVERT(items)); } else { state.instructions.push(new REVERT([], memoryStart, memoryLength)); } };