ethereum.forks.london.vm.instructions.stack

Ethereum Virtual Machine (EVM) Stack Instructions.

.. contents:: Table of Contents :backlinks: none :local:

Introduction

Implementations of the EVM stack related instructions.

pop

Removes an item from the stack.

Parameters

evm : The current EVM frame.

def pop(evm: Evm) -> None:
28
    """
29
    Removes an item from the stack.
30
31
    Parameters
32
    ----------
33
    evm :
34
        The current EVM frame.
35
36
    """
37
    # STACK
38
    stack.pop(evm.stack)
39
40
    # GAS
41
    charge_gas(evm, GasCosts.OPCODE_POP)
42
43
    # OPERATION
44
    pass
45
46
    # PROGRAM COUNTER
47
    evm.pc += Uint(1)

push_n

Pushes an N-byte immediate onto the stack.

Parameters

evm : The current EVM frame.

num_bytes : The number of immediate bytes to be read from the code and pushed to the stack.

def push_n(evm: Evm, ​​num_bytes: int) -> None:
51
    """
52
    Pushes an N-byte immediate onto the stack.
53
54
    Parameters
55
    ----------
56
    evm :
57
        The current EVM frame.
58
59
    num_bytes :
60
        The number of immediate bytes to be read from the code and pushed to
61
        the stack.
62
63
    """
64
    # STACK
65
    pass
66
67
    # GAS
68
    charge_gas(evm, GasCosts.OPCODE_PUSH)
69
70
    # OPERATION
71
    data_to_push = U256.from_be_bytes(
72
        buffer_read(evm.code, U256(evm.pc + Uint(1)), U256(num_bytes))
73
    )
74
    stack.push(evm.stack, data_to_push)
75
76
    # PROGRAM COUNTER
77
    evm.pc += Uint(1) + Uint(num_bytes)

dup_n

Duplicates the Nth stack item (from top of the stack) to the top of stack.

Parameters

evm : The current EVM frame.

item_number : The stack item number (0-indexed from top of stack) to be duplicated to the top of stack.

def dup_n(evm: Evm, ​​item_number: int) -> None:
81
    """
82
    Duplicates the Nth stack item (from top of the stack) to the top of stack.
83
84
    Parameters
85
    ----------
86
    evm :
87
        The current EVM frame.
88
89
    item_number :
90
        The stack item number (0-indexed from top of stack) to be duplicated
91
        to the top of stack.
92
93
    """
94
    # STACK
95
    pass
96
97
    # GAS
98
    charge_gas(evm, GasCosts.OPCODE_DUP)
99
    if item_number >= len(evm.stack):
100
        raise StackUnderflowError
101
    data_to_duplicate = evm.stack[len(evm.stack) - 1 - item_number]
102
    stack.push(evm.stack, data_to_duplicate)
103
104
    # PROGRAM COUNTER
105
    evm.pc += Uint(1)

swap_n

Swaps the top and the item_number element of the stack, where the top of the stack is position zero.

If item_number is zero, this function does nothing (which should not be possible, since there is no SWAP0 instruction).

Parameters

evm : The current EVM frame.

item_number : The stack item number (0-indexed from top of stack) to be swapped with the top of stack element.

def swap_n(evm: Evm, ​​item_number: int) -> None:
109
    """
110
    Swaps the top and the `item_number` element of the stack, where
111
    the top of the stack is position zero.
112
113
    If `item_number` is zero, this function does nothing (which should not be
114
    possible, since there is no `SWAP0` instruction).
115
116
    Parameters
117
    ----------
118
    evm :
119
        The current EVM frame.
120
121
    item_number :
122
        The stack item number (0-indexed from top of stack) to be swapped
123
        with the top of stack element.
124
125
    """
126
    # STACK
127
    pass
128
129
    # GAS
130
    charge_gas(evm, GasCosts.OPCODE_SWAP)
131
    if item_number >= len(evm.stack):
132
        raise StackUnderflowError
133
    evm.stack[-1], evm.stack[-1 - item_number] = (
134
        evm.stack[-1 - item_number],
135
        evm.stack[-1],
136
    )
137
138
    # PROGRAM COUNTER
