@@ -189,6 +189,25 @@ proc extCodeCopyEIP2929Op(cpt: VmCpt): EvmResultVoid =
189
189
cpt.memory.writePadded(code.bytes(), memPos, codePos, len)
190
190
ok()
191
191
192
+ proc extCodeCopyEIP7907Op(cpt: VmCpt): EvmResultVoid =
193
+ # # 0x3c, Copy an account's code to memory (EIP-2929).
194
+ ? cpt.stack.lsCheck(4 )
195
+ let
196
+ address = cpt.stack.lsPeekAddress(^ 1 )
197
+ memPos = cpt.stack.lsPeekMemRef(^ 2 )
198
+ codePos = cpt.stack.lsPeekMemRef(^ 3 )
199
+ len = cpt.stack.lsPeekMemRef(^ 4 )
200
+ gasCost = cpt.gasCosts[ExtCodeCopy].m_handler(cpt.memory.len, memPos, len) +
201
+ cpt.gasEip2929AccountCheck(address) + cpt.gasCallEIP7907(addresss)
202
+
203
+ cpt.stack.lsShrink(4 )
204
+ ? cpt.opcodeGasCost(ExtCodeCopy, gasCost, reason = " ExtCodeCopy EIP7907" )
205
+
206
+ let code = cpt.getCode(address)
207
+ cpt.memory.writePadded(code.bytes(), memPos, codePos, len)
208
+ ok()
209
+
210
+
192
211
# -----------
193
212
194
213
func returnDataSizeOp(cpt: VmCpt): EvmResultVoid =
@@ -350,6 +369,13 @@ const
350
369
info: " EIP2929: Copy an account's code to memory" ,
351
370
exec: extCodeCopyEIP2929Op),
352
371
372
+ (opCode: ExtCodeCopy, # # 0x3c, Account Code-copy for Berlin through Cancun
373
+ forks: VmOpOsakaAndLater,
374
+ name: " extCodeCopyEIP7907" ,
375
+ info: " EIP7907: Copy an account's code to memory" ,
376
+ exec: extCodeCopyEIP7907Op),
377
+
378
+
353
379
354
380
(opCode: ReturnDataSize, # # 0x3d, Previous call output data size
355
381
forks: VmOpByzantiumAndLater,
0 commit comments