From a942318919838fd6751a938db6043847475fe2d3 Mon Sep 17 00:00:00 2001 From: Eduard Voiculescu Date: Wed, 15 May 2024 15:35:48 -0400 Subject: [PATCH] adding test for missing nonce in the transactions traces --- .../tracetest/firehose/firehose_test.go | 1 + .../firehose/generate-prestate/main.go | 260 ++++++++++++++++++ .../block.120096000.golden.json | 159 +++++++++++ .../deposit_nonce_check/prestate.json | 89 ++++++ 4 files changed, 509 insertions(+) create mode 100644 eth/tracers/internal/tracetest/firehose/generate-prestate/main.go create mode 100644 eth/tracers/internal/tracetest/firehose/testdata/TestFirehosePrestate/deposit_nonce_check/block.120096000.golden.json create mode 100644 eth/tracers/internal/tracetest/firehose/testdata/TestFirehosePrestate/deposit_nonce_check/prestate.json diff --git a/eth/tracers/internal/tracetest/firehose/firehose_test.go b/eth/tracers/internal/tracetest/firehose/firehose_test.go index e157a48b63b1..9c1bce7c9037 100644 --- a/eth/tracers/internal/tracetest/firehose/firehose_test.go +++ b/eth/tracers/internal/tracetest/firehose/firehose_test.go @@ -72,6 +72,7 @@ func TestFirehosePrestate(t *testing.T) { testFolders := []string{ "./testdata/TestFirehosePrestate/keccak256_too_few_memory_bytes_get_padded", "./testdata/TestFirehosePrestate/failed_deposit", + "./testdata/TestFirehosePrestate/deposit_nonce_check", } for _, folder := range testFolders { diff --git a/eth/tracers/internal/tracetest/firehose/generate-prestate/main.go b/eth/tracers/internal/tracetest/firehose/generate-prestate/main.go new file mode 100644 index 000000000000..fa88ee29b014 --- /dev/null +++ b/eth/tracers/internal/tracetest/firehose/generate-prestate/main.go @@ -0,0 +1,260 @@ +package main + +import ( + "context" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "math/big" + "os" + "strings" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + "golang.org/x/exp/maps" +) + +var configByName = map[string]*params.ChainConfig{ + "mainnet": params.MainnetChainConfig, + "goerli": params.GoerliChainConfig, + "sepolia": params.SepoliaChainConfig, + "holesky": params.HoleskyChainConfig, + "optMainnet": nil, +} + +func main() { + optMainnetConfig, err := params.LoadOPStackChainConfig(params.OPMainnetChainID) + noError(err, "Failed to load OPStack mainnet chain config") + configByName["optMainnet"] = optMainnetConfig + + ensure(len(os.Args) == 3, "Usage: generate-prestate ") + + config, found := configByName[os.Args[1]] + ensure(found, "Unknown network %q, valid networks are %q", os.Args[1], strings.Join(maps.Keys(configByName), ", ")) + + endpoint := os.Getenv("ARCHIVE_ENDPOINT") + ensure(endpoint != "", "ARCHIVE_ENDPOINT environment variable is not set") + + txHash := common.HexToHash(os.Args[2]) + ensure(txHash.Big().Sign() != 0, "Argument %q is not a valid transaction hash", os.Args[1]) + + client, err := rpc.DialOptions(context.Background(), endpoint) + noError(err, "Failed to connect to RPC server") + + log("Fetching transaction %q...", txHash.Hex()) + tx, blockHash, err := transactionByHash(context.Background(), client, txHash) + noError(err, "Failed to get transaction %q by hash", txHash) + + log("Fetching block %q...", txHash.Hex()) + block, err := blockByHash(context.Background(), client, blockHash) + noError(err, "Failed to get block %q by hash", blockHash) + + log("Fetching parent block %q...", txHash.Hex()) + parentBlock, err := blockByHash(context.Background(), client, block.ParentHash()) + noError(err, "Failed to get parent block %q by hash", block.ParentHash()) + + log("Collecting transaction prestate trace...") + var prestateTrace types.GenesisAlloc + err = client.Call(&prestateTrace, "debug_traceTransaction", txHash, map[string]interface{}{ + "tracer": "prestateTracer", + }) + noError(err, "Failed to trace transaction %q with prestateTracer", txHash) + + prestateTest := &PrestateTest{ + // Our genesis block is the parent block + Genesis: parentBlock, + Block: block, + Alloc: prestateTrace, + Config: config, + Tx: tx, + } + + output, err := json.MarshalIndent(prestateTest, "", " ") + noError(err, "Failed to marshal prestate test to JSON") + + fmt.Println(string(output)) +} + +type PrestateTest struct { + Genesis *rpcBlock + Block *rpcBlock + Alloc types.GenesisAlloc + Config *params.ChainConfig + Tx *types.Transaction +} + +func (b *PrestateTest) MarshalJSON() ([]byte, error) { + genesis := b.Genesis.Fields + + for k, v := range genesis { + if v == nil { + delete(genesis, k) + } + } + + delete(genesis, "gasUsed") + delete(genesis, "logsBloom") + delete(genesis, "parentHash") + delete(genesis, "receiptsRoot") + delete(genesis, "sha3Uncles") + delete(genesis, "size") + delete(genesis, "transactions") + delete(genesis, "transactionsRoot") + delete(genesis, "uncles") + + genesis["gasLimit"] = hexToIntegerString(genesis["gasLimit"].(string)) + genesis["number"] = hexToIntegerString(genesis["number"].(string)) + genesis["timestamp"] = hexToIntegerString(genesis["timestamp"].(string)) + genesis["difficulty"] = hexToIntegerString(genesis["difficulty"].(string)) + genesis["totalDifficulty"] = hexToIntegerString(genesis["totalDifficulty"].(string)) + + if found := genesis["baseFeePerGas"]; found != nil { + genesis["baseFeePerGas"] = hexToIntegerString(genesis["baseFeePerGas"].(string)) + } + + marshaledAlloc, err := json.Marshal(b.Alloc) + if err != nil { + return nil, err + } + + var allocOut map[string]any + if err = json.Unmarshal(marshaledAlloc, &allocOut); err != nil { + return nil, err + } + + for _, account := range allocOut { + details := account.(map[string]any) + for k, v := range details { + if k == "nonce" { + details["nonce"] = hexToIntegerString(v.(string)) + } + } + } + + genesis["alloc"] = allocOut + genesis["config"] = b.Config + + context := map[string]any{ + "number": hexToIntegerString(b.Block.Fields["number"].(string)), + "difficulty": hexToIntegerString(b.Block.Fields["difficulty"].(string)), + "timestamp": hexToIntegerString(b.Block.Fields["timestamp"].(string)), + "gasLimit": hexToIntegerString(b.Block.Fields["gasLimit"].(string)), + "miner": b.Block.Fields["miner"], + } + + if found := b.Block.Fields["baseFeePerGas"]; found != nil { + context["baseFeePerGas"] = hexToIntegerString(b.Block.Fields["baseFeePerGas"].(string)) + } + + txBytes, err := b.Tx.MarshalBinary() + noError(err, "Failed to marshal transaction to binary") + + out := map[string]any{} + out["genesis"] = genesis + out["context"] = context + out["input"] = "0x" + hex.EncodeToString(txBytes) + + return json.Marshal(out) +} + +func hexToIntegerString(in string) string { + value := math.HexOrDecimal256{} + noError(value.UnmarshalText([]byte(in)), "Failed to parse hex value %q", in) + + return (*big.Int)(&value).String() +} + +type CallTrace struct { + From string `json:"from"` + Gas string `json:"gas"` + GasUsed string `json:"gasUsed"` + To string `json:"to"` + Input string `json:"input"` + Value string `json:"value"` + Type string `json:"type"` + Output string `json:"output,omitempty"` + + Calls []CallTrace `json:"calls"` +} + +func blockByHash(ctx context.Context, ec *rpc.Client, hash common.Hash) (*rpcBlock, error) { + var out rpcBlock + err := ec.CallContext(ctx, &out.Fields, "eth_getBlockByHash", hash, false) + if err != nil { + return nil, err + } else if out.Fields == nil { + return nil, ethereum.NotFound + } + + return &out, nil +} + +type rpcBlock struct { + Fields map[string]any +} + +func (b *rpcBlock) ParentHash() common.Hash { + return common.HexToHash(b.Fields["parentHash"].(string)) +} + +func transactionByHash(ctx context.Context, ec *rpc.Client, hash common.Hash) (tx *types.Transaction, blockHash common.Hash, err error) { + var json *rpcTransaction + err = ec.CallContext(ctx, &json, "eth_getTransactionByHash", hash) + if err != nil { + return nil, common.Hash{}, err + } else if json == nil { + return nil, common.Hash{}, ethereum.NotFound + } else if _, r, _ := json.tx.RawSignatureValues(); r == nil { + return nil, common.Hash{}, errors.New("server returned transaction without signature") + } + + if json.BlockHash == nil { + return nil, common.Hash{}, errors.New("server returned transaction without block hash") + } + + return json.tx, *json.BlockHash, nil +} + +type rpcTransaction struct { + tx *types.Transaction + txExtraInfo +} + +type txExtraInfo struct { + BlockNumber *string `json:"blockNumber,omitempty"` + BlockHash *common.Hash `json:"blockHash,omitempty"` + From *common.Address `json:"from,omitempty"` +} + +func (tx *rpcTransaction) UnmarshalJSON(msg []byte) error { + if err := json.Unmarshal(msg, &tx.tx); err != nil { + return err + } + return json.Unmarshal(msg, &tx.txExtraInfo) +} + +func log(message string, args ...interface{}) { + fmt.Fprintf(os.Stderr, message+"\n", args...) +} + +func ensure(condition bool, message string, args ...interface{}) { + if !condition { + quit(message, args...) + } +} + +func noError(err error, message string, args ...interface{}) { + if err != nil { + quit(message+": "+err.Error(), args...) + } +} + +func quit(message string, args ...interface{}) { + fmt.Printf(message+"\n", args...) + os.Exit(1) +} diff --git a/eth/tracers/internal/tracetest/firehose/testdata/TestFirehosePrestate/deposit_nonce_check/block.120096000.golden.json b/eth/tracers/internal/tracetest/firehose/testdata/TestFirehosePrestate/deposit_nonce_check/block.120096000.golden.json new file mode 100644 index 000000000000..61e56888cba9 --- /dev/null +++ b/eth/tracers/internal/tracetest/firehose/testdata/TestFirehosePrestate/deposit_nonce_check/block.120096000.golden.json @@ -0,0 +1,159 @@ +{ + "hash": "HXxDFVBhmkHAdkITMJ3tdqOZYgLKqHbsmYHl/MBotDY=", + "number": "120096000", + "size": "807", + "header": { + "parentHash": "S4YfhrQau1tDVus4YTOBc9IOsF4ZOhBoYA6cQDSDXUY=", + "uncleHash": "HcxN6N7HXXqrhbVntszUGtMSRRuUinQT8KFC/UDUk0c=", + "coinbase": "QgAAAAAAAAAAAAAAAAAAAAAAABE=", + "stateRoot": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "transactionsRoot": "PDprPjmN6CJ40H8SVD+N1I3mp3Z0exP+BbWn6RCMqEM=", + "receiptRoot": "VugfFxvMVab/g0XmksD4bltI4BuZbK3AAWIvteNjtCE=", + "logsBloom": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "difficulty": { + "bytes": "AA==" + }, + "totalDifficulty": { + "bytes": "DIuE7Q==" + }, + "number": "120096000", + "gasLimit": "30000000", + "timestamp": "2024-05-15T16:32:57Z", + "mixHash": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "hash": "HXxDFVBhmkHAdkITMJ3tdqOZYgLKqHbsmYHl/MBotDY=", + "baseFeePerGas": { + "bytes": "Xl2z" + }, + "parentBeaconRoot": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + }, + "transactionTraces": [ + { + "to": "QgAAAAAAAAAAAAAAAAAAAAAAABU=", + "nonce": "14860937", + "gasLimit": "1000000", + "input": "RApeIAAABVgADF/FAAAAAAAAAAIAAAAAZkTjZwAAAAABL0rvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAodeWi0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASlartG4yoQGWqCNAkPe4NbplETUlEXltGYtoJDMKn/nAAAAAAAAAAAAAAAAaIckZmijuH9U3rO5S6R6b2PzKYU=", + "gasUsed": "43851", + "type": "TRX_TYPE_OPTIMISM_DEPOSIT", + "hash": "t35W1ZGqsnUCVI1Nha/2wfg1weToILI2B1EglRamNHI=", + "from": "3q3erd6t3q3erd6t3q3erd6tAAE=", + "beginOrdinal": "1", + "endOrdinal": "19", + "status": "SUCCEEDED", + "receipt": { + "cumulativeGasUsed": "43851", + "logsBloom": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + "calls": [ + { + "index": 1, + "callType": "CALL", + "caller": "3q3erd6t3q3erd6t3q3erd6tAAE=", + "address": "QgAAAAAAAAAAAAAAAAAAAAAAABU=", + "gasLimit": "977432", + "gasConsumed": "21283", + "input": "RApeIAAABVgADF/FAAAAAAAAAAIAAAAAZkTjZwAAAAABL0rvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAodeWi0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASlartG4yoQGWqCNAkPe4NbplETUlEXltGYtoJDMKn/nAAAAAAAAAAAAAAAAaIckZmijuH9U3rO5S6R6b2PzKYU=", + "executedCode": true, + "nonceChanges": [ + { + "address": "3q3erd6t3q3erd6t3q3erd6tAAE=", + "oldValue": "14860937", + "newValue": "14860938", + "ordinal": "3" + } + ], + "gasChanges": [ + { + "oldValue": "1000000", + "newValue": "977432", + "reason": "REASON_INTRINSIC_GAS", + "ordinal": "2" + }, + { + "newValue": "977432", + "reason": "REASON_CALL_INITIAL_BALANCE", + "ordinal": "5" + }, + { + "oldValue": "975130", + "newValue": "975100", + "reason": "REASON_CALL_DATA_COPY", + "ordinal": "6" + }, + { + "oldValue": "974984", + "newValue": "972484", + "reason": "REASON_STATE_COLD_ACCESS", + "ordinal": "7" + }, + { + "oldValue": "975084", + "newValue": "15195", + "reason": "REASON_DELEGATE_CALL", + "ordinal": "8" + }, + { + "oldValue": "15195", + "newValue": "956184", + "reason": "REASON_REFUND_AFTER_EXECUTION", + "ordinal": "14" + }, + { + "oldValue": "956176", + "newValue": "956173", + "reason": "REASON_RETURN_DATA_COPY", + "ordinal": "15" + }, + { + "oldValue": "956149", + "reason": "REASON_CALL_LEFT_OVER_RETURNED", + "ordinal": "16" + }, + { + "oldValue": "956149", + "reason": "REASON_TX_LEFT_OVER_RETURNED", + "ordinal": "18" + } + ], + "beginOrdinal": "4", + "endOrdinal": "17" + }, + { + "index": 2, + "parentIndex": 1, + "depth": 1, + "callType": "DELEGATE", + "caller": "QgAAAAAAAAAAAAAAAAAAAAAAABU=", + "address": "B9voUA/FkdGFK3b+5E1aBeEwl/8=", + "gasLimit": "957289", + "gasConsumed": "16300", + "input": "RApeIAAABVgADF/FAAAAAAAAAAIAAAAAZkTjZwAAAAABL0rvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAodeWi0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASlartG4yoQGWqCNAkPe4NbplETUlEXltGYtoJDMKn/nAAAAAAAAAAAAAAAAaIckZmijuH9U3rO5S6R6b2PzKYU=", + "executedCode": true, + "storageChanges": [ + { + "address": "QgAAAAAAAAAAAAAAAAAAAAAAABU=", + "key": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM=", + "oldValue": "AAAAAAAAAAAAAAAAAAAAAAAABVgADF/FAAAAAAAAAAE=", + "newValue": "AAAAAAAAAAAAAAAAAAAAAAAABVgADF/FAAAAAAAAAAI=", + "ordinal": "11" + } + ], + "gasChanges": [ + { + "newValue": "957289", + "reason": "REASON_CALL_INITIAL_BALANCE", + "ordinal": "10" + }, + { + "oldValue": "940989", + "reason": "REASON_CALL_LEFT_OVER_RETURNED", + "ordinal": "12" + } + ], + "beginOrdinal": "9", + "endOrdinal": "13" + } + ] + } + ], + "ver": 4 +} \ No newline at end of file diff --git a/eth/tracers/internal/tracetest/firehose/testdata/TestFirehosePrestate/deposit_nonce_check/prestate.json b/eth/tracers/internal/tracetest/firehose/testdata/TestFirehosePrestate/deposit_nonce_check/prestate.json new file mode 100644 index 000000000000..e841a16e942c --- /dev/null +++ b/eth/tracers/internal/tracetest/firehose/testdata/TestFirehosePrestate/deposit_nonce_check/prestate.json @@ -0,0 +1,89 @@ +{ + "context": { + "baseFeePerGas": "6184371", + "difficulty": "0", + "gasLimit": "30000000", + "miner": "0x4200000000000000000000000000000000000011", + "number": "120096000", + "timestamp": "1715790777" + }, + "genesis": { + "alloc": { + "0x07dbe8500fc591d1852b76fee44d5a05e13097ff": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638381f58a11610097578063c598591811610066578063c598591814610229578063e591b28214610249578063e81b2c6d14610289578063f82061401461029257600080fd5b80638381f58a146101e35780638b239f73146101f75780639e8c496614610200578063b80777ea1461020957600080fd5b806354fd4d50116100d357806354fd4d50146101335780635cf249691461017c57806364ca23ef1461018557806368d5dca6146101b257600080fd5b8063015d8eb9146100fa57806309bd5a601461010f578063440a5e201461012b575b600080fd5b61010d61010836600461044c565b61029b565b005b61011860025481565b6040519081526020015b60405180910390f35b61010d6103da565b61016f6040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161012291906104be565b61011860015481565b6003546101999067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610122565b6003546101ce9068010000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610122565b6000546101999067ffffffffffffffff1681565b61011860055481565b61011860065481565b6000546101999068010000000000000000900467ffffffffffffffff1681565b6003546101ce906c01000000000000000000000000900463ffffffff1681565b61026473deaddeaddeaddeaddeaddeaddeaddeaddead000181565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610122565b61011860045481565b61011860075481565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c7565730000000000606482015260840160405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b3373deaddeaddeaddeaddeaddeaddeaddeaddead00011461040357633cc50b456000526004601cfd5b60043560801c60035560143560801c600055602435600155604435600755606435600255608435600455565b803567ffffffffffffffff8116811461044757600080fd5b919050565b600080600080600080600080610100898b03121561046957600080fd5b6104728961042f565b975061048060208a0161042f565b9650604089013595506060890135945061049c60808a0161042f565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208083528351808285015260005b818110156104eb578581018301518582016040015282016104cf565b818111156104fd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a", + "nonce": "1" + }, + "0x4200000000000000000000000000000000000011": { + "balance": "0xcf7e57ed089b1b51", + "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a" + }, + "0x4200000000000000000000000000000000000015": { + "balance": "0x0", + "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x00000000000000000000000000000000000000006644e36700000000012f4aef", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000000000002875e5a2d", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x295aaed1b8ca84065aa08d0243dee0d6e99444d49445e5b4662da090cc2a7fe7", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000558000c5fc50000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000006887246668a3b87f54deb3b94ba47a6f63f32985", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x00000000000000000000000007dbe8500fc591d1852b76fee44d5a05e13097ff" + } + }, + "0xdeaddeaddeaddeaddeaddeaddeaddeaddead0001": { + "balance": "0x0", + "nonce": "14860937" + } + }, + "baseFeePerGas": "6204470", + "blobGasUsed": "0x0", + "config": { + "chainId": 10, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 3950000, + "londonBlock": 105235063, + "arrowGlacierBlock": 105235063, + "grayGlacierBlock": 105235063, + "mergeNetsplitBlock": 105235063, + "shanghaiTime": 1704992401, + "cancunTime": 1710374401, + "bedrockBlock": 105235063, + "regolithTime": 0, + "canyonTime": 1704992401, + "ecotoneTime": 1710374401, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true, + "optimism": { + "eip1559Elasticity": 6, + "eip1559Denominator": 50, + "eip1559DenominatorCanyon": 250 + } + }, + "difficulty": "0", + "excessBlobGas": "0x0", + "extraData": "0x", + "gasLimit": "30000000", + "hash": "0xfb45e4c87356d97fb890679bc0e7a20ec1f36cbbff0ef1bec8168140f9a3e5ec", + "miner": "0x4200000000000000000000000000000000000011", + "mixHash": "0x89644d0d5301e0419b5a1bdf834b0b239bb1d85cb5e99d5428d8551e2ce8df5f", + "nonce": "0x0000000000000000", + "number": "120095999", + "parentBeaconBlockRoot": "0x8fdda591984cae100732f80512bbcbd0e7780b938e0f65d1ad8866d6c962aeda", + "stateRoot": "0x7f17f9b36c1d2553192b65b9123c754082c5e997c3afe45bd052c91ad4f30745", + "timestamp": "1715790775", + "totalDifficulty": "210470125", + "withdrawals": [], + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" + }, + "input": "0x7ef8f8a01e1e1532866ec1b5c1d34f65b536cc17df791bf6c8f0395889c10840174fdbb894deaddeaddeaddeaddeaddeaddeaddeaddead00019442000000000000000000000000000000000000158080830f424080b8a4440a5e2000000558000c5fc50000000000000002000000006644e36700000000012f4aef00000000000000000000000000000000000000000000000000000002875e5a2d0000000000000000000000000000000000000000000000000000000000000001295aaed1b8ca84065aa08d0243dee0d6e99444d49445e5b4662da090cc2a7fe70000000000000000000000006887246668a3b87f54deb3b94ba47a6f63f32985" + } + \ No newline at end of file