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(opens in a new tab)↗ | 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 | | i th 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(opens in a new tab)↗ | ost, len | keccak256(mem[ost:ost+len-1]) | | keccak256 | | | |
21-2F | invalid | | | | | | | | |
30 | ADDRESS | 2 | . | address(this) | | address of executing contract | | | |
31 | BALANCE | A5(opens in a new tab)↗ | 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(opens in a new tab)↗ | 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(opens in a new tab)↗ | 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 | A5(opens in a new tab)↗ | addr | len(addr.code) | | size of code at addr, in bytes | | | |
3C | EXTCODECOPY | A4(opens in a new tab)↗ | 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(opens in a new tab)↗ | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copy returned data from last external call | | | |
3F | EXTCODEHASH | A5(opens in a new tab)↗ | 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 | 3*(opens in a new tab)↗ | ost | mem[ost:ost+32] | | read word from memory at offset ost | | | |
52 | MSTORE | 3*(opens in a new tab)↗ | ost, val | . | mem[ost:ost+32] := val | write a word to memory | | | |
53 | MSTORE8 | 3*(opens in a new tab)↗ | ost, val | . | mem[ost] := val && 0xFF | write a single byte to memory | | | |
54 | SLOAD | A6(opens in a new tab)↗ | key | storage[key] | | read word from storage | | | |
55 | SSTORE | A7(opens in a new tab)↗ | 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 | A8(opens in a new tab)↗ | ost, len | . | | LOG0(memory[ost:ost+len-1]) | | | |
A1 | LOG1 | A8(opens in a new tab)↗ | ost, len, topic0 | . | | LOG1(memory[ost:ost+len-1], topic0) | | | |
A2 | LOG2 | A8(opens in a new tab)↗ | ost, len, topic0, topic1 | . | | LOG1(memory[ost:ost+len-1], topic0, topic1) | | | |
A3 | LOG3 | A8(opens in a new tab)↗ | ost, len, topic0, topic1, topic2 | . | | LOG1(memory[ost:ost+len-1], topic0, topic1, topic2) | | | |
A4 | LOG4 | A8(opens in a new tab)↗ | ost, len, topic0, topic1, topic2, topic3 | . | | LOG1(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | | | |
A5-EF | invalid | | | | | | | | |
F0 | CREATE | A9(opens in a new tab)↗ | val, ost, len | addr | | addr = keccak256(rlp([address(this), this.nonce])) | | | |
F1 | CALL | AA(opens in a new tab)↗ | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | | | | |
F2 | CALLCODE | AA(opens in a new tab)↗ | 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*(opens in a new tab)↗ | ost, len | . | | return mem[ost:ost+len-1] | | | |
F4 | DELEGATECALL | AA(opens in a new tab)↗ | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | | | | |
F5 | CREATE2 | A9(opens in a new tab)↗ | val, ost, len, salt | addr | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | | | |
F6-F9 | invalid | | | | | | | | |
FA | STATICCALL | AA(opens in a new tab)↗ | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | | | | |
FB-FC | invalid | | | | | | | | |
FD | REVERT | 0*(opens in a new tab)↗ | ost, len | . | | revert(mem[ost:ost+len-1]) | | | |
FE | INVALID | AF(opens in a new tab)↗ | | | designated invalid opcode - EIP-141(opens in a new tab)↗ | | | | |
FF | SELFDESTRUCT | AB(opens in a new tab)↗ | addr | . | | | destroy contract and sends all funds to addr | | |