# Nimbus # Copyright (c) 2019-2024 Status Research & Development GmbH # Licensed under either of # * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or # http://www.apache.org/licenses/LICENSE-2.0) # * MIT license ([LICENSE-MIT](LICENSE-MIT) or # http://opensource.org/licenses/MIT) # at your option. This file may not be copied, modified, or distributed except # according to those terms. import std/[macros, strutils], macro_assembler, unittest2 # Currently fails on `AristoDb*` macro_assembler.coreDbType = LegacyDbMemory proc opMemoryMain*() = suite "Memory Opcodes": assembler: # Push1 OP title: "Push1" code: Push1 "0xa0" stack: "0x00000000000000000000000000000000000000000000000000000000000000A0" assembler: # Push2 OP title: "Push2" code: Push2 "0xa0b0" stack: "0x000000000000000000000000000000000000000000000000000000000000A0B0" assembler: # Push3 OP title: "Push3" code: Push3 "0xA0B0C0" stack: "0x0000000000000000000000000000000000000000000000000000000000A0B0C0" assembler: # Push4 OP title: "Push4" code: Push4 "0xA0B0C0D0" stack: "0x00000000000000000000000000000000000000000000000000000000A0B0C0D0" assembler: # Push5 OP title: "Push5" code: Push5 "0xA0B0C0D0E0" stack: "0x000000000000000000000000000000000000000000000000000000A0B0C0D0E0" assembler: # Push6 OP title: "Push6" code: Push6 "0xA0B0C0D0E0F0" stack: "0x0000000000000000000000000000000000000000000000000000A0B0C0D0E0F0" assembler: # Push7 OP title: "Push7" code: Push7 "0xA0B0C0D0E0F0A1" stack: "0x00000000000000000000000000000000000000000000000000A0B0C0D0E0F0A1" assembler: # Push8 OP title: "Push8" code: Push8 "0xA0B0C0D0E0F0A1B1" stack: "0x000000000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1" assembler: # Push9 OP title: "Push9" code: Push9 "0xA0B0C0D0E0F0A1B1C1" stack: "0x0000000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1" assembler: # Push10 OP title: "Push10" code: Push10 "0xA0B0C0D0E0F0A1B1C1D1" stack: "0x00000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1" assembler: # Push11 OP title: "Push11" code: Push11 "0xA0B0C0D0E0F0A1B1C1D1E1" stack: "0x000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1" assembler: # Push12 OP title: "Push12" code: Push12 "0xA0B0C0D0E0F0A1B1C1D1E1F1" stack: "0x0000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1" assembler: # Push13 OP title: "Push13" code: Push13 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2" stack: "0x00000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2" assembler: # Push14 OP title: "Push14" code: Push14 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2" stack: "0x000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2" assembler: # Push15 OP title: "Push15" code: Push15 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2" stack: "0x0000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2" assembler: # Push16 OP title: "Push16" code: Push16 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2" stack: "0x00000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2" assembler: # Push17 OP title: "Push17" code: Push17 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2" stack: "0x000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2" assembler: # Push18 OP title: "Push18" code: Push18 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2" stack: "0x0000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2" assembler: # Push19 OP title: "Push19" code: Push19 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3" stack: "0x00000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3" assembler: # Push20 OP title: "Push20" code: Push20 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3" stack: "0x000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3" assembler: # Push21 OP title: "Push21" code: Push21 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3" stack: "0x0000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3" assembler: # Push22 OP title: "Push22" code: Push22 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3" stack: "0x00000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3" assembler: # Push23 OP title: "Push23" code: Push23 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3" stack: "0x000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3" assembler: # Push24 OP title: "Push24" code: Push24 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3" stack: "0x0000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3" assembler: # Push25 OP title: "Push25" code: Push25 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4" stack: "0x00000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4" assembler: # Push26 OP title: "Push26" code: Push26 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4" stack: "0x000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4" assembler: # Push27 OP title: "Push27" code: Push27 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4" stack: "0x0000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4" assembler: # Push28 OP title: "Push28" code: Push28 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4" stack: "0x00000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4" assembler: # Push29 OP title: "Push29" code: Push29 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4" stack: "0x000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4" assembler: # Push30 OP title: "Push30" code: Push30 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4" stack: "0x0000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4" assembler: # Push31 OP title: "Push31" code: Push31 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1" stack: "0x00A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1" assembler: # Push32 OP title: "Push32" code: Push32 "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1" stack: "0xA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1" # macro assembler prevented this #assembler: # PushN OP not enough data # title: "PushN_1" # code: # Push2 "0xAA" # stack: "0x000000000000000000000000000000000000000000000000000000000000AA00" # success: false # #assembler: # PushN OP not enough data # title: "PushN_2" # code: # Push32 "0xAABB" # stack: "0xAABB000000000000000000000000000000000000000000000000000000000000" # success: false assembler: # Pop OP title: "Pop_1" code: Push2 "0x0000" Push1 "0x01" Push3 "0x000002" Pop stack: "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000001" assembler: # Pop OP title: "Pop_2" code: Push2 "0x0000" Push1 "0x01" Push3 "0x000002" Pop Pop stack: "0x0000000000000000000000000000000000000000000000000000000000000000" assembler:# Pop OP mal data title: "Pop_3" code: Push2 "0x0000" Push1 "0x01" Push3 "0x000002" Pop Pop Pop Pop success: false macro generateDUPS(): untyped = result = newStmtList() for i in 1 .. 16: let title = newStmtList(newLit("DUP_" & $i)) let pushIdent = ident("Push1") var body = newStmtList() var stack = newStmtList() for x in 0 ..< i: let val = newLit("0x" & toHex(x+10, 2)) body.add quote do: `pushIdent` `val` stack.add quote do: `val` let stackVal = newLit("0x" & toHex(10, 2)) stack.add quote do: `stackVal` let dupIdent = ident("DUP" & $i) body.add quote do: `dupIdent` let titleCall = newCall(ident("title"), title) let codeCall = newCall(ident("code"), body) let stackCall = newCall(ident("stack"), stack) result.add quote do: assembler: `titleCall` `codeCall` `stackCall` generateDUPS() assembler: # DUPN OP mal data title: "DUPN_2" code: Dup1 success: false macro generateSWAPS(): untyped = result = newStmtList() for i in 1 .. 16: let title = newStmtList(newLit("SWAP_" & $i)) let pushIdent = ident("Push1") var body = newStmtList() var stack = newStmtList() for x in countDown(i, 0): let val = newLit("0x" & toHex(x+10, 2)) body.add quote do: `pushIdent` `val` if x == i: let val = newLit("0x" & toHex(0+10, 2)) stack.add quote do: `val` elif x == 0: let val = newLit("0x" & toHex(i+10, 2)) stack.add quote do: `val` else: stack.add quote do: `val` let swapIdent = ident("SWAP" & $i) body.add quote do: `swapIdent` let titleCall = newCall(ident("title"), title) let codeCall = newCall(ident("code"), body) let stackCall = newCall(ident("stack"), stack) result.add quote do: assembler: `titleCall` `codeCall` `stackCall` generateSWAPS() assembler:# SWAPN OP mal data title: "SWAPN_2" code: Swap1 success: false assembler: # Mstore OP title: "Mstore_1" code: Push2 "0x1234" Push1 "0x00" Mstore memory: "0x0000000000000000000000000000000000000000000000000000000000001234" assembler: # Mstore OP title: "Mstore_2" code: Push2 "0x1234" Push1 "0x00" Mstore Push2 "0x5566" Push1 "0x20" Mstore memory: "0x0000000000000000000000000000000000000000000000000000000000001234" "0x0000000000000000000000000000000000000000000000000000000000005566" assembler: # Mstore OP title: "Mstore_3" code: Push2 "0x1234" Push1 "0x00" Mstore Push2 "0x5566" Push1 "0x20" Mstore Push2 "0x8888" Push1 "0x00" Mstore memory: "0x0000000000000000000000000000000000000000000000000000000000008888" "0x0000000000000000000000000000000000000000000000000000000000005566" assembler: # Mstore OP title: "Mstore_4" code: Push2 "0x1234" Push1 "0xA0" Mstore memory: "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000001234" assembler: # Mstore OP title: "Mstore_5" code: Push2 "0x1234" Mstore success: false stack: "0x1234" assembler: # Mload OP title: "Mload_1" code: Push1 "0x00" Mload memory: "0x0000000000000000000000000000000000000000000000000000000000000000" stack: "0x0000000000000000000000000000000000000000000000000000000000000000" assembler: # Mload OP title: "Mload_2" code: Push1 "0x22" Mload memory: "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000" stack: "0x0000000000000000000000000000000000000000000000000000000000000000" assembler: # Mload OP title: "Mload_3" code: Push1 "0x20" Mload memory: "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000" stack: "0x0000000000000000000000000000000000000000000000000000000000000000" assembler: # Mload OP title: "Mload_4" code: Push2 "0x1234" Push1 "0x20" Mstore Push1 "0x20" Mload memory: "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000001234" stack: "0x0000000000000000000000000000000000000000000000000000000000001234" assembler: # Mload OP title: "Mload_5" code: Push2 "0x1234" Push1 "0x20" Mstore Push1 "0x1F" Mload memory: "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000001234" stack: "0x0000000000000000000000000000000000000000000000000000000000000012" assembler: # Mload OP mal data title: "Mload_6" code: Mload success: false assembler: # Mstore8 OP title: "Mstore8_1" code: Push1 "0x11" Push1 "0x00" Mstore8 memory: "0x1100000000000000000000000000000000000000000000000000000000000000" assembler: # Mstore8 OP title: "Mstore8_2" code: Push1 "0x22" Push1 "0x01" Mstore8 memory: "0x0022000000000000000000000000000000000000000000000000000000000000" assembler: # Mstore8 OP title: "Mstore8_3" code: Push1 "0x22" Push1 "0x21" Mstore8 memory: "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0022000000000000000000000000000000000000000000000000000000000000" assembler: # Mstore8 OP mal title: "Mstore8_4" code: Push1 "0x22" Mstore8 success: false stack: "0x22" assembler: # Sstore OP title: "Sstore_1" code: Push1 "0x22" Push1 "0xAA" Sstore storage: "0xAA": "0x22" assembler: # Sstore OP title: "Sstore_2" code: Push1 "0x22" Push1 "0xAA" Sstore Push1 "0x22" Push1 "0xBB" Sstore storage: "0xAA": "0x22" "0xBB": "0x22" assembler: # Sstore OP title: "Sstore_3" code: Push1 "0x22" Sstore success: false stack: "0x22" assembler: # Sstore EIP1283 title: "Sstore_NET_1" code: "60006000556000600055" fork: Constantinople gasUsed: 412 assembler: # Sstore EIP1283 title: "Sstore_NET_2" code: "60006000556001600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_3" code: "60016000556000600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_4" code: "60016000556002600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_5" code: "60016000556001600055" fork: Constantinople gasUsed: 20212 # Sets Storage row on "cow" address: # 0: 1 # private void setStorageToOne(VM vm) { # # Sets storage value to 1 and commits # code: "60006000556001600055" # fork: Constantinople # invoke.getRepository().commit() # invoke.setOrigRepository(invoke.getRepository()) assembler: # Sstore EIP1283 title: "Sstore_NET_6" code: "60006000556000600055" fork: Constantinople gasUsed: 412 assembler: # Sstore EIP1283 title: "Sstore_NET_7" code: "60006000556001600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_8" code: "60006000556002600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_9" code: "60026000556000600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_10" code: "60026000556003600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_11" code: "60026000556001600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_12" code: "60026000556002600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_13" code: "60016000556000600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_14" code: "60016000556002600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_15" code: "60016000556001600055" fork: Constantinople gasUsed: 20212 assembler: # Sstore EIP1283 title: "Sstore_NET_16" code: "600160005560006000556001600055" fork: Constantinople gasUsed: 40218 assembler: # Sstore EIP1283 title: "Sstore_NET_17" code: "600060005560016000556000600055" fork: Constantinople gasUsed: 20418 assembler: # Sload OP title: "Sload_1" code: Push1 "0xAA" Sload stack: "0x0000000000000000000000000000000000000000000000000000000000000000" assembler: # Sload OP title: "Sload_2" code: Push1 "0x22" Push1 "0xAA" Sstore Push1 "0xAA" Sload stack: "0x0000000000000000000000000000000000000000000000000000000000000022" assembler: # Sload OP title: "Sload_3" code: Push1 "0x22" Push1 "0xAA" Sstore Push1 "0x33" Push1 "0xCC" Sstore Push1 "0xCC" Sload stack: "0x0000000000000000000000000000000000000000000000000000000000000033" assembler: # Sload OP title: "Sload_4" code: Sload success: false assembler: # Pc OP title: "Pc_1" code: Pc stack: "0x0000000000000000000000000000000000000000000000000000000000000000" assembler: # Pc OP title: "Pc_2" code: Push1 "0x22" Push1 "0xAA" Mstore Push1 "0xAA" Sload Pc stack: "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000008" memory: "0x00" "0x00" "0x00" "0x00" "0x00" "0x00" "0x0000000000000000002200000000000000000000000000000000000000000000" assembler: # Jump OP mal data title: "Jump_1" code: Push1 "0xAA" Push1 "0xBB" Push1 "0x0E" Jump Push1 "0xCC" Push1 "0xDD" Push1 "0xEE" JumpDest Push1 "0xFF" stack: "0xaa" "0x00000000000000000000000000000000000000000000000000000000000000bb" success: false assembler: # Jump OP mal data title: "Jump_2" code: Push1 "0x0C" Push1 "0x0C" Swap1 Jump Push1 "0xCC" Push1 "0xDD" Push1 "0xEE" Push1 "0xFF" success: false stack : "0x0C" assembler: # JumpI OP title: "JumpI_1" code: Push1 "0x01" Push1 "0x05" JumpI JumpDest Push1 "0xCC" stack: "0x00000000000000000000000000000000000000000000000000000000000000CC" assembler: # JumpI OP title: "JumpI_2" code: Push4 "0x00000000" Push1 "0x44" JumpI Push1 "0xCC" Push1 "0xDD" stack: "0x00000000000000000000000000000000000000000000000000000000000000CC" "0x00000000000000000000000000000000000000000000000000000000000000DD" assembler: # JumpI OP mal title: "JumpI_3" code: Push1 "0x01" JumpI success: false stack: "0x01" assembler: # JumpI OP mal title: "JumpI_4" code: Push1 "0x01" Push1 "0x22" Swap1 Swap1 JumpI success: false assembler: # Jump OP mal data title: "JumpDest_1" code: Push1 "0x23" Push1 "0x08" Jump Push1 "0x01" JumpDest Push1 "0x02" Sstore storage: "0x02": "0x00" stack: "0x23" success: false # success or not? assembler: # JumpDest OP for JumpI title: "JumpDest_2" code: Push1 "0x23" Push1 "0x01" Push1 "0x09" JumpI Push1 "0x01" JumpDest Push1 "0x02" Sstore #success: false storage: "0x02": "0x23" assembler: # Msize OP title: "Msize_1" code: Msize stack: "0x0000000000000000000000000000000000000000000000000000000000000000" assembler: # Msize OP title: "Msize_2" code: Push1 "0x20" Push1 "0x30" Mstore Msize stack: "0x60" memory: "0x00" "0x00" "0x0000000000000000000000000000002000000000000000000000000000000000" assembler: title: "Mcopy 1" code: Push32 "0x0000000000000000000000000000000000000000000000000000000000000000" Push1 "0x00" Mstore Push32 "0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" Push1 "0x20" Mstore Push1 "0x20" # len Push1 "0x20" # src Push1 "0x00" # dst Mcopy memory: "0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" "0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" fork: Cancun assembler: title: "Mcopy 2: Overlap" code: Push32 "0x0101010101010101010101010101010101010101010101010101010101010101" Push1 "0x00" Mstore Push1 "0x20" # len Push1 "0x00" # src Push1 "0x00" # dst Mcopy memory: "0x0101010101010101010101010101010101010101010101010101010101010101" fork: Cancun assembler: title: "Mcopy 3" code: Push1 "0x00" Push1 "0x00" Mstore8 Push1 "0x01" Push1 "0x01" Mstore8 Push1 "0x02" Push1 "0x02" Mstore8 Push1 "0x03" Push1 "0x03" Mstore8 Push1 "0x04" Push1 "0x04" Mstore8 Push1 "0x05" Push1 "0x05" Mstore8 Push1 "0x06" Push1 "0x06" Mstore8 Push1 "0x07" Push1 "0x07" Mstore8 Push1 "0x08" Push1 "0x08" Mstore8 Push1 "0x08" # len Push1 "0x01" # src Push1 "0x00" # dst Mcopy memory: "0x0102030405060708080000000000000000000000000000000000000000000000" fork: Cancun assembler: title: "Mcopy 4" code: Push1 "0x00" Push1 "0x00" Mstore8 Push1 "0x01" Push1 "0x01" Mstore8 Push1 "0x02" Push1 "0x02" Mstore8 Push1 "0x03" Push1 "0x03" Mstore8 Push1 "0x04" Push1 "0x04" Mstore8 Push1 "0x05" Push1 "0x05" Mstore8 Push1 "0x06" Push1 "0x06" Mstore8 Push1 "0x07" Push1 "0x07" Mstore8 Push1 "0x08" Push1 "0x08" Mstore8 Push1 "0x08" # len Push1 "0x00" # src Push1 "0x01" # dst Mcopy memory: "0x0000010203040506070000000000000000000000000000000000000000000000" fork: Cancun assembler: title: "Tstore/Tload" code: Push1 "0xAA" Push1 "0xBB" Tstore Push1 "0xBB" Tload stack: "0x00000000000000000000000000000000000000000000000000000000000000AA" fork: Cancun assembler: title: "Tload stack underflow not crash" code: Push1 "0xAA" Push1 "0xBB" Tstore Tload success: false fork: Cancun when isMainModule: opMemoryMain()