139
    evm.pc += Uint(1)

push1

142
push1 = partial(push_n, num_bytes=1)

push2

143
push2 = partial(push_n, num_bytes=2)

push3

144
push3 = partial(push_n, num_bytes=3)

push4

145
push4 = partial(push_n, num_bytes=4)

push5

146
push5 = partial(push_n, num_bytes=5)

push6

147
push6 = partial(push_n, num_bytes=6)

push7

148
push7 = partial(push_n, num_bytes=7)

push8

149
push8 = partial(push_n, num_bytes=8)

push9

150
push9 = partial(push_n, num_bytes=9)

push10

151
push10 = partial(push_n, num_bytes=10)

push11

152
push11 = partial(push_n, num_bytes=11)

push12

153
push12 = partial(push_n, num_bytes=12)

push13

154
push13 = partial(push_n, num_bytes=13)

push14

155
push14 = partial(push_n, num_bytes=14)

push15

156
push15 = partial(push_n, num_bytes=15)

push16

157
push16 = partial(push_n, num_bytes=16)

push17

158
push17 = partial(push_n, num_bytes=17)

push18

159
push18 = partial(push_n, num_bytes=18)

push19

160
push19 = partial(push_n, num_bytes=19)

push20

161
push20 = partial(push_n, num_bytes=20)

push21

162
push21 = partial(push_n, num_bytes=21)

push22

163
push22 = partial(push_n, num_bytes=22)

push23

164
push23 = partial(push_n, num_bytes=23)

push24

165
push24 = partial(push_n, num_bytes=24)

push25

166
push25 = partial(push_n, num_bytes=25)

push26

167
push26 = partial(push_n, num_bytes=26)

push27

168
push27 = partial(push_n, num_bytes=27)

push28

169
push28 = partial(push_n, num_bytes=28)

push29

170
push29 = partial(push_n, num_bytes=29)

push30

171
push30 = partial(push_n, num_bytes=30)

push31

172
push31 = partial(push_n, num_bytes=31)

push32

173
push32 = partial(push_n, num_bytes=32)

dup1

175
dup1 = partial(dup_n, item_number=0)

dup2

176
dup2 = partial(dup_n, item_number=1)

dup3

177
dup3 = partial(dup_n, item_number=2)

dup4

178
dup4 = partial(dup_n, item_number=3)

dup5

179
dup5 = partial(dup_n, item_number=4)

dup6

180
dup6 = partial(dup_n, item_number=5)

dup7

181
dup7 = partial(dup_n, item_number=6)

dup8

182
dup8 = partial(dup_n, item_number=7)

dup9

183
dup9 = partial(dup_n, item_number=8)

dup10

184
dup10 = partial(dup_n, item_number=9)

dup11

185
dup11 = partial(dup_n, item_number=10)

dup12

186
dup12 = partial(dup_n, item_number=11)

dup13

187
dup13 = partial(dup_n, item_number=12)

dup14

188
dup14 = partial(dup_n, item_number=13)

dup15

189
dup15 = partial(dup_n, item_number=14)

dup16

190
dup16 = partial(dup_n, item_number=15)

swap1

192
swap1 = partial(swap_n, item_number=1)

swap2

193
swap2 = partial(swap_n, item_number=2)

swap3

194
swap3 = partial(swap_n, item_number=3)

swap4

195
swap4 = partial(swap_n, item_number=4)

swap5

196
swap5 = partial(swap_n, item_number=5)

swap6

197
swap6 = partial(swap_n, item_number=6)

swap7

198
swap7 = partial(swap_n, item_number=7)

swap8

199
swap8 = partial(swap_n, item_number=8)

swap9

200
swap9 = partial(swap_n, item_number=9)

swap10

201
swap10 = partial(swap_n, item_number=10)

swap11

202
swap11 = partial(swap_n, item_number=11)

swap12

203
swap12 = partial(swap_n, item_number=12)

swap13

204
swap13 = partial(swap_n, item_number=13)

swap14

205
swap14 = partial(swap_n, item_number=14)

swap15

206
swap15 = partial(swap_n, item_number=15)

swap16

207
swap16 = partial(swap_n, item_number=16)