diff --git a/nimbus/evm/computation.nim b/nimbus/evm/computation.nim index ad74967e92..f0cab51428 100644 --- a/nimbus/evm/computation.nim +++ b/nimbus/evm/computation.nim @@ -395,6 +395,9 @@ proc traceOpCodeStarted*(c: Computation, op: Op): int {.gcsafe, raises: [].} = c.gasMeter.gasRemaining, c.msg.depth + 1) +proc traceCallFamilyGas*(c: Computation, op: Op, gas: GasInt) {.gcsafe, raises: [].} = + c.vmState.callFamilyGas(op, gas, c.msg.depth + 1) + proc traceOpCodeEnded*(c: Computation, op: Op, opIndex: int) {.gcsafe, raises: [].} = c.vmState.captureOpEnd( c.code.pc - 1, diff --git a/nimbus/evm/interpreter/op_handlers/oph_call.nim b/nimbus/evm/interpreter/op_handlers/oph_call.nim index 918e408067..b3b8d71970 100644 --- a/nimbus/evm/interpreter/op_handlers/oph_call.nim +++ b/nimbus/evm/interpreter/op_handlers/oph_call.nim @@ -203,8 +203,11 @@ const raise newException( StaticContextError, "Cannot modify state while inside of a STATICCALL context") - - let p = cpt.callParams + + let + gasAtStart = cpt.gasMeter.gasRemaining + p = cpt.callParams + cpt.asyncChainTo(ifNecessaryGetAccounts(cpt.vmState, @[p.sender])): cpt.asyncChainTo(ifNecessaryGetCodeForAccounts(cpt.vmState, @[p.contractAddress, p.codeAddress])): var (gasCost, childGasLimit) = cpt.gasCosts[Call].c_handler( @@ -238,6 +241,9 @@ const raise newException( OutOfGas, "Gas not enough to perform calculation (call)") + gasCost = gasAtStart - cpt.gasMeter.gasRemaining + cpt.traceCallFamilyGas(Call, gasCost) + cpt.memory.extend(p.memInPos, p.memInLen) cpt.memory.extend(p.memOutPos, p.memOutLen) @@ -287,6 +293,7 @@ const ## 0xf2, Message-call into this account with an alternative account's code. let cpt = k.cpt + gasAtStart = cpt.gasMeter.gasRemaining p = cpt.callCodeParams cpt.asyncChainTo(ifNecessaryGetAccounts(cpt.vmState, @[p.sender])): @@ -325,6 +332,9 @@ const raise newException( OutOfGas, "Gas not enough to perform calculation (callCode)") + gasCost = gasAtStart - cpt.gasMeter.gasRemaining + cpt.traceCallFamilyGas(CallCode, gasCost) + cpt.memory.extend(p.memInPos, p.memInLen) cpt.memory.extend(p.memOutPos, p.memOutLen) @@ -375,6 +385,7 @@ const ## code, but persisting the current values for sender and value. let cpt = k.cpt + gasAtStart = cpt.gasMeter.gasRemaining p = cpt.delegateCallParams cpt.asyncChainTo(ifNecessaryGetAccounts(cpt.vmState, @[p.sender])): @@ -409,6 +420,9 @@ const raise newException( OutOfGas, "Gas not enough to perform calculation (delegateCall)") + gasCost = gasAtStart - cpt.gasMeter.gasRemaining + cpt.traceCallFamilyGas(DelegateCall, gasCost) + cpt.memory.extend(p.memInPos, p.memInLen) cpt.memory.extend(p.memOutPos, p.memOutLen) @@ -451,6 +465,7 @@ const let cpt = k.cpt + gasAtStart = cpt.gasMeter.gasRemaining p = cpt.staticCallParams cpt.asyncChainTo(ifNecessaryGetAccounts(cpt.vmState, @[p.sender])): @@ -490,6 +505,9 @@ const raise newException( OutOfGas, "Gas not enough to perform calculation (staticCall)") + gasCost = gasAtStart - cpt.gasMeter.gasRemaining + cpt.traceCallFamilyGas(StaticCall, gasCost) + cpt.memory.extend(p.memInPos, p.memInLen) cpt.memory.extend(p.memOutPos, p.memOutLen) diff --git a/nimbus/evm/interpreter/op_handlers/oph_create.nim b/nimbus/evm/interpreter/op_handlers/oph_create.nim index e57a7e8880..394016a8a1 100644 --- a/nimbus/evm/interpreter/op_handlers/oph_create.nim +++ b/nimbus/evm/interpreter/op_handlers/oph_create.nim @@ -99,11 +99,13 @@ const raise newException(InitcodeError, &"CREATE: have {memLen}, max {EIP3860_MAX_INITCODE_SIZE}") - let gasParams = GasParams( - kind: Create, - cr_currentMemSize: k.cpt.memory.len, - cr_memOffset: memPos, - cr_memLength: memLen) + let + gasAtStart = k.cpt.gasMeter.gasRemaining + gasParams = GasParams( + kind: Create, + cr_currentMemSize: k.cpt.memory.len, + cr_memOffset: memPos, + cr_memLength: memLen) var gasCost = k.cpt.gasCosts[Create].c_handler(1.u256, gasParams).gasCost k.cpt.gasMeter.consumeGas( @@ -132,6 +134,9 @@ const createMsgGas -= createMsgGas div 64 k.cpt.gasMeter.consumeGas(createMsgGas, reason = "CREATE") + gasCost = gasAtStart - k.cpt.gasMeter.gasRemaining + k.cpt.traceCallFamilyGas(Create, gasCost) + when evmc_enabled: let msg = new(nimbus_message) @@ -177,11 +182,13 @@ const raise newException(InitcodeError, &"CREATE2: have {memLen}, max {EIP3860_MAX_INITCODE_SIZE}") - let gasParams = GasParams( - kind: Create, - cr_currentMemSize: k.cpt.memory.len, - cr_memOffset: memPos, - cr_memLength: memLen) + let + gasAtStart = k.cpt.gasMeter.gasRemaining + gasParams = GasParams( + kind: Create, + cr_currentMemSize: k.cpt.memory.len, + cr_memOffset: memPos, + cr_memLength: memLen) var gasCost = k.cpt.gasCosts[Create].c_handler(1.u256, gasParams).gasCost gasCost = gasCost + k.cpt.gasCosts[Create2].m_handler(0, 0, memLen) @@ -212,6 +219,9 @@ const createMsgGas -= createMsgGas div 64 k.cpt.gasMeter.consumeGas(createMsgGas, reason = "CREATE2") + gasCost = gasAtStart - k.cpt.gasMeter.gasRemaining + k.cpt.traceCallFamilyGas(Create2, gasCost) + when evmc_enabled: let msg = new(nimbus_message) diff --git a/nimbus/evm/interpreter_dispatch.nim b/nimbus/evm/interpreter_dispatch.nim index af20b1e9ae..52a958504a 100644 --- a/nimbus/evm/interpreter_dispatch.nim +++ b/nimbus/evm/interpreter_dispatch.nim @@ -257,8 +257,8 @@ proc executeOpcodes*(c: Computation, shouldPrepareTracer: bool = true) except CatchableError as e: let msg = e.msg - depth = $c.msg.depth - c.setError("Opcode Dispatch Error msg=" & msg & ", depth=" & depth, true) + depth = $(c.msg.depth + 1) # plus one to match tracer depth, and avoid confusion + c.setError("Opcode Dispatch Error: " & msg & ", depth=" & depth, true) if c.isError() and c.continuation.isNil: if c.tracingEnabled: c.traceError() diff --git a/nimbus/evm/stack.nim b/nimbus/evm/stack.nim index 08e8de5950..6543b6fca3 100644 --- a/nimbus/evm/stack.nim +++ b/nimbus/evm/stack.nim @@ -58,7 +58,7 @@ proc ensurePop(elements: Stack, a: int) = let expected = a if num < expected: raise newException(InsufficientStack, - &"Stack underflow: expected {expected} elements, got {num} instead.") + &"Stack underflow, expect {expected}, got {num}") proc popAux[T](stack: var Stack, value: var T) = ensurePop(stack, 1) @@ -103,7 +103,7 @@ proc swap*(stack: var Stack, position: int) = (stack.values[^1], stack.values[^idx]) = (stack.values[^idx], stack.values[^1]) else: raise newException(InsufficientStack, - &"Insufficient stack items for SWAP{position}") + "Stack underflow for SWAP" & $position) template getInt(x: int): int = x @@ -114,7 +114,7 @@ proc dup*(stack: var Stack, position: int | UInt256) = stack.push(stack.values[^position]) else: raise newException(InsufficientStack, - &"Insufficient stack items for DUP{position}") + "Stack underflow for DUP" & $position) proc peek*(stack: Stack): UInt256 = # This should be used only for testing purposes! diff --git a/nimbus/evm/state.nim b/nimbus/evm/state.nim index def246f3b2..6458f42406 100644 --- a/nimbus/evm/state.nim +++ b/nimbus/evm/state.nim @@ -393,6 +393,12 @@ proc captureOpStart*(vmState: BaseVMState, pc: int, if vmState.tracingEnabled: result = vmState.tracer.captureOpStart(pc, op, gas, depth) +proc callFamilyGas*(vmState: BaseVMState, + op: Op, gas: GasInt, + depth: int) = + if vmState.tracingEnabled: + vmState.tracer.callFamilyGas(op, gas, depth) + proc captureOpEnd*(vmState: BaseVMState, pc: int, op: Op, gas: GasInt, refund: GasInt, rData: openArray[byte], diff --git a/nimbus/evm/tracer/json_tracer.nim b/nimbus/evm/tracer/json_tracer.nim index be860a8700..7b1dff8de0 100644 --- a/nimbus/evm/tracer/json_tracer.nim +++ b/nimbus/evm/tracer/json_tracer.nim @@ -29,6 +29,17 @@ type stack: JsonNode storageKeys: seq[HashSet[UInt256]] index: int + callFamilyNode: JsonNode + +const + callFamily = [ + Create, + Create2, + Call, + CallCode, + DelegateCall, + StaticCall, + ] template stripLeadingZeros(value: string): string = var cidx = 0 @@ -41,7 +52,10 @@ proc encodeHexInt(x: SomeInteger): JsonNode = %("0x" & x.toHex.stripLeadingZeros.toLowerAscii) proc `%`(x: openArray[byte]): JsonNode = - %("0x" & x.toHex) + if x.len == 0: + %("") + else: + %("0x" & x.toHex) proc writeJson(ctx: JsonTracer, res: JsonNode) = try: @@ -113,7 +127,10 @@ proc captureOpImpl(ctx: JsonTracer, pc: int, if error.isSome: res["error"] = %(error.get) - ctx.writeJson(res) + if op in callFamily: + ctx.callFamilyNode = res + else: + ctx.writeJson(res) proc newJsonTracer*(stream: Stream, flags: set[TracerFlags], pretty: bool): JsonTracer = JsonTracer( @@ -171,13 +188,34 @@ method captureOpStart*(ctx: JsonTracer, pc: int, except ValueError as ex: error "JsonTracer captureOpStart", msg=ex.msg + if op in callFamily: + try: + ctx.captureOpImpl(pc, op, 0, 0, [], depth, none(string)) + except RlpError as ex: + error "JsonTracer captureOpEnd", msg=ex.msg + + # make sure captureOpEnd get the right opIndex result = ctx.index inc ctx.index +method callFamilyGas*(ctx: JsonTracer, + op: Op, gas: GasInt, + depth: int) {.gcsafe.} = + doAssert(op in callFamily) + doAssert(ctx.callFamilyNode.isNil.not) + let res = ctx.callFamilyNode + res["gasCost"] = encodeHexInt(gas) + ctx.writeJson(res) + method captureOpEnd*(ctx: JsonTracer, pc: int, op: Op, gas: GasInt, refund: GasInt, rData: openArray[byte], depth: int, opIndex: int) {.gcsafe.} = + + if op in callFamily: + # call family opcode is processed in captureOpStart + return + try: ctx.captureOpImpl(pc, op, gas, refund, rData, depth, none(string)) except RlpError as ex: diff --git a/nimbus/evm/types.nim b/nimbus/evm/types.nim index 041075d0e3..f822513812 100644 --- a/nimbus/evm/types.nim +++ b/nimbus/evm/types.nim @@ -173,6 +173,11 @@ method captureOpStart*(ctx: TracerRef, pc: int, depth: int): int {.base, gcsafe.} = discard +method callFamilyGas*(ctx: TracerRef, + op: Op, gas: GasInt, + depth: int) {.base, gcsafe.} = + discard + method captureOpEnd*(ctx: TracerRef, pc: int, op: Op, gas: GasInt, refund: GasInt, rData: openArray[byte], @@ -188,4 +193,3 @@ method captureFault*(ctx: TracerRef, pc: int, method capturePrepare*(ctx: TracerRef, depth: int) {.base, gcsafe.} = discard - diff --git a/nimbus/vm_state.nim b/nimbus/vm_state.nim index 1bf9a52448..3d12211dca 100644 --- a/nimbus/vm_state.nim +++ b/nimbus/vm_state.nim @@ -43,6 +43,7 @@ export vms.captureEnter, vms.captureExit, vms.captureOpStart, + vms.callFamilyGas, vms.captureOpEnd, vms.captureFault, vms.capturePrepare diff --git a/tests/fixtures/TracerTests/block46402.json b/tests/fixtures/TracerTests/block46402.json index 06ee8ce705..c57749ac98 100644 --- a/tests/fixtures/TracerTests/block46402.json +++ b/tests/fixtures/TracerTests/block46402.json @@ -283,7 +283,7 @@ "0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000060" ], - "error": "Opcode Dispatch Error msg=Out of gas: Needed 20000 - Remaining 412 - Reason: SSTORE, depth=0", + "error": "Opcode Dispatch Error: Out of gas: Needed 20000 - Remaining 412 - Reason: SSTORE, depth=1", "gasCost": 0 } ], @@ -705,7 +705,7 @@ "0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000060" ], - "error": "Opcode Dispatch Error msg=Out of gas: Needed 20000 - Remaining 412 - Reason: SSTORE, depth=0", + "error": "Opcode Dispatch Error: Out of gas: Needed 20000 - Remaining 412 - Reason: SSTORE, depth=1", "gasCost": 0 } ] diff --git a/tools/t8n/helpers.nim b/tools/t8n/helpers.nim index 2af9ed9c08..7eb82eafd4 100644 --- a/tools/t8n/helpers.nim +++ b/tools/t8n/helpers.nim @@ -212,9 +212,6 @@ proc parseTx(n: JsonNode, chainId: ChainID): Transaction = required(tx, GasInt, gas) required(tx, UInt256, value) required(tx, Blob, input) - required(tx, int64, v) - required(tx, UInt256, r) - required(tx, UInt256, s) if n.hasKey("to"): tx.to = some(EthAddress.fromJson(n, "to")) @@ -248,6 +245,9 @@ proc parseTx(n: JsonNode, chainId: ChainID): Transaction = let secretKey = PrivateKey.fromRaw(data).tryGet signTransaction(tx, secretKey, chainId, eip155) else: + required(tx, int64, v) + required(tx, UInt256, r) + required(tx, UInt256, s) tx proc parseTxLegacy(item: var Rlp): Result[Transaction, string] = diff --git a/tools/t8n/t8n_test.nim b/tools/t8n/t8n_test.nim index 6f958fbd6e..1d9f0dd0bb 100644 --- a/tools/t8n/t8n_test.nim +++ b/tools/t8n/t8n_test.nim @@ -498,7 +498,7 @@ const expOut: "exp.json", ), TestSpec( - name : "EVM tracer crash bug", + name : "EVM tracer nil stack crash bug", base : "testdata/00-519", input : t8nInput( "alloc.json", "txs.json", "env.json", "Shanghai", "0", @@ -506,6 +506,15 @@ const output: T8nOutput(trace: true), expOut: "exp.txt", ), + TestSpec( + name : "EVM tracer wrong order for CALL family opcodes", + base : "testdata/00-520", + input : t8nInput( + "alloc.json", "txs.json", "env.json", "Merge", "0", + ), + output: T8nOutput(trace: true, result: true), + expOut: "exp.txt", + ), ] proc main() = diff --git a/tools/t8n/testdata/00-519/exp.txt b/tools/t8n/testdata/00-519/exp.txt index d19b3514b5..18a4ff01ba 100644 --- a/tools/t8n/testdata/00-519/exp.txt +++ b/tools/t8n/testdata/00-519/exp.txt @@ -1,2 +1,2 @@ {"pc":0,"op":0,"gas":"0x0","gasCost":"0xfffffffffffecb68","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"STOP","error":"Blake2b F function invalid input"} -{"output":"0x","gasUsed":"0x13498","error":"Blake2b F function invalid input"} +{"output":"","gasUsed":"0x13498","error":"Blake2b F function invalid input"} diff --git a/tools/t8n/testdata/00-520/alloc.json b/tools/t8n/testdata/00-520/alloc.json new file mode 100644 index 0000000000..5018908f7a --- /dev/null +++ b/tools/t8n/testdata/00-520/alloc.json @@ -0,0 +1,237 @@ +{ + "0x0000000000000000000000000000000000000000": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x0000000000000000000000000000000000000001": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x0000000000000000000000000000000000000002": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x0000000000000000000000000000000000000003": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x0000000000000000000000000000000000000004": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x0000000000000000000000000000000000000005": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x0000000000000000000000000000000000000006": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x0000000000000000000000000000000000000007": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x0000000000000000000000000000000000000008": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x0000000000000000000000000000000000000009": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x000000000000000000000000000000000000000a": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x000000000000000000000000000000000000000b": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x000000000000000000000000000000000000000c": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x000000000000000000000000000000000000000d": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x000000000000000000000000000000000000000e": { + "balance": "0x1", + "code": "0x", + "nonce": "0x0", + "storage": { + } + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "0x0", + "code": "0x6000600060006000600060f35af15098871a1232658c60206000f3", + "nonce": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000009": "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000002" + } + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "0x0", + "code": "0x2060206000f3", + "nonce": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000002" + } + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "0x0", + "code": "0x0b50fe43328260026004556000600060006000600c5af4509a6c7067fd9a60026004557f60075450600260015560045450600160015560026004556008545060065450606000527e600055600254506009545060016003556002545060006000556004545060026020527f60015560025450600354506003545060026000556060600053600060015360546040527f6002536050600353606060045360206005536060600653600060075360fd60086060526053608053606060815360096082536060608353600060845360f3608553608660006000f06000600060006000845af45050600060006000600060005af4507f60055450600054506002545060025450600254506000600255600954506001606000527f02556001600255600060035560065450600154506001545060006001556001606020527e557f191b90408a1d8d859bfd60006000600060006000600c5af25068b060766040527f6efd7a6000527f8d6000600060006000600060f55af1506efd059c60006000606060527e6000600060f36020527f5af15060016003556f7b1c66903f928f686c12543e6080527f5b59f0b1a27160006000606040527e60006000600d5af250600154500643694560a0527f291097b09d6360006000600060006060527f600060f45af25060026003550e6660c0527f8747933f1560006000600060006000600e5a60805260f260a053605060a1536060e05260606101005360606101015360a26101025360536101035360606101045360206101055360606101065360a361010753605361010853606061010953606061010a53606061010b5360a461010c53605361010d53606061010e53600061010f5360606101105360a56101115360536101125360606101135360f36101145360606101155360a66101165360536101175360606101185360a761011953606061011a53600061011b5360f361011c5361011d60006000f060006000600060006000855af25050", + "nonce": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000010" + } + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "0x0", + "code": "0x60206000fd", + "nonce": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x0000000000000000000000000000000000000000000000000000000000000011" + } + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "0x0", + "code": "0x43f5448cb13c600060006000600060065af4506004ff60006001557f600954507f60faff414009198a640960413965a4b08703543a5960015450b1006000527f5435b012076000527f017f6002600255600060035560026000556002545060006020527f5450600654506060606020527e536000527f60006001536060600253600060036040527f5360606004536000600553606040527f6060065360006020527f6007536060606060527f085360f6600953605a600a5360f4600b6060527f536050600c536060600d60406080527f52605360605360606061536020606253606060636080527f53600e606453605360a0527f606553606060665360606067536060606853600f6069536060a0527f53606a5360c0527f6060606b536000606c536060606d536010606e536053606f5360606060c0527f60e0527f705360f360715360606072536011607353605360745360606075536012607653610100527f60e0527f6060607753600060785360f3607953607a60006000f0600060006000610120527f60006000610100527f855af25050f0b9355d7ae56c7f3f36f2779e7f7f6c7f60610140527f026002556006545060610120527f085450600254506001545060025450600454610160527f506000527f606000527f02546000610140527f527f5060095450600060045560610180527e5450600054506000606020527f0255600260610160527f6020527e557f60026101a0527f606020527f0455995b377d3b36f1657f6060606040527e53610180527f6000606101c0527f0153606040527f606002536000606000526040527f7f035360606060606101a06101e0527f527f527f0453600060055360606000526060527f7f6006536000600753606060610200527f08536101c0527f60606080527f527f606020527e6009536060600a5360608052610220527f7e600b53605a606101e0527f0c6020527f5360a0527f60f2600d536080527f60610240527f50600e6040527f536060a052610200527f7f60600f53602060105360c0527f60610260527f60601153600060125360604060a0527f52610220527f60fd60605360c0527f60610280527f6060605260e0527f7f60615360136062536053606353610240527f60606064536102a0527f601460c0527f606560e0527f53610100527f606060665360006067610260527f6102c0527f6080527f5360f36068536000606960006000f56060e061610120527f0100527f6102e0527f610280527f527e6000600060006000855af25050709060a0527f7f9df56a767a610300527f60610140526102a0527f7e600060610120527e610100527f600060075af4507f610320527f600554506001600055606102c0527f610160527f016060c0527f025561014052610340527f7f600654506002610120527f6001556102e0527f600154507f610180527f7f60610360527f01606000527f0255600060610160527f03556060610300527fe0527f05545060610380527f6101406101a0527f527f015450600354506000600255600060610320527e61016103a0527f80527f6000527f6020527f556101c0527f60005261010052610160527f6103406103c0527f527f7f7f6000545060026002556101a0527f600054506101e0527f7ff456927c6103e0527f2016610360527f8a013d823f7552604052610180527f7f610120527f6101c052610400527f610200527f7f60610380527f20527f6007ff60006020527f6000600060006000610420527f60055af1506101a0527f61026103a0527f20527f7a6101e0527f6000527f7a61610440527f0140527f6060527f47786f876040527fc86103c0527f600260610240527e5565610460527f438b61610200527f01c0527f6040527f95a417927f606103e0527f0161016052610480527f7f60610260527f01557f6080527f60006000610220527f60006060610400527f6104a0527f6101e0527f6060527f20527e610280527f60f55af45060016000610180527f556104c0527f610420527f60610240527f60527f60006060a05261026102a0527e527f7e60006104e0527f6000600052610440527f7f60f65a6080527ff450610260527f7f60006101a061610500527f02c0527f527f52604052610460527f7f7f610220527f600554506060c0527f02610520527f608052610280527f7f6102e0527f60610480527e556002600155600554606101610540527fc0527fa0610240527f527f50600254506061616104a0527f0300527f02a0527f610560527f20527f60026060e0527f04556060527f60075460a0527f616104c0527f610260610580527f52610320527f7f01e0526102c0527f7f50606020527f6060c0527e527f6104e06105a0527f527f026002556002610100610340527f527f545060006102806102e0527f527f6105c0527f6001610500527f5560610200527f6040527f606080610360527f5260c0527f7f6105e0527f600060e0527f53610520527f60610300527f01606102a0527f01610120527f61610600527f0380527f536060610220527f610540527f6002536040527f6001600361032052610620527f7f6020527f536055616103a0527f02c052610560527f7f60045360e052610100610640527f527f610140610240527f52610340527f7f7f606103c0610580527f527f60a052610660527f7f60527f60c56102e0527f600553605060065360406007536065616105a0527f610680527f03606103e0527f527f60606052610260527f7f08610160527f61610300527f016106a0527f6105c0527f20527f53610100610400527f527f610380527f609960095360c0526106c0527f7f606040606105e0527f80610280527f527f52610320610420527f527f7f31606106e0527f0a616103a0527f018052610600527f7f536060600b610140527f536020600c53610700527f610440527f610120526102a0610340610620527f527f6103c0527f527f7f6060610720527f600d536060805260e061610460527f01a0527f52610640527f7f7e600e5360f3610740527f60606101606103e0527f610360527f527f6102c0610480527f610660527f527f610760527fa0527f0f53601060606052610140527f606101c0610400527f527e6080536106610780527f80527f6104a0527f610380527f60f360815360826102e0527f606101006101806107a0527f527f526106a0527f610420527f6104c0527f7e6000f060a0527f60006103a0526107c0527f7f606101e0527f606106c0527fc0527e6101610300527f6104e0527f610440526107e0527f7f60527f600060006000855af26106e0527f5050616103c0527f01a0527f6007610800527fff610500527f5a5b1b6161610460527f0200610700527f527f01610320527f20610820527f527f83a491453f61606103610520527fe0527f02600261610720527f01805261610840527f0480527f7f5560c05260e06101c0527f5260616103610540527f405261074052610860527f7f7f0220527f60610400527f61016104a0527e53606061010153606061610161610880527f05610760527f60527f40527f01025360e06101a052610360527f61046104c0526108a0527f7f20527f7f61610780527f610161610580527f0240527fe0527f0103536053616108c0527f01045360606101055360206107a0527f6104e0527f6101066105a0527f6104406108e0527f527f610380527f5360606101076101606107c0527f610260527f527f61610261610900527f05006105c0527f527e527f01c0527f53610460527f6107e0527f60e161010861610920527f03a0527f53605361010953606105e0527f60610520527f61010a610800527f53610940527f60610280527f606101610480527f0b53606061610220610600527f527f610361610960527f0820527fc052610540527f7f010c53606101e0527f610180527fe261016104a0610980527f61062052610840527f7f527f0d536102a0527f6053610560527f61010e5360606109a0527f6103e0527f61010f53610860527f60610640527f610240527e61016104c0527f6109c0527f10536060610580527f6101610200610880527f527f116102c0610660527f527f6109e0527f5360e3610400527f616101a0527f016104e0526108a0527f6105a0527f7f1253610a00527f605361610680527f0113610260527f5360606101145360fd6108c0527f616102610a20527fe0610420527f526105c0527f7f6106a0527f610500527f0115536061026108e0610a40527f527f20527f606101165360e46101176101c061028052616106c0527f05e0527f610a60527f7f52610900527f7f536104610520527f40527f6053610300527f610118536060610a80527f616106e0527f01610920527f195360610600527fe56101610240527f1a536061610aa0527f0540527f6061016104605261610940527f0700527f7f1b536102a0527f616106610ac0527f20527f0320527f600061011c53606101e0610960527f52606105610720527f60610ae0527f527ff361020053606161610480610640527f527f0201610980527f5360610260610b00527f527f0161610740527f02610340527f6102610580527fc0527f02536109a0527f610b20527f60610660527f1d61020353605361610760527f04a0527f610204536061610205610b40527f6109c0527f53600161026105a0527f06610680527f536061610780527f036052610b60527f7f1e6161026109e0527f806102e0527f6104c0527f527f020753606061026161610b80527f06a06107a0527f527f05610a00527fc0527f0853600061020953606061020a61610ba0527f0380527f53600061026104e06107c0610a20527f527f527f6106c0527f0b5360610bc0527ff06105e0527f61610300527f020c6102a0527f53610a40527f60606107e0527f610be0527f61020d536000616106e0527f6103a0527f6105005261060052610a60527f7f7f610c00527f020e536060610800527f61020f536000610210536103610700527f20527f610a610c20527f80527f606061021153606102c05261610820527f0620527f7e610520527f6103610c40527fc0527f610aa0527f6102610720527f12536060610213536000610840527f6102610c60527f1453606061026161610ac0527f0640527f0340527f15536105610740527f4052610c80527f7f6000610860527f6102166103610ae0527fe0527f536085616102e0527f0217610ca0527f610660527f53605a610760527f610880527f610b00527f6102185360f1610261610cc0527f0560527f195360610360527f5061610400527f02610680610b20527f6108a052610ce0527f7f610780527f527f1a53605061021b5361021c600061030061058052610b4052610d00527f7f7f5260f3616108c0527f03205360006107a0527f61036106a0527f21606103610d20527f61610b60527f0420527f8052600061036108e0527fa053606061036105a05261610d40527f07c0527f7fa1610b80527f53600061036106c0527fa25360f561610900527f03610d60527fa35360606103a453610440610ba0527f527f606107e0527e6103a553606105c0610d80527f527f6061610920527f06e0527f6103a6610bc0527f5360006103a75360606103610da0527fa8610800527f5360006103a95360610940527f6061610be0527f0460527f6103610dc0527f61610700527f05e0527faa5360006103610820527fab53606109610c00527f60610de0527f527f606103ac5360006103ad5360856103ae53605a610720527f610361046161610e00527f0c20527f610840610980527f527f0600527f805260af6104a05360536104a153610e20527f60606104610c40527fa25360f1616107406109a0527f527f610860527f04a353610e40527f60616104a453610620610c60527f527f60036104a55360b06104a66109c0527f610e60527f5360536104a753610880527f6107610c80527f60527f60606104a85360506104610e80527fa9536061616109e0527f0640527f6104aa5360610ca0527f0361046108a0527f610ea0527fab5360b161610780527f04ac536053610a00527f6104ad53610cc0527f606061610ec0527f04ae53605061046106606108c0527f527faf5360616104b053610a2052610ce0610ee0527f527f7f6107a0527f60036104b15360b26104b25360536104b36108e0527f5360610f00527f6161610d00527f04610a40527fb453610680527f6003616107c0527f04b55360610f20527fb36104b6536060610d20527f61610900527f610a60527f04b75360006104b853610f40527f60f36104b95361046106a061610d40527f07e0527f5260ba6106c053610a8052610f60527f7f610920527f60606106c15360006106c2610d60527f5360606106c353600061610f80527f06c453606108610aa0527e527ff061610940527f06c5610d80527f5360606106610fa0527fc65360006106c75360606106c85360610ac0527e6106c953606061610da0527f610fc0527f6108610960527f20527f06ca5360006106cb5360606106cc610ae0527f536000610fe0527f610dc0527f6106cd5360846106ce53605a610980527f6106cf61084052605361611000527f0860610b00610de0527f527f5360606108615360f46108625360616108635360611020527f6109a0527f0661086453610e00527f60d0610b20527f61086553605361086653611040527f606061086753605061086853606161610e20527f6109c0527f0869610b40527f611060527f53600661086a5360d161086b53605361086c5360610e40527f6061086d536050611080527f61086e6109610b60527fe0527f53606161086f536006610870610e60527f53606110a0527fd26108715360536108725360616108610b80527f735360610a00527f0661610e6110c0527f80527f08745360d36108755360606108765360006108775360610ba0527ff3616110e0527f087853610ea0527f610879610a20526060610a40536000610a41536060610a42611100527f536000610bc0527f610ec0527f610a435360f0610a44536060610a4553600061611120527f0a46536060610a47536000610a610ee0527f610be0527f48536060610a495360611140527e610a4a536060610a4b536000610a4c5360610f00527f84610a4d53610c0052611160527f6060610c2053605a610c21536061610c2253600a610c23610f20527f53604e61611180527f0c24536053610c25536060610c265360f4610c27536061610c285360610f40526111a0527f7f0a610c2953604f610c2a536053610c2b536060610c2c536050610c2d5360616111c0527f61610f60527f0c2e53600a610c2f536050610c30536053610c31536060610c326111e0527f536050610c33610f80527f536061610c3453600a610c35536051610c36536053611200527f610c37536061610c385360610fa0527f0a610c39536052610c3a536060610c3b611220527f536000610c3c5360f3610c3d53600061610fc052600c610fe053603e610fe153611240527f6060610fe2536000610fe3536060610fe4536000610fe55360f5610fe6536060611260527f610fe7536000610fe8536060610fe9536000610fea536060610feb536000610f611280527fec536060610fed536000610fee536084610fef53605a610ff05360f4610ff1536112a05260606112c05360506112c15360616112c253600f6112c35360f26112c45360536112c55360606112c65360506112c75360616112c853600f6112c95360f36112ca5360536112cb5360616112cc53600f6112cd5360f46112ce5360606112cf5360006112d05360f36112d1536112d260006000f060006000600060006000855af25050", + "nonce": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x0000000000000000000000000000000000000000000000000000000000000009": "0x0000000000000000000000000000000000000000000000000000000000000005" + } + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "0x0", + "code": "0x6008ff60206000f3", + "nonce": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "0x0", + "code": "0x611d3d9c03a45a5c7f600160045560055450600260005560085450600054507f6005ff6002600055306000527f77f03d5c5ffd600dff60015450600060006000600060006000527f60005af2506020527f6001600355991663a260326761989138786009ff6005ff600dff606020527e606040527e600060006000600d5af25060015450600060006000600060f65af4500a60406060527f527f14648835041c200995137e635e387d04466e047f600060005560006001556080527f60416060527f60005360f36001536015600253606060035360026000527f600460a0527f5360546005536080527f6050600653606060075360206008536060600953600060c0527f600a602052605360405360a0527f606060415360fd6042536060604353600b6060e0527f445360536045536060604653600c60c0527f6047536060604853600060495360610100527ff3604a53604b60006000f06000600060006060e0527e845af45050379f3d89f5610120527f9815f360025450083a6fa37333a4920a82177b355e610100527f7f7f60016003610140527f55600160005560025450600060006000600060035af450d76000610120527f60610160527f6000527e6000527f6000600060f35af450391a01629c9ba23760006000600061610180527f0140527f600060006020527f60f95af2506020527f600454507f6001600155606101a0527f7f600053610160527f602060015360a3606040527f02536059600353601c60406101c0527f527f600453603d6000610180527f527f600553601160065360366060527f60076101e0527f53609860085360b06009536060526101a0527f7f6060600a536000600b602052610200527f7f53606080527f60600c536000600d536055606101c0527f0e53606060608052610220527f7f0f5360206010536060601160a0527f53606040526000606101e0527f605360610240527f6060615360126062536060a0527f5360635360606060c0527f645360f3610200610260527f527f60655360606066536013606753605360685360606060c0527f69536060e0610280527f527f610220527f14606a536060606b536000606c5360f3606d536000606e60006102a0527f6000f56060e052610240527f610100527f7e6000600060006000855af25050606102c0527e600060006000600060055a610260527ff250602060610120526061610140536102e0527f6001610141536000610142536052610143610280527f53606061014453600061610300527f014553606161014653600161014753602061014853606102a0527f5361014953610320527f606061014a5360f361014b53606161014c53600161014d536021616102c0527f610340527f014e53605361014f536061610150536001610151536022610152536060610153610360527f6102e0527f5360006101545360f36101555361015660006000f0600060006000610380527f600060008561030052605a6103205360f26103215360506103225360506103236103a05260536103c05360616103c15360036103c25360246103c35360606103c45360006103c55360f36103c65360006103c760006000f56000600060006000845af45050", + "nonce": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x000000000000000000000000000000000000000000000000000000000000000a" + } + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "0x0", + "code": "0x60206000f3", + "nonce": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000009": "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000006" + } + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "0x0", + "code": "0x1d3d04b1f3f2966002600355056efe09837760016003557f60016001556002600355600260035560026001557f804233068cff077f6005546000527f5060015450600260035560026000556002600055606000527f095450606060006020527f536000526060602053602060215360606022536001602353606020527f5360246040527f53606060255360606026536060602753600260285360536029536060606040526060527f7f2a536000602b536060602c536003602d536053602e536060602f5360fd60306080527f536060527f60606031536004603253605360335360606034536005603553606060a0527f60365360006080527f60375360f36038536000603960006000f560006000600060c0527f60006000855af1505060a0527f600060006000600060f95af45060006000600060e0527f6000600060015af1500a707f6e60c052606060e053602060e153606060e253606101005260006101205360606101215360e36101225360536101235360606101245360fd6101255360606101265360e46101275360536101285360606101295360e561012a53606061012b53600061012c5360f361012d53600061012e60006000f56000600060006000845af450505b486805329e62a09b06fe483e5c6000600060006000600060f15af15060006000600060006000600a5af15060035450", + "nonce": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000b": "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x000000000000000000000000000000000000000000000000000000000000000d": "0x000000000000000000000000000000000000000000000000000000000000000a" + } + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "0x0", + "code": "0x6009ff6001545060006000556000600255600060006000600060035af450600154507b4387a47673355c5a66600060035560015450e43e600254507f60035450600154506000600055600554507f60faffd2600060006000600060f16000527f5af4507f60006004556001600155600554506000527f600454507f753108636c6020527f60006000600060006000527f60f15af45060006004556020527f6000600060006040527f6000606000527e600a5af150600060006020527f60006000600d6040527f5af46060527f506003ff4530196c8573af35133f6020527f653444085cf56040527f726060606080527f527e54507f7f600054506000600060006000600060005af1506040527f7f606060a0527f606080527f527f0260025560016004557f6000527f606000527f016003558c4160c0527f828d1b600460a0527f60606080527f527f54507f7f60026003556000527f600060e0527f606020527f0355600360c0527f546020527f5060a0527f60006080527f600052610100527f7f600060006000600060015af260e0527f506000606040527e602060c0527f52610120527f7f527fff6060a0527f6040527e527f6001610100527f5450600060006020527f610140527f6000600060e0527f606060527e60035af25060c0527f610120527f6a60604052610160527f7e6060527f6000600060602052610100527f7e6000600660205260610140527f610180527f80527f605a60e0527f6040527f60405360f26041536060610120527f6080527f6101a0527f610160527f60527f50604253606060435360a0610100527f527f6000604460406101c0527f5261014052610180527f7f7f5360606045536060527f600060a0527f604653606101e0527f8052610120527f7f60606101a0527fc0610160527f527f606047536000604853610200527f60606049536000604a53606060527f6101c0527f60c061014052610180527f7f610220527f527f6060608060e0527f527f4b60a0527f5360006101e0527f604c536060604d610240527f5360f1606101a0527f4e610160527f53605a604f5360e0527f610200527f6101610260527e527f60f16050536050606080606101c0527f60c0527fa052610180527f6102610280527f20527f7f527f515360606052536020605353610120527f616101e0527f0100526102a0527f7f6060610240527f60545360006101a0527f60555360fd60565360e0527f60576102c0527f6060610200527fc0610260527f527ef3610140527f60a052600061016101c0526102e0527f7f20527f60c060006000f56061610280527f0220527e6000600060006000855a610300527f610100610160527f527f6101e0527ff250506102a0527f813a54610240527f60610320527fe0610140527f52609461010053606461010153606061016102c0527f61016102610340527e527f80610260527f527f02536002610103610120527f53605461016102e052610360527f7f60527f61010453605061010561610280527f0220527f53608e6101a0527f61610380527f01610300527f0653607161010753609861010853606101406102a0527f6101806103a0527f52610240527f610320527f7f527f81610109536101c0527f608b61010a5360f56103c0527f61016102c0527f0b53603b610340527f61010c5360610260527fb161010d53606103e0527f6101a0527ff5616101e0527f6102e052610360527f7f610160527f010e53609b610400527f61010f53610280527f606061011053602061011153610380527f60610300527f610420527f6061016101610200527fc0527f1253600061016102a0527f13616103a0527f01610440527f8052605361610320527f01a05360606101a15360fd6101a253610220527f6061610460527f03c0527f6161616102c0527f01e052610340527f7f01a35360016101a4536014610480527f6101a5536103e0527f60536101a653606161610240526102e0610360527f527f6104a0527f7f01a75360016101a8610400527f610200527f5360156101a95360606101aa536104c0527f600061610380527f01ab61030052610420527f7f53610260527f60f36101ac536104e0527f60006101ad60006102205260606103a0527f61610440527f0240536000616103610500527f20527f02415360f561610280527f02425360606102435361610460527f03c052610520527f7f600061024453606061024553610340527f6000610246536060610247610480610540527f527f6102a0526103e0527f7f5360006102485360606102495360006161036052610560527f7f026104a0527f4a53606061024b5360610400527e61024c53606102c0527f85610580527f61024d53605a616104c0527f024e53610380527f60f261024f610420527f53606105a0527f5061025053605061025153616104e0527f02526102e0526060610300536061036105c0527fa0527e610440527f6103015360f3610302610500527f5361030360006000f0606105e0527e6000600060006000855af161610460526003610480610520527f5360c06104610600527f815360526104825360606104835360506104845360616104855360610540527f610620527f036104865360e061048753605361048853606061048953605061048a53606161610640527f610560527f048b53600361048c5360e161048d53605361048e53606161048f53610660527f6003610490610580527f5360e26104915360606104925360006104935360f361610680527f049453600061049560006105a05260606105c05360006105c15360f56105c2536106a0527f60606105c35360006105c45360606105c55360006105c65360606105c75360006106c0527f6105c85360606105c95360006105ca5360846105cb53605a6105cc5360f461056106e05260cd6107005360536107015360606107025360506107035360616107045360056107055360ce61070653605361070753606061070853605061070953606161070a53600561070b5360cf61070c53605361070d53606161070e53600561070f5360d06107105360606107115360006107125360f36107135361071460006000f060006000600060006000855af15050", + "nonce": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000009": "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + }, + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0xffffffffff", + "code": "0x", + "nonce": "0x0", + "storage": { + } + } +} diff --git a/tools/t8n/testdata/00-520/env.json b/tools/t8n/testdata/00-520/env.json new file mode 100644 index 0000000000..757baa1d61 --- /dev/null +++ b/tools/t8n/testdata/00-520/env.json @@ -0,0 +1,9 @@ +{ + "currentBaseFee": "0x10", + "currentCoinbase": "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentGasLimit": "0x26e1f476fe1e22", + "currentNumber": "0x1", + "currentTimestamp": "0x3e8", + "currentRandom": "0x0000000000000000000000000000000000000000000000000000000000020000", + "currentDifficulty": "0x0", +} diff --git a/tools/t8n/testdata/00-520/exp.txt b/tools/t8n/testdata/00-520/exp.txt new file mode 100644 index 0000000000..80c82bc4fd --- /dev/null +++ b/tools/t8n/testdata/00-520/exp.txt @@ -0,0 +1,12 @@ +{"pc":0,"op":96,"gas":"0x79bf88","gasCost":"0x3","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":2,"op":96,"gas":"0x79bf85","gasCost":"0x3","memSize":0,"stack":["0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":4,"op":96,"gas":"0x79bf82","gasCost":"0x3","memSize":0,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":6,"op":96,"gas":"0x79bf7f","gasCost":"0x3","memSize":0,"stack":["0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":8,"op":96,"gas":"0x79bf7c","gasCost":"0x3","memSize":0,"stack":["0x0","0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":10,"op":96,"gas":"0x79bf79","gasCost":"0x3","memSize":0,"stack":["0x0","0x0","0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":12,"op":90,"gas":"0x79bf76","gasCost":"0x2","memSize":0,"stack":["0x0","0x0","0x0","0x0","0x0","0xf3"],"depth":1,"refund":0,"opName":"GAS"} +{"pc":13,"op":241,"gas":"0x79bf74","gasCost":"0x77d89f","memSize":0,"stack":["0x0","0x0","0x0","0x0","0x0","0xf3","0x79bf74"],"depth":1,"refund":0,"opName":"CALL"} +{"pc":0,"op":11,"gas":"0x77ce77","gasCost":"0x5","memSize":0,"stack":["0x0"],"depth":2,"refund":0,"opName":"SIGNEXTEND","error":"Opcode Dispatch Error: Stack underflow, expect 2, got 0, depth=2"} +{"pc":14,"op":80,"gas":"0x1e6d5","gasCost":"0x2","memSize":0,"stack":["0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":15,"op":152,"gas":"0x1e6d3","gasCost":"0x3","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"SWAP9","error":"Opcode Dispatch Error: Stack underflow for SWAP9, depth=1"} +{"output":"","gasUsed":"0x79bf88","error":"Opcode Dispatch Error: Stack underflow for SWAP9, depth=1"} diff --git a/tools/t8n/testdata/00-520/txs.json b/tools/t8n/testdata/00-520/txs.json new file mode 100644 index 0000000000..ba5458bf20 --- /dev/null +++ b/tools/t8n/testdata/00-520/txs.json @@ -0,0 +1,14 @@ +[ + { + "type": "0x0", + "chainId": "0x1", + "nonce": "0x0", + "gasPrice": "0x10", + "gas": "0x7a1200", + "to": "0x00000000000000000000000000000000000000f1", + "value": "0x54afed", + "input": "0xf9ddd3baf78a80", + "secretKey": "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + } +]