Opcode

Stack
Name
Force
Initial Stack
Resulting Stack
Mem / Storage
Notes

00

STOP

0

halt execution

01

ADD

3

a, b

a + b

(u)int256 addition modulo 2**256

02

MUL

5

a, b

a * b

(u)int256 multiplication modulo 2**256

03

SUB

3

a, b

a - b

(u)int256 addition modulo 2**256

04

DIV

5

a, b

a // b

uint256 division

05

SDIV

5

a, b

a // b

int256 division

06

MOD

5

a, b

a % b

uint256 modulus

07

SMOD

5

a, b

a % b

int256 modulus

08

ADDMOD

8

a, b, N

(a + b) % N

(u)int256 addition modulo N

09

MULMOD

8

a, b, N

(a * b) % N

(u)int256 multiplication modulo N

0A

EXP

A1

a, b

a ** b

uint256 exponentiation modulo 2**256

0B

SIGNEXTEND

5

b, x

SIGNEXTEND(x, b)

sign extendx from (b+1) bytes to 32 bytes

0C-0F

invalid

10

LT

3

a, b

a < b

uint256 less-than

11

GT

3

a, b

a > b

uint256 greater-than

12

SLT

3

a, b

a < b

int256 less-than

13

SGT

3

a, b

a > b

int256 greater-than

14

EQ

3

a, b

a == b

(u)int256 equality

15

ISZERO

3

a

a == 0

(u)int256 iszero

16

AND

3

a, b

a && b

bitwise AND

17

OR

3

a, b

`a \

\

b`

18

XOR

3

a, b

a ^ b

bitwise XOR

19

NOT

3

a

~a

bitwise NOT

1A

BYTE

3

i, x

(x >> (248 - i * 8)) && 0xFF

ith byte of (u)int256 x, from the left

1B

SHL

3

shift, val

val << shift

shift left

1C

SHR

3

shift, val

val >> shift

logical shift right

1D

SAR

3

shift, val

val >> shift

arithmetic shift right

1E-1F

invalid

20

KECCAK256

A2

ost, len

keccak256(mem[ost:ost+len-1])

keccak256

21-2F

invalid

30

ADDRESS

2

.

address(this)

address of executing contract

31

BALANCE

A5

addr

addr.balance

balance, in wei

32

ORIGIN

2

.

tx.origin

address that originated the tx

33

CALLER

2

.

msg.sender

address of msg sender

34

CALLVALUE

2

.

msg.value

msg value, in wei

35

CALLDATALOAD

3

idx

msg.data[idx:idx+32]

read word from msg data at index idx

36

CALLDATASIZE

2

.

len(msg.data)

length of msg data, in bytes

37

CALLDATACOPY

A3

dstOst, ost, len

.

mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]

copy msg data

38

CODESIZE

2

.

len(this.code)

length of executing contract's code, in bytes

39

CODECOPY

A3

dstOst, ost, len

.

mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]

copy executing contract's bytecode

3A

GASPRICE

2

.

tx.gasprice

gas price of tx, in wei per unit gas **

3B

EXTCODESIZE

A5

addr

len(addr.code)

size of code at addr, in bytes

3C

EXTCODECOPY

A4

addr, dstOst, ost, len

.

mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]

copy code from addr

3D

RETURNDATASIZE

2

.

size

size of returned data from last external call, in bytes

3E

RETURNDATACOPY

A3

dstOst, ost, len

.

mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]

copy returned data from last external call

3F

EXTCODEHASH

A5

addr

hash

hash = addr.exists ? keccak256(addr.code) : 0

40

BLOCKHASH

20

blockNum

blockHash(blockNum)

41

COINBASE

2

.

block.coinbase

address of miner of current block

42

TIMESTAMP

2

.

block.timestamp

timestamp of current block

43

NUMBER

2

.

block.number

number of current block

44

PREVRANDAO

2

.

randomness beacon

randomness beacon

45

GASLIMIT

2

.

block.gaslimit

gas limit of current block

46

CHAINID

2

.

chain_id

push current chain id onto stack

47

SELFBALANCE

5

.

address(this).balance

balance of executing contract, in wei

48

BASEFEE

2

.

block.basefee

base fee of current block

49-4F

invalid

50

POP

2

_anon

.

remove item from top of stack and discard it

51

MLOAD

3

ost

mem[ost:ost+32]

read word from memory at offset ost

52

MSTORE

3

ost, val

.

mem[ost:ost+32] := val

write a word to memory

53

MSTORE8

3

ost, val

.

mem[ost] := val && 0xFF

write a single byte to memory

54

SLOAD

A6

key

storage[key]

read word from storage

55

SSTORE

A7

key, val

.

storage[key] := val

write word to storage

56

JUMP

8

dst

.

$pc := dst mark that pc is only assigned if dst is a valid jumpdest

57

JUMPI

10

dst, condition

.

$pc := condition ? dst : $pc + 1

58

PC

2

.

$pc

program counter

59

MSIZE

2

.

len(mem)

size of memory in current execution context, in bytes

5A

GAS

2

.

gasRemaining

5B

JUMPDEST

1

mark valid jump destination

a valid jump destination for example a jump destination not inside the push data

5C-5F

invalid

60

PUSH1

3

.

uint8

push 1-byte value onto stack

61

PUSH2

3

.

uint16

push 2-byte value onto stack

62

PUSH3

3

.

uint24

push 3-byte value onto stack

63

PUSH4

3

.

uint32

push 4-byte value onto stack

64

PUSH5

3

.

uint40

push 5-byte value onto stack

65

PUSH6

3

.

uint48

push 6-byte value onto stack

66

PUSH7

3

.

uint56

push 7-byte value onto stack

67

PUSH8

3

.

uint64

push 8-byte value onto stack

