ethereum.forks.spurious_dragon.vm.instructions.stackethereum.forks.byzantium.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

Remove item from stack.

Parameters

evm : The current EVM frame.

def pop(evm: Evm) -> None:
25
    """
26
    Remove item from stack.
27
28
    Parameters
29
    ----------
30
    evm :
31
        The current EVM frame.
32
33
    """
34
    # STACK
35
    stack.pop(evm.stack)
36
37
    # GAS
38
    charge_gas(evm, GAS_BASE)
39
40
    # OPERATION
41
    pass
42
43
    # PROGRAM COUNTER
44
    evm.pc += Uint(1)

push_n

Pushes a 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:
48
    """
49
    Pushes a N-byte immediate onto the stack.
50
51
    Parameters
52
    ----------
53
    evm :
54
        The current EVM frame.
55
56
    num_bytes :
57
        The number of immediate bytes to be read from the code and pushed to
58
        the stack.
59
60
    """
61
    # STACK
62
    pass
63
64
    # GAS
65
    charge_gas(evm, GAS_VERY_LOW)
66
67
    # OPERATION
68
    data_to_push = U256.from_be_bytes(
69
        buffer_read(evm.code, U256(evm.pc + Uint(1)), U256(num_bytes))
70
    )
71
    stack.push(evm.stack, data_to_push)
72
73
    # PROGRAM COUNTER
74
    evm.pc += Uint(1) + Uint(num_bytes)

dup_n

Duplicate 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:
78
    """
79
    Duplicate the Nth stack item (from top of the stack) to the top of stack.
80
81
    Parameters
82
    ----------
83
    evm :
84
        The current EVM frame.
85
86
    item_number :
87
        The stack item number (0-indexed from top of stack) to be duplicated
88
        to the top of stack.
89
90
    """
91
    # STACK
92
    pass
93
94
    # GAS
95
    charge_gas(evm, GAS_VERY_LOW)
96
    if item_number >= len(evm.stack):
97
        raise StackUnderflowError
98
    data_to_duplicate = evm.stack[len(evm.stack) - 1 - item_number]
99
    stack.push(evm.stack, data_to_duplicate)
100
101
    # PROGRAM COUNTER
102
    evm.pc += Uint(1)

swap_n

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

push1

139
push1 = partial(push_n, num_bytes=1)

push2

140
push2 = partial(push_n, num_bytes=2)

push3

141
push3 = partial(push_n, num_bytes=3)

push4

142
push4 = partial(push_n, num_bytes=4)

push5

143
push5 = partial(push_n, num_bytes=5)

push6

144
push6 = partial(push_n, num_bytes=6)

push7

145
push7 = partial(push_n, num_bytes=7)

push8

146
push8 = partial(push_n, num_bytes=8)

push9

147
push9 = partial(push_n, num_bytes=9)

push10

148
push10 = partial(push_n, num_bytes=10)

push11

149
push11 = partial(push_n, num_bytes=11)

push12

150
push12 = partial(push_n, num_bytes=12)

push13

151
push13 = partial(push_n, num_bytes=13)

push14

152
push14 = partial(push_n, num_bytes=14)

push15

153
push15 = partial(push_n, num_bytes=15)

push16

154
push16 = partial(push_n, num_bytes=16)

push17

155
push17 = partial(push_n, num_bytes=17)

push18

156
push18 = partial(push_n, num_bytes=18)

push19

157
push19 = partial(push_n, num_bytes=19)

push20

158
push20 = partial(push_n, num_bytes=20)

push21

159
push21 = partial(push_n, num_bytes=21)

push22

160
push22 = partial(push_n, num_bytes=22)

push23

161
push23 = partial(push_n, num_bytes=23)

push24

162
push24 = partial(push_n, num_bytes=24)

push25

163
push25 = partial(push_n, num_bytes=25)

push26

164
push26 = partial(push_n, num_bytes=26)

push27

165
push27 = partial(push_n, num_bytes=27)

push28

166
push28 = partial(push_n, num_bytes=28)

push29

167
push29 = partial(push_n, num_bytes=29)

push30

168
push30 = partial(push_n, num_bytes=30)

push31

169
push31 = partial(push_n, num_bytes=31)

push32

170
push32 = partial(push_n, num_bytes=32)

dup1

172
dup1 = partial(dup_n, item_number=0)

dup2

173
dup2 = partial(dup_n, item_number=1)

dup3

174
dup3 = partial(dup_n, item_number=2)

dup4

175
dup4 = partial(dup_n, item_number=3)

dup5

176
dup5 = partial(dup_n, item_number=4)

dup6

177
dup6 = partial(dup_n, item_number=5)

dup7

178
dup7 = partial(dup_n, item_number=6)

dup8

179
dup8 = partial(dup_n, item_number=7)

dup9

180
dup9 = partial(dup_n, item_number=8)

dup10

181
dup10 = partial(dup_n, item_number=9)

dup11

182
dup11 = partial(dup_n, item_number=10)

dup12

183
dup12 = partial(dup_n, item_number=11)

dup13

184
dup13 = partial(dup_n, item_number=12)

dup14

185
dup14 = partial(dup_n, item_number=13)

dup15

186
dup15 = partial(dup_n, item_number=14)

dup16

187
dup16 = partial(dup_n, item_number=15)

swap1

189
swap1 = partial(swap_n, item_number=1)

swap2

190
swap2 = partial(swap_n, item_number=2)

swap3

191
swap3 = partial(swap_n, item_number=3)

swap4

192
swap4 = partial(swap_n, item_number=4)

swap5

193
swap5 = partial(swap_n, item_number=5)

swap6

194
swap6 = partial(swap_n, item_number=6)

swap7

195
swap7 = partial(swap_n, item_number=7)

swap8

196
swap8 = partial(swap_n, item_number=8)

swap9

197
swap9 = partial(swap_n, item_number=9)

swap10

198
swap10 = partial(swap_n, item_number=10)

swap11

199
swap11 = partial(swap_n, item_number=11)

swap12

200
swap12 = partial(swap_n, item_number=12)

swap13

201
swap13 = partial(swap_n, item_number=13)

swap14

202
swap14 = partial(swap_n, item_number=14)

swap15

203
swap15 = partial(swap_n, item_number=15)

swap16

204
swap16 = partial(swap_n, item_number=16)