| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2014 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-18 13:31:20 +02:00
										 |  |  | package vm | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // OpCode is an EVM opcode | 
					
						
							| 
									
										
										
										
											2014-10-14 11:48:52 +02:00
										 |  |  | type OpCode byte | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 23:39:43 +02:00
										 |  |  | func (op OpCode) IsPush() bool { | 
					
						
							|  |  |  | 	switch op { | 
					
						
							|  |  |  | 	case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32: | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return false | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (op OpCode) IsStaticJump() bool { | 
					
						
							|  |  |  | 	return op == JUMP | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	// 0x0 range - arithmetic ops | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	STOP OpCode = iota | 
					
						
							|  |  |  | 	ADD | 
					
						
							|  |  |  | 	MUL | 
					
						
							|  |  |  | 	SUB | 
					
						
							|  |  |  | 	DIV | 
					
						
							|  |  |  | 	SDIV | 
					
						
							|  |  |  | 	MOD | 
					
						
							|  |  |  | 	SMOD | 
					
						
							|  |  |  | 	ADDMOD | 
					
						
							|  |  |  | 	MULMOD | 
					
						
							|  |  |  | 	EXP | 
					
						
							|  |  |  | 	SIGNEXTEND | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	LT OpCode = iota + 0x10 | 
					
						
							|  |  |  | 	GT | 
					
						
							|  |  |  | 	SLT | 
					
						
							|  |  |  | 	SGT | 
					
						
							|  |  |  | 	EQ | 
					
						
							|  |  |  | 	ISZERO | 
					
						
							|  |  |  | 	AND | 
					
						
							|  |  |  | 	OR | 
					
						
							|  |  |  | 	XOR | 
					
						
							|  |  |  | 	NOT | 
					
						
							|  |  |  | 	BYTE | 
					
						
							| 
									
										
										
										
											2018-02-23 11:32:57 +01:00
										 |  |  | 	SHL | 
					
						
							|  |  |  | 	SHR | 
					
						
							|  |  |  | 	SAR | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SHA3 = 0x20 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0x30 range - closure state | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	ADDRESS OpCode = 0x30 + iota | 
					
						
							|  |  |  | 	BALANCE | 
					
						
							|  |  |  | 	ORIGIN | 
					
						
							|  |  |  | 	CALLER | 
					
						
							|  |  |  | 	CALLVALUE | 
					
						
							|  |  |  | 	CALLDATALOAD | 
					
						
							|  |  |  | 	CALLDATASIZE | 
					
						
							|  |  |  | 	CALLDATACOPY | 
					
						
							|  |  |  | 	CODESIZE | 
					
						
							|  |  |  | 	CODECOPY | 
					
						
							|  |  |  | 	GASPRICE | 
					
						
							|  |  |  | 	EXTCODESIZE | 
					
						
							|  |  |  | 	EXTCODECOPY | 
					
						
							| 
									
										
										
										
											2017-08-16 13:07:33 +03:00
										 |  |  | 	RETURNDATASIZE | 
					
						
							|  |  |  | 	RETURNDATACOPY | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0x40 range - block operations | 
					
						
							| 
									
										
										
										
											2015-01-03 17:18:43 +01:00
										 |  |  | 	BLOCKHASH OpCode = 0x40 + iota | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	COINBASE | 
					
						
							|  |  |  | 	TIMESTAMP | 
					
						
							|  |  |  | 	NUMBER | 
					
						
							|  |  |  | 	DIFFICULTY | 
					
						
							|  |  |  | 	GASLIMIT | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0x50 range - 'storage' and execution | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	POP OpCode = 0x50 + iota | 
					
						
							|  |  |  | 	MLOAD | 
					
						
							|  |  |  | 	MSTORE | 
					
						
							|  |  |  | 	MSTORE8 | 
					
						
							|  |  |  | 	SLOAD | 
					
						
							|  |  |  | 	SSTORE | 
					
						
							|  |  |  | 	JUMP | 
					
						
							|  |  |  | 	JUMPI | 
					
						
							|  |  |  | 	PC | 
					
						
							|  |  |  | 	MSIZE | 
					
						
							|  |  |  | 	GAS | 
					
						
							|  |  |  | 	JUMPDEST | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0x60 range | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	PUSH1 OpCode = 0x60 + iota | 
					
						
							|  |  |  | 	PUSH2 | 
					
						
							|  |  |  | 	PUSH3 | 
					
						
							|  |  |  | 	PUSH4 | 
					
						
							|  |  |  | 	PUSH5 | 
					
						
							|  |  |  | 	PUSH6 | 
					
						
							|  |  |  | 	PUSH7 | 
					
						
							|  |  |  | 	PUSH8 | 
					
						
							|  |  |  | 	PUSH9 | 
					
						
							|  |  |  | 	PUSH10 | 
					
						
							|  |  |  | 	PUSH11 | 
					
						
							|  |  |  | 	PUSH12 | 
					
						
							|  |  |  | 	PUSH13 | 
					
						
							|  |  |  | 	PUSH14 | 
					
						
							|  |  |  | 	PUSH15 | 
					
						
							|  |  |  | 	PUSH16 | 
					
						
							|  |  |  | 	PUSH17 | 
					
						
							|  |  |  | 	PUSH18 | 
					
						
							|  |  |  | 	PUSH19 | 
					
						
							|  |  |  | 	PUSH20 | 
					
						
							|  |  |  | 	PUSH21 | 
					
						
							|  |  |  | 	PUSH22 | 
					
						
							|  |  |  | 	PUSH23 | 
					
						
							|  |  |  | 	PUSH24 | 
					
						
							|  |  |  | 	PUSH25 | 
					
						
							|  |  |  | 	PUSH26 | 
					
						
							|  |  |  | 	PUSH27 | 
					
						
							|  |  |  | 	PUSH28 | 
					
						
							|  |  |  | 	PUSH29 | 
					
						
							|  |  |  | 	PUSH30 | 
					
						
							|  |  |  | 	PUSH31 | 
					
						
							|  |  |  | 	PUSH32 | 
					
						
							|  |  |  | 	DUP1 | 
					
						
							|  |  |  | 	DUP2 | 
					
						
							|  |  |  | 	DUP3 | 
					
						
							|  |  |  | 	DUP4 | 
					
						
							|  |  |  | 	DUP5 | 
					
						
							|  |  |  | 	DUP6 | 
					
						
							|  |  |  | 	DUP7 | 
					
						
							|  |  |  | 	DUP8 | 
					
						
							|  |  |  | 	DUP9 | 
					
						
							|  |  |  | 	DUP10 | 
					
						
							|  |  |  | 	DUP11 | 
					
						
							|  |  |  | 	DUP12 | 
					
						
							|  |  |  | 	DUP13 | 
					
						
							|  |  |  | 	DUP14 | 
					
						
							|  |  |  | 	DUP15 | 
					
						
							|  |  |  | 	DUP16 | 
					
						
							|  |  |  | 	SWAP1 | 
					
						
							|  |  |  | 	SWAP2 | 
					
						
							|  |  |  | 	SWAP3 | 
					
						
							|  |  |  | 	SWAP4 | 
					
						
							|  |  |  | 	SWAP5 | 
					
						
							|  |  |  | 	SWAP6 | 
					
						
							|  |  |  | 	SWAP7 | 
					
						
							|  |  |  | 	SWAP8 | 
					
						
							|  |  |  | 	SWAP9 | 
					
						
							|  |  |  | 	SWAP10 | 
					
						
							|  |  |  | 	SWAP11 | 
					
						
							|  |  |  | 	SWAP12 | 
					
						
							|  |  |  | 	SWAP13 | 
					
						
							|  |  |  | 	SWAP14 | 
					
						
							|  |  |  | 	SWAP15 | 
					
						
							|  |  |  | 	SWAP16 | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-10-27 11:44:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	LOG0 OpCode = 0xa0 + iota | 
					
						
							|  |  |  | 	LOG1 | 
					
						
							|  |  |  | 	LOG2 | 
					
						
							|  |  |  | 	LOG3 | 
					
						
							|  |  |  | 	LOG4 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 13:33:46 +02:00
										 |  |  | // unofficial opcodes used for parsing | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	PUSH OpCode = 0xb0 + iota | 
					
						
							|  |  |  | 	DUP | 
					
						
							|  |  |  | 	SWAP | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0xf0 range - closures | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	CREATE OpCode = 0xf0 + iota | 
					
						
							|  |  |  | 	CALL | 
					
						
							|  |  |  | 	CALLCODE | 
					
						
							| 
									
										
										
										
											2014-12-02 17:22:33 +01:00
										 |  |  | 	RETURN | 
					
						
							| 
									
										
										
										
											2015-11-27 15:40:29 +01:00
										 |  |  | 	DELEGATECALL | 
					
						
							| 
									
										
										
										
											2017-08-15 11:23:23 +03:00
										 |  |  | 	STATICCALL = 0xfa | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 15:32:59 +03:00
										 |  |  | 	REVERT       = 0xfd | 
					
						
							| 
									
										
										
										
											2017-02-08 13:39:26 +01:00
										 |  |  | 	SELFDESTRUCT = 0xff | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Since the opcodes aren't all in order we can't use a regular slice | 
					
						
							|  |  |  | var opCodeToString = map[OpCode]string{ | 
					
						
							|  |  |  | 	// 0x0 range - arithmetic ops | 
					
						
							| 
									
										
										
										
											2014-11-04 18:18:57 +01:00
										 |  |  | 	STOP:       "STOP", | 
					
						
							|  |  |  | 	ADD:        "ADD", | 
					
						
							|  |  |  | 	MUL:        "MUL", | 
					
						
							|  |  |  | 	SUB:        "SUB", | 
					
						
							|  |  |  | 	DIV:        "DIV", | 
					
						
							|  |  |  | 	SDIV:       "SDIV", | 
					
						
							|  |  |  | 	MOD:        "MOD", | 
					
						
							|  |  |  | 	SMOD:       "SMOD", | 
					
						
							|  |  |  | 	EXP:        "EXP", | 
					
						
							|  |  |  | 	NOT:        "NOT", | 
					
						
							|  |  |  | 	LT:         "LT", | 
					
						
							|  |  |  | 	GT:         "GT", | 
					
						
							|  |  |  | 	SLT:        "SLT", | 
					
						
							|  |  |  | 	SGT:        "SGT", | 
					
						
							|  |  |  | 	EQ:         "EQ", | 
					
						
							|  |  |  | 	ISZERO:     "ISZERO", | 
					
						
							|  |  |  | 	SIGNEXTEND: "SIGNEXTEND", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x10 range - bit ops | 
					
						
							| 
									
										
										
										
											2014-08-21 19:23:54 +02:00
										 |  |  | 	AND:    "AND", | 
					
						
							|  |  |  | 	OR:     "OR", | 
					
						
							|  |  |  | 	XOR:    "XOR", | 
					
						
							|  |  |  | 	BYTE:   "BYTE", | 
					
						
							| 
									
										
										
										
											2018-02-23 11:32:57 +01:00
										 |  |  | 	SHL:    "SHL", | 
					
						
							|  |  |  | 	SHR:    "SHR", | 
					
						
							|  |  |  | 	SAR:    "SAR", | 
					
						
							| 
									
										
										
										
											2014-08-21 19:23:54 +02:00
										 |  |  | 	ADDMOD: "ADDMOD", | 
					
						
							|  |  |  | 	MULMOD: "MULMOD", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x20 range - crypto | 
					
						
							|  |  |  | 	SHA3: "SHA3", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 0x30 range - closure state | 
					
						
							| 
									
										
										
										
											2017-08-16 13:07:33 +03:00
										 |  |  | 	ADDRESS:        "ADDRESS", | 
					
						
							|  |  |  | 	BALANCE:        "BALANCE", | 
					
						
							|  |  |  | 	ORIGIN:         "ORIGIN", | 
					
						
							|  |  |  | 	CALLER:         "CALLER", | 
					
						
							|  |  |  | 	CALLVALUE:      "CALLVALUE", | 
					
						
							|  |  |  | 	CALLDATALOAD:   "CALLDATALOAD", | 
					
						
							|  |  |  | 	CALLDATASIZE:   "CALLDATASIZE", | 
					
						
							|  |  |  | 	CALLDATACOPY:   "CALLDATACOPY", | 
					
						
							|  |  |  | 	CODESIZE:       "CODESIZE", | 
					
						
							|  |  |  | 	CODECOPY:       "CODECOPY", | 
					
						
							|  |  |  | 	GASPRICE:       "GASPRICE", | 
					
						
							|  |  |  | 	EXTCODESIZE:    "EXTCODESIZE", | 
					
						
							|  |  |  | 	EXTCODECOPY:    "EXTCODECOPY", | 
					
						
							|  |  |  | 	RETURNDATASIZE: "RETURNDATASIZE", | 
					
						
							|  |  |  | 	RETURNDATACOPY: "RETURNDATACOPY", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x40 range - block operations | 
					
						
							| 
									
										
										
										
											2017-08-16 13:07:33 +03:00
										 |  |  | 	BLOCKHASH:  "BLOCKHASH", | 
					
						
							|  |  |  | 	COINBASE:   "COINBASE", | 
					
						
							|  |  |  | 	TIMESTAMP:  "TIMESTAMP", | 
					
						
							|  |  |  | 	NUMBER:     "NUMBER", | 
					
						
							|  |  |  | 	DIFFICULTY: "DIFFICULTY", | 
					
						
							|  |  |  | 	GASLIMIT:   "GASLIMIT", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x50 range - 'storage' and execution | 
					
						
							| 
									
										
										
										
											2014-08-21 20:25:02 +02:00
										 |  |  | 	POP: "POP", | 
					
						
							|  |  |  | 	//DUP:     "DUP", | 
					
						
							|  |  |  | 	//SWAP:    "SWAP", | 
					
						
							| 
									
										
										
										
											2014-10-08 12:01:14 +02:00
										 |  |  | 	MLOAD:    "MLOAD", | 
					
						
							|  |  |  | 	MSTORE:   "MSTORE", | 
					
						
							|  |  |  | 	MSTORE8:  "MSTORE8", | 
					
						
							|  |  |  | 	SLOAD:    "SLOAD", | 
					
						
							|  |  |  | 	SSTORE:   "SSTORE", | 
					
						
							|  |  |  | 	JUMP:     "JUMP", | 
					
						
							|  |  |  | 	JUMPI:    "JUMPI", | 
					
						
							|  |  |  | 	PC:       "PC", | 
					
						
							|  |  |  | 	MSIZE:    "MSIZE", | 
					
						
							|  |  |  | 	GAS:      "GAS", | 
					
						
							|  |  |  | 	JUMPDEST: "JUMPDEST", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x60 range - push | 
					
						
							|  |  |  | 	PUSH1:  "PUSH1", | 
					
						
							|  |  |  | 	PUSH2:  "PUSH2", | 
					
						
							|  |  |  | 	PUSH3:  "PUSH3", | 
					
						
							|  |  |  | 	PUSH4:  "PUSH4", | 
					
						
							|  |  |  | 	PUSH5:  "PUSH5", | 
					
						
							|  |  |  | 	PUSH6:  "PUSH6", | 
					
						
							|  |  |  | 	PUSH7:  "PUSH7", | 
					
						
							|  |  |  | 	PUSH8:  "PUSH8", | 
					
						
							|  |  |  | 	PUSH9:  "PUSH9", | 
					
						
							|  |  |  | 	PUSH10: "PUSH10", | 
					
						
							|  |  |  | 	PUSH11: "PUSH11", | 
					
						
							|  |  |  | 	PUSH12: "PUSH12", | 
					
						
							|  |  |  | 	PUSH13: "PUSH13", | 
					
						
							|  |  |  | 	PUSH14: "PUSH14", | 
					
						
							|  |  |  | 	PUSH15: "PUSH15", | 
					
						
							|  |  |  | 	PUSH16: "PUSH16", | 
					
						
							|  |  |  | 	PUSH17: "PUSH17", | 
					
						
							|  |  |  | 	PUSH18: "PUSH18", | 
					
						
							|  |  |  | 	PUSH19: "PUSH19", | 
					
						
							|  |  |  | 	PUSH20: "PUSH20", | 
					
						
							|  |  |  | 	PUSH21: "PUSH21", | 
					
						
							|  |  |  | 	PUSH22: "PUSH22", | 
					
						
							|  |  |  | 	PUSH23: "PUSH23", | 
					
						
							|  |  |  | 	PUSH24: "PUSH24", | 
					
						
							|  |  |  | 	PUSH25: "PUSH25", | 
					
						
							|  |  |  | 	PUSH26: "PUSH26", | 
					
						
							|  |  |  | 	PUSH27: "PUSH27", | 
					
						
							|  |  |  | 	PUSH28: "PUSH28", | 
					
						
							|  |  |  | 	PUSH29: "PUSH29", | 
					
						
							|  |  |  | 	PUSH30: "PUSH30", | 
					
						
							|  |  |  | 	PUSH31: "PUSH31", | 
					
						
							|  |  |  | 	PUSH32: "PUSH32", | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-21 19:23:54 +02:00
										 |  |  | 	DUP1:  "DUP1", | 
					
						
							|  |  |  | 	DUP2:  "DUP2", | 
					
						
							|  |  |  | 	DUP3:  "DUP3", | 
					
						
							|  |  |  | 	DUP4:  "DUP4", | 
					
						
							|  |  |  | 	DUP5:  "DUP5", | 
					
						
							|  |  |  | 	DUP6:  "DUP6", | 
					
						
							|  |  |  | 	DUP7:  "DUP7", | 
					
						
							|  |  |  | 	DUP8:  "DUP8", | 
					
						
							|  |  |  | 	DUP9:  "DUP9", | 
					
						
							|  |  |  | 	DUP10: "DUP10", | 
					
						
							|  |  |  | 	DUP11: "DUP11", | 
					
						
							|  |  |  | 	DUP12: "DUP12", | 
					
						
							|  |  |  | 	DUP13: "DUP13", | 
					
						
							|  |  |  | 	DUP14: "DUP14", | 
					
						
							|  |  |  | 	DUP15: "DUP15", | 
					
						
							|  |  |  | 	DUP16: "DUP16", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SWAP1:  "SWAP1", | 
					
						
							|  |  |  | 	SWAP2:  "SWAP2", | 
					
						
							|  |  |  | 	SWAP3:  "SWAP3", | 
					
						
							|  |  |  | 	SWAP4:  "SWAP4", | 
					
						
							|  |  |  | 	SWAP5:  "SWAP5", | 
					
						
							|  |  |  | 	SWAP6:  "SWAP6", | 
					
						
							|  |  |  | 	SWAP7:  "SWAP7", | 
					
						
							|  |  |  | 	SWAP8:  "SWAP8", | 
					
						
							|  |  |  | 	SWAP9:  "SWAP9", | 
					
						
							|  |  |  | 	SWAP10: "SWAP10", | 
					
						
							|  |  |  | 	SWAP11: "SWAP11", | 
					
						
							|  |  |  | 	SWAP12: "SWAP12", | 
					
						
							|  |  |  | 	SWAP13: "SWAP13", | 
					
						
							|  |  |  | 	SWAP14: "SWAP14", | 
					
						
							|  |  |  | 	SWAP15: "SWAP15", | 
					
						
							|  |  |  | 	SWAP16: "SWAP16", | 
					
						
							| 
									
										
										
										
											2014-12-03 12:21:12 +01:00
										 |  |  | 	LOG0:   "LOG0", | 
					
						
							|  |  |  | 	LOG1:   "LOG1", | 
					
						
							|  |  |  | 	LOG2:   "LOG2", | 
					
						
							|  |  |  | 	LOG3:   "LOG3", | 
					
						
							|  |  |  | 	LOG4:   "LOG4", | 
					
						
							| 
									
										
										
										
											2014-08-21 19:23:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0xf0 range | 
					
						
							| 
									
										
										
										
											2015-11-27 15:40:29 +01:00
										 |  |  | 	CREATE:       "CREATE", | 
					
						
							|  |  |  | 	CALL:         "CALL", | 
					
						
							|  |  |  | 	RETURN:       "RETURN", | 
					
						
							|  |  |  | 	CALLCODE:     "CALLCODE", | 
					
						
							|  |  |  | 	DELEGATECALL: "DELEGATECALL", | 
					
						
							| 
									
										
										
										
											2017-08-15 11:23:23 +03:00
										 |  |  | 	STATICCALL:   "STATICCALL", | 
					
						
							| 
									
										
										
										
											2017-08-16 15:32:59 +03:00
										 |  |  | 	REVERT:       "REVERT", | 
					
						
							| 
									
										
										
										
											2017-02-08 13:39:26 +01:00
										 |  |  | 	SELFDESTRUCT: "SELFDESTRUCT", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 13:33:46 +02:00
										 |  |  | 	PUSH: "PUSH", | 
					
						
							|  |  |  | 	DUP:  "DUP", | 
					
						
							|  |  |  | 	SWAP: "SWAP", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-02 01:27:59 -07:00
										 |  |  | func (op OpCode) String() string { | 
					
						
							|  |  |  | 	str := opCodeToString[op] | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	if len(str) == 0 { | 
					
						
							| 
									
										
										
										
											2018-05-02 01:27:59 -07:00
										 |  |  | 		return fmt.Sprintf("Missing opcode 0x%x", int(op)) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return str | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-07-09 13:30:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | var stringToOp = map[string]OpCode{ | 
					
						
							| 
									
										
										
										
											2017-08-16 13:07:33 +03:00
										 |  |  | 	"STOP":           STOP, | 
					
						
							|  |  |  | 	"ADD":            ADD, | 
					
						
							|  |  |  | 	"MUL":            MUL, | 
					
						
							|  |  |  | 	"SUB":            SUB, | 
					
						
							|  |  |  | 	"DIV":            DIV, | 
					
						
							|  |  |  | 	"SDIV":           SDIV, | 
					
						
							|  |  |  | 	"MOD":            MOD, | 
					
						
							|  |  |  | 	"SMOD":           SMOD, | 
					
						
							|  |  |  | 	"EXP":            EXP, | 
					
						
							|  |  |  | 	"NOT":            NOT, | 
					
						
							|  |  |  | 	"LT":             LT, | 
					
						
							|  |  |  | 	"GT":             GT, | 
					
						
							|  |  |  | 	"SLT":            SLT, | 
					
						
							|  |  |  | 	"SGT":            SGT, | 
					
						
							|  |  |  | 	"EQ":             EQ, | 
					
						
							|  |  |  | 	"ISZERO":         ISZERO, | 
					
						
							|  |  |  | 	"SIGNEXTEND":     SIGNEXTEND, | 
					
						
							|  |  |  | 	"AND":            AND, | 
					
						
							|  |  |  | 	"OR":             OR, | 
					
						
							|  |  |  | 	"XOR":            XOR, | 
					
						
							|  |  |  | 	"BYTE":           BYTE, | 
					
						
							| 
									
										
										
										
											2018-02-23 11:32:57 +01:00
										 |  |  | 	"SHL":            SHL, | 
					
						
							|  |  |  | 	"SHR":            SHR, | 
					
						
							|  |  |  | 	"SAR":            SAR, | 
					
						
							| 
									
										
										
										
											2017-08-16 13:07:33 +03:00
										 |  |  | 	"ADDMOD":         ADDMOD, | 
					
						
							|  |  |  | 	"MULMOD":         MULMOD, | 
					
						
							|  |  |  | 	"SHA3":           SHA3, | 
					
						
							|  |  |  | 	"ADDRESS":        ADDRESS, | 
					
						
							|  |  |  | 	"BALANCE":        BALANCE, | 
					
						
							|  |  |  | 	"ORIGIN":         ORIGIN, | 
					
						
							|  |  |  | 	"CALLER":         CALLER, | 
					
						
							|  |  |  | 	"CALLVALUE":      CALLVALUE, | 
					
						
							|  |  |  | 	"CALLDATALOAD":   CALLDATALOAD, | 
					
						
							|  |  |  | 	"CALLDATASIZE":   CALLDATASIZE, | 
					
						
							|  |  |  | 	"CALLDATACOPY":   CALLDATACOPY, | 
					
						
							|  |  |  | 	"DELEGATECALL":   DELEGATECALL, | 
					
						
							|  |  |  | 	"STATICCALL":     STATICCALL, | 
					
						
							|  |  |  | 	"CODESIZE":       CODESIZE, | 
					
						
							|  |  |  | 	"CODECOPY":       CODECOPY, | 
					
						
							|  |  |  | 	"GASPRICE":       GASPRICE, | 
					
						
							|  |  |  | 	"EXTCODESIZE":    EXTCODESIZE, | 
					
						
							|  |  |  | 	"EXTCODECOPY":    EXTCODECOPY, | 
					
						
							|  |  |  | 	"RETURNDATASIZE": RETURNDATASIZE, | 
					
						
							|  |  |  | 	"RETURNDATACOPY": RETURNDATACOPY, | 
					
						
							|  |  |  | 	"BLOCKHASH":      BLOCKHASH, | 
					
						
							|  |  |  | 	"COINBASE":       COINBASE, | 
					
						
							|  |  |  | 	"TIMESTAMP":      TIMESTAMP, | 
					
						
							|  |  |  | 	"NUMBER":         NUMBER, | 
					
						
							|  |  |  | 	"DIFFICULTY":     DIFFICULTY, | 
					
						
							|  |  |  | 	"GASLIMIT":       GASLIMIT, | 
					
						
							|  |  |  | 	"POP":            POP, | 
					
						
							|  |  |  | 	"MLOAD":          MLOAD, | 
					
						
							|  |  |  | 	"MSTORE":         MSTORE, | 
					
						
							|  |  |  | 	"MSTORE8":        MSTORE8, | 
					
						
							|  |  |  | 	"SLOAD":          SLOAD, | 
					
						
							|  |  |  | 	"SSTORE":         SSTORE, | 
					
						
							|  |  |  | 	"JUMP":           JUMP, | 
					
						
							|  |  |  | 	"JUMPI":          JUMPI, | 
					
						
							|  |  |  | 	"PC":             PC, | 
					
						
							|  |  |  | 	"MSIZE":          MSIZE, | 
					
						
							|  |  |  | 	"GAS":            GAS, | 
					
						
							|  |  |  | 	"JUMPDEST":       JUMPDEST, | 
					
						
							|  |  |  | 	"PUSH1":          PUSH1, | 
					
						
							|  |  |  | 	"PUSH2":          PUSH2, | 
					
						
							|  |  |  | 	"PUSH3":          PUSH3, | 
					
						
							|  |  |  | 	"PUSH4":          PUSH4, | 
					
						
							|  |  |  | 	"PUSH5":          PUSH5, | 
					
						
							|  |  |  | 	"PUSH6":          PUSH6, | 
					
						
							|  |  |  | 	"PUSH7":          PUSH7, | 
					
						
							|  |  |  | 	"PUSH8":          PUSH8, | 
					
						
							|  |  |  | 	"PUSH9":          PUSH9, | 
					
						
							|  |  |  | 	"PUSH10":         PUSH10, | 
					
						
							|  |  |  | 	"PUSH11":         PUSH11, | 
					
						
							|  |  |  | 	"PUSH12":         PUSH12, | 
					
						
							|  |  |  | 	"PUSH13":         PUSH13, | 
					
						
							|  |  |  | 	"PUSH14":         PUSH14, | 
					
						
							|  |  |  | 	"PUSH15":         PUSH15, | 
					
						
							|  |  |  | 	"PUSH16":         PUSH16, | 
					
						
							|  |  |  | 	"PUSH17":         PUSH17, | 
					
						
							|  |  |  | 	"PUSH18":         PUSH18, | 
					
						
							|  |  |  | 	"PUSH19":         PUSH19, | 
					
						
							|  |  |  | 	"PUSH20":         PUSH20, | 
					
						
							|  |  |  | 	"PUSH21":         PUSH21, | 
					
						
							|  |  |  | 	"PUSH22":         PUSH22, | 
					
						
							|  |  |  | 	"PUSH23":         PUSH23, | 
					
						
							|  |  |  | 	"PUSH24":         PUSH24, | 
					
						
							|  |  |  | 	"PUSH25":         PUSH25, | 
					
						
							|  |  |  | 	"PUSH26":         PUSH26, | 
					
						
							|  |  |  | 	"PUSH27":         PUSH27, | 
					
						
							|  |  |  | 	"PUSH28":         PUSH28, | 
					
						
							|  |  |  | 	"PUSH29":         PUSH29, | 
					
						
							|  |  |  | 	"PUSH30":         PUSH30, | 
					
						
							|  |  |  | 	"PUSH31":         PUSH31, | 
					
						
							|  |  |  | 	"PUSH32":         PUSH32, | 
					
						
							|  |  |  | 	"DUP1":           DUP1, | 
					
						
							|  |  |  | 	"DUP2":           DUP2, | 
					
						
							|  |  |  | 	"DUP3":           DUP3, | 
					
						
							|  |  |  | 	"DUP4":           DUP4, | 
					
						
							|  |  |  | 	"DUP5":           DUP5, | 
					
						
							|  |  |  | 	"DUP6":           DUP6, | 
					
						
							|  |  |  | 	"DUP7":           DUP7, | 
					
						
							|  |  |  | 	"DUP8":           DUP8, | 
					
						
							|  |  |  | 	"DUP9":           DUP9, | 
					
						
							|  |  |  | 	"DUP10":          DUP10, | 
					
						
							|  |  |  | 	"DUP11":          DUP11, | 
					
						
							|  |  |  | 	"DUP12":          DUP12, | 
					
						
							|  |  |  | 	"DUP13":          DUP13, | 
					
						
							|  |  |  | 	"DUP14":          DUP14, | 
					
						
							|  |  |  | 	"DUP15":          DUP15, | 
					
						
							|  |  |  | 	"DUP16":          DUP16, | 
					
						
							|  |  |  | 	"SWAP1":          SWAP1, | 
					
						
							|  |  |  | 	"SWAP2":          SWAP2, | 
					
						
							|  |  |  | 	"SWAP3":          SWAP3, | 
					
						
							|  |  |  | 	"SWAP4":          SWAP4, | 
					
						
							|  |  |  | 	"SWAP5":          SWAP5, | 
					
						
							|  |  |  | 	"SWAP6":          SWAP6, | 
					
						
							|  |  |  | 	"SWAP7":          SWAP7, | 
					
						
							|  |  |  | 	"SWAP8":          SWAP8, | 
					
						
							|  |  |  | 	"SWAP9":          SWAP9, | 
					
						
							|  |  |  | 	"SWAP10":         SWAP10, | 
					
						
							|  |  |  | 	"SWAP11":         SWAP11, | 
					
						
							|  |  |  | 	"SWAP12":         SWAP12, | 
					
						
							|  |  |  | 	"SWAP13":         SWAP13, | 
					
						
							|  |  |  | 	"SWAP14":         SWAP14, | 
					
						
							|  |  |  | 	"SWAP15":         SWAP15, | 
					
						
							|  |  |  | 	"SWAP16":         SWAP16, | 
					
						
							|  |  |  | 	"LOG0":           LOG0, | 
					
						
							|  |  |  | 	"LOG1":           LOG1, | 
					
						
							|  |  |  | 	"LOG2":           LOG2, | 
					
						
							|  |  |  | 	"LOG3":           LOG3, | 
					
						
							|  |  |  | 	"LOG4":           LOG4, | 
					
						
							|  |  |  | 	"CREATE":         CREATE, | 
					
						
							|  |  |  | 	"CALL":           CALL, | 
					
						
							|  |  |  | 	"RETURN":         RETURN, | 
					
						
							|  |  |  | 	"CALLCODE":       CALLCODE, | 
					
						
							| 
									
										
										
										
											2017-08-16 15:32:59 +03:00
										 |  |  | 	"REVERT":         REVERT, | 
					
						
							| 
									
										
										
										
											2017-08-16 13:07:33 +03:00
										 |  |  | 	"SELFDESTRUCT":   SELFDESTRUCT, | 
					
						
							| 
									
										
										
										
											2015-07-09 13:30:04 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func StringToOp(str string) OpCode { | 
					
						
							|  |  |  | 	return stringToOp[str] | 
					
						
							|  |  |  | } |