github.com/ethereum/go-ethereum@v1.16.1/core/vm/opcodes.go (about)

     1  // Copyright 2014 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package vm
    18  
    19  import (
    20  	"fmt"
    21  )
    22  
    23  // OpCode is an EVM opcode
    24  type OpCode byte
    25  
    26  // IsPush specifies if an opcode is a PUSH opcode.
    27  // @deprecated: this method is often used in order to know if there are immediates.
    28  // Please use `vm.Immediates` instead.
    29  func (op OpCode) IsPush() bool {
    30  	return PUSH0 <= op && op <= PUSH32
    31  }
    32  
    33  // 0x0 range - arithmetic ops.
    34  const (
    35  	STOP       OpCode = 0x0
    36  	ADD        OpCode = 0x1
    37  	MUL        OpCode = 0x2
    38  	SUB        OpCode = 0x3
    39  	DIV        OpCode = 0x4
    40  	SDIV       OpCode = 0x5
    41  	MOD        OpCode = 0x6
    42  	SMOD       OpCode = 0x7
    43  	ADDMOD     OpCode = 0x8
    44  	MULMOD     OpCode = 0x9
    45  	EXP        OpCode = 0xa
    46  	SIGNEXTEND OpCode = 0xb
    47  )
    48  
    49  // 0x10 range - comparison ops.
    50  const (
    51  	LT     OpCode = 0x10
    52  	GT     OpCode = 0x11
    53  	SLT    OpCode = 0x12
    54  	SGT    OpCode = 0x13
    55  	EQ     OpCode = 0x14
    56  	ISZERO OpCode = 0x15
    57  	AND    OpCode = 0x16
    58  	OR     OpCode = 0x17
    59  	XOR    OpCode = 0x18
    60  	NOT    OpCode = 0x19
    61  	BYTE   OpCode = 0x1a
    62  	SHL    OpCode = 0x1b
    63  	SHR    OpCode = 0x1c
    64  	SAR    OpCode = 0x1d
    65  )
    66  
    67  // 0x20 range - crypto.
    68  const (
    69  	KECCAK256 OpCode = 0x20
    70  )
    71  
    72  // 0x30 range - closure state.
    73  const (
    74  	ADDRESS        OpCode = 0x30
    75  	BALANCE        OpCode = 0x31
    76  	ORIGIN         OpCode = 0x32
    77  	CALLER         OpCode = 0x33
    78  	CALLVALUE      OpCode = 0x34
    79  	CALLDATALOAD   OpCode = 0x35
    80  	CALLDATASIZE   OpCode = 0x36
    81  	CALLDATACOPY   OpCode = 0x37
    82  	CODESIZE       OpCode = 0x38
    83  	CODECOPY       OpCode = 0x39
    84  	GASPRICE       OpCode = 0x3a
    85  	EXTCODESIZE    OpCode = 0x3b
    86  	EXTCODECOPY    OpCode = 0x3c
    87  	RETURNDATASIZE OpCode = 0x3d
    88  	RETURNDATACOPY OpCode = 0x3e
    89  	EXTCODEHASH    OpCode = 0x3f
    90  )
    91  
    92  // 0x40 range - block operations.
    93  const (
    94  	BLOCKHASH   OpCode = 0x40
    95  	COINBASE    OpCode = 0x41
    96  	TIMESTAMP   OpCode = 0x42
    97  	NUMBER      OpCode = 0x43
    98  	DIFFICULTY  OpCode = 0x44
    99  	RANDOM      OpCode = 0x44 // Same as DIFFICULTY
   100  	PREVRANDAO  OpCode = 0x44 // Same as DIFFICULTY
   101  	GASLIMIT    OpCode = 0x45
   102  	CHAINID     OpCode = 0x46
   103  	SELFBALANCE OpCode = 0x47
   104  	BASEFEE     OpCode = 0x48
   105  	BLOBHASH    OpCode = 0x49
   106  	BLOBBASEFEE OpCode = 0x4a
   107  )
   108  
   109  // 0x50 range - 'storage' and execution.
   110  const (
   111  	POP      OpCode = 0x50
   112  	MLOAD    OpCode = 0x51
   113  	MSTORE   OpCode = 0x52
   114  	MSTORE8  OpCode = 0x53
   115  	SLOAD    OpCode = 0x54
   116  	SSTORE   OpCode = 0x55
   117  	JUMP     OpCode = 0x56
   118  	JUMPI    OpCode = 0x57
   119  	PC       OpCode = 0x58
   120  	MSIZE    OpCode = 0x59
   121  	GAS      OpCode = 0x5a
   122  	JUMPDEST OpCode = 0x5b
   123  	TLOAD    OpCode = 0x5c
   124  	TSTORE   OpCode = 0x5d
   125  	MCOPY    OpCode = 0x5e
   126  	PUSH0    OpCode = 0x5f
   127  )
   128  
   129  // 0x60 range - pushes.
   130  const (
   131  	PUSH1 OpCode = 0x60 + iota
   132  	PUSH2
   133  	PUSH3
   134  	PUSH4
   135  	PUSH5
   136  	PUSH6
   137  	PUSH7
   138  	PUSH8
   139  	PUSH9
   140  	PUSH10
   141  	PUSH11
   142  	PUSH12
   143  	PUSH13
   144  	PUSH14
   145  	PUSH15
   146  	PUSH16
   147  	PUSH17
   148  	PUSH18
   149  	PUSH19
   150  	PUSH20
   151  	PUSH21
   152  	PUSH22
   153  	PUSH23
   154  	PUSH24
   155  	PUSH25
   156  	PUSH26
   157  	PUSH27
   158  	PUSH28
   159  	PUSH29
   160  	PUSH30
   161  	PUSH31
   162  	PUSH32
   163  )
   164  
   165  // 0x80 range - dups.
   166  const (
   167  	DUP1 OpCode = 0x80 + iota
   168  	DUP2
   169  	DUP3
   170  	DUP4
   171  	DUP5
   172  	DUP6
   173  	DUP7
   174  	DUP8
   175  	DUP9
   176  	DUP10
   177  	DUP11
   178  	DUP12
   179  	DUP13
   180  	DUP14
   181  	DUP15
   182  	DUP16
   183  )
   184  
   185  // 0x90 range - swaps.
   186  const (
   187  	SWAP1 OpCode = 0x90 + iota
   188  	SWAP2
   189  	SWAP3
   190  	SWAP4
   191  	SWAP5
   192  	SWAP6
   193  	SWAP7
   194  	SWAP8
   195  	SWAP9
   196  	SWAP10
   197  	SWAP11
   198  	SWAP12
   199  	SWAP13
   200  	SWAP14
   201  	SWAP15
   202  	SWAP16
   203  )
   204  
   205  // 0xa0 range - logging ops.
   206  const (
   207  	LOG0 OpCode = 0xa0 + iota
   208  	LOG1
   209  	LOG2
   210  	LOG3
   211  	LOG4
   212  )
   213  
   214  // 0xd0 range - eof operations.
   215  const (
   216  	DATALOAD  OpCode = 0xd0
   217  	DATALOADN OpCode = 0xd1
   218  	DATASIZE  OpCode = 0xd2
   219  	DATACOPY  OpCode = 0xd3
   220  )
   221  
   222  // 0xe0 range - eof operations.
   223  const (
   224  	RJUMP          OpCode = 0xe0
   225  	RJUMPI         OpCode = 0xe1
   226  	RJUMPV         OpCode = 0xe2
   227  	CALLF          OpCode = 0xe3
   228  	RETF           OpCode = 0xe4
   229  	JUMPF          OpCode = 0xe5
   230  	DUPN           OpCode = 0xe6
   231  	SWAPN          OpCode = 0xe7
   232  	EXCHANGE       OpCode = 0xe8
   233  	EOFCREATE      OpCode = 0xec
   234  	RETURNCONTRACT OpCode = 0xee
   235  )
   236  
   237  // 0xf0 range - closures.
   238  const (
   239  	CREATE       OpCode = 0xf0
   240  	CALL         OpCode = 0xf1
   241  	CALLCODE     OpCode = 0xf2
   242  	RETURN       OpCode = 0xf3
   243  	DELEGATECALL OpCode = 0xf4
   244  	CREATE2      OpCode = 0xf5
   245  
   246  	RETURNDATALOAD  OpCode = 0xf7
   247  	EXTCALL         OpCode = 0xf8
   248  	EXTDELEGATECALL OpCode = 0xf9
   249  
   250  	STATICCALL    OpCode = 0xfa
   251  	EXTSTATICCALL OpCode = 0xfb
   252  	REVERT        OpCode = 0xfd
   253  	INVALID       OpCode = 0xfe
   254  	SELFDESTRUCT  OpCode = 0xff
   255  )
   256  
   257  var opCodeToString = [256]string{
   258  	// 0x0 range - arithmetic ops.
   259  	STOP:       "STOP",
   260  	ADD:        "ADD",
   261  	MUL:        "MUL",
   262  	SUB:        "SUB",
   263  	DIV:        "DIV",
   264  	SDIV:       "SDIV",
   265  	MOD:        "MOD",
   266  	SMOD:       "SMOD",
   267  	EXP:        "EXP",
   268  	NOT:        "NOT",
   269  	LT:         "LT",
   270  	GT:         "GT",
   271  	SLT:        "SLT",
   272  	SGT:        "SGT",
   273  	EQ:         "EQ",
   274  	ISZERO:     "ISZERO",
   275  	SIGNEXTEND: "SIGNEXTEND",
   276  
   277  	// 0x10 range - bit ops.
   278  	AND:    "AND",
   279  	OR:     "OR",
   280  	XOR:    "XOR",
   281  	BYTE:   "BYTE",
   282  	SHL:    "SHL",
   283  	SHR:    "SHR",
   284  	SAR:    "SAR",
   285  	ADDMOD: "ADDMOD",
   286  	MULMOD: "MULMOD",
   287  
   288  	// 0x20 range - crypto.
   289  	KECCAK256: "KECCAK256",
   290  
   291  	// 0x30 range - closure state.
   292  	ADDRESS:        "ADDRESS",
   293  	BALANCE:        "BALANCE",
   294  	ORIGIN:         "ORIGIN",
   295  	CALLER:         "CALLER",
   296  	CALLVALUE:      "CALLVALUE",
   297  	CALLDATALOAD:   "CALLDATALOAD",
   298  	CALLDATASIZE:   "CALLDATASIZE",
   299  	CALLDATACOPY:   "CALLDATACOPY",
   300  	CODESIZE:       "CODESIZE",
   301  	CODECOPY:       "CODECOPY",
   302  	GASPRICE:       "GASPRICE",
   303  	EXTCODESIZE:    "EXTCODESIZE",
   304  	EXTCODECOPY:    "EXTCODECOPY",
   305  	RETURNDATASIZE: "RETURNDATASIZE",
   306  	RETURNDATACOPY: "RETURNDATACOPY",
   307  	EXTCODEHASH:    "EXTCODEHASH",
   308  
   309  	// 0x40 range - block operations.
   310  	BLOCKHASH:   "BLOCKHASH",
   311  	COINBASE:    "COINBASE",
   312  	TIMESTAMP:   "TIMESTAMP",
   313  	NUMBER:      "NUMBER",
   314  	DIFFICULTY:  "DIFFICULTY", // TODO (MariusVanDerWijden) rename to PREVRANDAO post merge
   315  	GASLIMIT:    "GASLIMIT",
   316  	CHAINID:     "CHAINID",
   317  	SELFBALANCE: "SELFBALANCE",
   318  	BASEFEE:     "BASEFEE",
   319  	BLOBHASH:    "BLOBHASH",
   320  	BLOBBASEFEE: "BLOBBASEFEE",
   321  
   322  	// 0x50 range - 'storage' and execution.
   323  	POP:      "POP",
   324  	MLOAD:    "MLOAD",
   325  	MSTORE:   "MSTORE",
   326  	MSTORE8:  "MSTORE8",
   327  	SLOAD:    "SLOAD",
   328  	SSTORE:   "SSTORE",
   329  	JUMP:     "JUMP",
   330  	JUMPI:    "JUMPI",
   331  	PC:       "PC",
   332  	MSIZE:    "MSIZE",
   333  	GAS:      "GAS",
   334  	JUMPDEST: "JUMPDEST",
   335  	TLOAD:    "TLOAD",
   336  	TSTORE:   "TSTORE",
   337  	MCOPY:    "MCOPY",
   338  	PUSH0:    "PUSH0",
   339  
   340  	// 0x60 range - pushes.
   341  	PUSH1:  "PUSH1",
   342  	PUSH2:  "PUSH2",
   343  	PUSH3:  "PUSH3",
   344  	PUSH4:  "PUSH4",
   345  	PUSH5:  "PUSH5",
   346  	PUSH6:  "PUSH6",
   347  	PUSH7:  "PUSH7",
   348  	PUSH8:  "PUSH8",
   349  	PUSH9:  "PUSH9",
   350  	PUSH10: "PUSH10",
   351  	PUSH11: "PUSH11",
   352  	PUSH12: "PUSH12",
   353  	PUSH13: "PUSH13",
   354  	PUSH14: "PUSH14",
   355  	PUSH15: "PUSH15",
   356  	PUSH16: "PUSH16",
   357  	PUSH17: "PUSH17",
   358  	PUSH18: "PUSH18",
   359  	PUSH19: "PUSH19",
   360  	PUSH20: "PUSH20",
   361  	PUSH21: "PUSH21",
   362  	PUSH22: "PUSH22",
   363  	PUSH23: "PUSH23",
   364  	PUSH24: "PUSH24",
   365  	PUSH25: "PUSH25",
   366  	PUSH26: "PUSH26",
   367  	PUSH27: "PUSH27",
   368  	PUSH28: "PUSH28",
   369  	PUSH29: "PUSH29",
   370  	PUSH30: "PUSH30",
   371  	PUSH31: "PUSH31",
   372  	PUSH32: "PUSH32",
   373  
   374  	// 0x80 - dups.
   375  	DUP1:  "DUP1",
   376  	DUP2:  "DUP2",
   377  	DUP3:  "DUP3",
   378  	DUP4:  "DUP4",
   379  	DUP5:  "DUP5",
   380  	DUP6:  "DUP6",
   381  	DUP7:  "DUP7",
   382  	DUP8:  "DUP8",
   383  	DUP9:  "DUP9",
   384  	DUP10: "DUP10",
   385  	DUP11: "DUP11",
   386  	DUP12: "DUP12",
   387  	DUP13: "DUP13",
   388  	DUP14: "DUP14",
   389  	DUP15: "DUP15",
   390  	DUP16: "DUP16",
   391  
   392  	// 0x90 - swaps.
   393  	SWAP1:  "SWAP1",
   394  	SWAP2:  "SWAP2",
   395  	SWAP3:  "SWAP3",
   396  	SWAP4:  "SWAP4",
   397  	SWAP5:  "SWAP5",
   398  	SWAP6:  "SWAP6",
   399  	SWAP7:  "SWAP7",
   400  	SWAP8:  "SWAP8",
   401  	SWAP9:  "SWAP9",
   402  	SWAP10: "SWAP10",
   403  	SWAP11: "SWAP11",
   404  	SWAP12: "SWAP12",
   405  	SWAP13: "SWAP13",
   406  	SWAP14: "SWAP14",
   407  	SWAP15: "SWAP15",
   408  	SWAP16: "SWAP16",
   409  
   410  	// 0xa0 range - logging ops.
   411  	LOG0: "LOG0",
   412  	LOG1: "LOG1",
   413  	LOG2: "LOG2",
   414  	LOG3: "LOG3",
   415  	LOG4: "LOG4",
   416  
   417  	// 0xd range - eof ops.
   418  	DATALOAD:  "DATALOAD",
   419  	DATALOADN: "DATALOADN",
   420  	DATASIZE:  "DATASIZE",
   421  	DATACOPY:  "DATACOPY",
   422  
   423  	// 0xe0 range.
   424  	RJUMP:          "RJUMP",
   425  	RJUMPI:         "RJUMPI",
   426  	RJUMPV:         "RJUMPV",
   427  	CALLF:          "CALLF",
   428  	RETF:           "RETF",
   429  	JUMPF:          "JUMPF",
   430  	DUPN:           "DUPN",
   431  	SWAPN:          "SWAPN",
   432  	EXCHANGE:       "EXCHANGE",
   433  	EOFCREATE:      "EOFCREATE",
   434  	RETURNCONTRACT: "RETURNCONTRACT",
   435  
   436  	// 0xf0 range - closures.
   437  	CREATE:       "CREATE",
   438  	CALL:         "CALL",
   439  	RETURN:       "RETURN",
   440  	CALLCODE:     "CALLCODE",
   441  	DELEGATECALL: "DELEGATECALL",
   442  	CREATE2:      "CREATE2",
   443  
   444  	RETURNDATALOAD:  "RETURNDATALOAD",
   445  	EXTCALL:         "EXTCALL",
   446  	EXTDELEGATECALL: "EXTDELEGATECALL",
   447  
   448  	STATICCALL:    "STATICCALL",
   449  	EXTSTATICCALL: "EXTSTATICCALL",
   450  	REVERT:        "REVERT",
   451  	INVALID:       "INVALID",
   452  	SELFDESTRUCT:  "SELFDESTRUCT",
   453  }
   454  
   455  func (op OpCode) String() string {
   456  	if s := opCodeToString[op]; s != "" {
   457  		return s
   458  	}
   459  	return fmt.Sprintf("opcode %#x not defined", int(op))
   460  }
   461  
   462  var stringToOp = map[string]OpCode{
   463  	"STOP":            STOP,
   464  	"ADD":             ADD,
   465  	"MUL":             MUL,
   466  	"SUB":             SUB,
   467  	"DIV":             DIV,
   468  	"SDIV":            SDIV,
   469  	"MOD":             MOD,
   470  	"SMOD":            SMOD,
   471  	"EXP":             EXP,
   472  	"NOT":             NOT,
   473  	"LT":              LT,
   474  	"GT":              GT,
   475  	"SLT":             SLT,
   476  	"SGT":             SGT,
   477  	"EQ":              EQ,
   478  	"ISZERO":          ISZERO,
   479  	"SIGNEXTEND":      SIGNEXTEND,
   480  	"AND":             AND,
   481  	"OR":              OR,
   482  	"XOR":             XOR,
   483  	"BYTE":            BYTE,
   484  	"SHL":             SHL,
   485  	"SHR":             SHR,
   486  	"SAR":             SAR,
   487  	"ADDMOD":          ADDMOD,
   488  	"MULMOD":          MULMOD,
   489  	"KECCAK256":       KECCAK256,
   490  	"ADDRESS":         ADDRESS,
   491  	"BALANCE":         BALANCE,
   492  	"ORIGIN":          ORIGIN,
   493  	"CALLER":          CALLER,
   494  	"CALLVALUE":       CALLVALUE,
   495  	"CALLDATALOAD":    CALLDATALOAD,
   496  	"CALLDATASIZE":    CALLDATASIZE,
   497  	"CALLDATACOPY":    CALLDATACOPY,
   498  	"CHAINID":         CHAINID,
   499  	"BASEFEE":         BASEFEE,
   500  	"BLOBHASH":        BLOBHASH,
   501  	"BLOBBASEFEE":     BLOBBASEFEE,
   502  	"DELEGATECALL":    DELEGATECALL,
   503  	"STATICCALL":      STATICCALL,
   504  	"CODESIZE":        CODESIZE,
   505  	"CODECOPY":        CODECOPY,
   506  	"GASPRICE":        GASPRICE,
   507  	"EXTCODESIZE":     EXTCODESIZE,
   508  	"EXTCODECOPY":     EXTCODECOPY,
   509  	"RETURNDATASIZE":  RETURNDATASIZE,
   510  	"RETURNDATACOPY":  RETURNDATACOPY,
   511  	"EXTCODEHASH":     EXTCODEHASH,
   512  	"BLOCKHASH":       BLOCKHASH,
   513  	"COINBASE":        COINBASE,
   514  	"TIMESTAMP":       TIMESTAMP,
   515  	"NUMBER":          NUMBER,
   516  	"DIFFICULTY":      DIFFICULTY,
   517  	"GASLIMIT":        GASLIMIT,
   518  	"SELFBALANCE":     SELFBALANCE,
   519  	"POP":             POP,
   520  	"MLOAD":           MLOAD,
   521  	"MSTORE":          MSTORE,
   522  	"MSTORE8":         MSTORE8,
   523  	"SLOAD":           SLOAD,
   524  	"SSTORE":          SSTORE,
   525  	"JUMP":            JUMP,
   526  	"JUMPI":           JUMPI,
   527  	"PC":              PC,
   528  	"MSIZE":           MSIZE,
   529  	"GAS":             GAS,
   530  	"JUMPDEST":        JUMPDEST,
   531  	"TLOAD":           TLOAD,
   532  	"TSTORE":          TSTORE,
   533  	"MCOPY":           MCOPY,
   534  	"PUSH0":           PUSH0,
   535  	"PUSH1":           PUSH1,
   536  	"PUSH2":           PUSH2,
   537  	"PUSH3":           PUSH3,
   538  	"PUSH4":           PUSH4,
   539  	"PUSH5":           PUSH5,
   540  	"PUSH6":           PUSH6,
   541  	"PUSH7":           PUSH7,
   542  	"PUSH8":           PUSH8,
   543  	"PUSH9":           PUSH9,
   544  	"PUSH10":          PUSH10,
   545  	"PUSH11":          PUSH11,
   546  	"PUSH12":          PUSH12,
   547  	"PUSH13":          PUSH13,
   548  	"PUSH14":          PUSH14,
   549  	"PUSH15":          PUSH15,
   550  	"PUSH16":          PUSH16,
   551  	"PUSH17":          PUSH17,
   552  	"PUSH18":          PUSH18,
   553  	"PUSH19":          PUSH19,
   554  	"PUSH20":          PUSH20,
   555  	"PUSH21":          PUSH21,
   556  	"PUSH22":          PUSH22,
   557  	"PUSH23":          PUSH23,
   558  	"PUSH24":          PUSH24,
   559  	"PUSH25":          PUSH25,
   560  	"PUSH26":          PUSH26,
   561  	"PUSH27":          PUSH27,
   562  	"PUSH28":          PUSH28,
   563  	"PUSH29":          PUSH29,
   564  	"PUSH30":          PUSH30,
   565  	"PUSH31":          PUSH31,
   566  	"PUSH32":          PUSH32,
   567  	"DUP1":            DUP1,
   568  	"DUP2":            DUP2,
   569  	"DUP3":            DUP3,
   570  	"DUP4":            DUP4,
   571  	"DUP5":            DUP5,
   572  	"DUP6":            DUP6,
   573  	"DUP7":            DUP7,
   574  	"DUP8":            DUP8,
   575  	"DUP9":            DUP9,
   576  	"DUP10":           DUP10,
   577  	"DUP11":           DUP11,
   578  	"DUP12":           DUP12,
   579  	"DUP13":           DUP13,
   580  	"DUP14":           DUP14,
   581  	"DUP15":           DUP15,
   582  	"DUP16":           DUP16,
   583  	"SWAP1":           SWAP1,
   584  	"SWAP2":           SWAP2,
   585  	"SWAP3":           SWAP3,
   586  	"SWAP4":           SWAP4,
   587  	"SWAP5":           SWAP5,
   588  	"SWAP6":           SWAP6,
   589  	"SWAP7":           SWAP7,
   590  	"SWAP8":           SWAP8,
   591  	"SWAP9":           SWAP9,
   592  	"SWAP10":          SWAP10,
   593  	"SWAP11":          SWAP11,
   594  	"SWAP12":          SWAP12,
   595  	"SWAP13":          SWAP13,
   596  	"SWAP14":          SWAP14,
   597  	"SWAP15":          SWAP15,
   598  	"SWAP16":          SWAP16,
   599  	"LOG0":            LOG0,
   600  	"LOG1":            LOG1,
   601  	"LOG2":            LOG2,
   602  	"LOG3":            LOG3,
   603  	"LOG4":            LOG4,
   604  	"DATALOAD":        DATALOAD,
   605  	"DATALOADN":       DATALOADN,
   606  	"DATASIZE":        DATASIZE,
   607  	"DATACOPY":        DATACOPY,
   608  	"RJUMP":           RJUMP,
   609  	"RJUMPI":          RJUMPI,
   610  	"RJUMPV":          RJUMPV,
   611  	"CALLF":           CALLF,
   612  	"RETF":            RETF,
   613  	"JUMPF":           JUMPF,
   614  	"DUPN":            DUPN,
   615  	"SWAPN":           SWAPN,
   616  	"EXCHANGE":        EXCHANGE,
   617  	"EOFCREATE":       EOFCREATE,
   618  	"RETURNCONTRACT":  RETURNCONTRACT,
   619  	"CREATE":          CREATE,
   620  	"CREATE2":         CREATE2,
   621  	"RETURNDATALOAD":  RETURNDATALOAD,
   622  	"EXTCALL":         EXTCALL,
   623  	"EXTDELEGATECALL": EXTDELEGATECALL,
   624  	"EXTSTATICCALL":   EXTSTATICCALL,
   625  	"CALL":            CALL,
   626  	"RETURN":          RETURN,
   627  	"CALLCODE":        CALLCODE,
   628  	"REVERT":          REVERT,
   629  	"INVALID":         INVALID,
   630  	"SELFDESTRUCT":    SELFDESTRUCT,
   631  }
   632  
   633  // StringToOp finds the opcode whose name is stored in `str`.
   634  func StringToOp(str string) OpCode {
   635  	return stringToOp[str]
   636  }