Opcodes

OPCODES FOR THE EVM

OVERVIEW

This is an updated version of the EVM reference page at wolflo/evm-opcodes↗. Also drawn from the Ethereum's Yellow Paper↗, the Jello Paper↗, and the etn-sc implementation. This is intended to be an accessible reference, but it is not particularly rigorous. If you want to be certain of correctness and aware of every edge case, using the Jello Paper or a client implementation is advisable.

Looking for an interactive reference? Check out evm.codes↗.

For operations with dynamic gas costs, see gas.md↗.

💡 Quick tip: To view entire lines, use [shift] + scroll to scroll horizontally on desktop.

StackNameGasInitial StackResulting StackMem / StorageNotes

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

a, b

a ** b

uint256 exponentiation modulo 2**256

0B

SIGNEXTEND

5

b, x

SIGNEXTEND(x, b)

sign extend(opens in a new tab)↗ x 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

bitwise OR

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

ost, len

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

keccak256

21-2F

invalid

30

ADDRESS

2

.

address(this)

address of executing contract

31

BALANCE

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

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

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 **(opens in a new tab)↗

3B

EXTCODESIZE

addr

len(addr.code)

size of code at addr, in bytes

3C

EXTCODECOPY

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

dstOst, ost, len

.

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

copy returned data from last external call

3F

EXTCODEHASH

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(opens in a new tab)↗ 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

ost

mem[ost:ost+32]

read word from memory at offset ost

52

MSTORE

ost, val

.

mem[ost:ost+32] := val

write a word to memory

53

MSTORE8

ost, val

.

mem[ost] := val && 0xFF

write a single byte to memory

54

SLOAD

key

storage[key]

read word from storage

55

SSTORE

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-5E

invalid

5F

PUSH0

2

.

uint8

push the constant value 0 onto stack

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

ost, len

.

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

A1

LOG1

ost, len, topic0

.

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

A2

LOG2

ost, len, topic0, topic1

.

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

A3

LOG3

ost, len, topic0, topic1, topic2

.

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

A4

LOG4

ost, len, topic0, topic1, topic2, topic3

.

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

A5-EF

invalid

F0

CREATE

val, ost, len

addr

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

F1

CALL

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

success

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

F2

CALLCODE

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

ost, len

.

return mem[ost:ost+len-1]

F4

DELEGATECALL

gas, addr, argOst, argLen, retOst, retLen

success

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

F5

CREATE2

val, ost, len, salt

addr

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

F6-F9

invalid

FA

STATICCALL

gas, addr, argOst, argLen, retOst, retLen

success

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

FB-FC

invalid

FD

REVERT

ost, len

.

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

FE

INVALID

designated invalid opcode - EIP-141(opens in a new tab)↗

FF

SELFDESTRUCT

addr

.

destroy contract and sends all funds to addr

Last updated