68

PUSH9

3

.

uint72

push 9-byte value onto stack

69

PUSH10

3

.

uint80

push 10-byte value onto stack

6A

PUSH11

3

.

uint88

push 11-byte value onto stack

6B

PUSH12

3

.

uint96

push 12-byte value onto stack

6C

PUSH13

3

.

uint104

push 13-byte value onto stack

6D

PUSH14

3

.

uint112

push 14-byte value onto stack

6E

PUSH15

3

.

uint120

push 15-byte value onto stack

6F

PUSH16

3

.

uint128

push 16-byte value onto stack

70

PUSH17

3

.

uint136

push 17-byte value onto stack

71

PUSH18

3

.

uint144

push 18-byte value onto stack

72

PUSH19

3

.

uint152

push 19-byte value onto stack

73

PUSH20

3

.

uint160

push 20-byte value onto stack

74

PUSH21

3

.

uint168

push 21-byte value onto stack

75

PUSH22

3

.

uint176

push 22-byte value onto stack

76

PUSH23

3

.

uint184

push 23-byte value onto stack

77

PUSH24

3

.

uint192

push 24-byte value onto stack

78

PUSH25

3

.

uint200

push 25-byte value onto stack

79

PUSH26

3

.

uint208

push 26-byte value onto stack

7A

PUSH27

3

.

uint216

push 27-byte value onto stack

7B

PUSH28

3

.

uint224

push 28-byte value onto stack

7C

PUSH29

3

.

uint232

push 29-byte value onto stack

7D

PUSH30

3

.

uint240

push 30-byte value onto stack

7E

PUSH31

3

.

uint248

push 31-byte value onto stack

7F

PUSH32

3

.

uint256

push 32-byte value onto stack

80

DUP1

3

a

a, a

clone 1st value on stack

81

DUP2

3

_, a

a, _, a

clone 2nd value on stack

82

DUP3

3

_, _, a

a, _, _, a

clone 3rd value on stack

83

DUP4

3

_, _, _, a

a, _, _, _, a

clone 4th value on stack

84

DUP5

3

..., a

a, ..., a

clone 5th value on stack

85

DUP6

3

..., a

a, ..., a

clone 6th value on stack

86

DUP7

3

..., a

a, ..., a

clone 7th value on stack

87

DUP8

3

..., a

a, ..., a

clone 8th value on stack

88

DUP9

3

..., a

a, ..., a

clone 9th value on stack

89

DUP10

3

..., a

a, ..., a

clone 10th value on stack

8A

DUP11

3

..., a

a, ..., a

clone 11th value on stack

8B

DUP12

3

..., a

a, ..., a

clone 12th value on stack

8C

DUP13

3

..., a

a, ..., a

clone 13th value on stack

8D

DUP14

3

..., a

a, ..., a

clone 14th value on stack

8E

DUP15

3

..., a

a, ..., a

clone 15th value on stack

8F

DUP16

3

..., a

a, ..., a

clone 16th value on stack

90

SWAP1

3

a, b

b, a

91

SWAP2

3

a, _, b

b, _, a

92

SWAP3

3

a, _, _, b

b, _, _, a

93

SWAP4

3

a, _, _, _, b

b, _, _, _, a

94

SWAP5

3

a, ..., b

b, ..., a

95

SWAP6

3

a, ..., b

b, ..., a

96

SWAP7

3

a, ..., b

b, ..., a

97

SWAP8

3

a, ..., b

b, ..., a

98

SWAP9

3

a, ..., b

b, ..., a

99

SWAP10

3

a, ..., b

b, ..., a

9A

SWAP11

3

a, ..., b

b, ..., a

9B

SWAP12

3

a, ..., b

b, ..., a

9C

SWAP13

3

a, ..., b

b, ..., a

9D

SWAP14

3

a, ..., b

b, ..., a

9E

SWAP15

3

a, ..., b

b, ..., a

9F

SWAP16

3

a, ..., b

b, ..., a

A0

LOG0

A8

ost, len

.

LOG0(memory[ost:ost+len-1])

A1

LOG1

A8

ost, len, topic0

.

LOG1(memory[ost:ost+len-1], topic0)

A2

LOG2

A8

ost, len, topic0, topic1

.

LOG1(memory[ost:ost+len-1], topic0, topic1)

A3

LOG3

A8

ost, len, topic0, topic1, topic2

.

LOG1(memory[ost:ost+len-1], topic0, topic1, topic2)

A4

LOG4

A8

ost, len, topic0, topic1, topic2, topic3

.

LOG1(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)

A5-EF

invalid

F0

CREATE

A9

val, ost, len

addr

addr = keccak256(rlp([address(this), this.nonce]))

F1

CALL

AA

gas, addr, val, argOst, argLen, retOst, retLen

success

mem[retOst:retOst+retLen-1] := returndata

F2

CALLCODE

AA

gas, addr, val, argOst, argLen, retOst, retLen

success

mem[retOst:retOst+retLen-1] = returndata

same as DELEGATECALL, but does not propagate original msg.sender and msg.value

F3

RETURN

0

ost, len

.

return mem[ost:ost+len-1]

F4

DELEGATECALL

AA

gas, addr, argOst, argLen, retOst, retLen

success

mem[retOst:retOst+retLen-1] := returndata

F5

CREATE2

A9

val, ost, len, salt

addr

addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]

F6-F9

invalid

FA

STATICCALL

AA

gas, addr, argOst, argLen, retOst, retLen

success

mem[retOst:retOst+retLen-1] := returndata

FB-FC

invalid

FD

REVERT

0

ost, len

.

revert(mem[ost:ost+len-1])

FE

INVALID

AF

designated invalid opcode - EIP-141

FF

SELFDESTRUCT

AB

addr

Last updated